diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -4,12 +4,14 @@
 exploring an isomorphism between typed lambda calculus and labeled hypergraphs.
 See the main Hydra [README](https://github.com/CategoricalData/hydra) for project overview and use cases.
 
-This package contains Hydra's **Haskell implementation**, which serves as the bootstrapping implementation for the entire Hydra project.
+This package contains Hydra's **Haskell implementation**,
+which serves as the bootstrapping implementation for the entire Hydra project.
 Releases are available [on Hackage](https://hackage.haskell.org/package/hydra).
 
 ## Code Organization
 
-Hydra-Haskell uses the **src/main vs src/gen-main** separation pattern (see [Code organization wiki page](https://github.com/CategoricalData/hydra/wiki/Code-organization) for details).
+Hydra-Haskell uses the **src/main vs src/gen-main** separation pattern
+(see [Code organization wiki page](https://github.com/CategoricalData/hydra/wiki/Code-organization) for details).
 
 - **`src/main/haskell/`** - Hand-written source code
   - `Hydra/Dsl/` - DSL syntax definitions
@@ -26,30 +28,50 @@
   - Generation tests created using language-specific test generators
   - See [Testing](#test) section for details
 
-Haskell serves as the **bootstrapping implementation** - the DSL sources here generate code for Java, Python, and other languages.
+Haskell serves as the **bootstrapping implementation** -
+the DSL sources here generate code for Java, Python, Scala, Lisp, and other languages.
 
 ## Documentation
 
-For comprehensive documentation about Hydra's architecture, type system, and implementation details, see:
+For comprehensive documentation about Hydra's architecture, type system,
+and implementation details, see:
 
-- **[Concepts](https://github.com/CategoricalData/hydra/wiki/Concepts)** - Core concepts: Type, Term, Graph, Flow monad, primitives, coders
-- **[Implementation](https://github.com/CategoricalData/hydra/blob/main/docs/src/implementation.md)** - Detailed guide covering type modules, DSLs, primitives, coders, and the bootstrap process
-- **[DSL Guide](https://github.com/CategoricalData/hydra/blob/main/docs/src/dsl-guide.md)** - Comprehensive guide to Hydra's domain-specific languages
-- **[Code Organization](https://github.com/CategoricalData/hydra/wiki/Code-organization)** - The src/main vs src/gen-main pattern
-- **[Testing](https://github.com/CategoricalData/hydra/wiki/Testing)** - Common test suite and language-specific testing
-- **[Developer Recipes](https://github.com/CategoricalData/hydra/blob/main/docs/src/recipes/index.md)** - Step-by-step guides for extending Hydra
+- **[Concepts](https://github.com/CategoricalData/hydra/wiki/Concepts)** -
+  Core concepts: Type, Term, Graph, Flow monad, primitives, coders
+- **[Implementation](https://github.com/CategoricalData/hydra/blob/main/docs/implementation.md)** -
+  Detailed guide covering type modules, DSLs, primitives, coders, and the bootstrap process
+- **[DSL Guide](https://github.com/CategoricalData/hydra/blob/main/docs/dsl-guide.md)** -
+  Comprehensive guide to Hydra's domain-specific languages
+- **[Code Organization](https://github.com/CategoricalData/hydra/wiki/Code-organization)** -
+  The src/main vs src/gen-main pattern
+- **[Testing](https://github.com/CategoricalData/hydra/wiki/Testing)** -
+  Common test suite and language-specific testing
+- **[Developer Recipes](https://github.com/CategoricalData/hydra/blob/main/docs/recipes/index.md)** -
+  Step-by-step guides for extending Hydra
 
 This README focuses on practical instructions for building, testing, and generating code with Hydra-Haskell.
 
 ## Build
 
-Haskell is Hydra's **bootstrapping language**. The entire Hydra kernel is written using Haskell-based domain-specific languages (DSLs):
-- **DSL syntax**: [src/main/haskell/Hydra/Dsl](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Dsl) - Specify the syntax for Hydra programs written in Haskell
-- **DSL-based sources**: [src/main/haskell/Hydra/Sources](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Sources) - Type definitions and core logic written in Haskell DSL
-- **Generated code**: [src/gen-main/haskell](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/gen-main/haskell) - Haskell code generated from DSL sources
-- **Primitives**: [src/main/haskell/Hydra/Lib](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Lib) - Hydra's standard libraries of primitive functions and constants, implemented in Haskell. These libraries are registered in [Libraries.hs](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Sources/Libraries.hs).
+Haskell is Hydra's **bootstrapping language**.
+The entire Hydra kernel is written using Haskell-based domain-specific languages (DSLs):
+- **DSL syntax**:
+  [src/main/haskell/Hydra/Dsl](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Dsl) -
+  Specify the syntax for Hydra programs written in Haskell
+- **DSL-based sources**:
+  [src/main/haskell/Hydra/Sources](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Sources) -
+  Type definitions and core logic written in Haskell DSL
+- **Generated code**:
+  [src/gen-main/haskell](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/gen-main/haskell) -
+  Haskell code generated from DSL sources
+- **Primitives**:
+  [src/main/haskell/Hydra/Lib](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Lib) -
+  Hydra's standard libraries of primitive functions and constants, implemented in Haskell.
+  These libraries are registered in
+  [Libraries.hs](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Sources/Libraries.hs).
 
-The DSL sources are also used to generate Java and Python implementations, ensuring parity across each Hydra language variant.
+The DSL sources are also used to generate Java and Python implementations,
+ensuring parity across each Hydra language variant.
 
 ### Build and REPL
 
@@ -68,7 +90,9 @@
 stack ghci hydra:lib
 ```
 
-Note: The `hydra:lib` target is required to avoid loading test modules. Running `stack ghci` without a target will load all components including test dependencies, which you may not need.
+Note: The `hydra:lib` target is required to avoid loading test modules.
+Running `stack ghci` without a target will load all components including test dependencies,
+which you may not need.
 
 ## Test
 
@@ -90,7 +114,8 @@
 Test.Hspec.hspec Hydra.TestSuiteSpec.spec
 ```
 
-See the [Testing wiki page](https://github.com/CategoricalData/hydra/wiki/Testing) for details on Hydra's common test suite, which ensures parity across all Hydra language variants.
+See the [Testing wiki page](https://github.com/CategoricalData/hydra/wiki/Testing)
+for details on Hydra's common test suite, which ensures parity across all Hydra language variants.
 
 ## Code generation
 
@@ -155,7 +180,8 @@
 
 ### Generate code for other languages
 
-Java and Python code generation is handled by the [Hydra-Ext](https://github.com/CategoricalData/hydra/tree/main/hydra-ext) package.
+Java and Python code generation is handled by the
+[Hydra-Ext](https://github.com/CategoricalData/hydra/tree/main/hydra-ext) package.
 From the `hydra-ext` directory:
 
 ```bash
@@ -177,7 +203,8 @@
 ```
 
 And similar for test artifacts. See the Hydra-Ext README for more details.
-Hydra-Ext also includes coders for many other languages and formats: Avro, Protobuf, C++, C#, Scala, GraphQL, JSON Schema, RDF, and more.
+Hydra-Ext also includes coders for many other languages and formats:
+Avro, Protobuf, C++, C#, Scala, GraphQL, JSON Schema, RDF, and more.
 
 ## Working with Hydra
 
@@ -191,38 +218,30 @@
 - **`Graph`** - A collection of elements with an environment, types, primitives, and schema graph
 - **`Module`** - A namespace containing elements with dependencies on other modules
 
-These are defined in [Hydra/Sources/Kernel/Types](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Sources/Kernel/Types)
-and code-generated into [Hydra.Core](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/gen-main/haskell/Hydra/Core.hs),
+These are defined in
+[Hydra/Sources/Kernel/Types](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Sources/Kernel/Types)
+and code-generated into
+[Hydra.Core](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/gen-main/haskell/Hydra/Core.hs),
 [Hydra.Graph](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/gen-main/haskell/Hydra/Graph.hs), and
 [Hydra.Module](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/gen-main/haskell/Hydra/Module.hs).
 
 See [Concepts](https://github.com/CategoricalData/hydra/wiki/Concepts) for detailed explanations.
 
-### The Flow monad
-
-Transformations in Hydra use the `Flow` monad for:
-- State management (graph context)
-- Error handling
-- Logging and tracing
-
-```haskell
-type Flow s a = s -> Trace -> FlowState s a
-```
+### Error handling and Context
 
-Common usage pattern:
+Hydra uses `Either (InContext OtherError) a` for computations that can fail,
+where `InContext` pairs an error with a `Context` carrying debug traces and metadata.
+Graph and Context are passed as explicit parameters.
 
 ```haskell
-import Hydra.Compute (Flow, FlowState, unFlow, emptyTrace)
-
--- Create a Flow
-myComputation :: Flow Graph String
-myComputation = pure "result"
+-- A function that may fail
+myComputation :: Context -> Graph -> Either (InContext OtherError) String
+myComputation cx g = Right "result"
 
 -- Execute it
-let state = unFlow myComputation graph emptyTrace
-case flowStateValue state of
-  Just result -> putStrLn result
-  Nothing -> print (flowStateMessages $ flowStateTrace state)
+case myComputation emptyContext myGraph of
+  Right result -> putStrLn result
+  Left ic -> print (unOtherError (inContextObject ic))
 ```
 
 ### Coders and adapters
@@ -230,21 +249,24 @@
 **Coders** are bidirectional transformations:
 
 ```haskell
-data Coder s1 s2 v1 v2 = Coder {
-  coderEncode :: v1 -> Flow s2 v2,
-  coderDecode :: v2 -> Flow s1 v1
+data Coder v1 v2 = Coder {
+  coderEncode :: v1 -> Context -> Graph -> Either (InContext OtherError) v2,
+  coderDecode :: v2 -> Context -> Graph -> Either (InContext OtherError) v1
 }
 ```
 
 **Adapters** also transform types, enabling schema evolution and language mapping.
 
-See the [Implementation wiki](https://github.com/CategoricalData/hydra/blob/main/docs/src/implementation.md#cross-language-compilation-coders) for details.
+See the
+[Implementation wiki](https://github.com/CategoricalData/hydra/blob/main/docs/implementation.md#cross-language-compilation-coders)
+for details.
 
 ### DSLs
 
 Hydra provides multiple domain-specific languages for constructing types and terms:
 
-**Untyped DSLs** ([Hydra/Dsl/Types.hs](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/main/haskell/Hydra/Dsl/Types.hs),
+**Untyped DSLs**
+([Hydra/Dsl/Types.hs](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/main/haskell/Hydra/Dsl/Types.hs),
 [Hydra/Dsl/Terms.hs](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/main/haskell/Hydra/Dsl/Terms.hs)):
 ```haskell
 import qualified Hydra.Dsl.Types as Types
@@ -259,7 +281,9 @@
   "age" >: Terms.int32 30]
 ```
 
-**Phantom-typed DSLs** ([Hydra/Dsl/Meta/Phantoms.hs](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/main/haskell/Hydra/Dsl/Meta/Phantoms.hs)) - Compile-time type safety:
+**Phantom-typed DSLs**
+([Hydra/Dsl/Meta/Phantoms.hs](https://github.com/CategoricalData/hydra/blob/main/hydra-haskell/src/main/haskell/Hydra/Dsl/Meta/Phantoms.hs)) -
+Compile-time type safety:
 ```haskell
 import Hydra.Dsl.Meta.Phantoms
 
@@ -267,7 +291,9 @@
 safeFn = lambda "x" (Strings.toUpper (var "x"))  -- Type-checked at compile time
 ```
 
-**Library DSLs** ([Hydra/Dsl/Meta/Lib](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Dsl/Meta/Lib)) - Wrappers for primitive functions:
+**Library DSLs**
+([Hydra/Dsl/Meta/Lib](https://github.com/CategoricalData/hydra/tree/main/hydra-haskell/src/main/haskell/Hydra/Dsl/Meta/Lib)) -
+Wrappers for primitive functions:
 ```haskell
 import Hydra.Dsl.Meta.Lib.Lists as Lists
 import Hydra.Dsl.Meta.Lib.Strings as Strings
@@ -275,7 +301,8 @@
 example = Lists.map (Strings.toUpper) (list ["hello", "world"])
 ```
 
-See the [DSL system section](https://github.com/CategoricalData/hydra/blob/main/docs/src/implementation.md#dsl-system) in the Implementation wiki for comprehensive coverage.
+See the [DSL system section](https://github.com/CategoricalData/hydra/blob/main/docs/implementation.md#dsl-system)
+in the Implementation wiki for comprehensive coverage.
 
 ### JSON and YAML serialization
 
@@ -307,7 +334,8 @@
 
 ## Self-hosting demonstration
 
-Hydra-Haskell is a [self-hosting compiler](https://en.wikipedia.org/wiki/Self-hosting_(compilers)) - it can generate its own source code.
+Hydra-Haskell is a [self-hosting compiler](https://en.wikipedia.org/wiki/Self-hosting_(compilers)) -
+it can generate its own source code.
 
 Complete self-hosting cycle:
 
@@ -356,10 +384,12 @@
 - `Hydra.Generation` - I/O and generation utilities
 - Test runners
 
-See the [Bootstrap process](https://github.com/CategoricalData/hydra/blob/main/docs/src/implementation.md#the-bootstrap-process) section for details on extending Hydra.
+See the
+[Bootstrap process](https://github.com/CategoricalData/hydra/blob/main/docs/implementation.md#the-bootstrap-process)
+section for details on extending Hydra.
 For example:
-- [Adding new primitive functions](https://github.com/CategoricalData/hydra/blob/main/docs/src/recipes/adding-primitives.md)
-- [Extending Hydra Core](https://github.com/CategoricalData/hydra/blob/main/docs/src/recipes/extending-hydra-core.md)
+- [Adding new primitive functions](https://github.com/CategoricalData/hydra/blob/main/docs/recipes/adding-primitives.md)
+- [Extending Hydra Core](https://github.com/CategoricalData/hydra/blob/main/docs/recipes/extending-hydra-core.md)
 
 ## Troubleshooting
 
@@ -378,4 +408,7 @@
 brew upgrade stack
 ```
 
-**Explanation:** These are compatibility warnings that appear when using newer GHC/Cabal versions. If your builds complete successfully, the warnings are harmless - Stack works fine with newer versions even before official testing. Upgrading Stack eliminates the warnings.
+**Explanation:** These are compatibility warnings that appear when using newer GHC/Cabal versions.
+If your builds complete successfully, the warnings are harmless -
+Stack works fine with newer versions even before official testing.
+Upgrading Stack eliminates the warnings.
diff --git a/hydra.cabal b/hydra.cabal
--- a/hydra.cabal
+++ b/hydra.cabal
@@ -5,9 +5,9 @@
 -- see: https://github.com/sol/hpack
 
 name:           hydra
-version:        0.13.0
+version:        0.14.0
 synopsis:       Graph programming language
-description:    Hydra is an implementation of the LambdaGraph data model, which takes advantage of an isomorphism between labeled hypergraphs and typed lambda calculus: in Hydra, "graphs are programs, and programs are graphs". The language is designed to be embedded in other programming languages -- currently Haskell, Java, and Python. Hydra transforms data, schemas, and functional programs into multiple other languages in a way which maintains type safety. It is self-hosting in Haskell -- it generates its own executable source code from Hydra sources -- and it is designed to become self-hosting in its other implementation languages, as well.
+description:    Hydra is an implementation of the LambdaGraph data model, which takes advantage of an isomorphism between labeled hypergraphs and typed lambda calculus: in Hydra, "graphs are programs, and programs are graphs". The language is designed to be embedded in other programming languages -- currently Haskell, Java, and Python. Hydra transforms data, schemas, and functional programs into multiple other languages in a way which maintains type safety. It is mutually self-hosting in Haskell, Java, and Python; i.e. each Hydra compiler can generate each other Hydra compiler as well as itself.
 category:       Data
 homepage:       https://github.com/CategoricalData/hydra#readme
 bug-reports:    https://github.com/CategoricalData/hydra/issues
@@ -31,24 +31,17 @@
       Hydra.Dsl.AsTerm
       Hydra.Dsl.AsType
       Hydra.Dsl.Bootstrap
-      Hydra.Dsl.Grammars
       Hydra.Dsl.Literals
       Hydra.Dsl.LiteralTypes
-      Hydra.Dsl.Meta.Accessors
-      Hydra.Dsl.Meta.Ast
       Hydra.Dsl.Meta.Base
-      Hydra.Dsl.Meta.Coders
       Hydra.Dsl.Meta.Common
-      Hydra.Dsl.Meta.Compute
+      Hydra.Dsl.Meta.Context
       Hydra.Dsl.Meta.Core
       Hydra.Dsl.Meta.DeepCore
-      Hydra.Dsl.Meta.Grammar
       Hydra.Dsl.Meta.Graph
-      Hydra.Dsl.Meta.Json
       Hydra.Dsl.Meta.Lib.Chars
       Hydra.Dsl.Meta.Lib.Eithers
       Hydra.Dsl.Meta.Lib.Equality
-      Hydra.Dsl.Meta.Lib.Flows
       Hydra.Dsl.Meta.Lib.Lists
       Hydra.Dsl.Meta.Lib.Literals
       Hydra.Dsl.Meta.Lib.Logic
@@ -56,30 +49,26 @@
       Hydra.Dsl.Meta.Lib.Math
       Hydra.Dsl.Meta.Lib.Maybes
       Hydra.Dsl.Meta.Lib.Pairs
+      Hydra.Dsl.Meta.Lib.Regex
       Hydra.Dsl.Meta.Lib.Sets
       Hydra.Dsl.Meta.Lib.Strings
       Hydra.Dsl.Meta.Literals
-      Hydra.Dsl.Meta.Module
-      Hydra.Dsl.Meta.Parsing
       Hydra.Dsl.Meta.Phantoms
+      Hydra.Dsl.Meta.Tabular
       Hydra.Dsl.Meta.Terms
       Hydra.Dsl.Meta.Testing
-      Hydra.Dsl.Meta.Topology
       Hydra.Dsl.Meta.Types
-      Hydra.Dsl.Meta.Typing
-      Hydra.Dsl.Meta.Util
       Hydra.Dsl.Meta.Variants
       Hydra.Dsl.Prims
-      Hydra.Dsl.Tabular
       Hydra.Dsl.Terms
       Hydra.Dsl.Tests
       Hydra.Dsl.Types
+      Hydra.Ext.Haskell.TestingIo
       Hydra.Generation
       Hydra.Kernel
       Hydra.Lib.Chars
       Hydra.Lib.Eithers
       Hydra.Lib.Equality
-      Hydra.Lib.Flows
       Hydra.Lib.Lists
       Hydra.Lib.Literals
       Hydra.Lib.Logic
@@ -87,41 +76,43 @@
       Hydra.Lib.Math
       Hydra.Lib.Maybes
       Hydra.Lib.Pairs
+      Hydra.Lib.Regex
       Hydra.Lib.Sets
       Hydra.Lib.Strings
       Hydra.Minimal
+      Hydra.Module.Compat
       Hydra.Settings
       Hydra.Sources.All
       Hydra.Sources.CoderUtils
       Hydra.Sources.Eval.Lib.All
       Hydra.Sources.Eval.Lib.Eithers
-      Hydra.Sources.Eval.Lib.Flows
+      Hydra.Sources.Eval.Lib.Equality
       Hydra.Sources.Eval.Lib.Lists
+      Hydra.Sources.Eval.Lib.Logic
       Hydra.Sources.Eval.Lib.Maps
+      Hydra.Sources.Eval.Lib.Math
       Hydra.Sources.Eval.Lib.Maybes
       Hydra.Sources.Eval.Lib.Pairs
       Hydra.Sources.Eval.Lib.Sets
-      Hydra.Sources.Haskell.Ast
       Hydra.Sources.Haskell.Coder
       Hydra.Sources.Haskell.Language
       Hydra.Sources.Haskell.Operators
       Hydra.Sources.Haskell.Serde
+      Hydra.Sources.Haskell.Syntax
+      Hydra.Sources.Haskell.Testing
       Hydra.Sources.Haskell.Utils
       Hydra.Sources.Json.Bootstrap
-      Hydra.Sources.Json.Coder
       Hydra.Sources.Json.Decode
       Hydra.Sources.Json.Decoding
       Hydra.Sources.Json.Encode
       Hydra.Sources.Json.Extract
-      Hydra.Sources.Json.Language
       Hydra.Sources.Json.Model
       Hydra.Sources.Json.Parser
       Hydra.Sources.Json.Writer
-      Hydra.Sources.Kernel.Terms.Adapt.Literals
-      Hydra.Sources.Kernel.Terms.Adapt.Modules
-      Hydra.Sources.Kernel.Terms.Adapt.Simple
-      Hydra.Sources.Kernel.Terms.Adapt.Terms
-      Hydra.Sources.Kernel.Terms.Adapt.Utils
+      Hydra.Sources.Json.Yaml.Decode
+      Hydra.Sources.Json.Yaml.Encode
+      Hydra.Sources.Kernel.Lib.Names
+      Hydra.Sources.Kernel.Terms.Adapt
       Hydra.Sources.Kernel.Terms.All
       Hydra.Sources.Kernel.Terms.Annotations
       Hydra.Sources.Kernel.Terms.Arity
@@ -129,18 +120,17 @@
       Hydra.Sources.Kernel.Terms.CodeGeneration
       Hydra.Sources.Kernel.Terms.Constants
       Hydra.Sources.Kernel.Terms.Decoding
+      Hydra.Sources.Kernel.Terms.Dsls
       Hydra.Sources.Kernel.Terms.Encoding
       Hydra.Sources.Kernel.Terms.Extract.Core
       Hydra.Sources.Kernel.Terms.Extract.Helpers
       Hydra.Sources.Kernel.Terms.Extract.Util
       Hydra.Sources.Kernel.Terms.Formatting
-      Hydra.Sources.Kernel.Terms.Grammars
       Hydra.Sources.Kernel.Terms.Hoisting
       Hydra.Sources.Kernel.Terms.Inference
       Hydra.Sources.Kernel.Terms.Languages
       Hydra.Sources.Kernel.Terms.Lexical
       Hydra.Sources.Kernel.Terms.Literals
-      Hydra.Sources.Kernel.Terms.Monads
       Hydra.Sources.Kernel.Terms.Names
       Hydra.Sources.Kernel.Terms.Parsers
       Hydra.Sources.Kernel.Terms.Reduction
@@ -148,29 +138,35 @@
       Hydra.Sources.Kernel.Terms.Rewriting
       Hydra.Sources.Kernel.Terms.Schemas
       Hydra.Sources.Kernel.Terms.Serialization
-      Hydra.Sources.Kernel.Terms.Show.Accessors
       Hydra.Sources.Kernel.Terms.Show.Core
+      Hydra.Sources.Kernel.Terms.Show.Error.Core
+      Hydra.Sources.Kernel.Terms.Show.Errors
       Hydra.Sources.Kernel.Terms.Show.Graph
       Hydra.Sources.Kernel.Terms.Show.Meta
+      Hydra.Sources.Kernel.Terms.Show.Paths
       Hydra.Sources.Kernel.Terms.Show.Typing
       Hydra.Sources.Kernel.Terms.Show.Util
       Hydra.Sources.Kernel.Terms.Sorting
       Hydra.Sources.Kernel.Terms.Substitution
-      Hydra.Sources.Kernel.Terms.Tarjan
       Hydra.Sources.Kernel.Terms.Templates
       Hydra.Sources.Kernel.Terms.Unification
-      Hydra.Sources.Kernel.Types.Accessors
+      Hydra.Sources.Kernel.Terms.Validate.Core
+      Hydra.Sources.Kernel.Terms.Validate.Packaging
       Hydra.Sources.Kernel.Types.All
       Hydra.Sources.Kernel.Types.Ast
       Hydra.Sources.Kernel.Types.Classes
       Hydra.Sources.Kernel.Types.Coders
-      Hydra.Sources.Kernel.Types.Compute
-      Hydra.Sources.Kernel.Types.Constraints
+      Hydra.Sources.Kernel.Types.Context
       Hydra.Sources.Kernel.Types.Core
-      Hydra.Sources.Kernel.Types.Grammar
+      Hydra.Sources.Kernel.Types.Error.Checking
+      Hydra.Sources.Kernel.Types.Error.Core
+      Hydra.Sources.Kernel.Types.Error.Packaging
+      Hydra.Sources.Kernel.Types.Errors
       Hydra.Sources.Kernel.Types.Graph
       Hydra.Sources.Kernel.Types.Module
+      Hydra.Sources.Kernel.Types.Packaging
       Hydra.Sources.Kernel.Types.Parsing
+      Hydra.Sources.Kernel.Types.Paths
       Hydra.Sources.Kernel.Types.Phantoms
       Hydra.Sources.Kernel.Types.Query
       Hydra.Sources.Kernel.Types.Relational
@@ -180,7 +176,6 @@
       Hydra.Sources.Kernel.Types.Typing
       Hydra.Sources.Kernel.Types.Util
       Hydra.Sources.Kernel.Types.Variants
-      Hydra.Sources.Kernel.Types.Workflow
       Hydra.Sources.Libraries
       Hydra.Sources.Test.All
       Hydra.Sources.Test.Annotations
@@ -193,22 +188,23 @@
       Hydra.Sources.Test.Checking.NominalTypes
       Hydra.Sources.Test.EtaExpansion
       Hydra.Sources.Test.Formatting
-      Hydra.Sources.Test.Hoisting
+      Hydra.Sources.Test.Hoisting.All
+      Hydra.Sources.Test.Hoisting.Cases
+      Hydra.Sources.Test.Hoisting.Let
       Hydra.Sources.Test.Inference.AlgebraicTypes
       Hydra.Sources.Test.Inference.AlgorithmW
       Hydra.Sources.Test.Inference.All
+      Hydra.Sources.Test.Inference.Classes
       Hydra.Sources.Test.Inference.Failures
       Hydra.Sources.Test.Inference.Fundamentals
       Hydra.Sources.Test.Inference.KernelExamples
       Hydra.Sources.Test.Inference.NominalTypes
-      Hydra.Sources.Test.Json.Coder
       Hydra.Sources.Test.Json.Parser
       Hydra.Sources.Test.Json.Roundtrip
       Hydra.Sources.Test.Json.Writer
       Hydra.Sources.Test.Lib.Chars
       Hydra.Sources.Test.Lib.Eithers
       Hydra.Sources.Test.Lib.Equality
-      Hydra.Sources.Test.Lib.Flows
       Hydra.Sources.Test.Lib.Lists
       Hydra.Sources.Test.Lib.Literals
       Hydra.Sources.Test.Lib.Logic
@@ -216,9 +212,9 @@
       Hydra.Sources.Test.Lib.Math
       Hydra.Sources.Test.Lib.Maybes
       Hydra.Sources.Test.Lib.Pairs
+      Hydra.Sources.Test.Lib.Regex
       Hydra.Sources.Test.Lib.Sets
       Hydra.Sources.Test.Lib.Strings
-      Hydra.Sources.Test.Monads
       Hydra.Sources.Test.Ordering
       Hydra.Sources.Test.Reduction
       Hydra.Sources.Test.Rewriting
@@ -229,26 +225,16 @@
       Hydra.Sources.Test.TestSuite
       Hydra.Sources.Test.TestTerms
       Hydra.Sources.Test.TestTypes
+      Hydra.Sources.Test.Transform
       Hydra.Sources.Test.Unification
+      Hydra.Sources.Test.Utils
+      Hydra.Sources.Test.Validate.All
+      Hydra.Sources.Test.Validate.Core
       Hydra.Sources.Yaml.Model
-      Hydra.Staging.Lib.Names
-      Hydra.Staging.Testing.Generation.Generate
-      Hydra.Staging.Testing.Generation.HaskellCodec
-      Hydra.Staging.Testing.Generation.Transform
-      Hydra.Staging.Yaml.Coder
-      Hydra.Staging.Yaml.Language
-      Hydra.Staging.Yaml.Modules
-      Hydra.Staging.Yaml.Serde
       Hydra.Tools.Bytestrings
       Hydra.Tools.Debug
-      Hydra.Tools.Monads
       Org.Example.Lispy
-      Hydra.Accessors
-      Hydra.Adapt.Literals
-      Hydra.Adapt.Modules
-      Hydra.Adapt.Simple
-      Hydra.Adapt.Terms
-      Hydra.Adapt.Utils
+      Hydra.Adapt
       Hydra.Annotations
       Hydra.Arity
       Hydra.Ast
@@ -257,22 +243,22 @@
       Hydra.CodeGeneration
       Hydra.Coders
       Hydra.CoderUtils
-      Hydra.Compute
       Hydra.Constants
-      Hydra.Constraints
+      Hydra.Context
       Hydra.Core
-      Hydra.Decode.Accessors
       Hydra.Decode.Ast
       Hydra.Decode.Classes
       Hydra.Decode.Coders
-      Hydra.Decode.Compute
-      Hydra.Decode.Constraints
+      Hydra.Decode.Context
       Hydra.Decode.Core
-      Hydra.Decode.Grammar
+      Hydra.Decode.Error.Checking
+      Hydra.Decode.Error.Core
+      Hydra.Decode.Errors
       Hydra.Decode.Json
       Hydra.Decode.Json.Model
       Hydra.Decode.Module
       Hydra.Decode.Parsing
+      Hydra.Decode.Paths
       Hydra.Decode.Phantoms
       Hydra.Decode.Query
       Hydra.Decode.Relational
@@ -282,20 +268,46 @@
       Hydra.Decode.Typing
       Hydra.Decode.Util
       Hydra.Decode.Variants
-      Hydra.Decode.Workflow
       Hydra.Decoding
-      Hydra.Encode.Accessors
+      Hydra.Dsl.Ast
+      Hydra.Dsl.Classes
+      Hydra.Dsl.Coders
+      Hydra.Dsl.Context
+      Hydra.Dsl.Core
+      Hydra.Dsl.Error.Checking
+      Hydra.Dsl.Error.Core
+      Hydra.Dsl.Error.Packaging
+      Hydra.Dsl.Errors
+      Hydra.Dsl.Ext.Haskell.Syntax
+      Hydra.Dsl.Ext.Org.Yaml.Model
+      Hydra.Dsl.Graph
+      Hydra.Dsl.Json.Model
+      Hydra.Dsl.Module
+      Hydra.Dsl.Packaging
+      Hydra.Dsl.Parsing
+      Hydra.Dsl.Paths
+      Hydra.Dsl.Query
+      Hydra.Dsl.Relational
+      Hydra.Dsl.Tabular
+      Hydra.Dsl.Testing
+      Hydra.Dsl.Topology
+      Hydra.Dsl.Typing
+      Hydra.Dsl.Util
+      Hydra.Dsl.Variants
+      Hydra.Dsls
       Hydra.Encode.Ast
       Hydra.Encode.Classes
       Hydra.Encode.Coders
-      Hydra.Encode.Compute
-      Hydra.Encode.Constraints
+      Hydra.Encode.Context
       Hydra.Encode.Core
-      Hydra.Encode.Grammar
+      Hydra.Encode.Error.Checking
+      Hydra.Encode.Error.Core
+      Hydra.Encode.Errors
       Hydra.Encode.Json
       Hydra.Encode.Json.Model
       Hydra.Encode.Module
       Hydra.Encode.Parsing
+      Hydra.Encode.Paths
       Hydra.Encode.Phantoms
       Hydra.Encode.Query
       Hydra.Encode.Relational
@@ -305,32 +317,34 @@
       Hydra.Encode.Typing
       Hydra.Encode.Util
       Hydra.Encode.Variants
-      Hydra.Encode.Workflow
       Hydra.Encoding
+      Hydra.Error.Checking
+      Hydra.Error.Core
+      Hydra.Error.Packaging
+      Hydra.Errors
       Hydra.Eval.Lib.Eithers
-      Hydra.Eval.Lib.Flows
+      Hydra.Eval.Lib.Equality
       Hydra.Eval.Lib.Lists
+      Hydra.Eval.Lib.Logic
       Hydra.Eval.Lib.Maps
+      Hydra.Eval.Lib.Math
       Hydra.Eval.Lib.Maybes
       Hydra.Eval.Lib.Pairs
       Hydra.Eval.Lib.Sets
-      Hydra.Ext.Haskell.Ast
       Hydra.Ext.Haskell.Coder
       Hydra.Ext.Haskell.Language
       Hydra.Ext.Haskell.Operators
       Hydra.Ext.Haskell.Serde
+      Hydra.Ext.Haskell.Syntax
+      Hydra.Ext.Haskell.Testing
       Hydra.Ext.Haskell.Utils
-      Hydra.Ext.Org.Json.Coder
       Hydra.Ext.Org.Json.Decoding
-      Hydra.Ext.Org.Json.Language
       Hydra.Ext.Org.Yaml.Model
       Hydra.Extract.Core
       Hydra.Extract.Helpers
       Hydra.Extract.Json
       Hydra.Extract.Util
       Hydra.Formatting
-      Hydra.Grammar
-      Hydra.Grammars
       Hydra.Graph
       Hydra.Hoisting
       Hydra.Inference
@@ -340,14 +354,18 @@
       Hydra.Json.Model
       Hydra.Json.Parser
       Hydra.Json.Writer
+      Hydra.Json.Yaml.Decode
+      Hydra.Json.Yaml.Encode
       Hydra.Languages
       Hydra.Lexical
+      Hydra.Lib.Names
       Hydra.Literals
       Hydra.Module
-      Hydra.Monads
       Hydra.Names
+      Hydra.Packaging
       Hydra.Parsers
       Hydra.Parsing
+      Hydra.Paths
       Hydra.Phantoms
       Hydra.Query
       Hydra.Reduction
@@ -356,24 +374,29 @@
       Hydra.Rewriting
       Hydra.Schemas
       Hydra.Serialization
-      Hydra.Show.Accessors
       Hydra.Show.Core
+      Hydra.Show.Error.Core
+      Hydra.Show.Errors
       Hydra.Show.Graph
       Hydra.Show.Meta
+      Hydra.Show.Paths
       Hydra.Show.Typing
       Hydra.Show.Util
       Hydra.Sorting
-      Hydra.Sources.Decode.Accessors
       Hydra.Sources.Decode.Ast
       Hydra.Sources.Decode.Classes
       Hydra.Sources.Decode.Coders
-      Hydra.Sources.Decode.Compute
-      Hydra.Sources.Decode.Constraints
+      Hydra.Sources.Decode.Context
       Hydra.Sources.Decode.Core
-      Hydra.Sources.Decode.Grammar
+      Hydra.Sources.Decode.Error.Checking
+      Hydra.Sources.Decode.Error.Core
+      Hydra.Sources.Decode.Error.Packaging
+      Hydra.Sources.Decode.Errors
       Hydra.Sources.Decode.Json.Model
       Hydra.Sources.Decode.Module
+      Hydra.Sources.Decode.Packaging
       Hydra.Sources.Decode.Parsing
+      Hydra.Sources.Decode.Paths
       Hydra.Sources.Decode.Phantoms
       Hydra.Sources.Decode.Query
       Hydra.Sources.Decode.Relational
@@ -383,18 +406,20 @@
       Hydra.Sources.Decode.Typing
       Hydra.Sources.Decode.Util
       Hydra.Sources.Decode.Variants
-      Hydra.Sources.Decode.Workflow
-      Hydra.Sources.Encode.Accessors
       Hydra.Sources.Encode.Ast
       Hydra.Sources.Encode.Classes
       Hydra.Sources.Encode.Coders
-      Hydra.Sources.Encode.Compute
-      Hydra.Sources.Encode.Constraints
+      Hydra.Sources.Encode.Context
       Hydra.Sources.Encode.Core
-      Hydra.Sources.Encode.Grammar
+      Hydra.Sources.Encode.Error.Checking
+      Hydra.Sources.Encode.Error.Core
+      Hydra.Sources.Encode.Error.Packaging
+      Hydra.Sources.Encode.Errors
       Hydra.Sources.Encode.Json.Model
       Hydra.Sources.Encode.Module
+      Hydra.Sources.Encode.Packaging
       Hydra.Sources.Encode.Parsing
+      Hydra.Sources.Encode.Paths
       Hydra.Sources.Encode.Phantoms
       Hydra.Sources.Encode.Query
       Hydra.Sources.Encode.Relational
@@ -404,32 +429,33 @@
       Hydra.Sources.Encode.Typing
       Hydra.Sources.Encode.Util
       Hydra.Sources.Encode.Variants
-      Hydra.Sources.Encode.Workflow
       Hydra.Substitution
       Hydra.Tabular
-      Hydra.Tarjan
       Hydra.Templates
+      Hydra.Test.Transform
+      Hydra.Test.Utils
       Hydra.Testing
       Hydra.Topology
       Hydra.Typing
       Hydra.Unification
       Hydra.Util
+      Hydra.Validate.Core
+      Hydra.Validate.Packaging
       Hydra.Variants
-      Hydra.Workflow
   other-modules:
       Paths_hydra
   hs-source-dirs:
       src/main/haskell
       src/gen-main/haskell
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
     , containers >=0.6.7 && <0.8
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -444,7 +470,6 @@
       Generation.Hydra.Test.Lib.CharsSpec
       Generation.Hydra.Test.Lib.EithersSpec
       Generation.Hydra.Test.Lib.EqualitySpec
-      Generation.Hydra.Test.Lib.FlowsSpec
       Generation.Hydra.Test.Lib.ListsSpec
       Generation.Hydra.Test.Lib.LiteralsSpec
       Generation.Hydra.Test.Lib.LogicSpec
@@ -452,9 +477,9 @@
       Generation.Hydra.Test.Lib.MathSpec
       Generation.Hydra.Test.Lib.MaybesSpec
       Generation.Hydra.Test.Lib.PairsSpec
+      Generation.Hydra.Test.Lib.RegexSpec
       Generation.Hydra.Test.Lib.SetsSpec
       Generation.Hydra.Test.Lib.StringsSpec
-      Generation.Hydra.Test.MonadsSpec
       Generation.Hydra.Test.ReductionSpec
       Generation.Hydra.Test.SortingSpec
       Generation.Spec
@@ -468,22 +493,23 @@
       Hydra.Test.Checking.NominalTypes
       Hydra.Test.EtaExpansion
       Hydra.Test.Formatting
-      Hydra.Test.Hoisting
+      Hydra.Test.Hoisting.All
+      Hydra.Test.Hoisting.Cases
+      Hydra.Test.Hoisting.Let
       Hydra.Test.Inference.AlgebraicTypes
       Hydra.Test.Inference.AlgorithmW
       Hydra.Test.Inference.All
+      Hydra.Test.Inference.Classes
       Hydra.Test.Inference.Failures
       Hydra.Test.Inference.Fundamentals
       Hydra.Test.Inference.KernelExamples
       Hydra.Test.Inference.NominalTypes
-      Hydra.Test.Json.Coder
       Hydra.Test.Json.Parser
       Hydra.Test.Json.Roundtrip
       Hydra.Test.Json.Writer
       Hydra.Test.Lib.Chars
       Hydra.Test.Lib.Eithers
       Hydra.Test.Lib.Equality
-      Hydra.Test.Lib.Flows
       Hydra.Test.Lib.Lists
       Hydra.Test.Lib.Literals
       Hydra.Test.Lib.Logic
@@ -491,9 +517,9 @@
       Hydra.Test.Lib.Math
       Hydra.Test.Lib.Maybes
       Hydra.Test.Lib.Pairs
+      Hydra.Test.Lib.Regex
       Hydra.Test.Lib.Sets
       Hydra.Test.Lib.Strings
-      Hydra.Test.Monads
       Hydra.Test.Ordering
       Hydra.Test.Reduction
       Hydra.Test.Rewriting
@@ -505,14 +531,15 @@
       Hydra.Test.TestTerms
       Hydra.Test.TestTypes
       Hydra.Test.Unification
+      Hydra.Test.Validate.All
+      Hydra.Test.Validate.Core
       Paths_hydra
   hs-source-dirs:
       src/exec/update-generation-tests
       src/gen-test/haskell
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -521,6 +548,7 @@
     , filepath >=1.4.200 && <1.6
     , hspec >=2.11.0 && <2.12
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -535,8 +563,7 @@
       src/exec/update-haskell-eval-lib
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -544,6 +571,7 @@
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -558,8 +586,7 @@
       src/exec/update-haskell-kernel
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -567,6 +594,7 @@
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -581,8 +609,7 @@
       src/exec/update-haskell-sources
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -590,6 +617,7 @@
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -604,8 +632,7 @@
       src/exec/update-json-kernel
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -613,6 +640,7 @@
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -627,8 +655,7 @@
       src/exec/update-json-main
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -636,6 +663,7 @@
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -650,8 +678,7 @@
       src/exec/update-json-manifest
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -659,6 +686,7 @@
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -673,8 +701,7 @@
       src/exec/update-json-test
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -682,6 +709,7 @@
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -696,7 +724,6 @@
       Generation.Hydra.Test.Lib.CharsSpec
       Generation.Hydra.Test.Lib.EithersSpec
       Generation.Hydra.Test.Lib.EqualitySpec
-      Generation.Hydra.Test.Lib.FlowsSpec
       Generation.Hydra.Test.Lib.ListsSpec
       Generation.Hydra.Test.Lib.LiteralsSpec
       Generation.Hydra.Test.Lib.LogicSpec
@@ -704,9 +731,9 @@
       Generation.Hydra.Test.Lib.MathSpec
       Generation.Hydra.Test.Lib.MaybesSpec
       Generation.Hydra.Test.Lib.PairsSpec
+      Generation.Hydra.Test.Lib.RegexSpec
       Generation.Hydra.Test.Lib.SetsSpec
       Generation.Hydra.Test.Lib.StringsSpec
-      Generation.Hydra.Test.MonadsSpec
       Generation.Hydra.Test.ReductionSpec
       Generation.Hydra.Test.SortingSpec
       Generation.Spec
@@ -720,22 +747,23 @@
       Hydra.Test.Checking.NominalTypes
       Hydra.Test.EtaExpansion
       Hydra.Test.Formatting
-      Hydra.Test.Hoisting
+      Hydra.Test.Hoisting.All
+      Hydra.Test.Hoisting.Cases
+      Hydra.Test.Hoisting.Let
       Hydra.Test.Inference.AlgebraicTypes
       Hydra.Test.Inference.AlgorithmW
       Hydra.Test.Inference.All
+      Hydra.Test.Inference.Classes
       Hydra.Test.Inference.Failures
       Hydra.Test.Inference.Fundamentals
       Hydra.Test.Inference.KernelExamples
       Hydra.Test.Inference.NominalTypes
-      Hydra.Test.Json.Coder
       Hydra.Test.Json.Parser
       Hydra.Test.Json.Roundtrip
       Hydra.Test.Json.Writer
       Hydra.Test.Lib.Chars
       Hydra.Test.Lib.Eithers
       Hydra.Test.Lib.Equality
-      Hydra.Test.Lib.Flows
       Hydra.Test.Lib.Lists
       Hydra.Test.Lib.Literals
       Hydra.Test.Lib.Logic
@@ -743,9 +771,9 @@
       Hydra.Test.Lib.Math
       Hydra.Test.Lib.Maybes
       Hydra.Test.Lib.Pairs
+      Hydra.Test.Lib.Regex
       Hydra.Test.Lib.Sets
       Hydra.Test.Lib.Strings
-      Hydra.Test.Monads
       Hydra.Test.Ordering
       Hydra.Test.Reduction
       Hydra.Test.Rewriting
@@ -757,14 +785,15 @@
       Hydra.Test.TestTerms
       Hydra.Test.TestTypes
       Hydra.Test.Unification
+      Hydra.Test.Validate.All
+      Hydra.Test.Validate.Core
       Paths_hydra
   hs-source-dirs:
       src/exec/update-kernel-tests
       src/gen-test/haskell
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -773,6 +802,7 @@
     , filepath >=1.4.200 && <1.6
     , hspec >=2.11.0 && <2.12
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -787,8 +817,7 @@
       src/exec/verify-json-kernel
   ghc-options: -rtsopts
   build-depends:
-      HsYAML >=0.2.1 && <0.3
-    , aeson >=2.1.0 && <2.3
+      aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
     , base64-bytestring >=1.2.1 && <1.3
     , bytestring >=0.11.5 && <0.13
@@ -796,6 +825,7 @@
     , directory >=1.3.6 && <1.4
     , filepath >=1.4.200 && <1.6
     , hydra
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
@@ -807,19 +837,13 @@
   main-is: Spec.hs
   other-modules:
       GenerationSpec
-      Hydra.Adapt.LiteralsSpec
-      Hydra.Adapt.TermsSpec
       Hydra.ArbitraryCore
       Hydra.CoreCodersSpec
       Hydra.Dsl.TypesSpec
-      Hydra.Json.AesonSpec
-      Hydra.MonadsSpec
+      Hydra.EvalPrimitives
       Hydra.Reference.AlgorithmW
       Hydra.Reference.AlgorithmWBridge
       Hydra.Reference.AlgorithmWSpec
-      Hydra.Staging.Json.Serde
-      Hydra.Staging.Yaml.CoderSpec
-      Hydra.Staging.Yaml.SerdeSpec
       Hydra.TestData
       Hydra.TestSuiteSpec
       Hydra.TestUtils
@@ -829,7 +853,6 @@
       Generation.Hydra.Test.Lib.CharsSpec
       Generation.Hydra.Test.Lib.EithersSpec
       Generation.Hydra.Test.Lib.EqualitySpec
-      Generation.Hydra.Test.Lib.FlowsSpec
       Generation.Hydra.Test.Lib.ListsSpec
       Generation.Hydra.Test.Lib.LiteralsSpec
       Generation.Hydra.Test.Lib.LogicSpec
@@ -837,9 +860,9 @@
       Generation.Hydra.Test.Lib.MathSpec
       Generation.Hydra.Test.Lib.MaybesSpec
       Generation.Hydra.Test.Lib.PairsSpec
+      Generation.Hydra.Test.Lib.RegexSpec
       Generation.Hydra.Test.Lib.SetsSpec
       Generation.Hydra.Test.Lib.StringsSpec
-      Generation.Hydra.Test.MonadsSpec
       Generation.Hydra.Test.ReductionSpec
       Generation.Hydra.Test.SortingSpec
       Generation.Spec
@@ -853,22 +876,23 @@
       Hydra.Test.Checking.NominalTypes
       Hydra.Test.EtaExpansion
       Hydra.Test.Formatting
-      Hydra.Test.Hoisting
+      Hydra.Test.Hoisting.All
+      Hydra.Test.Hoisting.Cases
+      Hydra.Test.Hoisting.Let
       Hydra.Test.Inference.AlgebraicTypes
       Hydra.Test.Inference.AlgorithmW
       Hydra.Test.Inference.All
+      Hydra.Test.Inference.Classes
       Hydra.Test.Inference.Failures
       Hydra.Test.Inference.Fundamentals
       Hydra.Test.Inference.KernelExamples
       Hydra.Test.Inference.NominalTypes
-      Hydra.Test.Json.Coder
       Hydra.Test.Json.Parser
       Hydra.Test.Json.Roundtrip
       Hydra.Test.Json.Writer
       Hydra.Test.Lib.Chars
       Hydra.Test.Lib.Eithers
       Hydra.Test.Lib.Equality
-      Hydra.Test.Lib.Flows
       Hydra.Test.Lib.Lists
       Hydra.Test.Lib.Literals
       Hydra.Test.Lib.Logic
@@ -876,9 +900,9 @@
       Hydra.Test.Lib.Math
       Hydra.Test.Lib.Maybes
       Hydra.Test.Lib.Pairs
+      Hydra.Test.Lib.Regex
       Hydra.Test.Lib.Sets
       Hydra.Test.Lib.Strings
-      Hydra.Test.Monads
       Hydra.Test.Ordering
       Hydra.Test.Reduction
       Hydra.Test.Rewriting
@@ -890,13 +914,14 @@
       Hydra.Test.TestTerms
       Hydra.Test.TestTypes
       Hydra.Test.Unification
+      Hydra.Test.Validate.All
+      Hydra.Test.Validate.Core
       Paths_hydra
   hs-source-dirs:
       src/test/haskell
       src/gen-test/haskell
   build-depends:
       HUnit
-    , HsYAML >=0.2.1 && <0.3
     , QuickCheck
     , aeson >=2.1.0 && <2.3
     , base >=4.19.0 && <4.22
@@ -910,6 +935,7 @@
     , hydra
     , mtl
     , process
+    , regex-tdfa >=1.3.2 && <1.4
     , scientific >=0.3.7 && <0.4
     , split >=0.2.3 && <0.3
     , text >=2.0.2 && <2.2
diff --git a/src/exec/update-generation-tests/Main.hs b/src/exec/update-generation-tests/Main.hs
--- a/src/exec/update-generation-tests/Main.hs
+++ b/src/exec/update-generation-tests/Main.hs
@@ -7,8 +7,8 @@
 module Main where
 
 import Hydra.Kernel
-import Hydra.Staging.Testing.Generation.Generate
-import Hydra.Staging.Testing.Generation.HaskellCodec (haskellTestGenerator)
+import Hydra.Generation (createTestGroupLookup, generateGenerationTestSuite)
+import Hydra.Ext.Haskell.TestingIo (haskellTestGenerator)
 import qualified Hydra.Sources.Test.TestSuite as TestSuite
 import qualified Hydra.Test.TestSuite as GenTests
 
diff --git a/src/exec/update-haskell-kernel/Main.hs b/src/exec/update-haskell-kernel/Main.hs
--- a/src/exec/update-haskell-kernel/Main.hs
+++ b/src/exec/update-haskell-kernel/Main.hs
@@ -13,4 +13,10 @@
   writeHaskell "src/gen-main/haskell" mainModules mainModules
 
   putStrLn ""
+  putStrLn "Generating DSL source module (hydra.dsls) to src/gen-main/haskell..."
+  putStrLn ""
+
+  writeDslSourceHaskell "src/gen-main/haskell"
+
+  putStrLn ""
   putStrLn "=== Done! ==="
diff --git a/src/exec/update-haskell-sources/Main.hs b/src/exec/update-haskell-sources/Main.hs
--- a/src/exec/update-haskell-sources/Main.hs
+++ b/src/exec/update-haskell-sources/Main.hs
@@ -31,4 +31,8 @@
       writeEncoderSourceHaskell "src/gen-main/haskell" mainModules kernelTypesModules
 
       putStrLn ""
+      putStrLn "Generating DSL modules to src/gen-main/haskell..."
+      writeDslHaskell "src/gen-main/haskell" mainModules mainModules
+
+      putStrLn ""
       putStrLn "=== Done! ==="
diff --git a/src/exec/update-json-kernel/Main.hs b/src/exec/update-json-kernel/Main.hs
--- a/src/exec/update-json-kernel/Main.hs
+++ b/src/exec/update-json-kernel/Main.hs
@@ -3,19 +3,21 @@
 import Hydra.Generation (writeModulesJson)
 import Hydra.Sources.All (kernelModules)
 import Hydra.Sources.Eval.Lib.All (evalLibModules)
+import System.Environment (getArgs)
 import System.Exit (exitFailure)
 import Control.Exception (catch, SomeException)
 
 
 main :: IO ()
 main = do
+  outputDir <- parseOutputDir "src/gen-main/json"
   let allMods = kernelModules ++ evalLibModules
   putStrLn "=== Generate Hydra kernel JSON ==="
   putStrLn ""
   putStrLn $ "Generating " ++ show (length allMods) ++ " kernel + eval lib modules to JSON..."
   putStrLn ""
 
-  result <- catch (writeModulesJson True "src/gen-main/json" allMods allMods >> return True)
+  result <- catch (writeModulesJson True outputDir allMods allMods >> return True)
                   (\e -> do
                     putStrLn $ "Error: " ++ show (e :: SomeException)
                     return False)
@@ -25,8 +27,17 @@
       putStrLn ""
       putStrLn "=== Done! ==="
       putStrLn ""
-      putStrLn "Generated files are in: src/gen-main/json/"
+      putStrLn $ "Generated files are in: " ++ outputDir ++ "/"
     else do
       putStrLn ""
       putStrLn "=== FAILED ==="
       exitFailure
+
+parseOutputDir :: String -> IO String
+parseOutputDir defaultDir = do
+  args <- getArgs
+  return $ go args
+  where
+    go ("--output-dir" : dir : _) = dir
+    go (_ : rest) = go rest
+    go [] = defaultDir
diff --git a/src/exec/update-json-main/Main.hs b/src/exec/update-json-main/Main.hs
--- a/src/exec/update-json-main/Main.hs
+++ b/src/exec/update-json-main/Main.hs
@@ -1,32 +1,50 @@
 module Main where
 
-import Hydra.Generation (writeModulesJson)
-import Hydra.Sources.All (mainModules)
+import Hydra.Generation (writeModulesJson, writeDslJson)
+import Hydra.Sources.All (mainModules, kernelTypesModules)
 import Hydra.Sources.Eval.Lib.All (evalLibModules)
+import System.Environment (getArgs)
 import System.Exit (exitFailure)
 import Control.Exception (catch, SomeException)
 
 
 main :: IO ()
 main = do
+  outputDir <- parseOutputDir "src/gen-main/json"
   let allMods = mainModules ++ evalLibModules
   putStrLn "=== Generate Hydra main modules JSON ==="
   putStrLn ""
   putStrLn $ "Generating " ++ show (length allMods) ++ " main + eval lib modules to JSON..."
   putStrLn ""
 
-  result <- catch (writeModulesJson True "src/gen-main/json" allMods allMods >> return True)
+  result <- catch (writeModulesJson True outputDir allMods allMods >> return True)
                   (\e -> do
                     putStrLn $ "Error: " ++ show (e :: SomeException)
                     return False)
 
-  if result
+  putStrLn ""
+  putStrLn "Generating DSL modules to JSON..."
+  dslResult <- catch (writeDslJson outputDir mainModules kernelTypesModules >> return True)
+                     (\e -> do
+                       putStrLn $ "Error generating DSL JSON: " ++ show (e :: SomeException)
+                       return False)
+
+  if result && dslResult
     then do
       putStrLn ""
       putStrLn "=== Done! ==="
       putStrLn ""
-      putStrLn "Generated files are in: src/gen-main/json/"
+      putStrLn $ "Generated files are in: " ++ outputDir ++ "/"
     else do
       putStrLn ""
       putStrLn "=== FAILED ==="
       exitFailure
+
+parseOutputDir :: String -> IO String
+parseOutputDir defaultDir = do
+  args <- getArgs
+  return $ go args
+  where
+    go ("--output-dir" : dir : _) = dir
+    go (_ : rest) = go rest
+    go [] = defaultDir
diff --git a/src/exec/update-json-test/Main.hs b/src/exec/update-json-test/Main.hs
--- a/src/exec/update-json-test/Main.hs
+++ b/src/exec/update-json-test/Main.hs
@@ -3,19 +3,21 @@
 import Hydra.Generation (writeModulesJson)
 import Hydra.Sources.All (mainModules)
 import Hydra.Sources.Test.All (testModules)
+import System.Environment (getArgs)
 import System.Exit (exitFailure)
 import Control.Exception (catch, SomeException)
 
 
 main :: IO ()
 main = do
+  outputDir <- parseOutputDir "src/gen-test/json"
   putStrLn "=== Generate Hydra test modules JSON ==="
   putStrLn ""
   putStrLn $ "Generating " ++ show (length testModules) ++ " test modules to JSON..."
   putStrLn ""
 
   let universeModules = mainModules ++ testModules
-  result <- catch (writeModulesJson True "src/gen-test/json" universeModules testModules >> return True)
+  result <- catch (writeModulesJson True outputDir universeModules testModules >> return True)
                   (\e -> do
                     putStrLn $ "Error: " ++ show (e :: SomeException)
                     return False)
@@ -25,8 +27,17 @@
       putStrLn ""
       putStrLn "=== Done! ==="
       putStrLn ""
-      putStrLn "Generated files are in: src/gen-test/json/"
+      putStrLn $ "Generated files are in: " ++ outputDir ++ "/"
     else do
       putStrLn ""
       putStrLn "=== FAILED ==="
       exitFailure
+
+parseOutputDir :: String -> IO String
+parseOutputDir defaultDir = do
+  args <- getArgs
+  return $ go args
+  where
+    go ("--output-dir" : dir : _) = dir
+    go (_ : rest) = go rest
+    go [] = defaultDir
diff --git a/src/exec/verify-json-kernel/Main.hs b/src/exec/verify-json-kernel/Main.hs
--- a/src/exec/verify-json-kernel/Main.hs
+++ b/src/exec/verify-json-kernel/Main.hs
@@ -51,22 +51,13 @@
   content <- BS.readFile fp
   return $ aesonToHydra <$> A.eitherDecode content
 
--- | Extract a Type from a term that represents a type definition
-termToType :: Graph -> Term -> Maybe Type
-termToType g term = case DecodeCore.type_ g term of
-  Left _ -> Nothing
-  Right typ -> Just typ
-
--- | Build a schema map (Name -> Type) from a graph's schema.
+-- | Build a schema map (Name -> Type) from a graph's schema types.
 -- This is used by the JSON decoder to resolve type variables.
+-- Uses graphSchemaTypes (which contains TypeScheme values) and extracts the underlying Type.
 buildSchemaMap :: Graph -> M.Map Name Type
-buildSchemaMap g = case graphSchema g of
-  Nothing -> M.empty
-  Just schemaGraph -> M.fromList $ concatMap (extractType schemaGraph) $ graphElements schemaGraph
+buildSchemaMap g = M.map extractType (graphSchemaTypes g)
   where
-    extractType sg binding = case termToType sg (bindingTerm binding) of
-      Just typ -> [(bindingName binding, stripTypeAnnotationsTop typ)]
-      Nothing -> []
+    extractType (TypeScheme _ t _) = stripTypeAnnotationsTop t
 
     -- Strip only top-level annotations
     stripTypeAnnotationsTop (TypeAnnotated (AnnotatedType t _)) = stripTypeAnnotationsTop t
@@ -122,7 +113,7 @@
 
             -- Decode JSON to Term using type-directed decoder with Module type
             -- The schemaMap is used to resolve type variables
-            case JsonDecode.fromJson schemaMap modType jsonVal of
+            case JsonDecode.fromJson schemaMap (Name "hydra.module.Module") modType jsonVal of
               Left err -> do
                 flushPut $ "  ✗ " ++ nsStr ++ " (JSON decode error)"
                 flushPut $ "    " ++ err
@@ -168,26 +159,27 @@
 
 -- | Check whether a module contains only native type definitions (no term definitions).
 isTypeModule :: Module -> Bool
-isTypeModule m = all isNativeType (moduleElements m)
+isTypeModule m = all isNativeType (moduleBindings m)
 
 -- | Strip type annotations from a module for comparison with raw (pre-inference) modules.
 -- Removes TypeLambda, TypeApplication, binding TypeSchemes, and lambda domain types from terms,
 -- but preserves user annotations.
 stripTypeAnnotations :: Module -> Module
 stripTypeAnnotations m = m {
-  moduleElements = fmap stripBinding (moduleElements m) }
+  moduleDefinitions = fmap stripDef (moduleDefinitions m) }
   where
-    stripBinding b = b {
-      bindingTerm = Rewriting.removeTypesFromTerm (bindingTerm b),
-      bindingType = Nothing }
+    stripDef (DefinitionTerm td) = DefinitionTerm td {
+      termDefinitionTerm = Rewriting.removeTypesFromTerm (termDefinitionTerm td),
+      termDefinitionType = Just $ TypeScheme [] (TypeVariable $ Name "hydra.core.Unit") Nothing }
+    stripDef d = d
 
 -- | Find the first difference between two modules
 findDifference :: Module -> Module -> String
 findDifference orig decoded
   | moduleNamespace orig /= moduleNamespace decoded =
       "namespace differs: " ++ unNamespace (moduleNamespace orig) ++ " vs " ++ unNamespace (moduleNamespace decoded)
-  | length (moduleElements orig) /= length (moduleElements decoded) =
-      "element count differs: " ++ show (length (moduleElements orig)) ++ " vs " ++ show (length (moduleElements decoded))
+  | length (moduleDefinitions orig) /= length (moduleDefinitions decoded) =
+      "element count differs: " ++ show (length (moduleDefinitions orig)) ++ " vs " ++ show (length (moduleDefinitions decoded))
   | moduleTermDependencies orig /= moduleTermDependencies decoded =
       "termDependencies differ"
   | moduleTypeDependencies orig /= moduleTypeDependencies decoded =
@@ -195,13 +187,14 @@
   | moduleDescription orig /= moduleDescription decoded =
       "description differs"
   | otherwise =
-      "elements differ (checking first mismatch...)" ++ findElementDiff (moduleElements orig) (moduleElements decoded)
+      "elements differ (checking first mismatch...)" ++ findElementDiff (moduleDefinitions orig) (moduleDefinitions decoded)
 
-findElementDiff :: [Binding] -> [Binding] -> String
+findElementDiff :: [Definition] -> [Definition] -> String
 findElementDiff [] [] = ""
 findElementDiff (o:os) (d:ds)
   | o == d = findElementDiff os ds
-  | bindingName o /= bindingName d = " - name: " ++ unName (bindingName o) ++ " vs " ++ unName (bindingName d)
-  | bindingType o /= bindingType d = " - type differs for " ++ unName (bindingName o)
-  | otherwise = " - term differs for " ++ unName (bindingName o)
+  | otherwise = " - definition differs at " ++ show (defName o) ++ " vs " ++ show (defName d)
+  where
+    defName (DefinitionTerm td) = termDefinitionName td
+    defName (DefinitionType td) = typeDefinitionName td
 findElementDiff _ _ = " - different element counts"
diff --git a/src/gen-main/haskell/Hydra/Accessors.hs b/src/gen-main/haskell/Hydra/Accessors.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Accessors.hs
+++ /dev/null
@@ -1,160 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | A model for term access patterns
-
-module Hydra.Accessors where
-
-import qualified Hydra.Core as Core
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | An edge in an accessor graph, connecting two nodes via a path
-data AccessorEdge = 
-  AccessorEdge {
-    -- | The source node of the edge
-    accessorEdgeSource :: AccessorNode,
-    -- | The accessor path connecting source to target
-    accessorEdgePath :: AccessorPath,
-    -- | The target node of the edge
-    accessorEdgeTarget :: AccessorNode}
-  deriving (Eq, Ord, Read, Show)
-
-_AccessorEdge = (Core.Name "hydra.accessors.AccessorEdge")
-
-_AccessorEdge_source = (Core.Name "source")
-
-_AccessorEdge_path = (Core.Name "path")
-
-_AccessorEdge_target = (Core.Name "target")
-
--- | A graph of accessor nodes and edges, representing term access patterns
-data AccessorGraph = 
-  AccessorGraph {
-    -- | All nodes in the graph
-    accessorGraphNodes :: [AccessorNode],
-    -- | All edges in the graph
-    accessorGraphEdges :: [AccessorEdge]}
-  deriving (Eq, Ord, Read, Show)
-
-_AccessorGraph = (Core.Name "hydra.accessors.AccessorGraph")
-
-_AccessorGraph_nodes = (Core.Name "nodes")
-
-_AccessorGraph_edges = (Core.Name "edges")
-
--- | A node in an accessor graph, representing a term or subterm
-data AccessorNode = 
-  AccessorNode {
-    -- | The qualified name of the term
-    accessorNodeName :: Core.Name,
-    -- | A human-readable label for the node
-    accessorNodeLabel :: String,
-    -- | A unique identifier for the node
-    accessorNodeId :: String}
-  deriving (Eq, Ord, Read, Show)
-
-_AccessorNode = (Core.Name "hydra.accessors.AccessorNode")
-
-_AccessorNode_name = (Core.Name "name")
-
-_AccessorNode_label = (Core.Name "label")
-
-_AccessorNode_id = (Core.Name "id")
-
--- | A sequence of term accessors forming a path through a term
-newtype AccessorPath = 
-  AccessorPath {
-    unAccessorPath :: [TermAccessor]}
-  deriving (Eq, Ord, Read, Show)
-
-_AccessorPath = (Core.Name "hydra.accessors.AccessorPath")
-
--- | A function which maps from a term to a particular immediate subterm
-data TermAccessor = 
-  -- | Access the body of an annotated term
-  TermAccessorAnnotatedBody  |
-  -- | Access the function of an application term
-  TermAccessorApplicationFunction  |
-  -- | Access the argument of an application term
-  TermAccessorApplicationArgument  |
-  -- | Access the body of a lambda term
-  TermAccessorLambdaBody  |
-  -- | Access the default case of a union elimination
-  TermAccessorUnionCasesDefault  |
-  -- | Access a specific branch of a union elimination by field name
-  TermAccessorUnionCasesBranch Core.Name |
-  -- | Access the body of a let term
-  TermAccessorLetBody  |
-  -- | Access a specific binding in a let term by variable name
-  TermAccessorLetBinding Core.Name |
-  -- | Access an element of a list by index
-  TermAccessorListElement Int |
-  -- | Access a key in a map by index
-  TermAccessorMapKey Int |
-  -- | Access a value in a map by index
-  TermAccessorMapValue Int |
-  -- | Access the term inside a Just value
-  TermAccessorMaybeTerm  |
-  -- | Access an element of a product (tuple) by index
-  TermAccessorProductTerm Int |
-  -- | Access a field of a record by field name
-  TermAccessorRecordField Core.Name |
-  -- | Access an element of a set by index
-  TermAccessorSetElement Int |
-  -- | Access the term inside a sum variant
-  TermAccessorSumTerm  |
-  -- | Access the body of a type lambda term
-  TermAccessorTypeLambdaBody  |
-  -- | Access the term being applied to a type
-  TermAccessorTypeApplicationTerm  |
-  -- | Access the term inside a union injection
-  TermAccessorInjectionTerm  |
-  -- | Access the term inside a wrapped term
-  TermAccessorWrappedTerm 
-  deriving (Eq, Ord, Read, Show)
-
-_TermAccessor = (Core.Name "hydra.accessors.TermAccessor")
-
-_TermAccessor_annotatedBody = (Core.Name "annotatedBody")
-
-_TermAccessor_applicationFunction = (Core.Name "applicationFunction")
-
-_TermAccessor_applicationArgument = (Core.Name "applicationArgument")
-
-_TermAccessor_lambdaBody = (Core.Name "lambdaBody")
-
-_TermAccessor_unionCasesDefault = (Core.Name "unionCasesDefault")
-
-_TermAccessor_unionCasesBranch = (Core.Name "unionCasesBranch")
-
-_TermAccessor_letBody = (Core.Name "letBody")
-
-_TermAccessor_letBinding = (Core.Name "letBinding")
-
-_TermAccessor_listElement = (Core.Name "listElement")
-
-_TermAccessor_mapKey = (Core.Name "mapKey")
-
-_TermAccessor_mapValue = (Core.Name "mapValue")
-
-_TermAccessor_maybeTerm = (Core.Name "maybeTerm")
-
-_TermAccessor_productTerm = (Core.Name "productTerm")
-
-_TermAccessor_recordField = (Core.Name "recordField")
-
-_TermAccessor_setElement = (Core.Name "setElement")
-
-_TermAccessor_sumTerm = (Core.Name "sumTerm")
-
-_TermAccessor_typeLambdaBody = (Core.Name "typeLambdaBody")
-
-_TermAccessor_typeApplicationTerm = (Core.Name "typeApplicationTerm")
-
-_TermAccessor_injectionTerm = (Core.Name "injectionTerm")
-
-_TermAccessor_wrappedTerm = (Core.Name "wrappedTerm")
diff --git a/src/gen-main/haskell/Hydra/Adapt.hs b/src/gen-main/haskell/Hydra/Adapt.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Adapt.hs
@@ -0,0 +1,662 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Simple, one-way adapters for types and terms
+
+module Hydra.Adapt where
+
+import qualified Hydra.Coders as Coders
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Hoisting as Hoisting
+import qualified Hydra.Inference as Inference
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Literals as Literals_
+import qualified Hydra.Module as Module
+import qualified Hydra.Names as Names
+import qualified Hydra.Reduction as Reduction
+import qualified Hydra.Reflect as Reflect
+import qualified Hydra.Rewriting as Rewriting
+import qualified Hydra.Schemas as Schemas
+import qualified Hydra.Show.Core as Core_
+import qualified Hydra.Show.Errors as Errors_
+import qualified Hydra.Util as Util
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Adapt a graph and its schema to the given language constraints. The doExpand flag controls eta expansion of partial applications. Adaptation is type-preserving: binding-level TypeSchemes are adapted (not stripped). Note: case statement hoisting is done separately, prior to adaptation. The els0 parameter provides the original ordered bindings. Returns both the adapted graph and the ordered adapted bindings.
+adaptDataGraph :: Coders.LanguageConstraints -> Bool -> [Core.Binding] -> Context.Context -> Graph.Graph -> Either String (Graph.Graph, [Core.Binding])
+adaptDataGraph constraints doExpand els0 cx graph0 =
+
+      let transform =
+              \g -> \gterm ->
+                let tx = g
+                    gterm1 = Rewriting.unshadowVariables (pushTypeAppsInward gterm)
+                    gterm2 =
+                            Rewriting.unshadowVariables (Logic.ifElse doExpand (pushTypeAppsInward (Reduction.etaExpandTermNew tx gterm1)) gterm1)
+                in (Rewriting.liftLambdaAboveLet gterm2)
+          litmap = adaptLiteralTypesMap constraints
+          prims0 = Graph.graphPrimitives graph0
+          schemaTypes0 = Graph.graphSchemaTypes graph0
+          schemaBindings = Schemas.typesToElements (Maps.map (\ts -> Rewriting.typeSchemeToFType ts) schemaTypes0)
+      in (Eithers.bind (Logic.ifElse (Maps.null schemaTypes0) (Right Maps.empty) (Eithers.bind (Eithers.bimap (\ic -> Errors.unDecodingError (Context.inContextObject ic)) (\x -> x) (Schemas.graphAsTypes cx graph0 schemaBindings)) (\tmap0 -> Eithers.bind (adaptGraphSchema constraints litmap tmap0) (\tmap1 -> Right (Maps.map (\t -> Schemas.typeToTypeScheme t) tmap1))))) (\schemaResult ->
+        let adaptedSchemaTypes = schemaResult
+            gterm0 =
+                    Core.TermLet (Core.Let {
+                      Core.letBindings = els0,
+                      Core.letBody = Core.TermUnit})
+            gterm1 = Logic.ifElse doExpand (transform graph0 gterm0) gterm0
+        in (Eithers.bind (adaptTerm constraints litmap cx graph0 gterm1) (\gterm2 -> Eithers.bind (Rewriting.rewriteTermM (adaptLambdaDomains constraints litmap) gterm2) (\gterm3 ->
+          let els1Raw = Schemas.termAsBindings gterm3
+              processBinding =
+                      \el -> Eithers.bind (Rewriting.rewriteTermM (adaptNestedTypes constraints litmap) (Core.bindingTerm el)) (\newTerm -> Eithers.bind (Maybes.maybe (Right Nothing) (\ts -> Eithers.bind (adaptTypeScheme constraints litmap ts) (\ts1 -> Right (Just ts1))) (Core.bindingType el)) (\adaptedType -> Right (Core.Binding {
+                        Core.bindingName = (Core.bindingName el),
+                        Core.bindingTerm = newTerm,
+                        Core.bindingType = adaptedType})))
+          in (Eithers.bind (Eithers.mapList processBinding els1Raw) (\els1 -> Eithers.bind (Eithers.mapList (\kv -> Eithers.bind (adaptPrimitive constraints litmap (Pairs.second kv)) (\prim1 -> Right (Pairs.first kv, prim1))) (Maps.toList prims0)) (\primPairs ->
+            let prims1 = Maps.fromList primPairs
+                adaptedGraphRaw = Lexical.buildGraph els1 Maps.empty prims1
+                adaptedGraph =
+                        Graph.Graph {
+                          Graph.graphBoundTerms = (Graph.graphBoundTerms adaptedGraphRaw),
+                          Graph.graphBoundTypes = (Graph.graphBoundTypes adaptedGraphRaw),
+                          Graph.graphClassConstraints = (Graph.graphClassConstraints adaptedGraphRaw),
+                          Graph.graphLambdaVariables = (Graph.graphLambdaVariables adaptedGraphRaw),
+                          Graph.graphMetadata = (Graph.graphMetadata adaptedGraphRaw),
+                          Graph.graphPrimitives = (Graph.graphPrimitives adaptedGraphRaw),
+                          Graph.graphSchemaTypes = adaptedSchemaTypes,
+                          Graph.graphTypeVariables = (Graph.graphTypeVariables adaptedGraphRaw)}
+            in (Right (adaptedGraph, els1))))))))))
+
+-- | Attempt to adapt a floating-point type using the given language constraints
+adaptFloatType :: Coders.LanguageConstraints -> Core.FloatType -> Maybe Core.FloatType
+adaptFloatType constraints ft =
+
+      let supported = Sets.member ft (Coders.languageConstraintsFloatTypes constraints)
+          alt = adaptFloatType constraints
+          forUnsupported =
+                  \ft -> case ft of
+                    Core.FloatTypeBigfloat -> alt Core.FloatTypeFloat64
+                    Core.FloatTypeFloat32 -> alt Core.FloatTypeFloat64
+                    Core.FloatTypeFloat64 -> alt Core.FloatTypeBigfloat
+      in (Logic.ifElse supported (Just ft) (forUnsupported ft))
+
+-- | Adapt a schema graph to the given language constraints
+adaptGraphSchema :: Ord t0 => (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> M.Map t0 Core.Type -> Either String (M.Map t0 Core.Type))
+adaptGraphSchema constraints litmap types0 =
+
+      let mapPair =
+              \pair ->
+                let name = Pairs.first pair
+                    typ = Pairs.second pair
+                in (Eithers.bind (adaptType constraints litmap typ) (\typ1 -> Right (name, typ1)))
+      in (Eithers.bind (Eithers.mapList mapPair (Maps.toList types0)) (\pairs -> Right (Maps.fromList pairs)))
+
+-- | Attempt to adapt an integer type using the given language constraints
+adaptIntegerType :: Coders.LanguageConstraints -> Core.IntegerType -> Maybe Core.IntegerType
+adaptIntegerType constraints it =
+
+      let supported = Sets.member it (Coders.languageConstraintsIntegerTypes constraints)
+          alt = adaptIntegerType constraints
+          forUnsupported =
+                  \it -> case it of
+                    Core.IntegerTypeBigint -> Nothing
+                    Core.IntegerTypeInt8 -> alt Core.IntegerTypeUint16
+                    Core.IntegerTypeInt16 -> alt Core.IntegerTypeUint32
+                    Core.IntegerTypeInt32 -> alt Core.IntegerTypeUint64
+                    Core.IntegerTypeInt64 -> alt Core.IntegerTypeBigint
+                    Core.IntegerTypeUint8 -> alt Core.IntegerTypeInt16
+                    Core.IntegerTypeUint16 -> alt Core.IntegerTypeInt32
+                    Core.IntegerTypeUint32 -> alt Core.IntegerTypeInt64
+                    Core.IntegerTypeUint64 -> alt Core.IntegerTypeBigint
+      in (Logic.ifElse supported (Just it) (forUnsupported it))
+
+-- | Rewrite callback for adapting lambda domain types in a term
+adaptLambdaDomains :: Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> (t0 -> Either String Core.Term) -> t0 -> Either String Core.Term
+adaptLambdaDomains constraints litmap recurse term =
+    Eithers.bind (recurse term) (\rewritten -> case rewritten of
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionLambda v1 -> Eithers.bind (Maybes.maybe (Right Nothing) (\dom -> Eithers.bind (adaptType constraints litmap dom) (\dom1 -> Right (Just dom1))) (Core.lambdaDomain v1)) (\adaptedDomain -> Right (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.lambdaParameter v1),
+          Core.lambdaDomain = adaptedDomain,
+          Core.lambdaBody = (Core.lambdaBody v1)}))))
+        _ -> Right (Core.TermFunction v0)
+      _ -> Right rewritten)
+
+-- | Convert a literal to a different type
+adaptLiteral :: Core.LiteralType -> Core.Literal -> Core.Literal
+adaptLiteral lt l =
+    case l of
+      Core.LiteralBinary v0 -> case lt of
+        Core.LiteralTypeString -> Core.LiteralString (Literals.binaryToString v0)
+      Core.LiteralBoolean v0 -> case lt of
+        Core.LiteralTypeInteger v1 -> Core.LiteralInteger (Literals_.bigintToIntegerValue v1 (Logic.ifElse v0 1 0))
+      Core.LiteralFloat v0 -> case lt of
+        Core.LiteralTypeFloat v1 -> Core.LiteralFloat (Literals_.bigfloatToFloatValue v1 (Literals_.floatValueToBigfloat v0))
+      Core.LiteralInteger v0 -> case lt of
+        Core.LiteralTypeInteger v1 -> Core.LiteralInteger (Literals_.bigintToIntegerValue v1 (Literals_.integerValueToBigint v0))
+
+-- | Attempt to adapt a literal type using the given language constraints
+adaptLiteralType :: Coders.LanguageConstraints -> Core.LiteralType -> Maybe Core.LiteralType
+adaptLiteralType constraints lt =
+
+      let forUnsupported =
+              \lt -> case lt of
+                Core.LiteralTypeBinary -> Just Core.LiteralTypeString
+                Core.LiteralTypeBoolean -> Maybes.map (\x -> Core.LiteralTypeInteger x) (adaptIntegerType constraints Core.IntegerTypeInt8)
+                Core.LiteralTypeFloat v0 -> Maybes.map (\x -> Core.LiteralTypeFloat x) (adaptFloatType constraints v0)
+                Core.LiteralTypeInteger v0 -> Maybes.map (\x -> Core.LiteralTypeInteger x) (adaptIntegerType constraints v0)
+                _ -> Nothing
+      in (Logic.ifElse (literalTypeSupported constraints lt) Nothing (forUnsupported lt))
+
+-- | Derive a map of adapted literal types for the given language constraints
+adaptLiteralTypesMap :: Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType
+adaptLiteralTypesMap constraints =
+
+      let tryType = \lt -> Maybes.maybe Nothing (\lt2 -> Just (lt, lt2)) (adaptLiteralType constraints lt)
+      in (Maps.fromList (Maybes.cat (Lists.map tryType Reflect.literalTypes)))
+
+-- | Adapt a literal value using the given language constraints
+adaptLiteralValue :: Ord t0 => (M.Map t0 Core.LiteralType -> t0 -> Core.Literal -> Core.Literal)
+adaptLiteralValue litmap lt l =
+    Maybes.maybe (Core.LiteralString (Core_.literal l)) (\lt2 -> adaptLiteral lt2 l) (Maps.lookup lt litmap)
+
+-- | Rewrite callback for adapting nested let binding TypeSchemes in a term
+adaptNestedTypes :: Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> (t0 -> Either String Core.Term) -> t0 -> Either String Core.Term
+adaptNestedTypes constraints litmap recurse term =
+    Eithers.bind (recurse term) (\rewritten -> case rewritten of
+      Core.TermLet v0 ->
+        let adaptB =
+                \b -> Eithers.bind (Maybes.maybe (Right Nothing) (\ts -> Eithers.bind (adaptTypeScheme constraints litmap ts) (\ts1 -> Right (Just ts1))) (Core.bindingType b)) (\adaptedBType -> Right (Core.Binding {
+                  Core.bindingName = (Core.bindingName b),
+                  Core.bindingTerm = (Core.bindingTerm b),
+                  Core.bindingType = adaptedBType}))
+        in (Eithers.bind (Eithers.mapList adaptB (Core.letBindings v0)) (\adaptedBindings -> Right (Core.TermLet (Core.Let {
+          Core.letBindings = adaptedBindings,
+          Core.letBody = (Core.letBody v0)}))))
+      _ -> Right rewritten)
+
+-- | Adapt a primitive to the given language constraints, prior to inference
+adaptPrimitive :: Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> Graph.Primitive -> Either String Graph.Primitive
+adaptPrimitive constraints litmap prim0 =
+
+      let ts0 = Graph.primitiveType prim0
+      in (Eithers.bind (adaptTypeScheme constraints litmap ts0) (\ts1 -> Right (Graph.Primitive {
+        Graph.primitiveName = (Graph.primitiveName prim0),
+        Graph.primitiveType = ts1,
+        Graph.primitiveImplementation = (Graph.primitiveImplementation prim0)})))
+
+-- | Adapt a term using the given language constraints
+adaptTerm :: Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> Context.Context -> Graph.Graph -> Core.Term -> Either String Core.Term
+adaptTerm constraints litmap cx graph term0 =
+
+      let rewrite =
+              \recurse -> \term0 ->
+                let forSupported =
+                        \term -> case term of
+                          Core.TermLiteral v0 ->
+                            let lt = Reflect.literalType v0
+                            in (Right (Just (Logic.ifElse (literalTypeSupported constraints lt) term (Core.TermLiteral (adaptLiteralValue litmap lt v0)))))
+                          _ -> Right (Just term)
+                    forUnsupported =
+                            \term ->
+                              let forNonNull =
+                                      \alts -> Eithers.bind (tryTerm (Lists.head alts)) (\mterm -> Maybes.maybe (tryAlts (Lists.tail alts)) (\t -> Right (Just t)) mterm)
+                                  tryAlts = \alts -> Logic.ifElse (Lists.null alts) (Right Nothing) (forNonNull alts)
+                              in (Eithers.bind (termAlternatives cx graph term) (\alts0 -> tryAlts alts0))
+                    tryTerm =
+                            \term ->
+                              let supportedVariant = Sets.member (Reflect.termVariant term) (Coders.languageConstraintsTermVariants constraints)
+                              in (Logic.ifElse supportedVariant (forSupported term) (forUnsupported term))
+                in (Eithers.bind (recurse term0) (\term1 -> case term1 of
+                  Core.TermTypeApplication v0 -> Eithers.bind (adaptType constraints litmap (Core.typeApplicationTermType v0)) (\atyp -> Right (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.typeApplicationTermBody v0),
+                    Core.typeApplicationTermType = atyp})))
+                  Core.TermTypeLambda _ -> Right term1
+                  _ -> Eithers.bind (tryTerm term1) (\mterm -> Maybes.maybe (Left (Strings.cat2 "no alternatives for term: " (Core_.term term1))) (\term2 -> Right term2) mterm)))
+      in (Rewriting.rewriteTermM rewrite term0)
+
+-- | Adapt a term using the constraints of a given language
+adaptTermForLanguage :: Coders.Language -> Context.Context -> Graph.Graph -> Core.Term -> Either String Core.Term
+adaptTermForLanguage lang cx g term =
+
+      let constraints = Coders.languageConstraints lang
+          litmap = adaptLiteralTypesMap constraints
+      in (adaptTerm constraints litmap cx g term)
+
+-- | Adapt a type using the given language constraints
+adaptType :: Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> Core.Type -> Either String Core.Type
+adaptType constraints litmap type0 =
+
+      let forSupported =
+              \typ -> case typ of
+                Core.TypeLiteral v0 -> Logic.ifElse (literalTypeSupported constraints v0) (Just typ) (Maybes.maybe (Just (Core.TypeLiteral Core.LiteralTypeString)) (\lt2 -> Just (Core.TypeLiteral lt2)) (Maps.lookup v0 litmap))
+                _ -> Just typ
+          forUnsupported =
+                  \typ ->
+                    let tryAlts =
+                            \alts -> Logic.ifElse (Lists.null alts) Nothing (Maybes.maybe (tryAlts (Lists.tail alts)) (\t -> Just t) (tryType (Lists.head alts)))
+                        alts0 = typeAlternatives typ
+                    in (tryAlts alts0)
+          tryType =
+                  \typ ->
+                    let supportedVariant = Sets.member (Reflect.typeVariant typ) (Coders.languageConstraintsTypeVariants constraints)
+                    in (Logic.ifElse supportedVariant (forSupported typ) (forUnsupported typ))
+          rewrite =
+                  \recurse -> \typ -> Eithers.bind (recurse typ) (\type1 -> Maybes.maybe (Left (Strings.cat2 "no alternatives for type: " (Core_.type_ typ))) (\type2 -> Right type2) (tryType type1))
+      in (Rewriting.rewriteTypeM rewrite type0)
+
+-- | Adapt a type using the constraints of a given language
+adaptTypeForLanguage :: Coders.Language -> Core.Type -> Either String Core.Type
+adaptTypeForLanguage lang typ =
+
+      let constraints = Coders.languageConstraints lang
+          litmap = adaptLiteralTypesMap constraints
+      in (adaptType constraints litmap typ)
+
+-- | Adapt a type scheme to the given language constraints, prior to inference
+adaptTypeScheme :: Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> Core.TypeScheme -> Either String Core.TypeScheme
+adaptTypeScheme constraints litmap ts0 =
+
+      let vars0 = Core.typeSchemeVariables ts0
+          t0 = Core.typeSchemeType ts0
+      in (Eithers.bind (adaptType constraints litmap t0) (\t1 -> Right (Core.TypeScheme {
+        Core.typeSchemeVariables = vars0,
+        Core.typeSchemeType = t1,
+        Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts0)})))
+
+-- | Compose two coders into a single coder
+composeCoders :: Util.Coder t0 t1 -> Util.Coder t1 t2 -> Util.Coder t0 t2
+composeCoders c1 c2 =
+    Util.Coder {
+      Util.coderEncode = (\cx -> \a -> Eithers.bind (Util.coderEncode c1 cx a) (\b1 -> Util.coderEncode c2 cx b1)),
+      Util.coderDecode = (\cx -> \c -> Eithers.bind (Util.coderDecode c2 cx c) (\b2 -> Util.coderDecode c1 cx b2))}
+
+-- | Given a data graph along with language constraints, original ordered bindings, and a designated list of namespaces, adapt the graph to the language constraints, then return the processed graph along with term definitions grouped by namespace (in the order of the input namespaces). Inference is performed before adaptation if bindings lack type annotations. Hoisting must preserve type schemes; if any binding loses its type scheme after hoisting, the pipeline fails. Adaptation preserves type application/lambda wrappers and adapts embedded types. Post-adaptation inference is performed to ensure binding TypeSchemes are fully consistent. The doExpand flag controls eta expansion. The doHoistCaseStatements flag controls case statement hoisting (needed for Python). The doHoistPolymorphicLetBindings flag controls polymorphic let binding hoisting (needed for Java). The originalBindings parameter provides the original ordered bindings (from module elements).
+dataGraphToDefinitions :: Coders.LanguageConstraints -> Bool -> Bool -> Bool -> Bool -> [Core.Binding] -> Graph.Graph -> [Module.Namespace] -> Context.Context -> Either String (Graph.Graph, [[Module.TermDefinition]])
+dataGraphToDefinitions constraints doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings originalBindings graph0 namespaces cx =
+
+      let namespacesSet = Sets.fromList namespaces
+          isParentBinding =
+                  \b -> Maybes.maybe False (\ns -> Sets.member ns namespacesSet) (Names.namespaceOf (Core.bindingName b))
+          hoistCases =
+                  \bindings ->
+                    let stripped =
+                            Lists.map (\b -> Core.Binding {
+                              Core.bindingName = (Core.bindingName b),
+                              Core.bindingTerm = (Rewriting.stripTypeLambdas (Core.bindingTerm b)),
+                              Core.bindingType = (Core.bindingType b)}) bindings
+                        term0 =
+                                Core.TermLet (Core.Let {
+                                  Core.letBindings = stripped,
+                                  Core.letBody = Core.TermUnit})
+                        unshadowed0 = Schemas.termAsBindings (Rewriting.unshadowVariables term0)
+                        hoisted = Hoisting.hoistCaseStatementsInGraph unshadowed0
+                        term1 =
+                                Core.TermLet (Core.Let {
+                                  Core.letBindings = hoisted,
+                                  Core.letBody = Core.TermUnit})
+                    in (Schemas.termAsBindings (Rewriting.unshadowVariables term1))
+          hoistPoly =
+                  \bindings ->
+                    let letBefore =
+                            Core.Let {
+                              Core.letBindings = bindings,
+                              Core.letBody = Core.TermUnit}
+                        letAfter = Hoisting.hoistPolymorphicLetBindings isParentBinding letBefore
+                    in (Core.letBindings letAfter)
+          checkBindingsTyped =
+                  \debugLabel -> \bindings ->
+                    let untypedBindings =
+                            Lists.map (\b -> Core.unName (Core.bindingName b)) (Lists.filter (\b -> Logic.not (Maybes.isJust (Core.bindingType b))) bindings)
+                    in (Logic.ifElse (Lists.null untypedBindings) (Right bindings) (Left (Strings.cat [
+                      "Found untyped bindings (",
+                      debugLabel,
+                      "): ",
+                      (Strings.intercalate ", " untypedBindings)])))
+          normalizeBindings =
+                  \bindings -> Lists.map (\b -> Core.Binding {
+                    Core.bindingName = (Core.bindingName b),
+                    Core.bindingTerm = (pushTypeAppsInward (Core.bindingTerm b)),
+                    Core.bindingType = (Core.bindingType b)}) bindings
+          rebuildGraph =
+                  \bindings ->
+                    let g = Lexical.buildGraph bindings Maps.empty (Graph.graphPrimitives graph0)
+                    in Graph.Graph {
+                      Graph.graphBoundTerms = (Graph.graphBoundTerms g),
+                      Graph.graphBoundTypes = (Graph.graphBoundTypes g),
+                      Graph.graphClassConstraints = (Graph.graphClassConstraints g),
+                      Graph.graphLambdaVariables = (Graph.graphLambdaVariables g),
+                      Graph.graphMetadata = (Graph.graphMetadata g),
+                      Graph.graphPrimitives = (Graph.graphPrimitives g),
+                      Graph.graphSchemaTypes = (Graph.graphSchemaTypes graph0),
+                      Graph.graphTypeVariables = (Graph.graphTypeVariables g)}
+          bins0 = originalBindings
+          bins1 = Logic.ifElse doHoistCaseStatements (hoistCases bins0) bins0
+      in (Eithers.bind (Logic.ifElse doInfer (Eithers.map (\result -> Pairs.second (Pairs.first result)) (Eithers.bimap (\ic -> Errors_.error (Context.inContextObject ic)) (\x -> x) (Inference.inferGraphTypes cx bins1 (rebuildGraph bins1)))) (checkBindingsTyped "after case hoisting" bins1)) (\bins2 -> Eithers.bind (Logic.ifElse doHoistPolymorphicLetBindings (checkBindingsTyped "after let hoisting" (hoistPoly bins2)) (Right bins2)) (\bins3 -> Eithers.bind (adaptDataGraph constraints doExpand bins3 cx (rebuildGraph bins3)) (\adaptResult ->
+        let adapted = Pairs.first adaptResult
+            adaptedBindings = Pairs.second adaptResult
+        in (Eithers.bind (checkBindingsTyped "after adaptation" adaptedBindings) (\bins4 ->
+          let bins5 = normalizeBindings bins4
+              toDef =
+                      \el -> Maybes.map (\ts -> Module.TermDefinition {
+                        Module.termDefinitionName = (Core.bindingName el),
+                        Module.termDefinitionTerm = (Core.bindingTerm el),
+                        Module.termDefinitionType = (Just ts)}) (Core.bindingType el)
+              selectedElements =
+                      Lists.filter (\el -> Maybes.maybe False (\ns -> Sets.member ns namespacesSet) (Names.namespaceOf (Core.bindingName el))) bins5
+              elementsByNamespace =
+                      Lists.foldl (\acc -> \el -> Maybes.maybe acc (\ns ->
+                        let existing = Maybes.maybe [] Equality.identity (Maps.lookup ns acc)
+                        in (Maps.insert ns (Lists.concat2 existing [
+                          el]) acc)) (Names.namespaceOf (Core.bindingName el))) Maps.empty selectedElements
+              defsGrouped =
+                      Lists.map (\ns ->
+                        let elsForNs = Maybes.maybe [] Equality.identity (Maps.lookup ns elementsByNamespace)
+                        in (Maybes.cat (Lists.map toDef elsForNs))) namespaces
+              g = Lexical.buildGraph bins5 Maps.empty (Graph.graphPrimitives adapted)
+          in (Right (Graph.Graph {
+            Graph.graphBoundTerms = (Graph.graphBoundTerms g),
+            Graph.graphBoundTypes = (Graph.graphBoundTypes g),
+            Graph.graphClassConstraints = (Graph.graphClassConstraints g),
+            Graph.graphLambdaVariables = (Graph.graphLambdaVariables g),
+            Graph.graphMetadata = (Graph.graphMetadata g),
+            Graph.graphPrimitives = (Graph.graphPrimitives g),
+            Graph.graphSchemaTypes = (Graph.graphSchemaTypes adapted),
+            Graph.graphTypeVariables = (Graph.graphTypeVariables g)}, defsGrouped))))))))
+
+-- | Check if a literal type is supported by the given language constraints
+literalTypeSupported :: Coders.LanguageConstraints -> Core.LiteralType -> Bool
+literalTypeSupported constraints lt =
+
+      let forType =
+              \lt -> case lt of
+                Core.LiteralTypeFloat v0 -> Sets.member v0 (Coders.languageConstraintsFloatTypes constraints)
+                Core.LiteralTypeInteger v0 -> Sets.member v0 (Coders.languageConstraintsIntegerTypes constraints)
+                _ -> True
+      in (Logic.ifElse (Sets.member (Reflect.literalTypeVariant lt) (Coders.languageConstraintsLiteralVariants constraints)) (forType lt) False)
+
+-- | Prepare a float type, substituting unsupported types
+prepareFloatType :: Core.FloatType -> (Core.FloatType, ((Core.FloatValue -> Core.FloatValue), (S.Set String)))
+prepareFloatType ft =
+    case ft of
+      Core.FloatTypeBigfloat -> (Core.FloatTypeFloat64, ((\v -> case v of
+        Core.FloatValueBigfloat v1 -> Core.FloatValueFloat64 (Literals.bigfloatToFloat64 v1)
+        _ -> v), (Sets.fromList [
+        "replace arbitrary-precision floating-point numbers with 64-bit floating-point numbers (doubles)"])))
+      _ -> prepareSame ft
+
+-- | Prepare an integer type, substituting unsupported types
+prepareIntegerType :: Core.IntegerType -> (Core.IntegerType, ((Core.IntegerValue -> Core.IntegerValue), (S.Set String)))
+prepareIntegerType it =
+    case it of
+      Core.IntegerTypeBigint -> (Core.IntegerTypeInt64, ((\v -> case v of
+        Core.IntegerValueBigint v1 -> Core.IntegerValueInt64 (Literals.bigintToInt64 v1)
+        _ -> v), (Sets.fromList [
+        "replace arbitrary-precision integers with 64-bit integers"])))
+      Core.IntegerTypeUint8 -> (Core.IntegerTypeInt8, ((\v -> case v of
+        Core.IntegerValueUint8 v1 -> Core.IntegerValueInt8 (Literals.bigintToInt8 (Literals.uint8ToBigint v1))
+        _ -> v), (Sets.fromList [
+        "replace unsigned 8-bit integers with signed 8-bit integers"])))
+      Core.IntegerTypeUint32 -> (Core.IntegerTypeInt32, ((\v -> case v of
+        Core.IntegerValueUint32 v1 -> Core.IntegerValueInt32 (Literals.bigintToInt32 (Literals.uint32ToBigint v1))
+        _ -> v), (Sets.fromList [
+        "replace unsigned 32-bit integers with signed 32-bit integers"])))
+      Core.IntegerTypeUint64 -> (Core.IntegerTypeInt64, ((\v -> case v of
+        Core.IntegerValueUint64 v1 -> Core.IntegerValueInt64 (Literals.bigintToInt64 (Literals.uint64ToBigint v1))
+        _ -> v), (Sets.fromList [
+        "replace unsigned 64-bit integers with signed 64-bit integers"])))
+      _ -> prepareSame it
+
+-- | Prepare a literal type, substituting unsupported types
+prepareLiteralType :: Core.LiteralType -> (Core.LiteralType, ((Core.Literal -> Core.Literal), (S.Set String)))
+prepareLiteralType at =
+    case at of
+      Core.LiteralTypeBinary -> (Core.LiteralTypeString, ((\v -> case v of
+        Core.LiteralBinary v1 -> Core.LiteralString (Literals.binaryToString v1)
+        _ -> v), (Sets.fromList [
+        "replace binary strings with character strings"])))
+      Core.LiteralTypeFloat v0 ->
+        let result = prepareFloatType v0
+            rtyp = Pairs.first result
+            rep = Pairs.first (Pairs.second result)
+            msgs = Pairs.second (Pairs.second result)
+        in (Core.LiteralTypeFloat rtyp, ((\v -> case v of
+          Core.LiteralFloat v1 -> Core.LiteralFloat (rep v1)
+          _ -> v), msgs))
+      Core.LiteralTypeInteger v0 ->
+        let result = prepareIntegerType v0
+            rtyp = Pairs.first result
+            rep = Pairs.first (Pairs.second result)
+            msgs = Pairs.second (Pairs.second result)
+        in (Core.LiteralTypeInteger rtyp, ((\v -> case v of
+          Core.LiteralInteger v1 -> Core.LiteralInteger (rep v1)
+          _ -> v), msgs))
+      _ -> prepareSame at
+
+-- | Return a value unchanged with identity transform and no messages
+prepareSame :: Ord t2 => (t0 -> (t0, ((t1 -> t1), (S.Set t2))))
+prepareSame x = (x, ((\y -> y), Sets.empty))
+
+-- | Prepare a type, substituting unsupported literal types
+prepareType :: t0 -> Core.Type -> (Core.Type, ((Core.Term -> Core.Term), (S.Set String)))
+prepareType cx typ =
+    case (Rewriting.deannotateType typ) of
+      Core.TypeLiteral v0 ->
+        let result = prepareLiteralType v0
+            rtyp = Pairs.first result
+            rep = Pairs.first (Pairs.second result)
+            msgs = Pairs.second (Pairs.second result)
+        in (Core.TypeLiteral rtyp, ((\v -> case v of
+          Core.TermLiteral v1 -> Core.TermLiteral (rep v1)
+          _ -> v), msgs))
+      _ -> prepareSame typ
+
+-- | Normalize a term by pushing TermTypeApplication inward past TermApplication and TermFunction (Lambda). This corrects structures produced by poly-let hoisting and eta expansion, where type applications from inference end up wrapping term applications or lambda abstractions instead of being directly on the polymorphic variable.
+pushTypeAppsInward :: Core.Term -> Core.Term
+pushTypeAppsInward term =
+
+      let push =
+              \body -> \typ -> case body of
+                Core.TermApplication v0 -> go (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.applicationFunction v0),
+                    Core.typeApplicationTermType = typ})),
+                  Core.applicationArgument = (Core.applicationArgument v0)}))
+                Core.TermFunction v0 -> case v0 of
+                  Core.FunctionLambda v1 -> go (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.lambdaParameter v1),
+                    Core.lambdaDomain = (Core.lambdaDomain v1),
+                    Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.lambdaBody v1),
+                      Core.typeApplicationTermType = typ}))})))
+                  _ -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction v0),
+                    Core.typeApplicationTermType = typ})
+                Core.TermLet v0 -> go (Core.TermLet (Core.Let {
+                  Core.letBindings = (Core.letBindings v0),
+                  Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.letBody v0),
+                    Core.typeApplicationTermType = typ}))}))
+                _ -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = body,
+                  Core.typeApplicationTermType = typ})
+          go =
+                  \t ->
+                    let forField =
+                            \fld -> Core.Field {
+                              Core.fieldName = (Core.fieldName fld),
+                              Core.fieldTerm = (go (Core.fieldTerm fld))}
+                        forElimination =
+                                \elm -> case elm of
+                                  Core.EliminationRecord v0 -> Core.EliminationRecord v0
+                                  Core.EliminationUnion v0 -> Core.EliminationUnion (Core.CaseStatement {
+                                    Core.caseStatementTypeName = (Core.caseStatementTypeName v0),
+                                    Core.caseStatementDefault = (Maybes.map go (Core.caseStatementDefault v0)),
+                                    Core.caseStatementCases = (Lists.map forField (Core.caseStatementCases v0))})
+                                  Core.EliminationWrap v0 -> Core.EliminationWrap v0
+                        forFunction =
+                                \fun -> case fun of
+                                  Core.FunctionElimination v0 -> Core.FunctionElimination (forElimination v0)
+                                  Core.FunctionLambda v0 -> Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.lambdaParameter v0),
+                                    Core.lambdaDomain = (Core.lambdaDomain v0),
+                                    Core.lambdaBody = (go (Core.lambdaBody v0))})
+                                  Core.FunctionPrimitive v0 -> Core.FunctionPrimitive v0
+                        forLet =
+                                \lt ->
+                                  let mapBinding =
+                                          \b -> Core.Binding {
+                                            Core.bindingName = (Core.bindingName b),
+                                            Core.bindingTerm = (go (Core.bindingTerm b)),
+                                            Core.bindingType = (Core.bindingType b)}
+                                  in Core.Let {
+                                    Core.letBindings = (Lists.map mapBinding (Core.letBindings lt)),
+                                    Core.letBody = (go (Core.letBody lt))}
+                        forMap =
+                                \m ->
+                                  let forPair = \p -> (go (Pairs.first p), (go (Pairs.second p)))
+                                  in (Maps.fromList (Lists.map forPair (Maps.toList m)))
+                    in case t of
+                      Core.TermAnnotated v0 -> Core.TermAnnotated (Core.AnnotatedTerm {
+                        Core.annotatedTermBody = (go (Core.annotatedTermBody v0)),
+                        Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})
+                      Core.TermApplication v0 -> Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (go (Core.applicationFunction v0)),
+                        Core.applicationArgument = (go (Core.applicationArgument v0))})
+                      Core.TermEither v0 -> Core.TermEither (Eithers.either (\l -> Left (go l)) (\r -> Right (go r)) v0)
+                      Core.TermFunction v0 -> Core.TermFunction (forFunction v0)
+                      Core.TermLet v0 -> Core.TermLet (forLet v0)
+                      Core.TermList v0 -> Core.TermList (Lists.map go v0)
+                      Core.TermLiteral v0 -> Core.TermLiteral v0
+                      Core.TermMap v0 -> Core.TermMap (forMap v0)
+                      Core.TermMaybe v0 -> Core.TermMaybe (Maybes.map go v0)
+                      Core.TermPair v0 -> Core.TermPair (go (Pairs.first v0), (go (Pairs.second v0)))
+                      Core.TermRecord v0 -> Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.recordTypeName v0),
+                        Core.recordFields = (Lists.map forField (Core.recordFields v0))})
+                      Core.TermSet v0 -> Core.TermSet (Sets.fromList (Lists.map go (Sets.toList v0)))
+                      Core.TermTypeApplication v0 ->
+                        let body1 = go (Core.typeApplicationTermBody v0)
+                        in (push body1 (Core.typeApplicationTermType v0))
+                      Core.TermTypeLambda v0 -> Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.typeLambdaParameter v0),
+                        Core.typeLambdaBody = (go (Core.typeLambdaBody v0))})
+                      Core.TermUnion v0 -> Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.injectionTypeName v0),
+                        Core.injectionField = (forField (Core.injectionField v0))})
+                      Core.TermUnit -> Core.TermUnit
+                      Core.TermVariable v0 -> Core.TermVariable v0
+                      Core.TermWrap v0 -> Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.wrappedTermTypeName v0),
+                        Core.wrappedTermBody = (go (Core.wrappedTermBody v0))})
+      in (go term)
+
+-- | Given a schema graph along with language constraints and a designated list of element names, adapt the graph to the language constraints, then return a corresponding type definition for each element name.
+schemaGraphToDefinitions :: Coders.LanguageConstraints -> Graph.Graph -> [[Core.Name]] -> Context.Context -> Either String (M.Map Core.Name Core.Type, [[Module.TypeDefinition]])
+schemaGraphToDefinitions constraints graph nameLists cx =
+
+      let litmap = adaptLiteralTypesMap constraints
+      in (Eithers.bind (Eithers.bimap (\ic -> Errors.unDecodingError (Context.inContextObject ic)) (\x -> x) (Schemas.graphAsTypes cx graph (Lexical.graphToBindings graph))) (\tmap0 -> Eithers.bind (adaptGraphSchema constraints litmap tmap0) (\tmap1 ->
+        let toDef =
+                \pair -> Module.TypeDefinition {
+                  Module.typeDefinitionName = (Pairs.first pair),
+                  Module.typeDefinitionType = (Pairs.second pair)}
+        in (Right (tmap1, (Lists.map (\names -> Lists.map toDef (Lists.map (\n -> (n, (Maybes.fromJust (Maps.lookup n tmap1)))) names)) nameLists))))))
+
+-- | Given a target language and a source type, produce an adapter which rewrites the type and its terms according to the language's constraints. The encode direction adapts terms; the decode direction is identity.
+simpleLanguageAdapter :: Coders.Language -> t0 -> Graph.Graph -> Core.Type -> Either String (Util.Adapter Core.Type Core.Type Core.Term Core.Term)
+simpleLanguageAdapter lang cx g typ =
+
+      let constraints = Coders.languageConstraints lang
+          litmap = adaptLiteralTypesMap constraints
+      in (Eithers.bind (adaptType constraints litmap typ) (\adaptedType -> Right (Util.Adapter {
+        Util.adapterIsLossy = False,
+        Util.adapterSource = typ,
+        Util.adapterTarget = adaptedType,
+        Util.adapterCoder = Util.Coder {
+          Util.coderEncode = (\cx -> \term -> Eithers.bimap (\_s -> Context.InContext {
+            Context.inContextObject = (Errors.ErrorOther (Errors.OtherError _s)),
+            Context.inContextContext = cx}) (\_x -> _x) (adaptTerm constraints litmap cx g term)),
+          Util.coderDecode = (\cx -> \term -> Right term)}})))
+
+-- | Find a list of alternatives for a given term, if any
+termAlternatives :: Context.Context -> Graph.Graph -> Core.Term -> Either String [Core.Term]
+termAlternatives cx graph term =
+    case term of
+      Core.TermAnnotated v0 ->
+        let term2 = Core.annotatedTermBody v0
+        in (Right [
+          term2])
+      Core.TermMaybe v0 -> Right [
+        Core.TermList (Maybes.maybe [] (\term2 -> [
+          term2]) v0)]
+      Core.TermTypeLambda v0 ->
+        let term2 = Core.typeLambdaBody v0
+        in (Right [
+          term2])
+      Core.TermTypeApplication v0 ->
+        let term2 = Core.typeApplicationTermBody v0
+        in (Right [
+          term2])
+      Core.TermUnion v0 ->
+        let tname = Core.injectionTypeName v0
+            field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            forFieldType =
+                    \ft ->
+                      let ftname = Core.fieldTypeName ft
+                      in Core.Field {
+                        Core.fieldName = fname,
+                        Core.fieldTerm = (Core.TermMaybe (Logic.ifElse (Equality.equal ftname fname) (Just fterm) Nothing))}
+        in (Eithers.bind (Eithers.bimap (\ic -> Errors_.error (Context.inContextObject ic)) (\x -> x) (Schemas.requireUnionType cx graph tname)) (\rt -> Right [
+          Core.TermRecord (Core.Record {
+            Core.recordTypeName = tname,
+            Core.recordFields = (Lists.map forFieldType rt)})]))
+      Core.TermUnit -> Right [
+        Core.TermLiteral (Core.LiteralBoolean True)]
+      Core.TermWrap v0 ->
+        let term2 = Core.wrappedTermBody v0
+        in (Right [
+          term2])
+      _ -> Right []
+
+-- | Find a list of alternatives for a given type, if any
+typeAlternatives :: Core.Type -> [Core.Type]
+typeAlternatives type_ =
+    case type_ of
+      Core.TypeAnnotated v0 ->
+        let type2 = Core.annotatedTypeBody v0
+        in [
+          type2]
+      Core.TypeMaybe v0 -> [
+        Core.TypeList v0]
+      Core.TypeUnion v0 ->
+        let toOptField =
+                \f -> Core.FieldType {
+                  Core.fieldTypeName = (Core.fieldTypeName f),
+                  Core.fieldTypeType = (Core.TypeMaybe (Core.fieldTypeType f))}
+            optFields = Lists.map toOptField v0
+        in [
+          Core.TypeRecord optFields]
+      Core.TypeUnit -> [
+        Core.TypeLiteral Core.LiteralTypeBoolean]
+      Core.TypeVoid -> [
+        Core.TypeUnit]
+      _ -> []
diff --git a/src/gen-main/haskell/Hydra/Adapt/Literals.hs b/src/gen-main/haskell/Hydra/Adapt/Literals.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Adapt/Literals.hs
+++ /dev/null
@@ -1,296 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Adapter framework for literal types and terms
-
-module Hydra.Adapt.Literals where
-
-import qualified Hydra.Adapt.Utils as Utils
-import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Extract.Core as Core_
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Math as Math
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Reflect as Reflect
-import qualified Hydra.Show.Core as Core__
-import qualified Hydra.Util as Util
-import qualified Hydra.Variants as Variants
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Compare two precision values
-comparePrecision :: (Util.Precision -> Util.Precision -> Util.Comparison)
-comparePrecision p1 p2 = ((\x -> case x of
-  Util.PrecisionArbitrary -> ((\x -> case x of
-    Util.PrecisionArbitrary -> Util.ComparisonEqualTo
-    Util.PrecisionBits _ -> Util.ComparisonGreaterThan) p2)
-  Util.PrecisionBits v1 -> ((\x -> case x of
-    Util.PrecisionArbitrary -> Util.ComparisonLessThan
-    Util.PrecisionBits v2 -> (Logic.ifElse (Equality.lt v1 v2) Util.ComparisonLessThan Util.ComparisonGreaterThan)) p2)) p1)
-
--- | Convert a float value to a different float type
-convertFloatValue :: (Core.FloatType -> Core.FloatValue -> Core.FloatValue)
-convertFloatValue target fv =  
-  let decoder = (\fv -> (\x -> case x of
-          Core.FloatValueBigfloat v1 -> v1
-          Core.FloatValueFloat32 v1 -> (Literals.float32ToBigfloat v1)
-          Core.FloatValueFloat64 v1 -> (Literals.float64ToBigfloat v1)) fv)
-  in  
-    let encoder = (\d -> (\x -> case x of
-            Core.FloatTypeBigfloat -> (Core.FloatValueBigfloat d)
-            Core.FloatTypeFloat32 -> (Core.FloatValueFloat32 (Literals.bigfloatToFloat32 d))
-            Core.FloatTypeFloat64 -> (Core.FloatValueFloat64 (Literals.bigfloatToFloat64 d))) target)
-    in (encoder (decoder fv))
-
--- | Convert an integer value to a different integer type
-convertIntegerValue :: (Core.IntegerType -> Core.IntegerValue -> Core.IntegerValue)
-convertIntegerValue target iv =  
-  let decoder = (\iv -> (\x -> case x of
-          Core.IntegerValueBigint v1 -> v1
-          Core.IntegerValueInt8 v1 -> (Literals.int8ToBigint v1)
-          Core.IntegerValueInt16 v1 -> (Literals.int16ToBigint v1)
-          Core.IntegerValueInt32 v1 -> (Literals.int32ToBigint v1)
-          Core.IntegerValueInt64 v1 -> (Literals.int64ToBigint v1)
-          Core.IntegerValueUint8 v1 -> (Literals.uint8ToBigint v1)
-          Core.IntegerValueUint16 v1 -> (Literals.uint16ToBigint v1)
-          Core.IntegerValueUint32 v1 -> (Literals.uint32ToBigint v1)
-          Core.IntegerValueUint64 v1 -> (Literals.uint64ToBigint v1)) iv)
-  in  
-    let encoder = (\d -> (\x -> case x of
-            Core.IntegerTypeBigint -> (Core.IntegerValueBigint d)
-            Core.IntegerTypeInt8 -> (Core.IntegerValueInt8 (Literals.bigintToInt8 d))
-            Core.IntegerTypeInt16 -> (Core.IntegerValueInt16 (Literals.bigintToInt16 d))
-            Core.IntegerTypeInt32 -> (Core.IntegerValueInt32 (Literals.bigintToInt32 d))
-            Core.IntegerTypeInt64 -> (Core.IntegerValueInt64 (Literals.bigintToInt64 d))
-            Core.IntegerTypeUint8 -> (Core.IntegerValueUint8 (Literals.bigintToUint8 d))
-            Core.IntegerTypeUint16 -> (Core.IntegerValueUint16 (Literals.bigintToUint16 d))
-            Core.IntegerTypeUint32 -> (Core.IntegerValueUint32 (Literals.bigintToUint32 d))
-            Core.IntegerTypeUint64 -> (Core.IntegerValueUint64 (Literals.bigintToUint64 d))) target)
-    in (encoder (decoder iv))
-
--- | Generate a disclaimer message for type conversions
-disclaimer :: (Bool -> String -> String -> String)
-disclaimer lossy source target = (Strings.cat [
-  "replace ",
-  source,
-  " with ",
-  target,
-  (Logic.ifElse lossy " (lossy)" "")])
-
--- | Create an adapter for literal types
-literalAdapter :: (Core.LiteralType -> Compute.Flow Coders.AdapterContext (Compute.Adapter t0 t0 Core.LiteralType Core.LiteralType Core.Literal Core.Literal))
-literalAdapter lt =  
-  let forBinary = (\t ->  
-          let matchBinary = (\lit -> (\x -> case x of
-                  Core.LiteralBinary v1 -> (Flows.pure (Core.LiteralString (Literals.binaryToString v1)))) lit)
-          in  
-            let matchString = (\lit -> (\x -> case x of
-                    Core.LiteralString v1 -> (Flows.pure (Core.LiteralBinary (Literals.stringToBinary v1)))) lit)
-            in  
-              let step = Compute.Coder {
-                      Compute.coderEncode = matchBinary,
-                      Compute.coderDecode = matchString}
-              in (Flows.pure [
-                Compute.Adapter {
-                  Compute.adapterIsLossy = False,
-                  Compute.adapterSource = t,
-                  Compute.adapterTarget = Core.LiteralTypeString,
-                  Compute.adapterCoder = step}]))
-  in  
-    let forBoolean = (\t ->  
-            let matchBoolean = (\step_ -> \lit -> (\x -> case x of
-                    Core.LiteralBoolean v1 -> (Flows.bind (Compute.coderEncode step_ (Core.IntegerValueUint8 (Logic.ifElse v1 1 0))) (\iv -> Flows.pure (Core.LiteralInteger iv)))) lit)
-            in  
-              let matchInteger = (\step_ -> \lit ->  
-                      let forValue = (\val -> (\x -> case x of
-                              Core.IntegerValueUint8 v1 -> (Core.LiteralBoolean (Equality.equal v1 1))) val)
-                      in ((\x -> case x of
-                        Core.LiteralInteger v1 -> (Flows.bind (Compute.coderDecode step_ v1) (\val -> Flows.pure (forValue val)))) lit))
-              in (Flows.bind Monads.getState (\cx ->  
-                let constraints = (Coders.languageConstraints (Coders.adapterContextLanguage cx))
-                in  
-                  let hasIntegers = (Logic.not (Sets.null (Coders.languageConstraintsIntegerTypes constraints)))
-                  in  
-                    let hasStrings = (Sets.member Variants.LiteralVariantString (Coders.languageConstraintsLiteralVariants constraints))
-                    in  
-                      let withIntegers =  
-                              let withAdapter = (\adapter ->  
-                                      let step_ = (Compute.adapterCoder adapter)
-                                      in  
-                                        let step = Compute.Coder {
-                                                Compute.coderEncode = (matchBoolean step_),
-                                                Compute.coderDecode = (matchInteger step_)}
-                                        in (Flows.pure [
-                                          Compute.Adapter {
-                                            Compute.adapterIsLossy = False,
-                                            Compute.adapterSource = t,
-                                            Compute.adapterTarget = (Core.LiteralTypeInteger (Compute.adapterTarget adapter)),
-                                            Compute.adapterCoder = step}]))
-                              in (Flows.bind (integerAdapter Core.IntegerTypeUint8) (\adapter -> withAdapter adapter))
-                      in  
-                        let withStrings =  
-                                let encode = (\lit -> Flows.bind (Core_.booleanLiteral lit) (\b -> Flows.pure (Core.LiteralString (Logic.ifElse b "true" "false"))))
-                                in  
-                                  let decode = (\lit -> Flows.bind (Core_.stringLiteral lit) (\s -> Logic.ifElse (Equality.equal s "true") (Flows.pure (Core.LiteralBoolean True)) (Logic.ifElse (Equality.equal s "false") (Flows.pure (Core.LiteralBoolean False)) (Monads.unexpected "boolean literal" s))))
-                                  in [
-                                    Compute.Adapter {
-                                      Compute.adapterIsLossy = False,
-                                      Compute.adapterSource = t,
-                                      Compute.adapterTarget = Core.LiteralTypeString,
-                                      Compute.adapterCoder = Compute.Coder {
-                                        Compute.coderEncode = encode,
-                                        Compute.coderDecode = decode}}]
-                        in (Logic.ifElse hasIntegers withIntegers (Logic.ifElse hasStrings (Flows.pure withStrings) (Flows.fail "no alternatives available for boolean encoding"))))))
-    in  
-      let forFloat = (\t -> \ft ->  
-              let withFloats =  
-                      let adapt = (\adapter -> \dir -> \l -> (\x -> case x of
-                              Core.LiteralFloat v1 -> (Flows.map (\x -> Core.LiteralFloat x) (Utils.encodeDecode dir (Compute.adapterCoder adapter) v1))
-                              _ -> (Monads.unexpected "floating-point literal" (Core__.literal l))) l)
-                      in (Flows.bind (floatAdapter ft) (\adapter ->  
-                        let step = (Utils.bidirectional (adapt adapter))
-                        in (Flows.pure [
-                          Compute.Adapter {
-                            Compute.adapterIsLossy = (Compute.adapterIsLossy adapter),
-                            Compute.adapterSource = t,
-                            Compute.adapterTarget = (Core.LiteralTypeFloat (Compute.adapterTarget adapter)),
-                            Compute.adapterCoder = step}])))
-              in (Flows.bind Monads.getState (\cx ->  
-                let constraints = (Coders.languageConstraints (Coders.adapterContextLanguage cx))
-                in  
-                  let hasFloats = (Logic.not (Sets.null (Coders.languageConstraintsFloatTypes constraints)))
-                  in (Logic.ifElse hasFloats withFloats (Flows.fail "no float types available")))))
-      in  
-        let forInteger = (\t -> \it ->  
-                let withIntegers =  
-                        let adapt = (\adapter -> \dir -> \lit -> (\x -> case x of
-                                Core.LiteralInteger v1 -> (Flows.map (\x -> Core.LiteralInteger x) (Utils.encodeDecode dir (Compute.adapterCoder adapter) v1))
-                                _ -> (Monads.unexpected "integer literal" (Core__.literal lit))) lit)
-                        in (Flows.bind (integerAdapter it) (\adapter ->  
-                          let step = (Utils.bidirectional (adapt adapter))
-                          in (Flows.pure [
-                            Compute.Adapter {
-                              Compute.adapterIsLossy = (Compute.adapterIsLossy adapter),
-                              Compute.adapterSource = t,
-                              Compute.adapterTarget = (Core.LiteralTypeInteger (Compute.adapterTarget adapter)),
-                              Compute.adapterCoder = step}])))
-                in (Flows.bind Monads.getState (\cx ->  
-                  let constraints = (Coders.languageConstraints (Coders.adapterContextLanguage cx))
-                  in  
-                    let hasIntegers = (Logic.not (Sets.null (Coders.languageConstraintsIntegerTypes constraints)))
-                    in (Logic.ifElse hasIntegers withIntegers (Flows.fail "no integer types available")))))
-        in  
-          let alts = (\t -> (\x -> case x of
-                  Core.LiteralTypeBinary -> (forBinary t)
-                  Core.LiteralTypeBoolean -> (forBoolean t)
-                  Core.LiteralTypeFloat v1 -> (forFloat t v1)
-                  Core.LiteralTypeInteger v1 -> (forInteger t v1)
-                  Core.LiteralTypeString -> (Flows.fail "no substitute for the literal string type")) t)
-          in (Flows.bind Monads.getState (\cx ->  
-            let supported = (Utils.literalTypeIsSupported (Coders.languageConstraints (Coders.adapterContextLanguage cx)))
-            in (Utils.chooseAdapter alts supported Core__.literalType Core__.literalType lt)))
-
--- | Create an adapter for float types
-floatAdapter :: (Core.FloatType -> Compute.Flow Coders.AdapterContext (Compute.Adapter t0 t1 Core.FloatType Core.FloatType Core.FloatValue Core.FloatValue))
-floatAdapter ft =  
-  let makeAdapter = (\source -> \target ->  
-          let lossy = (Equality.equal (comparePrecision (Reflect.floatTypePrecision source) (Reflect.floatTypePrecision target)) Util.ComparisonGreaterThan)
-          in  
-            let step = Compute.Coder {
-                    Compute.coderEncode = (\fv -> Flows.pure (convertFloatValue target fv)),
-                    Compute.coderDecode = (\fv -> Flows.pure (convertFloatValue source fv))}
-            in  
-              let msg = (disclaimer lossy (Core__.floatType source) (Core__.floatType target))
-              in (Monads.warn msg (Flows.pure (Compute.Adapter {
-                Compute.adapterIsLossy = lossy,
-                Compute.adapterSource = source,
-                Compute.adapterTarget = target,
-                Compute.adapterCoder = step}))))
-  in  
-    let altTypes = (\t -> (\x -> case x of
-            Core.FloatTypeBigfloat -> [
-              Core.FloatTypeFloat64,
-              Core.FloatTypeFloat32]
-            Core.FloatTypeFloat32 -> [
-              Core.FloatTypeFloat64,
-              Core.FloatTypeBigfloat]
-            Core.FloatTypeFloat64 -> [
-              Core.FloatTypeBigfloat,
-              Core.FloatTypeFloat32]) t)
-    in  
-      let alts = (\t -> Flows.mapList (makeAdapter t) (altTypes t))
-      in (Flows.bind Monads.getState (\cx ->  
-        let supported = (Utils.floatTypeIsSupported (Coders.languageConstraints (Coders.adapterContextLanguage cx)))
-        in (Utils.chooseAdapter alts supported Core__.floatType Core__.floatType ft)))
-
--- | Create an adapter for integer types
-integerAdapter :: (Core.IntegerType -> Compute.Flow Coders.AdapterContext (Compute.Adapter t0 t1 Core.IntegerType Core.IntegerType Core.IntegerValue Core.IntegerValue))
-integerAdapter it =  
-  let interleave = (\xs -> \ys -> Lists.concat (Lists.transpose [
-          xs,
-          ys]))
-  in  
-    let signedOrdered = (Lists.filter (\v -> Logic.and (Reflect.integerTypeIsSigned v) (Logic.not (Equality.equal (Reflect.integerTypePrecision v) Util.PrecisionArbitrary))) Reflect.integerTypes)
-    in  
-      let unsignedOrdered = (Lists.filter (\v -> Logic.and (Logic.not (Reflect.integerTypeIsSigned v)) (Logic.not (Equality.equal (Reflect.integerTypePrecision v) Util.PrecisionArbitrary))) Reflect.integerTypes)
-      in  
-        let signedPref = (interleave signedOrdered unsignedOrdered)
-        in  
-          let unsignedPref = (interleave unsignedOrdered signedOrdered)
-          in  
-            let signedNonPref = (Lists.reverse unsignedPref)
-            in  
-              let unsignedNonPref = (Lists.reverse signedPref)
-              in  
-                let signed = (\i -> Lists.concat [
-                        Lists.drop (Math.mul i 2) signedPref,
-                        [
-                          Core.IntegerTypeBigint],
-                        (Lists.drop (Math.add (Math.sub 8 (Math.mul i 2)) 1) signedNonPref)])
-                in  
-                  let unsigned = (\i -> Lists.concat [
-                          Lists.drop (Math.mul i 2) unsignedPref,
-                          [
-                            Core.IntegerTypeBigint],
-                          (Lists.drop (Math.add (Math.sub 8 (Math.mul i 2)) 1) unsignedNonPref)])
-                  in  
-                    let makeAdapter = (\source -> \target ->  
-                            let lossy = (Logic.not (Equality.equal (comparePrecision (Reflect.integerTypePrecision source) (Reflect.integerTypePrecision target)) Util.ComparisonLessThan))
-                            in  
-                              let step = Compute.Coder {
-                                      Compute.coderEncode = (\iv -> Flows.pure (convertIntegerValue target iv)),
-                                      Compute.coderDecode = (\iv -> Flows.pure (convertIntegerValue source iv))}
-                              in  
-                                let msg = (disclaimer lossy (Core__.integerType source) (Core__.integerType target))
-                                in (Monads.warn msg (Flows.pure (Compute.Adapter {
-                                  Compute.adapterIsLossy = lossy,
-                                  Compute.adapterSource = source,
-                                  Compute.adapterTarget = target,
-                                  Compute.adapterCoder = step}))))
-                    in  
-                      let altTypes = (\t -> (\x -> case x of
-                              Core.IntegerTypeBigint -> (Lists.reverse unsignedPref)
-                              Core.IntegerTypeInt8 -> (signed 1)
-                              Core.IntegerTypeInt16 -> (signed 2)
-                              Core.IntegerTypeInt32 -> (signed 3)
-                              Core.IntegerTypeInt64 -> (signed 4)
-                              Core.IntegerTypeUint8 -> (unsigned 1)
-                              Core.IntegerTypeUint16 -> (unsigned 2)
-                              Core.IntegerTypeUint32 -> (unsigned 3)
-                              Core.IntegerTypeUint64 -> (unsigned 4)) t)
-                      in  
-                        let alts = (\t -> Flows.mapList (makeAdapter t) (altTypes t))
-                        in (Flows.bind Monads.getState (\cx ->  
-                          let supported = (Utils.integerTypeIsSupported (Coders.languageConstraints (Coders.adapterContextLanguage cx)))
-                          in (Utils.chooseAdapter alts supported Core__.integerType Core__.integerType it)))
diff --git a/src/gen-main/haskell/Hydra/Adapt/Modules.hs b/src/gen-main/haskell/Hydra/Adapt/Modules.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Adapt/Modules.hs
+++ /dev/null
@@ -1,115 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Entry point for Hydra's adapter (type/term rewriting) framework
-
-module Hydra.Adapt.Modules where
-
-import qualified Hydra.Adapt.Terms as Terms
-import qualified Hydra.Adapt.Utils as Utils
-import qualified Hydra.Annotations as Annotations
-import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Decode.Core as Core_
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Module as Module
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Show.Core as Core__
-import qualified Hydra.Util as Util
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Given a target language, an encoding function, and a type, adapt and encode the type
-adaptTypeToLanguageAndEncode :: (Coders.Language -> (Core.Type -> Compute.Flow Graph.Graph t0) -> Core.Type -> Compute.Flow Graph.Graph t0)
-adaptTypeToLanguageAndEncode lang enc typ =  
-  let dflt = (Flows.bind (adaptTypeToLanguage lang typ) (\adaptedType -> enc adaptedType))
-  in ((\x -> case x of
-    Core.TypeVariable _ -> (enc typ)
-    _ -> dflt) (Rewriting.deannotateType typ))
-
--- | Given a target language and a source type, find the target type to which the latter will be adapted
-adaptTypeToLanguage :: (Coders.Language -> Core.Type -> Compute.Flow Graph.Graph Core.Type)
-adaptTypeToLanguage lang typ = (Flows.bind (languageAdapter lang typ) (\adapter -> Flows.pure (Compute.adapterTarget adapter)))
-
--- | Map a Hydra module to a list of type and/or term definitions which have been adapted to the target language
-adaptedModuleDefinitions :: (Coders.Language -> Module.Module -> Compute.Flow Graph.Graph [Module.Definition])
-adaptedModuleDefinitions lang mod = (Flows.bind Monads.getState (\cx ->  
-  let els = (Module.moduleElements mod)
-  in  
-    let adaptersFor = (\types -> Flows.bind (Flows.mapList (languageAdapter lang) types) (\adapters -> Flows.pure (Maps.fromList (Lists.zip types adapters))))
-    in  
-      let classify = (\adapters -> \pair ->  
-              let el = (Pairs.first pair)
-              in  
-                let tt = (Pairs.second pair)
-                in  
-                  let term = (Core.typeApplicationTermBody tt)
-                  in  
-                    let typ = (Core.typeApplicationTermType tt)
-                    in  
-                      let name = (Core.bindingName el)
-                      in (Logic.ifElse (Annotations.isNativeType el) (Flows.bind (Flows.bind (Monads.withTrace "adapt module definitions" (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx term))) (\coreTyp -> adaptTypeToLanguage lang coreTyp)) (\adaptedTyp -> Flows.pure (Module.DefinitionType (Module.TypeDefinition {
-                        Module.typeDefinitionName = name,
-                        Module.typeDefinitionType = adaptedTyp})))) (Maybes.maybe (Flows.fail (Strings.cat2 "no adapter for element " (Core.unName name))) (\adapter -> Flows.bind (Compute.coderEncode (Compute.adapterCoder adapter) term) (\adapted -> Flows.pure (Module.DefinitionTerm (Module.TermDefinition {
-                        Module.termDefinitionName = name,
-                        Module.termDefinitionTerm = adapted,
-                        Module.termDefinitionType = (Schemas.typeToTypeScheme (Compute.adapterTarget adapter))})))) (Maps.lookup typ adapters))))
-      in (Flows.bind (Lexical.withSchemaContext (Flows.mapList Schemas.elementAsTypeApplicationTerm els)) (\tterms ->  
-        let types = (Sets.toList (Sets.fromList (Lists.map (\arg_ -> Rewriting.deannotateType (Core.typeApplicationTermType arg_)) tterms)))
-        in (Flows.bind (adaptersFor types) (\adapters -> Flows.mapList (classify adapters) (Lists.zip els tterms)))))))
-
--- | Given a target language, a unidirectional last-mile encoding, and a source type, construct a unidirectional adapting coder for terms of that type
-constructCoder :: (Coders.Language -> (Core.Term -> Compute.Flow t0 t1) -> Core.Type -> Compute.Flow Graph.Graph (Compute.Coder t0 t2 Core.Term t1))
-constructCoder lang encodeTerm typ = (Monads.withTrace (Strings.cat2 "coder for " (Core__.type_ typ)) (Flows.bind (languageAdapter lang typ) (\adapter -> Flows.pure (Utils.composeCoders (Compute.adapterCoder adapter) (Utils.unidirectionalCoder encodeTerm)))))
-
--- | Given a target language and a source type, produce an adapter, which rewrites the type and its terms according to the language's constraints
-languageAdapter :: (Coders.Language -> Core.Type -> Compute.Flow Graph.Graph (Compute.Adapter t0 t1 Core.Type Core.Type Core.Term Core.Term))
-languageAdapter lang typ =  
-  let getPair = (\typ -> Flows.bind (Terms.termAdapter typ) (\ad -> Flows.bind Monads.getState (\cx -> Flows.pure (ad, cx))))
-  in (Flows.bind Monads.getState (\g ->  
-    let cx0 = Coders.AdapterContext {
-            Coders.adapterContextGraph = g,
-            Coders.adapterContextLanguage = lang,
-            Coders.adapterContextAdapters = Maps.empty}
-    in (Flows.bind (Monads.withState cx0 (getPair typ)) (\result ->  
-      let adapter = (Pairs.first result)
-      in  
-        let cx = (Pairs.second result)
-        in  
-          let encode = (\term -> Monads.withState cx (Compute.coderEncode (Compute.adapterCoder adapter) term))
-          in  
-            let decode = (\term -> Monads.withState cx (Compute.coderDecode (Compute.adapterCoder adapter) term))
-            in (Flows.pure (Compute.Adapter {
-              Compute.adapterIsLossy = (Compute.adapterIsLossy adapter),
-              Compute.adapterSource = (Compute.adapterSource adapter),
-              Compute.adapterTarget = (Compute.adapterTarget adapter),
-              Compute.adapterCoder = Compute.Coder {
-                Compute.coderEncode = encode,
-                Compute.coderDecode = decode}}))))))
-
--- | Given a target language, a unidirectional last mile encoding, and an intermediate helper function, transform a given module into a target representation
-transformModule :: (Coders.Language -> (Core.Term -> Compute.Flow t0 t1) -> (Module.Module -> M.Map Core.Type (Compute.Coder t0 t2 Core.Term t1) -> [(Core.Binding, Core.TypeApplicationTerm)] -> Compute.Flow Graph.Graph t3) -> Module.Module -> Compute.Flow Graph.Graph t3)
-transformModule lang encodeTerm createModule mod =  
-  let els = (Module.moduleElements mod)
-  in  
-    let transform = (Flows.bind (Lexical.withSchemaContext (Flows.mapList Schemas.elementAsTypeApplicationTerm els)) (\tterms ->  
-            let types = (Lists.nub (Lists.map Core.typeApplicationTermType tterms))
-            in (Flows.bind (Flows.mapList (constructCoder lang encodeTerm) types) (\cdrs ->  
-              let coders = (Maps.fromList (Lists.zip types cdrs))
-              in (createModule mod coders (Lists.zip els tterms))))))
-    in (Monads.withTrace (Strings.cat2 "transform module " (Module.unNamespace (Module.moduleNamespace mod))) transform)
diff --git a/src/gen-main/haskell/Hydra/Adapt/Simple.hs b/src/gen-main/haskell/Hydra/Adapt/Simple.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Adapt/Simple.hs
+++ /dev/null
@@ -1,524 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Simple, one-way adapters for types and terms
-
-module Hydra.Adapt.Simple where
-
-import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Hoisting as Hoisting
-import qualified Hydra.Inference as Inference
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Literals as Literals_
-import qualified Hydra.Module as Module
-import qualified Hydra.Names as Names
-import qualified Hydra.Reduction as Reduction
-import qualified Hydra.Reflect as Reflect
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Show.Core as Core_
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Attempt to adapt a floating-point type using the given language constraints
-adaptFloatType :: (Coders.LanguageConstraints -> Core.FloatType -> Maybe Core.FloatType)
-adaptFloatType constraints ft =  
-  let supported = (Sets.member ft (Coders.languageConstraintsFloatTypes constraints))
-  in  
-    let alt = (adaptFloatType constraints)
-    in  
-      let forUnsupported = (\ft -> (\x -> case x of
-              Core.FloatTypeBigfloat -> (alt Core.FloatTypeFloat64)
-              Core.FloatTypeFloat32 -> (alt Core.FloatTypeFloat64)
-              Core.FloatTypeFloat64 -> (alt Core.FloatTypeBigfloat)) ft)
-      in (Logic.ifElse supported (Just ft) (forUnsupported ft))
-
--- | Adapt a graph and its schema to the given language constraints. The doExpand flag controls eta expansion of partial applications. Adaptation is type-preserving: binding-level TypeSchemes are adapted (not stripped). Note: case statement hoisting is done separately, prior to adaptation.
-adaptDataGraph :: (Coders.LanguageConstraints -> Bool -> Graph.Graph -> Compute.Flow Graph.Graph Graph.Graph)
-adaptDataGraph constraints doExpand graph0 =  
-  let transform = (\graph -> \gterm -> Flows.bind (Schemas.graphToTypeContext graph) (\tx ->  
-          let gterm1 = (Rewriting.unshadowVariables (pushTypeAppsInward gterm))
-          in  
-            let gterm2 = (Rewriting.unshadowVariables (Logic.ifElse doExpand (pushTypeAppsInward (Reduction.etaExpandTermNew tx gterm1)) gterm1))
-            in (Flows.pure (Rewriting.liftLambdaAboveLet gterm2))))
-  in  
-    let litmap = (adaptLiteralTypesMap constraints)
-    in  
-      let els0 = (Graph.graphElements graph0)
-      in  
-        let env0 = (Graph.graphEnvironment graph0)
-        in  
-          let body0 = (Graph.graphBody graph0)
-          in  
-            let prims0 = (Graph.graphPrimitives graph0)
-            in  
-              let schema0 = (Graph.graphSchema graph0)
-              in (Flows.bind (Maybes.maybe (Flows.pure Nothing) (\sg -> Flows.bind (Schemas.graphAsTypes sg) (\tmap0 -> Flows.bind (adaptGraphSchema constraints litmap tmap0) (\tmap1 ->  
-                let emap = (Schemas.typesToElements tmap1)
-                in (Flows.pure (Just (Graph.Graph {
-                  Graph.graphElements = emap,
-                  Graph.graphEnvironment = (Graph.graphEnvironment sg),
-                  Graph.graphTypes = (Graph.graphTypes sg),
-                  Graph.graphBody = (Graph.graphBody sg),
-                  Graph.graphPrimitives = (Graph.graphPrimitives sg),
-                  Graph.graphSchema = (Graph.graphSchema sg)})))))) schema0) (\schema1 ->  
-                let gterm0 = (Schemas.graphAsTerm graph0)
-                in (Flows.bind (Logic.ifElse doExpand (transform graph0 gterm0) (Flows.pure gterm0)) (\gterm1 -> Flows.bind (adaptTerm constraints litmap gterm1) (\gterm2 -> Flows.bind (Rewriting.rewriteTermM (adaptLambdaDomains constraints litmap) gterm2) (\gterm3 ->  
-                  let els1Raw = (Schemas.termAsGraph gterm3)
-                  in  
-                    let processBinding = (\el -> Flows.bind (Rewriting.rewriteTermM (adaptNestedTypes constraints litmap) (Core.bindingTerm el)) (\newTerm -> Flows.bind (Maybes.maybe (Flows.pure Nothing) (\ts -> Flows.bind (adaptTypeScheme constraints litmap ts) (\ts1 -> Flows.pure (Just ts1))) (Core.bindingType el)) (\adaptedType -> Flows.pure (Core.Binding {
-                            Core.bindingName = (Core.bindingName el),
-                            Core.bindingTerm = newTerm,
-                            Core.bindingType = adaptedType}))))
-                    in (Flows.bind (Flows.mapList processBinding els1Raw) (\els1 -> Flows.bind (Flows.mapElems (adaptPrimitive constraints litmap) prims0) (\prims1 -> Flows.pure (Graph.Graph {
-                      Graph.graphElements = els1,
-                      Graph.graphEnvironment = env0,
-                      Graph.graphTypes = Maps.empty,
-                      Graph.graphBody = Core.TermUnit,
-                      Graph.graphPrimitives = prims1,
-                      Graph.graphSchema = schema1}))))))))))
-
--- | Adapt a schema graph to the given language constraints
-adaptGraphSchema :: Ord t0 => (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> M.Map t0 Core.Type -> Compute.Flow t1 (M.Map t0 Core.Type))
-adaptGraphSchema constraints litmap types0 =  
-  let mapPair = (\pair ->  
-          let name = (Pairs.first pair)
-          in  
-            let typ = (Pairs.second pair)
-            in (Flows.bind (adaptType constraints litmap typ) (\typ1 -> Flows.pure (name, typ1))))
-  in (Flows.bind (Flows.mapList mapPair (Maps.toList types0)) (\pairs -> Flows.pure (Maps.fromList pairs)))
-
--- | Attempt to adapt an integer type using the given language constraints
-adaptIntegerType :: (Coders.LanguageConstraints -> Core.IntegerType -> Maybe Core.IntegerType)
-adaptIntegerType constraints it =  
-  let supported = (Sets.member it (Coders.languageConstraintsIntegerTypes constraints))
-  in  
-    let alt = (adaptIntegerType constraints)
-    in  
-      let forUnsupported = (\it -> (\x -> case x of
-              Core.IntegerTypeBigint -> Nothing
-              Core.IntegerTypeInt8 -> (alt Core.IntegerTypeUint16)
-              Core.IntegerTypeInt16 -> (alt Core.IntegerTypeUint32)
-              Core.IntegerTypeInt32 -> (alt Core.IntegerTypeUint64)
-              Core.IntegerTypeInt64 -> (alt Core.IntegerTypeBigint)
-              Core.IntegerTypeUint8 -> (alt Core.IntegerTypeInt16)
-              Core.IntegerTypeUint16 -> (alt Core.IntegerTypeInt32)
-              Core.IntegerTypeUint32 -> (alt Core.IntegerTypeInt64)
-              Core.IntegerTypeUint64 -> (alt Core.IntegerTypeBigint)) it)
-      in (Logic.ifElse supported (Just it) (forUnsupported it))
-
--- | Rewrite callback for adapting lambda domain types in a term
-adaptLambdaDomains :: (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> (t0 -> Compute.Flow t1 Core.Term) -> t0 -> Compute.Flow t1 Core.Term)
-adaptLambdaDomains constraints litmap recurse term = (Flows.bind (recurse term) (\rewritten -> (\x -> case x of
-  Core.TermFunction v1 -> ((\x -> case x of
-    Core.FunctionLambda v2 -> (Flows.bind (Maybes.maybe (Flows.pure Nothing) (\dom -> Flows.bind (adaptType constraints litmap dom) (\dom1 -> Flows.pure (Just dom1))) (Core.lambdaDomain v2)) (\adaptedDomain -> Flows.pure (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.lambdaParameter v2),
-      Core.lambdaDomain = adaptedDomain,
-      Core.lambdaBody = (Core.lambdaBody v2)})))))
-    _ -> (Flows.pure (Core.TermFunction v1))) v1)
-  _ -> (Flows.pure rewritten)) rewritten))
-
--- | Convert a literal to a different type
-adaptLiteral :: (Core.LiteralType -> Core.Literal -> Core.Literal)
-adaptLiteral lt l = ((\x -> case x of
-  Core.LiteralBinary v1 -> ((\x -> case x of
-    Core.LiteralTypeString -> (Core.LiteralString (Literals.binaryToString v1))) lt)
-  Core.LiteralBoolean v1 -> ((\x -> case x of
-    Core.LiteralTypeInteger v2 -> (Core.LiteralInteger (Literals_.bigintToIntegerValue v2 (Logic.ifElse v1 1 0)))) lt)
-  Core.LiteralFloat v1 -> ((\x -> case x of
-    Core.LiteralTypeFloat v2 -> (Core.LiteralFloat (Literals_.bigfloatToFloatValue v2 (Literals_.floatValueToBigfloat v1)))) lt)
-  Core.LiteralInteger v1 -> ((\x -> case x of
-    Core.LiteralTypeInteger v2 -> (Core.LiteralInteger (Literals_.bigintToIntegerValue v2 (Literals_.integerValueToBigint v1)))) lt)) l)
-
--- | Attempt to adapt a literal type using the given language constraints
-adaptLiteralType :: (Coders.LanguageConstraints -> Core.LiteralType -> Maybe Core.LiteralType)
-adaptLiteralType constraints lt =  
-  let forUnsupported = (\lt -> (\x -> case x of
-          Core.LiteralTypeBinary -> (Just Core.LiteralTypeString)
-          Core.LiteralTypeBoolean -> (Maybes.map (\x -> Core.LiteralTypeInteger x) (adaptIntegerType constraints Core.IntegerTypeInt8))
-          Core.LiteralTypeFloat v1 -> (Maybes.map (\x -> Core.LiteralTypeFloat x) (adaptFloatType constraints v1))
-          Core.LiteralTypeInteger v1 -> (Maybes.map (\x -> Core.LiteralTypeInteger x) (adaptIntegerType constraints v1))
-          _ -> Nothing) lt)
-  in (Logic.ifElse (literalTypeSupported constraints lt) Nothing (forUnsupported lt))
-
--- | Derive a map of adapted literal types for the given language constraints
-adaptLiteralTypesMap :: (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType)
-adaptLiteralTypesMap constraints =  
-  let tryType = (\lt -> Maybes.maybe Nothing (\lt2 -> Just (lt, lt2)) (adaptLiteralType constraints lt))
-  in (Maps.fromList (Maybes.cat (Lists.map tryType Reflect.literalTypes)))
-
--- | Adapt a literal value using the given language constraints
-adaptLiteralValue :: Ord t0 => (M.Map t0 Core.LiteralType -> t0 -> Core.Literal -> Core.Literal)
-adaptLiteralValue litmap lt l = (Maybes.maybe (Core.LiteralString (Core_.literal l)) (\lt2 -> adaptLiteral lt2 l) (Maps.lookup lt litmap))
-
--- | Rewrite callback for adapting nested let binding TypeSchemes in a term
-adaptNestedTypes :: (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> (t0 -> Compute.Flow t1 Core.Term) -> t0 -> Compute.Flow t1 Core.Term)
-adaptNestedTypes constraints litmap recurse term = (Flows.bind (recurse term) (\rewritten -> (\x -> case x of
-  Core.TermLet v1 ->  
-    let adaptB = (\b -> Flows.bind (Maybes.maybe (Flows.pure Nothing) (\ts -> Flows.bind (adaptTypeScheme constraints litmap ts) (\ts1 -> Flows.pure (Just ts1))) (Core.bindingType b)) (\adaptedBType -> Flows.pure (Core.Binding {
-            Core.bindingName = (Core.bindingName b),
-            Core.bindingTerm = (Core.bindingTerm b),
-            Core.bindingType = adaptedBType})))
-    in (Flows.bind (Flows.mapList adaptB (Core.letBindings v1)) (\adaptedBindings -> Flows.pure (Core.TermLet (Core.Let {
-      Core.letBindings = adaptedBindings,
-      Core.letBody = (Core.letBody v1)}))))
-  _ -> (Flows.pure rewritten)) rewritten))
-
--- | Adapt a primitive to the given language constraints, prior to inference
-adaptPrimitive :: (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> Graph.Primitive -> Compute.Flow t0 Graph.Primitive)
-adaptPrimitive constraints litmap prim0 =  
-  let ts0 = (Graph.primitiveType prim0)
-  in (Flows.bind (adaptTypeScheme constraints litmap ts0) (\ts1 -> Flows.pure (Graph.Primitive {
-    Graph.primitiveName = (Graph.primitiveName prim0),
-    Graph.primitiveType = ts1,
-    Graph.primitiveImplementation = (Graph.primitiveImplementation prim0)})))
-
--- | Adapt a term using the given language constraints
-adaptTerm :: (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-adaptTerm constraints litmap term0 =  
-  let rewrite = (\recurse -> \term0 ->  
-          let forSupported = (\term -> (\x -> case x of
-                  Core.TermLiteral v1 ->  
-                    let lt = (Reflect.literalType v1)
-                    in (Flows.pure (Just (Logic.ifElse (literalTypeSupported constraints lt) term (Core.TermLiteral (adaptLiteralValue litmap lt v1)))))
-                  _ -> (Flows.pure (Just term))) term) 
-              forUnsupported = (\term ->  
-                      let forNonNull = (\alts -> Flows.bind (tryTerm (Lists.head alts)) (\mterm -> Maybes.maybe (tryAlts (Lists.tail alts)) (\t -> Flows.pure (Just t)) mterm)) 
-                          tryAlts = (\alts -> Logic.ifElse (Lists.null alts) (Flows.pure Nothing) (forNonNull alts))
-                      in (Flows.bind (termAlternatives term) (\alts0 -> tryAlts alts0)))
-              tryTerm = (\term ->  
-                      let supportedVariant = (Sets.member (Reflect.termVariant term) (Coders.languageConstraintsTermVariants constraints))
-                      in (Logic.ifElse supportedVariant (forSupported term) (forUnsupported term)))
-          in (Flows.bind (recurse term0) (\term1 -> (\x -> case x of
-            Core.TermTypeApplication v1 -> (Flows.bind (adaptType constraints litmap (Core.typeApplicationTermType v1)) (\atyp -> Flows.pure (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.typeApplicationTermBody v1),
-              Core.typeApplicationTermType = atyp}))))
-            Core.TermTypeLambda _ -> (Flows.pure term1)
-            _ -> (Flows.bind (tryTerm term1) (\mterm -> Maybes.maybe (Flows.fail (Strings.cat2 "no alternatives for term: " (Core_.term term1))) (\term2 -> Flows.pure term2) mterm))) term1)))
-  in (Rewriting.rewriteTermM rewrite term0)
-
--- | Adapt a type using the given language constraints
-adaptType :: (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> Core.Type -> Compute.Flow t0 Core.Type)
-adaptType constraints litmap type0 =  
-  let forSupported = (\typ -> (\x -> case x of
-          Core.TypeLiteral v1 -> (Logic.ifElse (literalTypeSupported constraints v1) (Just typ) (Maybes.maybe (Just (Core.TypeLiteral Core.LiteralTypeString)) (\lt2 -> Just (Core.TypeLiteral lt2)) (Maps.lookup v1 litmap)))
-          _ -> (Just typ)) typ) 
-      forUnsupported = (\typ ->  
-              let tryAlts = (\alts -> Logic.ifElse (Lists.null alts) Nothing (Maybes.maybe (tryAlts (Lists.tail alts)) (\t -> Just t) (tryType (Lists.head alts))))
-              in  
-                let alts0 = (typeAlternatives typ)
-                in (tryAlts alts0))
-      tryType = (\typ ->  
-              let supportedVariant = (Sets.member (Reflect.typeVariant typ) (Coders.languageConstraintsTypeVariants constraints))
-              in (Logic.ifElse supportedVariant (forSupported typ) (forUnsupported typ)))
-  in  
-    let rewrite = (\recurse -> \typ -> Flows.bind (recurse typ) (\type1 -> Maybes.maybe (Flows.fail (Strings.cat2 "no alternatives for type: " (Core_.type_ typ))) (\type2 -> Flows.pure type2) (tryType type1)))
-    in (Rewriting.rewriteTypeM rewrite type0)
-
--- | Adapt a type scheme to the given language constraints, prior to inference
-adaptTypeScheme :: (Coders.LanguageConstraints -> M.Map Core.LiteralType Core.LiteralType -> Core.TypeScheme -> Compute.Flow t0 Core.TypeScheme)
-adaptTypeScheme constraints litmap ts0 =  
-  let vars0 = (Core.typeSchemeVariables ts0)
-  in  
-    let t0 = (Core.typeSchemeType ts0)
-    in (Flows.bind (adaptType constraints litmap t0) (\t1 -> Flows.pure (Core.TypeScheme {
-      Core.typeSchemeVariables = vars0,
-      Core.typeSchemeType = t1,
-      Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts0)})))
-
--- | Given a data graph along with language constraints and a designated list of namespaces, adapt the graph to the language constraints, then return the processed graph along with term definitions grouped by namespace (in the order of the input namespaces). Inference is performed before adaptation if bindings lack type annotations. Hoisting must preserve type schemes; if any binding loses its type scheme after hoisting, the pipeline fails. Adaptation preserves type application/lambda wrappers and adapts embedded types. Post-adaptation inference is performed to ensure binding TypeSchemes are fully consistent. The doExpand flag controls eta expansion. The doHoistCaseStatements flag controls case statement hoisting (needed for Python). The doHoistPolymorphicLetBindings flag controls polymorphic let binding hoisting (needed for Java).
-dataGraphToDefinitions :: (Coders.LanguageConstraints -> Bool -> Bool -> Bool -> Bool -> Graph.Graph -> [Module.Namespace] -> Compute.Flow Graph.Graph (Graph.Graph, [[Module.TermDefinition]]))
-dataGraphToDefinitions constraints doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings graph0 namespaces =  
-  let namespacesSet = (Sets.fromList namespaces)
-  in  
-    let isParentBinding = (\b -> Maybes.maybe False (\ns -> Sets.member ns namespacesSet) (Names.namespaceOf (Core.bindingName b)))
-    in  
-      let hoistCases = (\g ->  
-              let graphDetyped = Graph.Graph {
-                      Graph.graphElements = (Lists.map (\b -> Core.Binding {
-                        Core.bindingName = (Core.bindingName b),
-                        Core.bindingTerm = (Rewriting.stripTypeLambdas (Core.bindingTerm b)),
-                        Core.bindingType = (Core.bindingType b)}) (Graph.graphElements g)),
-                      Graph.graphEnvironment = (Graph.graphEnvironment g),
-                      Graph.graphTypes = (Graph.graphTypes g),
-                      Graph.graphBody = (Graph.graphBody g),
-                      Graph.graphPrimitives = (Graph.graphPrimitives g),
-                      Graph.graphSchema = (Graph.graphSchema g)}
-              in  
-                let gterm0 = (Schemas.graphAsTerm graphDetyped)
-                in  
-                  let gterm1 = (Rewriting.unshadowVariables gterm0)
-                  in  
-                    let newElements = (Schemas.termAsGraph gterm1)
-                    in  
-                      let graphu0 = Graph.Graph {
-                              Graph.graphElements = newElements,
-                              Graph.graphEnvironment = (Graph.graphEnvironment graphDetyped),
-                              Graph.graphTypes = (Graph.graphTypes graphDetyped),
-                              Graph.graphBody = (Graph.graphBody graphDetyped),
-                              Graph.graphPrimitives = (Graph.graphPrimitives graphDetyped),
-                              Graph.graphSchema = (Graph.graphSchema graphDetyped)}
-                      in (Flows.bind (Hoisting.hoistCaseStatementsInGraph graphu0) (\graphh1 ->  
-                        let gterm2 = (Schemas.graphAsTerm graphh1)
-                        in  
-                          let gterm3 = (Rewriting.unshadowVariables gterm2)
-                          in  
-                            let newElements2 = (Schemas.termAsGraph gterm3)
-                            in (Flows.pure (Graph.Graph {
-                              Graph.graphElements = newElements2,
-                              Graph.graphEnvironment = (Graph.graphEnvironment graphh1),
-                              Graph.graphTypes = (Graph.graphTypes graphh1),
-                              Graph.graphBody = (Graph.graphBody graphh1),
-                              Graph.graphPrimitives = (Graph.graphPrimitives graphh1),
-                              Graph.graphSchema = (Graph.graphSchema graphh1)})))))
-      in  
-        let hoistPoly = (\graphBefore ->  
-                let letBefore = (Schemas.graphAsLet graphBefore)
-                in  
-                  let letAfter = (Hoisting.hoistPolymorphicLetBindings isParentBinding letBefore)
-                  in Graph.Graph {
-                    Graph.graphElements = (Core.letBindings letAfter),
-                    Graph.graphEnvironment = (Graph.graphEnvironment graphBefore),
-                    Graph.graphTypes = (Graph.graphTypes graphBefore),
-                    Graph.graphBody = (Graph.graphBody graphBefore),
-                    Graph.graphPrimitives = (Graph.graphPrimitives graphBefore),
-                    Graph.graphSchema = (Graph.graphSchema graphBefore)})
-        in  
-          let checkTyped = (\debugLabel -> \g ->  
-                  let untypedBindings = (Lists.map (\b -> Core.unName (Core.bindingName b)) (Lists.filter (\b -> Logic.not (Maybes.isJust (Core.bindingType b))) (Graph.graphElements g)))
-                  in (Logic.ifElse (Lists.null untypedBindings) (Flows.pure g) (Flows.fail (Strings.cat [
-                    "Found untyped bindings (",
-                    debugLabel,
-                    "): ",
-                    (Strings.intercalate ", " untypedBindings)]))))
-          in  
-            let normalizeGraph = (\g -> Graph.Graph {
-                    Graph.graphElements = (Lists.map (\b -> Core.Binding {
-                      Core.bindingName = (Core.bindingName b),
-                      Core.bindingTerm = (pushTypeAppsInward (Core.bindingTerm b)),
-                      Core.bindingType = (Core.bindingType b)}) (Graph.graphElements g)),
-                    Graph.graphEnvironment = (Graph.graphEnvironment g),
-                    Graph.graphTypes = (Graph.graphTypes g),
-                    Graph.graphBody = (Graph.graphBody g),
-                    Graph.graphPrimitives = (Graph.graphPrimitives g),
-                    Graph.graphSchema = (Graph.graphSchema g)})
-            in (Flows.bind (Logic.ifElse doHoistCaseStatements (hoistCases graph0) (Flows.pure graph0)) (\graph1 -> Flows.bind (Logic.ifElse doInfer (Inference.inferGraphTypes graph1) (checkTyped "after case hoisting" graph1)) (\graph2 -> Flows.bind (Logic.ifElse doHoistPolymorphicLetBindings (checkTyped "after let hoisting" (hoistPoly graph2)) (Flows.pure graph2)) (\graph3 -> Flows.bind (Flows.bind (adaptDataGraph constraints doExpand graph3) (checkTyped "after adaptation")) (\graph4 ->  
-              let graph5 = (normalizeGraph graph4)
-              in  
-                let toDef = (\el -> Maybes.map (\ts -> Module.TermDefinition {
-                        Module.termDefinitionName = (Core.bindingName el),
-                        Module.termDefinitionTerm = (Core.bindingTerm el),
-                        Module.termDefinitionType = ts}) (Core.bindingType el))
-                in  
-                  let selectedElements = (Lists.filter (\el -> Maybes.maybe False (\ns -> Sets.member ns namespacesSet) (Names.namespaceOf (Core.bindingName el))) (Graph.graphElements graph5))
-                  in  
-                    let elementsByNamespace = (Lists.foldl (\acc -> \el -> Maybes.maybe acc (\ns ->  
-                            let existing = (Maybes.maybe [] Equality.identity (Maps.lookup ns acc))
-                            in (Maps.insert ns (Lists.concat2 existing [
-                              el]) acc)) (Names.namespaceOf (Core.bindingName el))) Maps.empty selectedElements)
-                    in  
-                      let defsGrouped = (Lists.map (\ns ->  
-                              let elsForNs = (Maybes.maybe [] Equality.identity (Maps.lookup ns elementsByNamespace))
-                              in (Maybes.cat (Lists.map toDef elsForNs))) namespaces)
-                      in (Flows.pure (graph5, defsGrouped)))))))
-
--- | Check if a literal type is supported by the given language constraints
-literalTypeSupported :: (Coders.LanguageConstraints -> Core.LiteralType -> Bool)
-literalTypeSupported constraints lt =  
-  let forType = (\lt -> (\x -> case x of
-          Core.LiteralTypeFloat v1 -> (Sets.member v1 (Coders.languageConstraintsFloatTypes constraints))
-          Core.LiteralTypeInteger v1 -> (Sets.member v1 (Coders.languageConstraintsIntegerTypes constraints))
-          _ -> True) lt)
-  in (Logic.ifElse (Sets.member (Reflect.literalTypeVariant lt) (Coders.languageConstraintsLiteralVariants constraints)) (forType lt) False)
-
--- | Normalize a term by pushing TermTypeApplication inward past TermApplication and TermFunction (Lambda). This corrects structures produced by poly-let hoisting and eta expansion, where type applications from inference end up wrapping term applications or lambda abstractions instead of being directly on the polymorphic variable.
-pushTypeAppsInward :: (Core.Term -> Core.Term)
-pushTypeAppsInward term =  
-  let push = (\body -> \typ -> (\x -> case x of
-          Core.TermApplication v1 -> (go (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.applicationFunction v1),
-              Core.typeApplicationTermType = typ})),
-            Core.applicationArgument = (Core.applicationArgument v1)})))
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionLambda v2 -> (go (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.lambdaParameter v2),
-              Core.lambdaDomain = (Core.lambdaDomain v2),
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.lambdaBody v2),
-                Core.typeApplicationTermType = typ}))}))))
-            _ -> (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermFunction v1),
-              Core.typeApplicationTermType = typ}))) v1)
-          Core.TermLet v1 -> (go (Core.TermLet (Core.Let {
-            Core.letBindings = (Core.letBindings v1),
-            Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.letBody v1),
-              Core.typeApplicationTermType = typ}))})))
-          _ -> (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = body,
-            Core.typeApplicationTermType = typ}))) body) 
-      go = (\t ->  
-              let forField = (\fld -> Core.Field {
-                      Core.fieldName = (Core.fieldName fld),
-                      Core.fieldTerm = (go (Core.fieldTerm fld))})
-              in  
-                let forElimination = (\elm -> (\x -> case x of
-                        Core.EliminationRecord v1 -> (Core.EliminationRecord v1)
-                        Core.EliminationUnion v1 -> (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.caseStatementTypeName v1),
-                          Core.caseStatementDefault = (Maybes.map go (Core.caseStatementDefault v1)),
-                          Core.caseStatementCases = (Lists.map forField (Core.caseStatementCases v1))}))
-                        Core.EliminationWrap v1 -> (Core.EliminationWrap v1)) elm)
-                in  
-                  let forFunction = (\fun -> (\x -> case x of
-                          Core.FunctionElimination v1 -> (Core.FunctionElimination (forElimination v1))
-                          Core.FunctionLambda v1 -> (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.lambdaParameter v1),
-                            Core.lambdaDomain = (Core.lambdaDomain v1),
-                            Core.lambdaBody = (go (Core.lambdaBody v1))}))
-                          Core.FunctionPrimitive v1 -> (Core.FunctionPrimitive v1)) fun)
-                  in  
-                    let forLet = (\lt ->  
-                            let mapBinding = (\b -> Core.Binding {
-                                    Core.bindingName = (Core.bindingName b),
-                                    Core.bindingTerm = (go (Core.bindingTerm b)),
-                                    Core.bindingType = (Core.bindingType b)})
-                            in Core.Let {
-                              Core.letBindings = (Lists.map mapBinding (Core.letBindings lt)),
-                              Core.letBody = (go (Core.letBody lt))})
-                    in  
-                      let forMap = (\m ->  
-                              let forPair = (\p -> (go (Pairs.first p), (go (Pairs.second p))))
-                              in (Maps.fromList (Lists.map forPair (Maps.toList m))))
-                      in ((\x -> case x of
-                        Core.TermAnnotated v1 -> (Core.TermAnnotated (Core.AnnotatedTerm {
-                          Core.annotatedTermBody = (go (Core.annotatedTermBody v1)),
-                          Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)}))
-                        Core.TermApplication v1 -> (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (go (Core.applicationFunction v1)),
-                          Core.applicationArgument = (go (Core.applicationArgument v1))}))
-                        Core.TermEither v1 -> (Core.TermEither (Eithers.either (\l -> Left (go l)) (\r -> Right (go r)) v1))
-                        Core.TermFunction v1 -> (Core.TermFunction (forFunction v1))
-                        Core.TermLet v1 -> (Core.TermLet (forLet v1))
-                        Core.TermList v1 -> (Core.TermList (Lists.map go v1))
-                        Core.TermLiteral v1 -> (Core.TermLiteral v1)
-                        Core.TermMap v1 -> (Core.TermMap (forMap v1))
-                        Core.TermMaybe v1 -> (Core.TermMaybe (Maybes.map go v1))
-                        Core.TermPair v1 -> (Core.TermPair (go (Pairs.first v1), (go (Pairs.second v1))))
-                        Core.TermRecord v1 -> (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.recordTypeName v1),
-                          Core.recordFields = (Lists.map forField (Core.recordFields v1))}))
-                        Core.TermSet v1 -> (Core.TermSet (Sets.fromList (Lists.map go (Sets.toList v1))))
-                        Core.TermTypeApplication v1 ->  
-                          let body1 = (go (Core.typeApplicationTermBody v1))
-                          in (push body1 (Core.typeApplicationTermType v1))
-                        Core.TermTypeLambda v1 -> (Core.TermTypeLambda (Core.TypeLambda {
-                          Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-                          Core.typeLambdaBody = (go (Core.typeLambdaBody v1))}))
-                        Core.TermUnion v1 -> (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.injectionTypeName v1),
-                          Core.injectionField = (forField (Core.injectionField v1))}))
-                        Core.TermUnit -> Core.TermUnit
-                        Core.TermVariable v1 -> (Core.TermVariable v1)
-                        Core.TermWrap v1 -> (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.wrappedTermTypeName v1),
-                          Core.wrappedTermBody = (go (Core.wrappedTermBody v1))}))) t))
-  in (go term)
-
--- | Given a schema graph along with language constraints and a designated list of element names, adapt the graph to the language constraints, then return a corresponding type definition for each element name.
-schemaGraphToDefinitions :: (Coders.LanguageConstraints -> Graph.Graph -> [[Core.Name]] -> Compute.Flow Graph.Graph (M.Map Core.Name Core.Type, [[Module.TypeDefinition]]))
-schemaGraphToDefinitions constraints graph nameLists =  
-  let litmap = (adaptLiteralTypesMap constraints)
-  in (Flows.bind (Schemas.graphAsTypes graph) (\tmap0 -> Flows.bind (adaptGraphSchema constraints litmap tmap0) (\tmap1 ->  
-    let toDef = (\pair -> Module.TypeDefinition {
-            Module.typeDefinitionName = (Pairs.first pair),
-            Module.typeDefinitionType = (Pairs.second pair)})
-    in (Flows.pure (tmap1, (Lists.map (\names -> Lists.map toDef (Lists.map (\n -> (n, (Maybes.fromJust (Maps.lookup n tmap1)))) names)) nameLists))))))
-
--- | Find a list of alternatives for a given term, if any
-termAlternatives :: (Core.Term -> Compute.Flow Graph.Graph [Core.Term])
-termAlternatives term = ((\x -> case x of
-  Core.TermAnnotated v1 ->  
-    let term2 = (Core.annotatedTermBody v1)
-    in (Flows.pure [
-      term2])
-  Core.TermMaybe v1 -> (Flows.pure [
-    Core.TermList (Maybes.maybe [] (\term2 -> [
-      term2]) v1)])
-  Core.TermTypeLambda v1 ->  
-    let term2 = (Core.typeLambdaBody v1)
-    in (Flows.pure [
-      term2])
-  Core.TermTypeApplication v1 ->  
-    let term2 = (Core.typeApplicationTermBody v1)
-    in (Flows.pure [
-      term2])
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1)
-    in  
-      let field = (Core.injectionField v1)
-      in  
-        let fname = (Core.fieldName field)
-        in  
-          let fterm = (Core.fieldTerm field)
-          in  
-            let forFieldType = (\ft ->  
-                    let ftname = (Core.fieldTypeName ft)
-                    in Core.Field {
-                      Core.fieldName = fname,
-                      Core.fieldTerm = (Core.TermMaybe (Logic.ifElse (Equality.equal ftname fname) (Just fterm) Nothing))})
-            in (Flows.bind (Schemas.requireUnionType tname) (\rt -> Flows.pure [
-              Core.TermRecord (Core.Record {
-                Core.recordTypeName = tname,
-                Core.recordFields = (Lists.map forFieldType (Core.rowTypeFields rt))})]))
-  Core.TermUnit -> (Flows.pure [
-    Core.TermLiteral (Core.LiteralBoolean True)])
-  Core.TermWrap v1 ->  
-    let term2 = (Core.wrappedTermBody v1)
-    in (Flows.pure [
-      term2])
-  _ -> (Flows.pure [])) term)
-
--- | Find a list of alternatives for a given type, if any
-typeAlternatives :: (Core.Type -> [Core.Type])
-typeAlternatives type_ = ((\x -> case x of
-  Core.TypeAnnotated v1 ->  
-    let type2 = (Core.annotatedTypeBody v1)
-    in [
-      type2]
-  Core.TypeMaybe v1 -> [
-    Core.TypeList v1]
-  Core.TypeUnion v1 ->  
-    let tname = (Core.rowTypeTypeName v1)
-    in  
-      let fields = (Core.rowTypeFields v1)
-      in  
-        let toOptField = (\f -> Core.FieldType {
-                Core.fieldTypeName = (Core.fieldTypeName f),
-                Core.fieldTypeType = (Core.TypeMaybe (Core.fieldTypeType f))})
-        in  
-          let optFields = (Lists.map toOptField fields)
-          in [
-            Core.TypeRecord (Core.RowType {
-              Core.rowTypeTypeName = tname,
-              Core.rowTypeFields = optFields})]
-  Core.TypeUnit -> [
-    Core.TypeLiteral Core.LiteralTypeBoolean]
-  _ -> []) type_)
diff --git a/src/gen-main/haskell/Hydra/Adapt/Terms.hs b/src/gen-main/haskell/Hydra/Adapt/Terms.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Adapt/Terms.hs
+++ /dev/null
@@ -1,753 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Adapter framework for types and terms
-
-module Hydra.Adapt.Terms where
-
-import qualified Hydra.Adapt.Literals as Literals
-import qualified Hydra.Adapt.Utils as Utils
-import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Extract.Core as Core_
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Reflect as Reflect
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Show.Core as Core__
-import qualified Hydra.Variants as Variants
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Create an adapter for field types
-fieldAdapter :: (Core.FieldType -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.FieldType Core.FieldType Core.Field Core.Field))
-fieldAdapter ftyp =  
-  let encdec = (\ad -> \dir -> \field ->  
-          let name = (Core.fieldName field)
-          in  
-            let term = (Core.fieldTerm field)
-            in (Flows.bind (Utils.encodeDecode dir (Compute.adapterCoder ad) term) (\newTerm -> Flows.pure (Core.Field {
-              Core.fieldName = name,
-              Core.fieldTerm = newTerm}))))
-  in (Flows.bind (termAdapter (Core.fieldTypeType ftyp)) (\ad -> Flows.pure (Compute.Adapter {
-    Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-    Compute.adapterSource = ftyp,
-    Compute.adapterTarget = Core.FieldType {
-      Core.fieldTypeName = (Core.fieldTypeName ftyp),
-      Core.fieldTypeType = (Compute.adapterTarget ad)},
-    Compute.adapterCoder = (Utils.bidirectional (encdec ad))})))
-
--- | This function accounts for recursive type definitions
-forTypeReference :: (Core.Name -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-forTypeReference name =  
-  let encdec = (\name -> \dir -> \term -> Flows.bind Monads.getState (\cx ->  
-          let adapters = (Coders.adapterContextAdapters cx)
-          in (Maybes.maybe (Flows.fail (Strings.cat2 "no adapter for reference type " (Core.unName name))) (\ad -> Utils.encodeDecode dir (Compute.adapterCoder ad) term) (Maps.lookup name adapters))))
-  in  
-    let forType = (\cx -> \adapters -> \t -> Flows.bind (termAdapter t) (\actual ->  
-            let finalAdapters = (Maps.insert name actual adapters)
-            in  
-              let finalCx = Coders.AdapterContext {
-                      Coders.adapterContextGraph = (Coders.adapterContextGraph cx),
-                      Coders.adapterContextLanguage = (Coders.adapterContextLanguage cx),
-                      Coders.adapterContextAdapters = finalAdapters}
-              in (Flows.bind (Monads.putState finalCx) (\ignored2 -> Flows.pure actual))))
-    in  
-      let forMissingAdapter = (\cx -> \lossy -> \adapters -> \placeholder ->  
-              let newAdapters = (Maps.insert name placeholder adapters)
-              in  
-                let newCx = Coders.AdapterContext {
-                        Coders.adapterContextGraph = (Coders.adapterContextGraph cx),
-                        Coders.adapterContextLanguage = (Coders.adapterContextLanguage cx),
-                        Coders.adapterContextAdapters = newAdapters}
-                in (Flows.bind (Monads.putState newCx) (\ignored -> Flows.bind (withGraphContext (Schemas.resolveType (Core.TypeVariable name))) (\mt -> Maybes.maybe (Flows.pure (Compute.Adapter {
-                  Compute.adapterIsLossy = lossy,
-                  Compute.adapterSource = (Core.TypeVariable name),
-                  Compute.adapterTarget = (Core.TypeVariable name),
-                  Compute.adapterCoder = (Utils.bidirectional (\dir -> \term -> Flows.pure term))})) (forType cx adapters) mt))))
-      in  
-        let flow =  
-                let lossy = False
-                in  
-                  let placeholder = Compute.Adapter {
-                          Compute.adapterIsLossy = lossy,
-                          Compute.adapterSource = (Core.TypeVariable name),
-                          Compute.adapterTarget = (Core.TypeVariable name),
-                          Compute.adapterCoder = (Utils.bidirectional (encdec name))}
-                  in (Flows.bind Monads.getState (\cx ->  
-                    let adapters = (Coders.adapterContextAdapters cx)
-                    in (Maybes.maybe (forMissingAdapter cx lossy adapters placeholder) Flows.pure (Maps.lookup name adapters))))
-        in (Monads.withTrace (Strings.cat2 "adapt named type " (Core.unName name)) flow)
-
-functionProxyName :: Core.Name
-functionProxyName = (Core.Name "hydra.core.FunctionProxy")
-
--- | Generate a function proxy type for a given domain type
-functionProxyType :: (t0 -> Core.Type)
-functionProxyType _ = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = functionProxyName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "wrap"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "record"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "union"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "lambda"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "primitive"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "variable"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)}]}))
-
--- | Convert function types to union types
-functionToUnion :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-functionToUnion t =  
-  let encTerm = (\term -> \strippedTerm -> (\x -> case x of
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionElimination v2 -> ((\x -> case x of
-              Core.EliminationWrap v3 -> (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = functionProxyName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "wrap"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString (Core.unName v3)))}}))
-              Core.EliminationRecord _ -> (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = functionProxyName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "record"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString (Core__.term term)))}}))
-              Core.EliminationUnion _ -> (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = functionProxyName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString (Core__.term term)))}}))) v2)
-            Core.FunctionLambda _ -> (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = functionProxyName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lambda"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString (Core__.term term)))}}))
-            Core.FunctionPrimitive v2 -> (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = functionProxyName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "primitive"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString (Core.unName v2)))}}))) v1)
-          Core.TermVariable v1 -> (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = functionProxyName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "variable"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString (Core.unName v1)))}}))) strippedTerm)
-  in  
-    let encode = (\ad -> \term ->  
-            let strippedTerm = (Rewriting.deannotateTerm term)
-            in (Compute.coderEncode (Compute.adapterCoder ad) (encTerm term strippedTerm)))
-    in  
-      let readFromString = (\term -> Flows.bind (Core_.string term) (\s -> Maybes.maybe (Flows.fail (Strings.cat2 "failed to parse term: " s)) Flows.pure (Core__.readTerm s)))
-      in  
-        let decode = (\ad -> \term ->  
-                let notFound = (\fname -> Flows.fail (Strings.cat2 "unexpected field: " (Core.unName fname)))
-                in  
-                  let forCases = (\fterm -> withGraphContext (readFromString fterm))
-                  in  
-                    let forLambda = (\fterm -> withGraphContext (readFromString fterm))
-                    in  
-                      let forWrapped = (\fterm -> withGraphContext (Flows.map (\s -> Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name s)))) (Core_.string fterm)))
-                      in  
-                        let forPrimitive = (\fterm -> withGraphContext (Flows.map (\s -> Core.TermFunction (Core.FunctionPrimitive (Core.Name s))) (Core_.string fterm)))
-                        in  
-                          let forProjection = (\fterm -> withGraphContext (readFromString fterm))
-                          in  
-                            let forVariable = (\fterm -> withGraphContext (Flows.map (\s -> Core.TermVariable (Core.Name s)) (Core_.string fterm)))
-                            in (Flows.bind (Compute.coderDecode (Compute.adapterCoder ad) term) (\injTerm -> Flows.bind (withGraphContext (Core_.injection functionProxyName injTerm)) (\field ->  
-                              let fname = (Core.fieldName field)
-                              in  
-                                let fterm = (Core.fieldTerm field)
-                                in (Maybes.fromMaybe (notFound fname) (Maps.lookup fname (Maps.fromList [
-                                  (Core.Name "wrap", (forWrapped fterm)),
-                                  (Core.Name "record", (forProjection fterm)),
-                                  (Core.Name "union", (forCases fterm)),
-                                  (Core.Name "lambda", (forLambda fterm)),
-                                  (Core.Name "primitive", (forPrimitive fterm)),
-                                  (Core.Name "variable", (forVariable fterm))])))))))
-        in ((\x -> case x of
-          Core.TypeFunction v1 ->  
-            let dom = (Core.functionTypeDomain v1)
-            in  
-              let cod = (Core.functionTypeCodomain v1)
-              in  
-                let unionType = (Flows.bind (termAdapter dom) (\domAd -> Flows.pure (Core.TypeUnion (Core.RowType {
-                        Core.rowTypeTypeName = functionProxyName,
-                        Core.rowTypeFields = [
-                          Core.FieldType {
-                            Core.fieldTypeName = (Core.Name "wrap"),
-                            Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-                          Core.FieldType {
-                            Core.fieldTypeName = (Core.Name "record"),
-                            Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-                          Core.FieldType {
-                            Core.fieldTypeName = (Core.Name "union"),
-                            Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-                          Core.FieldType {
-                            Core.fieldTypeName = (Core.Name "lambda"),
-                            Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-                          Core.FieldType {
-                            Core.fieldTypeName = (Core.Name "primitive"),
-                            Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-                          Core.FieldType {
-                            Core.fieldTypeName = (Core.Name "variable"),
-                            Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)}]}))))
-                in (Flows.bind unionType (\ut -> Flows.bind (termAdapter ut) (\ad -> Flows.pure (Compute.Adapter {
-                  Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-                  Compute.adapterSource = t,
-                  Compute.adapterTarget = (Compute.adapterTarget ad),
-                  Compute.adapterCoder = Compute.Coder {
-                    Compute.coderEncode = (encode ad),
-                    Compute.coderDecode = (decode ad)}}))))) t)
-
--- | Convert forall types to monotypes
-lambdaToMonotype :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-lambdaToMonotype t = ((\x -> case x of
-  Core.TypeForall v1 ->  
-    let body = (Core.forallTypeBody v1)
-    in (Flows.bind (termAdapter body) (\ad -> Flows.pure (Compute.Adapter {
-      Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-      Compute.adapterSource = t,
-      Compute.adapterTarget = (Compute.adapterTarget ad),
-      Compute.adapterCoder = (Compute.adapterCoder ad)})))) t)
-
--- | Convert optional types to list types
-maybeToList :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-maybeToList t =  
-  let encode = (\ad -> \term -> (\x -> case x of
-          Core.TermMaybe v1 -> (Maybes.maybe (Flows.pure (Core.TermList [])) (\r -> Flows.bind (Compute.coderEncode (Compute.adapterCoder ad) r) (\encoded -> Flows.pure (Core.TermList [
-            encoded]))) v1)) term)
-  in  
-    let decode = (\ad -> \term -> (\x -> case x of
-            Core.TermList v1 -> (Flows.map (\x -> Core.TermMaybe x) (Logic.ifElse (Lists.null v1) (Flows.pure Nothing) (Flows.bind (Compute.coderDecode (Compute.adapterCoder ad) (Lists.head v1)) (\decoded -> Flows.pure (Just decoded)))))) term)
-    in ((\x -> case x of
-      Core.TypeMaybe v1 -> (Flows.bind (termAdapter v1) (\ad -> Flows.pure (Compute.Adapter {
-        Compute.adapterIsLossy = False,
-        Compute.adapterSource = t,
-        Compute.adapterTarget = (Core.TypeList (Compute.adapterTarget ad)),
-        Compute.adapterCoder = Compute.Coder {
-          Compute.coderEncode = (encode ad),
-          Compute.coderDecode = (decode ad)}})))) t)
-
--- | Pass through application types
-passApplication :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passApplication t =  
-  let forApplicationType = (\at ->  
-          let lhs = (Core.applicationTypeFunction at)
-          in  
-            let rhs = (Core.applicationTypeArgument at)
-            in (Flows.bind (termAdapter lhs) (\lhsAd -> Flows.bind (termAdapter rhs) (\rhsAd -> Flows.pure (Compute.Adapter {
-              Compute.adapterIsLossy = (Logic.or (Compute.adapterIsLossy lhsAd) (Compute.adapterIsLossy rhsAd)),
-              Compute.adapterSource = t,
-              Compute.adapterTarget = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Compute.adapterTarget lhsAd),
-                Core.applicationTypeArgument = (Compute.adapterTarget rhsAd)})),
-              Compute.adapterCoder = (Utils.bidirectional (\dir -> \term -> Utils.encodeDecode dir (Compute.adapterCoder lhsAd) term))})))))
-  in ((\x -> case x of
-    Core.TypeApplication v1 -> (forApplicationType v1)) t)
-
--- | Pass through either types
-passEither :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passEither t =  
-  let forEitherType = (\et ->  
-          let left = (Core.eitherTypeLeft et)
-          in  
-            let right = (Core.eitherTypeRight et)
-            in (Flows.bind (termAdapter left) (\leftAd -> Flows.bind (termAdapter right) (\rightAd -> Flows.pure (Compute.Adapter {
-              Compute.adapterIsLossy = (Logic.or (Compute.adapterIsLossy leftAd) (Compute.adapterIsLossy rightAd)),
-              Compute.adapterSource = t,
-              Compute.adapterTarget = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Compute.adapterTarget leftAd),
-                Core.eitherTypeRight = (Compute.adapterTarget rightAd)})),
-              Compute.adapterCoder = (Utils.bidirectional (\dir -> \term -> Utils.encodeDecode dir (Compute.adapterCoder leftAd) term))})))))
-  in ((\x -> case x of
-    Core.TypeEither v1 -> (forEitherType v1)) t)
-
--- | Pass through function types with adaptation
-passFunction :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passFunction t =  
-  let toCaseAds = (\dom -> \cod -> (\x -> case x of
-          Core.TypeUnion v1 -> (Flows.bind (Flows.mapList (\f -> Flows.bind (fieldAdapter (Core.FieldType {
-            Core.fieldTypeName = (Core.fieldTypeName f),
-            Core.fieldTypeType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.fieldTypeType f),
-              Core.functionTypeCodomain = cod}))})) (\ad -> Flows.pure (Core.fieldTypeName f, ad))) (Core.rowTypeFields v1)) (\pairs -> Flows.pure (Maps.fromList pairs)))
-          _ -> (Flows.pure Maps.empty)) (Rewriting.deannotateType dom))
-  in  
-    let toOptionAd = (\dom -> \cod -> (\x -> case x of
-            Core.TypeMaybe v1 -> (Flows.map Maybes.pure (termAdapter (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = v1,
-              Core.functionTypeCodomain = cod}))))
-            _ -> (Flows.pure Nothing)) (Rewriting.deannotateType dom))
-    in  
-      let getCoder = (\caseAds -> \fname -> Maybes.maybe Utils.idCoder Compute.adapterCoder (Maps.lookup fname caseAds))
-      in  
-        let forElimination = (\dir -> \codAd -> \caseAds -> \e -> (\x -> case x of
-                Core.EliminationUnion v1 ->  
-                  let n = (Core.caseStatementTypeName v1)
-                  in  
-                    let def = (Core.caseStatementDefault v1)
-                    in  
-                      let cases = (Core.caseStatementCases v1)
-                      in (Flows.bind (Flows.mapList (\f -> Utils.encodeDecode dir (getCoder caseAds (Core.fieldName f)) f) cases) (\rcases -> Flows.bind (Maybes.maybe (Flows.pure Nothing) (\d -> Flows.map Maybes.pure (Utils.encodeDecode dir (Compute.adapterCoder codAd) d)) def) (\rdef -> Flows.pure (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = n,
-                        Core.caseStatementDefault = rdef,
-                        Core.caseStatementCases = rcases})))))) e)
-        in  
-          let forFunction = (\dir -> \codAd -> \caseAds -> \f -> (\x -> case x of
-                  Core.FunctionElimination v1 -> (Flows.map (\x -> Core.FunctionElimination x) (forElimination dir codAd caseAds v1))
-                  Core.FunctionLambda v1 ->  
-                    let var = (Core.lambdaParameter v1)
-                    in  
-                      let d = (Core.lambdaDomain v1)
-                      in  
-                        let body = (Core.lambdaBody v1)
-                        in (Flows.bind (Utils.encodeDecode dir (Compute.adapterCoder codAd) body) (\newBody -> Flows.pure (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = var,
-                          Core.lambdaDomain = d,
-                          Core.lambdaBody = newBody}))))
-                  Core.FunctionPrimitive v1 -> (Flows.pure (Core.FunctionPrimitive v1))) f)
-          in  
-            let encdec = (\codAd -> \caseAds -> \dir -> \term -> (\x -> case x of
-                    Core.TermFunction v1 -> (Flows.map (\x -> Core.TermFunction x) (forFunction dir codAd caseAds v1))
-                    _ -> (Flows.pure term)) (Rewriting.deannotateTerm term))
-            in  
-              let forFunctionType = (\ft ->  
-                      let dom = (Core.functionTypeDomain ft)
-                      in  
-                        let cod = (Core.functionTypeCodomain ft)
-                        in (Flows.bind (termAdapter dom) (\domAd -> Flows.bind (termAdapter cod) (\codAd -> Flows.bind (toCaseAds dom cod) (\caseAds -> Flows.bind (toOptionAd dom cod) (\optionAd ->  
-                          let lossy = (Logic.or (Compute.adapterIsLossy codAd) (Lists.foldl Logic.or False (Lists.map (\pair -> Compute.adapterIsLossy (Pairs.second pair)) (Maps.toList caseAds))))
-                          in  
-                            let target = (Core.TypeFunction (Core.FunctionType {
-                                    Core.functionTypeDomain = (Compute.adapterTarget domAd),
-                                    Core.functionTypeCodomain = (Compute.adapterTarget codAd)}))
-                            in (Flows.pure (Compute.Adapter {
-                              Compute.adapterIsLossy = lossy,
-                              Compute.adapterSource = t,
-                              Compute.adapterTarget = target,
-                              Compute.adapterCoder = (Utils.bidirectional (encdec codAd caseAds))}))))))))
-              in ((\x -> case x of
-                Core.TypeFunction v1 -> (forFunctionType v1)) t)
-
--- | Pass through forall types
-passForall :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passForall t =  
-  let forForallType = (\ft ->  
-          let v = (Core.forallTypeParameter ft)
-          in  
-            let body = (Core.forallTypeBody ft)
-            in (Flows.bind (termAdapter body) (\ad -> Flows.pure (Compute.Adapter {
-              Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-              Compute.adapterSource = t,
-              Compute.adapterTarget = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = v,
-                Core.forallTypeBody = (Compute.adapterTarget ad)})),
-              Compute.adapterCoder = (Utils.bidirectional (\dir -> \term -> Utils.encodeDecode dir (Compute.adapterCoder ad) term))}))))
-  in ((\x -> case x of
-    Core.TypeForall v1 -> (forForallType v1)) t)
-
--- | Pass through literal types with literal adaptation
-passLiteral :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passLiteral t =  
-  let encdec = (\ad -> \dir -> \term -> Flows.bind (withGraphContext (Core_.literal term)) (\l -> Flows.bind (Utils.encodeDecode dir (Compute.adapterCoder ad) l) (\l2 -> Flows.pure (Core.TermLiteral l2))))
-  in  
-    let forLiteral = (\lt -> Flows.bind (Literals.literalAdapter lt) (\ad ->  
-            let step = (Utils.bidirectional (encdec ad))
-            in (Flows.pure (Compute.Adapter {
-              Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-              Compute.adapterSource = (Core.TypeLiteral (Compute.adapterSource ad)),
-              Compute.adapterTarget = (Core.TypeLiteral (Compute.adapterTarget ad)),
-              Compute.adapterCoder = step}))))
-    in ((\x -> case x of
-      Core.TypeLiteral v1 -> (forLiteral v1)) t)
-
--- | Pass through list types
-passList :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passList t =  
-  let encdec = (\ad -> \dir -> \term -> (\x -> case x of
-          Core.TermList v1 -> (Flows.bind (Flows.mapList (Utils.encodeDecode dir (Compute.adapterCoder ad)) v1) (\newTerms -> Flows.pure (Core.TermList newTerms)))) term)
-  in  
-    let forListType = (\lt -> Flows.bind (termAdapter lt) (\ad -> Flows.pure (Compute.Adapter {
-            Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-            Compute.adapterSource = t,
-            Compute.adapterTarget = (Core.TypeList (Compute.adapterTarget ad)),
-            Compute.adapterCoder = (Utils.bidirectional (encdec ad))})))
-    in ((\x -> case x of
-      Core.TypeList v1 -> (forListType v1)) t)
-
--- | Pass through map types
-passMap :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passMap t =  
-  let encdec = (\kad -> \vad -> \dir -> \term -> (\x -> case x of
-          Core.TermMap v1 -> (Flows.bind (Flows.mapList (\pair ->  
-            let k = (Pairs.first pair)
-            in  
-              let v = (Pairs.second pair)
-              in (Flows.bind (Utils.encodeDecode dir (Compute.adapterCoder kad) k) (\newK -> Flows.bind (Utils.encodeDecode dir (Compute.adapterCoder vad) v) (\newV -> Flows.pure (newK, newV))))) (Maps.toList v1)) (\newPairs -> Flows.pure (Core.TermMap (Maps.fromList newPairs))))) term)
-  in  
-    let forMapType = (\mt ->  
-            let kt = (Core.mapTypeKeys mt)
-            in  
-              let vt = (Core.mapTypeValues mt)
-              in (Flows.bind (termAdapter kt) (\kad -> Flows.bind (termAdapter vt) (\vad -> Flows.pure (Compute.Adapter {
-                Compute.adapterIsLossy = (Logic.or (Compute.adapterIsLossy kad) (Compute.adapterIsLossy vad)),
-                Compute.adapterSource = t,
-                Compute.adapterTarget = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Compute.adapterTarget kad),
-                  Core.mapTypeValues = (Compute.adapterTarget vad)})),
-                Compute.adapterCoder = (Utils.bidirectional (encdec kad vad))})))))
-    in ((\x -> case x of
-      Core.TypeMap v1 -> (forMapType v1)) t)
-
--- | Pass through optional types
-passOptional :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passOptional t =  
-  let mapTerm = (\coder -> \dir -> \term -> Flows.bind (withGraphContext (Core_.maybeTerm Flows.pure term)) (\opt -> Flows.bind (Flows.mapMaybe (Utils.encodeDecode dir coder) opt) (\newOpt -> Flows.pure (Core.TermMaybe newOpt))))
-  in ((\x -> case x of
-    Core.TypeMaybe v1 -> (Flows.bind (termAdapter v1) (\adapter -> Flows.pure (Compute.Adapter {
-      Compute.adapterIsLossy = (Compute.adapterIsLossy adapter),
-      Compute.adapterSource = t,
-      Compute.adapterTarget = (Core.TypeMaybe (Compute.adapterTarget adapter)),
-      Compute.adapterCoder = (Utils.bidirectional (mapTerm (Compute.adapterCoder adapter)))})))) t)
-
--- | Pass through record types
-passRecord :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passRecord t =  
-  let encdec = (\rt -> \adapters -> \dir -> \term -> (\x -> case x of
-          Core.TermRecord v1 ->  
-            let dfields = (Core.recordFields v1)
-            in (Flows.bind (Flows.sequence (Lists.zipWith (\ad -> \f -> Utils.encodeDecode dir (Compute.adapterCoder ad) f) adapters dfields)) (\newFields -> Flows.pure (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.rowTypeTypeName rt),
-              Core.recordFields = newFields}))))) term)
-  in  
-    let forRecordType = (\rt -> Flows.bind (Flows.mapList fieldAdapter (Core.rowTypeFields rt)) (\adapters ->  
-            let lossy = (Lists.foldl Logic.or False (Lists.map Compute.adapterIsLossy adapters))
-            in  
-              let sfields_ = (Lists.map Compute.adapterTarget adapters)
-              in (Flows.pure (Compute.Adapter {
-                Compute.adapterIsLossy = lossy,
-                Compute.adapterSource = t,
-                Compute.adapterTarget = (Core.TypeRecord (Core.RowType {
-                  Core.rowTypeTypeName = (Core.rowTypeTypeName rt),
-                  Core.rowTypeFields = sfields_})),
-                Compute.adapterCoder = (Utils.bidirectional (encdec rt adapters))}))))
-    in ((\x -> case x of
-      Core.TypeRecord v1 -> (forRecordType v1)) t)
-
--- | Pass through set types
-passSet :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passSet t =  
-  let encdec = (\ad -> \dir -> \term -> (\x -> case x of
-          Core.TermSet v1 -> (Flows.bind (Flows.mapList (Utils.encodeDecode dir (Compute.adapterCoder ad)) (Sets.toList v1)) (\newTerms -> Flows.pure (Core.TermSet (Sets.fromList newTerms))))) term)
-  in ((\x -> case x of
-    Core.TypeSet v1 -> (Flows.bind (termAdapter v1) (\ad -> Flows.pure (Compute.Adapter {
-      Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-      Compute.adapterSource = t,
-      Compute.adapterTarget = (Core.TypeSet (Compute.adapterTarget ad)),
-      Compute.adapterCoder = (Utils.bidirectional (encdec ad))})))) t)
-
--- | Pass through union types
-passUnion :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passUnion t = ((\x -> case x of
-  Core.TypeUnion v1 ->  
-    let sfields = (Core.rowTypeFields v1)
-    in  
-      let tname = (Core.rowTypeTypeName v1)
-      in  
-        let getAdapter = (\adaptersMap -> \f -> Maybes.maybe (Flows.fail (Strings.cat2 "no such field: " (Core.unName (Core.fieldName f)))) Flows.pure (Maps.lookup (Core.fieldName f) adaptersMap))
-        in (Flows.bind (Flows.mapList (\f -> Flows.bind (fieldAdapter f) (\ad -> Flows.pure (Core.fieldTypeName f, ad))) sfields) (\adapters ->  
-          let adaptersMap = (Maps.fromList adapters)
-          in  
-            let lossy = (Lists.foldl Logic.or False (Lists.map (\pair -> Compute.adapterIsLossy (Pairs.second pair)) adapters))
-            in  
-              let sfields_ = (Lists.map (\pair -> Compute.adapterTarget (Pairs.second pair)) adapters)
-              in (Flows.pure (Compute.Adapter {
-                Compute.adapterIsLossy = lossy,
-                Compute.adapterSource = t,
-                Compute.adapterTarget = (Core.TypeUnion (Core.RowType {
-                  Core.rowTypeTypeName = tname,
-                  Core.rowTypeFields = sfields_})),
-                Compute.adapterCoder = (Utils.bidirectional (\dir -> \term -> Flows.pure term))}))))) t)
-
--- | Pass through unit types
-passUnit :: (t0 -> Compute.Flow t1 (Compute.Adapter t2 t3 Core.Type Core.Type Core.Term Core.Term))
-passUnit _ = (Flows.pure (Compute.Adapter {
-  Compute.adapterIsLossy = False,
-  Compute.adapterSource = Core.TypeUnit,
-  Compute.adapterTarget = Core.TypeUnit,
-  Compute.adapterCoder = Compute.Coder {
-    Compute.coderEncode = (\_ -> Flows.pure Core.TermUnit),
-    Compute.coderDecode = (\_ -> Flows.pure Core.TermUnit)}}))
-
--- | Pass through wrapped types
-passWrapped :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-passWrapped t = ((\x -> case x of
-  Core.TypeWrap v1 ->  
-    let tname = (Core.wrappedTypeTypeName v1)
-    in  
-      let ot = (Core.wrappedTypeBody v1)
-      in  
-        let mapTerm = (\coder -> \dir -> \term -> Flows.bind (withGraphContext (Core_.wrap tname term)) (\unwrapped -> Flows.bind (Utils.encodeDecode dir coder unwrapped) (\newTerm -> Flows.pure (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = tname,
-                Core.wrappedTermBody = newTerm})))))
-        in (Flows.bind (termAdapter ot) (\adapter -> Flows.pure (Compute.Adapter {
-          Compute.adapterIsLossy = (Compute.adapterIsLossy adapter),
-          Compute.adapterSource = t,
-          Compute.adapterTarget = (Core.TypeWrap (Core.WrappedType {
-            Core.wrappedTypeTypeName = tname,
-            Core.wrappedTypeBody = (Compute.adapterTarget adapter)})),
-          Compute.adapterCoder = (Utils.bidirectional (mapTerm (Compute.adapterCoder adapter)))})))) t)
-
--- | Convert set types to list types
-setToList :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-setToList t =  
-  let encode = (\ad -> \term -> (\x -> case x of
-          Core.TermSet v1 -> (Compute.coderEncode (Compute.adapterCoder ad) (Core.TermList (Sets.toList v1)))) term)
-  in  
-    let forListTerm = (\t -> (\x -> case x of
-            Core.TermList v1 -> (Flows.pure (Core.TermSet (Sets.fromList v1)))) t)
-    in  
-      let decode = (\ad -> \term -> Flows.bind (Compute.coderDecode (Compute.adapterCoder ad) term) (\listTerm -> forListTerm listTerm))
-      in  
-        let forSetType = (\st -> Flows.bind (termAdapter (Core.TypeList st)) (\ad -> Flows.pure (Compute.Adapter {
-                Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-                Compute.adapterSource = t,
-                Compute.adapterTarget = (Compute.adapterTarget ad),
-                Compute.adapterCoder = Compute.Coder {
-                  Compute.coderEncode = (encode ad),
-                  Compute.coderDecode = (decode ad)}})))
-        in ((\x -> case x of
-          Core.TypeSet v1 -> (forSetType v1)) t)
-
--- | Simplify application types
-simplifyApplication :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-simplifyApplication t =  
-  let encdec = (\ad -> \dir -> \term -> Utils.encodeDecode dir (Compute.adapterCoder ad) term)
-  in  
-    let forApplicationType = (\at ->  
-            let lhs = (Core.applicationTypeFunction at)
-            in (Flows.bind (termAdapter lhs) (\ad -> Flows.pure (Compute.Adapter {
-              Compute.adapterIsLossy = False,
-              Compute.adapterSource = t,
-              Compute.adapterTarget = (Compute.adapterTarget ad),
-              Compute.adapterCoder = (Utils.bidirectional (encdec ad))}))))
-    in ((\x -> case x of
-      Core.TypeApplication v1 -> (forApplicationType v1)) t)
-
--- | Create an adapter for any type
-termAdapter :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-termAdapter typ =  
-  let constraints = (\cx -> Coders.languageConstraints (Coders.adapterContextLanguage cx))
-  in  
-    let supported = (\cx -> Utils.typeIsSupported (constraints cx))
-    in  
-      let variantIsSupported = (\cx -> \t -> Sets.member (Reflect.typeVariant t) (Coders.languageConstraintsTypeVariants (constraints cx)))
-      in  
-        let supportedAtTopLevel = (\cx -> \t -> Logic.and (variantIsSupported cx t) (Coders.languageConstraintsTypes (constraints cx) t))
-        in  
-          let pass = (\t -> (\x -> case x of
-                  Variants.TypeVariantAnnotated -> []
-                  Variants.TypeVariantApplication -> [
-                    passApplication]
-                  Variants.TypeVariantEither -> [
-                    passEither]
-                  Variants.TypeVariantForall -> [
-                    passForall]
-                  Variants.TypeVariantFunction -> [
-                    passFunction]
-                  Variants.TypeVariantList -> [
-                    passList]
-                  Variants.TypeVariantLiteral -> [
-                    passLiteral]
-                  Variants.TypeVariantMap -> [
-                    passMap]
-                  Variants.TypeVariantMaybe -> [
-                    passOptional,
-                    maybeToList]
-                  Variants.TypeVariantPair -> []
-                  Variants.TypeVariantRecord -> [
-                    passRecord]
-                  Variants.TypeVariantSet -> [
-                    passSet]
-                  Variants.TypeVariantUnion -> [
-                    passUnion]
-                  Variants.TypeVariantUnit -> [
-                    passUnit]
-                  Variants.TypeVariantVariable -> []
-                  Variants.TypeVariantWrap -> [
-                    passWrapped]) (Reflect.typeVariant (Rewriting.deannotateType t)))
-          in  
-            let trySubstitution = (\t -> (\x -> case x of
-                    Variants.TypeVariantAnnotated -> []
-                    Variants.TypeVariantApplication -> [
-                      simplifyApplication]
-                    Variants.TypeVariantEither -> []
-                    Variants.TypeVariantForall -> [
-                      lambdaToMonotype]
-                    Variants.TypeVariantFunction -> [
-                      functionToUnion]
-                    Variants.TypeVariantList -> []
-                    Variants.TypeVariantLiteral -> []
-                    Variants.TypeVariantMap -> []
-                    Variants.TypeVariantMaybe -> [
-                      maybeToList]
-                    Variants.TypeVariantPair -> []
-                    Variants.TypeVariantRecord -> []
-                    Variants.TypeVariantSet -> [
-                      setToList]
-                    Variants.TypeVariantUnion -> [
-                      unionToRecord]
-                    Variants.TypeVariantUnit -> [
-                      unitToRecord]
-                    Variants.TypeVariantVariable -> []
-                    Variants.TypeVariantWrap -> [
-                      wrapToUnwrapped]) (Reflect.typeVariant t))
-            in  
-              let alts = (\cx -> \t -> Flows.mapList (\c -> c t) (Logic.ifElse (supportedAtTopLevel cx t) (pass t) (trySubstitution t)))
-              in  
-                let dflt = ((\x -> case x of
-                        Core.TypeVariable v1 -> (forTypeReference v1)
-                        _ -> (Flows.bind Monads.getState (\cx -> Utils.chooseAdapter (alts cx) (supported cx) Core__.type_ Core__.type_ typ))) typ)
-                in ((\x -> case x of
-                  Core.TypeAnnotated v1 -> (Flows.bind (termAdapter (Core.annotatedTypeBody v1)) (\ad -> Flows.pure (Compute.Adapter {
-                    Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-                    Compute.adapterSource = (Compute.adapterSource ad),
-                    Compute.adapterTarget = (Core.TypeAnnotated (Core.AnnotatedType {
-                      Core.annotatedTypeBody = (Compute.adapterTarget ad),
-                      Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v1)})),
-                    Compute.adapterCoder = (Compute.adapterCoder ad)})))
-                  _ -> (Monads.withTrace (Strings.cat2 "adapter for " (Core__.type_ typ)) dflt)) typ)
-
--- | Convert union types to record types
-unionToRecord :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-unionToRecord t =  
-  let forField = (\field ->  
-          let fn = (Core.fieldName field)
-          in  
-            let fterm = (Core.fieldTerm field)
-            in ((\x -> case x of
-              Core.TermMaybe v1 -> (Maybes.bind v1 (\t -> Just (Core.Field {
-                Core.fieldName = fn,
-                Core.fieldTerm = t})))) fterm))
-  in  
-    let fromRecordFields = (\term -> \term_ -> \t_ -> \fields ->  
-            let matches = (Maybes.mapMaybe forField fields)
-            in (Logic.ifElse (Lists.null matches) (Flows.fail (Strings.cat [
-              "cannot convert term back to union: ",
-              (Core__.term term),
-              " where type = ",
-              (Core__.type_ t),
-              "    and target type = ",
-              (Core__.type_ t_)])) (Flows.pure (Lists.head matches))))
-    in  
-      let forRecTerm = (\nm -> \ad -> \term -> \recTerm -> (\x -> case x of
-              Core.TermRecord v1 ->  
-                let fields = (Core.recordFields v1)
-                in (Flows.bind (fromRecordFields term (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = nm,
-                  Core.recordFields = fields})) (Compute.adapterTarget ad) fields) (\resultField -> Flows.pure (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = nm,
-                  Core.injectionField = resultField}))))) recTerm)
-      in ((\x -> case x of
-        Core.TypeUnion v1 ->  
-          let nm = (Core.rowTypeTypeName v1)
-          in  
-            let sfields = (Core.rowTypeFields v1)
-            in  
-              let target = (Core.TypeRecord (unionTypeToRecordType v1))
-              in  
-                let toRecordField = (\term -> \fn -> \f ->  
-                        let fn_ = (Core.fieldTypeName f)
-                        in Core.Field {
-                          Core.fieldName = fn_,
-                          Core.fieldTerm = (Core.TermMaybe (Logic.ifElse (Equality.equal fn_ fn) (Just term) Nothing))})
-                in (Flows.bind (termAdapter target) (\ad -> Flows.pure (Compute.Adapter {
-                  Compute.adapterIsLossy = (Compute.adapterIsLossy ad),
-                  Compute.adapterSource = t,
-                  Compute.adapterTarget = (Compute.adapterTarget ad),
-                  Compute.adapterCoder = Compute.Coder {
-                    Compute.coderEncode = (\term_ -> Flows.bind (withGraphContext (Core_.injection (Core.rowTypeTypeName v1) term_)) (\field ->  
-                      let fn = (Core.fieldName field)
-                      in  
-                        let term = (Core.fieldTerm field)
-                        in (Compute.coderEncode (Compute.adapterCoder ad) (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = nm,
-                          Core.recordFields = (Lists.map (toRecordField term fn) sfields)}))))),
-                    Compute.coderDecode = (\term -> Flows.bind (Compute.coderDecode (Compute.adapterCoder ad) term) (\recTerm -> forRecTerm nm ad term recTerm))}})))) t)
-
--- | Convert a union row type to a record row type
-unionTypeToRecordType :: (Core.RowType -> Core.RowType)
-unionTypeToRecordType rt =  
-  let makeOptional = (\f ->  
-          let fn = (Core.fieldTypeName f)
-          in  
-            let ft = (Core.fieldTypeType f)
-            in Core.FieldType {
-              Core.fieldTypeName = fn,
-              Core.fieldTypeType = (Rewriting.mapBeneathTypeAnnotations (\x -> Core.TypeMaybe x) ft)})
-  in Core.RowType {
-    Core.rowTypeTypeName = (Core.rowTypeTypeName rt),
-    Core.rowTypeFields = (Lists.map makeOptional (Core.rowTypeFields rt))}
-
--- | Convert unit terms to records
-unitToRecord :: (t0 -> Compute.Flow t1 (Compute.Adapter t2 t3 Core.Type Core.Type Core.Term Core.Term))
-unitToRecord _ = (Flows.pure (Compute.Adapter {
-  Compute.adapterIsLossy = False,
-  Compute.adapterSource = Core.TypeUnit,
-  Compute.adapterTarget = (Core.TypeRecord (Core.RowType {
-    Core.rowTypeTypeName = (Core.Name "_Unit"),
-    Core.rowTypeFields = []})),
-  Compute.adapterCoder = Compute.Coder {
-    Compute.coderEncode = (\_ -> Flows.pure (Core.TermRecord (Core.Record {
-      Core.recordTypeName = (Core.Name "_Unit"),
-      Core.recordFields = []}))),
-    Compute.coderDecode = (\_ -> Flows.pure Core.TermUnit)}}))
-
--- | Convert wrapped types to unwrapped types
-wrapToUnwrapped :: (Core.Type -> Compute.Flow Coders.AdapterContext (Compute.Adapter Coders.AdapterContext Coders.AdapterContext Core.Type Core.Type Core.Term Core.Term))
-wrapToUnwrapped t = ((\x -> case x of
-  Core.TypeWrap v1 ->  
-    let tname = (Core.wrappedTypeTypeName v1)
-    in  
-      let typ = (Core.wrappedTypeBody v1)
-      in  
-        let encode = (\ad -> \term -> Flows.bind (withGraphContext (Core_.wrap tname term)) (\unwrapped -> Compute.coderEncode (Compute.adapterCoder ad) unwrapped))
-        in  
-          let decode = (\ad -> \term -> Flows.bind (Compute.coderDecode (Compute.adapterCoder ad) term) (\decoded -> Flows.pure (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = tname,
-                  Core.wrappedTermBody = decoded}))))
-          in (Flows.bind (termAdapter typ) (\ad -> Flows.pure (Compute.Adapter {
-            Compute.adapterIsLossy = False,
-            Compute.adapterSource = t,
-            Compute.adapterTarget = (Compute.adapterTarget ad),
-            Compute.adapterCoder = Compute.Coder {
-              Compute.coderEncode = (encode ad),
-              Compute.coderDecode = (decode ad)}})))) t)
-
--- | Execute a flow with graph context
-withGraphContext :: (Compute.Flow Graph.Graph t0 -> Compute.Flow Coders.AdapterContext t0)
-withGraphContext f = (Flows.bind Monads.getState (\cx -> Monads.withState (Coders.adapterContextGraph cx) f))
diff --git a/src/gen-main/haskell/Hydra/Adapt/Utils.hs b/src/gen-main/haskell/Hydra/Adapt/Utils.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Adapt/Utils.hs
+++ /dev/null
@@ -1,155 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Additional adapter utilities, above and beyond the generated ones.
-
-module Hydra.Adapt.Utils where
-
-import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Formatting as Formatting
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Module as Module
-import qualified Hydra.Names as Names
-import qualified Hydra.Reflect as Reflect
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Show.Core as Core_
-import qualified Hydra.Util as Util
-import qualified Hydra.Variants as Variants
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Create a bidirectional coder from a direction-aware function
-bidirectional :: ((Coders.CoderDirection -> t0 -> Compute.Flow t1 t0) -> Compute.Coder t1 t1 t0 t0)
-bidirectional f = Compute.Coder {
-  Compute.coderEncode = (f Coders.CoderDirectionEncode),
-  Compute.coderDecode = (f Coders.CoderDirectionDecode)}
-
--- | Choose an appropriate adapter for a type
-chooseAdapter :: ((t0 -> Compute.Flow t1 [Compute.Adapter t2 t3 t0 t0 t4 t4]) -> (t0 -> Bool) -> (t0 -> String) -> (t0 -> String) -> t0 -> Compute.Flow t1 (Compute.Adapter t2 t3 t0 t0 t4 t4))
-chooseAdapter alts supported show describe typ = (Logic.ifElse (supported typ) (Flows.pure (Compute.Adapter {
-  Compute.adapterIsLossy = False,
-  Compute.adapterSource = typ,
-  Compute.adapterTarget = typ,
-  Compute.adapterCoder = idCoder})) (Flows.bind (alts typ) (\raw ->  
-  let candidates = (Lists.filter (\adapter -> supported (Compute.adapterTarget adapter)) raw)
-  in (Logic.ifElse (Lists.null candidates) (Flows.fail (Strings.cat [
-    "no adapters found for ",
-    (describe typ),
-    (Logic.ifElse (Lists.null raw) "" (Strings.cat [
-      " (discarded ",
-      (Literals.showInt32 (Lists.length raw)),
-      " unsupported candidate types: ",
-      (Core_.list show (Lists.map Compute.adapterTarget raw)),
-      ")"])),
-    ". Original type: ",
-    (show typ)])) (Flows.pure (Lists.head candidates))))))
-
--- | Compose two coders
-composeCoders :: (Compute.Coder t0 t1 t2 t3 -> Compute.Coder t0 t1 t3 t4 -> Compute.Coder t0 t1 t2 t4)
-composeCoders c1 c2 = Compute.Coder {
-  Compute.coderEncode = (\a -> Flows.bind (Compute.coderEncode c1 a) (\b1 -> Compute.coderEncode c2 b1)),
-  Compute.coderDecode = (\c -> Flows.bind (Compute.coderDecode c2 c) (\b2 -> Compute.coderDecode c1 b2))}
-
--- | Apply coder in the specified direction
-encodeDecode :: (Coders.CoderDirection -> Compute.Coder t0 t0 t1 t1 -> t1 -> Compute.Flow t0 t1)
-encodeDecode dir coder term = ((\x -> case x of
-  Coders.CoderDirectionEncode -> (Compute.coderEncode coder term)
-  Coders.CoderDirectionDecode -> (Compute.coderDecode coder term)) dir)
-
--- | Check if float type is supported by language constraints
-floatTypeIsSupported :: (Coders.LanguageConstraints -> Core.FloatType -> Bool)
-floatTypeIsSupported constraints ft = (Sets.member ft (Coders.languageConstraintsFloatTypes constraints))
-
--- | Identity adapter
-idAdapter :: (t0 -> Compute.Adapter t1 t2 t0 t0 t3 t3)
-idAdapter t = Compute.Adapter {
-  Compute.adapterIsLossy = False,
-  Compute.adapterSource = t,
-  Compute.adapterTarget = t,
-  Compute.adapterCoder = idCoder}
-
--- | Identity coder
-idCoder :: (Compute.Coder t0 t1 t2 t2)
-idCoder = Compute.Coder {
-  Compute.coderEncode = Flows.pure,
-  Compute.coderDecode = Flows.pure}
-
--- | Check if integer type is supported by language constraints
-integerTypeIsSupported :: (Coders.LanguageConstraints -> Core.IntegerType -> Bool)
-integerTypeIsSupported constraints it = (Sets.member it (Coders.languageConstraintsIntegerTypes constraints))
-
--- | Check if literal type is supported by language constraints
-literalTypeIsSupported :: (Coders.LanguageConstraints -> Core.LiteralType -> Bool)
-literalTypeIsSupported constraints lt =  
-  let isSupported = (\lt -> (\x -> case x of
-          Core.LiteralTypeFloat v1 -> (floatTypeIsSupported constraints v1)
-          Core.LiteralTypeInteger v1 -> (integerTypeIsSupported constraints v1)
-          _ -> True) lt)
-  in (Logic.and (Sets.member (Reflect.literalTypeVariant lt) (Coders.languageConstraintsLiteralVariants constraints)) (isSupported lt))
-
--- | Convert a name to file path, given case conventions for namespaces and local names, and assuming '/' as the file path separator
-nameToFilePath :: (Util.CaseConvention -> Util.CaseConvention -> Module.FileExtension -> Core.Name -> String)
-nameToFilePath nsConv localConv ext name =  
-  let qualName = (Names.qualifyName name)
-  in  
-    let ns = (Module.qualifiedNameNamespace qualName)
-    in  
-      let local = (Module.qualifiedNameLocal qualName)
-      in  
-        let nsToFilePath = (\ns -> Strings.intercalate "/" (Lists.map (\part -> Formatting.convertCase Util.CaseConventionCamel nsConv part) (Strings.splitOn "." (Module.unNamespace ns))))
-        in  
-          let prefix = (Maybes.maybe "" (\n -> Strings.cat2 (nsToFilePath n) "/") ns)
-          in  
-            let suffix = (Formatting.convertCase Util.CaseConventionPascal localConv local)
-            in (Strings.cat [
-              prefix,
-              suffix,
-              ".",
-              (Module.unFileExtension ext)])
-
--- | Check if type is supported by language constraints
-typeIsSupported :: (Coders.LanguageConstraints -> Core.Type -> Bool)
-typeIsSupported constraints t =  
-  let base = (Rewriting.deannotateType t)
-  in  
-    let isVariable = (\v -> (\x -> case x of
-            Variants.TypeVariantVariable -> True
-            _ -> False) v)
-    in  
-      let isSupportedVariant = (\v -> Logic.or (isVariable v) (Sets.member v (Coders.languageConstraintsTypeVariants constraints)))
-      in  
-        let isSupported = (\base -> (\x -> case x of
-                Core.TypeAnnotated v1 -> (typeIsSupported constraints (Core.annotatedTypeBody v1))
-                Core.TypeApplication v1 -> (Logic.and (typeIsSupported constraints (Core.applicationTypeFunction v1)) (typeIsSupported constraints (Core.applicationTypeArgument v1)))
-                Core.TypeEither v1 -> (Logic.and (typeIsSupported constraints (Core.eitherTypeLeft v1)) (typeIsSupported constraints (Core.eitherTypeRight v1)))
-                Core.TypeForall v1 -> (typeIsSupported constraints (Core.forallTypeBody v1))
-                Core.TypeFunction v1 -> (Logic.and (typeIsSupported constraints (Core.functionTypeDomain v1)) (typeIsSupported constraints (Core.functionTypeCodomain v1)))
-                Core.TypeList v1 -> (typeIsSupported constraints v1)
-                Core.TypeLiteral v1 -> (literalTypeIsSupported constraints v1)
-                Core.TypeMap v1 -> (Logic.and (typeIsSupported constraints (Core.mapTypeKeys v1)) (typeIsSupported constraints (Core.mapTypeValues v1)))
-                Core.TypeMaybe v1 -> (typeIsSupported constraints v1)
-                Core.TypePair v1 -> (Logic.and (typeIsSupported constraints (Core.pairTypeFirst v1)) (typeIsSupported constraints (Core.pairTypeSecond v1)))
-                Core.TypeRecord v1 -> (Lists.foldl Logic.and True (Lists.map (\field -> typeIsSupported constraints (Core.fieldTypeType field)) (Core.rowTypeFields v1)))
-                Core.TypeSet v1 -> (typeIsSupported constraints v1)
-                Core.TypeUnion v1 -> (Lists.foldl Logic.and True (Lists.map (\field -> typeIsSupported constraints (Core.fieldTypeType field)) (Core.rowTypeFields v1)))
-                Core.TypeUnit -> True
-                Core.TypeWrap v1 -> (typeIsSupported constraints (Core.wrappedTypeBody v1))
-                Core.TypeVariable _ -> True) base)
-        in (Logic.and (Coders.languageConstraintsTypes constraints base) (Logic.and (isSupportedVariant (Reflect.typeVariant base)) (isSupported base)))
-
--- | Create a unidirectional coder
-unidirectionalCoder :: ((t0 -> Compute.Flow t1 t2) -> Compute.Coder t1 t3 t0 t2)
-unidirectionalCoder m = Compute.Coder {
-  Compute.coderEncode = m,
-  Compute.coderDecode = (\_ -> Flows.fail "inbound mapping is unsupported")}
diff --git a/src/gen-main/haskell/Hydra/Annotations.hs b/src/gen-main/haskell/Hydra/Annotations.hs
--- a/src/gen-main/haskell/Hydra/Annotations.hs
+++ b/src/gen-main/haskell/Hydra/Annotations.hs
@@ -5,16 +5,16 @@
 module Hydra.Annotations where
 
 import qualified Hydra.Classes as Classes
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Constants as Constants
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
 import qualified Hydra.Encode.Core as Core__
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Core as Core___
 import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Maps as Maps
@@ -22,10 +22,9 @@
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Pairs as Pairs
 import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Monads as Monads
+import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Rewriting as Rewriting
 import qualified Hydra.Show.Core as Core____
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -35,244 +34,290 @@
 
 -- | Aggregate annotations from nested structures
 aggregateAnnotations :: Ord t2 => ((t0 -> Maybe t1) -> (t1 -> t0) -> (t1 -> M.Map t2 t3) -> t0 -> M.Map t2 t3)
-aggregateAnnotations getValue getX getAnns t =  
-  let toPairs = (\rest -> \t -> Maybes.maybe rest (\yy -> toPairs (Lists.cons (Maps.toList (getAnns yy)) rest) (getX yy)) (getValue t))
-  in (Maps.fromList (Lists.concat (toPairs [] t)))
+aggregateAnnotations getValue getX getAnns t =
 
--- | Debug if the debug ID matches
-debugIf :: (t0 -> String -> Compute.Flow t1 ())
-debugIf debugId message =  
-  let checkAndFail = (\desc -> Logic.ifElse (Equality.equal desc (Just "debugId")) (Flows.fail message) (Flows.pure ()))
-  in (Flows.bind getDebugId checkAndFail)
+      let toPairs =
+              \rest -> \t -> Maybes.maybe rest (\yy -> toPairs (Lists.cons (Maps.toList (getAnns yy)) rest) (getX yy)) (getValue t)
+      in (Maps.fromList (Lists.concat (toPairs [] t)))
 
--- | Fail if the given flag is set
-failOnFlag :: (Core.Name -> String -> Compute.Flow t0 ())
-failOnFlag flag msg = (Flows.bind (hasFlag flag) (\val -> Logic.ifElse val (Flows.fail msg) (Flows.pure ())))
+-- | Debug if the debug ID matches (Either version)
+debugIf :: Context.Context -> String -> String -> Either (Context.InContext Errors.Error) ()
+debugIf cx debugId message =
+    Eithers.bind (getDebugId cx) (\mid -> Logic.ifElse (Equality.equal mid (Just debugId)) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError message)),
+      Context.inContextContext = cx})) (Right ()))
 
--- | Get the debug ID from flow state
-getDebugId :: (Compute.Flow t0 (Maybe String))
-getDebugId = (Lexical.withEmptyGraph (Flows.bind (getAttr Constants.key_debugId) (\desc -> Flows.mapMaybe Core___.string desc)))
+-- | Fail if the given flag is set (Either version)
+failOnFlag :: Context.Context -> Core.Name -> String -> Either (Context.InContext Errors.Error) ()
+failOnFlag cx flag msg =
+    Eithers.bind (hasFlag cx flag) (\val -> Logic.ifElse val (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError msg)),
+      Context.inContextContext = cx})) (Right ()))
 
--- | Get an attribute from the trace
-getAttr :: (Core.Name -> Compute.Flow t0 (Maybe Core.Term))
-getAttr key = (Compute.Flow (\s0 -> \t0 -> Compute.FlowState {
-  Compute.flowStateValue = (Just (Maps.lookup key (Compute.traceOther t0))),
-  Compute.flowStateState = s0,
-  Compute.flowStateTrace = t0}))
+-- | Get an attribute from a context (pure version)
+getAttr :: Core.Name -> Context.Context -> Maybe Core.Term
+getAttr key cx = Maps.lookup key (Context.contextOther cx)
 
--- | Get an attribute with a default value
-getAttrWithDefault :: (Core.Name -> Core.Term -> Compute.Flow t0 Core.Term)
-getAttrWithDefault key def = (Flows.map (\mval -> Maybes.fromMaybe def mval) (getAttr key))
+-- | Get an attribute with a default value from context (pure version)
+getAttrWithDefault :: Core.Name -> Core.Term -> Context.Context -> Core.Term
+getAttrWithDefault key def cx = Maybes.fromMaybe def (getAttr key cx)
 
--- | Get a counter value
-getCount :: (Core.Name -> Compute.Flow t0 Int)
-getCount key = (Lexical.withEmptyGraph (Flows.bind (getAttrWithDefault key (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))) Core___.int32))
+-- | Get a counter value from context (pure version)
+getCount :: Core.Name -> Context.Context -> Int
+getCount key cx =
+    Maybes.maybe 0 (\term -> case term of
+      Core.TermLiteral v0 -> case v0 of
+        Core.LiteralInteger v1 -> case v1 of
+          Core.IntegerValueInt32 v2 -> v2
+          _ -> 0
+        _ -> 0
+      _ -> 0) (Maps.lookup key (Context.contextOther cx))
 
--- | Get description from annotations map
-getDescription :: (M.Map Core.Name Core.Term -> Compute.Flow Graph.Graph (Maybe String))
-getDescription anns = (Maybes.maybe (Flows.pure Nothing) (\term -> Flows.map Maybes.pure (Core___.string term)) (Maps.lookup (Core.Name "description") anns))
+-- | Get the debug ID from context (Either version)
+getDebugId :: Context.Context -> Either (Context.InContext Errors.Error) (Maybe String)
+getDebugId cx =
+    Maybes.maybe (Right Nothing) (\term -> Eithers.map Maybes.pure (Core___.string cx (Graph.Graph {
+      Graph.graphBoundTerms = Maps.empty,
+      Graph.graphBoundTypes = Maps.empty,
+      Graph.graphClassConstraints = Maps.empty,
+      Graph.graphLambdaVariables = Sets.empty,
+      Graph.graphMetadata = Maps.empty,
+      Graph.graphPrimitives = Maps.empty,
+      Graph.graphSchemaTypes = Maps.empty,
+      Graph.graphTypeVariables = Sets.empty}) term)) (getAttr Constants.key_debugId cx)
 
+-- | Get description from annotations map (Either version)
+getDescription :: Context.Context -> Graph.Graph -> M.Map Core.Name Core.Term -> Either (Context.InContext Errors.Error) (Maybe String)
+getDescription cx graph anns =
+    Maybes.maybe (Right Nothing) (\term -> Eithers.map Maybes.pure (Core___.string cx graph term)) (Maps.lookup (Core.Name "description") anns)
+
 -- | Get a term annotation
-getTermAnnotation :: (Core.Name -> Core.Term -> Maybe Core.Term)
-getTermAnnotation key term = (Maps.lookup key (termAnnotationInternal term))
+getTermAnnotation :: Core.Name -> Core.Term -> Maybe Core.Term
+getTermAnnotation key term = Maps.lookup key (termAnnotationInternal term)
 
--- | Get term description. Peels through TermTypeLambda and TermTypeApplication wrappers (added by inference for polymorphic bindings) to find the description annotation underneath.
-getTermDescription :: (Core.Term -> Compute.Flow Graph.Graph (Maybe String))
-getTermDescription term =  
-  let peel = (\t -> (\x -> case x of
-          Core.TermTypeLambda v1 -> (peel (Core.typeLambdaBody v1))
-          Core.TermTypeApplication v1 -> (peel (Core.typeApplicationTermBody v1))
-          _ -> t) t)
-  in (getDescription (termAnnotationInternal (peel term)))
+-- | Get term description (Either version)
+getTermDescription :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) (Maybe String)
+getTermDescription cx graph term =
 
+      let peel =
+              \t -> case t of
+                Core.TermTypeLambda v0 -> peel (Core.typeLambdaBody v0)
+                Core.TermTypeApplication v0 -> peel (Core.typeApplicationTermBody v0)
+                _ -> t
+      in (getDescription cx graph (termAnnotationInternal (peel term)))
+
 -- | Get type from annotations
-getType :: (M.Map Core.Name Core.Term -> Compute.Flow Graph.Graph (Maybe Core.Type))
-getType anns = (Flows.bind Monads.getState (\cx -> Maybes.maybe (Flows.pure Nothing) (\dat -> Flows.map Maybes.pure (Monads.withTrace "get type" (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx dat)))) (Maps.lookup Constants.key_type anns)))
+getType :: Graph.Graph -> M.Map Core.Name Core.Term -> Either Errors.DecodingError (Maybe Core.Type)
+getType graph anns =
+    Maybes.maybe (Right Nothing) (\dat -> Eithers.map Maybes.pure (Core_.type_ graph dat)) (Maps.lookup Constants.key_type anns)
 
 -- | Get a type annotation
-getTypeAnnotation :: (Core.Name -> Core.Type -> Maybe Core.Term)
-getTypeAnnotation key typ = (Maps.lookup key (typeAnnotationInternal typ))
+getTypeAnnotation :: Core.Name -> Core.Type -> Maybe Core.Term
+getTypeAnnotation key typ = Maps.lookup key (typeAnnotationInternal typ)
 
 -- | Get type classes from term
-getTypeClasses :: (Core.Term -> Compute.Flow Graph.Graph (M.Map Core.Name (S.Set Classes.TypeClass)))
-getTypeClasses term = (Flows.bind Monads.getState (\cx ->  
-  let decodeClass = (\term ->  
-          let byName = (Maps.fromList [
-                  (Core.Name "equality", Classes.TypeClassEquality),
-                  (Core.Name "ordering", Classes.TypeClassOrdering)])
-          in (Flows.bind (Core___.unitVariant (Core.Name "hydra.classes.TypeClass") term) (\fn -> Maybes.maybe (Monads.unexpected "type class" (Core____.term term)) Flows.pure (Maps.lookup fn byName))))
-  in (Maybes.maybe (Flows.pure Maps.empty) (\term -> Core___.map (\t -> Monads.eitherToFlow Util.unDecodingError (Core_.name cx t)) (Core___.setOf decodeClass) term) (getTermAnnotation Constants.key_classes term))))
+getTypeClasses :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) (M.Map Core.Name (S.Set Classes.TypeClass))
+getTypeClasses cx graph term =
 
--- | Get type description
-getTypeDescription :: (Core.Type -> Compute.Flow Graph.Graph (Maybe String))
-getTypeDescription typ = (getDescription (typeAnnotationInternal typ))
+      let decodeClass =
+              \term ->
+                let byName =
+                        Maps.fromList [
+                          (Core.Name "equality", Classes.TypeClassEquality),
+                          (Core.Name "ordering", Classes.TypeClassOrdering)]
+                in (Eithers.bind (Core___.unitVariant cx (Core.Name "hydra.classes.TypeClass") graph term) (\fn -> Maybes.maybe (Left (Context.InContext {
+                  Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "unexpected: expected type class, got " (Core____.term term)))),
+                  Context.inContextContext = cx})) (\x -> Right x) (Maps.lookup fn byName)))
+      in (Maybes.maybe (Right Maps.empty) (\term -> Core___.map cx (\t -> Eithers.bimap (\de -> Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError de))),
+        Context.inContextContext = cx}) (\x -> x) (Core_.name graph t)) (Core___.setOf cx decodeClass graph) graph term) (getTermAnnotation Constants.key_classes term))
 
--- | For a typed term, decide whether a coder should encode it as a native type expression, or as a Hydra type expression.
-isNativeType :: (Core.Binding -> Bool)
-isNativeType el =  
-  let isFlaggedAsFirstClassType = (Maybes.fromMaybe False (Maybes.map (\_ -> True) (getTermAnnotation Constants.key_firstClassType (Core.bindingTerm el))))
-  in (Maybes.maybe False (\ts -> Logic.and (Equality.equal ts (Core.TypeScheme {
-    Core.typeSchemeVariables = [],
-    Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-    Core.typeSchemeConstraints = Nothing})) (Logic.not isFlaggedAsFirstClassType)) (Core.bindingType el))
+-- | Get type description (Either version)
+getTypeDescription :: Context.Context -> Graph.Graph -> Core.Type -> Either (Context.InContext Errors.Error) (Maybe String)
+getTypeDescription cx graph typ = getDescription cx graph (typeAnnotationInternal typ)
 
 -- | Check if annotations contain description
-hasDescription :: (M.Map Core.Name t0 -> Bool)
-hasDescription anns = (Maybes.isJust (Maps.lookup Constants.key_description anns))
+hasDescription :: M.Map Core.Name t0 -> Bool
+hasDescription anns = Maybes.isJust (Maps.lookup Constants.key_description anns)
 
--- | Check if flag is set
-hasFlag :: (Core.Name -> Compute.Flow t0 Bool)
-hasFlag flag = (Lexical.withEmptyGraph (Flows.bind (getAttrWithDefault flag (Core.TermLiteral (Core.LiteralBoolean False))) (\term -> Core___.boolean term)))
+-- | Check if flag is set (Either version)
+hasFlag :: Context.Context -> Core.Name -> Either (Context.InContext Errors.Error) Bool
+hasFlag cx flag =
 
+      let term = getAttrWithDefault flag (Core.TermLiteral (Core.LiteralBoolean False)) cx
+      in (Core___.boolean cx (Graph.Graph {
+        Graph.graphBoundTerms = Maps.empty,
+        Graph.graphBoundTypes = Maps.empty,
+        Graph.graphClassConstraints = Maps.empty,
+        Graph.graphLambdaVariables = Sets.empty,
+        Graph.graphMetadata = Maps.empty,
+        Graph.graphPrimitives = Maps.empty,
+        Graph.graphSchemaTypes = Maps.empty,
+        Graph.graphTypeVariables = Sets.empty}) term)
+
 -- | Check if type has description
-hasTypeDescription :: (Core.Type -> Bool)
-hasTypeDescription typ = (hasDescription (typeAnnotationInternal typ))
+hasTypeDescription :: Core.Type -> Bool
+hasTypeDescription typ = hasDescription (typeAnnotationInternal typ)
 
--- | Return a zero-indexed counter for the given key: 0, 1, 2, ...
-nextCount :: (Core.Name -> Compute.Flow t0 Int)
-nextCount key = (Flows.bind (getCount key) (\count -> Flows.map (\_ -> count) (putCount key (Math.add count 1))))
+-- | For a typed term, decide whether a coder should encode it as a native type expression, or as a Hydra type expression.
+isNativeType :: Core.Binding -> Bool
+isNativeType el =
 
+      let isFlaggedAsFirstClassType =
+              Maybes.fromMaybe False (Maybes.map (\_ -> True) (getTermAnnotation Constants.key_firstClassType (Core.bindingTerm el)))
+      in (Maybes.maybe False (\ts -> Logic.and (Equality.equal ts (Core.TypeScheme {
+        Core.typeSchemeVariables = [],
+        Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+        Core.typeSchemeConstraints = Nothing})) (Logic.not isFlaggedAsFirstClassType)) (Core.bindingType el))
+
+-- | Return a zero-indexed counter for the given key and updated context (pure version)
+nextCount :: Core.Name -> Context.Context -> (Int, Context.Context)
+nextCount key cx =
+
+      let count = getCount key cx
+      in (count, (putCount key (Math.add count 1) cx))
+
 -- | Normalize term annotations
-normalizeTermAnnotations :: (Core.Term -> Core.Term)
-normalizeTermAnnotations term =  
-  let anns = (termAnnotationInternal term)
-  in  
-    let stripped = (Rewriting.deannotateTerm term)
-    in (Logic.ifElse (Maps.null anns) stripped (Core.TermAnnotated (Core.AnnotatedTerm {
-      Core.annotatedTermBody = stripped,
-      Core.annotatedTermAnnotation = anns})))
+normalizeTermAnnotations :: Core.Term -> Core.Term
+normalizeTermAnnotations term =
 
+      let anns = termAnnotationInternal term
+          stripped = Rewriting.deannotateTerm term
+      in (Logic.ifElse (Maps.null anns) stripped (Core.TermAnnotated (Core.AnnotatedTerm {
+        Core.annotatedTermBody = stripped,
+        Core.annotatedTermAnnotation = anns})))
+
 -- | Normalize type annotations
-normalizeTypeAnnotations :: (Core.Type -> Core.Type)
-normalizeTypeAnnotations typ =  
-  let anns = (typeAnnotationInternal typ)
-  in  
-    let stripped = (Rewriting.deannotateType typ)
-    in (Logic.ifElse (Maps.null anns) stripped (Core.TypeAnnotated (Core.AnnotatedType {
-      Core.annotatedTypeBody = stripped,
-      Core.annotatedTypeAnnotation = anns})))
+normalizeTypeAnnotations :: Core.Type -> Core.Type
+normalizeTypeAnnotations typ =
 
--- | Set an attribute in the trace
-putAttr :: (Core.Name -> Core.Term -> Compute.Flow t0 ())
-putAttr key val = (Compute.Flow (\s0 -> \t0 -> Compute.FlowState {
-  Compute.flowStateValue = (Just ()),
-  Compute.flowStateState = s0,
-  Compute.flowStateTrace = Compute.Trace {
-    Compute.traceStack = (Compute.traceStack t0),
-    Compute.traceMessages = (Compute.traceMessages t0),
-    Compute.traceOther = (Maps.insert key val (Compute.traceOther t0))}}))
+      let anns = typeAnnotationInternal typ
+          stripped = Rewriting.deannotateType typ
+      in (Logic.ifElse (Maps.null anns) stripped (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = stripped,
+        Core.annotatedTypeAnnotation = anns})))
 
--- | Set counter value
-putCount :: (Core.Name -> Int -> Compute.Flow t0 ())
-putCount key count = (putAttr key (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 count))))
+-- | Set an attribute in a context
+putAttr :: Core.Name -> Core.Term -> Context.Context -> Context.Context
+putAttr key val cx =
+    Context.Context {
+      Context.contextTrace = (Context.contextTrace cx),
+      Context.contextMessages = (Context.contextMessages cx),
+      Context.contextOther = (Maps.insert key val (Context.contextOther cx))}
 
--- | Reset counter to zero
-resetCount :: (Core.Name -> Compute.Flow t0 ())
-resetCount key = (putAttr key (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))))
+-- | Set counter value in context
+putCount :: Core.Name -> Int -> Context.Context -> Context.Context
+putCount key count cx = putAttr key (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 count))) cx
 
+-- | Reset counter to zero in context
+resetCount :: Core.Name -> Context.Context -> Context.Context
+resetCount key cx = putAttr key (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))) cx
+
 -- | Set annotation in map
 setAnnotation :: Ord t0 => (t0 -> Maybe t1 -> M.Map t0 t1 -> M.Map t0 t1)
-setAnnotation key val m = (Maps.alter (\_ -> val) key m)
+setAnnotation key val m = Maps.alter (\_ -> val) key m
 
 -- | Set description in annotations
-setDescription :: (Maybe String -> M.Map Core.Name Core.Term -> M.Map Core.Name Core.Term)
-setDescription d = (setAnnotation Constants.key_description (Maybes.map (\arg_ -> (\x -> Core.TermLiteral x) ((\x -> Core.LiteralString x) arg_)) d))
+setDescription :: Maybe String -> M.Map Core.Name Core.Term -> M.Map Core.Name Core.Term
+setDescription d =
+    setAnnotation Constants.key_description (Maybes.map (\arg_ -> (\x -> Core.TermLiteral x) ((\x -> Core.LiteralString x) arg_)) d)
 
 -- | Set term annotation
-setTermAnnotation :: (Core.Name -> Maybe Core.Term -> Core.Term -> Core.Term)
-setTermAnnotation key val term =  
-  let term_ = (Rewriting.deannotateTerm term)
-  in  
-    let anns = (setAnnotation key val (termAnnotationInternal term))
-    in (Logic.ifElse (Maps.null anns) term_ (Core.TermAnnotated (Core.AnnotatedTerm {
-      Core.annotatedTermBody = term_,
-      Core.annotatedTermAnnotation = anns})))
+setTermAnnotation :: Core.Name -> Maybe Core.Term -> Core.Term -> Core.Term
+setTermAnnotation key val term =
 
+      let term_ = Rewriting.deannotateTerm term
+          anns = setAnnotation key val (termAnnotationInternal term)
+      in (Logic.ifElse (Maps.null anns) term_ (Core.TermAnnotated (Core.AnnotatedTerm {
+        Core.annotatedTermBody = term_,
+        Core.annotatedTermAnnotation = anns})))
+
 -- | Set term description
-setTermDescription :: (Maybe String -> Core.Term -> Core.Term)
-setTermDescription d = (setTermAnnotation Constants.key_description (Maybes.map (\s -> Core.TermLiteral (Core.LiteralString s)) d))
+setTermDescription :: Maybe String -> Core.Term -> Core.Term
+setTermDescription d =
+    setTermAnnotation Constants.key_description (Maybes.map (\s -> Core.TermLiteral (Core.LiteralString s)) d)
 
 -- | Set type in annotations
-setType :: (Maybe Core.Type -> M.Map Core.Name Core.Term -> M.Map Core.Name Core.Term)
-setType mt = (setAnnotation Constants.key_type (Maybes.map Core__.type_ mt))
+setType :: Maybe Core.Type -> M.Map Core.Name Core.Term -> M.Map Core.Name Core.Term
+setType mt = setAnnotation Constants.key_type (Maybes.map Core__.type_ mt)
 
 -- | Set type annotation
-setTypeAnnotation :: (Core.Name -> Maybe Core.Term -> Core.Type -> Core.Type)
-setTypeAnnotation key val typ =  
-  let typ_ = (Rewriting.deannotateType typ)
-  in  
-    let anns = (setAnnotation key val (typeAnnotationInternal typ))
-    in (Logic.ifElse (Maps.null anns) typ_ (Core.TypeAnnotated (Core.AnnotatedType {
-      Core.annotatedTypeBody = typ_,
-      Core.annotatedTypeAnnotation = anns})))
+setTypeAnnotation :: Core.Name -> Maybe Core.Term -> Core.Type -> Core.Type
+setTypeAnnotation key val typ =
 
+      let typ_ = Rewriting.deannotateType typ
+          anns = setAnnotation key val (typeAnnotationInternal typ)
+      in (Logic.ifElse (Maps.null anns) typ_ (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = typ_,
+        Core.annotatedTypeAnnotation = anns})))
+
 -- | Set type classes on term
-setTypeClasses :: (M.Map Core.Name (S.Set Classes.TypeClass) -> Core.Term -> Core.Term)
-setTypeClasses m term =  
-  let encodeClass = (\tc -> (\x -> case x of
-          Classes.TypeClassEquality -> (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "equality"),
-              Core.fieldTerm = Core.TermUnit}}))
-          Classes.TypeClassOrdering -> (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "ordering"),
-              Core.fieldTerm = Core.TermUnit}}))) tc)
-  in  
-    let encodePair = (\nameClasses ->  
-            let name = (Pairs.first nameClasses)
-            in  
-              let classes = (Pairs.second nameClasses)
-              in (Core__.name name, (Core.TermSet (Sets.fromList (Lists.map encodeClass (Sets.toList classes))))))
-    in  
-      let encoded = (Logic.ifElse (Maps.null m) Nothing (Just (Core.TermMap (Maps.fromList (Lists.map encodePair (Maps.toList m))))))
+setTypeClasses :: M.Map Core.Name (S.Set Classes.TypeClass) -> Core.Term -> Core.Term
+setTypeClasses m term =
+
+      let encodeClass =
+              \tc -> case tc of
+                Classes.TypeClassEquality -> Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "equality"),
+                    Core.fieldTerm = Core.TermUnit}})
+                Classes.TypeClassOrdering -> Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "ordering"),
+                    Core.fieldTerm = Core.TermUnit}})
+          encodePair =
+                  \nameClasses ->
+                    let name = Pairs.first nameClasses
+                        classes = Pairs.second nameClasses
+                    in (Core__.name name, (Core.TermSet (Sets.fromList (Lists.map encodeClass (Sets.toList classes)))))
+          encoded = Logic.ifElse (Maps.null m) Nothing (Just (Core.TermMap (Maps.fromList (Lists.map encodePair (Maps.toList m)))))
       in (setTermAnnotation Constants.key_classes encoded term)
 
 -- | Set type description
-setTypeDescription :: (Maybe String -> Core.Type -> Core.Type)
-setTypeDescription d = (setTypeAnnotation Constants.key_description (Maybes.map (\arg_ -> (\x -> Core.TermLiteral x) ((\x -> Core.LiteralString x) arg_)) d))
+setTypeDescription :: Maybe String -> Core.Type -> Core.Type
+setTypeDescription d =
+    setTypeAnnotation Constants.key_description (Maybes.map (\arg_ -> (\x -> Core.TermLiteral x) ((\x -> Core.LiteralString x) arg_)) d)
 
 -- | Get internal term annotations
-termAnnotationInternal :: (Core.Term -> M.Map Core.Name Core.Term)
-termAnnotationInternal term =  
-  let getAnn = (\t -> (\x -> case x of
-          Core.TermAnnotated v1 -> (Just v1)
-          _ -> Nothing) t)
-  in (aggregateAnnotations getAnn (\at -> Core.annotatedTermBody at) (\at -> Core.annotatedTermAnnotation at) term)
+termAnnotationInternal :: Core.Term -> M.Map Core.Name Core.Term
+termAnnotationInternal term =
 
+      let getAnn =
+              \t -> case t of
+                Core.TermAnnotated v0 -> Just v0
+                _ -> Nothing
+      in (aggregateAnnotations getAnn (\at -> Core.annotatedTermBody at) (\at -> Core.annotatedTermAnnotation at) term)
+
 -- | Get internal type annotations
-typeAnnotationInternal :: (Core.Type -> M.Map Core.Name Core.Term)
-typeAnnotationInternal typ =  
-  let getAnn = (\t -> (\x -> case x of
-          Core.TypeAnnotated v1 -> (Just v1)
-          _ -> Nothing) t)
-  in (aggregateAnnotations getAnn (\at -> Core.annotatedTypeBody at) (\at -> Core.annotatedTypeAnnotation at) typ)
+typeAnnotationInternal :: Core.Type -> M.Map Core.Name Core.Term
+typeAnnotationInternal typ =
 
+      let getAnn =
+              \t -> case t of
+                Core.TypeAnnotated v0 -> Just v0
+                _ -> Nothing
+      in (aggregateAnnotations getAnn (\at -> Core.annotatedTypeBody at) (\at -> Core.annotatedTypeAnnotation at) typ)
+
 -- | Create a type element with proper annotations
-typeElement :: (Core.Name -> Core.Type -> Core.Binding)
-typeElement name typ =  
-  let schemaTerm = (Core.TermVariable (Core.Name "hydra.core.Type"))
-  in  
-    let dataTerm = (normalizeTermAnnotations (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core__.type_ typ),
-            Core.annotatedTermAnnotation = (Maps.fromList [
-              (Constants.key_type, schemaTerm)])})))
-    in Core.Binding {
-      Core.bindingName = name,
-      Core.bindingTerm = dataTerm,
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-        Core.typeSchemeConstraints = Nothing}))}
+typeElement :: Core.Name -> Core.Type -> Core.Binding
+typeElement name typ =
 
--- | Execute different flows based on flag
-whenFlag :: (Core.Name -> Compute.Flow t0 t1 -> Compute.Flow t0 t1 -> Compute.Flow t0 t1)
-whenFlag flag fthen felse = (Flows.bind (hasFlag flag) (\b -> Logic.ifElse b fthen felse))
+      let schemaTerm = Core.TermVariable (Core.Name "hydra.core.Type")
+          dataTerm =
+                  normalizeTermAnnotations (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core__.type_ typ),
+                    Core.annotatedTermAnnotation = (Maps.fromList [
+                      (Constants.key_type, schemaTerm)])}))
+      in Core.Binding {
+        Core.bindingName = name,
+        Core.bindingTerm = dataTerm,
+        Core.bindingType = (Just (Core.TypeScheme {
+          Core.typeSchemeVariables = [],
+          Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+          Core.typeSchemeConstraints = Nothing}))}
 
--- | Provide an one-indexed, integer-valued 'depth' to a flow, where the depth is the number of nested calls. This is useful for generating variable names while avoiding conflicts between the variables of parents and children. E.g. a variable in an outer case/match statement might be "v1", whereas the variable of another case/match statement inside of the first one becomes "v2". See also nextCount.
-withDepth :: (Core.Name -> (Int -> Compute.Flow t0 t1) -> Compute.Flow t0 t1)
-withDepth key f = (Flows.bind (getCount key) (\count ->  
-  let inc = (Math.add count 1)
-  in (Flows.bind (putCount key inc) (\_ -> Flows.bind (f inc) (\r -> Flows.bind (putCount key count) (\_ -> Flows.pure r))))))
+-- | Execute different branches based on flag (Either version)
+whenFlag :: Context.Context -> Core.Name -> Either (Context.InContext Errors.Error) t0 -> Either (Context.InContext Errors.Error) t0 -> Either (Context.InContext Errors.Error) t0
+whenFlag cx flag ethen eelse = Eithers.bind (hasFlag cx flag) (\b -> Logic.ifElse b ethen eelse)
diff --git a/src/gen-main/haskell/Hydra/Arity.hs b/src/gen-main/haskell/Hydra/Arity.hs
--- a/src/gen-main/haskell/Hydra/Arity.hs
+++ b/src/gen-main/haskell/Hydra/Arity.hs
@@ -16,42 +16,46 @@
 import qualified Data.Set as S
 
 -- | Find the arity (expected number of arguments) of a function
-functionArity :: (Core.Function -> Int)
-functionArity x = case x of
-  Core.FunctionElimination _ -> 1
-  Core.FunctionLambda v1 -> ((\i -> Math.add 1 i) (termArity (Core.lambdaBody v1)))
-  Core.FunctionPrimitive _ -> 42
+functionArity :: Core.Function -> Int
+functionArity x =
+    case x of
+      Core.FunctionElimination _ -> 1
+      Core.FunctionLambda v0 -> (\i -> Math.add 1 i) (termArity (Core.lambdaBody v0))
+      Core.FunctionPrimitive _ -> 42
 
 -- | Find the arity (expected number of arguments) of a primitive constant or function
-primitiveArity :: (Graph.Primitive -> Int)
-primitiveArity arg_ = ((\arg_ -> typeArity (Core.typeSchemeType arg_)) (Graph.primitiveType arg_))
+primitiveArity :: Graph.Primitive -> Int
+primitiveArity arg_ = (\arg_ -> typeArity (Core.typeSchemeType arg_)) (Graph.primitiveType arg_)
 
 -- | Find the arity (expected number of arguments) of a term
-termArity :: (Core.Term -> Int)
-termArity x = case x of
-  Core.TermApplication v1 -> ((\arg_ -> (\xapp -> Math.sub xapp 1) (termArity arg_)) (Core.applicationFunction v1))
-  Core.TermFunction v1 -> (functionArity v1)
-  _ -> 0
+termArity :: Core.Term -> Int
+termArity x =
+    case x of
+      Core.TermApplication v0 -> (\arg_ -> (\xapp -> Math.sub xapp 1) (termArity arg_)) (Core.applicationFunction v0)
+      Core.TermFunction v0 -> functionArity v0
+      _ -> 0
 
 -- | Find the arity (expected number of arguments) of a type
-typeArity :: (Core.Type -> Int)
-typeArity x = case x of
-  Core.TypeAnnotated v1 -> (typeArity (Core.annotatedTypeBody v1))
-  Core.TypeApplication v1 -> (typeArity (Core.applicationTypeFunction v1))
-  Core.TypeForall v1 -> (typeArity (Core.forallTypeBody v1))
-  Core.TypeFunction v1 -> (Math.add 1 (typeArity (Core.functionTypeCodomain v1)))
-  _ -> 0
+typeArity :: Core.Type -> Int
+typeArity x =
+    case x of
+      Core.TypeAnnotated v0 -> typeArity (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> typeArity (Core.applicationTypeFunction v0)
+      Core.TypeForall v0 -> typeArity (Core.forallTypeBody v0)
+      Core.TypeFunction v0 -> Math.add 1 (typeArity (Core.functionTypeCodomain v0))
+      _ -> 0
 
 -- | Find the arity (expected number of arguments) of a type scheme
-typeSchemeArity :: (Core.TypeScheme -> Int)
-typeSchemeArity arg_ = (typeArity (Core.typeSchemeType arg_))
+typeSchemeArity :: Core.TypeScheme -> Int
+typeSchemeArity arg_ = typeArity (Core.typeSchemeType arg_)
 
 -- | Uncurry a type expression into a list of types, turning a function type a -> b into cons a (uncurryType b)
-uncurryType :: (Core.Type -> [Core.Type])
-uncurryType t = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (uncurryType (Core.annotatedTypeBody v1))
-  Core.TypeApplication v1 -> (uncurryType (Core.applicationTypeFunction v1))
-  Core.TypeForall v1 -> (uncurryType (Core.forallTypeBody v1))
-  Core.TypeFunction v1 -> (Lists.cons (Core.functionTypeDomain v1) (uncurryType (Core.functionTypeCodomain v1)))
-  _ -> [
-    t]) t)
+uncurryType :: Core.Type -> [Core.Type]
+uncurryType t =
+    case t of
+      Core.TypeAnnotated v0 -> uncurryType (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> uncurryType (Core.applicationTypeFunction v0)
+      Core.TypeForall v0 -> uncurryType (Core.forallTypeBody v0)
+      Core.TypeFunction v0 -> Lists.cons (Core.functionTypeDomain v0) (uncurryType (Core.functionTypeCodomain v0))
+      _ -> [
+        t]
diff --git a/src/gen-main/haskell/Hydra/Ast.hs b/src/gen-main/haskell/Hydra/Ast.hs
--- a/src/gen-main/haskell/Hydra/Ast.hs
+++ b/src/gen-main/haskell/Hydra/Ast.hs
@@ -13,25 +13,25 @@
 import qualified Data.Set as S
 
 -- | Operator associativity
-data Associativity = 
+data Associativity =
   AssociativityNone  |
   AssociativityLeft  |
   AssociativityRight  |
-  AssociativityBoth 
+  AssociativityBoth
   deriving (Eq, Ord, Read, Show)
 
-_Associativity = (Core.Name "hydra.ast.Associativity")
+_Associativity = Core.Name "hydra.ast.Associativity"
 
-_Associativity_none = (Core.Name "none")
+_Associativity_none = Core.Name "none"
 
-_Associativity_left = (Core.Name "left")
+_Associativity_left = Core.Name "left"
 
-_Associativity_right = (Core.Name "right")
+_Associativity_right = Core.Name "right"
 
-_Associativity_both = (Core.Name "both")
+_Associativity_both = Core.Name "both"
 
 -- | Formatting option for code blocks
-data BlockStyle = 
+data BlockStyle =
   BlockStyle {
     -- | An optional indentation string
     blockStyleIndent :: (Maybe String),
@@ -41,16 +41,16 @@
     blockStyleNewlineAfterContent :: Bool}
   deriving (Eq, Ord, Read, Show)
 
-_BlockStyle = (Core.Name "hydra.ast.BlockStyle")
+_BlockStyle = Core.Name "hydra.ast.BlockStyle"
 
-_BlockStyle_indent = (Core.Name "indent")
+_BlockStyle_indent = Core.Name "indent"
 
-_BlockStyle_newlineBeforeContent = (Core.Name "newlineBeforeContent")
+_BlockStyle_newlineBeforeContent = Core.Name "newlineBeforeContent"
 
-_BlockStyle_newlineAfterContent = (Core.Name "newlineAfterContent")
+_BlockStyle_newlineAfterContent = Core.Name "newlineAfterContent"
 
 -- | An expression enclosed by brackets
-data BracketExpr = 
+data BracketExpr =
   BracketExpr {
     -- | The bracket pair enclosing the expression
     bracketExprBrackets :: Brackets,
@@ -60,16 +60,16 @@
     bracketExprStyle :: BlockStyle}
   deriving (Eq, Ord, Read, Show)
 
-_BracketExpr = (Core.Name "hydra.ast.BracketExpr")
+_BracketExpr = Core.Name "hydra.ast.BracketExpr"
 
-_BracketExpr_brackets = (Core.Name "brackets")
+_BracketExpr_brackets = Core.Name "brackets"
 
-_BracketExpr_enclosed = (Core.Name "enclosed")
+_BracketExpr_enclosed = Core.Name "enclosed"
 
-_BracketExpr_style = (Core.Name "style")
+_BracketExpr_style = Core.Name "style"
 
 -- | Matching open and close bracket symbols
-data Brackets = 
+data Brackets =
   Brackets {
     -- | The opening bracket symbol
     bracketsOpen :: Symbol,
@@ -77,14 +77,14 @@
     bracketsClose :: Symbol}
   deriving (Eq, Ord, Read, Show)
 
-_Brackets = (Core.Name "hydra.ast.Brackets")
+_Brackets = Core.Name "hydra.ast.Brackets"
 
-_Brackets_open = (Core.Name "open")
+_Brackets_open = Core.Name "open"
 
-_Brackets_close = (Core.Name "close")
+_Brackets_close = Core.Name "close"
 
 -- | An abstract expression
-data Expr = 
+data Expr =
   -- | A constant symbol
   ExprConst Symbol |
   -- | An indented expression
@@ -92,21 +92,25 @@
   -- | An operator expression
   ExprOp OpExpr |
   -- | A bracketed expression
-  ExprBrackets BracketExpr
+  ExprBrackets BracketExpr |
+  -- | A sequence of expressions joined by a separator, treated as structural layout (not subject to parenthesization)
+  ExprSeq SeqExpr
   deriving (Eq, Ord, Read, Show)
 
-_Expr = (Core.Name "hydra.ast.Expr")
+_Expr = Core.Name "hydra.ast.Expr"
 
-_Expr_const = (Core.Name "const")
+_Expr_const = Core.Name "const"
 
-_Expr_indent = (Core.Name "indent")
+_Expr_indent = Core.Name "indent"
 
-_Expr_op = (Core.Name "op")
+_Expr_op = Core.Name "op"
 
-_Expr_brackets = (Core.Name "brackets")
+_Expr_brackets = Core.Name "brackets"
 
+_Expr_seq = Core.Name "seq"
+
 -- | An expression indented in a certain style
-data IndentedExpression = 
+data IndentedExpression =
   IndentedExpression {
     -- | The indentation style
     indentedExpressionStyle :: IndentStyle,
@@ -114,28 +118,28 @@
     indentedExpressionExpr :: Expr}
   deriving (Eq, Ord, Read, Show)
 
-_IndentedExpression = (Core.Name "hydra.ast.IndentedExpression")
+_IndentedExpression = Core.Name "hydra.ast.IndentedExpression"
 
-_IndentedExpression_style = (Core.Name "style")
+_IndentedExpression_style = Core.Name "style"
 
-_IndentedExpression_expr = (Core.Name "expr")
+_IndentedExpression_expr = Core.Name "expr"
 
 -- | Any of several indentation styles
-data IndentStyle = 
+data IndentStyle =
   -- | Indent all lines with the given string
   IndentStyleAllLines String |
   -- | Indent only lines after the first with the given string
   IndentStyleSubsequentLines String
   deriving (Eq, Ord, Read, Show)
 
-_IndentStyle = (Core.Name "hydra.ast.IndentStyle")
+_IndentStyle = Core.Name "hydra.ast.IndentStyle"
 
-_IndentStyle_allLines = (Core.Name "allLines")
+_IndentStyle_allLines = Core.Name "allLines"
 
-_IndentStyle_subsequentLines = (Core.Name "subsequentLines")
+_IndentStyle_subsequentLines = Core.Name "subsequentLines"
 
 -- | An operator symbol
-data Op = 
+data Op =
   Op {
     -- | The operator symbol
     opSymbol :: Symbol,
@@ -147,18 +151,18 @@
     opAssociativity :: Associativity}
   deriving (Eq, Ord, Read, Show)
 
-_Op = (Core.Name "hydra.ast.Op")
+_Op = Core.Name "hydra.ast.Op"
 
-_Op_symbol = (Core.Name "symbol")
+_Op_symbol = Core.Name "symbol"
 
-_Op_padding = (Core.Name "padding")
+_Op_padding = Core.Name "padding"
 
-_Op_precedence = (Core.Name "precedence")
+_Op_precedence = Core.Name "precedence"
 
-_Op_associativity = (Core.Name "associativity")
+_Op_associativity = Core.Name "associativity"
 
 -- | An operator expression
-data OpExpr = 
+data OpExpr =
   OpExpr {
     -- | The operator
     opExprOp :: Op,
@@ -168,16 +172,16 @@
     opExprRhs :: Expr}
   deriving (Eq, Ord, Read, Show)
 
-_OpExpr = (Core.Name "hydra.ast.OpExpr")
+_OpExpr = Core.Name "hydra.ast.OpExpr"
 
-_OpExpr_op = (Core.Name "op")
+_OpExpr_op = Core.Name "op"
 
-_OpExpr_lhs = (Core.Name "lhs")
+_OpExpr_lhs = Core.Name "lhs"
 
-_OpExpr_rhs = (Core.Name "rhs")
+_OpExpr_rhs = Core.Name "rhs"
 
 -- | Left and right padding for an operator
-data Padding = 
+data Padding =
   Padding {
     -- | Padding to the left of the operator
     paddingLeft :: Ws,
@@ -185,30 +189,45 @@
     paddingRight :: Ws}
   deriving (Eq, Ord, Read, Show)
 
-_Padding = (Core.Name "hydra.ast.Padding")
+_Padding = Core.Name "hydra.ast.Padding"
 
-_Padding_left = (Core.Name "left")
+_Padding_left = Core.Name "left"
 
-_Padding_right = (Core.Name "right")
+_Padding_right = Core.Name "right"
 
 -- | Operator precedence
-newtype Precedence = 
+newtype Precedence =
   Precedence {
     unPrecedence :: Int}
   deriving (Eq, Ord, Read, Show)
 
-_Precedence = (Core.Name "hydra.ast.Precedence")
+_Precedence = Core.Name "hydra.ast.Precedence"
 
+-- | A sequence of expressions joined by a separator operator. Unlike OpExpr, parenthesize ignores SeqExpr boundaries.
+data SeqExpr =
+  SeqExpr {
+    -- | The separator operator
+    seqExprOp :: Op,
+    -- | The expressions to join
+    seqExprElements :: [Expr]}
+  deriving (Eq, Ord, Read, Show)
+
+_SeqExpr = Core.Name "hydra.ast.SeqExpr"
+
+_SeqExpr_op = Core.Name "op"
+
+_SeqExpr_elements = Core.Name "elements"
+
 -- | Any symbol
-newtype Symbol = 
+newtype Symbol =
   Symbol {
     unSymbol :: String}
   deriving (Eq, Ord, Read, Show)
 
-_Symbol = (Core.Name "hydra.ast.Symbol")
+_Symbol = Core.Name "hydra.ast.Symbol"
 
 -- | One of several classes of whitespace
-data Ws = 
+data Ws =
   -- | No whitespace
   WsNone  |
   -- | A single space
@@ -218,17 +237,17 @@
   -- | A line break followed by indentation
   WsBreakAndIndent String |
   -- | Two line breaks
-  WsDoubleBreak 
+  WsDoubleBreak
   deriving (Eq, Ord, Read, Show)
 
-_Ws = (Core.Name "hydra.ast.Ws")
+_Ws = Core.Name "hydra.ast.Ws"
 
-_Ws_none = (Core.Name "none")
+_Ws_none = Core.Name "none"
 
-_Ws_space = (Core.Name "space")
+_Ws_space = Core.Name "space"
 
-_Ws_break = (Core.Name "break")
+_Ws_break = Core.Name "break"
 
-_Ws_breakAndIndent = (Core.Name "breakAndIndent")
+_Ws_breakAndIndent = Core.Name "breakAndIndent"
 
-_Ws_doubleBreak = (Core.Name "doubleBreak")
+_Ws_doubleBreak = Core.Name "doubleBreak"
diff --git a/src/gen-main/haskell/Hydra/Checking.hs b/src/gen-main/haskell/Hydra/Checking.hs
--- a/src/gen-main/haskell/Hydra/Checking.hs
+++ b/src/gen-main/haskell/Hydra/Checking.hs
@@ -5,509 +5,702 @@
 module Hydra.Checking where
 
 import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Constants as Constants
-import qualified Hydra.Core as Core
-import qualified Hydra.Extract.Core as Core_
-import qualified Hydra.Formatting as Formatting
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Reflect as Reflect
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Show.Core as Core__
-import qualified Hydra.Show.Meta as Meta
-import qualified Hydra.Substitution as Substitution
-import qualified Hydra.Typing as Typing
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-allEqual :: Eq t0 => ([t0] -> Bool)
-allEqual els = (Logic.ifElse (Lists.null els) True (Lists.foldl (\b -> \t -> Logic.and b (Equality.equal t (Lists.head els))) True (Lists.tail els)))
-
--- | Apply type arguments to a type, substituting forall-bound variables
-applyTypeArgumentsToType :: (Typing.TypeContext -> [Core.Type] -> Core.Type -> Compute.Flow t0 Core.Type)
-applyTypeArgumentsToType tx typeArgs t =  
-  let nonnull = ((\x -> case x of
-          Core.TypeForall v1 ->  
-            let v = (Core.forallTypeParameter v1)
-            in  
-              let tbody = (Core.forallTypeBody v1)
-              in (applyTypeArgumentsToType tx (Lists.tail typeArgs) (Substitution.substInType (Typing.TypeSubst (Maps.singleton v (Lists.head typeArgs))) tbody))
-          _ -> (Flows.fail (Strings.cat [
-            "not a forall type: ",
-            (Core__.type_ t),
-            ". Trying to apply ",
-            (Literals.showInt32 (Lists.length typeArgs)),
-            " type args: ",
-            (Formatting.showList Core__.type_ typeArgs),
-            ". Context has vars: {",
-            (Strings.intercalate ", " (Lists.map Core.unName (Maps.keys (Typing.typeContextTypes tx)))),
-            "}"]))) t)
-  in (Logic.ifElse (Lists.null typeArgs) (Flows.bind (checkTypeVariables tx t) (\_ -> Flows.pure t)) nonnull)
-
--- | Check that a term has no unbound type variables
-checkForUnboundTypeVariables :: (Typing.InferenceContext -> Core.Term -> Compute.Flow t0 ())
-checkForUnboundTypeVariables cx term0 =  
-  let svars = (Sets.fromList (Maps.keys (Typing.inferenceContextSchemaTypes cx)))
-  in  
-    let checkRecursive = (\vars -> \trace -> \lbinding -> \term ->  
-            let recurse = (checkRecursive vars trace lbinding)
-            in  
-              let dflt = (Flows.bind (Flows.mapList recurse (Rewriting.subterms term)) (\_ -> Flows.pure ()))
-              in  
-                let check = (\typ ->  
-                        let freevars = (Rewriting.freeVariablesInType typ)
-                        in  
-                          let badvars = (Sets.difference (Sets.difference freevars vars) svars)
-                          in (Logic.ifElse (Sets.null badvars) (Flows.pure ()) (Flows.fail (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "unbound type variables: {" (Strings.intercalate ", " (Lists.map Core.unName (Sets.toList badvars)))) "} in type ") (Core__.type_ typ)) " at path: ") (Strings.intercalate " >> " (Lists.reverse trace))) (Maybes.maybe "none" (\binding -> Strings.cat2 (Strings.cat2 (Strings.cat2 ". bound term = " (Core__.term (Core.bindingTerm binding))) ". bound type = ") (Maybes.maybe "none" Core__.typeScheme (Core.bindingType binding))) lbinding)))))
-                in  
-                  let checkOptional = (\m -> Flows.bind (Flows.mapMaybe check m) (\_ -> Flows.pure ()))
-                  in  
-                    let checkOptionalList = (\ml -> Flows.bind (Flows.mapMaybe (\l -> Flows.mapList check l) ml) (\_ -> Flows.pure ()))
-                    in ((\x -> case x of
-                      Core.TermFunction v1 -> ((\x -> case x of
-                        Core.FunctionElimination _ -> dflt
-                        Core.FunctionLambda v2 -> (Flows.bind (checkOptional (Core.lambdaDomain v2)) (\_ -> recurse (Core.lambdaBody v2)))
-                        _ -> dflt) v1)
-                      Core.TermLet v1 ->  
-                        let forBinding = (\b ->  
-                                let bterm = (Core.bindingTerm b)
-                                in  
-                                  let newVars = (Maybes.maybe vars (\ts -> Sets.union vars (Sets.fromList (Core.typeSchemeVariables ts))) (Core.bindingType b))
-                                  in  
-                                    let newTrace = (Lists.cons (Core.unName (Core.bindingName b)) trace)
-                                    in (checkRecursive newVars newTrace (Just b) bterm))
-                        in (Flows.bind (Flows.mapList forBinding (Core.letBindings v1)) (\_ -> recurse (Core.letBody v1)))
-                      Core.TermTypeApplication v1 -> (Flows.bind (check (Core.typeApplicationTermType v1)) (\_ -> recurse (Core.typeApplicationTermBody v1)))
-                      Core.TermTypeLambda v1 -> (Flows.bind (check (Core.TypeVariable (Core.typeLambdaParameter v1))) (\_ -> recurse (Core.typeLambdaBody v1)))
-                      _ -> dflt) term))
-    in (checkRecursive Sets.empty [
-      "top level"] Nothing term0)
-
--- | Check that a nominal type is applied to the correct number of type arguments
-checkNominalApplication :: (Typing.TypeContext -> Core.Name -> [Core.Type] -> Compute.Flow t0 ())
-checkNominalApplication tx tname typeArgs = (Flows.bind (Schemas.requireSchemaType (Typing.typeContextInferenceContext tx) tname) (\schemaType ->  
-  let vars = (Core.typeSchemeVariables schemaType)
-  in  
-    let body = (Core.typeSchemeType schemaType)
-    in  
-      let varslen = (Lists.length vars)
-      in  
-        let argslen = (Lists.length typeArgs)
-        in (Logic.ifElse (Equality.equal varslen argslen) (Flows.pure ()) (Flows.fail (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "nominal type " (Core.unName tname)) " applied to the wrong number of type arguments: ") "(expected ") (Literals.showInt32 varslen)) " arguments, got ") (Literals.showInt32 argslen)) "): ") (Formatting.showList Core__.type_ typeArgs))))))
-
--- | Ensure all types in a list are equal and return the common type
-checkSameType :: (Typing.TypeContext -> String -> [Core.Type] -> Compute.Flow t0 Core.Type)
-checkSameType tx desc types = (Logic.ifElse (typesAllEffectivelyEqual tx types) (Flows.pure (Lists.head types)) (Flows.fail (Strings.cat [
-  "unequal types ",
-  (Formatting.showList Core__.type_ types),
-  " in ",
-  desc])))
-
--- | Check that a term has the expected type
-checkType :: (Typing.TypeContext -> Core.Term -> Core.Type -> Compute.Flow t0 ())
-checkType tx term typ =  
-  let cx = (Typing.typeContextInferenceContext tx)
-  in  
-    let vars = (Typing.typeContextTypeVariables tx)
-    in (Logic.ifElse Constants.debugInference (Flows.bind (typeOf tx [] term) (\t0 -> Logic.ifElse (typesEffectivelyEqual tx t0 typ) (Flows.pure ()) (Flows.fail (Strings.cat [
-      "type checking failed: expected ",
-      (Core__.type_ typ),
-      " but found ",
-      (Core__.type_ t0)])))) (Flows.pure ()))
-
--- | Sanity-check a type substitution arising from unification. Specifically, check that schema types have not been inappropriately unified with type variables inferred from terms.
-checkTypeSubst :: (Typing.InferenceContext -> Typing.TypeSubst -> Compute.Flow t0 Typing.TypeSubst)
-checkTypeSubst cx subst =  
-  let s = (Typing.unTypeSubst subst)
-  in  
-    let vars = (Sets.fromList (Maps.keys s))
-    in  
-      let suspectVars = (Sets.intersection vars (Sets.fromList (Maps.keys (Typing.inferenceContextSchemaTypes cx))))
-      in  
-        let isNominal = (\ts -> (\x -> case x of
-                Core.TypeRecord _ -> True
-                Core.TypeUnion _ -> True
-                Core.TypeWrap _ -> True
-                _ -> False) (Rewriting.deannotateType (Core.typeSchemeType ts)))
-        in  
-          let badVars = (Sets.fromList (Lists.filter (\v -> Maybes.maybe False isNominal (Lexical.dereferenceSchemaType v (Typing.inferenceContextSchemaTypes cx))) (Sets.toList suspectVars)))
-          in  
-            let badPairs = (Lists.filter (\p -> Sets.member (Pairs.first p) badVars) (Maps.toList s))
-            in  
-              let printPair = (\p -> Strings.cat2 (Strings.cat2 (Core.unName (Pairs.first p)) " --> ") (Core__.type_ (Pairs.second p)))
-              in (Logic.ifElse (Sets.null badVars) (Flows.pure subst) (Flows.fail (Strings.cat2 (Strings.cat2 "Schema type(s) incorrectly unified: {" (Strings.intercalate ", " (Lists.map printPair badPairs))) "}")))
-
--- | Check that all type variables in a type are bound. NOTE: This check is currently disabled to allow phantom type variables from polymorphic instantiation to pass through. The proper fix is to ensure `typeOf` doesn't create fresh variables for post-inference code.
-checkTypeVariables :: (t0 -> t1 -> Compute.Flow t2 ())
-checkTypeVariables _tx _typ = (Flows.pure ())
-
--- | Convert an inference context to a type environment by converting type schemes to System F types
-toFContext :: (Typing.InferenceContext -> M.Map Core.Name Core.Type)
-toFContext cx = (Maps.map Schemas.typeSchemeToFType (Typing.inferenceContextDataTypes cx))
-
--- | Check whether two lists of types are effectively equal, disregarding type aliases
-typeListsEffectivelyEqual :: (Typing.TypeContext -> [Core.Type] -> [Core.Type] -> Bool)
-typeListsEffectivelyEqual tx tlist1 tlist2 = (Logic.ifElse (Equality.equal (Lists.length tlist1) (Lists.length tlist2)) (Lists.foldl Logic.and True (Lists.zipWith (typesEffectivelyEqual tx) tlist1 tlist2)) False)
-
--- | Given a type context, reconstruct the type of a System F term
-typeOf :: (Typing.TypeContext -> [Core.Type] -> Core.Term -> Compute.Flow t0 Core.Type)
-typeOf tx typeArgs term =  
-  let check = ((\x -> case x of
-          Core.TermAnnotated v1 -> (typeOfAnnotatedTerm tx typeArgs v1)
-          Core.TermApplication v1 -> (typeOfApplication tx typeArgs v1)
-          Core.TermEither v1 -> (typeOfEither tx typeArgs v1)
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionElimination v2 -> ((\x -> case x of
-              Core.EliminationRecord v3 -> (typeOfProjection tx typeArgs v3)
-              Core.EliminationUnion v3 -> (typeOfCaseStatement tx typeArgs v3)
-              Core.EliminationWrap v3 -> (typeOfUnwrap tx typeArgs v3)) v2)
-            Core.FunctionLambda v2 -> (typeOfLambda tx typeArgs v2)
-            Core.FunctionPrimitive v2 -> (typeOfPrimitive tx typeArgs v2)) v1)
-          Core.TermLet v1 -> (typeOfLet tx typeArgs v1)
-          Core.TermList v1 -> (typeOfList tx typeArgs v1)
-          Core.TermLiteral v1 -> (typeOfLiteral tx typeArgs v1)
-          Core.TermMap v1 -> (typeOfMap tx typeArgs v1)
-          Core.TermMaybe v1 -> (typeOfMaybe tx typeArgs v1)
-          Core.TermPair v1 -> (typeOfPair tx typeArgs v1)
-          Core.TermRecord v1 -> (typeOfRecord tx typeArgs v1)
-          Core.TermSet v1 -> (typeOfSet tx typeArgs v1)
-          Core.TermTypeApplication v1 -> (typeOfTypeApplication tx typeArgs v1)
-          Core.TermTypeLambda v1 -> (typeOfTypeLambda tx typeArgs v1)
-          Core.TermUnion v1 -> (typeOfInjection tx typeArgs v1)
-          Core.TermUnit -> (typeOfUnit tx typeArgs)
-          Core.TermVariable v1 -> (typeOfVariable tx typeArgs v1)
-          Core.TermWrap v1 -> (typeOfWrappedTerm tx typeArgs v1)
-          _ -> (Flows.fail (Strings.cat [
-            "unsupported term variant in typeOf: ",
-            (Meta.termVariant (Reflect.termVariant term))]))) term)
-  in (Monads.withTrace "typeOf" check)
-
--- | Reconstruct the type of an annotated term
-typeOfAnnotatedTerm :: (Typing.TypeContext -> [Core.Type] -> Core.AnnotatedTerm -> Compute.Flow t0 Core.Type)
-typeOfAnnotatedTerm tx typeArgs at = (typeOf tx typeArgs (Core.annotatedTermBody at))
-
--- | Reconstruct the type of an application term
-typeOfApplication :: (Typing.TypeContext -> [Core.Type] -> Core.Application -> Compute.Flow t0 Core.Type)
-typeOfApplication tx typeArgs app =  
-  let fun = (Core.applicationFunction app)
-  in  
-    let arg = (Core.applicationArgument app)
-    in  
-      let tryType = (\tfun -> \targ -> (\x -> case x of
-              Core.TypeForall v1 -> (tryType (Core.forallTypeBody v1) targ)
-              Core.TypeFunction v1 ->  
-                let dom = (Core.functionTypeDomain v1)
-                in  
-                  let cod = (Core.functionTypeCodomain v1)
-                  in (Logic.ifElse (typesEffectivelyEqual tx dom targ) (Flows.pure cod) (Flows.fail (Strings.cat [
-                    "in application, expected ",
-                    (Core__.type_ dom),
-                    " but found ",
-                    (Core__.type_ targ)])))
-              Core.TypeVariable _ -> (Flows.map (\x -> Core.TypeVariable x) Schemas.freshName)
-              _ -> (Flows.fail (Strings.cat [
-                "left hand side of application (",
-                (Core__.term fun),
-                ") is not function-typed (",
-                (Core__.type_ tfun),
-                ")",
-                ". types: ",
-                (Strings.intercalate ", " (Lists.map (\p -> Strings.cat [
-                  Core.unName (Pairs.first p),
-                  ": ",
-                  (Core__.type_ (Pairs.second p))]) (Maps.toList (Typing.typeContextTypes tx))))]))) tfun)
-      in (Flows.bind (typeOf tx [] fun) (\tfun -> Flows.bind (typeOf tx [] arg) (\targ -> Flows.bind (tryType tfun targ) (\t -> applyTypeArgumentsToType tx typeArgs t))))
-
--- | Reconstruct the type of a case statement
-typeOfCaseStatement :: (Typing.TypeContext -> [Core.Type] -> Core.CaseStatement -> Compute.Flow t0 Core.Type)
-typeOfCaseStatement tx typeArgs cs =  
-  let tname = (Core.caseStatementTypeName cs)
-  in  
-    let dflt = (Core.caseStatementDefault cs)
-    in  
-      let cases = (Core.caseStatementCases cs)
-      in  
-        let cterms = (Lists.map Core.fieldTerm cases)
-        in (Flows.bind (Flows.mapMaybe (\e -> typeOf tx [] e) dflt) (\tdflt -> Flows.bind (Flows.mapList (\e -> typeOf tx [] e) cterms) (\tcterms -> Flows.bind (Flows.mapList (\t -> Flows.map Core.functionTypeCodomain (Core_.functionType t)) tcterms) (\fcods ->  
-          let cods = (Maybes.cat (Lists.cons tdflt (Lists.map Maybes.pure fcods)))
-          in (Flows.bind (checkSameType tx "case branches" cods) (\cod -> Flows.pure (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Schemas.nominalApplication tname typeArgs),
-            Core.functionTypeCodomain = cod}))))))))
-
--- | Reconstruct the type of an either value
-typeOfEither :: (Typing.TypeContext -> [Core.Type] -> Either Core.Term Core.Term -> Compute.Flow t0 Core.Type)
-typeOfEither tx typeArgs et =  
-  let checkLength =  
-          let n = (Lists.length typeArgs)
-          in (Logic.ifElse (Equality.equal n 2) (Flows.pure ()) (Flows.fail (Strings.cat2 "either type requires 2 type arguments, got " (Literals.showInt32 n))))
-  in (Flows.bind checkLength (\_ -> Eithers.either (\leftTerm -> Flows.bind (typeOf tx [] leftTerm) (\leftType -> Flows.bind (checkTypeVariables tx leftType) (\_ -> Flows.pure (Core.TypeEither (Core.EitherType {
-    Core.eitherTypeLeft = leftType,
-    Core.eitherTypeRight = (Lists.at 1 typeArgs)}))))) (\rightTerm -> Flows.bind (typeOf tx [] rightTerm) (\rightType -> Flows.bind (checkTypeVariables tx rightType) (\_ -> Flows.pure (Core.TypeEither (Core.EitherType {
-    Core.eitherTypeLeft = (Lists.at 0 typeArgs),
-    Core.eitherTypeRight = rightType}))))) et))
-
--- | Reconstruct the type of a union injection
-typeOfInjection :: (Typing.TypeContext -> [Core.Type] -> Core.Injection -> Compute.Flow t0 Core.Type)
-typeOfInjection tx typeArgs injection =  
-  let tname = (Core.injectionTypeName injection)
-  in  
-    let field = (Core.injectionField injection)
-    in  
-      let fname = (Core.fieldName field)
-      in  
-        let fterm = (Core.fieldTerm field)
-        in (Flows.bind (Schemas.requireSchemaType (Typing.typeContextInferenceContext tx) tname) (\schemaType ->  
-          let svars = (Core.typeSchemeVariables schemaType)
-          in  
-            let sbody = (Core.typeSchemeType schemaType)
-            in (Flows.bind (Core_.unionType tname sbody) (\sfields -> Flows.bind (Schemas.findFieldType fname sfields) (\ftyp -> Flows.pure (Schemas.nominalApplication tname typeArgs))))))
-
--- | Reconstruct the type of a lambda function
-typeOfLambda :: (Typing.TypeContext -> [Core.Type] -> Core.Lambda -> Compute.Flow t0 Core.Type)
-typeOfLambda tx typeArgs l =  
-  let v = (Core.lambdaParameter l)
-  in  
-    let mdom = (Core.lambdaDomain l)
-    in  
-      let body = (Core.lambdaBody l)
-      in (Flows.bind (Maybes.maybe (Flows.fail "untyped lambda") (\dom -> Flows.bind (checkTypeVariables tx dom) (\_ ->  
-        let types2 = (Maps.insert v dom (Typing.typeContextTypes tx))
-        in (Flows.bind (typeOf (Typing.TypeContext {
-          Typing.typeContextTypes = types2,
-          Typing.typeContextMetadata = (Typing.typeContextMetadata tx),
-          Typing.typeContextTypeVariables = (Typing.typeContextTypeVariables tx),
-          Typing.typeContextLambdaVariables = (Typing.typeContextLambdaVariables tx),
-          Typing.typeContextLetVariables = (Typing.typeContextLetVariables tx),
-          Typing.typeContextInferenceContext = (Typing.typeContextInferenceContext tx)}) [] body) (\cod -> Flows.bind (checkTypeVariables tx cod) (\_ -> Flows.pure (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = dom,
-          Core.functionTypeCodomain = cod}))))))) mdom) (\tbody -> applyTypeArgumentsToType tx typeArgs tbody))
-
--- | Reconstruct the type of a let binding
-typeOfLet :: (Typing.TypeContext -> [Core.Type] -> Core.Let -> Compute.Flow t0 Core.Type)
-typeOfLet tx typeArgs letTerm =  
-  let bs = (Core.letBindings letTerm)
-  in  
-    let body = (Core.letBody letTerm)
-    in  
-      let bnames = (Lists.map Core.bindingName bs)
-      in  
-        let bterms = (Lists.map Core.bindingTerm bs)
-        in  
-          let bindingType = (\b -> Maybes.maybe (Flows.fail (Strings.cat [
-                  "untyped let binding: ",
-                  (Core__.binding b)])) (\ts -> Flows.pure (Schemas.typeSchemeToFType ts)) (Core.bindingType b))
-          in (Flows.bind (Flows.mapList bindingType bs) (\btypes ->  
-            let tx2 = Typing.TypeContext {
-                    Typing.typeContextTypes = (Maps.union (Maps.fromList (Lists.zip bnames btypes)) (Typing.typeContextTypes tx)),
-                    Typing.typeContextMetadata = (Typing.typeContextMetadata tx),
-                    Typing.typeContextTypeVariables = (Typing.typeContextTypeVariables tx),
-                    Typing.typeContextLambdaVariables = (Typing.typeContextLambdaVariables tx),
-                    Typing.typeContextLetVariables = (Typing.typeContextLetVariables tx),
-                    Typing.typeContextInferenceContext = (Typing.typeContextInferenceContext tx)}
-            in (Flows.bind (typeOf tx2 [] body) (\t -> applyTypeArgumentsToType tx typeArgs t))))
-
--- | Reconstruct the type of a list
-typeOfList :: (Typing.TypeContext -> [Core.Type] -> [Core.Term] -> Compute.Flow t0 Core.Type)
-typeOfList tx typeArgs els = (Logic.ifElse (Lists.null els) (Logic.ifElse (Equality.equal (Lists.length typeArgs) 1) (Flows.pure (Core.TypeList (Lists.head typeArgs))) (Flows.fail "list type applied to more or less than one argument")) (Flows.bind (Flows.mapList (typeOf tx []) els) (\eltypes -> Flows.bind (checkSameType tx "list elements" eltypes) (\unifiedType -> Flows.bind (checkTypeVariables tx unifiedType) (\_ -> Flows.pure (Core.TypeList unifiedType))))))
-
--- | Reconstruct the type of a literal
-typeOfLiteral :: (Typing.TypeContext -> [Core.Type] -> Core.Literal -> Compute.Flow t0 Core.Type)
-typeOfLiteral tx typeArgs lit =  
-  let t = (Core.TypeLiteral (Reflect.literalType lit))
-  in (applyTypeArgumentsToType tx typeArgs t)
-
--- | Reconstruct the type of a map
-typeOfMap :: (Typing.TypeContext -> [Core.Type] -> M.Map Core.Term Core.Term -> Compute.Flow t0 Core.Type)
-typeOfMap tx typeArgs m =  
-  let nonnull =  
-          let pairs = (Maps.toList m)
-          in (Flows.bind (Flows.bind (Flows.mapList (typeOf tx []) (Lists.map Pairs.first pairs)) (checkSameType tx "map keys")) (\kt -> Flows.bind (Flows.bind (Flows.mapList (typeOf tx []) (Lists.map Pairs.second pairs)) (checkSameType tx "map values")) (\vt -> Flows.bind (checkTypeVariables tx kt) (\_ -> Flows.bind (checkTypeVariables tx vt) (\_ -> applyTypeArgumentsToType tx typeArgs (Core.TypeMap (Core.MapType {
-            Core.mapTypeKeys = kt,
-            Core.mapTypeValues = vt})))))))
-  in (Logic.ifElse (Maps.null m) (Logic.ifElse (Equality.equal (Lists.length typeArgs) 2) (Flows.pure (Core.TypeMap (Core.MapType {
-    Core.mapTypeKeys = (Lists.at 0 typeArgs),
-    Core.mapTypeValues = (Lists.at 1 typeArgs)}))) (Flows.fail "map type applied to more or less than two arguments")) nonnull)
-
--- | Reconstruct the type of an optional value
-typeOfMaybe :: (Typing.TypeContext -> [Core.Type] -> Maybe Core.Term -> Compute.Flow t0 Core.Type)
-typeOfMaybe tx typeArgs mt =  
-  let forNothing =  
-          let n = (Lists.length typeArgs)
-          in (Logic.ifElse (Equality.equal n 1) (Flows.pure (Core.TypeMaybe (Lists.head typeArgs))) (Flows.fail (Strings.cat2 (Strings.cat2 "optional type applied to " (Literals.showInt32 n)) " argument(s). Expected 1.")))
-  in  
-    let forJust = (\term -> Flows.bind (Flows.bind (typeOf tx [] term) (\termType -> Flows.bind (checkTypeVariables tx termType) (\_ -> Flows.pure (Core.TypeMaybe termType)))) (\t -> applyTypeArgumentsToType tx typeArgs t))
-    in (Maybes.maybe forNothing forJust mt)
-
--- | Reconstruct the type of a pair
-typeOfPair :: (Typing.TypeContext -> [Core.Type] -> (Core.Term, Core.Term) -> Compute.Flow t0 Core.Type)
-typeOfPair tx typeArgs p =  
-  let checkLength =  
-          let n = (Lists.length typeArgs)
-          in (Logic.ifElse (Equality.equal n 2) (Flows.pure ()) (Flows.fail (Strings.cat2 "pair type requires 2 type arguments, got " (Literals.showInt32 n))))
-  in (Flows.bind checkLength (\_ ->  
-    let pairFst = (Pairs.first p)
-    in  
-      let pairSnd = (Pairs.second p)
-      in (Flows.bind (typeOf tx [] pairFst) (\firstType -> Flows.bind (checkTypeVariables tx firstType) (\_ -> Flows.bind (typeOf tx [] pairSnd) (\secondType -> Flows.bind (checkTypeVariables tx secondType) (\_ -> Flows.pure (Core.TypePair (Core.PairType {
-        Core.pairTypeFirst = firstType,
-        Core.pairTypeSecond = secondType})))))))))
-
--- | Reconstruct the type of a primitive function
-typeOfPrimitive :: (Typing.TypeContext -> [Core.Type] -> Core.Name -> Compute.Flow t0 Core.Type)
-typeOfPrimitive tx typeArgs name = (Flows.bind (Maybes.maybe (Flows.fail (Strings.cat [
-  "no such primitive: ",
-  (Core.unName name)])) Schemas.instantiateTypeScheme (Maps.lookup name (Typing.inferenceContextPrimitiveTypes (Typing.typeContextInferenceContext tx)))) (\ts ->  
-  let t = (Schemas.typeSchemeToFType ts)
-  in (applyTypeArgumentsToType tx typeArgs t)))
-
--- | Reconstruct the type of a record projection
-typeOfProjection :: (Typing.TypeContext -> [Core.Type] -> Core.Projection -> Compute.Flow t0 Core.Type)
-typeOfProjection tx typeArgs p =  
-  let tname = (Core.projectionTypeName p)
-  in  
-    let fname = (Core.projectionField p)
-    in (Flows.bind (Schemas.requireSchemaType (Typing.typeContextInferenceContext tx) tname) (\schemaType ->  
-      let svars = (Core.typeSchemeVariables schemaType)
-      in  
-        let sbody = (Core.typeSchemeType schemaType)
-        in (Flows.bind (Core_.recordType tname sbody) (\sfields -> Flows.bind (Schemas.findFieldType fname sfields) (\ftyp ->  
-          let subst = (Typing.TypeSubst (Maps.fromList (Lists.zip svars typeArgs)))
-          in  
-            let sftyp = (Substitution.substInType subst ftyp)
-            in (Flows.pure (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Schemas.nominalApplication tname typeArgs),
-              Core.functionTypeCodomain = sftyp}))))))))
-
--- | Reconstruct the type of a record
-typeOfRecord :: (Typing.TypeContext -> [Core.Type] -> Core.Record -> Compute.Flow t0 Core.Type)
-typeOfRecord tx typeArgs record =  
-  let tname = (Core.recordTypeName record)
-  in  
-    let fields = (Core.recordFields record)
-    in (Flows.bind (Flows.mapList (typeOf tx []) (Lists.map Core.fieldTerm fields)) (\ftypes -> Flows.bind (Flows.mapList (checkTypeVariables tx) ftypes) (\_ -> Flows.pure (Schemas.nominalApplication tname typeArgs))))
-
--- | Reconstruct the type of a set
-typeOfSet :: (Typing.TypeContext -> [Core.Type] -> S.Set Core.Term -> Compute.Flow t0 Core.Type)
-typeOfSet tx typeArgs els = (Logic.ifElse (Sets.null els) (Logic.ifElse (Equality.equal (Lists.length typeArgs) 1) (Flows.pure (Core.TypeSet (Lists.head typeArgs))) (Flows.fail "set type applied to more or less than one argument")) (Flows.bind (Flows.mapList (typeOf tx []) (Sets.toList els)) (\eltypes -> Flows.bind (checkSameType tx "set elements" eltypes) (\unifiedType -> Flows.bind (checkTypeVariables tx unifiedType) (\_ -> Flows.pure (Core.TypeSet unifiedType))))))
-
--- | Reconstruct the type of a type application term
-typeOfTypeApplication :: (Typing.TypeContext -> [Core.Type] -> Core.TypeApplicationTerm -> Compute.Flow t0 Core.Type)
-typeOfTypeApplication tx typeArgs tyapp =  
-  let body = (Core.typeApplicationTermBody tyapp)
-  in  
-    let t = (Core.typeApplicationTermType tyapp)
-    in (typeOf tx (Lists.cons t typeArgs) body)
-
--- | Reconstruct the type of a type lambda (type abstraction) term
-typeOfTypeLambda :: (Typing.TypeContext -> [Core.Type] -> Core.TypeLambda -> Compute.Flow t0 Core.Type)
-typeOfTypeLambda tx typeArgs tl =  
-  let v = (Core.typeLambdaParameter tl)
-  in  
-    let body = (Core.typeLambdaBody tl)
-    in  
-      let vars = (Typing.typeContextTypeVariables tx)
-      in  
-        let tx2 = Typing.TypeContext {
-                Typing.typeContextTypes = (Typing.typeContextTypes tx),
-                Typing.typeContextMetadata = (Typing.typeContextMetadata tx),
-                Typing.typeContextTypeVariables = (Sets.insert v vars),
-                Typing.typeContextLambdaVariables = (Typing.typeContextLambdaVariables tx),
-                Typing.typeContextLetVariables = (Typing.typeContextLetVariables tx),
-                Typing.typeContextInferenceContext = (Typing.typeContextInferenceContext tx)}
-        in (Flows.bind (typeOf tx2 [] body) (\t1 -> Flows.bind (checkTypeVariables tx2 t1) (\_ -> applyTypeArgumentsToType tx typeArgs (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = v,
-          Core.forallTypeBody = t1})))))
-
--- | Reconstruct the type of the unit term
-typeOfUnit :: (Typing.TypeContext -> [Core.Type] -> Compute.Flow t0 Core.Type)
-typeOfUnit tx typeArgs = (applyTypeArgumentsToType tx typeArgs Core.TypeUnit)
-
--- | Reconstruct the type of an unwrap operation
-typeOfUnwrap :: (Typing.TypeContext -> [Core.Type] -> Core.Name -> Compute.Flow t0 Core.Type)
-typeOfUnwrap tx typeArgs tname = (Flows.bind (Schemas.requireSchemaType (Typing.typeContextInferenceContext tx) tname) (\schemaType ->  
-  let svars = (Core.typeSchemeVariables schemaType)
-  in  
-    let sbody = (Core.typeSchemeType schemaType)
-    in (Flows.bind (Core_.wrappedType tname sbody) (\wrapped ->  
-      let subst = (Typing.TypeSubst (Maps.fromList (Lists.zip svars typeArgs)))
-      in  
-        let swrapped = (Substitution.substInType subst wrapped)
-        in (Flows.pure (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Schemas.nominalApplication tname typeArgs),
-          Core.functionTypeCodomain = swrapped})))))))
-
--- | Reconstruct the type of a variable
-typeOfVariable :: (Typing.TypeContext -> [Core.Type] -> Core.Name -> Compute.Flow t0 Core.Type)
-typeOfVariable tx typeArgs name =  
-  let rawType = (Maps.lookup name (Typing.typeContextTypes tx))
-  in  
-    let failMsg = (Flows.fail (Strings.cat [
-            "unbound variable: ",
-            (Core.unName name),
-            ". Variables: {",
-            (Strings.intercalate ", " (Lists.map Core.unName (Maps.keys (Typing.typeContextTypes tx)))),
-            "}"]))
-    in (Flows.bind (Maybes.maybe failMsg (\t -> Logic.ifElse (Lists.null typeArgs) (Schemas.instantiateType t) (Flows.pure t)) rawType) (\t -> applyTypeArgumentsToType tx typeArgs t))
-
--- | Reconstruct the type of a wrapped term
-typeOfWrappedTerm :: (Typing.TypeContext -> [Core.Type] -> Core.WrappedTerm -> Compute.Flow t0 Core.Type)
-typeOfWrappedTerm tx typeArgs wt =  
-  let tname = (Core.wrappedTermTypeName wt)
-  in  
-    let body = (Core.wrappedTermBody wt)
-    in (Flows.bind (typeOf tx [] body) (\btype -> Flows.bind (checkTypeVariables tx btype) (\_ -> Flows.pure (Schemas.nominalApplication tname typeArgs))))
-
--- | Check if a type contains any type variable from the current scope
-containsInScopeTypeVars :: (Typing.TypeContext -> Core.Type -> Bool)
-containsInScopeTypeVars tx t =  
-  let vars = (Typing.typeContextTypeVariables tx)
-  in  
-    let freeVars = (Rewriting.freeVariablesInTypeSimple t)
-    in (Logic.not (Sets.null (Sets.intersection vars freeVars)))
-
--- | Normalize free type variables in a type to canonical names based on order of first occurrence. This allows comparing types that differ only in the naming of free type variables.
-normalizeTypeFreeVars :: (Core.Type -> Core.Type)
-normalizeTypeFreeVars typ =  
-  let collectVars = (\acc -> \t -> (\x -> case x of
-          Core.TypeVariable v1 -> (Logic.ifElse (Maps.member v1 acc) acc (Maps.insert v1 (Core.Name (Strings.cat2 "_tv" (Literals.showInt32 (Maps.size acc)))) acc))
-          _ -> acc) t)
-  in  
-    let subst = (Rewriting.foldOverType Coders.TraversalOrderPre collectVars Maps.empty typ)
-    in (Rewriting.substituteTypeVariables subst typ)
-
--- | Check whether a list of types are effectively equal, disregarding type aliases and free type variable naming. Also treats free type variables (not in schema) as wildcards, since inference has already verified consistency.
-typesAllEffectivelyEqual :: (Typing.TypeContext -> [Core.Type] -> Bool)
-typesAllEffectivelyEqual tx tlist =  
-  let types = (Typing.inferenceContextSchemaTypes (Typing.typeContextInferenceContext tx))
-  in  
-    let containsFreeVar = (\t ->  
-            let allVars = (Rewriting.freeVariablesInTypeSimple t)
-            in  
-              let schemaNames = (Sets.fromList (Maps.keys types))
-              in (Logic.not (Sets.null (Sets.difference allVars schemaNames))))
-    in  
-      let anyContainsFreeVar = (Lists.foldl (\acc -> \t -> Logic.or acc (containsFreeVar t)) False tlist)
-      in (Logic.ifElse anyContainsFreeVar True (Logic.ifElse (allEqual (Lists.map (\t -> normalizeTypeFreeVars t) tlist)) True (allEqual (Lists.map (\t -> normalizeTypeFreeVars (Rewriting.deannotateTypeRecursive (Rewriting.replaceTypedefs types t))) tlist))))
-
--- | Check whether two types are effectively equal, disregarding type aliases, forall quantifiers, and treating in-scope type variables as wildcards
-typesEffectivelyEqual :: (Typing.TypeContext -> Core.Type -> Core.Type -> Bool)
-typesEffectivelyEqual tx t1 t2 = (Logic.or (containsInScopeTypeVars tx t1) (Logic.or (containsInScopeTypeVars tx t2) (typesAllEffectivelyEqual tx [
-  Schemas.fullyStripAndNormalizeType t1,
-  (Schemas.fullyStripAndNormalizeType t2)])))
+import qualified Hydra.Constants as Constants
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Checking as Checking
+import qualified Hydra.Error.Core as Core_
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Core as Core__
+import qualified Hydra.Formatting as Formatting
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Reflect as Reflect
+import qualified Hydra.Rewriting as Rewriting
+import qualified Hydra.Schemas as Schemas
+import qualified Hydra.Show.Core as Core___
+import qualified Hydra.Substitution as Substitution
+import qualified Hydra.Typing as Typing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+allEqual :: Eq t0 => ([t0] -> Bool)
+allEqual els =
+    Logic.ifElse (Lists.null els) True (Lists.foldl (\b -> \t -> Logic.and b (Equality.equal t (Lists.head els))) True (Lists.tail els))
+
+-- | Apply type arguments to a type, substituting forall-bound variables
+applyTypeArgumentsToType :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Type -> Either (Context.InContext Errors.Error) Core.Type
+applyTypeArgumentsToType cx tx typeArgs t =
+    Logic.ifElse (Lists.null typeArgs) (Right t) (
+      let nonnull =
+              case t of
+                Core.TypeForall v0 ->
+                  let v = Core.forallTypeParameter v0
+                      tbody = Core.forallTypeBody v0
+                  in (applyTypeArgumentsToType cx tx (Lists.tail typeArgs) (Substitution.substInType (Typing.TypeSubst (Maps.singleton v (Lists.head typeArgs))) tbody))
+                _ -> Left (Context.InContext {
+                  Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+                    "not a forall type: ",
+                    (Core___.type_ t),
+                    ". Trying to apply ",
+                    (Literals.showInt32 (Lists.length typeArgs)),
+                    " type args: ",
+                    (Formatting.showList Core___.type_ typeArgs),
+                    ". Context has vars: {",
+                    (Strings.intercalate ", " (Lists.map Core.unName (Maps.keys (Graph.graphBoundTypes tx)))),
+                    "}"]))),
+                  Context.inContextContext = cx})
+      in nonnull)
+
+-- | Check that a term has no unbound type variables (Either version)
+checkForUnboundTypeVariables :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) ()
+checkForUnboundTypeVariables cx tx term0 =
+
+      let svars = Sets.fromList (Maps.keys (Graph.graphSchemaTypes tx))
+          checkRecursive =
+                  \vars -> \trace -> \lbinding -> \term ->
+                    let recurse = checkRecursive vars trace lbinding
+                        dflt = Eithers.bind (Eithers.mapList recurse (Rewriting.subterms term)) (\_ -> Right ())
+                        check =
+                                \typ ->
+                                  let freevars = Rewriting.freeVariablesInType typ
+                                      badvars = Sets.difference (Sets.difference freevars vars) svars
+                                  in (Logic.ifElse (Sets.null badvars) (Right ()) (Left (Context.InContext {
+                                    Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorUnboundTypeVariables (Checking.UnboundTypeVariablesError {
+                                      Checking.unboundTypeVariablesErrorVariables = badvars,
+                                      Checking.unboundTypeVariablesErrorType = typ}))),
+                                    Context.inContextContext = cx})))
+                        checkOptional = \m -> Eithers.bind (Eithers.mapMaybe check m) (\_ -> Right ())
+                    in case term of
+                      Core.TermFunction v0 -> case v0 of
+                        Core.FunctionElimination _ -> dflt
+                        Core.FunctionLambda v1 -> Eithers.bind (checkOptional (Core.lambdaDomain v1)) (\_ -> recurse (Core.lambdaBody v1))
+                        _ -> dflt
+                      Core.TermLet v0 ->
+                        let forBinding =
+                                \b ->
+                                  let bterm = Core.bindingTerm b
+                                      newVars = Maybes.maybe vars (\ts -> Sets.union vars (Sets.fromList (Core.typeSchemeVariables ts))) (Core.bindingType b)
+                                      newTrace = Lists.cons (Core.unName (Core.bindingName b)) trace
+                                  in (checkRecursive newVars newTrace (Just b) bterm)
+                        in (Eithers.bind (Eithers.mapList forBinding (Core.letBindings v0)) (\_ -> recurse (Core.letBody v0)))
+                      Core.TermTypeApplication v0 -> Eithers.bind (check (Core.typeApplicationTermType v0)) (\_ -> recurse (Core.typeApplicationTermBody v0))
+                      Core.TermTypeLambda v0 -> Eithers.bind (check (Core.TypeVariable (Core.typeLambdaParameter v0))) (\_ -> recurse (Core.typeLambdaBody v0))
+                      _ -> dflt
+      in (checkRecursive Sets.empty [
+        "top level"] Nothing term0)
+
+-- | Check that a nominal type is applied to the correct number of type arguments (Either version)
+checkNominalApplication :: Context.Context -> Graph.Graph -> Core.Name -> [Core.Type] -> Either (Context.InContext Errors.Error) ((), Context.Context)
+checkNominalApplication cx tx tname typeArgs =
+    Eithers.bind (Schemas.requireSchemaType cx (Graph.graphSchemaTypes tx) tname) (\result ->
+      let schemaType = Pairs.first result
+          cx2 = Pairs.second result
+          vars = Core.typeSchemeVariables schemaType
+          varslen = Lists.length vars
+          argslen = Lists.length typeArgs
+      in (Logic.ifElse (Equality.equal varslen argslen) (Right ((), cx2)) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeArityMismatch (Checking.TypeArityMismatchError {
+          Checking.typeArityMismatchErrorType = (Core.TypeVariable tname),
+          Checking.typeArityMismatchErrorExpectedArity = varslen,
+          Checking.typeArityMismatchErrorActualArity = argslen,
+          Checking.typeArityMismatchErrorTypeArguments = typeArgs}))),
+        Context.inContextContext = cx2}))))
+
+-- | Ensure all types in a list are equal and return the common type
+checkSameType :: Context.Context -> Graph.Graph -> String -> [Core.Type] -> Either (Context.InContext Errors.Error) Core.Type
+checkSameType cx tx desc types =
+    Logic.ifElse (typesAllEffectivelyEqual tx types) (Right (Lists.head types)) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorUnequalTypes (Checking.UnequalTypesError {
+        Checking.unequalTypesErrorTypes = types,
+        Checking.unequalTypesErrorDescription = desc}))),
+      Context.inContextContext = cx}))
+
+-- | Check that a term has the expected type
+checkType :: Context.Context -> Graph.Graph -> Core.Term -> Core.Type -> Either (Context.InContext Errors.Error) ()
+checkType cx tx term typ =
+
+      let vars = Graph.graphTypeVariables tx
+      in (Logic.ifElse Constants.debugInference (Eithers.bind (Eithers.map (\_p -> Pairs.first _p) (typeOf cx tx [] term)) (\t0 -> Logic.ifElse (typesEffectivelyEqual tx t0 typ) (Right ()) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeMismatch (Checking.TypeMismatchError {
+          Checking.typeMismatchErrorExpectedType = typ,
+          Checking.typeMismatchErrorActualType = t0}))),
+        Context.inContextContext = cx})))) (Right ()))
+
+-- | Sanity-check a type substitution arising from unification. Specifically, check that schema types have not been inappropriately unified with type variables inferred from terms.
+checkTypeSubst :: Context.Context -> Graph.Graph -> Typing.TypeSubst -> Either (Context.InContext Errors.Error) Typing.TypeSubst
+checkTypeSubst cx tx subst =
+
+      let s = Typing.unTypeSubst subst
+          vars = Sets.fromList (Maps.keys s)
+          suspectVars = Sets.intersection vars (Sets.fromList (Maps.keys (Graph.graphSchemaTypes tx)))
+          isNominal =
+                  \ts -> case (Rewriting.deannotateType (Core.typeSchemeType ts)) of
+                    Core.TypeRecord _ -> True
+                    Core.TypeUnion _ -> True
+                    Core.TypeWrap _ -> True
+                    _ -> False
+          badVars =
+                  Sets.fromList (Lists.filter (\v -> Maybes.maybe False isNominal (Lexical.dereferenceSchemaType v (Graph.graphSchemaTypes tx))) (Sets.toList suspectVars))
+          badPairs = Lists.filter (\p -> Sets.member (Pairs.first p) badVars) (Maps.toList s)
+          printPair = \p -> Strings.cat2 (Strings.cat2 (Core.unName (Pairs.first p)) " --> ") (Core___.type_ (Pairs.second p))
+      in (Logic.ifElse (Sets.null badVars) (Right subst) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorIncorrectUnification (Checking.IncorrectUnificationError {
+          Checking.incorrectUnificationErrorSubstitution = subst}))),
+        Context.inContextContext = cx})))
+
+-- | Check that all type variables in a type are bound. NOTE: This check is currently disabled to allow phantom type variables from polymorphic instantiation to pass through. The proper fix is to ensure `typeOf` doesn't create fresh variables for post-inference code.
+checkTypeVariables :: t0 -> t1 -> ()
+checkTypeVariables _tx _typ = ()
+
+-- | Check if a type contains any type variable from the current scope
+containsInScopeTypeVars :: Graph.Graph -> Core.Type -> Bool
+containsInScopeTypeVars tx t =
+
+      let vars = Graph.graphTypeVariables tx
+          freeVars = Rewriting.freeVariablesInTypeSimple t
+      in (Logic.not (Sets.null (Sets.intersection vars freeVars)))
+
+-- | Normalize free type variables in a type to canonical names based on order of first occurrence. This allows comparing types that differ only in the naming of free type variables.
+normalizeTypeFreeVars :: Core.Type -> Core.Type
+normalizeTypeFreeVars typ =
+
+      let collectVars =
+              \acc -> \t -> case t of
+                Core.TypeVariable v0 -> Logic.ifElse (Maps.member v0 acc) acc (Maps.insert v0 (Core.Name (Strings.cat2 "_tv" (Literals.showInt32 (Maps.size acc)))) acc)
+                _ -> acc
+          subst = Rewriting.foldOverType Coders.TraversalOrderPre collectVars Maps.empty typ
+      in (Rewriting.substituteTypeVariables subst typ)
+
+-- | Get the bound types from a graph as a type environment
+toFContext :: Graph.Graph -> M.Map Core.Name Core.Type
+toFContext cx = Maps.map Rewriting.typeSchemeToFType (Graph.graphBoundTypes cx)
+
+-- | Check whether two lists of types are effectively equal, disregarding type aliases
+typeListsEffectivelyEqual :: Graph.Graph -> [Core.Type] -> [Core.Type] -> Bool
+typeListsEffectivelyEqual tx tlist1 tlist2 =
+    Logic.ifElse (Equality.equal (Lists.length tlist1) (Lists.length tlist2)) (Lists.foldl Logic.and True (Lists.zipWith (typesEffectivelyEqual tx) tlist1 tlist2)) False
+
+-- | Given a type context, reconstruct the type of a System F term
+typeOf :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Term -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOf cx tx typeArgs term =
+
+      let cx1 =
+              Context.Context {
+                Context.contextTrace = (Lists.cons "typeOf" (Context.contextTrace cx)),
+                Context.contextMessages = (Context.contextMessages cx),
+                Context.contextOther = (Context.contextOther cx)}
+      in case term of
+        Core.TermAnnotated v0 -> typeOfAnnotatedTerm cx1 tx typeArgs v0
+        Core.TermApplication v0 -> typeOfApplication cx1 tx typeArgs v0
+        Core.TermEither v0 -> typeOfEither cx1 tx typeArgs v0
+        Core.TermFunction v0 -> case v0 of
+          Core.FunctionElimination v1 -> case v1 of
+            Core.EliminationRecord v2 -> typeOfProjection cx1 tx typeArgs v2
+            Core.EliminationUnion v2 -> typeOfCaseStatement cx1 tx typeArgs v2
+            Core.EliminationWrap v2 -> typeOfUnwrap cx1 tx typeArgs v2
+          Core.FunctionLambda v1 -> typeOfLambda cx1 tx typeArgs v1
+          Core.FunctionPrimitive v1 -> typeOfPrimitive cx1 tx typeArgs v1
+        Core.TermLet v0 -> typeOfLet cx1 tx typeArgs v0
+        Core.TermList v0 -> typeOfList cx1 tx typeArgs v0
+        Core.TermLiteral v0 -> typeOfLiteral cx1 tx typeArgs v0
+        Core.TermMap v0 -> typeOfMap cx1 tx typeArgs v0
+        Core.TermMaybe v0 -> typeOfMaybe cx1 tx typeArgs v0
+        Core.TermPair v0 -> typeOfPair cx1 tx typeArgs v0
+        Core.TermRecord v0 -> typeOfRecord cx1 tx typeArgs v0
+        Core.TermSet v0 -> typeOfSet cx1 tx typeArgs v0
+        Core.TermTypeApplication v0 -> typeOfTypeApplication cx1 tx typeArgs v0
+        Core.TermTypeLambda v0 -> typeOfTypeLambda cx1 tx typeArgs v0
+        Core.TermUnion v0 -> typeOfInjection cx1 tx typeArgs v0
+        Core.TermUnit -> typeOfUnit cx1 tx typeArgs
+        Core.TermVariable v0 -> typeOfVariable cx1 tx typeArgs v0
+        Core.TermWrap v0 -> typeOfWrappedTerm cx1 tx typeArgs v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorUnsupportedTermVariant (Checking.UnsupportedTermVariantError {
+            Checking.unsupportedTermVariantErrorTermVariant = (Reflect.termVariant term)}))),
+          Context.inContextContext = cx1})
+
+-- | Reconstruct the type of an annotated term (Either/Context version)
+typeOfAnnotatedTerm :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.AnnotatedTerm -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfAnnotatedTerm cx tx typeArgs at = typeOf cx tx typeArgs (Core.annotatedTermBody at)
+
+-- | Reconstruct the type of an application term (Either/Context version)
+typeOfApplication :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Application -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfApplication cx tx typeArgs app =
+
+      let fun = Core.applicationFunction app
+          arg = Core.applicationArgument app
+          tryType =
+                  \cx0 -> \tfun -> \targ -> case tfun of
+                    Core.TypeForall v0 -> tryType cx0 (Core.forallTypeBody v0) targ
+                    Core.TypeFunction v0 ->
+                      let dom = Core.functionTypeDomain v0
+                          cod = Core.functionTypeCodomain v0
+                      in (Logic.ifElse (typesEffectivelyEqual tx dom targ) (Right (cod, cx0)) (Left (Context.InContext {
+                        Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeMismatch (Checking.TypeMismatchError {
+                          Checking.typeMismatchErrorExpectedType = dom,
+                          Checking.typeMismatchErrorActualType = targ}))),
+                        Context.inContextContext = cx0})))
+                    Core.TypeVariable _ ->
+                      let nameResult = Schemas.freshName cx0
+                          freshN = Pairs.first nameResult
+                          cx1 = Pairs.second nameResult
+                      in (Right (Core.TypeVariable freshN, cx1))
+                    _ -> Left (Context.InContext {
+                      Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorNotAFunctionType (Checking.NotAFunctionTypeError {
+                        Checking.notAFunctionTypeErrorType = tfun}))),
+                      Context.inContextContext = cx0})
+      in (Eithers.bind (typeOf cx tx [] fun) (\result1 ->
+        let tfun = Pairs.first result1
+            cx2 = Pairs.second result1
+        in (Eithers.bind (typeOf cx2 tx [] arg) (\result2 ->
+          let targ = Pairs.first result2
+              cx3 = Pairs.second result2
+          in (Eithers.bind (tryType cx3 tfun targ) (\result3 ->
+            let t = Pairs.first result3
+                cx4 = Pairs.second result3
+            in (Eithers.bind (applyTypeArgumentsToType cx4 tx typeArgs t) (\applied -> Right (applied, cx4)))))))))
+
+-- | Reconstruct the type of a case statement (Either/Context version)
+typeOfCaseStatement :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.CaseStatement -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfCaseStatement cx tx typeArgs cs =
+
+      let tname = Core.caseStatementTypeName cs
+          dflt = Core.caseStatementDefault cs
+          cases = Core.caseStatementCases cs
+          cterms = Lists.map Core.fieldTerm cases
+      in (Eithers.bind (Eithers.mapMaybe (\e -> typeOf cx tx [] e) dflt) (\dfltResult ->
+        let tdflt = Maybes.map Pairs.first dfltResult
+            cx2 = Maybes.maybe cx Pairs.second dfltResult
+            foldResult =
+                    Lists.foldl (\acc -> \term -> Eithers.bind acc (\accR ->
+                      let types = Pairs.first accR
+                          cxA = Pairs.second accR
+                      in (Eithers.bind (typeOf cxA tx [] term) (\tResult ->
+                        let t = Pairs.first tResult
+                            cxB = Pairs.second tResult
+                        in (Right (Lists.concat2 types (Lists.pure t), cxB)))))) (Right ([], cx2)) cterms
+        in (Eithers.bind foldResult (\foldR ->
+          let tcterms = Pairs.first foldR
+              cx3 = Pairs.second foldR
+              fcodsResult =
+                      Lists.foldl (\acc -> \t -> Eithers.bind acc (\accR ->
+                        let cods = Pairs.first accR
+                        in (Eithers.bind (Core__.functionType cx3 t) (\ft -> Right (Lists.concat2 cods (Lists.pure (Core.functionTypeCodomain ft)), cx3))))) (Right ([], cx3)) tcterms
+          in (Eithers.bind fcodsResult (\fcodsR ->
+            let fcods = Pairs.first fcodsR
+                cods = Maybes.cat (Lists.cons tdflt (Lists.map Maybes.pure fcods))
+            in (Eithers.bind (checkSameType cx3 tx "case branches" cods) (\cod -> Right (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Schemas.nominalApplication tname typeArgs),
+              Core.functionTypeCodomain = cod}), cx3)))))))))
+
+-- | Reconstruct the type of an either value (Either/Context version)
+typeOfEither :: Context.Context -> Graph.Graph -> [Core.Type] -> Either Core.Term Core.Term -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfEither cx tx typeArgs et =
+
+      let n = Lists.length typeArgs
+      in (Logic.ifElse (Equality.equal n 2) (Eithers.either (\leftTerm -> Eithers.bind (typeOf cx tx [] leftTerm) (\result ->
+        let leftType = Pairs.first result
+            cx2 = Pairs.second result
+        in (Right (Core.TypeEither (Core.EitherType {
+          Core.eitherTypeLeft = leftType,
+          Core.eitherTypeRight = (Lists.at 1 typeArgs)}), cx2)))) (\rightTerm -> Eithers.bind (typeOf cx tx [] rightTerm) (\result ->
+        let rightType = Pairs.first result
+            cx2 = Pairs.second result
+        in (Right (Core.TypeEither (Core.EitherType {
+          Core.eitherTypeLeft = (Lists.at 0 typeArgs),
+          Core.eitherTypeRight = rightType}), cx2)))) et) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeArityMismatch (Checking.TypeArityMismatchError {
+          Checking.typeArityMismatchErrorType = (Core.TypeEither (Core.EitherType {
+            Core.eitherTypeLeft = Core.TypeUnit,
+            Core.eitherTypeRight = Core.TypeUnit})),
+          Checking.typeArityMismatchErrorExpectedArity = 2,
+          Checking.typeArityMismatchErrorActualArity = n,
+          Checking.typeArityMismatchErrorTypeArguments = typeArgs}))),
+        Context.inContextContext = cx})))
+
+-- | Reconstruct the type of a union injection (Either/Context version)
+typeOfInjection :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Injection -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfInjection cx tx typeArgs injection =
+
+      let tname = Core.injectionTypeName injection
+          field = Core.injectionField injection
+          fname = Core.fieldName field
+          fterm = Core.fieldTerm field
+      in (Eithers.bind (Schemas.requireSchemaType cx (Graph.graphSchemaTypes tx) tname) (\schemaResult ->
+        let schemaType = Pairs.first schemaResult
+            cx2 = Pairs.second schemaResult
+            svars = Core.typeSchemeVariables schemaType
+            sbody = Core.typeSchemeType schemaType
+        in (Eithers.bind (Core__.unionType cx2 tname sbody) (\sfields -> Eithers.bind (Schemas.findFieldType cx2 fname sfields) (\ftyp -> Right (Schemas.nominalApplication tname typeArgs, cx2))))))
+
+-- | Reconstruct the type of a lambda function (Either/Context version)
+typeOfLambda :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Lambda -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfLambda cx tx typeArgs l =
+
+      let v = Core.lambdaParameter l
+          mdom = Core.lambdaDomain l
+          body = Core.lambdaBody l
+      in (Eithers.bind (Maybes.maybe (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorUntypedLambda (Checking.UntypedLambdaError {
+        }))),
+        Context.inContextContext = cx})) (\dom ->
+        let types2 = Maps.insert v (Rewriting.fTypeToTypeScheme dom) (Graph.graphBoundTypes tx)
+        in (Eithers.bind (typeOf cx (Graph.Graph {
+          Graph.graphBoundTerms = (Graph.graphBoundTerms tx),
+          Graph.graphBoundTypes = types2,
+          Graph.graphClassConstraints = (Graph.graphClassConstraints tx),
+          Graph.graphLambdaVariables = (Graph.graphLambdaVariables tx),
+          Graph.graphMetadata = (Graph.graphMetadata tx),
+          Graph.graphPrimitives = (Graph.graphPrimitives tx),
+          Graph.graphSchemaTypes = (Graph.graphSchemaTypes tx),
+          Graph.graphTypeVariables = (Graph.graphTypeVariables tx)}) [] body) (\codResult ->
+          let cod = Pairs.first codResult
+              cx2 = Pairs.second codResult
+          in (Right (Core.TypeFunction (Core.FunctionType {
+            Core.functionTypeDomain = dom,
+            Core.functionTypeCodomain = cod}), cx2))))) mdom) (\tbodyResult ->
+        let tbody = Pairs.first tbodyResult
+            cx3 = Pairs.second tbodyResult
+        in (Eithers.bind (applyTypeArgumentsToType cx3 tx typeArgs tbody) (\applied -> Right (applied, cx3)))))
+
+-- | Reconstruct the type of a let binding (Either/Context version)
+typeOfLet :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Let -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfLet cx tx typeArgs letTerm =
+
+      let bs = Core.letBindings letTerm
+          body = Core.letBody letTerm
+          bnames = Lists.map Core.bindingName bs
+          bindingType =
+                  \b -> Maybes.maybe (Left (Context.InContext {
+                    Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorUntypedLetBinding (Checking.UntypedLetBindingError {
+                      Checking.untypedLetBindingErrorBinding = b}))),
+                    Context.inContextContext = cx})) (\ts -> Right (Rewriting.typeSchemeToFType ts)) (Core.bindingType b)
+          btypesResult =
+                  Lists.foldl (\acc -> \b -> Eithers.bind acc (\accR ->
+                    let types = Pairs.first accR
+                    in (Eithers.bind (bindingType b) (\btype -> Right (Lists.concat2 types (Lists.pure btype), ()))))) (Right ([], ())) bs
+      in (Eithers.bind btypesResult (\btypesR ->
+        let btypes = Pairs.first btypesR
+            tx2 =
+                    Graph.Graph {
+                      Graph.graphBoundTerms = (Graph.graphBoundTerms tx),
+                      Graph.graphBoundTypes = (Maps.union (Maps.fromList (Lists.zip bnames (Lists.map Rewriting.fTypeToTypeScheme btypes))) (Graph.graphBoundTypes tx)),
+                      Graph.graphClassConstraints = (Graph.graphClassConstraints tx),
+                      Graph.graphLambdaVariables = (Graph.graphLambdaVariables tx),
+                      Graph.graphMetadata = (Graph.graphMetadata tx),
+                      Graph.graphPrimitives = (Graph.graphPrimitives tx),
+                      Graph.graphSchemaTypes = (Graph.graphSchemaTypes tx),
+                      Graph.graphTypeVariables = (Graph.graphTypeVariables tx)}
+        in (Eithers.bind (typeOf cx tx2 [] body) (\tResult ->
+          let t = Pairs.first tResult
+              cx2 = Pairs.second tResult
+          in (Eithers.bind (applyTypeArgumentsToType cx2 tx typeArgs t) (\applied -> Right (applied, cx2)))))))
+
+-- | Reconstruct the type of a list (Either/Context version)
+typeOfList :: Context.Context -> Graph.Graph -> [Core.Type] -> [Core.Term] -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfList cx tx typeArgs els =
+    Logic.ifElse (Lists.null els) (Logic.ifElse (Equality.equal (Lists.length typeArgs) 1) (Right (Core.TypeList (Lists.head typeArgs), cx)) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeArityMismatch (Checking.TypeArityMismatchError {
+        Checking.typeArityMismatchErrorType = (Core.TypeList Core.TypeUnit),
+        Checking.typeArityMismatchErrorExpectedArity = 1,
+        Checking.typeArityMismatchErrorActualArity = (Lists.length typeArgs),
+        Checking.typeArityMismatchErrorTypeArguments = typeArgs}))),
+      Context.inContextContext = cx}))) (
+      let foldResult =
+              Lists.foldl (\acc -> \term -> Eithers.bind acc (\accR ->
+                let types = Pairs.first accR
+                    cxA = Pairs.second accR
+                in (Eithers.bind (typeOf cxA tx [] term) (\tResult ->
+                  let t = Pairs.first tResult
+                      cxB = Pairs.second tResult
+                  in (Right (Lists.concat2 types (Lists.pure t), cxB)))))) (Right ([], cx)) els
+      in (Eithers.bind foldResult (\foldR ->
+        let eltypes = Pairs.first foldR
+            cx2 = Pairs.second foldR
+        in (Eithers.bind (checkSameType cx2 tx "list elements" eltypes) (\unifiedType -> Right (Core.TypeList unifiedType, cx2))))))
+
+-- | Reconstruct the type of a literal (Either/Context version)
+typeOfLiteral :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Literal -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfLiteral cx tx typeArgs lit =
+
+      let t = Core.TypeLiteral (Reflect.literalType lit)
+      in (Eithers.bind (applyTypeArgumentsToType cx tx typeArgs t) (\applied -> Right (applied, cx)))
+
+-- | Reconstruct the type of a map (Either/Context version)
+typeOfMap :: Context.Context -> Graph.Graph -> [Core.Type] -> M.Map Core.Term Core.Term -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfMap cx tx typeArgs m =
+    Logic.ifElse (Maps.null m) (Logic.ifElse (Equality.equal (Lists.length typeArgs) 2) (Right (Core.TypeMap (Core.MapType {
+      Core.mapTypeKeys = (Lists.at 0 typeArgs),
+      Core.mapTypeValues = (Lists.at 1 typeArgs)}), cx)) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeArityMismatch (Checking.TypeArityMismatchError {
+        Checking.typeArityMismatchErrorType = (Core.TypeMap (Core.MapType {
+          Core.mapTypeKeys = Core.TypeUnit,
+          Core.mapTypeValues = Core.TypeUnit})),
+        Checking.typeArityMismatchErrorExpectedArity = 2,
+        Checking.typeArityMismatchErrorActualArity = (Lists.length typeArgs),
+        Checking.typeArityMismatchErrorTypeArguments = typeArgs}))),
+      Context.inContextContext = cx}))) (
+      let pairs = Maps.toList m
+          keyFoldResult =
+                  Lists.foldl (\acc -> \p -> Eithers.bind acc (\accR ->
+                    let types = Pairs.first accR
+                        cxA = Pairs.second accR
+                    in (Eithers.bind (typeOf cxA tx [] (Pairs.first p)) (\tResult ->
+                      let t = Pairs.first tResult
+                          cxB = Pairs.second tResult
+                      in (Right (Lists.concat2 types (Lists.pure t), cxB)))))) (Right ([], cx)) pairs
+      in (Eithers.bind keyFoldResult (\keyFoldR ->
+        let keyTypes = Pairs.first keyFoldR
+            cx2 = Pairs.second keyFoldR
+        in (Eithers.bind (checkSameType cx2 tx "map keys" keyTypes) (\kt ->
+          let valFoldResult =
+                  Lists.foldl (\acc -> \p -> Eithers.bind acc (\accR ->
+                    let types = Pairs.first accR
+                        cxA = Pairs.second accR
+                    in (Eithers.bind (typeOf cxA tx [] (Pairs.second p)) (\tResult ->
+                      let t = Pairs.first tResult
+                          cxB = Pairs.second tResult
+                      in (Right (Lists.concat2 types (Lists.pure t), cxB)))))) (Right ([], cx2)) pairs
+          in (Eithers.bind valFoldResult (\valFoldR ->
+            let valTypes = Pairs.first valFoldR
+                cx3 = Pairs.second valFoldR
+            in (Eithers.bind (checkSameType cx3 tx "map values" valTypes) (\vt -> Eithers.bind (applyTypeArgumentsToType cx3 tx typeArgs (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = kt,
+              Core.mapTypeValues = vt}))) (\applied -> Right (applied, cx3)))))))))))
+
+-- | Reconstruct the type of an optional value (Either/Context version)
+typeOfMaybe :: Context.Context -> Graph.Graph -> [Core.Type] -> Maybe Core.Term -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfMaybe cx tx typeArgs mt =
+
+      let forNothing =
+
+                let n = Lists.length typeArgs
+                in (Logic.ifElse (Equality.equal n 1) (Right (Core.TypeMaybe (Lists.head typeArgs), cx)) (Left (Context.InContext {
+                  Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeArityMismatch (Checking.TypeArityMismatchError {
+                    Checking.typeArityMismatchErrorType = (Core.TypeMaybe Core.TypeUnit),
+                    Checking.typeArityMismatchErrorExpectedArity = 1,
+                    Checking.typeArityMismatchErrorActualArity = n,
+                    Checking.typeArityMismatchErrorTypeArguments = typeArgs}))),
+                  Context.inContextContext = cx})))
+          forJust =
+                  \term -> Eithers.bind (typeOf cx tx [] term) (\tResult ->
+                    let termType = Pairs.first tResult
+                        cx2 = Pairs.second tResult
+                        t = Core.TypeMaybe termType
+                    in (Eithers.bind (applyTypeArgumentsToType cx2 tx typeArgs t) (\applied -> Right (applied, cx2))))
+      in (Maybes.maybe forNothing forJust mt)
+
+-- | Reconstruct the type of a pair (Either/Context version)
+typeOfPair :: Context.Context -> Graph.Graph -> [Core.Type] -> (Core.Term, Core.Term) -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfPair cx tx typeArgs p =
+
+      let n = Lists.length typeArgs
+      in (Logic.ifElse (Equality.equal n 2) (
+        let pairFst = Pairs.first p
+            pairSnd = Pairs.second p
+        in (Eithers.bind (typeOf cx tx [] pairFst) (\result1 ->
+          let firstType = Pairs.first result1
+              cx2 = Pairs.second result1
+          in (Eithers.bind (typeOf cx2 tx [] pairSnd) (\result2 ->
+            let secondType = Pairs.first result2
+                cx3 = Pairs.second result2
+            in (Right (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = firstType,
+              Core.pairTypeSecond = secondType}), cx3))))))) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeArityMismatch (Checking.TypeArityMismatchError {
+          Checking.typeArityMismatchErrorType = (Core.TypePair (Core.PairType {
+            Core.pairTypeFirst = Core.TypeUnit,
+            Core.pairTypeSecond = Core.TypeUnit})),
+          Checking.typeArityMismatchErrorExpectedArity = 2,
+          Checking.typeArityMismatchErrorActualArity = n,
+          Checking.typeArityMismatchErrorTypeArguments = typeArgs}))),
+        Context.inContextContext = cx})))
+
+-- | Reconstruct the type of a primitive function (Either/Context version)
+typeOfPrimitive :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Name -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfPrimitive cx tx typeArgs name =
+
+      let rawTs = Maybes.map (\_p -> Graph.primitiveType _p) (Maps.lookup name (Graph.graphPrimitives tx))
+      in (Maybes.maybe (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorUndefinedTermVariable (Core_.UndefinedTermVariableError {
+          Core_.undefinedTermVariableErrorLocation = (Paths.SubtermPath []),
+          Core_.undefinedTermVariableErrorName = name})),
+        Context.inContextContext = cx})) (\tsRaw ->
+        let instResult = Schemas.instantiateTypeScheme cx tsRaw
+            ts = Pairs.first instResult
+            cx2 = Pairs.second instResult
+            t = Rewriting.typeSchemeToFType ts
+        in (Eithers.bind (applyTypeArgumentsToType cx2 tx typeArgs t) (\applied -> Right (applied, cx2)))) rawTs)
+
+-- | Reconstruct the type of a record projection (Either/Context version)
+typeOfProjection :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Projection -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfProjection cx tx typeArgs p =
+
+      let tname = Core.projectionTypeName p
+          fname = Core.projectionField p
+      in (Eithers.bind (Schemas.requireSchemaType cx (Graph.graphSchemaTypes tx) tname) (\schemaResult ->
+        let schemaType = Pairs.first schemaResult
+            cx2 = Pairs.second schemaResult
+            svars = Core.typeSchemeVariables schemaType
+            sbody = Core.typeSchemeType schemaType
+        in (Eithers.bind (Core__.recordType cx2 tname sbody) (\sfields -> Eithers.bind (Schemas.findFieldType cx2 fname sfields) (\ftyp ->
+          let subst = Typing.TypeSubst (Maps.fromList (Lists.zip svars typeArgs))
+              sftyp = Substitution.substInType subst ftyp
+          in (Right (Core.TypeFunction (Core.FunctionType {
+            Core.functionTypeDomain = (Schemas.nominalApplication tname typeArgs),
+            Core.functionTypeCodomain = sftyp}), cx2)))))))
+
+-- | Reconstruct the type of a record (Either/Context version)
+typeOfRecord :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Record -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfRecord cx tx typeArgs record =
+
+      let tname = Core.recordTypeName record
+          fields = Core.recordFields record
+          foldResult =
+                  Lists.foldl (\acc -> \term -> Eithers.bind acc (\accR ->
+                    let types = Pairs.first accR
+                        cxA = Pairs.second accR
+                    in (Eithers.bind (typeOf cxA tx [] term) (\tResult ->
+                      let t = Pairs.first tResult
+                          cxB = Pairs.second tResult
+                      in (Right (Lists.concat2 types (Lists.pure t), cxB)))))) (Right ([], cx)) (Lists.map Core.fieldTerm fields)
+      in (Eithers.bind foldResult (\foldR ->
+        let cx2 = Pairs.second foldR
+        in (Right (Schemas.nominalApplication tname typeArgs, cx2))))
+
+-- | Reconstruct the type of a set (Either/Context version)
+typeOfSet :: Context.Context -> Graph.Graph -> [Core.Type] -> S.Set Core.Term -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfSet cx tx typeArgs els =
+    Logic.ifElse (Sets.null els) (Logic.ifElse (Equality.equal (Lists.length typeArgs) 1) (Right (Core.TypeSet (Lists.head typeArgs), cx)) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorChecking (Checking.CheckingErrorTypeArityMismatch (Checking.TypeArityMismatchError {
+        Checking.typeArityMismatchErrorType = (Core.TypeSet Core.TypeUnit),
+        Checking.typeArityMismatchErrorExpectedArity = 1,
+        Checking.typeArityMismatchErrorActualArity = (Lists.length typeArgs),
+        Checking.typeArityMismatchErrorTypeArguments = typeArgs}))),
+      Context.inContextContext = cx}))) (
+      let foldResult =
+              Lists.foldl (\acc -> \term -> Eithers.bind acc (\accR ->
+                let types = Pairs.first accR
+                    cxA = Pairs.second accR
+                in (Eithers.bind (typeOf cxA tx [] term) (\tResult ->
+                  let t = Pairs.first tResult
+                      cxB = Pairs.second tResult
+                  in (Right (Lists.concat2 types (Lists.pure t), cxB)))))) (Right ([], cx)) (Sets.toList els)
+      in (Eithers.bind foldResult (\foldR ->
+        let eltypes = Pairs.first foldR
+            cx2 = Pairs.second foldR
+        in (Eithers.bind (checkSameType cx2 tx "set elements" eltypes) (\unifiedType -> Right (Core.TypeSet unifiedType, cx2))))))
+
+-- | Reconstruct the type of a type application term (Either/Context version)
+typeOfTypeApplication :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.TypeApplicationTerm -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfTypeApplication cx tx typeArgs tyapp =
+
+      let body = Core.typeApplicationTermBody tyapp
+          t = Core.typeApplicationTermType tyapp
+      in (typeOf cx tx (Lists.cons t typeArgs) body)
+
+-- | Reconstruct the type of a type lambda (type abstraction) term (Either/Context version)
+typeOfTypeLambda :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.TypeLambda -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfTypeLambda cx tx typeArgs tl =
+
+      let v = Core.typeLambdaParameter tl
+          body = Core.typeLambdaBody tl
+          vars = Graph.graphTypeVariables tx
+          tx2 =
+                  Graph.Graph {
+                    Graph.graphBoundTerms = (Graph.graphBoundTerms tx),
+                    Graph.graphBoundTypes = (Graph.graphBoundTypes tx),
+                    Graph.graphClassConstraints = (Graph.graphClassConstraints tx),
+                    Graph.graphLambdaVariables = (Graph.graphLambdaVariables tx),
+                    Graph.graphMetadata = (Graph.graphMetadata tx),
+                    Graph.graphPrimitives = (Graph.graphPrimitives tx),
+                    Graph.graphSchemaTypes = (Graph.graphSchemaTypes tx),
+                    Graph.graphTypeVariables = (Sets.insert v vars)}
+      in (Eithers.bind (typeOf cx tx2 [] body) (\result1 ->
+        let t1 = Pairs.first result1
+            cx2 = Pairs.second result1
+        in (Eithers.bind (applyTypeArgumentsToType cx2 tx typeArgs (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = v,
+          Core.forallTypeBody = t1}))) (\applied -> Right (applied, cx2)))))
+
+-- | Reconstruct the type of the unit term (Either/Context version)
+typeOfUnit :: Context.Context -> Graph.Graph -> [Core.Type] -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfUnit cx tx typeArgs =
+    Eithers.bind (applyTypeArgumentsToType cx tx typeArgs Core.TypeUnit) (\applied -> Right (applied, cx))
+
+-- | Reconstruct the type of an unwrap operation (Either/Context version)
+typeOfUnwrap :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Name -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfUnwrap cx tx typeArgs tname =
+    Eithers.bind (Schemas.requireSchemaType cx (Graph.graphSchemaTypes tx) tname) (\schemaResult ->
+      let schemaType = Pairs.first schemaResult
+          cx2 = Pairs.second schemaResult
+          svars = Core.typeSchemeVariables schemaType
+          sbody = Core.typeSchemeType schemaType
+      in (Eithers.bind (Core__.wrappedType cx2 tname sbody) (\wrapped ->
+        let subst = Typing.TypeSubst (Maps.fromList (Lists.zip svars typeArgs))
+            swrapped = Substitution.substInType subst wrapped
+        in (Right (Core.TypeFunction (Core.FunctionType {
+          Core.functionTypeDomain = (Schemas.nominalApplication tname typeArgs),
+          Core.functionTypeCodomain = swrapped}), cx2)))))
+
+-- | Reconstruct the type of a variable (Either/Context version)
+typeOfVariable :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.Name -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfVariable cx tx typeArgs name =
+
+      let rawTypeScheme = Maps.lookup name (Graph.graphBoundTypes tx)
+      in (Maybes.maybe (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorUntypedTermVariable (Core_.UntypedTermVariableError {
+          Core_.untypedTermVariableErrorLocation = (Paths.SubtermPath []),
+          Core_.untypedTermVariableErrorName = name})),
+        Context.inContextContext = cx})) (\ts ->
+        let tResult =
+                Logic.ifElse (Lists.null typeArgs) (Schemas.instantiateType cx (Rewriting.typeSchemeToFType ts)) (Rewriting.typeSchemeToFType ts, cx)
+            t = Pairs.first tResult
+            cx2 = Pairs.second tResult
+        in (Eithers.bind (applyTypeArgumentsToType cx2 tx typeArgs t) (\applied -> Right (applied, cx2)))) rawTypeScheme)
+
+-- | Reconstruct the type of a wrapped term (Either/Context version)
+typeOfWrappedTerm :: Context.Context -> Graph.Graph -> [Core.Type] -> Core.WrappedTerm -> Either (Context.InContext Errors.Error) (Core.Type, Context.Context)
+typeOfWrappedTerm cx tx typeArgs wt =
+
+      let tname = Core.wrappedTermTypeName wt
+          body = Core.wrappedTermBody wt
+      in (Eithers.bind (typeOf cx tx [] body) (\result ->
+        let cx2 = Pairs.second result
+        in (Right (Schemas.nominalApplication tname typeArgs, cx2))))
+
+-- | Check whether a list of types are effectively equal, disregarding type aliases and free type variable naming. Also treats free type variables (not in schema) as wildcards, since inference has already verified consistency.
+typesAllEffectivelyEqual :: Graph.Graph -> [Core.Type] -> Bool
+typesAllEffectivelyEqual tx tlist =
+
+      let types = Graph.graphSchemaTypes tx
+          containsFreeVar =
+                  \t ->
+                    let allVars = Rewriting.freeVariablesInTypeSimple t
+                        schemaNames = Sets.fromList (Maps.keys types)
+                    in (Logic.not (Sets.null (Sets.difference allVars schemaNames)))
+          anyContainsFreeVar = Lists.foldl (\acc -> \t -> Logic.or acc (containsFreeVar t)) False tlist
+      in (Logic.ifElse anyContainsFreeVar True (Logic.ifElse (allEqual (Lists.map (\t -> normalizeTypeFreeVars t) tlist)) True (allEqual (Lists.map (\t -> normalizeTypeFreeVars (Rewriting.deannotateTypeRecursive (Rewriting.replaceTypedefs types t))) tlist))))
+
+-- | Check whether two types are effectively equal, disregarding type aliases, forall quantifiers, and treating in-scope type variables as wildcards
+typesEffectivelyEqual :: Graph.Graph -> Core.Type -> Core.Type -> Bool
+typesEffectivelyEqual tx t1 t2 =
+    Logic.or (containsInScopeTypeVars tx t1) (Logic.or (containsInScopeTypeVars tx t2) (typesAllEffectivelyEqual tx [
+      Schemas.fullyStripAndNormalizeType t1,
+      (Schemas.fullyStripAndNormalizeType t2)]))
diff --git a/src/gen-main/haskell/Hydra/Classes.hs b/src/gen-main/haskell/Hydra/Classes.hs
--- a/src/gen-main/haskell/Hydra/Classes.hs
+++ b/src/gen-main/haskell/Hydra/Classes.hs
@@ -13,13 +13,13 @@
 import qualified Data.Set as S
 
 -- | Any of a small number of built-in type classes
-data TypeClass = 
+data TypeClass =
   TypeClassEquality  |
-  TypeClassOrdering 
+  TypeClassOrdering
   deriving (Eq, Ord, Read, Show)
 
-_TypeClass = (Core.Name "hydra.classes.TypeClass")
+_TypeClass = Core.Name "hydra.classes.TypeClass"
 
-_TypeClass_equality = (Core.Name "equality")
+_TypeClass_equality = Core.Name "equality"
 
-_TypeClass_ordering = (Core.Name "ordering")
+_TypeClass_ordering = Core.Name "ordering"
diff --git a/src/gen-main/haskell/Hydra/CodeGeneration.hs b/src/gen-main/haskell/Hydra/CodeGeneration.hs
--- a/src/gen-main/haskell/Hydra/CodeGeneration.hs
+++ b/src/gen-main/haskell/Hydra/CodeGeneration.hs
@@ -4,14 +4,15 @@
 
 module Hydra.CodeGeneration where
 
-import qualified Hydra.Adapt.Simple as Simple
+import qualified Hydra.Adapt as Adapt
 import qualified Hydra.Annotations as Annotations
 import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
 import qualified Hydra.Decode.Module as Module
 import qualified Hydra.Encode.Module as Module_
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Inference as Inference
 import qualified Hydra.Json.Decode as Decode
@@ -21,7 +22,6 @@
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Maps as Maps
@@ -31,10 +31,10 @@
 import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Module as Module__
-import qualified Hydra.Monads as Monads
 import qualified Hydra.Rewriting as Rewriting
+import qualified Hydra.Schemas as Schemas
 import qualified Hydra.Show.Core as Core__
-import qualified Hydra.Util as Util
+import qualified Hydra.Show.Errors as Errors_
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -42,255 +42,349 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | Convert a namespace to a file path (e.g., hydra.core -> hydra/core)
-namespaceToPath :: (Module__.Namespace -> String)
-namespaceToPath ns = (Strings.intercalate "/" (Strings.splitOn "." (Module__.unNamespace ns)))
+-- | Build a schema map (Name -> Type) from a graph's schema types
+buildSchemaMap :: Graph.Graph -> M.Map Core.Name Core.Type
+buildSchemaMap g = Maps.map (\ts -> Rewriting.deannotateType (Core.typeSchemeType ts)) (Graph.graphSchemaTypes g)
 
--- | Strip TypeSchemes from term bindings in a module, preserving type binding TypeSchemes. JSON-loaded modules carry inferred TypeSchemes from the original compilation. After adaptation (e.g., bigfloat -> float64), these TypeSchemes become stale and can cause inference errors. Stripping them allows the inference engine to reconstruct correct TypeSchemes from scratch.
-stripModuleTypeSchemes :: (Module__.Module -> Module__.Module)
-stripModuleTypeSchemes m =  
-  let stripIfTerm = (\b -> Logic.ifElse (Annotations.isNativeType b) b (Core.Binding {
-          Core.bindingName = (Core.bindingName b),
-          Core.bindingTerm = (Core.bindingTerm b),
-          Core.bindingType = Nothing}))
-  in Module__.Module {
-    Module__.moduleNamespace = (Module__.moduleNamespace m),
-    Module__.moduleElements = (Lists.map stripIfTerm (Module__.moduleElements m)),
-    Module__.moduleTermDependencies = (Module__.moduleTermDependencies m),
-    Module__.moduleTypeDependencies = (Module__.moduleTypeDependencies m),
-    Module__.moduleDescription = (Module__.moduleDescription m)}
+-- | Decode a single module from a JSON value
+decodeModuleFromJson :: Graph.Graph -> [Module__.Module] -> Bool -> Model.Value -> Either String Module__.Module
+decodeModuleFromJson bsGraph universeModules doStripTypeSchemes jsonVal =
 
--- | Compute transitive closure of module dependencies
-transitiveDeps :: ((Module__.Module -> [Module__.Namespace]) -> M.Map Module__.Namespace Module__.Module -> [Module__.Module] -> S.Set Module__.Namespace)
-transitiveDeps getDeps nsMap startMods =  
-  let initialDeps = (Sets.fromList (Lists.concat (Lists.map (\m -> Lists.filter (\dep -> Logic.not (Equality.equal dep (Module__.moduleNamespace m))) (getDeps m)) startMods)))
-  in  
-    let go = (\pending -> \visited -> Logic.ifElse (Sets.null pending) visited ( 
-            let newVisited = (Sets.union visited pending)
-            in  
-              let nextDeps = (Sets.fromList (Lists.concat (Lists.map (\nsv -> Maybes.maybe [] (\depMod -> getDeps depMod) (Maps.lookup nsv nsMap)) (Sets.toList pending))))
-              in  
-                let newPending = (Sets.difference nextDeps newVisited)
-                in (go newPending newVisited)))
-    in (go initialDeps Sets.empty)
+      let graph = modulesToGraph bsGraph universeModules universeModules
+          schemaMap = buildSchemaMap graph
+          modType = Core.TypeVariable (Core.Name "hydra.module.Module")
+      in (Eithers.either (\err -> Left err) (\term -> Eithers.either (\decErr -> Left (Errors.unDecodingError decErr)) (\mod -> Right (Logic.ifElse doStripTypeSchemes (stripModuleTypeSchemes mod) mod)) (Module.module_ graph term)) (Decode.fromJson schemaMap (Core.Name "hydra.module.Module") modType jsonVal))
 
--- | Compute transitive closure of term dependencies for a set of modules
-moduleTermDepsTransitive :: (M.Map Module__.Namespace Module__.Module -> [Module__.Module] -> [Module__.Module])
-moduleTermDepsTransitive nsMap modules =  
-  let closure = (Sets.union (transitiveDeps (\m -> Module__.moduleTermDependencies m) nsMap modules) (Sets.fromList (Lists.map (\m -> Module__.moduleNamespace m) modules)))
-  in (Maybes.cat (Lists.map (\n -> Maps.lookup n nsMap) (Sets.toList closure)))
+-- | Escape unescaped control characters inside JSON string literals
+escapeControlCharsInJson :: [Int] -> [Int]
+escapeControlCharsInJson input =
 
--- | Compute transitive closure of type dependencies for a set of modules
-moduleTypeDepsTransitive :: (M.Map Module__.Namespace Module__.Module -> [Module__.Module] -> [Module__.Module])
-moduleTypeDepsTransitive nsMap modules =  
-  let termMods = (moduleTermDepsTransitive nsMap modules)
-  in  
-    let typeNamespaces = (Sets.toList (transitiveDeps (\m -> Module__.moduleTypeDependencies m) nsMap termMods))
-    in (Maybes.cat (Lists.map (\n -> Maps.lookup n nsMap) typeNamespaces))
+      let hexDigit = \n -> Logic.ifElse (Equality.lt n 10) (Math.add 48 n) (Math.add 97 (Math.sub n 10))
+          escapeToUnicode =
+                  \b -> [
+                    92,
+                    117,
+                    48,
+                    48,
+                    (hexDigit (Math.div b 16)),
+                    (hexDigit (Math.mod b 16))]
+          go =
+                  \inStr -> \esc -> \bytes -> Logic.ifElse (Lists.null bytes) [] (
+                    let b = Lists.head bytes
+                        bs = Lists.tail bytes
+                    in (Logic.ifElse esc (Lists.cons b (go inStr False bs)) (Logic.ifElse (Logic.and (Equality.equal b 92) inStr) (Lists.cons b (go inStr True bs)) (Logic.ifElse (Equality.equal b 34) (Lists.cons b (go (Logic.not inStr) False bs)) (Logic.ifElse (Logic.and inStr (Equality.lt b 32)) (Lists.concat2 (escapeToUnicode b) (go inStr False bs)) (Lists.cons b (go inStr False bs)))))))
+      in (go False False input)
 
--- | Build a graph from universe modules and working modules, using an explicit bootstrap graph
-modulesToGraph :: (Graph.Graph -> [Module__.Module] -> [Module__.Module] -> Graph.Graph)
-modulesToGraph bsGraph universeModules modules =  
-  let universe = (Maps.fromList (Lists.map (\m -> (Module__.moduleNamespace m, m)) (Lists.concat2 universeModules modules)))
-  in  
-    let schemaModules = (moduleTypeDepsTransitive universe modules)
-    in  
-      let dataModules = (moduleTermDepsTransitive universe modules)
-      in  
-        let schemaElements = (Lists.filter (\e -> Annotations.isNativeType e) (Lists.concat (Lists.map (\m -> Module__.moduleElements m) (Lists.concat2 schemaModules modules))))
-        in  
-          let dataElements = (Lists.filter (\e -> Logic.not (Annotations.isNativeType e)) (Lists.concat (Lists.map (\m -> Module__.moduleElements m) dataModules)))
-          in  
-            let schemaGraph = (Lexical.elementsToGraph bsGraph Nothing schemaElements)
-            in (Lexical.elementsToGraph bsGraph (Just schemaGraph) dataElements)
+-- | Format a primitive for the lexicon
+formatPrimitive :: Graph.Primitive -> String
+formatPrimitive prim =
 
--- | Pure core of code generation: given a coder, language, flags, bootstrap graph, universe, and modules to generate, produce a list of (filePath, content) pairs.
-generateSourceFiles :: Ord t0 => ((Module__.Module -> [Module__.Definition] -> Compute.Flow Graph.Graph (M.Map t0 t1)) -> Coders.Language -> Bool -> Bool -> Bool -> Bool -> Graph.Graph -> [Module__.Module] -> [Module__.Module] -> Compute.Flow Graph.Graph [(t0, t1)])
-generateSourceFiles printDefinitions lang doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings bsGraph universeModules modsToGenerate =  
-  let namespaceMap = (Maps.fromList (Lists.map (\m -> (Module__.moduleNamespace m, m)) (Lists.concat2 universeModules modsToGenerate)))
-  in  
-    let constraints = (Coders.languageConstraints lang)
-    in  
-      let isTypeModule = (\mod -> Logic.not (Lists.null (Lists.filter (\e -> Annotations.isNativeType e) (Module__.moduleElements mod))))
-      in  
-        let partitioned = (Lists.partition isTypeModule modsToGenerate)
-        in  
-          let typeModulesToGenerate = (Pairs.first partitioned)
-          in  
-            let termModulesToGenerate = (Pairs.second partitioned)
-            in  
-              let schemaMods = (moduleTypeDepsTransitive namespaceMap modsToGenerate)
-              in  
-                let schemaElements = (Lists.filter (\e -> Annotations.isNativeType e) (Lists.concat (Lists.map (\m -> Module__.moduleElements m) (Lists.concat2 schemaMods typeModulesToGenerate))))
-                in  
-                  let dataMods = (moduleTermDepsTransitive namespaceMap modsToGenerate)
-                  in  
-                    let dataElements = (Lists.concat (Lists.map (\m -> Module__.moduleElements m) dataMods))
-                    in  
-                      let schemaGraph = (Lexical.elementsToGraph bsGraph Nothing schemaElements)
-                      in  
-                        let dataGraph = (Lexical.elementsToGraph bsGraph (Just schemaGraph) dataElements)
-                        in (Flows.bind (Logic.ifElse (Lists.null typeModulesToGenerate) (Flows.pure []) (Monads.withTrace "generate type modules" ( 
-                          let nameLists = (Lists.map (\m -> Lists.map (\e -> Core.bindingName e) (Lists.filter (\e -> Annotations.isNativeType e) (Module__.moduleElements m))) typeModulesToGenerate)
-                          in (Flows.bind (Simple.schemaGraphToDefinitions constraints schemaGraph nameLists) (\schemaResult ->  
-                            let defLists = (Pairs.second schemaResult)
-                            in (Monads.withState schemaGraph (Flows.map (\xs -> Lists.concat xs) (Flows.mapList (\p ->  
-                              let mod = (Pairs.first p)
-                              in  
-                                let defs = (Pairs.second p)
-                                in (Monads.withTrace (Strings.cat2 "type module " (Module__.unNamespace (Module__.moduleNamespace mod))) (Flows.map (\m -> Maps.toList m) (printDefinitions mod (Lists.map (\d -> Module__.DefinitionType d) defs))))) (Lists.zip typeModulesToGenerate defLists))))))))) (\schemaFiles -> Flows.bind (Logic.ifElse (Lists.null termModulesToGenerate) (Flows.pure []) (Monads.withTrace "generate term modules" ( 
-                          let namespaces = (Lists.map (\m -> Module__.moduleNamespace m) termModulesToGenerate)
-                          in (Flows.bind (Simple.dataGraphToDefinitions constraints doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings dataGraph namespaces) (\dataResult ->  
-                            let g1 = (Pairs.first dataResult)
-                            in  
-                              let defLists = (Pairs.second dataResult)
-                              in  
-                                let refreshModule = (\els -> \m -> Module__.Module {
-                                        Module__.moduleNamespace = (Module__.moduleNamespace m),
-                                        Module__.moduleElements = (Maybes.cat (Lists.map (\e -> Lists.find (\b -> Equality.equal (Core.bindingName b) (Core.bindingName e)) els) (Module__.moduleElements m))),
-                                        Module__.moduleTermDependencies = (Module__.moduleTermDependencies m),
-                                        Module__.moduleTypeDependencies = (Module__.moduleTypeDependencies m),
-                                        Module__.moduleDescription = (Module__.moduleDescription m)})
-                                in  
-                                  let refreshedMods = (Lists.map (\m -> refreshModule (Graph.graphElements g1) m) termModulesToGenerate)
-                                  in (Monads.withState g1 (Flows.map (\xs -> Lists.concat xs) (Flows.mapList (\p ->  
-                                    let mod = (Pairs.first p)
-                                    in  
-                                      let defs = (Pairs.second p)
-                                      in (Monads.withTrace (Strings.cat2 "term module " (Module__.unNamespace (Module__.moduleNamespace mod))) (Flows.map (\m -> Maps.toList m) (printDefinitions mod (Lists.map (\d -> Module__.DefinitionTerm d) defs))))) (Lists.zip refreshedMods defLists))))))))) (\termFiles -> Flows.pure (Lists.concat2 schemaFiles termFiles))))
+      let name = Core.unName (Graph.primitiveName prim)
+          typeStr = Core__.typeScheme (Graph.primitiveType prim)
+      in (Strings.cat2 (Strings.cat2 (Strings.cat2 "  " name) " : ") typeStr)
 
 -- | Format a term binding for the lexicon
-formatTermBinding :: (Core.Binding -> String)
-formatTermBinding binding =  
-  let name = (Core.unName (Core.bindingName binding))
-  in  
-    let typeStr = (Maybes.maybe "?" (\scheme -> Core__.typeScheme scheme) (Core.bindingType binding))
-    in (Strings.cat2 (Strings.cat2 (Strings.cat2 "  " name) " : ") typeStr)
+formatTermBinding :: Core.Binding -> String
+formatTermBinding binding =
 
--- | Format a primitive for the lexicon
-formatPrimitive :: (Graph.Primitive -> String)
-formatPrimitive prim =  
-  let name = (Core.unName (Graph.primitiveName prim))
-  in  
-    let typeStr = (Core__.typeScheme (Graph.primitiveType prim))
-    in (Strings.cat2 (Strings.cat2 (Strings.cat2 "  " name) " : ") typeStr)
+      let name = Core.unName (Core.bindingName binding)
+          typeStr = Maybes.maybe "?" (\scheme -> Core__.typeScheme scheme) (Core.bindingType binding)
+      in (Strings.cat2 (Strings.cat2 (Strings.cat2 "  " name) " : ") typeStr)
 
 -- | Format a type binding for the lexicon
-formatTypeBinding :: (Core.Binding -> Compute.Flow Graph.Graph String)
-formatTypeBinding binding = (Flows.bind Monads.getState (\g -> Flows.bind (Monads.eitherToFlow Util.unDecodingError (Core_.type_ g (Core.bindingTerm binding))) (\typ -> Flows.pure (Strings.cat2 (Strings.cat2 (Strings.cat2 "  " (Core.unName (Core.bindingName binding))) " = ") (Core__.type_ typ)))))
+formatTypeBinding :: Graph.Graph -> Core.Binding -> Either Errors.DecodingError String
+formatTypeBinding graph binding =
+    Eithers.bind (Core_.type_ graph (Core.bindingTerm binding)) (\typ -> Right (Strings.cat2 (Strings.cat2 (Strings.cat2 "  " (Core.unName (Core.bindingName binding))) " = ") (Core__.type_ typ)))
 
--- | Build a schema map (Name -> Type) from a graph's schema
-buildSchemaMap :: (Graph.Graph -> M.Map Core.Name Core.Type)
-buildSchemaMap g = (Maybes.maybe Maps.empty (\schemaGraph -> Maps.fromList (Maybes.cat (Lists.map (\binding ->  
-  let result = (Core_.type_ schemaGraph (Core.bindingTerm binding))
-  in (Eithers.either (\_err -> Nothing) (\typ -> Just (Core.bindingName binding, (Rewriting.deannotateType typ))) result)) (Graph.graphElements schemaGraph)))) (Graph.graphSchema g))
+-- | Generate encoder or decoder modules for a list of type modules
+generateCoderModules :: (t0 -> Graph.Graph -> t1 -> Either t2 (Maybe t3)) -> Graph.Graph -> [Module__.Module] -> [t1] -> t0 -> Either t2 [t3]
+generateCoderModules codec bsGraph universeModules typeModules cx =
 
+      let universe = Maps.fromList (Lists.map (\m -> (Module__.moduleNamespace m, m)) (Lists.concat2 universeModules universeModules))
+          schemaModules = moduleTypeDepsTransitive universe universeModules
+          dataModules = moduleTermDepsTransitive universe universeModules
+          schemaElements =
+                  Lists.concat (Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionType v0 -> Just (Annotations.typeElement (Module__.typeDefinitionName v0) (Module__.typeDefinitionType v0))
+                    _ -> Nothing) (Module__.moduleDefinitions m))) (Lists.concat2 schemaModules universeModules))
+          dataElements =
+                  Lists.concat (Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionTerm v0 -> Just (Core.Binding {
+                      Core.bindingName = (Module__.termDefinitionName v0),
+                      Core.bindingTerm = (Module__.termDefinitionTerm v0),
+                      Core.bindingType = (Module__.termDefinitionType v0)})
+                    _ -> Nothing) (Module__.moduleDefinitions m))) dataModules)
+          schemaGraph = Lexical.elementsToGraph bsGraph Maps.empty schemaElements
+          schemaTypes =
+                  Eithers.either (\_ -> Maps.empty) (\_r -> _r) (Schemas.schemaGraphToTypingEnvironment Lexical.emptyContext schemaGraph)
+          allElements = Lists.concat2 schemaElements dataElements
+          graph = Lexical.elementsToGraph bsGraph schemaTypes allElements
+      in (Eithers.map (\results -> Maybes.cat results) (Eithers.mapList (\m -> codec cx graph m) typeModules))
+
+-- | Generate the lexicon content from a graph
+generateLexicon :: Graph.Graph -> Either Errors.DecodingError String
+generateLexicon graph =
+
+      let bindings = Lexical.graphToBindings graph
+          primitives = Maps.elems (Graph.graphPrimitives graph)
+          partitioned = Lists.partition (\b -> Annotations.isNativeType b) bindings
+          typeBindings = Pairs.first partitioned
+          termBindings = Pairs.second partitioned
+          sortedPrimitives = Lists.sortOn (\p -> Graph.primitiveName p) primitives
+          sortedTypes = Lists.sortOn (\b -> Core.bindingName b) typeBindings
+          sortedTerms = Lists.sortOn (\b -> Core.bindingName b) termBindings
+      in (Eithers.bind (Eithers.mapList (\b -> formatTypeBinding graph b) sortedTypes) (\typeLines ->
+        let termLines = Lists.map (\b -> formatTermBinding b) sortedTerms
+            primitiveLines = Lists.map (\p -> formatPrimitive p) sortedPrimitives
+        in (Right (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "Primitives:\n" (Strings.unlines primitiveLines)) "\nTypes:\n") (Strings.unlines typeLines)) "\nTerms:\n") (Strings.unlines termLines)))))
+
+-- | Pure core of code generation: given a coder, language, flags, bootstrap graph, universe, and modules to generate, produce a list of (filePath, content) pairs.
+generateSourceFiles :: Ord t0 => ((Module__.Module -> [Module__.Definition] -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) (M.Map t0 t1)) -> Coders.Language -> Bool -> Bool -> Bool -> Bool -> Graph.Graph -> [Module__.Module] -> [Module__.Module] -> Context.Context -> Either (Context.InContext Errors.Error) [(t0, t1)])
+generateSourceFiles printDefinitions lang doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings bsGraph universeModules modsToGenerate cx =
+
+      let namespaceMap =
+              Maps.fromList (Lists.map (\m -> (Module__.moduleNamespace m, m)) (Lists.concat2 universeModules modsToGenerate))
+          constraints = Coders.languageConstraints lang
+          typeModulesToGenerate =
+                  Lists.filter (\mod -> Logic.not (Lists.null (Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionType v0 -> Just (Annotations.typeElement (Module__.typeDefinitionName v0) (Module__.typeDefinitionType v0))
+                    _ -> Nothing) (Module__.moduleDefinitions mod))))) modsToGenerate
+          termModulesToGenerate =
+                  Lists.filter (\mod -> Logic.not (Lists.null (Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionTerm v0 -> Just (Core.Binding {
+                      Core.bindingName = (Module__.termDefinitionName v0),
+                      Core.bindingTerm = (Module__.termDefinitionTerm v0),
+                      Core.bindingType = (Module__.termDefinitionType v0)})
+                    _ -> Nothing) (Module__.moduleDefinitions mod))))) modsToGenerate
+          schemaMods = moduleTypeDepsTransitive namespaceMap modsToGenerate
+          schemaElements =
+                  Lists.concat (Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionType v0 -> Just (Annotations.typeElement (Module__.typeDefinitionName v0) (Module__.typeDefinitionType v0))
+                    _ -> Nothing) (Module__.moduleDefinitions m))) (Lists.concat2 schemaMods typeModulesToGenerate))
+          dataMods = moduleTermDepsTransitive namespaceMap modsToGenerate
+          dataElements =
+                  Lists.concat (Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionTerm v0 -> Just (Core.Binding {
+                      Core.bindingName = (Module__.termDefinitionName v0),
+                      Core.bindingTerm = (Module__.termDefinitionTerm v0),
+                      Core.bindingType = (Module__.termDefinitionType v0)})
+                    _ -> Nothing) (Module__.moduleDefinitions m))) dataMods)
+          schemaGraph = Lexical.elementsToGraph bsGraph Maps.empty schemaElements
+          schemaTypes2 =
+                  Eithers.either (\_ -> Maps.empty) (\_r -> _r) (Schemas.schemaGraphToTypingEnvironment Lexical.emptyContext schemaGraph)
+          dataGraph = Lexical.elementsToGraph bsGraph schemaTypes2 dataElements
+      in (Eithers.bind (Logic.ifElse (Lists.null typeModulesToGenerate) (Right []) (
+        let nameLists =
+                Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                  Module__.DefinitionType v0 -> Just (Module__.typeDefinitionName v0)
+                  _ -> Nothing) (Module__.moduleDefinitions m))) typeModulesToGenerate
+        in (Eithers.bind (Eithers.bimap (\s -> Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError s)),
+          Context.inContextContext = cx}) (\r -> r) (Adapt.schemaGraphToDefinitions constraints schemaGraph nameLists cx)) (\schemaResult ->
+          let defLists = Pairs.second schemaResult
+              schemaGraphWithTypes =
+                      Graph.Graph {
+                        Graph.graphBoundTerms = (Graph.graphBoundTerms schemaGraph),
+                        Graph.graphBoundTypes = (Graph.graphBoundTypes schemaGraph),
+                        Graph.graphClassConstraints = (Graph.graphClassConstraints schemaGraph),
+                        Graph.graphLambdaVariables = (Graph.graphLambdaVariables schemaGraph),
+                        Graph.graphMetadata = (Graph.graphMetadata schemaGraph),
+                        Graph.graphPrimitives = (Graph.graphPrimitives schemaGraph),
+                        Graph.graphSchemaTypes = schemaTypes2,
+                        Graph.graphTypeVariables = (Graph.graphTypeVariables schemaGraph)}
+          in (Eithers.map (\xs -> Lists.concat xs) (Eithers.mapList (\p ->
+            let mod = Pairs.first p
+                defs = Pairs.second p
+            in (Eithers.map (\m -> Maps.toList m) (printDefinitions mod (Lists.map (\d -> Module__.DefinitionType d) defs) cx schemaGraphWithTypes))) (Lists.zip typeModulesToGenerate defLists))))))) (\schemaFiles -> Eithers.bind (Logic.ifElse (Lists.null termModulesToGenerate) (Right []) (
+        let namespaces = Lists.map (\m -> Module__.moduleNamespace m) termModulesToGenerate
+        in (Eithers.bind (Eithers.bimap (\s -> Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError s)),
+          Context.inContextContext = cx}) (\r -> r) (Adapt.dataGraphToDefinitions constraints doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings dataElements dataGraph namespaces cx)) (\dataResult ->
+          let g1 = Pairs.first dataResult
+              defLists = Pairs.second dataResult
+              defName =
+                      \d -> case d of
+                        Module__.DefinitionTerm v0 -> Module__.termDefinitionName v0
+                        Module__.DefinitionType v0 -> Module__.typeDefinitionName v0
+              refreshModule =
+                      \els -> \m -> Module__.Module {
+                        Module__.moduleNamespace = (Module__.moduleNamespace m),
+                        Module__.moduleDefinitions = (Maybes.cat (Lists.map (\d -> case d of
+                          Module__.DefinitionType v0 -> Just (Module__.DefinitionType v0)
+                          Module__.DefinitionTerm v0 -> Maybes.map (\b -> Module__.DefinitionTerm (Module__.TermDefinition {
+                            Module__.termDefinitionName = (Core.bindingName b),
+                            Module__.termDefinitionTerm = (Core.bindingTerm b),
+                            Module__.termDefinitionType = (Core.bindingType b)})) (Lists.find (\b -> Equality.equal (Core.bindingName b) (Module__.termDefinitionName v0)) els)) (Module__.moduleDefinitions m))),
+                        Module__.moduleTermDependencies = (Module__.moduleTermDependencies m),
+                        Module__.moduleTypeDependencies = (Module__.moduleTypeDependencies m),
+                        Module__.moduleDescription = (Module__.moduleDescription m)}
+              allBindings = Lexical.graphToBindings g1
+              refreshedMods = Lists.map (\m -> refreshModule allBindings m) termModulesToGenerate
+              dedupDefs = \defs -> Maps.elems (Maps.fromList (Lists.map (\d -> (Module__.termDefinitionName d, d)) defs))
+              dedupedDefLists = Lists.map dedupDefs defLists
+          in (Eithers.map (\xs -> Lists.concat xs) (Eithers.mapList (\p ->
+            let mod = Pairs.first p
+                defs = Pairs.second p
+            in (Eithers.map (\m -> Maps.toList m) (printDefinitions mod (Lists.map (\d -> Module__.DefinitionTerm d) defs) cx g1))) (Lists.zip refreshedMods dedupedDefLists))))))) (\termFiles -> Right (Lists.concat2 schemaFiles termFiles))))
+
+-- | Perform type inference and generate the lexicon for a set of modules
+inferAndGenerateLexicon :: Context.Context -> Graph.Graph -> [Module__.Module] -> Either String String
+inferAndGenerateLexicon cx bsGraph kernelModules =
+
+      let g0 = modulesToGraph bsGraph kernelModules kernelModules
+          dataElements =
+                  Lists.concat (Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionTerm v0 -> Just (Core.Binding {
+                      Core.bindingName = (Module__.termDefinitionName v0),
+                      Core.bindingTerm = (Module__.termDefinitionTerm v0),
+                      Core.bindingType = (Module__.termDefinitionType v0)})
+                    _ -> Nothing) (Module__.moduleDefinitions m))) kernelModules)
+      in (Eithers.bind (Eithers.bimap (\ic -> Errors_.error (Context.inContextObject ic)) (\x -> x) (Inference.inferGraphTypes cx dataElements g0)) (\inferResultWithCx ->
+        let g1 = Pairs.first (Pairs.first inferResultWithCx)
+        in (Eithers.bimap Errors.unDecodingError (\x -> x) (generateLexicon g1))))
+
+-- | Perform type inference on modules and reconstruct with inferred types
+inferModules :: Context.Context -> Graph.Graph -> [Module__.Module] -> [Module__.Module] -> Either (Context.InContext Errors.Error) [Module__.Module]
+inferModules cx bsGraph universeMods targetMods =
+
+      let g0 = modulesToGraph bsGraph universeMods universeMods
+          dataElements =
+                  Lists.concat (Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionTerm v0 -> Just (Core.Binding {
+                      Core.bindingName = (Module__.termDefinitionName v0),
+                      Core.bindingTerm = (Module__.termDefinitionTerm v0),
+                      Core.bindingType = (Module__.termDefinitionType v0)})
+                    _ -> Nothing) (Module__.moduleDefinitions m))) universeMods)
+      in (Eithers.bind (Inference.inferGraphTypes cx dataElements g0) (\inferResultWithCx ->
+        let inferResult = Pairs.first inferResultWithCx
+            g1 = Pairs.first inferResult
+            inferredElements = Pairs.second inferResult
+            isTypeOnlyModule =
+                    \mod -> Logic.not (Logic.not (Lists.null (Maybes.cat (Lists.map (\d -> case d of
+                      Module__.DefinitionTerm v0 -> Just (Core.Binding {
+                        Core.bindingName = (Module__.termDefinitionName v0),
+                        Core.bindingTerm = (Module__.termDefinitionTerm v0),
+                        Core.bindingType = (Module__.termDefinitionType v0)})
+                      _ -> Nothing) (Module__.moduleDefinitions mod)))))
+            defName =
+                    \d -> case d of
+                      Module__.DefinitionTerm v0 -> Module__.termDefinitionName v0
+                      Module__.DefinitionType v0 -> Module__.typeDefinitionName v0
+            refreshModule =
+                    \m -> Logic.ifElse (isTypeOnlyModule m) m (Module__.Module {
+                      Module__.moduleNamespace = (Module__.moduleNamespace m),
+                      Module__.moduleDefinitions = (Maybes.cat (Lists.map (\d -> case d of
+                        Module__.DefinitionType v0 -> Just (Module__.DefinitionType v0)
+                        Module__.DefinitionTerm v0 -> Maybes.map (\b -> Module__.DefinitionTerm (Module__.TermDefinition {
+                          Module__.termDefinitionName = (Core.bindingName b),
+                          Module__.termDefinitionTerm = (Core.bindingTerm b),
+                          Module__.termDefinitionType = (Core.bindingType b)})) (Lists.find (\b -> Equality.equal (Core.bindingName b) (Module__.termDefinitionName v0)) inferredElements)) (Module__.moduleDefinitions m))),
+                      Module__.moduleTermDependencies = (Module__.moduleTermDependencies m),
+                      Module__.moduleTypeDependencies = (Module__.moduleTypeDependencies m),
+                      Module__.moduleDescription = (Module__.moduleDescription m)})
+        in (Right (Lists.map refreshModule targetMods))))
+
+-- | Compute transitive closure of term dependencies for a set of modules
+moduleTermDepsTransitive :: M.Map Module__.Namespace Module__.Module -> [Module__.Module] -> [Module__.Module]
+moduleTermDepsTransitive nsMap modules =
+
+      let closure =
+              Sets.union (transitiveDeps (\m -> Module__.moduleTermDependencies m) nsMap modules) (Sets.fromList (Lists.map (\m -> Module__.moduleNamespace m) modules))
+      in (Maybes.cat (Lists.map (\n -> Maps.lookup n nsMap) (Sets.toList closure)))
+
+-- | Convert a Module to a JSON string
+moduleToJson :: Module__.Module -> Either String String
+moduleToJson m =
+
+      let term = Module_.module_ m
+      in (Eithers.map (\json -> Writer.printJson json) (Encode.toJson term))
+
 -- | Convert a generated Module into a Source module
-moduleToSourceModule :: (Module__.Module -> Module__.Module)
-moduleToSourceModule m =  
-  let sourceNs = (Module__.Namespace (Strings.cat2 "hydra.sources." (Strings.intercalate "." (Lists.drop 1 (Strings.splitOn "." (Module__.unNamespace (Module__.moduleNamespace m)))))))
-  in  
-    let modTypeNs = (Module__.Namespace "hydra.module")
-    in  
-      let moduleBinding = Core.Binding {
-              Core.bindingName = (Core.Name (Strings.cat2 (Module__.unNamespace sourceNs) ".module_")),
-              Core.bindingTerm = (Module_.module_ m),
-              Core.bindingType = Nothing}
+moduleToSourceModule :: Module__.Module -> Module__.Module
+moduleToSourceModule m =
+
+      let sourceNs =
+              Module__.Namespace (Strings.cat2 "hydra.sources." (Strings.intercalate "." (Lists.drop 1 (Strings.splitOn "." (Module__.unNamespace (Module__.moduleNamespace m))))))
+          modTypeNs = Module__.Namespace "hydra.module"
+          moduleDef =
+                  Module__.DefinitionTerm (Module__.TermDefinition {
+                    Module__.termDefinitionName = (Core.Name (Strings.cat2 (Module__.unNamespace sourceNs) ".module_")),
+                    Module__.termDefinitionTerm = (Module_.module_ m),
+                    Module__.termDefinitionType = Nothing})
       in Module__.Module {
         Module__.moduleNamespace = sourceNs,
-        Module__.moduleElements = [
-          moduleBinding],
+        Module__.moduleDefinitions = [
+          moduleDef],
         Module__.moduleTermDependencies = [
           modTypeNs],
         Module__.moduleTypeDependencies = [
           modTypeNs],
         Module__.moduleDescription = (Just (Strings.cat2 "Source module for " (Module__.unNamespace (Module__.moduleNamespace m))))}
 
--- | Generate the lexicon content from a graph
-generateLexicon :: (Graph.Graph -> Compute.Flow Graph.Graph String)
-generateLexicon graph =  
-  let bindings = (Graph.graphElements graph)
-  in  
-    let primitives = (Maps.elems (Graph.graphPrimitives graph))
-    in  
-      let partitioned = (Lists.partition (\b -> Annotations.isNativeType b) bindings)
-      in  
-        let typeBindings = (Pairs.first partitioned)
-        in  
-          let termBindings = (Pairs.second partitioned)
-          in  
-            let sortedPrimitives = (Lists.sortOn (\p -> Graph.primitiveName p) primitives)
-            in  
-              let sortedTypes = (Lists.sortOn (\b -> Core.bindingName b) typeBindings)
-              in  
-                let sortedTerms = (Lists.sortOn (\b -> Core.bindingName b) termBindings)
-                in (Flows.bind (Flows.mapList (\b -> formatTypeBinding b) sortedTypes) (\typeLines ->  
-                  let termLines = (Lists.map (\b -> formatTermBinding b) sortedTerms)
-                  in  
-                    let primitiveLines = (Lists.map (\p -> formatPrimitive p) sortedPrimitives)
-                    in (Flows.pure (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "Primitives:\n" (Strings.unlines primitiveLines)) "\nTypes:\n") (Strings.unlines typeLines)) "\nTerms:\n") (Strings.unlines termLines)))))
+-- | Compute transitive closure of type dependencies for a set of modules
+moduleTypeDepsTransitive :: M.Map Module__.Namespace Module__.Module -> [Module__.Module] -> [Module__.Module]
+moduleTypeDepsTransitive nsMap modules =
 
--- | Convert a Module to a JSON string
-moduleToJson :: (Module__.Module -> Either String String)
-moduleToJson m =  
-  let term = (Module_.module_ m)
-  in (Eithers.map (\json -> Writer.printJson json) (Encode.toJson term))
+      let termMods = moduleTermDepsTransitive nsMap modules
+          typeNamespaces = Sets.toList (transitiveDeps (\m -> Module__.moduleTypeDependencies m) nsMap termMods)
+      in (Maybes.cat (Lists.map (\n -> Maps.lookup n nsMap) typeNamespaces))
 
--- | Perform type inference on modules and reconstruct with inferred types
-inferModules :: (Graph.Graph -> [Module__.Module] -> [Module__.Module] -> Compute.Flow t0 [Module__.Module])
-inferModules bsGraph universeMods targetMods =  
-  let g0 = (modulesToGraph bsGraph universeMods universeMods)
-  in (Flows.bind (Inference.inferGraphTypes g0) (\g1 ->  
-    let inferredElements = (Graph.graphElements g1)
-    in  
-      let isTypeModule = (\mod -> Lists.null (Lists.filter (\e -> Logic.not (Annotations.isNativeType e)) (Module__.moduleElements mod)))
-      in  
-        let refreshModule = (\m -> Logic.ifElse (isTypeModule m) m (Module__.Module {
-                Module__.moduleNamespace = (Module__.moduleNamespace m),
-                Module__.moduleElements = (Maybes.cat (Lists.map (\e -> Lists.find (\b -> Equality.equal (Core.bindingName b) (Core.bindingName e)) inferredElements) (Module__.moduleElements m))),
-                Module__.moduleTermDependencies = (Module__.moduleTermDependencies m),
-                Module__.moduleTypeDependencies = (Module__.moduleTypeDependencies m),
-                Module__.moduleDescription = (Module__.moduleDescription m)}))
-        in (Flows.pure (Lists.map refreshModule targetMods))))
+-- | Build a graph from universe modules and working modules, using an explicit bootstrap graph
+modulesToGraph :: Graph.Graph -> [Module__.Module] -> [Module__.Module] -> Graph.Graph
+modulesToGraph bsGraph universeModules modules =
 
--- | Generate encoder or decoder modules for a list of type modules
-generateCoderModules :: ((t0 -> Compute.Flow Graph.Graph (Maybe t1)) -> Graph.Graph -> [Module__.Module] -> [t0] -> Compute.Flow t2 [t1])
-generateCoderModules codec bsGraph universeModules typeModules =  
-  let graph = (modulesToGraph bsGraph universeModules universeModules)
-  in (Maybes.maybe (Flows.fail "No schema graph available") (\schemaGraph -> Monads.withState schemaGraph (Flows.map (\results -> Maybes.cat results) (Flows.mapList codec typeModules))) (Graph.graphSchema graph))
+      let universe = Maps.fromList (Lists.map (\m -> (Module__.moduleNamespace m, m)) (Lists.concat2 universeModules modules))
+          schemaModules = moduleTypeDepsTransitive universe modules
+          dataModules = moduleTermDepsTransitive universe modules
+          schemaElements =
+                  Lists.concat (Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionType v0 -> Just (Annotations.typeElement (Module__.typeDefinitionName v0) (Module__.typeDefinitionType v0))
+                    _ -> Nothing) (Module__.moduleDefinitions m))) (Lists.concat2 schemaModules modules))
+          dataElements =
+                  Lists.concat (Lists.map (\m -> Maybes.cat (Lists.map (\d -> case d of
+                    Module__.DefinitionTerm v0 -> Just (Core.Binding {
+                      Core.bindingName = (Module__.termDefinitionName v0),
+                      Core.bindingTerm = (Module__.termDefinitionTerm v0),
+                      Core.bindingType = (Module__.termDefinitionType v0)})
+                    _ -> Nothing) (Module__.moduleDefinitions m))) dataModules)
+          schemaGraph = Lexical.elementsToGraph bsGraph Maps.empty schemaElements
+          schemaTypes =
+                  Eithers.either (\_ -> Maps.empty) (\_r -> _r) (Schemas.schemaGraphToTypingEnvironment Lexical.emptyContext schemaGraph)
+      in (Lexical.elementsToGraph bsGraph schemaTypes dataElements)
 
--- | Perform type inference and generate the lexicon for a set of modules
-inferAndGenerateLexicon :: (Graph.Graph -> [Module__.Module] -> Compute.Flow t0 String)
-inferAndGenerateLexicon bsGraph kernelModules =  
-  let g0 = (modulesToGraph bsGraph kernelModules kernelModules)
-  in (Flows.bind (Inference.inferGraphTypes g0) (\g1 -> Monads.withState g1 (generateLexicon g1)))
+-- | Convert a namespace to a file path (e.g., hydra.core -> hydra/core)
+namespaceToPath :: Module__.Namespace -> String
+namespaceToPath ns = Strings.intercalate "/" (Strings.splitOn "." (Module__.unNamespace ns))
 
--- | Escape unescaped control characters inside JSON string literals
-escapeControlCharsInJson :: ([Int] -> [Int])
-escapeControlCharsInJson input =  
-  let hexDigit = (\n -> Logic.ifElse (Equality.lt n 10) (Math.add 48 n) (Math.add 97 (Math.sub n 10)))
-  in  
-    let escapeToUnicode = (\b -> [
-            92,
-            117,
-            48,
-            48,
-            (hexDigit (Math.div b 16)),
-            (hexDigit (Math.mod b 16))])
-    in  
-      let go = (\inStr -> \esc -> \bytes -> Logic.ifElse (Lists.null bytes) [] ( 
-              let b = (Lists.head bytes)
-              in  
-                let bs = (Lists.tail bytes)
-                in (Logic.ifElse esc (Lists.cons b (go inStr False bs)) (Logic.ifElse (Logic.and (Equality.equal b 92) inStr) (Lists.cons b (go inStr True bs)) (Logic.ifElse (Equality.equal b 34) (Lists.cons b (go (Logic.not inStr) False bs)) (Logic.ifElse (Logic.and inStr (Equality.lt b 32)) (Lists.concat2 (escapeToUnicode b) (go inStr False bs)) (Lists.cons b (go inStr False bs))))))))
-      in (go False False input)
+-- | Strip TypeSchemes from term definitions in a module, preserving type definitions. JSON-loaded modules carry inferred TypeSchemes from the original compilation. After adaptation (e.g., bigfloat -> float64), these TypeSchemes become stale and can cause inference errors. Stripping them allows the inference engine to reconstruct correct TypeSchemes from scratch.
+stripModuleTypeSchemes :: Module__.Module -> Module__.Module
+stripModuleTypeSchemes m =
 
--- | Decode a single module from a JSON value
-decodeModuleFromJson :: (Graph.Graph -> [Module__.Module] -> Bool -> Model.Value -> Either String Module__.Module)
-decodeModuleFromJson bsGraph universeModules doStripTypeSchemes jsonVal =  
-  let graph = (modulesToGraph bsGraph universeModules universeModules)
-  in  
-    let schemaMap = (buildSchemaMap graph)
-    in  
-      let modType = (Core.TypeVariable (Core.Name "hydra.module.Module"))
-      in (Eithers.either (\err -> Left err) (\term -> Eithers.either (\decErr -> Left (Util.unDecodingError decErr)) (\mod -> Right (Logic.ifElse doStripTypeSchemes (stripModuleTypeSchemes mod) mod)) (Module.module_ graph term)) (Decode.fromJson schemaMap modType jsonVal))
+      let stripDef =
+              \d -> case d of
+                Module__.DefinitionTerm v0 -> Module__.DefinitionTerm (Module__.TermDefinition {
+                  Module__.termDefinitionName = (Module__.termDefinitionName v0),
+                  Module__.termDefinitionTerm = (Module__.termDefinitionTerm v0),
+                  Module__.termDefinitionType = Nothing})
+                _ -> d
+      in Module__.Module {
+        Module__.moduleNamespace = (Module__.moduleNamespace m),
+        Module__.moduleDefinitions = (Lists.map stripDef (Module__.moduleDefinitions m)),
+        Module__.moduleTermDependencies = (Module__.moduleTermDependencies m),
+        Module__.moduleTypeDependencies = (Module__.moduleTypeDependencies m),
+        Module__.moduleDescription = (Module__.moduleDescription m)}
+
+-- | Compute transitive closure of module dependencies
+transitiveDeps :: (Module__.Module -> [Module__.Namespace]) -> M.Map Module__.Namespace Module__.Module -> [Module__.Module] -> S.Set Module__.Namespace
+transitiveDeps getDeps nsMap startMods =
+
+      let initialDeps =
+              Sets.fromList (Lists.concat (Lists.map (\m -> Lists.filter (\dep -> Logic.not (Equality.equal dep (Module__.moduleNamespace m))) (getDeps m)) startMods))
+          go =
+                  \pending -> \visited -> Logic.ifElse (Sets.null pending) visited (
+                    let newVisited = Sets.union visited pending
+                        nextDeps =
+                                Sets.fromList (Lists.concat (Lists.map (\nsv -> Maybes.maybe [] (\depMod -> getDeps depMod) (Maps.lookup nsv nsMap)) (Sets.toList pending)))
+                        newPending = Sets.difference nextDeps newVisited
+                    in (go newPending newVisited))
+      in (go initialDeps Sets.empty)
diff --git a/src/gen-main/haskell/Hydra/CoderUtils.hs b/src/gen-main/haskell/Hydra/CoderUtils.hs
--- a/src/gen-main/haskell/Hydra/CoderUtils.hs
+++ b/src/gen-main/haskell/Hydra/CoderUtils.hs
@@ -8,13 +8,13 @@
 import qualified Hydra.Arity as Arity
 import qualified Hydra.Checking as Checking
 import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Formatting as Formatting
 import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Maps as Maps
@@ -23,10 +23,13 @@
 import qualified Hydra.Lib.Pairs as Pairs
 import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
+import qualified Hydra.Module as Module
+import qualified Hydra.Names as Names
 import qualified Hydra.Rewriting as Rewriting
 import qualified Hydra.Schemas as Schemas
+import qualified Hydra.Sorting as Sorting
 import qualified Hydra.Typing as Typing
+import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -34,334 +37,296 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | Normalize a comment string for consistent output across coders
-normalizeComment :: (String -> String)
-normalizeComment s =  
-  let stripped = (Formatting.stripLeadingAndTrailingWhitespace s)
-  in (Logic.ifElse (Strings.null stripped) "" ( 
-    let lastIdx = (Math.sub (Strings.length stripped) 1)
-    in  
-      let lastChar = (Strings.charAt lastIdx stripped)
-      in (Logic.ifElse (Equality.equal lastChar 46) stripped (Strings.cat2 stripped "."))))
+-- | Analyze a function term, collecting lambdas, type lambdas, lets, and type applications
+analyzeFunctionTerm :: Context.Context -> (t0 -> Graph.Graph) -> (Graph.Graph -> t0 -> t0) -> t0 -> Core.Term -> Either t1 (Typing.FunctionStructure t0)
+analyzeFunctionTerm cx getTC setTC env term = analyzeFunctionTermWith cx bindingMetadata getTC setTC env term
 
--- | Gather applications from a term, returning (args, baseTerm)
-gatherApplications :: (Core.Term -> ([Core.Term], Core.Term))
-gatherApplications term =  
-  let go = (\args -> \t -> (\x -> case x of
-          Core.TermApplication v1 ->  
-            let lhs = (Core.applicationFunction v1)
-            in  
-              let rhs = (Core.applicationArgument v1)
-              in (go (Lists.cons rhs args) lhs)
-          _ -> (args, t)) (Rewriting.deannotateTerm t))
-  in (go [] term)
+-- | Analyze a function term with configurable binding metadata
+analyzeFunctionTermWith :: Context.Context -> (Graph.Graph -> Core.Binding -> Maybe Core.Term) -> (t0 -> Graph.Graph) -> (Graph.Graph -> t0 -> t0) -> t0 -> Core.Term -> Either t1 (Typing.FunctionStructure t0)
+analyzeFunctionTermWith cx forBinding getTC setTC env term =
+    analyzeFunctionTermWith_gather cx forBinding getTC setTC True env [] [] [] [] [] term
 
--- | Gather term arguments, stripping type-level constructs
-gatherArgs :: (Core.Term -> [Core.Term] -> (Core.Term, [Core.Term]))
-gatherArgs term args = ((\x -> case x of
-  Core.TermApplication v1 ->  
-    let lhs = (Core.applicationFunction v1)
-    in  
-      let rhs = (Core.applicationArgument v1)
-      in (gatherArgs lhs (Lists.cons rhs args))
-  Core.TermTypeLambda v1 ->  
-    let body = (Core.typeLambdaBody v1)
-    in (gatherArgs body args)
-  Core.TermTypeApplication v1 ->  
-    let body = (Core.typeApplicationTermBody v1)
-    in (gatherArgs body args)
-  _ -> (term, args)) (Rewriting.deannotateTerm term))
+analyzeFunctionTermWith_finish :: Context.Context -> (t0 -> Graph.Graph) -> t0 -> [Core.Name] -> [Core.Name] -> [Core.Binding] -> [Core.Type] -> [Core.Type] -> Core.Term -> Either t1 (Typing.FunctionStructure t0)
+analyzeFunctionTermWith_finish cx getTC fEnv tparams args bindings doms tapps body =
 
--- | Gather term and type arguments from a term
-gatherArgsWithTypeApps :: (Core.Term -> [Core.Term] -> [Core.Type] -> (Core.Term, ([Core.Term], [Core.Type])))
-gatherArgsWithTypeApps term args tyArgs = ((\x -> case x of
-  Core.TermApplication v1 ->  
-    let lhs = (Core.applicationFunction v1)
-    in  
-      let rhs = (Core.applicationArgument v1)
-      in (gatherArgsWithTypeApps lhs (Lists.cons rhs args) tyArgs)
-  Core.TermTypeLambda v1 ->  
-    let body = (Core.typeLambdaBody v1)
-    in (gatherArgsWithTypeApps body args tyArgs)
-  Core.TermTypeApplication v1 ->  
-    let body = (Core.typeApplicationTermBody v1)
-    in  
-      let typ = (Core.typeApplicationTermType v1)
-      in (gatherArgsWithTypeApps body args (Lists.cons typ tyArgs))
-  _ -> (term, (args, tyArgs))) (Rewriting.deannotateTerm term))
+      let bodyWithTapps =
+              Lists.foldl (\trm -> \typ -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = trm,
+                Core.typeApplicationTermType = typ})) body tapps
+          mcod = Eithers.either (\_ -> Nothing) (\c -> Just c) (typeOfTerm cx (getTC fEnv) bodyWithTapps)
+      in (Right (Typing.FunctionStructure {
+        Typing.functionStructureTypeParams = (Lists.reverse tparams),
+        Typing.functionStructureParams = (Lists.reverse args),
+        Typing.functionStructureBindings = bindings,
+        Typing.functionStructureBody = bodyWithTapps,
+        Typing.functionStructureDomains = (Lists.reverse doms),
+        Typing.functionStructureCodomain = mcod,
+        Typing.functionStructureEnvironment = fEnv}))
 
--- | Check if a term can be encoded as a simple assignment
-isSimpleAssignment :: (Core.Term -> Bool)
-isSimpleAssignment term = ((\x -> case x of
-  Core.TermAnnotated v1 -> (isSimpleAssignment (Core.annotatedTermBody v1))
-  Core.TermFunction v1 -> ((\x -> case x of
-    Core.FunctionLambda _ -> False
-    _ -> True) v1)
-  Core.TermLet _ -> False
-  Core.TermTypeLambda _ -> False
-  Core.TermTypeApplication v1 -> (isSimpleAssignment (Core.typeApplicationTermBody v1))
-  _ ->  
-    let baseTerm = (Pairs.first (gatherArgs term []))
-    in ((\x -> case x of
-      Core.TermFunction v1 -> ((\x -> case x of
-        Core.FunctionElimination v2 -> ((\x -> case x of
-          Core.EliminationUnion _ -> False
-          _ -> True) v2)
-        _ -> True) v1)
-      _ -> True) baseTerm)) term)
+analyzeFunctionTermWith_gather :: Context.Context -> (Graph.Graph -> Core.Binding -> Maybe Core.Term) -> (t0 -> Graph.Graph) -> (Graph.Graph -> t0 -> t0) -> Bool -> t0 -> [Core.Name] -> [Core.Name] -> [Core.Binding] -> [Core.Type] -> [Core.Type] -> Core.Term -> Either t1 (Typing.FunctionStructure t0)
+analyzeFunctionTermWith_gather cx forBinding getTC setTC argMode gEnv tparams args bindings doms tapps t =
+    case (Rewriting.deannotateTerm t) of
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionLambda v1 -> Logic.ifElse argMode (
+          let v = Core.lambdaParameter v1
+              dom = Maybes.maybe (Core.TypeVariable (Core.Name "_")) (\x_ -> x_) (Core.lambdaDomain v1)
+              body = Core.lambdaBody v1
+              newEnv = setTC (Rewriting.extendGraphForLambda (getTC gEnv) v1) gEnv
+          in (analyzeFunctionTermWith_gather cx forBinding getTC setTC argMode newEnv tparams (Lists.cons v args) bindings (Lists.cons dom doms) tapps body)) (analyzeFunctionTermWith_finish cx getTC gEnv tparams args bindings doms tapps t)
+        _ -> analyzeFunctionTermWith_finish cx getTC gEnv tparams args bindings doms tapps t
+      Core.TermLet v0 ->
+        let newBindings = Core.letBindings v0
+            body = Core.letBody v0
+            newEnv = setTC (Rewriting.extendGraphForLet forBinding (getTC gEnv) v0) gEnv
+        in (analyzeFunctionTermWith_gather cx forBinding getTC setTC False newEnv tparams args (Lists.concat2 bindings newBindings) doms tapps body)
+      Core.TermTypeApplication v0 ->
+        let taBody = Core.typeApplicationTermBody v0
+            typ = Core.typeApplicationTermType v0
+        in (analyzeFunctionTermWith_gather cx forBinding getTC setTC argMode gEnv tparams args bindings doms (Lists.cons typ tapps) taBody)
+      Core.TermTypeLambda v0 ->
+        let tvar = Core.typeLambdaParameter v0
+            tlBody = Core.typeLambdaBody v0
+            newEnv = setTC (Rewriting.extendGraphForTypeLambda (getTC gEnv) v0) gEnv
+        in (analyzeFunctionTermWith_gather cx forBinding getTC setTC argMode newEnv (Lists.cons tvar tparams) args bindings doms tapps tlBody)
+      _ -> analyzeFunctionTermWith_finish cx getTC gEnv tparams args bindings doms tapps t
 
--- | Check if a term needs to be treated as a function rather than a simple value
-isComplexTerm :: (Typing.TypeContext -> Core.Term -> Bool)
-isComplexTerm tc t = ((\x -> case x of
-  Core.TermLet _ -> True
-  Core.TermTypeApplication _ -> True
-  Core.TermTypeLambda _ -> True
-  Core.TermVariable v1 -> (isComplexVariable tc v1)
-  _ -> (Lists.foldl (\b -> \sub -> Logic.or b (isComplexTerm tc sub)) False (Rewriting.subterms t))) t)
+-- | Produces metadata for a binding if it is complex
+bindingMetadata :: Graph.Graph -> Core.Binding -> Maybe Core.Term
+bindingMetadata tc b = Logic.ifElse (isComplexBinding tc b) (Just (Core.TermLiteral (Core.LiteralBoolean True))) Nothing
 
--- | Check if a variable is bound to a complex term
-isComplexVariable :: (Typing.TypeContext -> Core.Name -> Bool)
-isComplexVariable tc name =  
-  let metaLookup = (Maps.lookup name (Typing.typeContextMetadata tc))
-  in (Logic.ifElse (Maybes.isJust metaLookup) True (Logic.ifElse (Sets.member name (Typing.typeContextLambdaVariables tc)) True ( 
-    let typeLookup = (Maps.lookup name (Typing.typeContextTypes tc))
-    in (Logic.not (Maybes.isJust typeLookup)))))
+-- | Extract comments/description from a Binding
+commentsFromBinding :: Context.Context -> Graph.Graph -> Core.Binding -> Either (Context.InContext Errors.Error) (Maybe String)
+commentsFromBinding cx g b = Annotations.getTermDescription cx g (Core.bindingTerm b)
 
--- | Check if a binding needs to be treated as a function
-isComplexBinding :: (Typing.TypeContext -> Core.Binding -> Bool)
-isComplexBinding tc b =  
-  let term = (Core.bindingTerm b)
-  in  
-    let mts = (Core.bindingType b)
-    in (Maybes.cases mts (isComplexTerm tc term) (\ts ->  
-      let isPolymorphic = (Logic.not (Lists.null (Core.typeSchemeVariables ts)))
-      in  
-        let isNonNullary = (Equality.gt (Arity.typeArity (Core.typeSchemeType ts)) 0)
-        in  
-          let isComplex = (isComplexTerm tc term)
-          in (Logic.or (Logic.or isPolymorphic isNonNullary) isComplex)))
+-- | Extract comments/description from a FieldType
+commentsFromFieldType :: Context.Context -> Graph.Graph -> Core.FieldType -> Either (Context.InContext Errors.Error) (Maybe String)
+commentsFromFieldType cx g ft = Annotations.getTypeDescription cx g (Core.fieldTypeType ft)
 
--- | Check if a term is trivially cheap (no thunking needed)
-isTrivialTerm :: (Core.Term -> Bool)
-isTrivialTerm t = ((\x -> case x of
-  Core.TermLiteral _ -> True
-  Core.TermVariable _ -> True
-  Core.TermUnit -> True
-  Core.TermApplication v1 ->  
-    let fun = (Core.applicationFunction v1)
-    in  
-      let arg = (Core.applicationArgument v1)
-      in ((\x -> case x of
-        Core.TermFunction v2 -> ((\x -> case x of
-          Core.FunctionElimination v3 -> ((\x -> case x of
-            Core.EliminationRecord _ -> (isTrivialTerm arg)
-            _ -> False) v3)
-          _ -> False) v2)
-        _ -> False) fun)
-  Core.TermMaybe v1 -> (Maybes.maybe True (\inner -> isTrivialTerm inner) v1)
-  Core.TermTypeApplication v1 -> (isTrivialTerm (Core.typeApplicationTermBody v1))
-  Core.TermTypeLambda v1 -> (isTrivialTerm (Core.typeLambdaBody v1))
-  _ -> False) (Rewriting.deannotateTerm t))
+-- | Gather applications from a term, returning (args, baseTerm)
+gatherApplications :: Core.Term -> ([Core.Term], Core.Term)
+gatherApplications term =
 
--- | Check if a term body is self-tail-recursive with respect to a function name
-isSelfTailRecursive :: (Core.Name -> Core.Term -> Bool)
-isSelfTailRecursive funcName body =  
-  let callsSelf = (Logic.not (Rewriting.isFreeVariableInTerm funcName body))
-  in (Logic.ifElse callsSelf (isTailRecursiveInTailPosition funcName body) False)
+      let go =
+              \args -> \t -> case (Rewriting.deannotateTerm t) of
+                Core.TermApplication v0 ->
+                  let lhs = Core.applicationFunction v0
+                      rhs = Core.applicationArgument v0
+                  in (go (Lists.cons rhs args) lhs)
+                _ -> (args, t)
+      in (go [] term)
 
--- | Check that all self-references are in tail position
-isTailRecursiveInTailPosition :: (Core.Name -> Core.Term -> Bool)
-isTailRecursiveInTailPosition funcName term =  
-  let stripped = (Rewriting.deannotateAndDetypeTerm term)
-  in ((\x -> case x of
-    Core.TermApplication _ ->  
-      let gathered = (gatherApplications stripped)
-      in  
-        let gatherArgs = (Pairs.first gathered)
-        in  
-          let gatherFun = (Pairs.second gathered)
-          in  
-            let strippedFun = (Rewriting.deannotateAndDetypeTerm gatherFun)
-            in ((\x -> case x of
-              Core.TermVariable v2 -> (Logic.ifElse (Equality.equal v2 funcName) ( 
-                let argsNoFunc = (Lists.foldl (\ok -> \arg -> Logic.and ok (Rewriting.isFreeVariableInTerm funcName arg)) True gatherArgs)
-                in  
-                  let argsNoLambda = (Lists.foldl (\ok -> \arg -> Logic.and ok (Logic.not (Rewriting.foldOverTerm Coders.TraversalOrderPre (\found -> \t -> Logic.or found ((\x -> case x of
-                          Core.TermFunction v3 -> ((\x -> case x of
-                            Core.FunctionLambda v4 ->  
-                              let ignore = (Core.lambdaBody v4)
-                              in True
-                            _ -> False) v3)
-                          _ -> False) t)) False arg))) True gatherArgs)
-                  in (Logic.and argsNoFunc argsNoLambda)) (Rewriting.isFreeVariableInTerm funcName term))
-              Core.TermFunction v2 -> ((\x -> case x of
-                Core.FunctionElimination v3 -> ((\x -> case x of
-                  Core.EliminationUnion v4 ->  
-                    let cases_ = (Core.caseStatementCases v4)
-                    in  
-                      let dflt = (Core.caseStatementDefault v4)
-                      in  
-                        let branchesOk = (Lists.foldl (\ok -> \field -> Logic.and ok (isTailRecursiveInTailPosition funcName (Core.fieldTerm field))) True cases_)
-                        in  
-                          let dfltOk = (Maybes.maybe True (\d -> isTailRecursiveInTailPosition funcName d) dflt)
-                          in  
-                            let argsOk = (Lists.foldl (\ok -> \arg -> Logic.and ok (Rewriting.isFreeVariableInTerm funcName arg)) True gatherArgs)
-                            in (Logic.and (Logic.and branchesOk dfltOk) argsOk)
-                  _ -> (Rewriting.isFreeVariableInTerm funcName term)) v3)
-                _ -> (Rewriting.isFreeVariableInTerm funcName term)) v2)
-              _ -> (Rewriting.isFreeVariableInTerm funcName term)) strippedFun)
-    Core.TermFunction v1 -> ((\x -> case x of
-      Core.FunctionLambda v2 -> (isTailRecursiveInTailPosition funcName (Core.lambdaBody v2))
-      _ -> (Rewriting.isFreeVariableInTerm funcName term)) v1)
-    Core.TermLet v1 ->  
-      let bindingsOk = (Lists.foldl (\ok -> \b -> Logic.and ok (Rewriting.isFreeVariableInTerm funcName (Core.bindingTerm b))) True (Core.letBindings v1))
-      in (Logic.and bindingsOk (isTailRecursiveInTailPosition funcName (Core.letBody v1)))
-    _ -> (Rewriting.isFreeVariableInTerm funcName term)) stripped)
+-- | Gather term arguments, stripping type-level constructs
+gatherArgs :: Core.Term -> [Core.Term] -> (Core.Term, [Core.Term])
+gatherArgs term args =
+    case (Rewriting.deannotateTerm term) of
+      Core.TermApplication v0 ->
+        let lhs = Core.applicationFunction v0
+            rhs = Core.applicationArgument v0
+        in (gatherArgs lhs (Lists.cons rhs args))
+      Core.TermTypeLambda v0 ->
+        let body = Core.typeLambdaBody v0
+        in (gatherArgs body args)
+      Core.TermTypeApplication v0 ->
+        let body = Core.typeApplicationTermBody v0
+        in (gatherArgs body args)
+      _ -> (term, args)
 
--- | Extract comments/description from a Binding
-commentsFromElement :: (Core.Binding -> Compute.Flow Graph.Graph (Maybe String))
-commentsFromElement b = (Annotations.getTermDescription (Core.bindingTerm b))
+-- | Gather term and type arguments from a term
+gatherArgsWithTypeApps :: Core.Term -> [Core.Term] -> [Core.Type] -> (Core.Term, ([Core.Term], [Core.Type]))
+gatherArgsWithTypeApps term args tyArgs =
+    case (Rewriting.deannotateTerm term) of
+      Core.TermApplication v0 ->
+        let lhs = Core.applicationFunction v0
+            rhs = Core.applicationArgument v0
+        in (gatherArgsWithTypeApps lhs (Lists.cons rhs args) tyArgs)
+      Core.TermTypeLambda v0 ->
+        let body = Core.typeLambdaBody v0
+        in (gatherArgsWithTypeApps body args tyArgs)
+      Core.TermTypeApplication v0 ->
+        let body = Core.typeApplicationTermBody v0
+            typ = Core.typeApplicationTermType v0
+        in (gatherArgsWithTypeApps body args (Lists.cons typ tyArgs))
+      _ -> (term, (args, tyArgs))
 
--- | Extract comments/description from a FieldType
-commentsFromFieldType :: (Core.FieldType -> Compute.Flow Graph.Graph (Maybe String))
-commentsFromFieldType ft = (Annotations.getTypeDescription (Core.fieldTypeType ft))
+-- | Check if a binding needs to be treated as a function
+isComplexBinding :: Graph.Graph -> Core.Binding -> Bool
+isComplexBinding tc b =
 
--- | Infer the type of a term with tracing
-tryTypeOf :: (String -> Typing.TypeContext -> Core.Term -> Compute.Flow t0 Core.Type)
-tryTypeOf msg tc term = (Monads.withTrace msg (Checking.typeOf tc [] term))
+      let term = Core.bindingTerm b
+          mts = Core.bindingType b
+      in (Maybes.cases mts (isComplexTerm tc term) (\ts ->
+        let isPolymorphic = Logic.not (Lists.null (Core.typeSchemeVariables ts))
+            isNonNullary = Equality.gt (Arity.typeArity (Core.typeSchemeType ts)) 0
+            isComplex = isComplexTerm tc term
+        in (Logic.or (Logic.or isPolymorphic isNonNullary) isComplex)))
 
--- | Produces metadata for a binding if it is complex
-bindingMetadata :: (Typing.TypeContext -> Core.Binding -> Maybe Core.Term)
-bindingMetadata tc b = (Logic.ifElse (isComplexBinding tc b) (Just (Core.TermLiteral (Core.LiteralBoolean True))) Nothing)
+-- | Check if a term needs to be treated as a function rather than a simple value
+isComplexTerm :: Graph.Graph -> Core.Term -> Bool
+isComplexTerm tc t =
+    case t of
+      Core.TermLet _ -> True
+      Core.TermTypeApplication _ -> True
+      Core.TermTypeLambda _ -> True
+      Core.TermVariable v0 -> isComplexVariable tc v0
+      _ -> Lists.foldl (\b -> \sub -> Logic.or b (isComplexTerm tc sub)) False (Rewriting.subterms t)
 
-analyzeFunctionTermWith_finish :: ((t0 -> Typing.TypeContext) -> t0 -> [Core.Name] -> [Core.Name] -> [Core.Binding] -> [Core.Type] -> [Core.Type] -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTermWith_finish getTC fEnv tparams args bindings doms tapps body =  
-  let bodyWithTapps = (Lists.foldl (\trm -> \typ -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = trm,
-          Core.typeApplicationTermType = typ})) body tapps)
-  in (Flows.bind (Flows.withDefault Nothing (Flows.map Maybes.pure (tryTypeOf "analyzeFunctionTermWith" (getTC fEnv) bodyWithTapps))) (\mcod -> Flows.pure (Typing.FunctionStructure {
-    Typing.functionStructureTypeParams = (Lists.reverse tparams),
-    Typing.functionStructureParams = (Lists.reverse args),
-    Typing.functionStructureBindings = bindings,
-    Typing.functionStructureBody = bodyWithTapps,
-    Typing.functionStructureDomains = (Lists.reverse doms),
-    Typing.functionStructureCodomain = mcod,
-    Typing.functionStructureEnvironment = fEnv})))
+-- | Check if a variable is bound to a complex term
+isComplexVariable :: Graph.Graph -> Core.Name -> Bool
+isComplexVariable tc name =
 
-analyzeFunctionTermWith_gather :: ((Typing.TypeContext -> Core.Binding -> Maybe Core.Term) -> (t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t0) -> Bool -> t0 -> [Core.Name] -> [Core.Name] -> [Core.Binding] -> [Core.Type] -> [Core.Type] -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTermWith_gather forBinding getTC setTC argMode gEnv tparams args bindings doms tapps t = ((\x -> case x of
-  Core.TermFunction v1 -> ((\x -> case x of
-    Core.FunctionLambda v2 -> (Logic.ifElse argMode ( 
-      let v = (Core.lambdaParameter v2)
-      in  
-        let dom = (Maybes.maybe (Core.TypeVariable (Core.Name "_")) (\x_ -> x_) (Core.lambdaDomain v2))
-        in  
-          let body = (Core.lambdaBody v2)
-          in  
-            let newEnv = (setTC (Schemas.extendTypeContextForLambda (getTC gEnv) v2) gEnv)
-            in (analyzeFunctionTermWith_gather forBinding getTC setTC argMode newEnv tparams (Lists.cons v args) bindings (Lists.cons dom doms) tapps body)) (analyzeFunctionTermWith_finish getTC gEnv tparams args bindings doms tapps t))
-    _ -> (analyzeFunctionTermWith_finish getTC gEnv tparams args bindings doms tapps t)) v1)
-  Core.TermLet v1 ->  
-    let newBindings = (Core.letBindings v1)
-    in  
-      let body = (Core.letBody v1)
-      in  
-        let newEnv = (setTC (Schemas.extendTypeContextForLet forBinding (getTC gEnv) v1) gEnv)
-        in (analyzeFunctionTermWith_gather forBinding getTC setTC False newEnv tparams args (Lists.concat2 bindings newBindings) doms tapps body)
-  Core.TermTypeApplication v1 ->  
-    let taBody = (Core.typeApplicationTermBody v1)
-    in  
-      let typ = (Core.typeApplicationTermType v1)
-      in (analyzeFunctionTermWith_gather forBinding getTC setTC argMode gEnv tparams args bindings doms (Lists.cons typ tapps) taBody)
-  Core.TermTypeLambda v1 ->  
-    let tvar = (Core.typeLambdaParameter v1)
-    in  
-      let tlBody = (Core.typeLambdaBody v1)
-      in  
-        let newEnv = (setTC (Schemas.extendTypeContextForTypeLambda (getTC gEnv) v1) gEnv)
-        in (analyzeFunctionTermWith_gather forBinding getTC setTC argMode newEnv (Lists.cons tvar tparams) args bindings doms tapps tlBody)
-  _ -> (analyzeFunctionTermWith_finish getTC gEnv tparams args bindings doms tapps t)) (Rewriting.deannotateTerm t))
+      let metaLookup = Maps.lookup name (Graph.graphMetadata tc)
+      in (Logic.ifElse (Maybes.isJust metaLookup) True (Logic.ifElse (Sets.member name (Graph.graphLambdaVariables tc)) True (
+        let typeLookup = Maps.lookup name (Graph.graphBoundTypes tc)
+        in (Maybes.maybe True (\ts -> Equality.gt (Arity.typeSchemeArity ts) 0) typeLookup))))
 
--- | Analyze a function term with configurable binding metadata
-analyzeFunctionTermWith :: ((Typing.TypeContext -> Core.Binding -> Maybe Core.Term) -> (t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t0) -> t0 -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTermWith forBinding getTC setTC env term = (analyzeFunctionTermWith_gather forBinding getTC setTC True env [] [] [] [] [] term)
+-- | Check if a term body is self-tail-recursive with respect to a function name
+isSelfTailRecursive :: Core.Name -> Core.Term -> Bool
+isSelfTailRecursive funcName body =
 
-analyzeFunctionTermNoInferWith_finish :: (t0 -> [Core.Name] -> [Core.Name] -> [Core.Binding] -> [Core.Type] -> [Core.Type] -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTermNoInferWith_finish fEnv tparams args bindings doms tapps body =  
-  let bodyWithTapps = (Lists.foldl (\trm -> \typ -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = trm,
-          Core.typeApplicationTermType = typ})) body tapps)
-  in (Flows.pure (Typing.FunctionStructure {
-    Typing.functionStructureTypeParams = (Lists.reverse tparams),
-    Typing.functionStructureParams = (Lists.reverse args),
-    Typing.functionStructureBindings = bindings,
-    Typing.functionStructureBody = bodyWithTapps,
-    Typing.functionStructureDomains = (Lists.reverse doms),
-    Typing.functionStructureCodomain = Nothing,
-    Typing.functionStructureEnvironment = fEnv}))
+      let callsSelf = Logic.not (Rewriting.isFreeVariableInTerm funcName body)
+      in (Logic.ifElse callsSelf (isTailRecursiveInTailPosition funcName body) False)
 
-analyzeFunctionTermNoInferWith_gather :: ((Typing.TypeContext -> Core.Binding -> Maybe Core.Term) -> (t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t0) -> Bool -> t0 -> [Core.Name] -> [Core.Name] -> [Core.Binding] -> [Core.Type] -> [Core.Type] -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTermNoInferWith_gather forBinding getTC setTC argMode gEnv tparams args bindings doms tapps t = ((\x -> case x of
-  Core.TermFunction v1 -> ((\x -> case x of
-    Core.FunctionLambda v2 -> (Logic.ifElse argMode ( 
-      let v = (Core.lambdaParameter v2)
-      in  
-        let dom = (Maybes.maybe (Core.TypeVariable (Core.Name "_")) (\x_ -> x_) (Core.lambdaDomain v2))
-        in  
-          let body = (Core.lambdaBody v2)
-          in  
-            let newEnv = (setTC (Schemas.extendTypeContextForLambda (getTC gEnv) v2) gEnv)
-            in (analyzeFunctionTermNoInferWith_gather forBinding getTC setTC argMode newEnv tparams (Lists.cons v args) bindings (Lists.cons dom doms) tapps body)) (analyzeFunctionTermNoInferWith_finish gEnv tparams args bindings doms tapps t))
-    _ -> (analyzeFunctionTermNoInferWith_finish gEnv tparams args bindings doms tapps t)) v1)
-  Core.TermLet v1 ->  
-    let newBindings = (Core.letBindings v1)
-    in  
-      let body = (Core.letBody v1)
-      in  
-        let newEnv = (setTC (Schemas.extendTypeContextForLet forBinding (getTC gEnv) v1) gEnv)
-        in (analyzeFunctionTermNoInferWith_gather forBinding getTC setTC False newEnv tparams args (Lists.concat2 bindings newBindings) doms tapps body)
-  Core.TermTypeApplication v1 ->  
-    let taBody = (Core.typeApplicationTermBody v1)
-    in  
-      let typ = (Core.typeApplicationTermType v1)
-      in (analyzeFunctionTermNoInferWith_gather forBinding getTC setTC argMode gEnv tparams args bindings doms (Lists.cons typ tapps) taBody)
-  Core.TermTypeLambda v1 ->  
-    let tvar = (Core.typeLambdaParameter v1)
-    in  
-      let tlBody = (Core.typeLambdaBody v1)
-      in  
-        let newEnv = (setTC (Schemas.extendTypeContextForTypeLambda (getTC gEnv) v1) gEnv)
-        in (analyzeFunctionTermNoInferWith_gather forBinding getTC setTC argMode newEnv (Lists.cons tvar tparams) args bindings doms tapps tlBody)
-  _ -> (analyzeFunctionTermNoInferWith_finish gEnv tparams args bindings doms tapps t)) (Rewriting.deannotateTerm t))
+-- | Check if a term can be encoded as a simple assignment
+isSimpleAssignment :: Core.Term -> Bool
+isSimpleAssignment term =
+    case term of
+      Core.TermAnnotated v0 -> isSimpleAssignment (Core.annotatedTermBody v0)
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionLambda _ -> False
+        _ -> True
+      Core.TermLet _ -> False
+      Core.TermTypeLambda _ -> False
+      Core.TermTypeApplication v0 -> isSimpleAssignment (Core.typeApplicationTermBody v0)
+      _ ->
+        let baseTerm = Pairs.first (gatherArgs term [])
+        in case baseTerm of
+          Core.TermFunction v0 -> case v0 of
+            Core.FunctionElimination v1 -> case v1 of
+              Core.EliminationUnion _ -> False
+              _ -> True
+            _ -> True
+          _ -> True
 
--- | Analyze a function term without type inference, with configurable binding metadata
-analyzeFunctionTermNoInferWith :: ((Typing.TypeContext -> Core.Binding -> Maybe Core.Term) -> (t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t0) -> t0 -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTermNoInferWith forBinding getTC setTC env term = (analyzeFunctionTermNoInferWith_gather forBinding getTC setTC True env [] [] [] [] [] term)
+-- | Check that all self-references are in tail position
+isTailRecursiveInTailPosition :: Core.Name -> Core.Term -> Bool
+isTailRecursiveInTailPosition funcName term =
 
--- | Analyze a function term, collecting lambdas, type lambdas, lets, and type applications
-analyzeFunctionTerm :: ((t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t0) -> t0 -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTerm getTC setTC env term = (analyzeFunctionTermWith bindingMetadata getTC setTC env term)
+      let stripped = Rewriting.deannotateAndDetypeTerm term
+      in case stripped of
+        Core.TermApplication _ ->
+          let gathered = gatherApplications stripped
+              gatherArgs = Pairs.first gathered
+              gatherFun = Pairs.second gathered
+              strippedFun = Rewriting.deannotateAndDetypeTerm gatherFun
+          in case strippedFun of
+            Core.TermVariable v1 -> Logic.ifElse (Equality.equal v1 funcName) (
+              let argsNoFunc = Lists.foldl (\ok -> \arg -> Logic.and ok (Rewriting.isFreeVariableInTerm funcName arg)) True gatherArgs
+                  argsNoLambda =
+                          Lists.foldl (\ok -> \arg -> Logic.and ok (Logic.not (Rewriting.foldOverTerm Coders.TraversalOrderPre (\found -> \t -> Logic.or found (case t of
+                            Core.TermFunction v2 -> case v2 of
+                              Core.FunctionLambda v3 ->
+                                let ignore = Core.lambdaBody v3
+                                in True
+                              _ -> False
+                            _ -> False)) False arg))) True gatherArgs
+              in (Logic.and argsNoFunc argsNoLambda)) (Rewriting.isFreeVariableInTerm funcName term)
+            Core.TermFunction v1 -> case v1 of
+              Core.FunctionElimination v2 -> case v2 of
+                Core.EliminationUnion v3 ->
+                  let cases_ = Core.caseStatementCases v3
+                      dflt = Core.caseStatementDefault v3
+                      branchesOk =
+                              Lists.foldl (\ok -> \field -> Logic.and ok (isTailRecursiveInTailPosition funcName (Core.fieldTerm field))) True cases_
+                      dfltOk = Maybes.maybe True (\d -> isTailRecursiveInTailPosition funcName d) dflt
+                      argsOk = Lists.foldl (\ok -> \arg -> Logic.and ok (Rewriting.isFreeVariableInTerm funcName arg)) True gatherArgs
+                  in (Logic.and (Logic.and branchesOk dfltOk) argsOk)
+                _ -> Rewriting.isFreeVariableInTerm funcName term
+              _ -> Rewriting.isFreeVariableInTerm funcName term
+            _ -> Rewriting.isFreeVariableInTerm funcName term
+        Core.TermFunction v0 -> case v0 of
+          Core.FunctionLambda v1 -> isTailRecursiveInTailPosition funcName (Core.lambdaBody v1)
+          _ -> Rewriting.isFreeVariableInTerm funcName term
+        Core.TermLet v0 ->
+          let bindingsOk =
+                  Lists.foldl (\ok -> \b -> Logic.and ok (Rewriting.isFreeVariableInTerm funcName (Core.bindingTerm b))) True (Core.letBindings v0)
+          in (Logic.and bindingsOk (isTailRecursiveInTailPosition funcName (Core.letBody v0)))
+        _ -> Rewriting.isFreeVariableInTerm funcName term
 
--- | Analyze a function term without recording binding metadata
-analyzeFunctionTermInline :: ((t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t0) -> t0 -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTermInline getTC setTC env term = (analyzeFunctionTermWith (\_ -> \_ -> Nothing) getTC setTC env term)
+-- | Check if a term is trivially cheap (no thunking needed)
+isTrivialTerm :: Core.Term -> Bool
+isTrivialTerm t =
+    case (Rewriting.deannotateTerm t) of
+      Core.TermLiteral _ -> True
+      Core.TermVariable _ -> True
+      Core.TermUnit -> True
+      Core.TermApplication v0 ->
+        let fun = Core.applicationFunction v0
+            arg = Core.applicationArgument v0
+        in case fun of
+          Core.TermFunction v1 -> case v1 of
+            Core.FunctionElimination v2 -> case v2 of
+              Core.EliminationRecord _ -> isTrivialTerm arg
+              Core.EliminationWrap _ -> isTrivialTerm arg
+              _ -> False
+            _ -> False
+          _ -> False
+      Core.TermMaybe v0 -> Maybes.maybe True (\inner -> isTrivialTerm inner) v0
+      Core.TermRecord v0 -> Lists.foldl (\acc -> \fld -> Logic.and acc (isTrivialTerm (Core.fieldTerm fld))) True (Core.recordFields v0)
+      Core.TermWrap v0 -> isTrivialTerm (Core.wrappedTermBody v0)
+      Core.TermTypeApplication v0 -> isTrivialTerm (Core.typeApplicationTermBody v0)
+      Core.TermTypeLambda v0 -> isTrivialTerm (Core.typeLambdaBody v0)
+      _ -> False
 
--- | Analyze a function term without type inference (performance optimization)
-analyzeFunctionTermNoInfer :: ((t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t0) -> t0 -> Core.Term -> Compute.Flow t1 (Typing.FunctionStructure t0))
-analyzeFunctionTermNoInfer getTC setTC env term = (analyzeFunctionTermNoInferWith bindingMetadata getTC setTC env term)
+-- | Convert a name to file path, given case conventions for namespaces and local names, and assuming '/' as the file path separator
+nameToFilePath :: Util.CaseConvention -> Util.CaseConvention -> Module.FileExtension -> Core.Name -> String
+nameToFilePath nsConv localConv ext name =
 
--- | Update the metadata portion of a coder state
-updateCoderMetadata :: ((t0 -> t1) -> (t2 -> t3 -> t0) -> (t0 -> t2) -> (t1 -> t3) -> Compute.Flow t0 ())
-updateCoderMetadata getMeta makeCoder getGraph f = (Flows.bind Monads.getState (\st -> Monads.putState (makeCoder (getGraph st) (f (getMeta st)))))
+      let qualName = Names.qualifyName name
+          ns = Module.qualifiedNameNamespace qualName
+          local = Module.qualifiedNameLocal qualName
+          nsToFilePath =
+                  \ns -> Strings.intercalate "/" (Lists.map (\part -> Formatting.convertCase Util.CaseConventionCamel nsConv part) (Strings.splitOn "." (Module.unNamespace ns)))
+          prefix = Maybes.maybe "" (\n -> Strings.cat2 (nsToFilePath n) "/") ns
+          suffix = Formatting.convertCase Util.CaseConventionPascal localConv local
+      in (Strings.cat [
+        prefix,
+        suffix,
+        ".",
+        (Module.unFileExtension ext)])
 
--- | Temporarily update the graph for a computation, then restore it
-withUpdatedCoderGraph :: ((t0 -> t1) -> (t0 -> t2) -> (t1 -> t2 -> t0) -> (t1 -> t1) -> Compute.Flow t0 t3 -> Compute.Flow t0 t3)
-withUpdatedCoderGraph getGraph getMeta makeCoder f flow = (Flows.bind Monads.getState (\st -> Flows.bind (Monads.putState (makeCoder (f (getGraph st)) (getMeta st))) (\_ -> Flows.bind flow (\r -> Flows.bind Monads.getState (\st2 -> Flows.bind (Monads.putState (makeCoder (getGraph st) (getMeta st2))) (\_ -> Flows.pure r))))))
+-- | Normalize a comment string for consistent output across coders
+normalizeComment :: String -> String
+normalizeComment s =
 
--- | Temporarily extend the graph with additional bindings for a computation
-withGraphBindings :: ((t0 -> Graph.Graph) -> (Graph.Graph -> t1 -> t0) -> (t0 -> t1) -> [Core.Binding] -> Compute.Flow t0 t2 -> Compute.Flow t0 t2)
-withGraphBindings getGraph makeCoder getMeta bindings flow = (withUpdatedCoderGraph getGraph getMeta makeCoder (Lexical.extendGraphWithBindings bindings) flow)
+      let stripped = Formatting.stripLeadingAndTrailingWhitespace s
+      in (Logic.ifElse (Strings.null stripped) "" (
+        let lastIdx = Math.sub (Strings.length stripped) 1
+            lastChar = Strings.charAt lastIdx stripped
+        in (Logic.ifElse (Equality.equal lastChar 46) stripped (Strings.cat2 stripped "."))))
 
--- | Run a Flow Graph computation within a Flow state computation
-inCoderGraphContext :: ((t0 -> t1) -> (t0 -> t2) -> (t1 -> t2 -> t0) -> Compute.Flow t1 t3 -> Compute.Flow t0 t3)
-inCoderGraphContext getGraph getMeta makeCoder graphFlow = (Flows.bind Monads.getState (\st -> Flows.bind (Monads.withState (getGraph st) (Flows.bind graphFlow (\ret -> Flows.bind Monads.getState (\g2 -> Flows.pure (ret, g2))))) (\result -> Flows.bind (Monads.putState (makeCoder (Pairs.second result) (getMeta st))) (\_ -> Flows.pure (Pairs.first result)))))
+-- | Reorder definitions: types first (with hydra.core.Name first among types), then topologically sorted terms
+reorderDefs :: [Module.Definition] -> [Module.Definition]
+reorderDefs defs =
+
+      let partitioned = Schemas.partitionDefinitions defs
+          typeDefsRaw = Pairs.first partitioned
+          nameFirst = Lists.filter (\td -> Equality.equal (Module.typeDefinitionName td) (Core.Name "hydra.core.Name")) typeDefsRaw
+          nameRest =
+                  Lists.filter (\td -> Logic.not (Equality.equal (Module.typeDefinitionName td) (Core.Name "hydra.core.Name"))) typeDefsRaw
+          typeDefs =
+                  Lists.concat [
+                    Lists.map (\td -> Module.DefinitionType td) nameFirst,
+                    (Lists.map (\td -> Module.DefinitionType td) nameRest)]
+          termDefsWrapped = Lists.map (\td -> Module.DefinitionTerm td) (Pairs.second partitioned)
+          sortedTermDefs =
+                  Lists.concat (Sorting.topologicalSortNodes (\d -> case d of
+                    Module.DefinitionTerm v0 -> Module.termDefinitionName v0) (\d -> case d of
+                    Module.DefinitionTerm v0 -> Sets.toList (Rewriting.freeVariablesInTerm (Module.termDefinitionTerm v0))
+                    _ -> []) termDefsWrapped)
+      in (Lists.concat [
+        typeDefs,
+        sortedTermDefs])
+
+-- | Check the type of a term
+typeOfTerm :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Type
+typeOfTerm cx g term = Eithers.map Pairs.first (Checking.typeOf cx g [] term)
diff --git a/src/gen-main/haskell/Hydra/Coders.hs b/src/gen-main/haskell/Hydra/Coders.hs
--- a/src/gen-main/haskell/Hydra/Coders.hs
+++ b/src/gen-main/haskell/Hydra/Coders.hs
@@ -4,9 +4,9 @@
 
 module Hydra.Coders where
 
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Core as Core
 import qualified Hydra.Graph as Graph
+import qualified Hydra.Util as Util
 import qualified Hydra.Variants as Variants
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -16,51 +16,51 @@
 import qualified Data.Set as S
 
 -- | An evaluation context together with a source language and a target language
-data AdapterContext = 
+data AdapterContext =
   AdapterContext {
     -- | The underlying graph of elements and primitives
     adapterContextGraph :: Graph.Graph,
     -- | The language being encoded or decoded
     adapterContextLanguage :: Language,
     -- | A map of type names to adapters for those types
-    adapterContextAdapters :: (M.Map Core.Name (Compute.Adapter AdapterContext AdapterContext Core.Type Core.Type Core.Term Core.Term))}
+    adapterContextAdapters :: (M.Map Core.Name (Util.Adapter Core.Type Core.Type Core.Term Core.Term))}
 
-_AdapterContext = (Core.Name "hydra.coders.AdapterContext")
+_AdapterContext = Core.Name "hydra.coders.AdapterContext"
 
-_AdapterContext_graph = (Core.Name "graph")
+_AdapterContext_graph = Core.Name "graph"
 
-_AdapterContext_language = (Core.Name "language")
+_AdapterContext_language = Core.Name "language"
 
-_AdapterContext_adapters = (Core.Name "adapters")
+_AdapterContext_adapters = Core.Name "adapters"
 
 -- | Indicates either the 'out' or the 'in' direction of a coder
-data CoderDirection = 
+data CoderDirection =
   CoderDirectionEncode  |
-  CoderDirectionDecode 
+  CoderDirectionDecode
   deriving (Eq, Ord, Read, Show)
 
-_CoderDirection = (Core.Name "hydra.coders.CoderDirection")
+_CoderDirection = Core.Name "hydra.coders.CoderDirection"
 
-_CoderDirection_encode = (Core.Name "encode")
+_CoderDirection_encode = Core.Name "encode"
 
-_CoderDirection_decode = (Core.Name "decode")
+_CoderDirection_decode = Core.Name "decode"
 
 -- | A named language together with language-specific constraints
-data Language = 
+data Language =
   Language {
     -- | The unique name of the language
     languageName :: LanguageName,
     -- | The constraints which characterize the language
     languageConstraints :: LanguageConstraints}
 
-_Language = (Core.Name "hydra.coders.Language")
+_Language = Core.Name "hydra.coders.Language"
 
-_Language_name = (Core.Name "name")
+_Language_name = Core.Name "name"
 
-_Language_constraints = (Core.Name "constraints")
+_Language_constraints = Core.Name "constraints"
 
 -- | A set of constraints on valid type and term expressions, characterizing a language
-data LanguageConstraints = 
+data LanguageConstraints =
   LanguageConstraints {
     -- | All supported elimination variants
     languageConstraintsEliminationVariants :: (S.Set Variants.EliminationVariant),
@@ -79,52 +79,52 @@
     -- | A logical set of types, as a predicate which tests a type for inclusion
     languageConstraintsTypes :: (Core.Type -> Bool)}
 
-_LanguageConstraints = (Core.Name "hydra.coders.LanguageConstraints")
+_LanguageConstraints = Core.Name "hydra.coders.LanguageConstraints"
 
-_LanguageConstraints_eliminationVariants = (Core.Name "eliminationVariants")
+_LanguageConstraints_eliminationVariants = Core.Name "eliminationVariants"
 
-_LanguageConstraints_literalVariants = (Core.Name "literalVariants")
+_LanguageConstraints_literalVariants = Core.Name "literalVariants"
 
-_LanguageConstraints_floatTypes = (Core.Name "floatTypes")
+_LanguageConstraints_floatTypes = Core.Name "floatTypes"
 
-_LanguageConstraints_functionVariants = (Core.Name "functionVariants")
+_LanguageConstraints_functionVariants = Core.Name "functionVariants"
 
-_LanguageConstraints_integerTypes = (Core.Name "integerTypes")
+_LanguageConstraints_integerTypes = Core.Name "integerTypes"
 
-_LanguageConstraints_termVariants = (Core.Name "termVariants")
+_LanguageConstraints_termVariants = Core.Name "termVariants"
 
-_LanguageConstraints_typeVariants = (Core.Name "typeVariants")
+_LanguageConstraints_typeVariants = Core.Name "typeVariants"
 
-_LanguageConstraints_types = (Core.Name "types")
+_LanguageConstraints_types = Core.Name "types"
 
 -- | The unique name of a language
-newtype LanguageName = 
+newtype LanguageName =
   LanguageName {
     unLanguageName :: String}
   deriving (Eq, Ord, Read, Show)
 
-_LanguageName = (Core.Name "hydra.coders.LanguageName")
+_LanguageName = Core.Name "hydra.coders.LanguageName"
 
 -- | A bidirectional encoder which maps between the same type and term languages on either side
-type SymmetricAdapter s t v = (Compute.Adapter s s t t v v)
+type SymmetricAdapter t v = (Util.Adapter t t v v)
 
-_SymmetricAdapter = (Core.Name "hydra.coders.SymmetricAdapter")
+_SymmetricAdapter = Core.Name "hydra.coders.SymmetricAdapter"
 
 -- | Specifies either a pre-order or post-order traversal
-data TraversalOrder = 
+data TraversalOrder =
   -- | Pre-order traversal
   TraversalOrderPre  |
   -- | Post-order traversal
-  TraversalOrderPost 
+  TraversalOrderPost
   deriving (Eq, Ord, Read, Show)
 
-_TraversalOrder = (Core.Name "hydra.coders.TraversalOrder")
+_TraversalOrder = Core.Name "hydra.coders.TraversalOrder"
 
-_TraversalOrder_pre = (Core.Name "pre")
+_TraversalOrder_pre = Core.Name "pre"
 
-_TraversalOrder_post = (Core.Name "post")
+_TraversalOrder_post = Core.Name "post"
 
 -- | A function which maps a Hydra type to a symmetric adapter between types and terms
-type TypeAdapter = (Core.Type -> Compute.Flow AdapterContext (SymmetricAdapter AdapterContext Core.Type Core.Term))
+type TypeAdapter = (AdapterContext -> Core.Type -> Either String (SymmetricAdapter Core.Type Core.Term))
 
-_TypeAdapter = (Core.Name "hydra.coders.TypeAdapter")
+_TypeAdapter = Core.Name "hydra.coders.TypeAdapter"
diff --git a/src/gen-main/haskell/Hydra/Compute.hs b/src/gen-main/haskell/Hydra/Compute.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Compute.hs
+++ /dev/null
@@ -1,108 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Abstractions for single- and bidirectional transformations
-
-module Hydra.Compute where
-
-import qualified Hydra.Core as Core
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | A two-level bidirectional encoder which adapts types to types and terms to terms
-data Adapter s1 s2 t1 t2 v1 v2 = 
-  Adapter {
-    -- | Whether information may be lost in the course of this adaptation
-    adapterIsLossy :: Bool,
-    -- | The source type
-    adapterSource :: t1,
-    -- | The target type
-    adapterTarget :: t2,
-    -- | The coder for transforming instances of the source type to instances of the target type
-    adapterCoder :: (Coder s1 s2 v1 v2)}
-
-_Adapter = (Core.Name "hydra.compute.Adapter")
-
-_Adapter_isLossy = (Core.Name "isLossy")
-
-_Adapter_source = (Core.Name "source")
-
-_Adapter_target = (Core.Name "target")
-
-_Adapter_coder = (Core.Name "coder")
-
--- | A two-level encoder and decoder, operating both at a type level and an instance (data) level
-data Bicoder s1 s2 t1 t2 v1 v2 = 
-  Bicoder {
-    -- | A function from source types to adapters
-    bicoderEncode :: (t1 -> Adapter s1 s2 t1 t2 v1 v2),
-    -- | A function from target types to adapters
-    bicoderDecode :: (t2 -> Adapter s2 s1 t2 t1 v2 v1)}
-
-_Bicoder = (Core.Name "hydra.compute.Bicoder")
-
-_Bicoder_encode = (Core.Name "encode")
-
-_Bicoder_decode = (Core.Name "decode")
-
--- | An encoder and decoder; a bidirectional flow between two types
-data Coder s1 s2 v1 v2 = 
-  Coder {
-    -- | A function from source values to a flow of target values
-    coderEncode :: (v1 -> Flow s1 v2),
-    -- | A function from target values to a flow of source values
-    coderDecode :: (v2 -> Flow s2 v1)}
-
-_Coder = (Core.Name "hydra.compute.Coder")
-
-_Coder_encode = (Core.Name "encode")
-
-_Coder_decode = (Core.Name "decode")
-
--- | A variant of the State monad with built-in logging and error handling
-newtype Flow s v = 
-  Flow {
-    unFlow :: (s -> Trace -> FlowState s v)}
-
-_Flow = (Core.Name "hydra.compute.Flow")
-
--- | The result of evaluating a Flow
-data FlowState s v = 
-  FlowState {
-    -- | The resulting value, or nothing in the case of failure
-    flowStateValue :: (Maybe v),
-    -- | The final state
-    flowStateState :: s,
-    -- | The trace (log) produced during evaluation
-    flowStateTrace :: Trace}
-  deriving (Eq, Ord, Read, Show)
-
-_FlowState = (Core.Name "hydra.compute.FlowState")
-
-_FlowState_value = (Core.Name "value")
-
-_FlowState_state = (Core.Name "state")
-
-_FlowState_trace = (Core.Name "trace")
-
--- | A container for logging and error information
-data Trace = 
-  Trace {
-    -- | A stack of context labels
-    traceStack :: [String],
-    -- | A log of warnings and/or info messages
-    traceMessages :: [String],
-    -- | A map of string keys to arbitrary terms as values, for application-specific use
-    traceOther :: (M.Map Core.Name Core.Term)}
-  deriving (Eq, Ord, Read, Show)
-
-_Trace = (Core.Name "hydra.compute.Trace")
-
-_Trace_stack = (Core.Name "stack")
-
-_Trace_messages = (Core.Name "messages")
-
-_Trace_other = (Core.Name "other")
diff --git a/src/gen-main/haskell/Hydra/Constants.hs b/src/gen-main/haskell/Hydra/Constants.hs
--- a/src/gen-main/haskell/Hydra/Constants.hs
+++ b/src/gen-main/haskell/Hydra/Constants.hs
@@ -22,57 +22,53 @@
 
 -- | Annotation key for type classes
 key_classes :: Core.Name
-key_classes = (Core.Name "classes")
+key_classes = Core.Name "classes"
 
 -- | Annotation key for debug identifiers
 key_debugId :: Core.Name
-key_debugId = (Core.Name "debugId")
+key_debugId = Core.Name "debugId"
 
 -- | Annotation key for deprecated markers
 key_deprecated :: Core.Name
-key_deprecated = (Core.Name "deprecated")
+key_deprecated = Core.Name "deprecated"
 
 -- | Annotation key for descriptions
 key_description :: Core.Name
-key_description = (Core.Name "description")
+key_description = Core.Name "description"
 
 -- | Annotation key for exclusions
 key_exclude :: Core.Name
-key_exclude = (Core.Name "exclude")
+key_exclude = Core.Name "exclude"
 
 -- | A flag which tells the language coders to encode a given encoded type as a term rather than a native type
 key_firstClassType :: Core.Name
-key_firstClassType = (Core.Name "firstClassType")
+key_firstClassType = Core.Name "firstClassType"
 
+-- | A counter for generating fresh type variable names
+key_freshTypeVariableCount :: Core.Name
+key_freshTypeVariableCount = Core.Name "freshTypeVariableCount"
+
 -- | Annotation key for maximum length constraints
 key_maxLength :: Core.Name
-key_maxLength = (Core.Name "maxLength")
+key_maxLength = Core.Name "maxLength"
 
 -- | Annotation key for minimum length constraints
 key_minLength :: Core.Name
-key_minLength = (Core.Name "minLength")
+key_minLength = Core.Name "minLength"
 
 -- | Annotation key for preserving field names during code generation
 key_preserveFieldName :: Core.Name
-key_preserveFieldName = (Core.Name "preserveFieldName")
+key_preserveFieldName = Core.Name "preserveFieldName"
 
 -- | Annotation key for type information
 key_type :: Core.Name
-key_type = (Core.Name "type")
-
--- | A counter for generating fresh type variable names
-key_freshTypeVariableCount :: Core.Name
-key_freshTypeVariableCount = (Core.Name "freshTypeVariableCount")
+key_type = Core.Name "type"
 
 -- | The maximum value of a 32-bit integer
 maxInt32 :: Int
 maxInt32 = 2147483647
 
--- | A placeholder name for row types as they are being constructed
-placeholderName :: Core.Name
-placeholderName = (Core.Name "Placeholder")
-
--- | A maximum depth for nested flows. Currently, this is set very high because deep flows are common in type inference over the Hydra kernel.
+-- | A maximum depth for nested computations. Currently, this is set very high because deep recursion is common in type inference over the Hydra kernel.
 maxTraceDepth :: Int
 maxTraceDepth = 5000
 
diff --git a/src/gen-main/haskell/Hydra/Constraints.hs b/src/gen-main/haskell/Hydra/Constraints.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Constraints.hs
+++ /dev/null
@@ -1,44 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | A model for path- and pattern-based graph constraints, which may be considered as part of the schema of a graph
-
-module Hydra.Constraints where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Query as Query
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | A declared equivalence between two abstract paths in a graph
-data PathEquation = 
-  PathEquation {
-    -- | The left-hand side of the equation
-    pathEquationLeft :: Query.Path,
-    -- | The right-hand side of the equation
-    pathEquationRight :: Query.Path}
-  deriving (Eq, Ord, Read, Show)
-
-_PathEquation = (Core.Name "hydra.constraints.PathEquation")
-
-_PathEquation_left = (Core.Name "left")
-
-_PathEquation_right = (Core.Name "right")
-
--- | A pattern which, if it matches in a given graph, implies that another pattern must also match. Query variables are shared between the two patterns.
-data PatternImplication = 
-  PatternImplication {
-    -- | The pattern which, if it matches, triggers the constraint
-    patternImplicationAntecedent :: Query.Pattern,
-    -- | The pattern which must also match when the antecedent matches
-    patternImplicationConsequent :: Query.Pattern}
-  deriving (Eq, Ord, Read, Show)
-
-_PatternImplication = (Core.Name "hydra.constraints.PatternImplication")
-
-_PatternImplication_antecedent = (Core.Name "antecedent")
-
-_PatternImplication_consequent = (Core.Name "consequent")
diff --git a/src/gen-main/haskell/Hydra/Context.hs b/src/gen-main/haskell/Hydra/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Context.hs
@@ -0,0 +1,47 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Execution context for tracing and diagnostics
+
+module Hydra.Context where
+
+import qualified Hydra.Core as Core
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | An execution context for tracing and diagnostics, threaded through function calls
+data Context =
+  Context {
+    -- | A stack of context labels describing the current execution path
+    contextTrace :: [String],
+    -- | A log of warnings and/or info messages
+    contextMessages :: [String],
+    -- | A map of string keys to arbitrary terms as values, for application-specific use
+    contextOther :: (M.Map Core.Name Core.Term)}
+  deriving (Eq, Ord, Read, Show)
+
+_Context = Core.Name "hydra.context.Context"
+
+_Context_trace = Core.Name "trace"
+
+_Context_messages = Core.Name "messages"
+
+_Context_other = Core.Name "other"
+
+-- | A particular domain object (such as an error) together with an execution context
+data InContext e =
+  InContext {
+    -- | A domain object; typically an error
+    inContextObject :: e,
+    -- | The execution context at the point of capture
+    inContextContext :: Context}
+  deriving (Eq, Ord, Read, Show)
+
+_InContext = Core.Name "hydra.context.InContext"
+
+_InContext_object = Core.Name "object"
+
+_InContext_context = Core.Name "context"
diff --git a/src/gen-main/haskell/Hydra/Core.hs b/src/gen-main/haskell/Hydra/Core.hs
--- a/src/gen-main/haskell/Hydra/Core.hs
+++ b/src/gen-main/haskell/Hydra/Core.hs
@@ -12,7 +12,7 @@
 import qualified Data.Set as S
 
 -- | A term together with an annotation
-data AnnotatedTerm = 
+data AnnotatedTerm =
   AnnotatedTerm {
     -- | The term being annotated
     annotatedTermBody :: Term,
@@ -20,14 +20,14 @@
     annotatedTermAnnotation :: (M.Map Name Term)}
   deriving (Eq, Ord, Read, Show)
 
-_AnnotatedTerm = (Name "hydra.core.AnnotatedTerm")
+_AnnotatedTerm = Name "hydra.core.AnnotatedTerm"
 
-_AnnotatedTerm_body = (Name "body")
+_AnnotatedTerm_body = Name "body"
 
-_AnnotatedTerm_annotation = (Name "annotation")
+_AnnotatedTerm_annotation = Name "annotation"
 
 -- | A type together with an annotation
-data AnnotatedType = 
+data AnnotatedType =
   AnnotatedType {
     -- | The type being annotated
     annotatedTypeBody :: Type,
@@ -35,14 +35,14 @@
     annotatedTypeAnnotation :: (M.Map Name Term)}
   deriving (Eq, Ord, Read, Show)
 
-_AnnotatedType = (Name "hydra.core.AnnotatedType")
+_AnnotatedType = Name "hydra.core.AnnotatedType"
 
-_AnnotatedType_body = (Name "body")
+_AnnotatedType_body = Name "body"
 
-_AnnotatedType_annotation = (Name "annotation")
+_AnnotatedType_annotation = Name "annotation"
 
 -- | A term which applies a function to an argument
-data Application = 
+data Application =
   Application {
     -- | The left-hand side of the application
     applicationFunction :: Term,
@@ -50,14 +50,14 @@
     applicationArgument :: Term}
   deriving (Eq, Ord, Read, Show)
 
-_Application = (Name "hydra.core.Application")
+_Application = Name "hydra.core.Application"
 
-_Application_function = (Name "function")
+_Application_function = Name "function"
 
-_Application_argument = (Name "argument")
+_Application_argument = Name "argument"
 
 -- | The type-level analog of an application term
-data ApplicationType = 
+data ApplicationType =
   ApplicationType {
     -- | The left-hand side of the application
     applicationTypeFunction :: Type,
@@ -65,14 +65,14 @@
     applicationTypeArgument :: Type}
   deriving (Eq, Ord, Read, Show)
 
-_ApplicationType = (Name "hydra.core.ApplicationType")
+_ApplicationType = Name "hydra.core.ApplicationType"
 
-_ApplicationType_function = (Name "function")
+_ApplicationType_function = Name "function"
 
-_ApplicationType_argument = (Name "argument")
+_ApplicationType_argument = Name "argument"
 
 -- | A field with an optional type scheme, used to bind variables to terms in a 'let' expression
-data Binding = 
+data Binding =
   Binding {
     -- | The name of the bound variable
     bindingName :: Name,
@@ -82,16 +82,16 @@
     bindingType :: (Maybe TypeScheme)}
   deriving (Eq, Ord, Read, Show)
 
-_Binding = (Name "hydra.core.Binding")
+_Binding = Name "hydra.core.Binding"
 
-_Binding_name = (Name "name")
+_Binding_name = Name "name"
 
-_Binding_term = (Name "term")
+_Binding_term = Name "term"
 
-_Binding_type = (Name "type")
+_Binding_type = Name "type"
 
 -- | A union elimination; a case statement
-data CaseStatement = 
+data CaseStatement =
   CaseStatement {
     -- | The name of the union type
     caseStatementTypeName :: Name,
@@ -101,16 +101,16 @@
     caseStatementCases :: [Field]}
   deriving (Eq, Ord, Read, Show)
 
-_CaseStatement = (Name "hydra.core.CaseStatement")
+_CaseStatement = Name "hydra.core.CaseStatement"
 
-_CaseStatement_typeName = (Name "typeName")
+_CaseStatement_typeName = Name "typeName"
 
-_CaseStatement_default = (Name "default")
+_CaseStatement_default = Name "default"
 
-_CaseStatement_cases = (Name "cases")
+_CaseStatement_cases = Name "cases"
 
 -- | A type which provides a choice between a 'left' type and a 'right' type
-data EitherType = 
+data EitherType =
   EitherType {
     -- | The 'left' alternative
     eitherTypeLeft :: Type,
@@ -118,14 +118,14 @@
     eitherTypeRight :: Type}
   deriving (Eq, Ord, Read, Show)
 
-_EitherType = (Name "hydra.core.EitherType")
+_EitherType = Name "hydra.core.EitherType"
 
-_EitherType_left = (Name "left")
+_EitherType_left = Name "left"
 
-_EitherType_right = (Name "right")
+_EitherType_right = Name "right"
 
 -- | A type which pairs a 'first' type and a 'second' type
-data PairType = 
+data PairType =
   PairType {
     -- | The first component of the pair
     pairTypeFirst :: Type,
@@ -133,14 +133,14 @@
     pairTypeSecond :: Type}
   deriving (Eq, Ord, Read, Show)
 
-_PairType = (Name "hydra.core.PairType")
+_PairType = Name "hydra.core.PairType"
 
-_PairType_first = (Name "first")
+_PairType_first = Name "first"
 
-_PairType_second = (Name "second")
+_PairType_second = Name "second"
 
 -- | A corresponding elimination for an introduction term
-data Elimination = 
+data Elimination =
   -- | Eliminates a record by projecting a given field
   EliminationRecord Projection |
   -- | Eliminates a union term by matching over the fields of the union. This is a case statement.
@@ -149,16 +149,16 @@
   EliminationWrap Name
   deriving (Eq, Ord, Read, Show)
 
-_Elimination = (Name "hydra.core.Elimination")
+_Elimination = Name "hydra.core.Elimination"
 
-_Elimination_record = (Name "record")
+_Elimination_record = Name "record"
 
-_Elimination_union = (Name "union")
+_Elimination_union = Name "union"
 
-_Elimination_wrap = (Name "wrap")
+_Elimination_wrap = Name "wrap"
 
 -- | A name/term pair
-data Field = 
+data Field =
   Field {
     -- | The name of the field
     fieldName :: Name,
@@ -166,14 +166,14 @@
     fieldTerm :: Term}
   deriving (Eq, Ord, Read, Show)
 
-_Field = (Name "hydra.core.Field")
+_Field = Name "hydra.core.Field"
 
-_Field_name = (Name "name")
+_Field_name = Name "name"
 
-_Field_term = (Name "term")
+_Field_term = Name "term"
 
 -- | A name/type pair
-data FieldType = 
+data FieldType =
   FieldType {
     -- | The name of the field
     fieldTypeName :: Name,
@@ -181,32 +181,32 @@
     fieldTypeType :: Type}
   deriving (Eq, Ord, Read, Show)
 
-_FieldType = (Name "hydra.core.FieldType")
+_FieldType = Name "hydra.core.FieldType"
 
-_FieldType_name = (Name "name")
+_FieldType_name = Name "name"
 
-_FieldType_type = (Name "type")
+_FieldType_type = Name "type"
 
 -- | A floating-point type
-data FloatType = 
+data FloatType =
   -- | An arbitrary-precision floating-point type
   FloatTypeBigfloat  |
   -- | A 32-bit floating-point type
   FloatTypeFloat32  |
   -- | A 64-bit floating-point type
-  FloatTypeFloat64 
+  FloatTypeFloat64
   deriving (Eq, Ord, Read, Show)
 
-_FloatType = (Name "hydra.core.FloatType")
+_FloatType = Name "hydra.core.FloatType"
 
-_FloatType_bigfloat = (Name "bigfloat")
+_FloatType_bigfloat = Name "bigfloat"
 
-_FloatType_float32 = (Name "float32")
+_FloatType_float32 = Name "float32"
 
-_FloatType_float64 = (Name "float64")
+_FloatType_float64 = Name "float64"
 
 -- | A floating-point literal value
-data FloatValue = 
+data FloatValue =
   -- | An arbitrary-precision floating-point value
   FloatValueBigfloat Double |
   -- | A 32-bit floating-point value
@@ -215,16 +215,16 @@
   FloatValueFloat64 Double
   deriving (Eq, Ord, Read, Show)
 
-_FloatValue = (Name "hydra.core.FloatValue")
+_FloatValue = Name "hydra.core.FloatValue"
 
-_FloatValue_bigfloat = (Name "bigfloat")
+_FloatValue_bigfloat = Name "bigfloat"
 
-_FloatValue_float32 = (Name "float32")
+_FloatValue_float32 = Name "float32"
 
-_FloatValue_float64 = (Name "float64")
+_FloatValue_float64 = Name "float64"
 
 -- | A universally quantified type; the System F equivalent of a type scheme, and the type-level equivalent of a lambda term.
-data ForallType = 
+data ForallType =
   ForallType {
     -- | The variable which is bound by the lambda
     forallTypeParameter :: Name,
@@ -232,14 +232,14 @@
     forallTypeBody :: Type}
   deriving (Eq, Ord, Read, Show)
 
-_ForallType = (Name "hydra.core.ForallType")
+_ForallType = Name "hydra.core.ForallType"
 
-_ForallType_parameter = (Name "parameter")
+_ForallType_parameter = Name "parameter"
 
-_ForallType_body = (Name "body")
+_ForallType_body = Name "body"
 
 -- | A function
-data Function = 
+data Function =
   -- | An elimination for any of a few term variants
   FunctionElimination Elimination |
   -- | A function abstraction (lambda)
@@ -248,16 +248,16 @@
   FunctionPrimitive Name
   deriving (Eq, Ord, Read, Show)
 
-_Function = (Name "hydra.core.Function")
+_Function = Name "hydra.core.Function"
 
-_Function_elimination = (Name "elimination")
+_Function_elimination = Name "elimination"
 
-_Function_lambda = (Name "lambda")
+_Function_lambda = Name "lambda"
 
-_Function_primitive = (Name "primitive")
+_Function_primitive = Name "primitive"
 
 -- | A function type, also known as an arrow type
-data FunctionType = 
+data FunctionType =
   FunctionType {
     -- | The domain (input) type of the function
     functionTypeDomain :: Type,
@@ -265,14 +265,14 @@
     functionTypeCodomain :: Type}
   deriving (Eq, Ord, Read, Show)
 
-_FunctionType = (Name "hydra.core.FunctionType")
+_FunctionType = Name "hydra.core.FunctionType"
 
-_FunctionType_domain = (Name "domain")
+_FunctionType_domain = Name "domain"
 
-_FunctionType_codomain = (Name "codomain")
+_FunctionType_codomain = Name "codomain"
 
 -- | An instance of a union type; i.e. a string-indexed generalization of inl() or inr()
-data Injection = 
+data Injection =
   Injection {
     -- | The name of the union type
     injectionTypeName :: Name,
@@ -280,14 +280,14 @@
     injectionField :: Field}
   deriving (Eq, Ord, Read, Show)
 
-_Injection = (Name "hydra.core.Injection")
+_Injection = Name "hydra.core.Injection"
 
-_Injection_typeName = (Name "typeName")
+_Injection_typeName = Name "typeName"
 
-_Injection_field = (Name "field")
+_Injection_field = Name "field"
 
 -- | An integer type
-data IntegerType = 
+data IntegerType =
   -- | An arbitrary-precision integer type
   IntegerTypeBigint  |
   -- | An 8-bit signed integer type
@@ -305,31 +305,31 @@
   -- | A 32-bit unsigned integer type
   IntegerTypeUint32  |
   -- | A 64-bit unsigned integer type
-  IntegerTypeUint64 
+  IntegerTypeUint64
   deriving (Eq, Ord, Read, Show)
 
-_IntegerType = (Name "hydra.core.IntegerType")
+_IntegerType = Name "hydra.core.IntegerType"
 
-_IntegerType_bigint = (Name "bigint")
+_IntegerType_bigint = Name "bigint"
 
-_IntegerType_int8 = (Name "int8")
+_IntegerType_int8 = Name "int8"
 
-_IntegerType_int16 = (Name "int16")
+_IntegerType_int16 = Name "int16"
 
-_IntegerType_int32 = (Name "int32")
+_IntegerType_int32 = Name "int32"
 
-_IntegerType_int64 = (Name "int64")
+_IntegerType_int64 = Name "int64"
 
-_IntegerType_uint8 = (Name "uint8")
+_IntegerType_uint8 = Name "uint8"
 
-_IntegerType_uint16 = (Name "uint16")
+_IntegerType_uint16 = Name "uint16"
 
-_IntegerType_uint32 = (Name "uint32")
+_IntegerType_uint32 = Name "uint32"
 
-_IntegerType_uint64 = (Name "uint64")
+_IntegerType_uint64 = Name "uint64"
 
 -- | An integer literal value
-data IntegerValue = 
+data IntegerValue =
   -- | An arbitrary-precision integer value
   IntegerValueBigint Integer |
   -- | An 8-bit signed integer value
@@ -350,28 +350,28 @@
   IntegerValueUint64 Integer
   deriving (Eq, Ord, Read, Show)
 
-_IntegerValue = (Name "hydra.core.IntegerValue")
+_IntegerValue = Name "hydra.core.IntegerValue"
 
-_IntegerValue_bigint = (Name "bigint")
+_IntegerValue_bigint = Name "bigint"
 
-_IntegerValue_int8 = (Name "int8")
+_IntegerValue_int8 = Name "int8"
 
-_IntegerValue_int16 = (Name "int16")
+_IntegerValue_int16 = Name "int16"
 
-_IntegerValue_int32 = (Name "int32")
+_IntegerValue_int32 = Name "int32"
 
-_IntegerValue_int64 = (Name "int64")
+_IntegerValue_int64 = Name "int64"
 
-_IntegerValue_uint8 = (Name "uint8")
+_IntegerValue_uint8 = Name "uint8"
 
-_IntegerValue_uint16 = (Name "uint16")
+_IntegerValue_uint16 = Name "uint16"
 
-_IntegerValue_uint32 = (Name "uint32")
+_IntegerValue_uint32 = Name "uint32"
 
-_IntegerValue_uint64 = (Name "uint64")
+_IntegerValue_uint64 = Name "uint64"
 
 -- | A function abstraction (lambda)
-data Lambda = 
+data Lambda =
   Lambda {
     -- | The parameter of the lambda
     lambdaParameter :: Name,
@@ -381,16 +381,16 @@
     lambdaBody :: Term}
   deriving (Eq, Ord, Read, Show)
 
-_Lambda = (Name "hydra.core.Lambda")
+_Lambda = Name "hydra.core.Lambda"
 
-_Lambda_parameter = (Name "parameter")
+_Lambda_parameter = Name "parameter"
 
-_Lambda_domain = (Name "domain")
+_Lambda_domain = Name "domain"
 
-_Lambda_body = (Name "body")
+_Lambda_body = Name "body"
 
 -- | A set of (possibly recursive) 'let' bindings together with a body in which they are bound
-data Let = 
+data Let =
   Let {
     -- | The list of variable bindings
     letBindings :: [Binding],
@@ -398,14 +398,14 @@
     letBody :: Term}
   deriving (Eq, Ord, Read, Show)
 
-_Let = (Name "hydra.core.Let")
+_Let = Name "hydra.core.Let"
 
-_Let_bindings = (Name "bindings")
+_Let_bindings = Name "bindings"
 
-_Let_body = (Name "body")
+_Let_body = Name "body"
 
 -- | A term constant; an instance of a literal type
-data Literal = 
+data Literal =
   -- | A binary literal
   LiteralBinary B.ByteString |
   -- | A boolean literal
@@ -418,20 +418,20 @@
   LiteralString String
   deriving (Eq, Ord, Read, Show)
 
-_Literal = (Name "hydra.core.Literal")
+_Literal = Name "hydra.core.Literal"
 
-_Literal_binary = (Name "binary")
+_Literal_binary = Name "binary"
 
-_Literal_boolean = (Name "boolean")
+_Literal_boolean = Name "boolean"
 
-_Literal_float = (Name "float")
+_Literal_float = Name "float"
 
-_Literal_integer = (Name "integer")
+_Literal_integer = Name "integer"
 
-_Literal_string = (Name "string")
+_Literal_string = Name "string"
 
 -- | Any of a fixed set of literal types, also called atomic types, base types, primitive types, or type constants
-data LiteralType = 
+data LiteralType =
   -- | The type of a binary (byte string) value
   LiteralTypeBinary  |
   -- | The type of a boolean (true/false) value
@@ -441,23 +441,23 @@
   -- | The type of an integer value
   LiteralTypeInteger IntegerType |
   -- | The type of a string value
-  LiteralTypeString 
+  LiteralTypeString
   deriving (Eq, Ord, Read, Show)
 
-_LiteralType = (Name "hydra.core.LiteralType")
+_LiteralType = Name "hydra.core.LiteralType"
 
-_LiteralType_binary = (Name "binary")
+_LiteralType_binary = Name "binary"
 
-_LiteralType_boolean = (Name "boolean")
+_LiteralType_boolean = Name "boolean"
 
-_LiteralType_float = (Name "float")
+_LiteralType_float = Name "float"
 
-_LiteralType_integer = (Name "integer")
+_LiteralType_integer = Name "integer"
 
-_LiteralType_string = (Name "string")
+_LiteralType_string = Name "string"
 
 -- | A map type
-data MapType = 
+data MapType =
   MapType {
     -- | The type of keys in the map
     mapTypeKeys :: Type,
@@ -465,22 +465,22 @@
     mapTypeValues :: Type}
   deriving (Eq, Ord, Read, Show)
 
-_MapType = (Name "hydra.core.MapType")
+_MapType = Name "hydra.core.MapType"
 
-_MapType_keys = (Name "keys")
+_MapType_keys = Name "keys"
 
-_MapType_values = (Name "values")
+_MapType_values = Name "values"
 
 -- | A unique identifier in some context; a string-valued key
-newtype Name = 
+newtype Name =
   Name {
     unName :: String}
   deriving (Eq, Ord, Read, Show)
 
-_Name = (Name "hydra.core.Name")
+_Name = Name "hydra.core.Name"
 
 -- | A record elimination; a projection
-data Projection = 
+data Projection =
   Projection {
     -- | The name of the record type
     projectionTypeName :: Name,
@@ -488,14 +488,14 @@
     projectionField :: Name}
   deriving (Eq, Ord, Read, Show)
 
-_Projection = (Name "hydra.core.Projection")
+_Projection = Name "hydra.core.Projection"
 
-_Projection_typeName = (Name "typeName")
+_Projection_typeName = Name "typeName"
 
-_Projection_field = (Name "field")
+_Projection_field = Name "field"
 
 -- | A record, or labeled tuple; a map of field names to terms
-data Record = 
+data Record =
   Record {
     -- | The name of the record type
     recordTypeName :: Name,
@@ -503,29 +503,14 @@
     recordFields :: [Field]}
   deriving (Eq, Ord, Read, Show)
 
-_Record = (Name "hydra.core.Record")
-
-_Record_typeName = (Name "typeName")
-
-_Record_fields = (Name "fields")
-
--- | A labeled record or union type
-data RowType = 
-  RowType {
-    -- | The name of the row type, which must correspond to the name of a Type element
-    rowTypeTypeName :: Name,
-    -- | The fields of this row type, excluding any inherited fields
-    rowTypeFields :: [FieldType]}
-  deriving (Eq, Ord, Read, Show)
-
-_RowType = (Name "hydra.core.RowType")
+_Record = Name "hydra.core.Record"
 
-_RowType_typeName = (Name "typeName")
+_Record_typeName = Name "typeName"
 
-_RowType_fields = (Name "fields")
+_Record_fields = Name "fields"
 
 -- | A data term
-data Term = 
+data Term =
   -- | A term annotated with metadata
   TermAnnotated AnnotatedTerm |
   -- | A function application
@@ -564,46 +549,46 @@
   TermWrap WrappedTerm
   deriving (Eq, Ord, Read, Show)
 
-_Term = (Name "hydra.core.Term")
+_Term = Name "hydra.core.Term"
 
-_Term_annotated = (Name "annotated")
+_Term_annotated = Name "annotated"
 
-_Term_application = (Name "application")
+_Term_application = Name "application"
 
-_Term_either = (Name "either")
+_Term_either = Name "either"
 
-_Term_function = (Name "function")
+_Term_function = Name "function"
 
-_Term_let = (Name "let")
+_Term_let = Name "let"
 
-_Term_list = (Name "list")
+_Term_list = Name "list"
 
-_Term_literal = (Name "literal")
+_Term_literal = Name "literal"
 
-_Term_map = (Name "map")
+_Term_map = Name "map"
 
-_Term_maybe = (Name "maybe")
+_Term_maybe = Name "maybe"
 
-_Term_pair = (Name "pair")
+_Term_pair = Name "pair"
 
-_Term_record = (Name "record")
+_Term_record = Name "record"
 
-_Term_set = (Name "set")
+_Term_set = Name "set"
 
-_Term_typeApplication = (Name "typeApplication")
+_Term_typeApplication = Name "typeApplication"
 
-_Term_typeLambda = (Name "typeLambda")
+_Term_typeLambda = Name "typeLambda"
 
-_Term_union = (Name "union")
+_Term_union = Name "union"
 
-_Term_unit = (Name "unit")
+_Term_unit = Name "unit"
 
-_Term_variable = (Name "variable")
+_Term_variable = Name "variable"
 
-_Term_wrap = (Name "wrap")
+_Term_wrap = Name "wrap"
 
 -- | A data type
-data Type = 
+data Type =
   -- | An annotated type
   TypeAnnotated AnnotatedType |
   -- | A type application
@@ -625,55 +610,59 @@
   -- | A pair (2-tuple) type
   TypePair PairType |
   -- | A record type
-  TypeRecord RowType |
+  TypeRecord [FieldType] |
   -- | A set type
   TypeSet Type |
   -- | A union type with field names
-  TypeUnion RowType |
+  TypeUnion [FieldType] |
   -- | The unit type
   TypeUnit  |
   -- | A type variable
   TypeVariable Name |
+  -- | The void (uninhabited, or bottom) type
+  TypeVoid  |
   -- | A wrapped type (newtype)
-  TypeWrap WrappedType
+  TypeWrap Type
   deriving (Eq, Ord, Read, Show)
 
-_Type = (Name "hydra.core.Type")
+_Type = Name "hydra.core.Type"
 
-_Type_annotated = (Name "annotated")
+_Type_annotated = Name "annotated"
 
-_Type_application = (Name "application")
+_Type_application = Name "application"
 
-_Type_either = (Name "either")
+_Type_either = Name "either"
 
-_Type_forall = (Name "forall")
+_Type_forall = Name "forall"
 
-_Type_function = (Name "function")
+_Type_function = Name "function"
 
-_Type_list = (Name "list")
+_Type_list = Name "list"
 
-_Type_literal = (Name "literal")
+_Type_literal = Name "literal"
 
-_Type_map = (Name "map")
+_Type_map = Name "map"
 
-_Type_maybe = (Name "maybe")
+_Type_maybe = Name "maybe"
 
-_Type_pair = (Name "pair")
+_Type_pair = Name "pair"
 
-_Type_record = (Name "record")
+_Type_record = Name "record"
 
-_Type_set = (Name "set")
+_Type_set = Name "set"
 
-_Type_union = (Name "union")
+_Type_union = Name "union"
 
-_Type_unit = (Name "unit")
+_Type_unit = Name "unit"
 
-_Type_variable = (Name "variable")
+_Type_variable = Name "variable"
 
-_Type_wrap = (Name "wrap")
+_Type_void = Name "void"
 
+_Type_wrap = Name "wrap"
+
 -- | A term applied to a type; a type application
-data TypeApplicationTerm = 
+data TypeApplicationTerm =
   TypeApplicationTerm {
     -- | The term being applied to a type
     typeApplicationTermBody :: Term,
@@ -681,14 +670,14 @@
     typeApplicationTermType :: Type}
   deriving (Eq, Ord, Read, Show)
 
-_TypeApplicationTerm = (Name "hydra.core.TypeApplicationTerm")
+_TypeApplicationTerm = Name "hydra.core.TypeApplicationTerm"
 
-_TypeApplicationTerm_body = (Name "body")
+_TypeApplicationTerm_body = Name "body"
 
-_TypeApplicationTerm_type = (Name "type")
+_TypeApplicationTerm_type = Name "type"
 
 -- | A System F type abstraction term
-data TypeLambda = 
+data TypeLambda =
   TypeLambda {
     -- | The type variable introduced by the abstraction
     typeLambdaParameter :: Name,
@@ -696,14 +685,14 @@
     typeLambdaBody :: Term}
   deriving (Eq, Ord, Read, Show)
 
-_TypeLambda = (Name "hydra.core.TypeLambda")
+_TypeLambda = Name "hydra.core.TypeLambda"
 
-_TypeLambda_parameter = (Name "parameter")
+_TypeLambda_parameter = Name "parameter"
 
-_TypeLambda_body = (Name "body")
+_TypeLambda_body = Name "body"
 
 -- | A type expression together with free type variables occurring in the expression
-data TypeScheme = 
+data TypeScheme =
   TypeScheme {
     -- | The free type variables
     typeSchemeVariables :: [Name],
@@ -713,27 +702,27 @@
     typeSchemeConstraints :: (Maybe (M.Map Name TypeVariableMetadata))}
   deriving (Eq, Ord, Read, Show)
 
-_TypeScheme = (Name "hydra.core.TypeScheme")
+_TypeScheme = Name "hydra.core.TypeScheme"
 
-_TypeScheme_variables = (Name "variables")
+_TypeScheme_variables = Name "variables"
 
-_TypeScheme_type = (Name "type")
+_TypeScheme_type = Name "type"
 
-_TypeScheme_constraints = (Name "constraints")
+_TypeScheme_constraints = Name "constraints"
 
 -- | Metadata associated with a type variable, including typeclass constraints
-data TypeVariableMetadata = 
+data TypeVariableMetadata =
   TypeVariableMetadata {
     -- | The set of typeclass constraints on this type variable
     typeVariableMetadataClasses :: (S.Set Name)}
   deriving (Eq, Ord, Read, Show)
 
-_TypeVariableMetadata = (Name "hydra.core.TypeVariableMetadata")
+_TypeVariableMetadata = Name "hydra.core.TypeVariableMetadata"
 
-_TypeVariableMetadata_classes = (Name "classes")
+_TypeVariableMetadata_classes = Name "classes"
 
 -- | A term wrapped in a type name
-data WrappedTerm = 
+data WrappedTerm =
   WrappedTerm {
     -- | The name of the wrapper type
     wrappedTermTypeName :: Name,
@@ -741,23 +730,8 @@
     wrappedTermBody :: Term}
   deriving (Eq, Ord, Read, Show)
 
-_WrappedTerm = (Name "hydra.core.WrappedTerm")
-
-_WrappedTerm_typeName = (Name "typeName")
-
-_WrappedTerm_body = (Name "body")
-
--- | A type wrapped in a type name; a newtype
-data WrappedType = 
-  WrappedType {
-    -- | The name of the wrapper (newtype)
-    wrappedTypeTypeName :: Name,
-    -- | The wrapped type
-    wrappedTypeBody :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_WrappedType = (Name "hydra.core.WrappedType")
+_WrappedTerm = Name "hydra.core.WrappedTerm"
 
-_WrappedType_typeName = (Name "typeName")
+_WrappedTerm_typeName = Name "typeName"
 
-_WrappedType_body = (Name "body")
+_WrappedTerm_body = Name "body"
diff --git a/src/gen-main/haskell/Hydra/Decode/Accessors.hs b/src/gen-main/haskell/Hydra/Decode/Accessors.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Decode/Accessors.hs
+++ /dev/null
@@ -1,130 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term decoders for hydra.accessors
-
-module Hydra.Decode.Accessors where
-
-import qualified Hydra.Accessors as Accessors
-import qualified Hydra.Core as Core
-import qualified Hydra.Decode.Core as Core_
-import qualified Hydra.Extract.Helpers as Helpers
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-accessorEdge :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Accessors.AccessorEdge)
-accessorEdge cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "source" accessorNode fieldMap cx) (\field_source -> Eithers.bind (Helpers.requireField "path" accessorPath fieldMap cx) (\field_path -> Eithers.bind (Helpers.requireField "target" accessorNode fieldMap cx) (\field_target -> Right (Accessors.AccessorEdge {
-      Accessors.accessorEdgeSource = field_source,
-      Accessors.accessorEdgePath = field_path,
-      Accessors.accessorEdgeTarget = field_target})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.accessors.AccessorEdge"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-accessorGraph :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Accessors.AccessorGraph)
-accessorGraph cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "nodes" (Helpers.decodeList accessorNode) fieldMap cx) (\field_nodes -> Eithers.bind (Helpers.requireField "edges" (Helpers.decodeList accessorEdge) fieldMap cx) (\field_edges -> Right (Accessors.AccessorGraph {
-      Accessors.accessorGraphNodes = field_nodes,
-      Accessors.accessorGraphEdges = field_edges}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.accessors.AccessorGraph"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-accessorNode :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Accessors.AccessorNode)
-accessorNode cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "label" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_label -> Eithers.bind (Helpers.requireField "id" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_id -> Right (Accessors.AccessorNode {
-      Accessors.accessorNodeName = field_name,
-      Accessors.accessorNodeLabel = field_label,
-      Accessors.accessorNodeId = field_id})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.accessors.AccessorNode"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-accessorPath :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Accessors.AccessorPath)
-accessorPath cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Accessors.AccessorPath b) (Helpers.decodeList termAccessor cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.accessors.AccessorPath"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-termAccessor :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Accessors.TermAccessor)
-termAccessor cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "annotatedBody", (\input -> Eithers.map (\t -> Accessors.TermAccessorAnnotatedBody) (Helpers.decodeUnit cx input))),
-                (Core.Name "applicationFunction", (\input -> Eithers.map (\t -> Accessors.TermAccessorApplicationFunction) (Helpers.decodeUnit cx input))),
-                (Core.Name "applicationArgument", (\input -> Eithers.map (\t -> Accessors.TermAccessorApplicationArgument) (Helpers.decodeUnit cx input))),
-                (Core.Name "lambdaBody", (\input -> Eithers.map (\t -> Accessors.TermAccessorLambdaBody) (Helpers.decodeUnit cx input))),
-                (Core.Name "unionCasesDefault", (\input -> Eithers.map (\t -> Accessors.TermAccessorUnionCasesDefault) (Helpers.decodeUnit cx input))),
-                (Core.Name "unionCasesBranch", (\input -> Eithers.map (\t -> Accessors.TermAccessorUnionCasesBranch t) (Core_.name cx input))),
-                (Core.Name "letBody", (\input -> Eithers.map (\t -> Accessors.TermAccessorLetBody) (Helpers.decodeUnit cx input))),
-                (Core.Name "letBinding", (\input -> Eithers.map (\t -> Accessors.TermAccessorLetBinding t) (Core_.name cx input))),
-                (Core.Name "listElement", (\input -> Eithers.map (\t -> Accessors.TermAccessorListElement t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "mapKey", (\input -> Eithers.map (\t -> Accessors.TermAccessorMapKey t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "mapValue", (\input -> Eithers.map (\t -> Accessors.TermAccessorMapValue t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "maybeTerm", (\input -> Eithers.map (\t -> Accessors.TermAccessorMaybeTerm) (Helpers.decodeUnit cx input))),
-                (Core.Name "productTerm", (\input -> Eithers.map (\t -> Accessors.TermAccessorProductTerm t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "recordField", (\input -> Eithers.map (\t -> Accessors.TermAccessorRecordField t) (Core_.name cx input))),
-                (Core.Name "setElement", (\input -> Eithers.map (\t -> Accessors.TermAccessorSetElement t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "sumTerm", (\input -> Eithers.map (\t -> Accessors.TermAccessorSumTerm) (Helpers.decodeUnit cx input))),
-                (Core.Name "typeLambdaBody", (\input -> Eithers.map (\t -> Accessors.TermAccessorTypeLambdaBody) (Helpers.decodeUnit cx input))),
-                (Core.Name "typeApplicationTerm", (\input -> Eithers.map (\t -> Accessors.TermAccessorTypeApplicationTerm) (Helpers.decodeUnit cx input))),
-                (Core.Name "injectionTerm", (\input -> Eithers.map (\t -> Accessors.TermAccessorInjectionTerm) (Helpers.decodeUnit cx input))),
-                (Core.Name "wrappedTerm", (\input -> Eithers.map (\t -> Accessors.TermAccessorWrappedTerm) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.accessors.TermAccessor"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
diff --git a/src/gen-main/haskell/Hydra/Decode/Ast.hs b/src/gen-main/haskell/Hydra/Decode/Ast.hs
--- a/src/gen-main/haskell/Hydra/Decode/Ast.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Ast.hs
@@ -6,6 +6,7 @@
 
 import qualified Hydra.Ast as Ast
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
@@ -13,7 +14,6 @@
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -21,189 +21,209 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-associativity :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.Associativity)
-associativity cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "none", (\input -> Eithers.map (\t -> Ast.AssociativityNone) (Helpers.decodeUnit cx input))),
-                (Core.Name "left", (\input -> Eithers.map (\t -> Ast.AssociativityLeft) (Helpers.decodeUnit cx input))),
-                (Core.Name "right", (\input -> Eithers.map (\t -> Ast.AssociativityRight) (Helpers.decodeUnit cx input))),
-                (Core.Name "both", (\input -> Eithers.map (\t -> Ast.AssociativityBoth) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.ast.Associativity"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+associativity :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.Associativity
+associativity cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "none", (\input -> Eithers.map (\t -> Ast.AssociativityNone) (Helpers.decodeUnit cx input))),
+                      (Core.Name "left", (\input -> Eithers.map (\t -> Ast.AssociativityLeft) (Helpers.decodeUnit cx input))),
+                      (Core.Name "right", (\input -> Eithers.map (\t -> Ast.AssociativityRight) (Helpers.decodeUnit cx input))),
+                      (Core.Name "both", (\input -> Eithers.map (\t -> Ast.AssociativityBoth) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-blockStyle :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.BlockStyle)
-blockStyle cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "indent" (Helpers.decodeMaybe (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_indent -> Eithers.bind (Helpers.requireField "newlineBeforeContent" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralBoolean v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected boolean literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_newlineBeforeContent -> Eithers.bind (Helpers.requireField "newlineAfterContent" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralBoolean v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected boolean literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_newlineAfterContent -> Right (Ast.BlockStyle {
-      Ast.blockStyleIndent = field_indent,
-      Ast.blockStyleNewlineBeforeContent = field_newlineBeforeContent,
-      Ast.blockStyleNewlineAfterContent = field_newlineAfterContent})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.ast.BlockStyle"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+blockStyle :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.BlockStyle
+blockStyle cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "indent" (Helpers.decodeMaybe (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_indent -> Eithers.bind (Helpers.requireField "newlineBeforeContent" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralBoolean v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected boolean literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_newlineBeforeContent -> Eithers.bind (Helpers.requireField "newlineAfterContent" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralBoolean v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected boolean literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_newlineAfterContent -> Right (Ast.BlockStyle {
+          Ast.blockStyleIndent = field_indent,
+          Ast.blockStyleNewlineBeforeContent = field_newlineBeforeContent,
+          Ast.blockStyleNewlineAfterContent = field_newlineAfterContent})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-bracketExpr :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.BracketExpr)
-bracketExpr cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "brackets" brackets fieldMap cx) (\field_brackets -> Eithers.bind (Helpers.requireField "enclosed" expr fieldMap cx) (\field_enclosed -> Eithers.bind (Helpers.requireField "style" blockStyle fieldMap cx) (\field_style -> Right (Ast.BracketExpr {
-      Ast.bracketExprBrackets = field_brackets,
-      Ast.bracketExprEnclosed = field_enclosed,
-      Ast.bracketExprStyle = field_style})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.ast.BracketExpr"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+bracketExpr :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.BracketExpr
+bracketExpr cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "brackets" brackets fieldMap cx) (\field_brackets -> Eithers.bind (Helpers.requireField "enclosed" expr fieldMap cx) (\field_enclosed -> Eithers.bind (Helpers.requireField "style" blockStyle fieldMap cx) (\field_style -> Right (Ast.BracketExpr {
+          Ast.bracketExprBrackets = field_brackets,
+          Ast.bracketExprEnclosed = field_enclosed,
+          Ast.bracketExprStyle = field_style})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-brackets :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.Brackets)
-brackets cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "open" symbol fieldMap cx) (\field_open -> Eithers.bind (Helpers.requireField "close" symbol fieldMap cx) (\field_close -> Right (Ast.Brackets {
-      Ast.bracketsOpen = field_open,
-      Ast.bracketsClose = field_close}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.ast.Brackets"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+brackets :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.Brackets
+brackets cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "open" symbol fieldMap cx) (\field_open -> Eithers.bind (Helpers.requireField "close" symbol fieldMap cx) (\field_close -> Right (Ast.Brackets {
+          Ast.bracketsOpen = field_open,
+          Ast.bracketsClose = field_close}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-expr :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.Expr)
-expr cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "const", (\input -> Eithers.map (\t -> Ast.ExprConst t) (symbol cx input))),
-                (Core.Name "indent", (\input -> Eithers.map (\t -> Ast.ExprIndent t) (indentedExpression cx input))),
-                (Core.Name "op", (\input -> Eithers.map (\t -> Ast.ExprOp t) (opExpr cx input))),
-                (Core.Name "brackets", (\input -> Eithers.map (\t -> Ast.ExprBrackets t) (bracketExpr cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.ast.Expr"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+expr :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.Expr
+expr cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "const", (\input -> Eithers.map (\t -> Ast.ExprConst t) (symbol cx input))),
+                      (Core.Name "indent", (\input -> Eithers.map (\t -> Ast.ExprIndent t) (indentedExpression cx input))),
+                      (Core.Name "op", (\input -> Eithers.map (\t -> Ast.ExprOp t) (opExpr cx input))),
+                      (Core.Name "brackets", (\input -> Eithers.map (\t -> Ast.ExprBrackets t) (bracketExpr cx input))),
+                      (Core.Name "seq", (\input -> Eithers.map (\t -> Ast.ExprSeq t) (seqExpr cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-indentedExpression :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.IndentedExpression)
-indentedExpression cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "style" indentStyle fieldMap cx) (\field_style -> Eithers.bind (Helpers.requireField "expr" expr fieldMap cx) (\field_expr -> Right (Ast.IndentedExpression {
-      Ast.indentedExpressionStyle = field_style,
-      Ast.indentedExpressionExpr = field_expr}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.ast.IndentedExpression"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+indentStyle :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.IndentStyle
+indentStyle cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "allLines", (\input -> Eithers.map (\t -> Ast.IndentStyleAllLines t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralString v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected string literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "subsequentLines", (\input -> Eithers.map (\t -> Ast.IndentStyleSubsequentLines t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralString v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected string literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input))))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-indentStyle :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.IndentStyle)
-indentStyle cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "allLines", (\input -> Eithers.map (\t -> Ast.IndentStyleAllLines t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "subsequentLines", (\input -> Eithers.map (\t -> Ast.IndentStyleSubsequentLines t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input))))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.ast.IndentStyle"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+indentedExpression :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.IndentedExpression
+indentedExpression cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "style" indentStyle fieldMap cx) (\field_style -> Eithers.bind (Helpers.requireField "expr" expr fieldMap cx) (\field_expr -> Right (Ast.IndentedExpression {
+          Ast.indentedExpressionStyle = field_style,
+          Ast.indentedExpressionExpr = field_expr}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-op :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.Op)
-op cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "symbol" symbol fieldMap cx) (\field_symbol -> Eithers.bind (Helpers.requireField "padding" padding fieldMap cx) (\field_padding -> Eithers.bind (Helpers.requireField "precedence" precedence fieldMap cx) (\field_precedence -> Eithers.bind (Helpers.requireField "associativity" associativity fieldMap cx) (\field_associativity -> Right (Ast.Op {
-      Ast.opSymbol = field_symbol,
-      Ast.opPadding = field_padding,
-      Ast.opPrecedence = field_precedence,
-      Ast.opAssociativity = field_associativity}))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.ast.Op"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+op :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.Op
+op cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "symbol" symbol fieldMap cx) (\field_symbol -> Eithers.bind (Helpers.requireField "padding" padding fieldMap cx) (\field_padding -> Eithers.bind (Helpers.requireField "precedence" precedence fieldMap cx) (\field_precedence -> Eithers.bind (Helpers.requireField "associativity" associativity fieldMap cx) (\field_associativity -> Right (Ast.Op {
+          Ast.opSymbol = field_symbol,
+          Ast.opPadding = field_padding,
+          Ast.opPrecedence = field_precedence,
+          Ast.opAssociativity = field_associativity}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-opExpr :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.OpExpr)
-opExpr cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "op" op fieldMap cx) (\field_op -> Eithers.bind (Helpers.requireField "lhs" expr fieldMap cx) (\field_lhs -> Eithers.bind (Helpers.requireField "rhs" expr fieldMap cx) (\field_rhs -> Right (Ast.OpExpr {
-      Ast.opExprOp = field_op,
-      Ast.opExprLhs = field_lhs,
-      Ast.opExprRhs = field_rhs})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.ast.OpExpr"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+opExpr :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.OpExpr
+opExpr cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "op" op fieldMap cx) (\field_op -> Eithers.bind (Helpers.requireField "lhs" expr fieldMap cx) (\field_lhs -> Eithers.bind (Helpers.requireField "rhs" expr fieldMap cx) (\field_rhs -> Right (Ast.OpExpr {
+          Ast.opExprOp = field_op,
+          Ast.opExprLhs = field_lhs,
+          Ast.opExprRhs = field_rhs})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-padding :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.Padding)
-padding cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "left" ws fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" ws fieldMap cx) (\field_right -> Right (Ast.Padding {
-      Ast.paddingLeft = field_left,
-      Ast.paddingRight = field_right}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.ast.Padding"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+padding :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.Padding
+padding cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "left" ws fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" ws fieldMap cx) (\field_right -> Right (Ast.Padding {
+          Ast.paddingLeft = field_left,
+          Ast.paddingRight = field_right}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-precedence :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.Precedence)
-precedence cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Ast.Precedence b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralInteger v3 -> ((\x -> case x of
-        Core.IntegerValueInt32 v4 -> (Right v4)
-        _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-      _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.ast.Precedence"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+precedence :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.Precedence
+precedence cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Ast.Precedence b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralInteger v2 -> case v2 of
+            Core.IntegerValueInt32 v3 -> Right v3
+            _ -> Left (Errors.DecodingError "expected int32 value")
+          _ -> Left (Errors.DecodingError "expected int32 literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-symbol :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.Symbol)
-symbol cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Ast.Symbol b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.ast.Symbol"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+seqExpr :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.SeqExpr
+seqExpr cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "op" op fieldMap cx) (\field_op -> Eithers.bind (Helpers.requireField "elements" (Helpers.decodeList expr) fieldMap cx) (\field_elements -> Right (Ast.SeqExpr {
+          Ast.seqExprOp = field_op,
+          Ast.seqExprElements = field_elements}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-ws :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Ast.Ws)
-ws cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "none", (\input -> Eithers.map (\t -> Ast.WsNone) (Helpers.decodeUnit cx input))),
-                (Core.Name "space", (\input -> Eithers.map (\t -> Ast.WsSpace) (Helpers.decodeUnit cx input))),
-                (Core.Name "break", (\input -> Eithers.map (\t -> Ast.WsBreak) (Helpers.decodeUnit cx input))),
-                (Core.Name "breakAndIndent", (\input -> Eithers.map (\t -> Ast.WsBreakAndIndent t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "doubleBreak", (\input -> Eithers.map (\t -> Ast.WsDoubleBreak) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.ast.Ws"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+symbol :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.Symbol
+symbol cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Ast.Symbol b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+ws :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Ast.Ws
+ws cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "none", (\input -> Eithers.map (\t -> Ast.WsNone) (Helpers.decodeUnit cx input))),
+                      (Core.Name "space", (\input -> Eithers.map (\t -> Ast.WsSpace) (Helpers.decodeUnit cx input))),
+                      (Core.Name "break", (\input -> Eithers.map (\t -> Ast.WsBreak) (Helpers.decodeUnit cx input))),
+                      (Core.Name "breakAndIndent", (\input -> Eithers.map (\t -> Ast.WsBreakAndIndent t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralString v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected string literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "doubleBreak", (\input -> Eithers.map (\t -> Ast.WsDoubleBreak) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Classes.hs b/src/gen-main/haskell/Hydra/Decode/Classes.hs
--- a/src/gen-main/haskell/Hydra/Decode/Classes.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Classes.hs
@@ -6,6 +6,7 @@
 
 import qualified Hydra.Classes as Classes
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
@@ -13,7 +14,6 @@
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -21,19 +21,19 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-typeClass :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Classes.TypeClass)
-typeClass cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "equality", (\input -> Eithers.map (\t -> Classes.TypeClassEquality) (Helpers.decodeUnit cx input))),
-                (Core.Name "ordering", (\input -> Eithers.map (\t -> Classes.TypeClassOrdering) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.classes.TypeClass"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+typeClass :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Classes.TypeClass
+typeClass cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "equality", (\input -> Eithers.map (\t -> Classes.TypeClassEquality) (Helpers.decodeUnit cx input))),
+                      (Core.Name "ordering", (\input -> Eithers.map (\t -> Classes.TypeClassOrdering) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Coders.hs b/src/gen-main/haskell/Hydra/Decode/Coders.hs
--- a/src/gen-main/haskell/Hydra/Decode/Coders.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Coders.hs
@@ -6,6 +6,7 @@
 
 import qualified Hydra.Coders as Coders
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
@@ -13,7 +14,6 @@
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -21,45 +21,46 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-coderDirection :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Coders.CoderDirection)
-coderDirection cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "encode", (\input -> Eithers.map (\t -> Coders.CoderDirectionEncode) (Helpers.decodeUnit cx input))),
-                (Core.Name "decode", (\input -> Eithers.map (\t -> Coders.CoderDirectionDecode) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.coders.CoderDirection"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+coderDirection :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Coders.CoderDirection
+coderDirection cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "encode", (\input -> Eithers.map (\t -> Coders.CoderDirectionEncode) (Helpers.decodeUnit cx input))),
+                      (Core.Name "decode", (\input -> Eithers.map (\t -> Coders.CoderDirectionDecode) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-languageName :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Coders.LanguageName)
-languageName cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Coders.LanguageName b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.coders.LanguageName"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+languageName :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Coders.LanguageName
+languageName cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Coders.LanguageName b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-traversalOrder :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Coders.TraversalOrder)
-traversalOrder cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "pre", (\input -> Eithers.map (\t -> Coders.TraversalOrderPre) (Helpers.decodeUnit cx input))),
-                (Core.Name "post", (\input -> Eithers.map (\t -> Coders.TraversalOrderPost) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.coders.TraversalOrder"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+traversalOrder :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Coders.TraversalOrder
+traversalOrder cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "pre", (\input -> Eithers.map (\t -> Coders.TraversalOrderPre) (Helpers.decodeUnit cx input))),
+                      (Core.Name "post", (\input -> Eithers.map (\t -> Coders.TraversalOrderPost) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Compute.hs b/src/gen-main/haskell/Hydra/Decode/Compute.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Decode/Compute.hs
+++ /dev/null
@@ -1,48 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term decoders for hydra.compute
-
-module Hydra.Decode.Compute where
-
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Decode.Core as Core_
-import qualified Hydra.Extract.Helpers as Helpers
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Util as Util
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-flowState :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> (Graph.Graph -> Core.Term -> Either Util.DecodingError t1) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Compute.FlowState t0 t1))
-flowState s v cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "value" (Helpers.decodeMaybe v) fieldMap cx) (\field_value -> Eithers.bind (Helpers.requireField "state" s fieldMap cx) (\field_state -> Eithers.bind (Helpers.requireField "trace" trace fieldMap cx) (\field_trace -> Right (Compute.FlowState {
-      Compute.flowStateValue = field_value,
-      Compute.flowStateState = field_state,
-      Compute.flowStateTrace = field_trace})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.compute.FlowState"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-trace :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Compute.Trace)
-trace cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "stack" (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_stack -> Eithers.bind (Helpers.requireField "messages" (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_messages -> Eithers.bind (Helpers.requireField "other" (Helpers.decodeMap Core_.name Core_.term) fieldMap cx) (\field_other -> Right (Compute.Trace {
-      Compute.traceStack = field_stack,
-      Compute.traceMessages = field_messages,
-      Compute.traceOther = field_other})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.compute.Trace"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
diff --git a/src/gen-main/haskell/Hydra/Decode/Constraints.hs b/src/gen-main/haskell/Hydra/Decode/Constraints.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Decode/Constraints.hs
+++ /dev/null
@@ -1,38 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term decoders for hydra.constraints
-
-module Hydra.Decode.Constraints where
-
-import qualified Hydra.Constraints as Constraints
-import qualified Hydra.Core as Core
-import qualified Hydra.Decode.Query as Query
-import qualified Hydra.Extract.Helpers as Helpers
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Util as Util
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-pathEquation :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Constraints.PathEquation)
-pathEquation cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "left" Query.path fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" Query.path fieldMap cx) (\field_right -> Right (Constraints.PathEquation {
-      Constraints.pathEquationLeft = field_left,
-      Constraints.pathEquationRight = field_right}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.constraints.PathEquation"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-patternImplication :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Constraints.PatternImplication)
-patternImplication cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "antecedent" Query.pattern fieldMap cx) (\field_antecedent -> Eithers.bind (Helpers.requireField "consequent" Query.pattern fieldMap cx) (\field_consequent -> Right (Constraints.PatternImplication {
-      Constraints.patternImplicationAntecedent = field_antecedent,
-      Constraints.patternImplicationConsequent = field_consequent}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.constraints.PatternImplication"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
diff --git a/src/gen-main/haskell/Hydra/Decode/Context.hs b/src/gen-main/haskell/Hydra/Decode/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Decode/Context.hs
@@ -0,0 +1,49 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term decoders for hydra.context
+
+module Hydra.Decode.Context where
+
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Helpers as Helpers
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+context :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Context.Context
+context cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "trace" (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_trace -> Eithers.bind (Helpers.requireField "messages" (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_messages -> Eithers.bind (Helpers.requireField "other" (Helpers.decodeMap Core_.name Core_.term) fieldMap cx) (\field_other -> Right (Context.Context {
+          Context.contextTrace = field_trace,
+          Context.contextMessages = field_messages,
+          Context.contextOther = field_other})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+inContext :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Context.InContext t0)
+inContext e cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "object" e fieldMap cx) (\field_object -> Eithers.bind (Helpers.requireField "context" context fieldMap cx) (\field_context -> Right (Context.InContext {
+          Context.inContextObject = field_object,
+          Context.inContextContext = field_context}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Core.hs b/src/gen-main/haskell/Hydra/Decode/Core.hs
--- a/src/gen-main/haskell/Hydra/Decode/Core.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Core.hs
@@ -5,562 +5,569 @@
 module Hydra.Decode.Core where
 
 import qualified Hydra.Core as Core
-import qualified Hydra.Extract.Helpers as Helpers
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-annotatedTerm :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.AnnotatedTerm)
-annotatedTerm cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Eithers.bind (Helpers.requireField "annotation" (Helpers.decodeMap name term) fieldMap cx) (\field_annotation -> Right (Core.AnnotatedTerm {
-      Core.annotatedTermBody = field_body,
-      Core.annotatedTermAnnotation = field_annotation}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.AnnotatedTerm"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-annotatedType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.AnnotatedType)
-annotatedType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "body" type_ fieldMap cx) (\field_body -> Eithers.bind (Helpers.requireField "annotation" (Helpers.decodeMap name term) fieldMap cx) (\field_annotation -> Right (Core.AnnotatedType {
-      Core.annotatedTypeBody = field_body,
-      Core.annotatedTypeAnnotation = field_annotation}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.AnnotatedType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-application :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Application)
-application cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "function" term fieldMap cx) (\field_function -> Eithers.bind (Helpers.requireField "argument" term fieldMap cx) (\field_argument -> Right (Core.Application {
-      Core.applicationFunction = field_function,
-      Core.applicationArgument = field_argument}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.Application"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-applicationType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.ApplicationType)
-applicationType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "function" type_ fieldMap cx) (\field_function -> Eithers.bind (Helpers.requireField "argument" type_ fieldMap cx) (\field_argument -> Right (Core.ApplicationType {
-      Core.applicationTypeFunction = field_function,
-      Core.applicationTypeArgument = field_argument}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.ApplicationType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-binding :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Binding)
-binding cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "term" term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "type" (Helpers.decodeMaybe typeScheme) fieldMap cx) (\field_type -> Right (Core.Binding {
-      Core.bindingName = field_name,
-      Core.bindingTerm = field_term,
-      Core.bindingType = field_type})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.Binding"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-caseStatement :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.CaseStatement)
-caseStatement cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "default" (Helpers.decodeMaybe term) fieldMap cx) (\field_default -> Eithers.bind (Helpers.requireField "cases" (Helpers.decodeList field) fieldMap cx) (\field_cases -> Right (Core.CaseStatement {
-      Core.caseStatementTypeName = field_typeName,
-      Core.caseStatementDefault = field_default,
-      Core.caseStatementCases = field_cases})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.CaseStatement"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-eitherType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.EitherType)
-eitherType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "left" type_ fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" type_ fieldMap cx) (\field_right -> Right (Core.EitherType {
-      Core.eitherTypeLeft = field_left,
-      Core.eitherTypeRight = field_right}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.EitherType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-pairType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.PairType)
-pairType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "first" type_ fieldMap cx) (\field_first -> Eithers.bind (Helpers.requireField "second" type_ fieldMap cx) (\field_second -> Right (Core.PairType {
-      Core.pairTypeFirst = field_first,
-      Core.pairTypeSecond = field_second}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.PairType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-elimination :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Elimination)
-elimination cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "record", (\input -> Eithers.map (\t -> Core.EliminationRecord t) (projection cx input))),
-                (Core.Name "union", (\input -> Eithers.map (\t -> Core.EliminationUnion t) (caseStatement cx input))),
-                (Core.Name "wrap", (\input -> Eithers.map (\t -> Core.EliminationWrap t) (name cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.Elimination"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-field :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Field)
-field cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "term" term fieldMap cx) (\field_term -> Right (Core.Field {
-      Core.fieldName = field_name,
-      Core.fieldTerm = field_term}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.Field"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-fieldType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.FieldType)
-fieldType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "type" type_ fieldMap cx) (\field_type -> Right (Core.FieldType {
-      Core.fieldTypeName = field_name,
-      Core.fieldTypeType = field_type}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.FieldType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-floatType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.FloatType)
-floatType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "bigfloat", (\input -> Eithers.map (\t -> Core.FloatTypeBigfloat) (Helpers.decodeUnit cx input))),
-                (Core.Name "float32", (\input -> Eithers.map (\t -> Core.FloatTypeFloat32) (Helpers.decodeUnit cx input))),
-                (Core.Name "float64", (\input -> Eithers.map (\t -> Core.FloatTypeFloat64) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.FloatType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-floatValue :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.FloatValue)
-floatValue cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "bigfloat", (\input -> Eithers.map (\t -> Core.FloatValueBigfloat t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralFloat v3 -> ((\x -> case x of
-                      Core.FloatValueBigfloat v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected bigfloat value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected bigfloat literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "float32", (\input -> Eithers.map (\t -> Core.FloatValueFloat32 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralFloat v3 -> ((\x -> case x of
-                      Core.FloatValueFloat32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected float32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected float32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "float64", (\input -> Eithers.map (\t -> Core.FloatValueFloat64 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralFloat v3 -> ((\x -> case x of
-                      Core.FloatValueFloat64 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected float64 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected float64 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input))))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.FloatValue"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-forallType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.ForallType)
-forallType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "parameter" name fieldMap cx) (\field_parameter -> Eithers.bind (Helpers.requireField "body" type_ fieldMap cx) (\field_body -> Right (Core.ForallType {
-      Core.forallTypeParameter = field_parameter,
-      Core.forallTypeBody = field_body}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.ForallType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-function :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Function)
-function cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "elimination", (\input -> Eithers.map (\t -> Core.FunctionElimination t) (elimination cx input))),
-                (Core.Name "lambda", (\input -> Eithers.map (\t -> Core.FunctionLambda t) (lambda cx input))),
-                (Core.Name "primitive", (\input -> Eithers.map (\t -> Core.FunctionPrimitive t) (name cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.Function"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-functionType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.FunctionType)
-functionType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "domain" type_ fieldMap cx) (\field_domain -> Eithers.bind (Helpers.requireField "codomain" type_ fieldMap cx) (\field_codomain -> Right (Core.FunctionType {
-      Core.functionTypeDomain = field_domain,
-      Core.functionTypeCodomain = field_codomain}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.FunctionType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-injection :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Injection)
-injection cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "field" field fieldMap cx) (\field_field -> Right (Core.Injection {
-      Core.injectionTypeName = field_typeName,
-      Core.injectionField = field_field}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.Injection"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-integerType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.IntegerType)
-integerType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "bigint", (\input -> Eithers.map (\t -> Core.IntegerTypeBigint) (Helpers.decodeUnit cx input))),
-                (Core.Name "int8", (\input -> Eithers.map (\t -> Core.IntegerTypeInt8) (Helpers.decodeUnit cx input))),
-                (Core.Name "int16", (\input -> Eithers.map (\t -> Core.IntegerTypeInt16) (Helpers.decodeUnit cx input))),
-                (Core.Name "int32", (\input -> Eithers.map (\t -> Core.IntegerTypeInt32) (Helpers.decodeUnit cx input))),
-                (Core.Name "int64", (\input -> Eithers.map (\t -> Core.IntegerTypeInt64) (Helpers.decodeUnit cx input))),
-                (Core.Name "uint8", (\input -> Eithers.map (\t -> Core.IntegerTypeUint8) (Helpers.decodeUnit cx input))),
-                (Core.Name "uint16", (\input -> Eithers.map (\t -> Core.IntegerTypeUint16) (Helpers.decodeUnit cx input))),
-                (Core.Name "uint32", (\input -> Eithers.map (\t -> Core.IntegerTypeUint32) (Helpers.decodeUnit cx input))),
-                (Core.Name "uint64", (\input -> Eithers.map (\t -> Core.IntegerTypeUint64) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.IntegerType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-integerValue :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.IntegerValue)
-integerValue cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "bigint", (\input -> Eithers.map (\t -> Core.IntegerValueBigint t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueBigint v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected bigint value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected bigint literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "int8", (\input -> Eithers.map (\t -> Core.IntegerValueInt8 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt8 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int8 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int8 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "int16", (\input -> Eithers.map (\t -> Core.IntegerValueInt16 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt16 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int16 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int16 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "int32", (\input -> Eithers.map (\t -> Core.IntegerValueInt32 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "int64", (\input -> Eithers.map (\t -> Core.IntegerValueInt64 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt64 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int64 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int64 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "uint8", (\input -> Eithers.map (\t -> Core.IntegerValueUint8 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueUint8 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected uint8 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected uint8 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "uint16", (\input -> Eithers.map (\t -> Core.IntegerValueUint16 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueUint16 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected uint16 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected uint16 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "uint32", (\input -> Eithers.map (\t -> Core.IntegerValueUint32 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueUint32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected uint32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected uint32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "uint64", (\input -> Eithers.map (\t -> Core.IntegerValueUint64 t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueUint64 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected uint64 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected uint64 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input))))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.IntegerValue"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-lambda :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Lambda)
-lambda cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "parameter" name fieldMap cx) (\field_parameter -> Eithers.bind (Helpers.requireField "domain" (Helpers.decodeMaybe type_) fieldMap cx) (\field_domain -> Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Right (Core.Lambda {
-      Core.lambdaParameter = field_parameter,
-      Core.lambdaDomain = field_domain,
-      Core.lambdaBody = field_body})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.Lambda"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-let_ :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Let)
-let_ cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "bindings" (Helpers.decodeList binding) fieldMap cx) (\field_bindings -> Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Right (Core.Let {
-      Core.letBindings = field_bindings,
-      Core.letBody = field_body}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.Let"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-literal :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Literal)
-literal cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "binary", (\input -> Eithers.map (\t -> Core.LiteralBinary t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralBinary v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected binary literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "boolean", (\input -> Eithers.map (\t -> Core.LiteralBoolean t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralBoolean v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected boolean literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "float", (\input -> Eithers.map (\t -> Core.LiteralFloat t) (floatValue cx input))),
-                (Core.Name "integer", (\input -> Eithers.map (\t -> Core.LiteralInteger t) (integerValue cx input))),
-                (Core.Name "string", (\input -> Eithers.map (\t -> Core.LiteralString t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input))))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.Literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-literalType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.LiteralType)
-literalType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "binary", (\input -> Eithers.map (\t -> Core.LiteralTypeBinary) (Helpers.decodeUnit cx input))),
-                (Core.Name "boolean", (\input -> Eithers.map (\t -> Core.LiteralTypeBoolean) (Helpers.decodeUnit cx input))),
-                (Core.Name "float", (\input -> Eithers.map (\t -> Core.LiteralTypeFloat t) (floatType cx input))),
-                (Core.Name "integer", (\input -> Eithers.map (\t -> Core.LiteralTypeInteger t) (integerType cx input))),
-                (Core.Name "string", (\input -> Eithers.map (\t -> Core.LiteralTypeString) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.LiteralType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-mapType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.MapType)
-mapType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "keys" type_ fieldMap cx) (\field_keys -> Eithers.bind (Helpers.requireField "values" type_ fieldMap cx) (\field_values -> Right (Core.MapType {
-      Core.mapTypeKeys = field_keys,
-      Core.mapTypeValues = field_values}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.MapType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-name :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Name)
-name cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Core.Name b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.core.Name"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-projection :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Projection)
-projection cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "field" name fieldMap cx) (\field_field -> Right (Core.Projection {
-      Core.projectionTypeName = field_typeName,
-      Core.projectionField = field_field}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.Projection"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-record :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Record)
-record cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "fields" (Helpers.decodeList field) fieldMap cx) (\field_fields -> Right (Core.Record {
-      Core.recordTypeName = field_typeName,
-      Core.recordFields = field_fields}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.Record"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-rowType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.RowType)
-rowType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "fields" (Helpers.decodeList fieldType) fieldMap cx) (\field_fields -> Right (Core.RowType {
-      Core.rowTypeTypeName = field_typeName,
-      Core.rowTypeFields = field_fields}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.RowType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-term :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Term)
-term cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "annotated", (\input -> Eithers.map (\t -> Core.TermAnnotated t) (annotatedTerm cx input))),
-                (Core.Name "application", (\input -> Eithers.map (\t -> Core.TermApplication t) (application cx input))),
-                (Core.Name "either", (\input -> Eithers.map (\t -> Core.TermEither t) (Helpers.decodeEither term term cx input))),
-                (Core.Name "function", (\input -> Eithers.map (\t -> Core.TermFunction t) (function cx input))),
-                (Core.Name "let", (\input -> Eithers.map (\t -> Core.TermLet t) (let_ cx input))),
-                (Core.Name "list", (\input -> Eithers.map (\t -> Core.TermList t) (Helpers.decodeList term cx input))),
-                (Core.Name "literal", (\input -> Eithers.map (\t -> Core.TermLiteral t) (literal cx input))),
-                (Core.Name "map", (\input -> Eithers.map (\t -> Core.TermMap t) (Helpers.decodeMap term term cx input))),
-                (Core.Name "maybe", (\input -> Eithers.map (\t -> Core.TermMaybe t) (Helpers.decodeMaybe term cx input))),
-                (Core.Name "pair", (\input -> Eithers.map (\t -> Core.TermPair t) (Helpers.decodePair term term cx input))),
-                (Core.Name "record", (\input -> Eithers.map (\t -> Core.TermRecord t) (record cx input))),
-                (Core.Name "set", (\input -> Eithers.map (\t -> Core.TermSet t) (Helpers.decodeSet term cx input))),
-                (Core.Name "typeApplication", (\input -> Eithers.map (\t -> Core.TermTypeApplication t) (typeApplicationTerm cx input))),
-                (Core.Name "typeLambda", (\input -> Eithers.map (\t -> Core.TermTypeLambda t) (typeLambda cx input))),
-                (Core.Name "union", (\input -> Eithers.map (\t -> Core.TermUnion t) (injection cx input))),
-                (Core.Name "unit", (\input -> Eithers.map (\t -> Core.TermUnit) (Helpers.decodeUnit cx input))),
-                (Core.Name "variable", (\input -> Eithers.map (\t -> Core.TermVariable t) (name cx input))),
-                (Core.Name "wrap", (\input -> Eithers.map (\t -> Core.TermWrap t) (wrappedTerm cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.Term"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-type_ :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.Type)
-type_ cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "annotated", (\input -> Eithers.map (\t -> Core.TypeAnnotated t) (annotatedType cx input))),
-                (Core.Name "application", (\input -> Eithers.map (\t -> Core.TypeApplication t) (applicationType cx input))),
-                (Core.Name "either", (\input -> Eithers.map (\t -> Core.TypeEither t) (eitherType cx input))),
-                (Core.Name "forall", (\input -> Eithers.map (\t -> Core.TypeForall t) (forallType cx input))),
-                (Core.Name "function", (\input -> Eithers.map (\t -> Core.TypeFunction t) (functionType cx input))),
-                (Core.Name "list", (\input -> Eithers.map (\t -> Core.TypeList t) (type_ cx input))),
-                (Core.Name "literal", (\input -> Eithers.map (\t -> Core.TypeLiteral t) (literalType cx input))),
-                (Core.Name "map", (\input -> Eithers.map (\t -> Core.TypeMap t) (mapType cx input))),
-                (Core.Name "maybe", (\input -> Eithers.map (\t -> Core.TypeMaybe t) (type_ cx input))),
-                (Core.Name "pair", (\input -> Eithers.map (\t -> Core.TypePair t) (pairType cx input))),
-                (Core.Name "record", (\input -> Eithers.map (\t -> Core.TypeRecord t) (rowType cx input))),
-                (Core.Name "set", (\input -> Eithers.map (\t -> Core.TypeSet t) (type_ cx input))),
-                (Core.Name "union", (\input -> Eithers.map (\t -> Core.TypeUnion t) (rowType cx input))),
-                (Core.Name "unit", (\input -> Eithers.map (\t -> Core.TypeUnit) (Helpers.decodeUnit cx input))),
-                (Core.Name "variable", (\input -> Eithers.map (\t -> Core.TypeVariable t) (name cx input))),
-                (Core.Name "wrap", (\input -> Eithers.map (\t -> Core.TypeWrap t) (wrappedType cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.core.Type"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-typeApplicationTerm :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.TypeApplicationTerm)
-typeApplicationTerm cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Eithers.bind (Helpers.requireField "type" type_ fieldMap cx) (\field_type -> Right (Core.TypeApplicationTerm {
-      Core.typeApplicationTermBody = field_body,
-      Core.typeApplicationTermType = field_type}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.TypeApplicationTerm"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-typeLambda :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.TypeLambda)
-typeLambda cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "parameter" name fieldMap cx) (\field_parameter -> Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Right (Core.TypeLambda {
-      Core.typeLambdaParameter = field_parameter,
-      Core.typeLambdaBody = field_body}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.TypeLambda"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-typeScheme :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.TypeScheme)
-typeScheme cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "variables" (Helpers.decodeList name) fieldMap cx) (\field_variables -> Eithers.bind (Helpers.requireField "type" type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "constraints" (Helpers.decodeMaybe (Helpers.decodeMap name typeVariableMetadata)) fieldMap cx) (\field_constraints -> Right (Core.TypeScheme {
-      Core.typeSchemeVariables = field_variables,
-      Core.typeSchemeType = field_type,
-      Core.typeSchemeConstraints = field_constraints})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.TypeScheme"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-typeVariableMetadata :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.TypeVariableMetadata)
-typeVariableMetadata cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "classes" (Helpers.decodeSet name) fieldMap cx) (\field_classes -> Right (Core.TypeVariableMetadata {
-      Core.typeVariableMetadataClasses = field_classes})))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.TypeVariableMetadata"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-wrappedTerm :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.WrappedTerm)
-wrappedTerm cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Right (Core.WrappedTerm {
-      Core.wrappedTermTypeName = field_typeName,
-      Core.wrappedTermBody = field_body}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.WrappedTerm"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-wrappedType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Core.WrappedType)
-wrappedType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "body" type_ fieldMap cx) (\field_body -> Right (Core.WrappedType {
-      Core.wrappedTypeTypeName = field_typeName,
-      Core.wrappedTypeBody = field_body}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.core.WrappedType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Helpers as Helpers
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Strings as Strings
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+annotatedTerm :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.AnnotatedTerm
+annotatedTerm cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Eithers.bind (Helpers.requireField "annotation" (Helpers.decodeMap name term) fieldMap cx) (\field_annotation -> Right (Core.AnnotatedTerm {
+          Core.annotatedTermBody = field_body,
+          Core.annotatedTermAnnotation = field_annotation}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+annotatedType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.AnnotatedType
+annotatedType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "body" type_ fieldMap cx) (\field_body -> Eithers.bind (Helpers.requireField "annotation" (Helpers.decodeMap name term) fieldMap cx) (\field_annotation -> Right (Core.AnnotatedType {
+          Core.annotatedTypeBody = field_body,
+          Core.annotatedTypeAnnotation = field_annotation}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+application :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Application
+application cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "function" term fieldMap cx) (\field_function -> Eithers.bind (Helpers.requireField "argument" term fieldMap cx) (\field_argument -> Right (Core.Application {
+          Core.applicationFunction = field_function,
+          Core.applicationArgument = field_argument}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+applicationType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.ApplicationType
+applicationType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "function" type_ fieldMap cx) (\field_function -> Eithers.bind (Helpers.requireField "argument" type_ fieldMap cx) (\field_argument -> Right (Core.ApplicationType {
+          Core.applicationTypeFunction = field_function,
+          Core.applicationTypeArgument = field_argument}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+binding :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Binding
+binding cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "term" term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "type" (Helpers.decodeMaybe typeScheme) fieldMap cx) (\field_type -> Right (Core.Binding {
+          Core.bindingName = field_name,
+          Core.bindingTerm = field_term,
+          Core.bindingType = field_type})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+caseStatement :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.CaseStatement
+caseStatement cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "default" (Helpers.decodeMaybe term) fieldMap cx) (\field_default -> Eithers.bind (Helpers.requireField "cases" (Helpers.decodeList field) fieldMap cx) (\field_cases -> Right (Core.CaseStatement {
+          Core.caseStatementTypeName = field_typeName,
+          Core.caseStatementDefault = field_default,
+          Core.caseStatementCases = field_cases})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+eitherType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.EitherType
+eitherType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "left" type_ fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" type_ fieldMap cx) (\field_right -> Right (Core.EitherType {
+          Core.eitherTypeLeft = field_left,
+          Core.eitherTypeRight = field_right}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+elimination :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Elimination
+elimination cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "record", (\input -> Eithers.map (\t -> Core.EliminationRecord t) (projection cx input))),
+                      (Core.Name "union", (\input -> Eithers.map (\t -> Core.EliminationUnion t) (caseStatement cx input))),
+                      (Core.Name "wrap", (\input -> Eithers.map (\t -> Core.EliminationWrap t) (name cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+field :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Field
+field cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "term" term fieldMap cx) (\field_term -> Right (Core.Field {
+          Core.fieldName = field_name,
+          Core.fieldTerm = field_term}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+fieldType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.FieldType
+fieldType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "type" type_ fieldMap cx) (\field_type -> Right (Core.FieldType {
+          Core.fieldTypeName = field_name,
+          Core.fieldTypeType = field_type}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+floatType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.FloatType
+floatType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "bigfloat", (\input -> Eithers.map (\t -> Core.FloatTypeBigfloat) (Helpers.decodeUnit cx input))),
+                      (Core.Name "float32", (\input -> Eithers.map (\t -> Core.FloatTypeFloat32) (Helpers.decodeUnit cx input))),
+                      (Core.Name "float64", (\input -> Eithers.map (\t -> Core.FloatTypeFloat64) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+floatValue :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.FloatValue
+floatValue cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "bigfloat", (\input -> Eithers.map (\t -> Core.FloatValueBigfloat t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralFloat v2 -> case v2 of
+                            Core.FloatValueBigfloat v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected bigfloat value")
+                          _ -> Left (Errors.DecodingError "expected bigfloat literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "float32", (\input -> Eithers.map (\t -> Core.FloatValueFloat32 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralFloat v2 -> case v2 of
+                            Core.FloatValueFloat32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected float32 value")
+                          _ -> Left (Errors.DecodingError "expected float32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "float64", (\input -> Eithers.map (\t -> Core.FloatValueFloat64 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralFloat v2 -> case v2 of
+                            Core.FloatValueFloat64 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected float64 value")
+                          _ -> Left (Errors.DecodingError "expected float64 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input))))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+forallType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.ForallType
+forallType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "parameter" name fieldMap cx) (\field_parameter -> Eithers.bind (Helpers.requireField "body" type_ fieldMap cx) (\field_body -> Right (Core.ForallType {
+          Core.forallTypeParameter = field_parameter,
+          Core.forallTypeBody = field_body}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+function :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Function
+function cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "elimination", (\input -> Eithers.map (\t -> Core.FunctionElimination t) (elimination cx input))),
+                      (Core.Name "lambda", (\input -> Eithers.map (\t -> Core.FunctionLambda t) (lambda cx input))),
+                      (Core.Name "primitive", (\input -> Eithers.map (\t -> Core.FunctionPrimitive t) (name cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+functionType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.FunctionType
+functionType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "domain" type_ fieldMap cx) (\field_domain -> Eithers.bind (Helpers.requireField "codomain" type_ fieldMap cx) (\field_codomain -> Right (Core.FunctionType {
+          Core.functionTypeDomain = field_domain,
+          Core.functionTypeCodomain = field_codomain}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+injection :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Injection
+injection cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "field" field fieldMap cx) (\field_field -> Right (Core.Injection {
+          Core.injectionTypeName = field_typeName,
+          Core.injectionField = field_field}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+integerType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.IntegerType
+integerType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "bigint", (\input -> Eithers.map (\t -> Core.IntegerTypeBigint) (Helpers.decodeUnit cx input))),
+                      (Core.Name "int8", (\input -> Eithers.map (\t -> Core.IntegerTypeInt8) (Helpers.decodeUnit cx input))),
+                      (Core.Name "int16", (\input -> Eithers.map (\t -> Core.IntegerTypeInt16) (Helpers.decodeUnit cx input))),
+                      (Core.Name "int32", (\input -> Eithers.map (\t -> Core.IntegerTypeInt32) (Helpers.decodeUnit cx input))),
+                      (Core.Name "int64", (\input -> Eithers.map (\t -> Core.IntegerTypeInt64) (Helpers.decodeUnit cx input))),
+                      (Core.Name "uint8", (\input -> Eithers.map (\t -> Core.IntegerTypeUint8) (Helpers.decodeUnit cx input))),
+                      (Core.Name "uint16", (\input -> Eithers.map (\t -> Core.IntegerTypeUint16) (Helpers.decodeUnit cx input))),
+                      (Core.Name "uint32", (\input -> Eithers.map (\t -> Core.IntegerTypeUint32) (Helpers.decodeUnit cx input))),
+                      (Core.Name "uint64", (\input -> Eithers.map (\t -> Core.IntegerTypeUint64) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+integerValue :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.IntegerValue
+integerValue cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "bigint", (\input -> Eithers.map (\t -> Core.IntegerValueBigint t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueBigint v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected bigint value")
+                          _ -> Left (Errors.DecodingError "expected bigint literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "int8", (\input -> Eithers.map (\t -> Core.IntegerValueInt8 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt8 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int8 value")
+                          _ -> Left (Errors.DecodingError "expected int8 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "int16", (\input -> Eithers.map (\t -> Core.IntegerValueInt16 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt16 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int16 value")
+                          _ -> Left (Errors.DecodingError "expected int16 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "int32", (\input -> Eithers.map (\t -> Core.IntegerValueInt32 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "int64", (\input -> Eithers.map (\t -> Core.IntegerValueInt64 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt64 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int64 value")
+                          _ -> Left (Errors.DecodingError "expected int64 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "uint8", (\input -> Eithers.map (\t -> Core.IntegerValueUint8 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueUint8 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected uint8 value")
+                          _ -> Left (Errors.DecodingError "expected uint8 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "uint16", (\input -> Eithers.map (\t -> Core.IntegerValueUint16 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueUint16 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected uint16 value")
+                          _ -> Left (Errors.DecodingError "expected uint16 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "uint32", (\input -> Eithers.map (\t -> Core.IntegerValueUint32 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueUint32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected uint32 value")
+                          _ -> Left (Errors.DecodingError "expected uint32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "uint64", (\input -> Eithers.map (\t -> Core.IntegerValueUint64 t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueUint64 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected uint64 value")
+                          _ -> Left (Errors.DecodingError "expected uint64 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input))))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+lambda :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Lambda
+lambda cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "parameter" name fieldMap cx) (\field_parameter -> Eithers.bind (Helpers.requireField "domain" (Helpers.decodeMaybe type_) fieldMap cx) (\field_domain -> Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Right (Core.Lambda {
+          Core.lambdaParameter = field_parameter,
+          Core.lambdaDomain = field_domain,
+          Core.lambdaBody = field_body})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+let_ :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Let
+let_ cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "bindings" (Helpers.decodeList binding) fieldMap cx) (\field_bindings -> Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Right (Core.Let {
+          Core.letBindings = field_bindings,
+          Core.letBody = field_body}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+literal :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Literal
+literal cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "binary", (\input -> Eithers.map (\t -> Core.LiteralBinary t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralBinary v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected binary literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "boolean", (\input -> Eithers.map (\t -> Core.LiteralBoolean t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralBoolean v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected boolean literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "float", (\input -> Eithers.map (\t -> Core.LiteralFloat t) (floatValue cx input))),
+                      (Core.Name "integer", (\input -> Eithers.map (\t -> Core.LiteralInteger t) (integerValue cx input))),
+                      (Core.Name "string", (\input -> Eithers.map (\t -> Core.LiteralString t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralString v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected string literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input))))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+literalType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.LiteralType
+literalType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "binary", (\input -> Eithers.map (\t -> Core.LiteralTypeBinary) (Helpers.decodeUnit cx input))),
+                      (Core.Name "boolean", (\input -> Eithers.map (\t -> Core.LiteralTypeBoolean) (Helpers.decodeUnit cx input))),
+                      (Core.Name "float", (\input -> Eithers.map (\t -> Core.LiteralTypeFloat t) (floatType cx input))),
+                      (Core.Name "integer", (\input -> Eithers.map (\t -> Core.LiteralTypeInteger t) (integerType cx input))),
+                      (Core.Name "string", (\input -> Eithers.map (\t -> Core.LiteralTypeString) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+mapType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.MapType
+mapType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "keys" type_ fieldMap cx) (\field_keys -> Eithers.bind (Helpers.requireField "values" type_ fieldMap cx) (\field_values -> Right (Core.MapType {
+          Core.mapTypeKeys = field_keys,
+          Core.mapTypeValues = field_values}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+name :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Name
+name cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Core.Name b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+pairType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.PairType
+pairType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "first" type_ fieldMap cx) (\field_first -> Eithers.bind (Helpers.requireField "second" type_ fieldMap cx) (\field_second -> Right (Core.PairType {
+          Core.pairTypeFirst = field_first,
+          Core.pairTypeSecond = field_second}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+projection :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Projection
+projection cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "field" name fieldMap cx) (\field_field -> Right (Core.Projection {
+          Core.projectionTypeName = field_typeName,
+          Core.projectionField = field_field}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+record :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Record
+record cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "fields" (Helpers.decodeList field) fieldMap cx) (\field_fields -> Right (Core.Record {
+          Core.recordTypeName = field_typeName,
+          Core.recordFields = field_fields}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+term :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Term
+term cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "annotated", (\input -> Eithers.map (\t -> Core.TermAnnotated t) (annotatedTerm cx input))),
+                      (Core.Name "application", (\input -> Eithers.map (\t -> Core.TermApplication t) (application cx input))),
+                      (Core.Name "either", (\input -> Eithers.map (\t -> Core.TermEither t) (Helpers.decodeEither term term cx input))),
+                      (Core.Name "function", (\input -> Eithers.map (\t -> Core.TermFunction t) (function cx input))),
+                      (Core.Name "let", (\input -> Eithers.map (\t -> Core.TermLet t) (let_ cx input))),
+                      (Core.Name "list", (\input -> Eithers.map (\t -> Core.TermList t) (Helpers.decodeList term cx input))),
+                      (Core.Name "literal", (\input -> Eithers.map (\t -> Core.TermLiteral t) (literal cx input))),
+                      (Core.Name "map", (\input -> Eithers.map (\t -> Core.TermMap t) (Helpers.decodeMap term term cx input))),
+                      (Core.Name "maybe", (\input -> Eithers.map (\t -> Core.TermMaybe t) (Helpers.decodeMaybe term cx input))),
+                      (Core.Name "pair", (\input -> Eithers.map (\t -> Core.TermPair t) (Helpers.decodePair term term cx input))),
+                      (Core.Name "record", (\input -> Eithers.map (\t -> Core.TermRecord t) (record cx input))),
+                      (Core.Name "set", (\input -> Eithers.map (\t -> Core.TermSet t) (Helpers.decodeSet term cx input))),
+                      (Core.Name "typeApplication", (\input -> Eithers.map (\t -> Core.TermTypeApplication t) (typeApplicationTerm cx input))),
+                      (Core.Name "typeLambda", (\input -> Eithers.map (\t -> Core.TermTypeLambda t) (typeLambda cx input))),
+                      (Core.Name "union", (\input -> Eithers.map (\t -> Core.TermUnion t) (injection cx input))),
+                      (Core.Name "unit", (\input -> Eithers.map (\t -> Core.TermUnit) (Helpers.decodeUnit cx input))),
+                      (Core.Name "variable", (\input -> Eithers.map (\t -> Core.TermVariable t) (name cx input))),
+                      (Core.Name "wrap", (\input -> Eithers.map (\t -> Core.TermWrap t) (wrappedTerm cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+type_ :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.Type
+type_ cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "annotated", (\input -> Eithers.map (\t -> Core.TypeAnnotated t) (annotatedType cx input))),
+                      (Core.Name "application", (\input -> Eithers.map (\t -> Core.TypeApplication t) (applicationType cx input))),
+                      (Core.Name "either", (\input -> Eithers.map (\t -> Core.TypeEither t) (eitherType cx input))),
+                      (Core.Name "forall", (\input -> Eithers.map (\t -> Core.TypeForall t) (forallType cx input))),
+                      (Core.Name "function", (\input -> Eithers.map (\t -> Core.TypeFunction t) (functionType cx input))),
+                      (Core.Name "list", (\input -> Eithers.map (\t -> Core.TypeList t) (type_ cx input))),
+                      (Core.Name "literal", (\input -> Eithers.map (\t -> Core.TypeLiteral t) (literalType cx input))),
+                      (Core.Name "map", (\input -> Eithers.map (\t -> Core.TypeMap t) (mapType cx input))),
+                      (Core.Name "maybe", (\input -> Eithers.map (\t -> Core.TypeMaybe t) (type_ cx input))),
+                      (Core.Name "pair", (\input -> Eithers.map (\t -> Core.TypePair t) (pairType cx input))),
+                      (Core.Name "record", (\input -> Eithers.map (\t -> Core.TypeRecord t) (Helpers.decodeList fieldType cx input))),
+                      (Core.Name "set", (\input -> Eithers.map (\t -> Core.TypeSet t) (type_ cx input))),
+                      (Core.Name "union", (\input -> Eithers.map (\t -> Core.TypeUnion t) (Helpers.decodeList fieldType cx input))),
+                      (Core.Name "unit", (\input -> Eithers.map (\t -> Core.TypeUnit) (Helpers.decodeUnit cx input))),
+                      (Core.Name "variable", (\input -> Eithers.map (\t -> Core.TypeVariable t) (name cx input))),
+                      (Core.Name "void", (\input -> Eithers.map (\t -> Core.TypeVoid) (Helpers.decodeUnit cx input))),
+                      (Core.Name "wrap", (\input -> Eithers.map (\t -> Core.TypeWrap t) (type_ cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeApplicationTerm :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.TypeApplicationTerm
+typeApplicationTerm cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Eithers.bind (Helpers.requireField "type" type_ fieldMap cx) (\field_type -> Right (Core.TypeApplicationTerm {
+          Core.typeApplicationTermBody = field_body,
+          Core.typeApplicationTermType = field_type}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeLambda :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.TypeLambda
+typeLambda cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "parameter" name fieldMap cx) (\field_parameter -> Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Right (Core.TypeLambda {
+          Core.typeLambdaParameter = field_parameter,
+          Core.typeLambdaBody = field_body}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeScheme :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.TypeScheme
+typeScheme cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "variables" (Helpers.decodeList name) fieldMap cx) (\field_variables -> Eithers.bind (Helpers.requireField "type" type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "constraints" (Helpers.decodeMaybe (Helpers.decodeMap name typeVariableMetadata)) fieldMap cx) (\field_constraints -> Right (Core.TypeScheme {
+          Core.typeSchemeVariables = field_variables,
+          Core.typeSchemeType = field_type,
+          Core.typeSchemeConstraints = field_constraints})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeVariableMetadata :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.TypeVariableMetadata
+typeVariableMetadata cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "classes" (Helpers.decodeSet name) fieldMap cx) (\field_classes -> Right (Core.TypeVariableMetadata {
+          Core.typeVariableMetadataClasses = field_classes})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+wrappedTerm :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core.WrappedTerm
+wrappedTerm cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "typeName" name fieldMap cx) (\field_typeName -> Eithers.bind (Helpers.requireField "body" term fieldMap cx) (\field_body -> Right (Core.WrappedTerm {
+          Core.wrappedTermTypeName = field_typeName,
+          Core.wrappedTermBody = field_body}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Error/Checking.hs b/src/gen-main/haskell/Hydra/Decode/Error/Checking.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Decode/Error/Checking.hs
@@ -0,0 +1,163 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term decoders for hydra.error.checking
+
+module Hydra.Decode.Error.Checking where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Decode.Typing as Typing
+import qualified Hydra.Decode.Variants as Variants
+import qualified Hydra.Error.Checking as Checking
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Helpers as Helpers
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Strings as Strings
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+checkingError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.CheckingError
+checkingError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "incorrectUnification", (\input -> Eithers.map (\t -> Checking.CheckingErrorIncorrectUnification t) (incorrectUnificationError cx input))),
+                      (Core.Name "notAForallType", (\input -> Eithers.map (\t -> Checking.CheckingErrorNotAForallType t) (notAForallTypeError cx input))),
+                      (Core.Name "notAFunctionType", (\input -> Eithers.map (\t -> Checking.CheckingErrorNotAFunctionType t) (notAFunctionTypeError cx input))),
+                      (Core.Name "typeArityMismatch", (\input -> Eithers.map (\t -> Checking.CheckingErrorTypeArityMismatch t) (typeArityMismatchError cx input))),
+                      (Core.Name "typeMismatch", (\input -> Eithers.map (\t -> Checking.CheckingErrorTypeMismatch t) (typeMismatchError cx input))),
+                      (Core.Name "unboundTypeVariables", (\input -> Eithers.map (\t -> Checking.CheckingErrorUnboundTypeVariables t) (unboundTypeVariablesError cx input))),
+                      (Core.Name "unequalTypes", (\input -> Eithers.map (\t -> Checking.CheckingErrorUnequalTypes t) (unequalTypesError cx input))),
+                      (Core.Name "unsupportedTermVariant", (\input -> Eithers.map (\t -> Checking.CheckingErrorUnsupportedTermVariant t) (unsupportedTermVariantError cx input))),
+                      (Core.Name "untypedLambda", (\input -> Eithers.map (\t -> Checking.CheckingErrorUntypedLambda t) (untypedLambdaError cx input))),
+                      (Core.Name "untypedLetBinding", (\input -> Eithers.map (\t -> Checking.CheckingErrorUntypedLetBinding t) (untypedLetBindingError cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+incorrectUnificationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.IncorrectUnificationError
+incorrectUnificationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "substitution" Typing.typeSubst fieldMap cx) (\field_substitution -> Right (Checking.IncorrectUnificationError {
+          Checking.incorrectUnificationErrorSubstitution = field_substitution})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+notAForallTypeError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.NotAForallTypeError
+notAForallTypeError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "typeArguments" (Helpers.decodeList Core_.type_) fieldMap cx) (\field_typeArguments -> Right (Checking.NotAForallTypeError {
+          Checking.notAForallTypeErrorType = field_type,
+          Checking.notAForallTypeErrorTypeArguments = field_typeArguments}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+notAFunctionTypeError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.NotAFunctionTypeError
+notAFunctionTypeError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Right (Checking.NotAFunctionTypeError {
+          Checking.notAFunctionTypeErrorType = field_type})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeArityMismatchError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.TypeArityMismatchError
+typeArityMismatchError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "expectedArity" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_expectedArity -> Eithers.bind (Helpers.requireField "actualArity" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_actualArity -> Eithers.bind (Helpers.requireField "typeArguments" (Helpers.decodeList Core_.type_) fieldMap cx) (\field_typeArguments -> Right (Checking.TypeArityMismatchError {
+          Checking.typeArityMismatchErrorType = field_type,
+          Checking.typeArityMismatchErrorExpectedArity = field_expectedArity,
+          Checking.typeArityMismatchErrorActualArity = field_actualArity,
+          Checking.typeArityMismatchErrorTypeArguments = field_typeArguments}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeMismatchError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.TypeMismatchError
+typeMismatchError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "expectedType" Core_.type_ fieldMap cx) (\field_expectedType -> Eithers.bind (Helpers.requireField "actualType" Core_.type_ fieldMap cx) (\field_actualType -> Right (Checking.TypeMismatchError {
+          Checking.typeMismatchErrorExpectedType = field_expectedType,
+          Checking.typeMismatchErrorActualType = field_actualType}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unboundTypeVariablesError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.UnboundTypeVariablesError
+unboundTypeVariablesError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "variables" (Helpers.decodeSet Core_.name) fieldMap cx) (\field_variables -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Right (Checking.UnboundTypeVariablesError {
+          Checking.unboundTypeVariablesErrorVariables = field_variables,
+          Checking.unboundTypeVariablesErrorType = field_type}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unequalTypesError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.UnequalTypesError
+unequalTypesError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "types" (Helpers.decodeList Core_.type_) fieldMap cx) (\field_types -> Eithers.bind (Helpers.requireField "description" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_description -> Right (Checking.UnequalTypesError {
+          Checking.unequalTypesErrorTypes = field_types,
+          Checking.unequalTypesErrorDescription = field_description}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unsupportedTermVariantError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.UnsupportedTermVariantError
+unsupportedTermVariantError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "termVariant" Variants.termVariant fieldMap cx) (\field_termVariant -> Right (Checking.UnsupportedTermVariantError {
+          Checking.unsupportedTermVariantErrorTermVariant = field_termVariant})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+untypedLambdaError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.UntypedLambdaError
+untypedLambdaError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Right (Checking.UntypedLambdaError {
+        }))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+untypedLetBindingError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Checking.UntypedLetBindingError
+untypedLetBindingError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "binding" Core_.binding fieldMap cx) (\field_binding -> Right (Checking.UntypedLetBindingError {
+          Checking.untypedLetBindingErrorBinding = field_binding})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Error/Core.hs b/src/gen-main/haskell/Hydra/Decode/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Decode/Error/Core.hs
@@ -0,0 +1,475 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term decoders for hydra.error.core
+
+module Hydra.Decode.Error.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Decode.Paths as Paths
+import qualified Hydra.Decode.Variants as Variants
+import qualified Hydra.Error.Core as Core__
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Helpers as Helpers
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Strings as Strings
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+constantConditionError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.ConstantConditionError
+constantConditionError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "value" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralBoolean v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected boolean literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_value -> Right (Core__.ConstantConditionError {
+          Core__.constantConditionErrorLocation = field_location,
+          Core__.constantConditionErrorValue = field_value}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+duplicateBindingError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.DuplicateBindingError
+duplicateBindingError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.DuplicateBindingError {
+          Core__.duplicateBindingErrorLocation = field_location,
+          Core__.duplicateBindingErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+duplicateFieldError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.DuplicateFieldError
+duplicateFieldError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.DuplicateFieldError {
+          Core__.duplicateFieldErrorLocation = field_location,
+          Core__.duplicateFieldErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+duplicateRecordTypeFieldNamesError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.DuplicateRecordTypeFieldNamesError
+duplicateRecordTypeFieldNamesError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.DuplicateRecordTypeFieldNamesError {
+          Core__.duplicateRecordTypeFieldNamesErrorLocation = field_location,
+          Core__.duplicateRecordTypeFieldNamesErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+duplicateUnionTypeFieldNamesError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.DuplicateUnionTypeFieldNamesError
+duplicateUnionTypeFieldNamesError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.DuplicateUnionTypeFieldNamesError {
+          Core__.duplicateUnionTypeFieldNamesErrorLocation = field_location,
+          Core__.duplicateUnionTypeFieldNamesErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+emptyCaseStatementError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.EmptyCaseStatementError
+emptyCaseStatementError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "typeName" Core_.name fieldMap cx) (\field_typeName -> Right (Core__.EmptyCaseStatementError {
+          Core__.emptyCaseStatementErrorLocation = field_location,
+          Core__.emptyCaseStatementErrorTypeName = field_typeName}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+emptyLetBindingsError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.EmptyLetBindingsError
+emptyLetBindingsError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.EmptyLetBindingsError {
+          Core__.emptyLetBindingsErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+emptyRecordTypeError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.EmptyRecordTypeError
+emptyRecordTypeError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.EmptyRecordTypeError {
+          Core__.emptyRecordTypeErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+emptyTermAnnotationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.EmptyTermAnnotationError
+emptyTermAnnotationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.EmptyTermAnnotationError {
+          Core__.emptyTermAnnotationErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+emptyTypeAnnotationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.EmptyTypeAnnotationError
+emptyTypeAnnotationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.EmptyTypeAnnotationError {
+          Core__.emptyTypeAnnotationErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+emptyTypeNameInTermError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.EmptyTypeNameInTermError
+emptyTypeNameInTermError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.EmptyTypeNameInTermError {
+          Core__.emptyTypeNameInTermErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+emptyUnionTypeError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.EmptyUnionTypeError
+emptyUnionTypeError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.EmptyUnionTypeError {
+          Core__.emptyUnionTypeErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+invalidForallParameterNameError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.InvalidForallParameterNameError
+invalidForallParameterNameError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.InvalidForallParameterNameError {
+          Core__.invalidForallParameterNameErrorLocation = field_location,
+          Core__.invalidForallParameterNameErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+invalidLambdaParameterNameError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.InvalidLambdaParameterNameError
+invalidLambdaParameterNameError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.InvalidLambdaParameterNameError {
+          Core__.invalidLambdaParameterNameErrorLocation = field_location,
+          Core__.invalidLambdaParameterNameErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+invalidLetBindingNameError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.InvalidLetBindingNameError
+invalidLetBindingNameError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.InvalidLetBindingNameError {
+          Core__.invalidLetBindingNameErrorLocation = field_location,
+          Core__.invalidLetBindingNameErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+invalidTermError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.InvalidTermError
+invalidTermError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "constantCondition", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorConstantCondition t) (constantConditionError cx input))),
+                      (Core.Name "duplicateBinding", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorDuplicateBinding t) (duplicateBindingError cx input))),
+                      (Core.Name "duplicateField", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorDuplicateField t) (duplicateFieldError cx input))),
+                      (Core.Name "emptyCaseStatement", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorEmptyCaseStatement t) (emptyCaseStatementError cx input))),
+                      (Core.Name "emptyLetBindings", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorEmptyLetBindings t) (emptyLetBindingsError cx input))),
+                      (Core.Name "emptyTermAnnotation", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorEmptyTermAnnotation t) (emptyTermAnnotationError cx input))),
+                      (Core.Name "emptyTypeNameInTerm", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorEmptyTypeNameInTerm t) (emptyTypeNameInTermError cx input))),
+                      (Core.Name "invalidLambdaParameterName", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorInvalidLambdaParameterName t) (invalidLambdaParameterNameError cx input))),
+                      (Core.Name "invalidLetBindingName", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorInvalidLetBindingName t) (invalidLetBindingNameError cx input))),
+                      (Core.Name "invalidTypeLambdaParameterName", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorInvalidTypeLambdaParameterName t) (invalidTypeLambdaParameterNameError cx input))),
+                      (Core.Name "nestedTermAnnotation", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorNestedTermAnnotation t) (nestedTermAnnotationError cx input))),
+                      (Core.Name "redundantWrapUnwrap", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorRedundantWrapUnwrap t) (redundantWrapUnwrapError cx input))),
+                      (Core.Name "selfApplication", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorSelfApplication t) (selfApplicationError cx input))),
+                      (Core.Name "termVariableShadowing", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorTermVariableShadowing t) (termVariableShadowingError cx input))),
+                      (Core.Name "typeVariableShadowingInTypeLambda", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorTypeVariableShadowingInTypeLambda t) (typeVariableShadowingInTypeLambdaError cx input))),
+                      (Core.Name "undefinedTermVariable", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorUndefinedTermVariable t) (undefinedTermVariableError cx input))),
+                      (Core.Name "undefinedTypeVariableInBindingType", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorUndefinedTypeVariableInBindingType t) (undefinedTypeVariableInBindingTypeError cx input))),
+                      (Core.Name "undefinedTypeVariableInLambdaDomain", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorUndefinedTypeVariableInLambdaDomain t) (undefinedTypeVariableInLambdaDomainError cx input))),
+                      (Core.Name "undefinedTypeVariableInTypeApplication", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorUndefinedTypeVariableInTypeApplication t) (undefinedTypeVariableInTypeApplicationError cx input))),
+                      (Core.Name "unknownPrimitiveName", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorUnknownPrimitiveName t) (unknownPrimitiveNameError cx input))),
+                      (Core.Name "unnecessaryIdentityApplication", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorUnnecessaryIdentityApplication t) (unnecessaryIdentityApplicationError cx input))),
+                      (Core.Name "untypedTermVariable", (\input -> Eithers.map (\t -> Core__.InvalidTermErrorUntypedTermVariable t) (untypedTermVariableError cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+invalidTypeError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.InvalidTypeError
+invalidTypeError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "duplicateRecordTypeFieldNames", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorDuplicateRecordTypeFieldNames t) (duplicateRecordTypeFieldNamesError cx input))),
+                      (Core.Name "duplicateUnionTypeFieldNames", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorDuplicateUnionTypeFieldNames t) (duplicateUnionTypeFieldNamesError cx input))),
+                      (Core.Name "emptyRecordType", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorEmptyRecordType t) (emptyRecordTypeError cx input))),
+                      (Core.Name "emptyTypeAnnotation", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorEmptyTypeAnnotation t) (emptyTypeAnnotationError cx input))),
+                      (Core.Name "emptyUnionType", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorEmptyUnionType t) (emptyUnionTypeError cx input))),
+                      (Core.Name "invalidForallParameterName", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorInvalidForallParameterName t) (invalidForallParameterNameError cx input))),
+                      (Core.Name "invalidTypeSchemeVariableName", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorInvalidTypeSchemeVariableName t) (invalidTypeSchemeVariableNameError cx input))),
+                      (Core.Name "nestedTypeAnnotation", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorNestedTypeAnnotation t) (nestedTypeAnnotationError cx input))),
+                      (Core.Name "nonComparableMapKeyType", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorNonComparableMapKeyType t) (nonComparableMapKeyTypeError cx input))),
+                      (Core.Name "nonComparableSetElementType", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorNonComparableSetElementType t) (nonComparableSetElementTypeError cx input))),
+                      (Core.Name "singleVariantUnion", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorSingleVariantUnion t) (singleVariantUnionError cx input))),
+                      (Core.Name "typeVariableShadowingInForall", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorTypeVariableShadowingInForall t) (typeVariableShadowingInForallError cx input))),
+                      (Core.Name "undefinedTypeVariable", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorUndefinedTypeVariable t) (undefinedTypeVariableError cx input))),
+                      (Core.Name "voidInNonBottomPosition", (\input -> Eithers.map (\t -> Core__.InvalidTypeErrorVoidInNonBottomPosition t) (voidInNonBottomPositionError cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+invalidTypeLambdaParameterNameError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.InvalidTypeLambdaParameterNameError
+invalidTypeLambdaParameterNameError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.InvalidTypeLambdaParameterNameError {
+          Core__.invalidTypeLambdaParameterNameErrorLocation = field_location,
+          Core__.invalidTypeLambdaParameterNameErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+invalidTypeSchemeVariableNameError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.InvalidTypeSchemeVariableNameError
+invalidTypeSchemeVariableNameError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.InvalidTypeSchemeVariableNameError {
+          Core__.invalidTypeSchemeVariableNameErrorLocation = field_location,
+          Core__.invalidTypeSchemeVariableNameErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+nestedTermAnnotationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.NestedTermAnnotationError
+nestedTermAnnotationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.NestedTermAnnotationError {
+          Core__.nestedTermAnnotationErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+nestedTypeAnnotationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.NestedTypeAnnotationError
+nestedTypeAnnotationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.NestedTypeAnnotationError {
+          Core__.nestedTypeAnnotationErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+nonComparableMapKeyTypeError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.NonComparableMapKeyTypeError
+nonComparableMapKeyTypeError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "keyType" Core_.type_ fieldMap cx) (\field_keyType -> Right (Core__.NonComparableMapKeyTypeError {
+          Core__.nonComparableMapKeyTypeErrorLocation = field_location,
+          Core__.nonComparableMapKeyTypeErrorKeyType = field_keyType}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+nonComparableSetElementTypeError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.NonComparableSetElementTypeError
+nonComparableSetElementTypeError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "elementType" Core_.type_ fieldMap cx) (\field_elementType -> Right (Core__.NonComparableSetElementTypeError {
+          Core__.nonComparableSetElementTypeErrorLocation = field_location,
+          Core__.nonComparableSetElementTypeErrorElementType = field_elementType}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+redundantWrapUnwrapError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.RedundantWrapUnwrapError
+redundantWrapUnwrapError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "typeName" Core_.name fieldMap cx) (\field_typeName -> Right (Core__.RedundantWrapUnwrapError {
+          Core__.redundantWrapUnwrapErrorLocation = field_location,
+          Core__.redundantWrapUnwrapErrorTypeName = field_typeName}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+selfApplicationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.SelfApplicationError
+selfApplicationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.SelfApplicationError {
+          Core__.selfApplicationErrorLocation = field_location,
+          Core__.selfApplicationErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+singleVariantUnionError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.SingleVariantUnionError
+singleVariantUnionError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "fieldName" Core_.name fieldMap cx) (\field_fieldName -> Right (Core__.SingleVariantUnionError {
+          Core__.singleVariantUnionErrorLocation = field_location,
+          Core__.singleVariantUnionErrorFieldName = field_fieldName}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+termVariableShadowingError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.TermVariableShadowingError
+termVariableShadowingError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.TermVariableShadowingError {
+          Core__.termVariableShadowingErrorLocation = field_location,
+          Core__.termVariableShadowingErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeVariableShadowingInForallError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.TypeVariableShadowingInForallError
+typeVariableShadowingInForallError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.TypeVariableShadowingInForallError {
+          Core__.typeVariableShadowingInForallErrorLocation = field_location,
+          Core__.typeVariableShadowingInForallErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeVariableShadowingInTypeLambdaError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.TypeVariableShadowingInTypeLambdaError
+typeVariableShadowingInTypeLambdaError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.TypeVariableShadowingInTypeLambdaError {
+          Core__.typeVariableShadowingInTypeLambdaErrorLocation = field_location,
+          Core__.typeVariableShadowingInTypeLambdaErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+undefinedFieldError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UndefinedFieldError
+undefinedFieldError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "fieldName" Core_.name fieldMap cx) (\field_fieldName -> Eithers.bind (Helpers.requireField "typeName" Core_.name fieldMap cx) (\field_typeName -> Right (Core__.UndefinedFieldError {
+          Core__.undefinedFieldErrorFieldName = field_fieldName,
+          Core__.undefinedFieldErrorTypeName = field_typeName}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+undefinedTermVariableError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UndefinedTermVariableError
+undefinedTermVariableError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.UndefinedTermVariableError {
+          Core__.undefinedTermVariableErrorLocation = field_location,
+          Core__.undefinedTermVariableErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+undefinedTypeVariableError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UndefinedTypeVariableError
+undefinedTypeVariableError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.UndefinedTypeVariableError {
+          Core__.undefinedTypeVariableErrorLocation = field_location,
+          Core__.undefinedTypeVariableErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+undefinedTypeVariableInBindingTypeError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UndefinedTypeVariableInBindingTypeError
+undefinedTypeVariableInBindingTypeError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.UndefinedTypeVariableInBindingTypeError {
+          Core__.undefinedTypeVariableInBindingTypeErrorLocation = field_location,
+          Core__.undefinedTypeVariableInBindingTypeErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+undefinedTypeVariableInLambdaDomainError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UndefinedTypeVariableInLambdaDomainError
+undefinedTypeVariableInLambdaDomainError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.UndefinedTypeVariableInLambdaDomainError {
+          Core__.undefinedTypeVariableInLambdaDomainErrorLocation = field_location,
+          Core__.undefinedTypeVariableInLambdaDomainErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+undefinedTypeVariableInTypeApplicationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UndefinedTypeVariableInTypeApplicationError
+undefinedTypeVariableInTypeApplicationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.UndefinedTypeVariableInTypeApplicationError {
+          Core__.undefinedTypeVariableInTypeApplicationErrorLocation = field_location,
+          Core__.undefinedTypeVariableInTypeApplicationErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unexpectedTermVariantError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UnexpectedTermVariantError
+unexpectedTermVariantError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "expectedVariant" Variants.termVariant fieldMap cx) (\field_expectedVariant -> Eithers.bind (Helpers.requireField "actualTerm" Core_.term fieldMap cx) (\field_actualTerm -> Right (Core__.UnexpectedTermVariantError {
+          Core__.unexpectedTermVariantErrorExpectedVariant = field_expectedVariant,
+          Core__.unexpectedTermVariantErrorActualTerm = field_actualTerm}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unexpectedTypeVariantError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UnexpectedTypeVariantError
+unexpectedTypeVariantError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "expectedVariant" Variants.typeVariant fieldMap cx) (\field_expectedVariant -> Eithers.bind (Helpers.requireField "actualType" Core_.type_ fieldMap cx) (\field_actualType -> Right (Core__.UnexpectedTypeVariantError {
+          Core__.unexpectedTypeVariantErrorExpectedVariant = field_expectedVariant,
+          Core__.unexpectedTypeVariantErrorActualType = field_actualType}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unknownPrimitiveNameError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UnknownPrimitiveNameError
+unknownPrimitiveNameError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.UnknownPrimitiveNameError {
+          Core__.unknownPrimitiveNameErrorLocation = field_location,
+          Core__.unknownPrimitiveNameErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unnecessaryIdentityApplicationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UnnecessaryIdentityApplicationError
+unnecessaryIdentityApplicationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.UnnecessaryIdentityApplicationError {
+          Core__.unnecessaryIdentityApplicationErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+untypedTermVariableError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.UntypedTermVariableError
+untypedTermVariableError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Right (Core__.UntypedTermVariableError {
+          Core__.untypedTermVariableErrorLocation = field_location,
+          Core__.untypedTermVariableErrorName = field_name}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+voidInNonBottomPositionError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Core__.VoidInNonBottomPositionError
+voidInNonBottomPositionError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "location" Paths.subtermPath fieldMap cx) (\field_location -> Right (Core__.VoidInNonBottomPositionError {
+          Core__.voidInNonBottomPositionErrorLocation = field_location})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Errors.hs b/src/gen-main/haskell/Hydra/Decode/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Decode/Errors.hs
@@ -0,0 +1,85 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term decoders for hydra.errors
+
+module Hydra.Decode.Errors where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Decode.Error.Checking as Checking
+import qualified Hydra.Decode.Error.Core as Core__
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Helpers as Helpers
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Strings as Strings
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+decodingError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Errors.DecodingError
+decodingError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Errors.DecodingError b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+error :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Errors.Error
+error cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "checking", (\input -> Eithers.map (\t -> Errors.ErrorChecking t) (Checking.checkingError cx input))),
+                      (Core.Name "decoding", (\input -> Eithers.map (\t -> Errors.ErrorDecoding t) (decodingError cx input))),
+                      (Core.Name "duplicateBinding", (\input -> Eithers.map (\t -> Errors.ErrorDuplicateBinding t) (Core__.duplicateBindingError cx input))),
+                      (Core.Name "duplicateField", (\input -> Eithers.map (\t -> Errors.ErrorDuplicateField t) (Core__.duplicateFieldError cx input))),
+                      (Core.Name "other", (\input -> Eithers.map (\t -> Errors.ErrorOther t) (otherError cx input))),
+                      (Core.Name "undefinedField", (\input -> Eithers.map (\t -> Errors.ErrorUndefinedField t) (Core__.undefinedFieldError cx input))),
+                      (Core.Name "undefinedTermVariable", (\input -> Eithers.map (\t -> Errors.ErrorUndefinedTermVariable t) (Core__.undefinedTermVariableError cx input))),
+                      (Core.Name "untypedTermVariable", (\input -> Eithers.map (\t -> Errors.ErrorUntypedTermVariable t) (Core__.untypedTermVariableError cx input))),
+                      (Core.Name "unexpectedTermVariant", (\input -> Eithers.map (\t -> Errors.ErrorUnexpectedTermVariant t) (Core__.unexpectedTermVariantError cx input))),
+                      (Core.Name "unexpectedTypeVariant", (\input -> Eithers.map (\t -> Errors.ErrorUnexpectedTypeVariant t) (Core__.unexpectedTypeVariantError cx input))),
+                      (Core.Name "unification", (\input -> Eithers.map (\t -> Errors.ErrorUnification t) (unificationError cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+otherError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Errors.OtherError
+otherError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Errors.OtherError b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unificationError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Errors.UnificationError
+unificationError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "leftType" Core_.type_ fieldMap cx) (\field_leftType -> Eithers.bind (Helpers.requireField "rightType" Core_.type_ fieldMap cx) (\field_rightType -> Eithers.bind (Helpers.requireField "message" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_message -> Right (Errors.UnificationError {
+          Errors.unificationErrorLeftType = field_leftType,
+          Errors.unificationErrorRightType = field_rightType,
+          Errors.unificationErrorMessage = field_message})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Grammar.hs b/src/gen-main/haskell/Hydra/Decode/Grammar.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Decode/Grammar.hs
+++ /dev/null
@@ -1,107 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term decoders for hydra.grammar
-
-module Hydra.Decode.Grammar where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Extract.Helpers as Helpers
-import qualified Hydra.Grammar as Grammar
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-constant :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Grammar.Constant)
-constant cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Grammar.Constant b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.grammar.Constant"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-grammar :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Grammar.Grammar)
-grammar cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Grammar.Grammar b) (Helpers.decodeList production cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.grammar.Grammar"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-label :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Grammar.Label)
-label cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Grammar.Label b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.grammar.Label"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-labeledPattern :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Grammar.LabeledPattern)
-labeledPattern cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "label" label fieldMap cx) (\field_label -> Eithers.bind (Helpers.requireField "pattern" pattern fieldMap cx) (\field_pattern -> Right (Grammar.LabeledPattern {
-      Grammar.labeledPatternLabel = field_label,
-      Grammar.labeledPatternPattern = field_pattern}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.grammar.LabeledPattern"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-pattern :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Grammar.Pattern)
-pattern cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "alternatives", (\input -> Eithers.map (\t -> Grammar.PatternAlternatives t) (Helpers.decodeList pattern cx input))),
-                (Core.Name "constant", (\input -> Eithers.map (\t -> Grammar.PatternConstant t) (constant cx input))),
-                (Core.Name "ignored", (\input -> Eithers.map (\t -> Grammar.PatternIgnored t) (pattern cx input))),
-                (Core.Name "labeled", (\input -> Eithers.map (\t -> Grammar.PatternLabeled t) (labeledPattern cx input))),
-                (Core.Name "nil", (\input -> Eithers.map (\t -> Grammar.PatternNil) (Helpers.decodeUnit cx input))),
-                (Core.Name "nonterminal", (\input -> Eithers.map (\t -> Grammar.PatternNonterminal t) (symbol cx input))),
-                (Core.Name "option", (\input -> Eithers.map (\t -> Grammar.PatternOption t) (pattern cx input))),
-                (Core.Name "plus", (\input -> Eithers.map (\t -> Grammar.PatternPlus t) (pattern cx input))),
-                (Core.Name "regex", (\input -> Eithers.map (\t -> Grammar.PatternRegex t) (regex cx input))),
-                (Core.Name "sequence", (\input -> Eithers.map (\t -> Grammar.PatternSequence t) (Helpers.decodeList pattern cx input))),
-                (Core.Name "star", (\input -> Eithers.map (\t -> Grammar.PatternStar t) (pattern cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.grammar.Pattern"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-production :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Grammar.Production)
-production cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "symbol" symbol fieldMap cx) (\field_symbol -> Eithers.bind (Helpers.requireField "pattern" pattern fieldMap cx) (\field_pattern -> Right (Grammar.Production {
-      Grammar.productionSymbol = field_symbol,
-      Grammar.productionPattern = field_pattern}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.grammar.Production"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-regex :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Grammar.Regex)
-regex cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Grammar.Regex b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.grammar.Regex"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-symbol :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Grammar.Symbol)
-symbol cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Grammar.Symbol b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.grammar.Symbol"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
diff --git a/src/gen-main/haskell/Hydra/Decode/Json.hs b/src/gen-main/haskell/Hydra/Decode/Json.hs
--- a/src/gen-main/haskell/Hydra/Decode/Json.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Json.hs
@@ -13,7 +13,7 @@
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
+import qualified Hydra.Errors as Error
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -21,8 +21,8 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-value :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Model.Value)
-value cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
+value :: (Graph.Graph -> Core.Term -> Either Error.DecodingError Model.Value)
+value cx raw = (Eithers.either (\err -> Left (Error.DecodingError err)) (\stripped -> (\x -> case x of
   Core.TermUnion v1 ->  
     let tname = (Core.injectionTypeName v1) 
         field = (Core.injectionField v1)
@@ -30,32 +30,32 @@
         fterm = (Core.fieldTerm field)
         variantMap = (Maps.fromList [
                 (Core.Name "array", (\input -> Eithers.map (\t -> Model.ValueArray t) (Helpers.decodeList value cx input))),
-                (Core.Name "boolean", (\input -> Eithers.map (\t -> Model.ValueBoolean t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
+                (Core.Name "boolean", (\input -> Eithers.map (\t -> Model.ValueBoolean t) (Eithers.either (\err -> Left (Error.DecodingError err)) (\stripped -> (\x -> case x of
                   Core.TermLiteral v2 -> ((\x -> case x of
                     Core.LiteralBoolean v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected boolean literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
+                    _ -> (Left (Error.DecodingError "expected boolean literal"))) v2)
+                  _ -> (Left (Error.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
                 (Core.Name "null", (\input -> Eithers.map (\t -> Model.ValueNull) (Helpers.decodeUnit cx input))),
-                (Core.Name "number", (\input -> Eithers.map (\t -> Model.ValueNumber t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
+                (Core.Name "number", (\input -> Eithers.map (\t -> Model.ValueNumber t) (Eithers.either (\err -> Left (Error.DecodingError err)) (\stripped -> (\x -> case x of
                   Core.TermLiteral v2 -> ((\x -> case x of
                     Core.LiteralFloat v3 -> ((\x -> case x of
                       Core.FloatValueBigfloat v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected bigfloat value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected bigfloat literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "object", (\input -> Eithers.map (\t -> Model.ValueObject t) (Helpers.decodeMap (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
+                      _ -> (Left (Error.DecodingError "expected bigfloat value"))) v3)
+                    _ -> (Left (Error.DecodingError "expected bigfloat literal"))) v2)
+                  _ -> (Left (Error.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
+                (Core.Name "object", (\input -> Eithers.map (\t -> Model.ValueObject t) (Helpers.decodeMap (\cx -> \raw -> Eithers.either (\err -> Left (Error.DecodingError err)) (\stripped -> (\x -> case x of
                   Core.TermLiteral v2 -> ((\x -> case x of
                     Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) value cx input))),
-                (Core.Name "string", (\input -> Eithers.map (\t -> Model.ValueString t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
+                    _ -> (Left (Error.DecodingError "expected string literal"))) v2)
+                  _ -> (Left (Error.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) value cx input))),
+                (Core.Name "string", (\input -> Eithers.map (\t -> Model.ValueString t) (Eithers.either (\err -> Left (Error.DecodingError err)) (\stripped -> (\x -> case x of
                   Core.TermLiteral v2 -> ((\x -> case x of
                     Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input))))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
+                    _ -> (Left (Error.DecodingError "expected string literal"))) v2)
+                  _ -> (Left (Error.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input))))])
+    in (Maybes.maybe (Left (Error.DecodingError (Strings.cat [
       "no such field ",
       (Core.unName fname),
       " in union type ",
       (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.json.model.Value"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+  _ -> (Left (Error.DecodingError "expected union of type hydra.json.model.Value"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
diff --git a/src/gen-main/haskell/Hydra/Decode/Json/Model.hs b/src/gen-main/haskell/Hydra/Decode/Json/Model.hs
--- a/src/gen-main/haskell/Hydra/Decode/Json/Model.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Json/Model.hs
@@ -5,6 +5,7 @@
 module Hydra.Decode.Json.Model where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Json.Model as Model
@@ -13,7 +14,6 @@
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -21,41 +21,41 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-value :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Model.Value)
-value cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "array", (\input -> Eithers.map (\t -> Model.ValueArray t) (Helpers.decodeList value cx input))),
-                (Core.Name "boolean", (\input -> Eithers.map (\t -> Model.ValueBoolean t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralBoolean v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected boolean literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "null", (\input -> Eithers.map (\t -> Model.ValueNull) (Helpers.decodeUnit cx input))),
-                (Core.Name "number", (\input -> Eithers.map (\t -> Model.ValueNumber t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralFloat v3 -> ((\x -> case x of
-                      Core.FloatValueBigfloat v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected bigfloat value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected bigfloat literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "object", (\input -> Eithers.map (\t -> Model.ValueObject t) (Helpers.decodeMap (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) value cx input))),
-                (Core.Name "string", (\input -> Eithers.map (\t -> Model.ValueString t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input))))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.json.model.Value"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+value :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Model.Value
+value cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "array", (\input -> Eithers.map (\t -> Model.ValueArray t) (Helpers.decodeList value cx input))),
+                      (Core.Name "boolean", (\input -> Eithers.map (\t -> Model.ValueBoolean t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralBoolean v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected boolean literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "null", (\input -> Eithers.map (\t -> Model.ValueNull) (Helpers.decodeUnit cx input))),
+                      (Core.Name "number", (\input -> Eithers.map (\t -> Model.ValueNumber t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralFloat v2 -> case v2 of
+                            Core.FloatValueBigfloat v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected bigfloat value")
+                          _ -> Left (Errors.DecodingError "expected bigfloat literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "object", (\input -> Eithers.map (\t -> Model.ValueObject t) (Helpers.decodeMap (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralString v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected string literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) value cx input))),
+                      (Core.Name "string", (\input -> Eithers.map (\t -> Model.ValueString t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralString v2 -> Right v2
+                          _ -> Left (Errors.DecodingError "expected string literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input))))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Module.hs b/src/gen-main/haskell/Hydra/Decode/Module.hs
--- a/src/gen-main/haskell/Hydra/Decode/Module.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Module.hs
@@ -6,6 +6,7 @@
 
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
@@ -14,7 +15,6 @@
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Module as Module
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -22,94 +22,101 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-definition :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Module.Definition)
-definition cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "term", (\input -> Eithers.map (\t -> Module.DefinitionTerm t) (termDefinition cx input))),
-                (Core.Name "type", (\input -> Eithers.map (\t -> Module.DefinitionType t) (typeDefinition cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.module.Definition"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+definition :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Module.Definition
+definition cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "term", (\input -> Eithers.map (\t -> Module.DefinitionTerm t) (termDefinition cx input))),
+                      (Core.Name "type", (\input -> Eithers.map (\t -> Module.DefinitionType t) (typeDefinition cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-fileExtension :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Module.FileExtension)
-fileExtension cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Module.FileExtension b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.module.FileExtension"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+fileExtension :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Module.FileExtension
+fileExtension cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Module.FileExtension b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-module_ :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Module.Module)
-module_ cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "namespace" namespace fieldMap cx) (\field_namespace -> Eithers.bind (Helpers.requireField "elements" (Helpers.decodeList Core_.binding) fieldMap cx) (\field_elements -> Eithers.bind (Helpers.requireField "termDependencies" (Helpers.decodeList namespace) fieldMap cx) (\field_termDependencies -> Eithers.bind (Helpers.requireField "typeDependencies" (Helpers.decodeList namespace) fieldMap cx) (\field_typeDependencies -> Eithers.bind (Helpers.requireField "description" (Helpers.decodeMaybe (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_description -> Right (Module.Module {
-      Module.moduleNamespace = field_namespace,
-      Module.moduleElements = field_elements,
-      Module.moduleTermDependencies = field_termDependencies,
-      Module.moduleTypeDependencies = field_typeDependencies,
-      Module.moduleDescription = field_description})))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.module.Module"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+module_ :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Module.Module
+module_ cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "namespace" namespace fieldMap cx) (\field_namespace -> Eithers.bind (Helpers.requireField "definitions" (Helpers.decodeList definition) fieldMap cx) (\field_definitions -> Eithers.bind (Helpers.requireField "termDependencies" (Helpers.decodeList namespace) fieldMap cx) (\field_termDependencies -> Eithers.bind (Helpers.requireField "typeDependencies" (Helpers.decodeList namespace) fieldMap cx) (\field_typeDependencies -> Eithers.bind (Helpers.requireField "description" (Helpers.decodeMaybe (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_description -> Right (Module.Module {
+          Module.moduleNamespace = field_namespace,
+          Module.moduleDefinitions = field_definitions,
+          Module.moduleTermDependencies = field_termDependencies,
+          Module.moduleTypeDependencies = field_typeDependencies,
+          Module.moduleDescription = field_description})))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-namespace :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Module.Namespace)
-namespace cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Module.Namespace b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.module.Namespace"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+namespace :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Module.Namespace
+namespace cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Module.Namespace b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-namespaces :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Module.Namespaces t0))
-namespaces n cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "focus" (Helpers.decodePair namespace n) fieldMap cx) (\field_focus -> Eithers.bind (Helpers.requireField "mapping" (Helpers.decodeMap namespace n) fieldMap cx) (\field_mapping -> Right (Module.Namespaces {
-      Module.namespacesFocus = field_focus,
-      Module.namespacesMapping = field_mapping}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.module.Namespaces"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+namespaces :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Module.Namespaces t0)
+namespaces n cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "focus" (Helpers.decodePair namespace n) fieldMap cx) (\field_focus -> Eithers.bind (Helpers.requireField "mapping" (Helpers.decodeMap namespace n) fieldMap cx) (\field_mapping -> Right (Module.Namespaces {
+          Module.namespacesFocus = field_focus,
+          Module.namespacesMapping = field_mapping}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-qualifiedName :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Module.QualifiedName)
-qualifiedName cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "namespace" (Helpers.decodeMaybe namespace) fieldMap cx) (\field_namespace -> Eithers.bind (Helpers.requireField "local" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_local -> Right (Module.QualifiedName {
-      Module.qualifiedNameNamespace = field_namespace,
-      Module.qualifiedNameLocal = field_local}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.module.QualifiedName"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+qualifiedName :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Module.QualifiedName
+qualifiedName cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "namespace" (Helpers.decodeMaybe namespace) fieldMap cx) (\field_namespace -> Eithers.bind (Helpers.requireField "local" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_local -> Right (Module.QualifiedName {
+          Module.qualifiedNameNamespace = field_namespace,
+          Module.qualifiedNameLocal = field_local}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-termDefinition :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Module.TermDefinition)
-termDefinition cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "type" Core_.typeScheme fieldMap cx) (\field_type -> Right (Module.TermDefinition {
-      Module.termDefinitionName = field_name,
-      Module.termDefinitionTerm = field_term,
-      Module.termDefinitionType = field_type})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.module.TermDefinition"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+termDefinition :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Module.TermDefinition
+termDefinition cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "type" (Helpers.decodeMaybe Core_.typeScheme) fieldMap cx) (\field_type -> Right (Module.TermDefinition {
+          Module.termDefinitionName = field_name,
+          Module.termDefinitionTerm = field_term,
+          Module.termDefinitionType = field_type})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-typeDefinition :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Module.TypeDefinition)
-typeDefinition cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Right (Module.TypeDefinition {
-      Module.typeDefinitionName = field_name,
-      Module.typeDefinitionType = field_type}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.module.TypeDefinition"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+typeDefinition :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Module.TypeDefinition
+typeDefinition cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Right (Module.TypeDefinition {
+          Module.typeDefinitionName = field_name,
+          Module.typeDefinitionType = field_type}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Parsing.hs b/src/gen-main/haskell/Hydra/Decode/Parsing.hs
--- a/src/gen-main/haskell/Hydra/Decode/Parsing.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Parsing.hs
@@ -5,6 +5,7 @@
 module Hydra.Decode.Parsing where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
@@ -13,7 +14,6 @@
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Parsing as Parsing
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -21,49 +21,51 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-parseError :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Parsing.ParseError)
-parseError cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "message" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_message -> Eithers.bind (Helpers.requireField "remainder" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_remainder -> Right (Parsing.ParseError {
-      Parsing.parseErrorMessage = field_message,
-      Parsing.parseErrorRemainder = field_remainder}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.parsing.ParseError"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+parseError :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Parsing.ParseError
+parseError cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "message" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_message -> Eithers.bind (Helpers.requireField "remainder" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_remainder -> Right (Parsing.ParseError {
+          Parsing.parseErrorMessage = field_message,
+          Parsing.parseErrorRemainder = field_remainder}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-parseResult :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Parsing.ParseResult t0))
-parseResult a cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "success", (\input -> Eithers.map (\t -> Parsing.ParseResultSuccess t) (parseSuccess a cx input))),
-                (Core.Name "failure", (\input -> Eithers.map (\t -> Parsing.ParseResultFailure t) (parseError cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.parsing.ParseResult"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+parseResult :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Parsing.ParseResult t0)
+parseResult a cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "success", (\input -> Eithers.map (\t -> Parsing.ParseResultSuccess t) (parseSuccess a cx input))),
+                      (Core.Name "failure", (\input -> Eithers.map (\t -> Parsing.ParseResultFailure t) (parseError cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-parseSuccess :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Parsing.ParseSuccess t0))
-parseSuccess a cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "value" a fieldMap cx) (\field_value -> Eithers.bind (Helpers.requireField "remainder" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_remainder -> Right (Parsing.ParseSuccess {
-      Parsing.parseSuccessValue = field_value,
-      Parsing.parseSuccessRemainder = field_remainder}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.parsing.ParseSuccess"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+parseSuccess :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Parsing.ParseSuccess t0)
+parseSuccess a cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "value" a fieldMap cx) (\field_value -> Eithers.bind (Helpers.requireField "remainder" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_remainder -> Right (Parsing.ParseSuccess {
+          Parsing.parseSuccessValue = field_value,
+          Parsing.parseSuccessRemainder = field_remainder}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Paths.hs b/src/gen-main/haskell/Hydra/Decode/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Decode/Paths.hs
@@ -0,0 +1,213 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term decoders for hydra.paths
+
+module Hydra.Decode.Paths where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Helpers as Helpers
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Paths as Paths
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+subtermEdge :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtermEdge
+subtermEdge cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "source" subtermNode fieldMap cx) (\field_source -> Eithers.bind (Helpers.requireField "path" subtermPath fieldMap cx) (\field_path -> Eithers.bind (Helpers.requireField "target" subtermNode fieldMap cx) (\field_target -> Right (Paths.SubtermEdge {
+          Paths.subtermEdgeSource = field_source,
+          Paths.subtermEdgePath = field_path,
+          Paths.subtermEdgeTarget = field_target})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtermGraph :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtermGraph
+subtermGraph cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "nodes" (Helpers.decodeList subtermNode) fieldMap cx) (\field_nodes -> Eithers.bind (Helpers.requireField "edges" (Helpers.decodeList subtermEdge) fieldMap cx) (\field_edges -> Right (Paths.SubtermGraph {
+          Paths.subtermGraphNodes = field_nodes,
+          Paths.subtermGraphEdges = field_edges}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtermNode :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtermNode
+subtermNode cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "label" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_label -> Eithers.bind (Helpers.requireField "id" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_id -> Right (Paths.SubtermNode {
+          Paths.subtermNodeName = field_name,
+          Paths.subtermNodeLabel = field_label,
+          Paths.subtermNodeId = field_id})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtermPath :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtermPath
+subtermPath cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Paths.SubtermPath b) (Helpers.decodeList subtermStep cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtermStep :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtermStep
+subtermStep cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "annotatedBody", (\input -> Eithers.map (\t -> Paths.SubtermStepAnnotatedBody) (Helpers.decodeUnit cx input))),
+                      (Core.Name "applicationFunction", (\input -> Eithers.map (\t -> Paths.SubtermStepApplicationFunction) (Helpers.decodeUnit cx input))),
+                      (Core.Name "applicationArgument", (\input -> Eithers.map (\t -> Paths.SubtermStepApplicationArgument) (Helpers.decodeUnit cx input))),
+                      (Core.Name "lambdaBody", (\input -> Eithers.map (\t -> Paths.SubtermStepLambdaBody) (Helpers.decodeUnit cx input))),
+                      (Core.Name "unionCasesDefault", (\input -> Eithers.map (\t -> Paths.SubtermStepUnionCasesDefault) (Helpers.decodeUnit cx input))),
+                      (Core.Name "unionCasesBranch", (\input -> Eithers.map (\t -> Paths.SubtermStepUnionCasesBranch t) (Core_.name cx input))),
+                      (Core.Name "letBody", (\input -> Eithers.map (\t -> Paths.SubtermStepLetBody) (Helpers.decodeUnit cx input))),
+                      (Core.Name "letBinding", (\input -> Eithers.map (\t -> Paths.SubtermStepLetBinding t) (Core_.name cx input))),
+                      (Core.Name "listElement", (\input -> Eithers.map (\t -> Paths.SubtermStepListElement t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "mapKey", (\input -> Eithers.map (\t -> Paths.SubtermStepMapKey t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "mapValue", (\input -> Eithers.map (\t -> Paths.SubtermStepMapValue t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "maybeTerm", (\input -> Eithers.map (\t -> Paths.SubtermStepMaybeTerm) (Helpers.decodeUnit cx input))),
+                      (Core.Name "productTerm", (\input -> Eithers.map (\t -> Paths.SubtermStepProductTerm t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "recordField", (\input -> Eithers.map (\t -> Paths.SubtermStepRecordField t) (Core_.name cx input))),
+                      (Core.Name "setElement", (\input -> Eithers.map (\t -> Paths.SubtermStepSetElement t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "sumTerm", (\input -> Eithers.map (\t -> Paths.SubtermStepSumTerm) (Helpers.decodeUnit cx input))),
+                      (Core.Name "typeLambdaBody", (\input -> Eithers.map (\t -> Paths.SubtermStepTypeLambdaBody) (Helpers.decodeUnit cx input))),
+                      (Core.Name "typeApplicationTerm", (\input -> Eithers.map (\t -> Paths.SubtermStepTypeApplicationTerm) (Helpers.decodeUnit cx input))),
+                      (Core.Name "injectionTerm", (\input -> Eithers.map (\t -> Paths.SubtermStepInjectionTerm) (Helpers.decodeUnit cx input))),
+                      (Core.Name "wrappedTerm", (\input -> Eithers.map (\t -> Paths.SubtermStepWrappedTerm) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtypeEdge :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtypeEdge
+subtypeEdge cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "source" subtypeNode fieldMap cx) (\field_source -> Eithers.bind (Helpers.requireField "path" subtypePath fieldMap cx) (\field_path -> Eithers.bind (Helpers.requireField "target" subtypeNode fieldMap cx) (\field_target -> Right (Paths.SubtypeEdge {
+          Paths.subtypeEdgeSource = field_source,
+          Paths.subtypeEdgePath = field_path,
+          Paths.subtypeEdgeTarget = field_target})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtypeGraph :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtypeGraph
+subtypeGraph cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "nodes" (Helpers.decodeList subtypeNode) fieldMap cx) (\field_nodes -> Eithers.bind (Helpers.requireField "edges" (Helpers.decodeList subtypeEdge) fieldMap cx) (\field_edges -> Right (Paths.SubtypeGraph {
+          Paths.subtypeGraphNodes = field_nodes,
+          Paths.subtypeGraphEdges = field_edges}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtypeNode :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtypeNode
+subtypeNode cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "label" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_label -> Eithers.bind (Helpers.requireField "id" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_id -> Right (Paths.SubtypeNode {
+          Paths.subtypeNodeName = field_name,
+          Paths.subtypeNodeLabel = field_label,
+          Paths.subtypeNodeId = field_id})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtypePath :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtypePath
+subtypePath cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Paths.SubtypePath b) (Helpers.decodeList subtypeStep cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+subtypeStep :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Paths.SubtypeStep
+subtypeStep cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "annotatedBody", (\input -> Eithers.map (\t -> Paths.SubtypeStepAnnotatedBody) (Helpers.decodeUnit cx input))),
+                      (Core.Name "applicationFunction", (\input -> Eithers.map (\t -> Paths.SubtypeStepApplicationFunction) (Helpers.decodeUnit cx input))),
+                      (Core.Name "applicationArgument", (\input -> Eithers.map (\t -> Paths.SubtypeStepApplicationArgument) (Helpers.decodeUnit cx input))),
+                      (Core.Name "eitherLeft", (\input -> Eithers.map (\t -> Paths.SubtypeStepEitherLeft) (Helpers.decodeUnit cx input))),
+                      (Core.Name "eitherRight", (\input -> Eithers.map (\t -> Paths.SubtypeStepEitherRight) (Helpers.decodeUnit cx input))),
+                      (Core.Name "forallBody", (\input -> Eithers.map (\t -> Paths.SubtypeStepForallBody) (Helpers.decodeUnit cx input))),
+                      (Core.Name "functionDomain", (\input -> Eithers.map (\t -> Paths.SubtypeStepFunctionDomain) (Helpers.decodeUnit cx input))),
+                      (Core.Name "functionCodomain", (\input -> Eithers.map (\t -> Paths.SubtypeStepFunctionCodomain) (Helpers.decodeUnit cx input))),
+                      (Core.Name "listElement", (\input -> Eithers.map (\t -> Paths.SubtypeStepListElement) (Helpers.decodeUnit cx input))),
+                      (Core.Name "mapKeys", (\input -> Eithers.map (\t -> Paths.SubtypeStepMapKeys) (Helpers.decodeUnit cx input))),
+                      (Core.Name "mapValues", (\input -> Eithers.map (\t -> Paths.SubtypeStepMapValues) (Helpers.decodeUnit cx input))),
+                      (Core.Name "maybeElement", (\input -> Eithers.map (\t -> Paths.SubtypeStepMaybeElement) (Helpers.decodeUnit cx input))),
+                      (Core.Name "pairFirst", (\input -> Eithers.map (\t -> Paths.SubtypeStepPairFirst) (Helpers.decodeUnit cx input))),
+                      (Core.Name "pairSecond", (\input -> Eithers.map (\t -> Paths.SubtypeStepPairSecond) (Helpers.decodeUnit cx input))),
+                      (Core.Name "recordField", (\input -> Eithers.map (\t -> Paths.SubtypeStepRecordField t) (Core_.name cx input))),
+                      (Core.Name "setElement", (\input -> Eithers.map (\t -> Paths.SubtypeStepSetElement) (Helpers.decodeUnit cx input))),
+                      (Core.Name "unionField", (\input -> Eithers.map (\t -> Paths.SubtypeStepUnionField t) (Core_.name cx input))),
+                      (Core.Name "wrappedType", (\input -> Eithers.map (\t -> Paths.SubtypeStepWrappedType) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Phantoms.hs b/src/gen-main/haskell/Hydra/Decode/Phantoms.hs
--- a/src/gen-main/haskell/Hydra/Decode/Phantoms.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Phantoms.hs
@@ -6,12 +6,12 @@
 
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Phantoms as Phantoms
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -19,16 +19,18 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-tBinding :: (t0 -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Phantoms.TBinding t1))
-tBinding a cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "term" (tTerm a) fieldMap cx) (\field_term -> Right (Phantoms.TBinding {
-      Phantoms.tBindingName = field_name,
-      Phantoms.tBindingTerm = field_term}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.phantoms.TBinding"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+tBinding :: t0 -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Phantoms.TBinding t1)
+tBinding a cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" Core_.name fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "term" (tTerm a) fieldMap cx) (\field_term -> Right (Phantoms.TBinding {
+          Phantoms.tBindingName = field_name,
+          Phantoms.tBindingTerm = field_term}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-tTerm :: (t0 -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Phantoms.TTerm t1))
-tTerm a cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Phantoms.TTerm b) (Core_.term cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.phantoms.TTerm"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+tTerm :: t0 -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Phantoms.TTerm t1)
+tTerm a cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Phantoms.TTerm b) (Core_.term cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Query.hs b/src/gen-main/haskell/Hydra/Decode/Query.hs
--- a/src/gen-main/haskell/Hydra/Decode/Query.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Query.hs
@@ -6,6 +6,7 @@
 
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
@@ -14,7 +15,6 @@
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Query as Query
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -22,208 +22,235 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-comparisonConstraint :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.ComparisonConstraint)
-comparisonConstraint cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "equal", (\input -> Eithers.map (\t -> Query.ComparisonConstraintEqual) (Helpers.decodeUnit cx input))),
-                (Core.Name "notEqual", (\input -> Eithers.map (\t -> Query.ComparisonConstraintNotEqual) (Helpers.decodeUnit cx input))),
-                (Core.Name "lessThan", (\input -> Eithers.map (\t -> Query.ComparisonConstraintLessThan) (Helpers.decodeUnit cx input))),
-                (Core.Name "greaterThan", (\input -> Eithers.map (\t -> Query.ComparisonConstraintGreaterThan) (Helpers.decodeUnit cx input))),
-                (Core.Name "lessThanOrEqual", (\input -> Eithers.map (\t -> Query.ComparisonConstraintLessThanOrEqual) (Helpers.decodeUnit cx input))),
-                (Core.Name "greaterThanOrEqual", (\input -> Eithers.map (\t -> Query.ComparisonConstraintGreaterThanOrEqual) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.query.ComparisonConstraint"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+comparisonConstraint :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.ComparisonConstraint
+comparisonConstraint cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "equal", (\input -> Eithers.map (\t -> Query.ComparisonConstraintEqual) (Helpers.decodeUnit cx input))),
+                      (Core.Name "notEqual", (\input -> Eithers.map (\t -> Query.ComparisonConstraintNotEqual) (Helpers.decodeUnit cx input))),
+                      (Core.Name "lessThan", (\input -> Eithers.map (\t -> Query.ComparisonConstraintLessThan) (Helpers.decodeUnit cx input))),
+                      (Core.Name "greaterThan", (\input -> Eithers.map (\t -> Query.ComparisonConstraintGreaterThan) (Helpers.decodeUnit cx input))),
+                      (Core.Name "lessThanOrEqual", (\input -> Eithers.map (\t -> Query.ComparisonConstraintLessThanOrEqual) (Helpers.decodeUnit cx input))),
+                      (Core.Name "greaterThanOrEqual", (\input -> Eithers.map (\t -> Query.ComparisonConstraintGreaterThanOrEqual) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-edge :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.Edge)
-edge cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "type" Core_.name fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "out" (Helpers.decodeMaybe Core_.name) fieldMap cx) (\field_out -> Eithers.bind (Helpers.requireField "in" (Helpers.decodeMaybe Core_.name) fieldMap cx) (\field_in -> Right (Query.Edge {
-      Query.edgeType = field_type,
-      Query.edgeOut = field_out,
-      Query.edgeIn = field_in})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.query.Edge"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+edge :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.Edge
+edge cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "type" Core_.name fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "out" (Helpers.decodeMaybe Core_.name) fieldMap cx) (\field_out -> Eithers.bind (Helpers.requireField "in" (Helpers.decodeMaybe Core_.name) fieldMap cx) (\field_in -> Right (Query.Edge {
+          Query.edgeType = field_type,
+          Query.edgeOut = field_out,
+          Query.edgeIn = field_in})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-graphPattern :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.GraphPattern)
-graphPattern cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "graph" Core_.name fieldMap cx) (\field_graph -> Eithers.bind (Helpers.requireField "patterns" (Helpers.decodeList pattern) fieldMap cx) (\field_patterns -> Right (Query.GraphPattern {
-      Query.graphPatternGraph = field_graph,
-      Query.graphPatternPatterns = field_patterns}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.query.GraphPattern"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+graphPattern :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.GraphPattern
+graphPattern cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "graph" Core_.name fieldMap cx) (\field_graph -> Eithers.bind (Helpers.requireField "patterns" (Helpers.decodeList pattern) fieldMap cx) (\field_patterns -> Right (Query.GraphPattern {
+          Query.graphPatternGraph = field_graph,
+          Query.graphPatternPatterns = field_patterns}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-node :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.Node)
-node cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "term", (\input -> Eithers.map (\t -> Query.NodeTerm t) (Core_.term cx input))),
-                (Core.Name "variable", (\input -> Eithers.map (\t -> Query.NodeVariable t) (variable cx input))),
-                (Core.Name "wildcard", (\input -> Eithers.map (\t -> Query.NodeWildcard) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.query.Node"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+node :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.Node
+node cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "term", (\input -> Eithers.map (\t -> Query.NodeTerm t) (Core_.term cx input))),
+                      (Core.Name "variable", (\input -> Eithers.map (\t -> Query.NodeVariable t) (variable cx input))),
+                      (Core.Name "wildcard", (\input -> Eithers.map (\t -> Query.NodeWildcard) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-path :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.Path)
-path cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "step", (\input -> Eithers.map (\t -> Query.PathStep t) (step cx input))),
-                (Core.Name "regex", (\input -> Eithers.map (\t -> Query.PathRegex t) (regexSequence cx input))),
-                (Core.Name "inverse", (\input -> Eithers.map (\t -> Query.PathInverse t) (path cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.query.Path"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+path :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.Path
+path cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "step", (\input -> Eithers.map (\t -> Query.PathStep t) (step cx input))),
+                      (Core.Name "regex", (\input -> Eithers.map (\t -> Query.PathRegex t) (regexSequence cx input))),
+                      (Core.Name "inverse", (\input -> Eithers.map (\t -> Query.PathInverse t) (path cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-pattern :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.Pattern)
-pattern cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "triple", (\input -> Eithers.map (\t -> Query.PatternTriple t) (triplePattern cx input))),
-                (Core.Name "negation", (\input -> Eithers.map (\t -> Query.PatternNegation t) (pattern cx input))),
-                (Core.Name "conjunction", (\input -> Eithers.map (\t -> Query.PatternConjunction t) (Helpers.decodeList pattern cx input))),
-                (Core.Name "disjunction", (\input -> Eithers.map (\t -> Query.PatternDisjunction t) (Helpers.decodeList pattern cx input))),
-                (Core.Name "graph", (\input -> Eithers.map (\t -> Query.PatternGraph t) (graphPattern cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.query.Pattern"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+pathEquation :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.PathEquation
+pathEquation cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "left" path fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" path fieldMap cx) (\field_right -> Right (Query.PathEquation {
+          Query.pathEquationLeft = field_left,
+          Query.pathEquationRight = field_right}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-query :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.Query)
-query cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "variables" (Helpers.decodeList variable) fieldMap cx) (\field_variables -> Eithers.bind (Helpers.requireField "patterns" (Helpers.decodeList pattern) fieldMap cx) (\field_patterns -> Right (Query.Query {
-      Query.queryVariables = field_variables,
-      Query.queryPatterns = field_patterns}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.query.Query"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+pattern :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.Pattern
+pattern cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "triple", (\input -> Eithers.map (\t -> Query.PatternTriple t) (triplePattern cx input))),
+                      (Core.Name "negation", (\input -> Eithers.map (\t -> Query.PatternNegation t) (pattern cx input))),
+                      (Core.Name "conjunction", (\input -> Eithers.map (\t -> Query.PatternConjunction t) (Helpers.decodeList pattern cx input))),
+                      (Core.Name "disjunction", (\input -> Eithers.map (\t -> Query.PatternDisjunction t) (Helpers.decodeList pattern cx input))),
+                      (Core.Name "graph", (\input -> Eithers.map (\t -> Query.PatternGraph t) (graphPattern cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-range :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.Range)
-range cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "min" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_min -> Eithers.bind (Helpers.requireField "max" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_max -> Right (Query.Range {
-      Query.rangeMin = field_min,
-      Query.rangeMax = field_max}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.query.Range"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+patternImplication :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.PatternImplication
+patternImplication cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "antecedent" pattern fieldMap cx) (\field_antecedent -> Eithers.bind (Helpers.requireField "consequent" pattern fieldMap cx) (\field_consequent -> Right (Query.PatternImplication {
+          Query.patternImplicationAntecedent = field_antecedent,
+          Query.patternImplicationConsequent = field_consequent}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-regexQuantifier :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.RegexQuantifier)
-regexQuantifier cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "one", (\input -> Eithers.map (\t -> Query.RegexQuantifierOne) (Helpers.decodeUnit cx input))),
-                (Core.Name "zeroOrOne", (\input -> Eithers.map (\t -> Query.RegexQuantifierZeroOrOne) (Helpers.decodeUnit cx input))),
-                (Core.Name "zeroOrMore", (\input -> Eithers.map (\t -> Query.RegexQuantifierZeroOrMore) (Helpers.decodeUnit cx input))),
-                (Core.Name "oneOrMore", (\input -> Eithers.map (\t -> Query.RegexQuantifierOneOrMore) (Helpers.decodeUnit cx input))),
-                (Core.Name "exactly", (\input -> Eithers.map (\t -> Query.RegexQuantifierExactly t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "atLeast", (\input -> Eithers.map (\t -> Query.RegexQuantifierAtLeast t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "range", (\input -> Eithers.map (\t -> Query.RegexQuantifierRange t) (range cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.query.RegexQuantifier"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+query :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.Query
+query cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "variables" (Helpers.decodeList variable) fieldMap cx) (\field_variables -> Eithers.bind (Helpers.requireField "patterns" (Helpers.decodeList pattern) fieldMap cx) (\field_patterns -> Right (Query.Query {
+          Query.queryVariables = field_variables,
+          Query.queryPatterns = field_patterns}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-regexSequence :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.RegexSequence)
-regexSequence cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "path" path fieldMap cx) (\field_path -> Eithers.bind (Helpers.requireField "quantifier" regexQuantifier fieldMap cx) (\field_quantifier -> Right (Query.RegexSequence {
-      Query.regexSequencePath = field_path,
-      Query.regexSequenceQuantifier = field_quantifier}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.query.RegexSequence"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+range :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.Range
+range cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "min" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_min -> Eithers.bind (Helpers.requireField "max" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_max -> Right (Query.Range {
+          Query.rangeMin = field_min,
+          Query.rangeMax = field_max}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-step :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.Step)
-step cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "edge", (\input -> Eithers.map (\t -> Query.StepEdge t) (edge cx input))),
-                (Core.Name "project", (\input -> Eithers.map (\t -> Query.StepProject t) (Core_.projection cx input))),
-                (Core.Name "compare", (\input -> Eithers.map (\t -> Query.StepCompare t) (comparisonConstraint cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.query.Step"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+regexQuantifier :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.RegexQuantifier
+regexQuantifier cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "one", (\input -> Eithers.map (\t -> Query.RegexQuantifierOne) (Helpers.decodeUnit cx input))),
+                      (Core.Name "zeroOrOne", (\input -> Eithers.map (\t -> Query.RegexQuantifierZeroOrOne) (Helpers.decodeUnit cx input))),
+                      (Core.Name "zeroOrMore", (\input -> Eithers.map (\t -> Query.RegexQuantifierZeroOrMore) (Helpers.decodeUnit cx input))),
+                      (Core.Name "oneOrMore", (\input -> Eithers.map (\t -> Query.RegexQuantifierOneOrMore) (Helpers.decodeUnit cx input))),
+                      (Core.Name "exactly", (\input -> Eithers.map (\t -> Query.RegexQuantifierExactly t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "atLeast", (\input -> Eithers.map (\t -> Query.RegexQuantifierAtLeast t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input)))),
+                      (Core.Name "range", (\input -> Eithers.map (\t -> Query.RegexQuantifierRange t) (range cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-triplePattern :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.TriplePattern)
-triplePattern cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "subject" node fieldMap cx) (\field_subject -> Eithers.bind (Helpers.requireField "predicate" path fieldMap cx) (\field_predicate -> Eithers.bind (Helpers.requireField "object" node fieldMap cx) (\field_object -> Right (Query.TriplePattern {
-      Query.triplePatternSubject = field_subject,
-      Query.triplePatternPredicate = field_predicate,
-      Query.triplePatternObject = field_object})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.query.TriplePattern"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+regexSequence :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.RegexSequence
+regexSequence cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "path" path fieldMap cx) (\field_path -> Eithers.bind (Helpers.requireField "quantifier" regexQuantifier fieldMap cx) (\field_quantifier -> Right (Query.RegexSequence {
+          Query.regexSequencePath = field_path,
+          Query.regexSequenceQuantifier = field_quantifier}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-variable :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Query.Variable)
-variable cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Query.Variable b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.query.Variable"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+step :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.Step
+step cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "edge", (\input -> Eithers.map (\t -> Query.StepEdge t) (edge cx input))),
+                      (Core.Name "project", (\input -> Eithers.map (\t -> Query.StepProject t) (Core_.projection cx input))),
+                      (Core.Name "compare", (\input -> Eithers.map (\t -> Query.StepCompare t) (comparisonConstraint cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+triplePattern :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.TriplePattern
+triplePattern cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "subject" node fieldMap cx) (\field_subject -> Eithers.bind (Helpers.requireField "predicate" path fieldMap cx) (\field_predicate -> Eithers.bind (Helpers.requireField "object" node fieldMap cx) (\field_object -> Right (Query.TriplePattern {
+          Query.triplePatternSubject = field_subject,
+          Query.triplePatternPredicate = field_predicate,
+          Query.triplePatternObject = field_object})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+variable :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Query.Variable
+variable cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Query.Variable b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Relational.hs b/src/gen-main/haskell/Hydra/Decode/Relational.hs
--- a/src/gen-main/haskell/Hydra/Decode/Relational.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Relational.hs
@@ -5,12 +5,12 @@
 module Hydra.Decode.Relational where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Relational as Relational
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -18,69 +18,78 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-columnName :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Relational.ColumnName)
-columnName cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Relational.ColumnName b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.relational.ColumnName"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+columnName :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Relational.ColumnName
+columnName cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Relational.ColumnName b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-columnSchema :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Relational.ColumnSchema t0))
-columnSchema t cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" columnName fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "domain" t fieldMap cx) (\field_domain -> Right (Relational.ColumnSchema {
-      Relational.columnSchemaName = field_name,
-      Relational.columnSchemaDomain = field_domain}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.relational.ColumnSchema"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+columnSchema :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Relational.ColumnSchema t0)
+columnSchema t cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" columnName fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "domain" t fieldMap cx) (\field_domain -> Right (Relational.ColumnSchema {
+          Relational.columnSchemaName = field_name,
+          Relational.columnSchemaDomain = field_domain}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-foreignKey :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Relational.ForeignKey)
-foreignKey cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "foreignRelation" relationName fieldMap cx) (\field_foreignRelation -> Eithers.bind (Helpers.requireField "keys" (Helpers.decodeMap columnName columnName) fieldMap cx) (\field_keys -> Right (Relational.ForeignKey {
-      Relational.foreignKeyForeignRelation = field_foreignRelation,
-      Relational.foreignKeyKeys = field_keys}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.relational.ForeignKey"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+foreignKey :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Relational.ForeignKey
+foreignKey cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "foreignRelation" relationName fieldMap cx) (\field_foreignRelation -> Eithers.bind (Helpers.requireField "keys" (Helpers.decodeMap columnName columnName) fieldMap cx) (\field_keys -> Right (Relational.ForeignKey {
+          Relational.foreignKeyForeignRelation = field_foreignRelation,
+          Relational.foreignKeyKeys = field_keys}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-primaryKey :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Relational.PrimaryKey)
-primaryKey cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Relational.PrimaryKey b) (Helpers.decodeList columnName cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.relational.PrimaryKey"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+primaryKey :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Relational.PrimaryKey
+primaryKey cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Relational.PrimaryKey b) (Helpers.decodeList columnName cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-relation :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Relational.Relation t0))
-relation v cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Relational.Relation b) (Helpers.decodeList (row v) cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.relational.Relation"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+relation :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Relational.Relation t0)
+relation v cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Relational.Relation b) (Helpers.decodeList (row v) cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-relationName :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Relational.RelationName)
-relationName cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Relational.RelationName b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.relational.RelationName"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+relationName :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Relational.RelationName
+relationName cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Relational.RelationName b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-relationSchema :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Relational.RelationSchema t0))
-relationSchema t cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" relationName fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "columns" (Helpers.decodeList (columnSchema t)) fieldMap cx) (\field_columns -> Eithers.bind (Helpers.requireField "primaryKeys" (Helpers.decodeList primaryKey) fieldMap cx) (\field_primaryKeys -> Eithers.bind (Helpers.requireField "foreignKeys" (Helpers.decodeList foreignKey) fieldMap cx) (\field_foreignKeys -> Right (Relational.RelationSchema {
-      Relational.relationSchemaName = field_name,
-      Relational.relationSchemaColumns = field_columns,
-      Relational.relationSchemaPrimaryKeys = field_primaryKeys,
-      Relational.relationSchemaForeignKeys = field_foreignKeys}))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.relational.RelationSchema"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+relationSchema :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Relational.RelationSchema t0)
+relationSchema t cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" relationName fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "columns" (Helpers.decodeList (columnSchema t)) fieldMap cx) (\field_columns -> Eithers.bind (Helpers.requireField "primaryKeys" (Helpers.decodeList primaryKey) fieldMap cx) (\field_primaryKeys -> Eithers.bind (Helpers.requireField "foreignKeys" (Helpers.decodeList foreignKey) fieldMap cx) (\field_foreignKeys -> Right (Relational.RelationSchema {
+          Relational.relationSchemaName = field_name,
+          Relational.relationSchemaColumns = field_columns,
+          Relational.relationSchemaPrimaryKeys = field_primaryKeys,
+          Relational.relationSchemaForeignKeys = field_foreignKeys}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-relationship :: Ord t0 => ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Relational.Relationship t0))
-relationship v cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Relational.Relationship b) (Helpers.decodeSet (Helpers.decodeMap columnName v) cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.relational.Relationship"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+relationship :: Ord t0 => ((Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Relational.Relationship t0))
+relationship v cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Relational.Relationship b) (Helpers.decodeSet (Helpers.decodeMap columnName v) cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-row :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Relational.Row t0))
-row v cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Relational.Row b) (Helpers.decodeList v cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.relational.Row"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+row :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Relational.Row t0)
+row v cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Relational.Row b) (Helpers.decodeList v cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Tabular.hs b/src/gen-main/haskell/Hydra/Decode/Tabular.hs
--- a/src/gen-main/haskell/Hydra/Decode/Tabular.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Tabular.hs
@@ -7,12 +7,12 @@
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
 import qualified Hydra.Decode.Relational as Relational
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Tabular as Tabular
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -20,43 +20,48 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-columnType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Tabular.ColumnType)
-columnType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" Relational.columnName fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Right (Tabular.ColumnType {
-      Tabular.columnTypeName = field_name,
-      Tabular.columnTypeType = field_type}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.tabular.ColumnType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+columnType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Tabular.ColumnType
+columnType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" Relational.columnName fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Right (Tabular.ColumnType {
+          Tabular.columnTypeName = field_name,
+          Tabular.columnTypeType = field_type}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-dataRow :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Tabular.DataRow t0))
-dataRow v cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Tabular.DataRow b) (Helpers.decodeList (Helpers.decodeMaybe v) cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.tabular.DataRow"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+dataRow :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Tabular.DataRow t0)
+dataRow v cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Tabular.DataRow b) (Helpers.decodeList (Helpers.decodeMaybe v) cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-headerRow :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Tabular.HeaderRow)
-headerRow cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Tabular.HeaderRow b) (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.tabular.HeaderRow"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+headerRow :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Tabular.HeaderRow
+headerRow cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Tabular.HeaderRow b) (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-table :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Tabular.Table t0))
-table v cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "header" (Helpers.decodeMaybe headerRow) fieldMap cx) (\field_header -> Eithers.bind (Helpers.requireField "data" (Helpers.decodeList (dataRow v)) fieldMap cx) (\field_data -> Right (Tabular.Table {
-      Tabular.tableHeader = field_header,
-      Tabular.tableData = field_data}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.tabular.Table"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+table :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Tabular.Table t0)
+table v cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "header" (Helpers.decodeMaybe headerRow) fieldMap cx) (\field_header -> Eithers.bind (Helpers.requireField "data" (Helpers.decodeList (dataRow v)) fieldMap cx) (\field_data -> Right (Tabular.Table {
+          Tabular.tableHeader = field_header,
+          Tabular.tableData = field_data}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-tableType :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Tabular.TableType)
-tableType cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" Relational.relationName fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "columns" (Helpers.decodeList columnType) fieldMap cx) (\field_columns -> Right (Tabular.TableType {
-      Tabular.tableTypeName = field_name,
-      Tabular.tableTypeColumns = field_columns}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.tabular.TableType"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+tableType :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Tabular.TableType
+tableType cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" Relational.relationName fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "columns" (Helpers.decodeList columnType) fieldMap cx) (\field_columns -> Right (Tabular.TableType {
+          Tabular.tableTypeName = field_name,
+          Tabular.tableTypeColumns = field_columns}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Testing.hs b/src/gen-main/haskell/Hydra/Decode/Testing.hs
--- a/src/gen-main/haskell/Hydra/Decode/Testing.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Testing.hs
@@ -8,662 +8,709 @@
 import qualified Hydra.Decode.Ast as Ast
 import qualified Hydra.Decode.Coders as Coders
 import qualified Hydra.Decode.Core as Core_
-import qualified Hydra.Decode.Json.Model as Model
-import qualified Hydra.Decode.Parsing as Parsing
-import qualified Hydra.Decode.Typing as Typing
-import qualified Hydra.Decode.Util as Util
-import qualified Hydra.Extract.Helpers as Helpers
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Json.Model as Model_
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Testing as Testing
-import qualified Hydra.Util as Util_
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-alphaConversionTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.AlphaConversionTestCase)
-alphaConversionTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "oldVariable" Core_.name fieldMap cx) (\field_oldVariable -> Eithers.bind (Helpers.requireField "newVariable" Core_.name fieldMap cx) (\field_newVariable -> Eithers.bind (Helpers.requireField "result" Core_.term fieldMap cx) (\field_result -> Right (Testing.AlphaConversionTestCase {
-      Testing.alphaConversionTestCaseTerm = field_term,
-      Testing.alphaConversionTestCaseOldVariable = field_oldVariable,
-      Testing.alphaConversionTestCaseNewVariable = field_newVariable,
-      Testing.alphaConversionTestCaseResult = field_result}))))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.AlphaConversionTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-evaluationStyle :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.EvaluationStyle)
-evaluationStyle cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "eager", (\input -> Eithers.map (\t -> Testing.EvaluationStyleEager) (Helpers.decodeUnit cx input))),
-                (Core.Name "lazy", (\input -> Eithers.map (\t -> Testing.EvaluationStyleLazy) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util_.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util_.DecodingError "expected union of type hydra.testing.EvaluationStyle"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-caseConversionTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.CaseConversionTestCase)
-caseConversionTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "fromConvention" Util.caseConvention fieldMap cx) (\field_fromConvention -> Eithers.bind (Helpers.requireField "toConvention" Util.caseConvention fieldMap cx) (\field_toConvention -> Eithers.bind (Helpers.requireField "fromString" (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_fromString -> Eithers.bind (Helpers.requireField "toString" (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_toString -> Right (Testing.CaseConversionTestCase {
-      Testing.caseConversionTestCaseFromConvention = field_fromConvention,
-      Testing.caseConversionTestCaseToConvention = field_toConvention,
-      Testing.caseConversionTestCaseFromString = field_fromString,
-      Testing.caseConversionTestCaseToString = field_toString}))))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.CaseConversionTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-delegatedEvaluationTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.DelegatedEvaluationTestCase)
-delegatedEvaluationTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.DelegatedEvaluationTestCase {
-      Testing.delegatedEvaluationTestCaseInput = field_input,
-      Testing.delegatedEvaluationTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.DelegatedEvaluationTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-etaExpansionTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.EtaExpansionTestCase)
-etaExpansionTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.EtaExpansionTestCase {
-      Testing.etaExpansionTestCaseInput = field_input,
-      Testing.etaExpansionTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.EtaExpansionTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-deannotateTermTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.DeannotateTermTestCase)
-deannotateTermTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.DeannotateTermTestCase {
-      Testing.deannotateTermTestCaseInput = field_input,
-      Testing.deannotateTermTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.DeannotateTermTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-deannotateTypeTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.DeannotateTypeTestCase)
-deannotateTypeTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.type_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.type_ fieldMap cx) (\field_output -> Right (Testing.DeannotateTypeTestCase {
-      Testing.deannotateTypeTestCaseInput = field_input,
-      Testing.deannotateTypeTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.DeannotateTypeTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-flattenLetTermsTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.FlattenLetTermsTestCase)
-flattenLetTermsTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.FlattenLetTermsTestCase {
-      Testing.flattenLetTermsTestCaseInput = field_input,
-      Testing.flattenLetTermsTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.FlattenLetTermsTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-foldOperation :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.FoldOperation)
-foldOperation cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "sumInt32Literals", (\input -> Eithers.map (\t -> Testing.FoldOperationSumInt32Literals) (Helpers.decodeUnit cx input))),
-                (Core.Name "collectListLengths", (\input -> Eithers.map (\t -> Testing.FoldOperationCollectListLengths) (Helpers.decodeUnit cx input))),
-                (Core.Name "collectLabels", (\input -> Eithers.map (\t -> Testing.FoldOperationCollectLabels) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util_.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util_.DecodingError "expected union of type hydra.testing.FoldOperation"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-foldOverTermTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.FoldOverTermTestCase)
-foldOverTermTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "traversalOrder" Coders.traversalOrder fieldMap cx) (\field_traversalOrder -> Eithers.bind (Helpers.requireField "operation" foldOperation fieldMap cx) (\field_operation -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.FoldOverTermTestCase {
-      Testing.foldOverTermTestCaseInput = field_input,
-      Testing.foldOverTermTestCaseTraversalOrder = field_traversalOrder,
-      Testing.foldOverTermTestCaseOperation = field_operation,
-      Testing.foldOverTermTestCaseOutput = field_output}))))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.FoldOverTermTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-freeVariablesTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.FreeVariablesTestCase)
-freeVariablesTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (Helpers.decodeSet Core_.name) fieldMap cx) (\field_output -> Right (Testing.FreeVariablesTestCase {
-      Testing.freeVariablesTestCaseInput = field_input,
-      Testing.freeVariablesTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.FreeVariablesTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-hoistPredicate :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.HoistPredicate)
-hoistPredicate cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "caseStatements", (\input -> Eithers.map (\t -> Testing.HoistPredicateCaseStatements) (Helpers.decodeUnit cx input))),
-                (Core.Name "applications", (\input -> Eithers.map (\t -> Testing.HoistPredicateApplications) (Helpers.decodeUnit cx input))),
-                (Core.Name "lists", (\input -> Eithers.map (\t -> Testing.HoistPredicateLists) (Helpers.decodeUnit cx input))),
-                (Core.Name "nothing", (\input -> Eithers.map (\t -> Testing.HoistPredicateNothing) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util_.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util_.DecodingError "expected union of type hydra.testing.HoistPredicate"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-hoistLetBindingsTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.HoistLetBindingsTestCase)
-hoistLetBindingsTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.let_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.let_ fieldMap cx) (\field_output -> Right (Testing.HoistLetBindingsTestCase {
-      Testing.hoistLetBindingsTestCaseInput = field_input,
-      Testing.hoistLetBindingsTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.HoistLetBindingsTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-hoistPolymorphicLetBindingsTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.HoistPolymorphicLetBindingsTestCase)
-hoistPolymorphicLetBindingsTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.let_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.let_ fieldMap cx) (\field_output -> Right (Testing.HoistPolymorphicLetBindingsTestCase {
-      Testing.hoistPolymorphicLetBindingsTestCaseInput = field_input,
-      Testing.hoistPolymorphicLetBindingsTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.HoistPolymorphicLetBindingsTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-hoistSubtermsTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.HoistSubtermsTestCase)
-hoistSubtermsTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "predicate" hoistPredicate fieldMap cx) (\field_predicate -> Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.HoistSubtermsTestCase {
-      Testing.hoistSubtermsTestCasePredicate = field_predicate,
-      Testing.hoistSubtermsTestCaseInput = field_input,
-      Testing.hoistSubtermsTestCaseOutput = field_output})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.HoistSubtermsTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-hoistCaseStatementsTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.HoistCaseStatementsTestCase)
-hoistCaseStatementsTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.HoistCaseStatementsTestCase {
-      Testing.hoistCaseStatementsTestCaseInput = field_input,
-      Testing.hoistCaseStatementsTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.HoistCaseStatementsTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-termRewriter :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TermRewriter)
-termRewriter cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "replaceFooWithBar", (\input -> Eithers.map (\t -> Testing.TermRewriterReplaceFooWithBar) (Helpers.decodeUnit cx input))),
-                (Core.Name "replaceInt32WithInt64", (\input -> Eithers.map (\t -> Testing.TermRewriterReplaceInt32WithInt64) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util_.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util_.DecodingError "expected union of type hydra.testing.TermRewriter"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-rewriteTermTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.RewriteTermTestCase)
-rewriteTermTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "rewriter" termRewriter fieldMap cx) (\field_rewriter -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.RewriteTermTestCase {
-      Testing.rewriteTermTestCaseInput = field_input,
-      Testing.rewriteTermTestCaseRewriter = field_rewriter,
-      Testing.rewriteTermTestCaseOutput = field_output})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.RewriteTermTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-typeRewriter :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TypeRewriter)
-typeRewriter cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "replaceStringWithInt32", (\input -> Eithers.map (\t -> Testing.TypeRewriterReplaceStringWithInt32) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util_.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util_.DecodingError "expected union of type hydra.testing.TypeRewriter"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-rewriteTypeTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.RewriteTypeTestCase)
-rewriteTypeTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.type_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "rewriter" typeRewriter fieldMap cx) (\field_rewriter -> Eithers.bind (Helpers.requireField "output" Core_.type_ fieldMap cx) (\field_output -> Right (Testing.RewriteTypeTestCase {
-      Testing.rewriteTypeTestCaseInput = field_input,
-      Testing.rewriteTypeTestCaseRewriter = field_rewriter,
-      Testing.rewriteTypeTestCaseOutput = field_output})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.RewriteTypeTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-evaluationTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.EvaluationTestCase)
-evaluationTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "evaluationStyle" evaluationStyle fieldMap cx) (\field_evaluationStyle -> Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.EvaluationTestCase {
-      Testing.evaluationTestCaseEvaluationStyle = field_evaluationStyle,
-      Testing.evaluationTestCaseInput = field_input,
-      Testing.evaluationTestCaseOutput = field_output})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.EvaluationTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-inferenceFailureTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.InferenceFailureTestCase)
-inferenceFailureTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Right (Testing.InferenceFailureTestCase {
-      Testing.inferenceFailureTestCaseInput = field_input})))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.InferenceFailureTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-inferenceTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.InferenceTestCase)
-inferenceTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.typeScheme fieldMap cx) (\field_output -> Right (Testing.InferenceTestCase {
-      Testing.inferenceTestCaseInput = field_input,
-      Testing.inferenceTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.InferenceTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-jsonCoderTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.JsonCoderTestCase)
-jsonCoderTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "json" Model.value fieldMap cx) (\field_json -> Right (Testing.JsonCoderTestCase {
-      Testing.jsonCoderTestCaseType = field_type,
-      Testing.jsonCoderTestCaseTerm = field_term,
-      Testing.jsonCoderTestCaseJson = field_json})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.JsonCoderTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-jsonDecodeTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.JsonDecodeTestCase)
-jsonDecodeTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "json" Model.value fieldMap cx) (\field_json -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) Core_.term) fieldMap cx) (\field_expected -> Right (Testing.JsonDecodeTestCase {
-      Testing.jsonDecodeTestCaseType = field_type,
-      Testing.jsonDecodeTestCaseJson = field_json,
-      Testing.jsonDecodeTestCaseExpected = field_expected})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.JsonDecodeTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-jsonEncodeTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.JsonEncodeTestCase)
-jsonEncodeTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) Model.value) fieldMap cx) (\field_expected -> Right (Testing.JsonEncodeTestCase {
-      Testing.jsonEncodeTestCaseTerm = field_term,
-      Testing.jsonEncodeTestCaseExpected = field_expected}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.JsonEncodeTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-jsonParserTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError (Testing.ParserTestCase Model_.Value))
-jsonParserTestCase = (parserTestCase Model.value)
-
-jsonRoundtripTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.JsonRoundtripTestCase)
-jsonRoundtripTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Right (Testing.JsonRoundtripTestCase {
-      Testing.jsonRoundtripTestCaseType = field_type,
-      Testing.jsonRoundtripTestCaseTerm = field_term}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.JsonRoundtripTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-liftLambdaAboveLetTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.LiftLambdaAboveLetTestCase)
-liftLambdaAboveLetTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.LiftLambdaAboveLetTestCase {
-      Testing.liftLambdaAboveLetTestCaseInput = field_input,
-      Testing.liftLambdaAboveLetTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.LiftLambdaAboveLetTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-jsonWriterTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError (Testing.WriterTestCase Model_.Value))
-jsonWriterTestCase = (writerTestCase Model.value)
-
-parserTestCase :: ((Graph.Graph -> Core.Term -> Either Util_.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util_.DecodingError (Testing.ParserTestCase t0))
-parserTestCase a cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (Parsing.parseResult a) fieldMap cx) (\field_output -> Right (Testing.ParserTestCase {
-      Testing.parserTestCaseInput = field_input,
-      Testing.parserTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.ParserTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-tag :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.Tag)
-tag cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Testing.Tag b) ((\raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util_.DecodingError "expected wrapped type hydra.testing.Tag"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-testCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TestCase)
-testCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "alphaConversion", (\input -> Eithers.map (\t -> Testing.TestCaseAlphaConversion t) (alphaConversionTestCase cx input))),
-                (Core.Name "caseConversion", (\input -> Eithers.map (\t -> Testing.TestCaseCaseConversion t) (caseConversionTestCase cx input))),
-                (Core.Name "deannotateTerm", (\input -> Eithers.map (\t -> Testing.TestCaseDeannotateTerm t) (deannotateTermTestCase cx input))),
-                (Core.Name "deannotateType", (\input -> Eithers.map (\t -> Testing.TestCaseDeannotateType t) (deannotateTypeTestCase cx input))),
-                (Core.Name "delegatedEvaluation", (\input -> Eithers.map (\t -> Testing.TestCaseDelegatedEvaluation t) (delegatedEvaluationTestCase cx input))),
-                (Core.Name "etaExpansion", (\input -> Eithers.map (\t -> Testing.TestCaseEtaExpansion t) (etaExpansionTestCase cx input))),
-                (Core.Name "flattenLetTerms", (\input -> Eithers.map (\t -> Testing.TestCaseFlattenLetTerms t) (flattenLetTermsTestCase cx input))),
-                (Core.Name "freeVariables", (\input -> Eithers.map (\t -> Testing.TestCaseFreeVariables t) (freeVariablesTestCase cx input))),
-                (Core.Name "evaluation", (\input -> Eithers.map (\t -> Testing.TestCaseEvaluation t) (evaluationTestCase cx input))),
-                (Core.Name "inference", (\input -> Eithers.map (\t -> Testing.TestCaseInference t) (inferenceTestCase cx input))),
-                (Core.Name "inferenceFailure", (\input -> Eithers.map (\t -> Testing.TestCaseInferenceFailure t) (inferenceFailureTestCase cx input))),
-                (Core.Name "jsonCoder", (\input -> Eithers.map (\t -> Testing.TestCaseJsonCoder t) (jsonCoderTestCase cx input))),
-                (Core.Name "jsonDecode", (\input -> Eithers.map (\t -> Testing.TestCaseJsonDecode t) (jsonDecodeTestCase cx input))),
-                (Core.Name "jsonEncode", (\input -> Eithers.map (\t -> Testing.TestCaseJsonEncode t) (jsonEncodeTestCase cx input))),
-                (Core.Name "jsonParser", (\input -> Eithers.map (\t -> Testing.TestCaseJsonParser t) (jsonParserTestCase cx input))),
-                (Core.Name "jsonRoundtrip", (\input -> Eithers.map (\t -> Testing.TestCaseJsonRoundtrip t) (jsonRoundtripTestCase cx input))),
-                (Core.Name "jsonWriter", (\input -> Eithers.map (\t -> Testing.TestCaseJsonWriter t) (jsonWriterTestCase cx input))),
-                (Core.Name "liftLambdaAboveLet", (\input -> Eithers.map (\t -> Testing.TestCaseLiftLambdaAboveLet t) (liftLambdaAboveLetTestCase cx input))),
-                (Core.Name "serialization", (\input -> Eithers.map (\t -> Testing.TestCaseSerialization t) (serializationTestCase cx input))),
-                (Core.Name "simplifyTerm", (\input -> Eithers.map (\t -> Testing.TestCaseSimplifyTerm t) (simplifyTermTestCase cx input))),
-                (Core.Name "topologicalSort", (\input -> Eithers.map (\t -> Testing.TestCaseTopologicalSort t) (topologicalSortTestCase cx input))),
-                (Core.Name "topologicalSortBindings", (\input -> Eithers.map (\t -> Testing.TestCaseTopologicalSortBindings t) (topologicalSortBindingsTestCase cx input))),
-                (Core.Name "topologicalSortSCC", (\input -> Eithers.map (\t -> Testing.TestCaseTopologicalSortSCC t) (topologicalSortSCCTestCase cx input))),
-                (Core.Name "typeChecking", (\input -> Eithers.map (\t -> Testing.TestCaseTypeChecking t) (typeCheckingTestCase cx input))),
-                (Core.Name "typeCheckingFailure", (\input -> Eithers.map (\t -> Testing.TestCaseTypeCheckingFailure t) (typeCheckingFailureTestCase cx input))),
-                (Core.Name "typeReduction", (\input -> Eithers.map (\t -> Testing.TestCaseTypeReduction t) (typeReductionTestCase cx input))),
-                (Core.Name "normalizeTypeVariables", (\input -> Eithers.map (\t -> Testing.TestCaseNormalizeTypeVariables t) (normalizeTypeVariablesTestCase cx input))),
-                (Core.Name "foldOverTerm", (\input -> Eithers.map (\t -> Testing.TestCaseFoldOverTerm t) (foldOverTermTestCase cx input))),
-                (Core.Name "rewriteTerm", (\input -> Eithers.map (\t -> Testing.TestCaseRewriteTerm t) (rewriteTermTestCase cx input))),
-                (Core.Name "rewriteType", (\input -> Eithers.map (\t -> Testing.TestCaseRewriteType t) (rewriteTypeTestCase cx input))),
-                (Core.Name "hoistSubterms", (\input -> Eithers.map (\t -> Testing.TestCaseHoistSubterms t) (hoistSubtermsTestCase cx input))),
-                (Core.Name "hoistCaseStatements", (\input -> Eithers.map (\t -> Testing.TestCaseHoistCaseStatements t) (hoistCaseStatementsTestCase cx input))),
-                (Core.Name "hoistLetBindings", (\input -> Eithers.map (\t -> Testing.TestCaseHoistLetBindings t) (hoistLetBindingsTestCase cx input))),
-                (Core.Name "hoistPolymorphicLetBindings", (\input -> Eithers.map (\t -> Testing.TestCaseHoistPolymorphicLetBindings t) (hoistPolymorphicLetBindingsTestCase cx input))),
-                (Core.Name "substInType", (\input -> Eithers.map (\t -> Testing.TestCaseSubstInType t) (substInTypeTestCase cx input))),
-                (Core.Name "variableOccursInType", (\input -> Eithers.map (\t -> Testing.TestCaseVariableOccursInType t) (variableOccursInTypeTestCase cx input))),
-                (Core.Name "unifyTypes", (\input -> Eithers.map (\t -> Testing.TestCaseUnifyTypes t) (unifyTypesTestCase cx input))),
-                (Core.Name "joinTypes", (\input -> Eithers.map (\t -> Testing.TestCaseJoinTypes t) (joinTypesTestCase cx input))),
-                (Core.Name "unshadowVariables", (\input -> Eithers.map (\t -> Testing.TestCaseUnshadowVariables t) (unshadowVariablesTestCase cx input)))])
-    in (Maybes.maybe (Left (Util_.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util_.DecodingError "expected union of type hydra.testing.TestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-testCaseWithMetadata :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TestCaseWithMetadata)
-testCaseWithMetadata cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "case" testCase fieldMap cx) (\field_case -> Eithers.bind (Helpers.requireField "description" (Helpers.decodeMaybe (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_description -> Eithers.bind (Helpers.requireField "tags" (Helpers.decodeList tag) fieldMap cx) (\field_tags -> Right (Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = field_name,
-      Testing.testCaseWithMetadataCase = field_case,
-      Testing.testCaseWithMetadataDescription = field_description,
-      Testing.testCaseWithMetadataTags = field_tags}))))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.TestCaseWithMetadata"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-testGroup :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TestGroup)
-testGroup cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "description" (Helpers.decodeMaybe (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_description -> Eithers.bind (Helpers.requireField "subgroups" (Helpers.decodeList testGroup) fieldMap cx) (\field_subgroups -> Eithers.bind (Helpers.requireField "cases" (Helpers.decodeList testCaseWithMetadata) fieldMap cx) (\field_cases -> Right (Testing.TestGroup {
-      Testing.testGroupName = field_name,
-      Testing.testGroupDescription = field_description,
-      Testing.testGroupSubgroups = field_subgroups,
-      Testing.testGroupCases = field_cases}))))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.TestGroup"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-typeCheckingTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TypeCheckingTestCase)
-typeCheckingTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "outputTerm" Core_.term fieldMap cx) (\field_outputTerm -> Eithers.bind (Helpers.requireField "outputType" Core_.type_ fieldMap cx) (\field_outputType -> Right (Testing.TypeCheckingTestCase {
-      Testing.typeCheckingTestCaseInput = field_input,
-      Testing.typeCheckingTestCaseOutputTerm = field_outputTerm,
-      Testing.typeCheckingTestCaseOutputType = field_outputType})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.TypeCheckingTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-typeCheckingFailureTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TypeCheckingFailureTestCase)
-typeCheckingFailureTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Right (Testing.TypeCheckingFailureTestCase {
-      Testing.typeCheckingFailureTestCaseInput = field_input})))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.TypeCheckingFailureTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-topologicalSortBindingsTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TopologicalSortBindingsTestCase)
-topologicalSortBindingsTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "bindings" (Helpers.decodeList (Helpers.decodePair Core_.name Core_.term)) fieldMap cx) (\field_bindings -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeList (Helpers.decodeList (Helpers.decodePair Core_.name Core_.term))) fieldMap cx) (\field_expected -> Right (Testing.TopologicalSortBindingsTestCase {
-      Testing.topologicalSortBindingsTestCaseBindings = field_bindings,
-      Testing.topologicalSortBindingsTestCaseExpected = field_expected}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.TopologicalSortBindingsTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-topologicalSortTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TopologicalSortTestCase)
-topologicalSortTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "adjacencyList" (Helpers.decodeList (Helpers.decodePair (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util_.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util_.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util_.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util_.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))))) fieldMap cx) (\field_adjacencyList -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither (Helpers.decodeList (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util_.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util_.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)))) (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util_.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util_.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)))) fieldMap cx) (\field_expected -> Right (Testing.TopologicalSortTestCase {
-      Testing.topologicalSortTestCaseAdjacencyList = field_adjacencyList,
-      Testing.topologicalSortTestCaseExpected = field_expected}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.TopologicalSortTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-topologicalSortSCCTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TopologicalSortSCCTestCase)
-topologicalSortSCCTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "adjacencyList" (Helpers.decodeList (Helpers.decodePair (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util_.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util_.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util_.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util_.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))))) fieldMap cx) (\field_adjacencyList -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeList (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util_.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util_.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)))) fieldMap cx) (\field_expected -> Right (Testing.TopologicalSortSCCTestCase {
-      Testing.topologicalSortSCCTestCaseAdjacencyList = field_adjacencyList,
-      Testing.topologicalSortSCCTestCaseExpected = field_expected}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.TopologicalSortSCCTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-serializationTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.SerializationTestCase)
-serializationTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Ast.expr fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_output -> Right (Testing.SerializationTestCase {
-      Testing.serializationTestCaseInput = field_input,
-      Testing.serializationTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.SerializationTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-simplifyTermTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.SimplifyTermTestCase)
-simplifyTermTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.SimplifyTermTestCase {
-      Testing.simplifyTermTestCaseInput = field_input,
-      Testing.simplifyTermTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.SimplifyTermTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-normalizeTypeVariablesTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.NormalizeTypeVariablesTestCase)
-normalizeTypeVariablesTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.NormalizeTypeVariablesTestCase {
-      Testing.normalizeTypeVariablesTestCaseInput = field_input,
-      Testing.normalizeTypeVariablesTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.NormalizeTypeVariablesTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-typeReductionTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.TypeReductionTestCase)
-typeReductionTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.type_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.type_ fieldMap cx) (\field_output -> Right (Testing.TypeReductionTestCase {
-      Testing.typeReductionTestCaseInput = field_input,
-      Testing.typeReductionTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.TypeReductionTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-writerTestCase :: ((Graph.Graph -> Core.Term -> Either Util_.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util_.DecodingError (Testing.WriterTestCase t0))
-writerTestCase a cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" a fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_output -> Right (Testing.WriterTestCase {
-      Testing.writerTestCaseInput = field_input,
-      Testing.writerTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.WriterTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-substInTypeTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.SubstInTypeTestCase)
-substInTypeTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "substitution" (Helpers.decodeList (Helpers.decodePair Core_.name Core_.type_)) fieldMap cx) (\field_substitution -> Eithers.bind (Helpers.requireField "input" Core_.type_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.type_ fieldMap cx) (\field_output -> Right (Testing.SubstInTypeTestCase {
-      Testing.substInTypeTestCaseSubstitution = field_substitution,
-      Testing.substInTypeTestCaseInput = field_input,
-      Testing.substInTypeTestCaseOutput = field_output})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.SubstInTypeTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-variableOccursInTypeTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.VariableOccursInTypeTestCase)
-variableOccursInTypeTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "variable" Core_.name fieldMap cx) (\field_variable -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "expected" (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralBoolean v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected boolean literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_expected -> Right (Testing.VariableOccursInTypeTestCase {
-      Testing.variableOccursInTypeTestCaseVariable = field_variable,
-      Testing.variableOccursInTypeTestCaseType = field_type,
-      Testing.variableOccursInTypeTestCaseExpected = field_expected})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.VariableOccursInTypeTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-unshadowVariablesTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.UnshadowVariablesTestCase)
-unshadowVariablesTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.UnshadowVariablesTestCase {
-      Testing.unshadowVariablesTestCaseInput = field_input,
-      Testing.unshadowVariablesTestCaseOutput = field_output}))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.UnshadowVariablesTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-unifyTypesTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.UnifyTypesTestCase)
-unifyTypesTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "schemaTypes" (Helpers.decodeList Core_.name) fieldMap cx) (\field_schemaTypes -> Eithers.bind (Helpers.requireField "left" Core_.type_ fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" Core_.type_ fieldMap cx) (\field_right -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither (\cx -> \raw -> Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util_.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util_.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) Typing.typeSubst) fieldMap cx) (\field_expected -> Right (Testing.UnifyTypesTestCase {
-      Testing.unifyTypesTestCaseSchemaTypes = field_schemaTypes,
-      Testing.unifyTypesTestCaseLeft = field_left,
-      Testing.unifyTypesTestCaseRight = field_right,
-      Testing.unifyTypesTestCaseExpected = field_expected}))))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.UnifyTypesTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-joinTypesTestCase :: (Graph.Graph -> Core.Term -> Either Util_.DecodingError Testing.JoinTypesTestCase)
-joinTypesTestCase cx raw = (Eithers.either (\err -> Left (Util_.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "left" Core_.type_ fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" Core_.type_ fieldMap cx) (\field_right -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither Helpers.decodeUnit (Helpers.decodeList Typing.typeConstraint)) fieldMap cx) (\field_expected -> Right (Testing.JoinTypesTestCase {
-      Testing.joinTypesTestCaseLeft = field_left,
-      Testing.joinTypesTestCaseRight = field_right,
-      Testing.joinTypesTestCaseExpected = field_expected})))))
-  _ -> (Left (Util_.DecodingError "expected record of type hydra.testing.JoinTypesTestCase"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+import qualified Hydra.Decode.Error.Core as Core__
+import qualified Hydra.Decode.Json.Model as Model
+import qualified Hydra.Decode.Parsing as Parsing
+import qualified Hydra.Decode.Typing as Typing
+import qualified Hydra.Decode.Util as Util
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Helpers as Helpers
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Json.Model as Model_
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+alphaConversionTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.AlphaConversionTestCase
+alphaConversionTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "oldVariable" Core_.name fieldMap cx) (\field_oldVariable -> Eithers.bind (Helpers.requireField "newVariable" Core_.name fieldMap cx) (\field_newVariable -> Eithers.bind (Helpers.requireField "result" Core_.term fieldMap cx) (\field_result -> Right (Testing.AlphaConversionTestCase {
+          Testing.alphaConversionTestCaseTerm = field_term,
+          Testing.alphaConversionTestCaseOldVariable = field_oldVariable,
+          Testing.alphaConversionTestCaseNewVariable = field_newVariable,
+          Testing.alphaConversionTestCaseResult = field_result}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+caseConversionTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.CaseConversionTestCase
+caseConversionTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "fromConvention" Util.caseConvention fieldMap cx) (\field_fromConvention -> Eithers.bind (Helpers.requireField "toConvention" Util.caseConvention fieldMap cx) (\field_toConvention -> Eithers.bind (Helpers.requireField "fromString" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_fromString -> Eithers.bind (Helpers.requireField "toString" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_toString -> Right (Testing.CaseConversionTestCase {
+          Testing.caseConversionTestCaseFromConvention = field_fromConvention,
+          Testing.caseConversionTestCaseToConvention = field_toConvention,
+          Testing.caseConversionTestCaseFromString = field_fromString,
+          Testing.caseConversionTestCaseToString = field_toString}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+deannotateTermTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.DeannotateTermTestCase
+deannotateTermTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.DeannotateTermTestCase {
+          Testing.deannotateTermTestCaseInput = field_input,
+          Testing.deannotateTermTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+deannotateTypeTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.DeannotateTypeTestCase
+deannotateTypeTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.type_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.type_ fieldMap cx) (\field_output -> Right (Testing.DeannotateTypeTestCase {
+          Testing.deannotateTypeTestCaseInput = field_input,
+          Testing.deannotateTypeTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+delegatedEvaluationTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.DelegatedEvaluationTestCase
+delegatedEvaluationTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.DelegatedEvaluationTestCase {
+          Testing.delegatedEvaluationTestCaseInput = field_input,
+          Testing.delegatedEvaluationTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+etaExpansionTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.EtaExpansionTestCase
+etaExpansionTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.EtaExpansionTestCase {
+          Testing.etaExpansionTestCaseInput = field_input,
+          Testing.etaExpansionTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+evaluationStyle :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.EvaluationStyle
+evaluationStyle cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "eager", (\input -> Eithers.map (\t -> Testing.EvaluationStyleEager) (Helpers.decodeUnit cx input))),
+                      (Core.Name "lazy", (\input -> Eithers.map (\t -> Testing.EvaluationStyleLazy) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+evaluationTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.EvaluationTestCase
+evaluationTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "evaluationStyle" evaluationStyle fieldMap cx) (\field_evaluationStyle -> Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.EvaluationTestCase {
+          Testing.evaluationTestCaseEvaluationStyle = field_evaluationStyle,
+          Testing.evaluationTestCaseInput = field_input,
+          Testing.evaluationTestCaseOutput = field_output})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+flattenLetTermsTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.FlattenLetTermsTestCase
+flattenLetTermsTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.FlattenLetTermsTestCase {
+          Testing.flattenLetTermsTestCaseInput = field_input,
+          Testing.flattenLetTermsTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+foldOperation :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.FoldOperation
+foldOperation cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "sumInt32Literals", (\input -> Eithers.map (\t -> Testing.FoldOperationSumInt32Literals) (Helpers.decodeUnit cx input))),
+                      (Core.Name "collectListLengths", (\input -> Eithers.map (\t -> Testing.FoldOperationCollectListLengths) (Helpers.decodeUnit cx input))),
+                      (Core.Name "collectLabels", (\input -> Eithers.map (\t -> Testing.FoldOperationCollectLabels) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+foldOverTermTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.FoldOverTermTestCase
+foldOverTermTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "traversalOrder" Coders.traversalOrder fieldMap cx) (\field_traversalOrder -> Eithers.bind (Helpers.requireField "operation" foldOperation fieldMap cx) (\field_operation -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.FoldOverTermTestCase {
+          Testing.foldOverTermTestCaseInput = field_input,
+          Testing.foldOverTermTestCaseTraversalOrder = field_traversalOrder,
+          Testing.foldOverTermTestCaseOperation = field_operation,
+          Testing.foldOverTermTestCaseOutput = field_output}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+freeVariablesTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.FreeVariablesTestCase
+freeVariablesTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (Helpers.decodeSet Core_.name) fieldMap cx) (\field_output -> Right (Testing.FreeVariablesTestCase {
+          Testing.freeVariablesTestCaseInput = field_input,
+          Testing.freeVariablesTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+hoistCaseStatementsTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.HoistCaseStatementsTestCase
+hoistCaseStatementsTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.HoistCaseStatementsTestCase {
+          Testing.hoistCaseStatementsTestCaseInput = field_input,
+          Testing.hoistCaseStatementsTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+hoistLetBindingsTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.HoistLetBindingsTestCase
+hoistLetBindingsTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.let_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.let_ fieldMap cx) (\field_output -> Right (Testing.HoistLetBindingsTestCase {
+          Testing.hoistLetBindingsTestCaseInput = field_input,
+          Testing.hoistLetBindingsTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+hoistPolymorphicLetBindingsTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.HoistPolymorphicLetBindingsTestCase
+hoistPolymorphicLetBindingsTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.let_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.let_ fieldMap cx) (\field_output -> Right (Testing.HoistPolymorphicLetBindingsTestCase {
+          Testing.hoistPolymorphicLetBindingsTestCaseInput = field_input,
+          Testing.hoistPolymorphicLetBindingsTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+hoistPredicate :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.HoistPredicate
+hoistPredicate cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "caseStatements", (\input -> Eithers.map (\t -> Testing.HoistPredicateCaseStatements) (Helpers.decodeUnit cx input))),
+                      (Core.Name "applications", (\input -> Eithers.map (\t -> Testing.HoistPredicateApplications) (Helpers.decodeUnit cx input))),
+                      (Core.Name "lists", (\input -> Eithers.map (\t -> Testing.HoistPredicateLists) (Helpers.decodeUnit cx input))),
+                      (Core.Name "nothing", (\input -> Eithers.map (\t -> Testing.HoistPredicateNothing) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+hoistSubtermsTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.HoistSubtermsTestCase
+hoistSubtermsTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "predicate" hoistPredicate fieldMap cx) (\field_predicate -> Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.HoistSubtermsTestCase {
+          Testing.hoistSubtermsTestCasePredicate = field_predicate,
+          Testing.hoistSubtermsTestCaseInput = field_input,
+          Testing.hoistSubtermsTestCaseOutput = field_output})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+inferenceFailureTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.InferenceFailureTestCase
+inferenceFailureTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Right (Testing.InferenceFailureTestCase {
+          Testing.inferenceFailureTestCaseInput = field_input})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+inferenceTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.InferenceTestCase
+inferenceTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.typeScheme fieldMap cx) (\field_output -> Right (Testing.InferenceTestCase {
+          Testing.inferenceTestCaseInput = field_input,
+          Testing.inferenceTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+joinTypesTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.JoinTypesTestCase
+joinTypesTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "left" Core_.type_ fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" Core_.type_ fieldMap cx) (\field_right -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither Helpers.decodeUnit (Helpers.decodeList Typing.typeConstraint)) fieldMap cx) (\field_expected -> Right (Testing.JoinTypesTestCase {
+          Testing.joinTypesTestCaseLeft = field_left,
+          Testing.joinTypesTestCaseRight = field_right,
+          Testing.joinTypesTestCaseExpected = field_expected})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+jsonDecodeTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.JsonDecodeTestCase
+jsonDecodeTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "json" Model.value fieldMap cx) (\field_json -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) Core_.term) fieldMap cx) (\field_expected -> Right (Testing.JsonDecodeTestCase {
+          Testing.jsonDecodeTestCaseType = field_type,
+          Testing.jsonDecodeTestCaseJson = field_json,
+          Testing.jsonDecodeTestCaseExpected = field_expected})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+jsonEncodeTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.JsonEncodeTestCase
+jsonEncodeTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) Model.value) fieldMap cx) (\field_expected -> Right (Testing.JsonEncodeTestCase {
+          Testing.jsonEncodeTestCaseTerm = field_term,
+          Testing.jsonEncodeTestCaseExpected = field_expected}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+jsonParserTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError (Testing.ParserTestCase Model_.Value)
+jsonParserTestCase = parserTestCase Model.value
+
+jsonRoundtripTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.JsonRoundtripTestCase
+jsonRoundtripTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Right (Testing.JsonRoundtripTestCase {
+          Testing.jsonRoundtripTestCaseType = field_type,
+          Testing.jsonRoundtripTestCaseTerm = field_term}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+jsonWriterTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError (Testing.WriterTestCase Model_.Value)
+jsonWriterTestCase = writerTestCase Model.value
+
+liftLambdaAboveLetTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.LiftLambdaAboveLetTestCase
+liftLambdaAboveLetTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.LiftLambdaAboveLetTestCase {
+          Testing.liftLambdaAboveLetTestCaseInput = field_input,
+          Testing.liftLambdaAboveLetTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+normalizeTypeVariablesTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.NormalizeTypeVariablesTestCase
+normalizeTypeVariablesTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.NormalizeTypeVariablesTestCase {
+          Testing.normalizeTypeVariablesTestCaseInput = field_input,
+          Testing.normalizeTypeVariablesTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+parserTestCase :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Testing.ParserTestCase t0)
+parserTestCase a cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (Parsing.parseResult a) fieldMap cx) (\field_output -> Right (Testing.ParserTestCase {
+          Testing.parserTestCaseInput = field_input,
+          Testing.parserTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+rewriteTermTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.RewriteTermTestCase
+rewriteTermTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "rewriter" termRewriter fieldMap cx) (\field_rewriter -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.RewriteTermTestCase {
+          Testing.rewriteTermTestCaseInput = field_input,
+          Testing.rewriteTermTestCaseRewriter = field_rewriter,
+          Testing.rewriteTermTestCaseOutput = field_output})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+rewriteTypeTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.RewriteTypeTestCase
+rewriteTypeTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.type_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "rewriter" typeRewriter fieldMap cx) (\field_rewriter -> Eithers.bind (Helpers.requireField "output" Core_.type_ fieldMap cx) (\field_output -> Right (Testing.RewriteTypeTestCase {
+          Testing.rewriteTypeTestCaseInput = field_input,
+          Testing.rewriteTypeTestCaseRewriter = field_rewriter,
+          Testing.rewriteTypeTestCaseOutput = field_output})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+serializationTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.SerializationTestCase
+serializationTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Ast.expr fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_output -> Right (Testing.SerializationTestCase {
+          Testing.serializationTestCaseInput = field_input,
+          Testing.serializationTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+simplifyTermTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.SimplifyTermTestCase
+simplifyTermTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.SimplifyTermTestCase {
+          Testing.simplifyTermTestCaseInput = field_input,
+          Testing.simplifyTermTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+substInTypeTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.SubstInTypeTestCase
+substInTypeTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "substitution" (Helpers.decodeList (Helpers.decodePair Core_.name Core_.type_)) fieldMap cx) (\field_substitution -> Eithers.bind (Helpers.requireField "input" Core_.type_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.type_ fieldMap cx) (\field_output -> Right (Testing.SubstInTypeTestCase {
+          Testing.substInTypeTestCaseSubstitution = field_substitution,
+          Testing.substInTypeTestCaseInput = field_input,
+          Testing.substInTypeTestCaseOutput = field_output})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+tag :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.Tag
+tag cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Testing.Tag b) ((\raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+        Core.TermLiteral v1 -> case v1 of
+          Core.LiteralString v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected string literal")
+        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+termRewriter :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TermRewriter
+termRewriter cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "replaceFooWithBar", (\input -> Eithers.map (\t -> Testing.TermRewriterReplaceFooWithBar) (Helpers.decodeUnit cx input))),
+                      (Core.Name "replaceInt32WithInt64", (\input -> Eithers.map (\t -> Testing.TermRewriterReplaceInt32WithInt64) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+testCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TestCase
+testCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "alphaConversion", (\input -> Eithers.map (\t -> Testing.TestCaseAlphaConversion t) (alphaConversionTestCase cx input))),
+                      (Core.Name "caseConversion", (\input -> Eithers.map (\t -> Testing.TestCaseCaseConversion t) (caseConversionTestCase cx input))),
+                      (Core.Name "deannotateTerm", (\input -> Eithers.map (\t -> Testing.TestCaseDeannotateTerm t) (deannotateTermTestCase cx input))),
+                      (Core.Name "deannotateType", (\input -> Eithers.map (\t -> Testing.TestCaseDeannotateType t) (deannotateTypeTestCase cx input))),
+                      (Core.Name "delegatedEvaluation", (\input -> Eithers.map (\t -> Testing.TestCaseDelegatedEvaluation t) (delegatedEvaluationTestCase cx input))),
+                      (Core.Name "etaExpansion", (\input -> Eithers.map (\t -> Testing.TestCaseEtaExpansion t) (etaExpansionTestCase cx input))),
+                      (Core.Name "flattenLetTerms", (\input -> Eithers.map (\t -> Testing.TestCaseFlattenLetTerms t) (flattenLetTermsTestCase cx input))),
+                      (Core.Name "freeVariables", (\input -> Eithers.map (\t -> Testing.TestCaseFreeVariables t) (freeVariablesTestCase cx input))),
+                      (Core.Name "evaluation", (\input -> Eithers.map (\t -> Testing.TestCaseEvaluation t) (evaluationTestCase cx input))),
+                      (Core.Name "inference", (\input -> Eithers.map (\t -> Testing.TestCaseInference t) (inferenceTestCase cx input))),
+                      (Core.Name "inferenceFailure", (\input -> Eithers.map (\t -> Testing.TestCaseInferenceFailure t) (inferenceFailureTestCase cx input))),
+                      (Core.Name "jsonDecode", (\input -> Eithers.map (\t -> Testing.TestCaseJsonDecode t) (jsonDecodeTestCase cx input))),
+                      (Core.Name "jsonEncode", (\input -> Eithers.map (\t -> Testing.TestCaseJsonEncode t) (jsonEncodeTestCase cx input))),
+                      (Core.Name "jsonParser", (\input -> Eithers.map (\t -> Testing.TestCaseJsonParser t) (jsonParserTestCase cx input))),
+                      (Core.Name "jsonRoundtrip", (\input -> Eithers.map (\t -> Testing.TestCaseJsonRoundtrip t) (jsonRoundtripTestCase cx input))),
+                      (Core.Name "jsonWriter", (\input -> Eithers.map (\t -> Testing.TestCaseJsonWriter t) (jsonWriterTestCase cx input))),
+                      (Core.Name "liftLambdaAboveLet", (\input -> Eithers.map (\t -> Testing.TestCaseLiftLambdaAboveLet t) (liftLambdaAboveLetTestCase cx input))),
+                      (Core.Name "serialization", (\input -> Eithers.map (\t -> Testing.TestCaseSerialization t) (serializationTestCase cx input))),
+                      (Core.Name "simplifyTerm", (\input -> Eithers.map (\t -> Testing.TestCaseSimplifyTerm t) (simplifyTermTestCase cx input))),
+                      (Core.Name "topologicalSort", (\input -> Eithers.map (\t -> Testing.TestCaseTopologicalSort t) (topologicalSortTestCase cx input))),
+                      (Core.Name "topologicalSortBindings", (\input -> Eithers.map (\t -> Testing.TestCaseTopologicalSortBindings t) (topologicalSortBindingsTestCase cx input))),
+                      (Core.Name "topologicalSortSCC", (\input -> Eithers.map (\t -> Testing.TestCaseTopologicalSortSCC t) (topologicalSortSCCTestCase cx input))),
+                      (Core.Name "typeChecking", (\input -> Eithers.map (\t -> Testing.TestCaseTypeChecking t) (typeCheckingTestCase cx input))),
+                      (Core.Name "typeCheckingFailure", (\input -> Eithers.map (\t -> Testing.TestCaseTypeCheckingFailure t) (typeCheckingFailureTestCase cx input))),
+                      (Core.Name "typeReduction", (\input -> Eithers.map (\t -> Testing.TestCaseTypeReduction t) (typeReductionTestCase cx input))),
+                      (Core.Name "normalizeTypeVariables", (\input -> Eithers.map (\t -> Testing.TestCaseNormalizeTypeVariables t) (normalizeTypeVariablesTestCase cx input))),
+                      (Core.Name "foldOverTerm", (\input -> Eithers.map (\t -> Testing.TestCaseFoldOverTerm t) (foldOverTermTestCase cx input))),
+                      (Core.Name "rewriteTerm", (\input -> Eithers.map (\t -> Testing.TestCaseRewriteTerm t) (rewriteTermTestCase cx input))),
+                      (Core.Name "rewriteType", (\input -> Eithers.map (\t -> Testing.TestCaseRewriteType t) (rewriteTypeTestCase cx input))),
+                      (Core.Name "hoistSubterms", (\input -> Eithers.map (\t -> Testing.TestCaseHoistSubterms t) (hoistSubtermsTestCase cx input))),
+                      (Core.Name "hoistCaseStatements", (\input -> Eithers.map (\t -> Testing.TestCaseHoistCaseStatements t) (hoistCaseStatementsTestCase cx input))),
+                      (Core.Name "hoistLetBindings", (\input -> Eithers.map (\t -> Testing.TestCaseHoistLetBindings t) (hoistLetBindingsTestCase cx input))),
+                      (Core.Name "hoistPolymorphicLetBindings", (\input -> Eithers.map (\t -> Testing.TestCaseHoistPolymorphicLetBindings t) (hoistPolymorphicLetBindingsTestCase cx input))),
+                      (Core.Name "substInType", (\input -> Eithers.map (\t -> Testing.TestCaseSubstInType t) (substInTypeTestCase cx input))),
+                      (Core.Name "variableOccursInType", (\input -> Eithers.map (\t -> Testing.TestCaseVariableOccursInType t) (variableOccursInTypeTestCase cx input))),
+                      (Core.Name "unifyTypes", (\input -> Eithers.map (\t -> Testing.TestCaseUnifyTypes t) (unifyTypesTestCase cx input))),
+                      (Core.Name "joinTypes", (\input -> Eithers.map (\t -> Testing.TestCaseJoinTypes t) (joinTypesTestCase cx input))),
+                      (Core.Name "unshadowVariables", (\input -> Eithers.map (\t -> Testing.TestCaseUnshadowVariables t) (unshadowVariablesTestCase cx input))),
+                      (Core.Name "validateCoreTerm", (\input -> Eithers.map (\t -> Testing.TestCaseValidateCoreTerm t) (validateCoreTermTestCase cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+testCaseWithMetadata :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TestCaseWithMetadata
+testCaseWithMetadata cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "case" testCase fieldMap cx) (\field_case -> Eithers.bind (Helpers.requireField "description" (Helpers.decodeMaybe (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_description -> Eithers.bind (Helpers.requireField "tags" (Helpers.decodeList tag) fieldMap cx) (\field_tags -> Right (Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = field_name,
+          Testing.testCaseWithMetadataCase = field_case,
+          Testing.testCaseWithMetadataDescription = field_description,
+          Testing.testCaseWithMetadataTags = field_tags}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+testGroup :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TestGroup
+testGroup cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "name" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "description" (Helpers.decodeMaybe (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_description -> Eithers.bind (Helpers.requireField "subgroups" (Helpers.decodeList testGroup) fieldMap cx) (\field_subgroups -> Eithers.bind (Helpers.requireField "cases" (Helpers.decodeList testCaseWithMetadata) fieldMap cx) (\field_cases -> Right (Testing.TestGroup {
+          Testing.testGroupName = field_name,
+          Testing.testGroupDescription = field_description,
+          Testing.testGroupSubgroups = field_subgroups,
+          Testing.testGroupCases = field_cases}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+topologicalSortBindingsTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TopologicalSortBindingsTestCase
+topologicalSortBindingsTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "bindings" (Helpers.decodeList (Helpers.decodePair Core_.name Core_.term)) fieldMap cx) (\field_bindings -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeList (Helpers.decodeList (Helpers.decodePair Core_.name Core_.term))) fieldMap cx) (\field_expected -> Right (Testing.TopologicalSortBindingsTestCase {
+          Testing.topologicalSortBindingsTestCaseBindings = field_bindings,
+          Testing.topologicalSortBindingsTestCaseExpected = field_expected}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+topologicalSortSCCTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TopologicalSortSCCTestCase
+topologicalSortSCCTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "adjacencyList" (Helpers.decodeList (Helpers.decodePair (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))))) fieldMap cx) (\field_adjacencyList -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeList (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)))) fieldMap cx) (\field_expected -> Right (Testing.TopologicalSortSCCTestCase {
+          Testing.topologicalSortSCCTestCaseAdjacencyList = field_adjacencyList,
+          Testing.topologicalSortSCCTestCaseExpected = field_expected}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+topologicalSortTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TopologicalSortTestCase
+topologicalSortTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "adjacencyList" (Helpers.decodeList (Helpers.decodePair (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))))) fieldMap cx) (\field_adjacencyList -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither (Helpers.decodeList (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)))) (Helpers.decodeList (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)))) fieldMap cx) (\field_expected -> Right (Testing.TopologicalSortTestCase {
+          Testing.topologicalSortTestCaseAdjacencyList = field_adjacencyList,
+          Testing.topologicalSortTestCaseExpected = field_expected}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeCheckingFailureTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TypeCheckingFailureTestCase
+typeCheckingFailureTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Right (Testing.TypeCheckingFailureTestCase {
+          Testing.typeCheckingFailureTestCaseInput = field_input})))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeCheckingTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TypeCheckingTestCase
+typeCheckingTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "outputTerm" Core_.term fieldMap cx) (\field_outputTerm -> Eithers.bind (Helpers.requireField "outputType" Core_.type_ fieldMap cx) (\field_outputType -> Right (Testing.TypeCheckingTestCase {
+          Testing.typeCheckingTestCaseInput = field_input,
+          Testing.typeCheckingTestCaseOutputTerm = field_outputTerm,
+          Testing.typeCheckingTestCaseOutputType = field_outputType})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeReductionTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TypeReductionTestCase
+typeReductionTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.type_ fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.type_ fieldMap cx) (\field_output -> Right (Testing.TypeReductionTestCase {
+          Testing.typeReductionTestCaseInput = field_input,
+          Testing.typeReductionTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+typeRewriter :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.TypeRewriter
+typeRewriter cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "replaceStringWithInt32", (\input -> Eithers.map (\t -> Testing.TypeRewriterReplaceStringWithInt32) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unifyTypesTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.UnifyTypesTestCase
+unifyTypesTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "schemaTypes" (Helpers.decodeList Core_.name) fieldMap cx) (\field_schemaTypes -> Eithers.bind (Helpers.requireField "left" Core_.type_ fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" Core_.type_ fieldMap cx) (\field_right -> Eithers.bind (Helpers.requireField "expected" (Helpers.decodeEither (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) Typing.typeSubst) fieldMap cx) (\field_expected -> Right (Testing.UnifyTypesTestCase {
+          Testing.unifyTypesTestCaseSchemaTypes = field_schemaTypes,
+          Testing.unifyTypesTestCaseLeft = field_left,
+          Testing.unifyTypesTestCaseRight = field_right,
+          Testing.unifyTypesTestCaseExpected = field_expected}))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+unshadowVariablesTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.UnshadowVariablesTestCase
+unshadowVariablesTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" Core_.term fieldMap cx) (\field_output -> Right (Testing.UnshadowVariablesTestCase {
+          Testing.unshadowVariablesTestCaseInput = field_input,
+          Testing.unshadowVariablesTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+validateCoreTermTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.ValidateCoreTermTestCase
+validateCoreTermTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "typed" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralBoolean v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected boolean literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_typed -> Eithers.bind (Helpers.requireField "input" Core_.term fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (Helpers.decodeMaybe Core__.invalidTermError) fieldMap cx) (\field_output -> Right (Testing.ValidateCoreTermTestCase {
+          Testing.validateCoreTermTestCaseTyped = field_typed,
+          Testing.validateCoreTermTestCaseInput = field_input,
+          Testing.validateCoreTermTestCaseOutput = field_output})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+variableOccursInTypeTestCase :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Testing.VariableOccursInTypeTestCase
+variableOccursInTypeTestCase cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "variable" Core_.name fieldMap cx) (\field_variable -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "expected" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralBoolean v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected boolean literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_expected -> Right (Testing.VariableOccursInTypeTestCase {
+          Testing.variableOccursInTypeTestCaseVariable = field_variable,
+          Testing.variableOccursInTypeTestCaseType = field_type,
+          Testing.variableOccursInTypeTestCaseExpected = field_expected})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
+
+writerTestCase :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Testing.WriterTestCase t0)
+writerTestCase a cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "input" a fieldMap cx) (\field_input -> Eithers.bind (Helpers.requireField "output" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_output -> Right (Testing.WriterTestCase {
+          Testing.writerTestCaseInput = field_input,
+          Testing.writerTestCaseOutput = field_output}))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Topology.hs b/src/gen-main/haskell/Hydra/Decode/Topology.hs
--- a/src/gen-main/haskell/Hydra/Decode/Topology.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Topology.hs
@@ -5,12 +5,12 @@
 module Hydra.Decode.Topology where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Topology as Topology
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -18,45 +18,47 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-graph :: (Graph.Graph -> Core.Term -> Either Util.DecodingError (M.Map Int [Int]))
-graph = (Helpers.decodeMap vertex (Helpers.decodeList vertex))
+graph :: Graph.Graph -> Core.Term -> Either Errors.DecodingError (M.Map Int [Int])
+graph = Helpers.decodeMap vertex (Helpers.decodeList vertex)
 
-tarjanState :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Topology.TarjanState)
-tarjanState cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "counter" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_counter -> Eithers.bind (Helpers.requireField "indices" (Helpers.decodeMap vertex (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_indices -> Eithers.bind (Helpers.requireField "lowLinks" (Helpers.decodeMap vertex (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralInteger v3 -> ((\x -> case x of
-          Core.IntegerValueInt32 v4 -> (Right v4)
-          _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-        _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_lowLinks -> Eithers.bind (Helpers.requireField "stack" (Helpers.decodeList vertex) fieldMap cx) (\field_stack -> Eithers.bind (Helpers.requireField "onStack" (Helpers.decodeSet vertex) fieldMap cx) (\field_onStack -> Eithers.bind (Helpers.requireField "sccs" (Helpers.decodeList (Helpers.decodeList vertex)) fieldMap cx) (\field_sccs -> Right (Topology.TarjanState {
-      Topology.tarjanStateCounter = field_counter,
-      Topology.tarjanStateIndices = field_indices,
-      Topology.tarjanStateLowLinks = field_lowLinks,
-      Topology.tarjanStateStack = field_stack,
-      Topology.tarjanStateOnStack = field_onStack,
-      Topology.tarjanStateSccs = field_sccs}))))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.topology.TarjanState"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+tarjanState :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Topology.TarjanState
+tarjanState cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "counter" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_counter -> Eithers.bind (Helpers.requireField "indices" (Helpers.decodeMap vertex (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_indices -> Eithers.bind (Helpers.requireField "lowLinks" (Helpers.decodeMap vertex (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralInteger v2 -> case v2 of
+              Core.IntegerValueInt32 v3 -> Right v3
+              _ -> Left (Errors.DecodingError "expected int32 value")
+            _ -> Left (Errors.DecodingError "expected int32 literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw))) fieldMap cx) (\field_lowLinks -> Eithers.bind (Helpers.requireField "stack" (Helpers.decodeList vertex) fieldMap cx) (\field_stack -> Eithers.bind (Helpers.requireField "onStack" (Helpers.decodeSet vertex) fieldMap cx) (\field_onStack -> Eithers.bind (Helpers.requireField "sccs" (Helpers.decodeList (Helpers.decodeList vertex)) fieldMap cx) (\field_sccs -> Right (Topology.TarjanState {
+          Topology.tarjanStateCounter = field_counter,
+          Topology.tarjanStateIndices = field_indices,
+          Topology.tarjanStateLowLinks = field_lowLinks,
+          Topology.tarjanStateStack = field_stack,
+          Topology.tarjanStateOnStack = field_onStack,
+          Topology.tarjanStateSccs = field_sccs}))))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-vertex :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Int)
-vertex cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermLiteral v1 -> ((\x -> case x of
-    Core.LiteralInteger v2 -> ((\x -> case x of
-      Core.IntegerValueInt32 v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected int32 value"))) v2)
-    _ -> (Left (Util.DecodingError "expected int32 literal"))) v1)
-  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+vertex :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Int
+vertex cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermLiteral v0 -> case v0 of
+        Core.LiteralInteger v1 -> case v1 of
+          Core.IntegerValueInt32 v2 -> Right v2
+          _ -> Left (Errors.DecodingError "expected int32 value")
+        _ -> Left (Errors.DecodingError "expected int32 literal")
+      _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Typing.hs b/src/gen-main/haskell/Hydra/Decode/Typing.hs
--- a/src/gen-main/haskell/Hydra/Decode/Typing.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Typing.hs
@@ -5,13 +5,14 @@
 module Hydra.Decode.Typing where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Context as Context
 import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Typing as Typing
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -19,80 +20,57 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-functionStructure :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Typing.FunctionStructure t0))
-functionStructure env cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "typeParams" (Helpers.decodeList Core_.name) fieldMap cx) (\field_typeParams -> Eithers.bind (Helpers.requireField "params" (Helpers.decodeList Core_.name) fieldMap cx) (\field_params -> Eithers.bind (Helpers.requireField "bindings" (Helpers.decodeList Core_.binding) fieldMap cx) (\field_bindings -> Eithers.bind (Helpers.requireField "body" Core_.term fieldMap cx) (\field_body -> Eithers.bind (Helpers.requireField "domains" (Helpers.decodeList Core_.type_) fieldMap cx) (\field_domains -> Eithers.bind (Helpers.requireField "codomain" (Helpers.decodeMaybe Core_.type_) fieldMap cx) (\field_codomain -> Eithers.bind (Helpers.requireField "environment" env fieldMap cx) (\field_environment -> Right (Typing.FunctionStructure {
-      Typing.functionStructureTypeParams = field_typeParams,
-      Typing.functionStructureParams = field_params,
-      Typing.functionStructureBindings = field_bindings,
-      Typing.functionStructureBody = field_body,
-      Typing.functionStructureDomains = field_domains,
-      Typing.functionStructureCodomain = field_codomain,
-      Typing.functionStructureEnvironment = field_environment})))))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.typing.FunctionStructure"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-inferenceContext :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Typing.InferenceContext)
-inferenceContext cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "schemaTypes" (Helpers.decodeMap Core_.name Core_.typeScheme) fieldMap cx) (\field_schemaTypes -> Eithers.bind (Helpers.requireField "primitiveTypes" (Helpers.decodeMap Core_.name Core_.typeScheme) fieldMap cx) (\field_primitiveTypes -> Eithers.bind (Helpers.requireField "dataTypes" (Helpers.decodeMap Core_.name Core_.typeScheme) fieldMap cx) (\field_dataTypes -> Eithers.bind (Helpers.requireField "classConstraints" (Helpers.decodeMap Core_.name Core_.typeVariableMetadata) fieldMap cx) (\field_classConstraints -> Eithers.bind (Helpers.requireField "debug" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralBoolean v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected boolean literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_debug -> Right (Typing.InferenceContext {
-      Typing.inferenceContextSchemaTypes = field_schemaTypes,
-      Typing.inferenceContextPrimitiveTypes = field_primitiveTypes,
-      Typing.inferenceContextDataTypes = field_dataTypes,
-      Typing.inferenceContextClassConstraints = field_classConstraints,
-      Typing.inferenceContextDebug = field_debug})))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.typing.InferenceContext"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-inferenceResult :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Typing.InferenceResult)
-inferenceResult cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "subst" typeSubst fieldMap cx) (\field_subst -> Eithers.bind (Helpers.requireField "classConstraints" (Helpers.decodeMap Core_.name Core_.typeVariableMetadata) fieldMap cx) (\field_classConstraints -> Right (Typing.InferenceResult {
-      Typing.inferenceResultTerm = field_term,
-      Typing.inferenceResultType = field_type,
-      Typing.inferenceResultSubst = field_subst,
-      Typing.inferenceResultClassConstraints = field_classConstraints}))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.typing.InferenceResult"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+functionStructure :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Typing.FunctionStructure t0)
+functionStructure env cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "typeParams" (Helpers.decodeList Core_.name) fieldMap cx) (\field_typeParams -> Eithers.bind (Helpers.requireField "params" (Helpers.decodeList Core_.name) fieldMap cx) (\field_params -> Eithers.bind (Helpers.requireField "bindings" (Helpers.decodeList Core_.binding) fieldMap cx) (\field_bindings -> Eithers.bind (Helpers.requireField "body" Core_.term fieldMap cx) (\field_body -> Eithers.bind (Helpers.requireField "domains" (Helpers.decodeList Core_.type_) fieldMap cx) (\field_domains -> Eithers.bind (Helpers.requireField "codomain" (Helpers.decodeMaybe Core_.type_) fieldMap cx) (\field_codomain -> Eithers.bind (Helpers.requireField "environment" env fieldMap cx) (\field_environment -> Right (Typing.FunctionStructure {
+          Typing.functionStructureTypeParams = field_typeParams,
+          Typing.functionStructureParams = field_params,
+          Typing.functionStructureBindings = field_bindings,
+          Typing.functionStructureBody = field_body,
+          Typing.functionStructureDomains = field_domains,
+          Typing.functionStructureCodomain = field_codomain,
+          Typing.functionStructureEnvironment = field_environment})))))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-termSubst :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Typing.TermSubst)
-termSubst cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Typing.TermSubst b) (Helpers.decodeMap Core_.name Core_.term cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.typing.TermSubst"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+inferenceResult :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Typing.InferenceResult
+inferenceResult cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "term" Core_.term fieldMap cx) (\field_term -> Eithers.bind (Helpers.requireField "type" Core_.type_ fieldMap cx) (\field_type -> Eithers.bind (Helpers.requireField "subst" typeSubst fieldMap cx) (\field_subst -> Eithers.bind (Helpers.requireField "classConstraints" (Helpers.decodeMap Core_.name Core_.typeVariableMetadata) fieldMap cx) (\field_classConstraints -> Eithers.bind (Helpers.requireField "context" Context.context fieldMap cx) (\field_context -> Right (Typing.InferenceResult {
+          Typing.inferenceResultTerm = field_term,
+          Typing.inferenceResultType = field_type,
+          Typing.inferenceResultSubst = field_subst,
+          Typing.inferenceResultClassConstraints = field_classConstraints,
+          Typing.inferenceResultContext = field_context})))))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-typeConstraint :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Typing.TypeConstraint)
-typeConstraint cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "left" Core_.type_ fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" Core_.type_ fieldMap cx) (\field_right -> Eithers.bind (Helpers.requireField "comment" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_comment -> Right (Typing.TypeConstraint {
-      Typing.typeConstraintLeft = field_left,
-      Typing.typeConstraintRight = field_right,
-      Typing.typeConstraintComment = field_comment})))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.typing.TypeConstraint"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+termSubst :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Typing.TermSubst
+termSubst cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Typing.TermSubst b) (Helpers.decodeMap Core_.name Core_.term cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-typeContext :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Typing.TypeContext)
-typeContext cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "types" (Helpers.decodeMap Core_.name Core_.type_) fieldMap cx) (\field_types -> Eithers.bind (Helpers.requireField "metadata" (Helpers.decodeMap Core_.name Core_.term) fieldMap cx) (\field_metadata -> Eithers.bind (Helpers.requireField "typeVariables" (Helpers.decodeSet Core_.name) fieldMap cx) (\field_typeVariables -> Eithers.bind (Helpers.requireField "lambdaVariables" (Helpers.decodeSet Core_.name) fieldMap cx) (\field_lambdaVariables -> Eithers.bind (Helpers.requireField "letVariables" (Helpers.decodeSet Core_.name) fieldMap cx) (\field_letVariables -> Eithers.bind (Helpers.requireField "inferenceContext" inferenceContext fieldMap cx) (\field_inferenceContext -> Right (Typing.TypeContext {
-      Typing.typeContextTypes = field_types,
-      Typing.typeContextMetadata = field_metadata,
-      Typing.typeContextTypeVariables = field_typeVariables,
-      Typing.typeContextLambdaVariables = field_lambdaVariables,
-      Typing.typeContextLetVariables = field_letVariables,
-      Typing.typeContextInferenceContext = field_inferenceContext}))))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.typing.TypeContext"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+typeConstraint :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Typing.TypeConstraint
+typeConstraint cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermRecord v0 ->
+        let fieldMap = Helpers.toFieldMap v0
+        in (Eithers.bind (Helpers.requireField "left" Core_.type_ fieldMap cx) (\field_left -> Eithers.bind (Helpers.requireField "right" Core_.type_ fieldMap cx) (\field_right -> Eithers.bind (Helpers.requireField "comment" (\cx -> \raw -> Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+          Core.TermLiteral v1 -> case v1 of
+            Core.LiteralString v2 -> Right v2
+            _ -> Left (Errors.DecodingError "expected string literal")
+          _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_comment -> Right (Typing.TypeConstraint {
+          Typing.typeConstraintLeft = field_left,
+          Typing.typeConstraintRight = field_right,
+          Typing.typeConstraintComment = field_comment})))))
+      _ -> Left (Errors.DecodingError "expected record")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-typeSubst :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Typing.TypeSubst)
-typeSubst cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Typing.TypeSubst b) (Helpers.decodeMap Core_.name Core_.type_ cx (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.typing.TypeSubst"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+typeSubst :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Typing.TypeSubst
+typeSubst cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> Eithers.map (\b -> Typing.TypeSubst b) (Helpers.decodeMap Core_.name Core_.type_ cx (Core.wrappedTermBody v0))
+      _ -> Left (Errors.DecodingError "expected wrapped type")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Util.hs b/src/gen-main/haskell/Hydra/Decode/Util.hs
--- a/src/gen-main/haskell/Hydra/Decode/Util.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Util.hs
@@ -5,6 +5,7 @@
 module Hydra.Decode.Util where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
@@ -20,71 +21,62 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-caseConvention :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Util.CaseConvention)
-caseConvention cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "camel", (\input -> Eithers.map (\t -> Util.CaseConventionCamel) (Helpers.decodeUnit cx input))),
-                (Core.Name "pascal", (\input -> Eithers.map (\t -> Util.CaseConventionPascal) (Helpers.decodeUnit cx input))),
-                (Core.Name "lowerSnake", (\input -> Eithers.map (\t -> Util.CaseConventionLowerSnake) (Helpers.decodeUnit cx input))),
-                (Core.Name "upperSnake", (\input -> Eithers.map (\t -> Util.CaseConventionUpperSnake) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.util.CaseConvention"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-comparison :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Util.Comparison)
-comparison cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "lessThan", (\input -> Eithers.map (\t -> Util.ComparisonLessThan) (Helpers.decodeUnit cx input))),
-                (Core.Name "equalTo", (\input -> Eithers.map (\t -> Util.ComparisonEqualTo) (Helpers.decodeUnit cx input))),
-                (Core.Name "greaterThan", (\input -> Eithers.map (\t -> Util.ComparisonGreaterThan) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.util.Comparison"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+caseConvention :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Util.CaseConvention
+caseConvention cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "camel", (\input -> Eithers.map (\t -> Util.CaseConventionCamel) (Helpers.decodeUnit cx input))),
+                      (Core.Name "pascal", (\input -> Eithers.map (\t -> Util.CaseConventionPascal) (Helpers.decodeUnit cx input))),
+                      (Core.Name "lowerSnake", (\input -> Eithers.map (\t -> Util.CaseConventionLowerSnake) (Helpers.decodeUnit cx input))),
+                      (Core.Name "upperSnake", (\input -> Eithers.map (\t -> Util.CaseConventionUpperSnake) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-decodingError :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Util.DecodingError)
-decodingError cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (Eithers.map (\b -> Util.DecodingError b) ((\raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-    Core.TermLiteral v2 -> ((\x -> case x of
-      Core.LiteralString v3 -> (Right v3)
-      _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-    _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) (Core.wrappedTermBody v1)))
-  _ -> (Left (Util.DecodingError "expected wrapped type hydra.util.DecodingError"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+comparison :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Util.Comparison
+comparison cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "lessThan", (\input -> Eithers.map (\t -> Util.ComparisonLessThan) (Helpers.decodeUnit cx input))),
+                      (Core.Name "equalTo", (\input -> Eithers.map (\t -> Util.ComparisonEqualTo) (Helpers.decodeUnit cx input))),
+                      (Core.Name "greaterThan", (\input -> Eithers.map (\t -> Util.ComparisonGreaterThan) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-precision :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Util.Precision)
-precision cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "arbitrary", (\input -> Eithers.map (\t -> Util.PrecisionArbitrary) (Helpers.decodeUnit cx input))),
-                (Core.Name "bits", (\input -> Eithers.map (\t -> Util.PrecisionBits t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralInteger v3 -> ((\x -> case x of
-                      Core.IntegerValueInt32 v4 -> (Right v4)
-                      _ -> (Left (Util.DecodingError "expected int32 value"))) v3)
-                    _ -> (Left (Util.DecodingError "expected int32 literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input))))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.util.Precision"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+precision :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Util.Precision
+precision cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "arbitrary", (\input -> Eithers.map (\t -> Util.PrecisionArbitrary) (Helpers.decodeUnit cx input))),
+                      (Core.Name "bits", (\input -> Eithers.map (\t -> Util.PrecisionBits t) (Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+                        Core.TermLiteral v1 -> case v1 of
+                          Core.LiteralInteger v2 -> case v2 of
+                            Core.IntegerValueInt32 v3 -> Right v3
+                            _ -> Left (Errors.DecodingError "expected int32 value")
+                          _ -> Left (Errors.DecodingError "expected int32 literal")
+                        _ -> Left (Errors.DecodingError "expected literal")) (Lexical.stripAndDereferenceTermEither cx input))))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Variants.hs b/src/gen-main/haskell/Hydra/Decode/Variants.hs
--- a/src/gen-main/haskell/Hydra/Decode/Variants.hs
+++ b/src/gen-main/haskell/Hydra/Decode/Variants.hs
@@ -5,6 +5,7 @@
 module Hydra.Decode.Variants where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Helpers as Helpers
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
@@ -12,7 +13,6 @@
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
 import qualified Hydra.Variants as Variants
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -21,122 +21,123 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-eliminationVariant :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Variants.EliminationVariant)
-eliminationVariant cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "record", (\input -> Eithers.map (\t -> Variants.EliminationVariantRecord) (Helpers.decodeUnit cx input))),
-                (Core.Name "union", (\input -> Eithers.map (\t -> Variants.EliminationVariantUnion) (Helpers.decodeUnit cx input))),
-                (Core.Name "wrap", (\input -> Eithers.map (\t -> Variants.EliminationVariantWrap) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.variants.EliminationVariant"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+eliminationVariant :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Variants.EliminationVariant
+eliminationVariant cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "record", (\input -> Eithers.map (\t -> Variants.EliminationVariantRecord) (Helpers.decodeUnit cx input))),
+                      (Core.Name "union", (\input -> Eithers.map (\t -> Variants.EliminationVariantUnion) (Helpers.decodeUnit cx input))),
+                      (Core.Name "wrap", (\input -> Eithers.map (\t -> Variants.EliminationVariantWrap) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-functionVariant :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Variants.FunctionVariant)
-functionVariant cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "elimination", (\input -> Eithers.map (\t -> Variants.FunctionVariantElimination) (Helpers.decodeUnit cx input))),
-                (Core.Name "lambda", (\input -> Eithers.map (\t -> Variants.FunctionVariantLambda) (Helpers.decodeUnit cx input))),
-                (Core.Name "primitive", (\input -> Eithers.map (\t -> Variants.FunctionVariantPrimitive) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.variants.FunctionVariant"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+functionVariant :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Variants.FunctionVariant
+functionVariant cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "elimination", (\input -> Eithers.map (\t -> Variants.FunctionVariantElimination) (Helpers.decodeUnit cx input))),
+                      (Core.Name "lambda", (\input -> Eithers.map (\t -> Variants.FunctionVariantLambda) (Helpers.decodeUnit cx input))),
+                      (Core.Name "primitive", (\input -> Eithers.map (\t -> Variants.FunctionVariantPrimitive) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-literalVariant :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Variants.LiteralVariant)
-literalVariant cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "binary", (\input -> Eithers.map (\t -> Variants.LiteralVariantBinary) (Helpers.decodeUnit cx input))),
-                (Core.Name "boolean", (\input -> Eithers.map (\t -> Variants.LiteralVariantBoolean) (Helpers.decodeUnit cx input))),
-                (Core.Name "float", (\input -> Eithers.map (\t -> Variants.LiteralVariantFloat) (Helpers.decodeUnit cx input))),
-                (Core.Name "integer", (\input -> Eithers.map (\t -> Variants.LiteralVariantInteger) (Helpers.decodeUnit cx input))),
-                (Core.Name "string", (\input -> Eithers.map (\t -> Variants.LiteralVariantString) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.variants.LiteralVariant"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+literalVariant :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Variants.LiteralVariant
+literalVariant cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "binary", (\input -> Eithers.map (\t -> Variants.LiteralVariantBinary) (Helpers.decodeUnit cx input))),
+                      (Core.Name "boolean", (\input -> Eithers.map (\t -> Variants.LiteralVariantBoolean) (Helpers.decodeUnit cx input))),
+                      (Core.Name "float", (\input -> Eithers.map (\t -> Variants.LiteralVariantFloat) (Helpers.decodeUnit cx input))),
+                      (Core.Name "integer", (\input -> Eithers.map (\t -> Variants.LiteralVariantInteger) (Helpers.decodeUnit cx input))),
+                      (Core.Name "string", (\input -> Eithers.map (\t -> Variants.LiteralVariantString) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-termVariant :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Variants.TermVariant)
-termVariant cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "annotated", (\input -> Eithers.map (\t -> Variants.TermVariantAnnotated) (Helpers.decodeUnit cx input))),
-                (Core.Name "application", (\input -> Eithers.map (\t -> Variants.TermVariantApplication) (Helpers.decodeUnit cx input))),
-                (Core.Name "either", (\input -> Eithers.map (\t -> Variants.TermVariantEither) (Helpers.decodeUnit cx input))),
-                (Core.Name "function", (\input -> Eithers.map (\t -> Variants.TermVariantFunction) (Helpers.decodeUnit cx input))),
-                (Core.Name "let", (\input -> Eithers.map (\t -> Variants.TermVariantLet) (Helpers.decodeUnit cx input))),
-                (Core.Name "list", (\input -> Eithers.map (\t -> Variants.TermVariantList) (Helpers.decodeUnit cx input))),
-                (Core.Name "literal", (\input -> Eithers.map (\t -> Variants.TermVariantLiteral) (Helpers.decodeUnit cx input))),
-                (Core.Name "map", (\input -> Eithers.map (\t -> Variants.TermVariantMap) (Helpers.decodeUnit cx input))),
-                (Core.Name "maybe", (\input -> Eithers.map (\t -> Variants.TermVariantMaybe) (Helpers.decodeUnit cx input))),
-                (Core.Name "pair", (\input -> Eithers.map (\t -> Variants.TermVariantPair) (Helpers.decodeUnit cx input))),
-                (Core.Name "record", (\input -> Eithers.map (\t -> Variants.TermVariantRecord) (Helpers.decodeUnit cx input))),
-                (Core.Name "set", (\input -> Eithers.map (\t -> Variants.TermVariantSet) (Helpers.decodeUnit cx input))),
-                (Core.Name "typeApplication", (\input -> Eithers.map (\t -> Variants.TermVariantTypeApplication) (Helpers.decodeUnit cx input))),
-                (Core.Name "typeLambda", (\input -> Eithers.map (\t -> Variants.TermVariantTypeLambda) (Helpers.decodeUnit cx input))),
-                (Core.Name "union", (\input -> Eithers.map (\t -> Variants.TermVariantUnion) (Helpers.decodeUnit cx input))),
-                (Core.Name "unit", (\input -> Eithers.map (\t -> Variants.TermVariantUnit) (Helpers.decodeUnit cx input))),
-                (Core.Name "variable", (\input -> Eithers.map (\t -> Variants.TermVariantVariable) (Helpers.decodeUnit cx input))),
-                (Core.Name "wrap", (\input -> Eithers.map (\t -> Variants.TermVariantWrap) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.variants.TermVariant"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+termVariant :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Variants.TermVariant
+termVariant cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "annotated", (\input -> Eithers.map (\t -> Variants.TermVariantAnnotated) (Helpers.decodeUnit cx input))),
+                      (Core.Name "application", (\input -> Eithers.map (\t -> Variants.TermVariantApplication) (Helpers.decodeUnit cx input))),
+                      (Core.Name "either", (\input -> Eithers.map (\t -> Variants.TermVariantEither) (Helpers.decodeUnit cx input))),
+                      (Core.Name "function", (\input -> Eithers.map (\t -> Variants.TermVariantFunction) (Helpers.decodeUnit cx input))),
+                      (Core.Name "let", (\input -> Eithers.map (\t -> Variants.TermVariantLet) (Helpers.decodeUnit cx input))),
+                      (Core.Name "list", (\input -> Eithers.map (\t -> Variants.TermVariantList) (Helpers.decodeUnit cx input))),
+                      (Core.Name "literal", (\input -> Eithers.map (\t -> Variants.TermVariantLiteral) (Helpers.decodeUnit cx input))),
+                      (Core.Name "map", (\input -> Eithers.map (\t -> Variants.TermVariantMap) (Helpers.decodeUnit cx input))),
+                      (Core.Name "maybe", (\input -> Eithers.map (\t -> Variants.TermVariantMaybe) (Helpers.decodeUnit cx input))),
+                      (Core.Name "pair", (\input -> Eithers.map (\t -> Variants.TermVariantPair) (Helpers.decodeUnit cx input))),
+                      (Core.Name "record", (\input -> Eithers.map (\t -> Variants.TermVariantRecord) (Helpers.decodeUnit cx input))),
+                      (Core.Name "set", (\input -> Eithers.map (\t -> Variants.TermVariantSet) (Helpers.decodeUnit cx input))),
+                      (Core.Name "typeApplication", (\input -> Eithers.map (\t -> Variants.TermVariantTypeApplication) (Helpers.decodeUnit cx input))),
+                      (Core.Name "typeLambda", (\input -> Eithers.map (\t -> Variants.TermVariantTypeLambda) (Helpers.decodeUnit cx input))),
+                      (Core.Name "union", (\input -> Eithers.map (\t -> Variants.TermVariantUnion) (Helpers.decodeUnit cx input))),
+                      (Core.Name "unit", (\input -> Eithers.map (\t -> Variants.TermVariantUnit) (Helpers.decodeUnit cx input))),
+                      (Core.Name "variable", (\input -> Eithers.map (\t -> Variants.TermVariantVariable) (Helpers.decodeUnit cx input))),
+                      (Core.Name "wrap", (\input -> Eithers.map (\t -> Variants.TermVariantWrap) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
 
-typeVariant :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Variants.TypeVariant)
-typeVariant cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "annotated", (\input -> Eithers.map (\t -> Variants.TypeVariantAnnotated) (Helpers.decodeUnit cx input))),
-                (Core.Name "application", (\input -> Eithers.map (\t -> Variants.TypeVariantApplication) (Helpers.decodeUnit cx input))),
-                (Core.Name "either", (\input -> Eithers.map (\t -> Variants.TypeVariantEither) (Helpers.decodeUnit cx input))),
-                (Core.Name "forall", (\input -> Eithers.map (\t -> Variants.TypeVariantForall) (Helpers.decodeUnit cx input))),
-                (Core.Name "function", (\input -> Eithers.map (\t -> Variants.TypeVariantFunction) (Helpers.decodeUnit cx input))),
-                (Core.Name "list", (\input -> Eithers.map (\t -> Variants.TypeVariantList) (Helpers.decodeUnit cx input))),
-                (Core.Name "literal", (\input -> Eithers.map (\t -> Variants.TypeVariantLiteral) (Helpers.decodeUnit cx input))),
-                (Core.Name "map", (\input -> Eithers.map (\t -> Variants.TypeVariantMap) (Helpers.decodeUnit cx input))),
-                (Core.Name "maybe", (\input -> Eithers.map (\t -> Variants.TypeVariantMaybe) (Helpers.decodeUnit cx input))),
-                (Core.Name "pair", (\input -> Eithers.map (\t -> Variants.TypeVariantPair) (Helpers.decodeUnit cx input))),
-                (Core.Name "record", (\input -> Eithers.map (\t -> Variants.TypeVariantRecord) (Helpers.decodeUnit cx input))),
-                (Core.Name "set", (\input -> Eithers.map (\t -> Variants.TypeVariantSet) (Helpers.decodeUnit cx input))),
-                (Core.Name "union", (\input -> Eithers.map (\t -> Variants.TypeVariantUnion) (Helpers.decodeUnit cx input))),
-                (Core.Name "unit", (\input -> Eithers.map (\t -> Variants.TypeVariantUnit) (Helpers.decodeUnit cx input))),
-                (Core.Name "variable", (\input -> Eithers.map (\t -> Variants.TypeVariantVariable) (Helpers.decodeUnit cx input))),
-                (Core.Name "wrap", (\input -> Eithers.map (\t -> Variants.TypeVariantWrap) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.variants.TypeVariant"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
+typeVariant :: Graph.Graph -> Core.Term -> Either Errors.DecodingError Variants.TypeVariant
+typeVariant cx raw =
+    Eithers.either (\err -> Left (Errors.DecodingError err)) (\stripped -> case stripped of
+      Core.TermUnion v0 ->
+        let field = Core.injectionField v0
+            fname = Core.fieldName field
+            fterm = Core.fieldTerm field
+            variantMap =
+                    Maps.fromList [
+                      (Core.Name "annotated", (\input -> Eithers.map (\t -> Variants.TypeVariantAnnotated) (Helpers.decodeUnit cx input))),
+                      (Core.Name "application", (\input -> Eithers.map (\t -> Variants.TypeVariantApplication) (Helpers.decodeUnit cx input))),
+                      (Core.Name "either", (\input -> Eithers.map (\t -> Variants.TypeVariantEither) (Helpers.decodeUnit cx input))),
+                      (Core.Name "forall", (\input -> Eithers.map (\t -> Variants.TypeVariantForall) (Helpers.decodeUnit cx input))),
+                      (Core.Name "function", (\input -> Eithers.map (\t -> Variants.TypeVariantFunction) (Helpers.decodeUnit cx input))),
+                      (Core.Name "list", (\input -> Eithers.map (\t -> Variants.TypeVariantList) (Helpers.decodeUnit cx input))),
+                      (Core.Name "literal", (\input -> Eithers.map (\t -> Variants.TypeVariantLiteral) (Helpers.decodeUnit cx input))),
+                      (Core.Name "map", (\input -> Eithers.map (\t -> Variants.TypeVariantMap) (Helpers.decodeUnit cx input))),
+                      (Core.Name "maybe", (\input -> Eithers.map (\t -> Variants.TypeVariantMaybe) (Helpers.decodeUnit cx input))),
+                      (Core.Name "pair", (\input -> Eithers.map (\t -> Variants.TypeVariantPair) (Helpers.decodeUnit cx input))),
+                      (Core.Name "record", (\input -> Eithers.map (\t -> Variants.TypeVariantRecord) (Helpers.decodeUnit cx input))),
+                      (Core.Name "set", (\input -> Eithers.map (\t -> Variants.TypeVariantSet) (Helpers.decodeUnit cx input))),
+                      (Core.Name "union", (\input -> Eithers.map (\t -> Variants.TypeVariantUnion) (Helpers.decodeUnit cx input))),
+                      (Core.Name "unit", (\input -> Eithers.map (\t -> Variants.TypeVariantUnit) (Helpers.decodeUnit cx input))),
+                      (Core.Name "variable", (\input -> Eithers.map (\t -> Variants.TypeVariantVariable) (Helpers.decodeUnit cx input))),
+                      (Core.Name "void", (\input -> Eithers.map (\t -> Variants.TypeVariantVoid) (Helpers.decodeUnit cx input))),
+                      (Core.Name "wrap", (\input -> Eithers.map (\t -> Variants.TypeVariantWrap) (Helpers.decodeUnit cx input)))]
+        in (Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+          "no such field ",
+          (Core.unName fname),
+          " in union"]))) (\f -> f fterm) (Maps.lookup fname variantMap))
+      _ -> Left (Errors.DecodingError "expected union")) (Lexical.stripAndDereferenceTermEither cx raw)
diff --git a/src/gen-main/haskell/Hydra/Decode/Workflow.hs b/src/gen-main/haskell/Hydra/Decode/Workflow.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Decode/Workflow.hs
+++ /dev/null
@@ -1,78 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term decoders for hydra.workflow
-
-module Hydra.Decode.Workflow where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Decode.Core as Core_
-import qualified Hydra.Decode.Module as Module
-import qualified Hydra.Extract.Helpers as Helpers
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
-import qualified Hydra.Workflow as Workflow
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-hydraSchemaSpec :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Workflow.HydraSchemaSpec)
-hydraSchemaSpec cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "modules" (Helpers.decodeList Module.module_) fieldMap cx) (\field_modules -> Eithers.bind (Helpers.requireField "typeName" Core_.name fieldMap cx) (\field_typeName -> Right (Workflow.HydraSchemaSpec {
-      Workflow.hydraSchemaSpecModules = field_modules,
-      Workflow.hydraSchemaSpecTypeName = field_typeName}))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.workflow.HydraSchemaSpec"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-schemaSpec :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Workflow.SchemaSpec)
-schemaSpec cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermUnion v1 ->  
-    let tname = (Core.injectionTypeName v1) 
-        field = (Core.injectionField v1)
-        fname = (Core.fieldName field)
-        fterm = (Core.fieldTerm field)
-        variantMap = (Maps.fromList [
-                (Core.Name "hydra", (\input -> Eithers.map (\t -> Workflow.SchemaSpecHydra t) (hydraSchemaSpec cx input))),
-                (Core.Name "file", (\input -> Eithers.map (\t -> Workflow.SchemaSpecFile t) (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-                  Core.TermLiteral v2 -> ((\x -> case x of
-                    Core.LiteralString v3 -> (Right v3)
-                    _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-                  _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx input)))),
-                (Core.Name "provided", (\input -> Eithers.map (\t -> Workflow.SchemaSpecProvided) (Helpers.decodeUnit cx input)))])
-    in (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-      "no such field ",
-      (Core.unName fname),
-      " in union type ",
-      (Core.unName tname)]))) (\f -> f fterm) (Maps.lookup fname variantMap))
-  _ -> (Left (Util.DecodingError "expected union of type hydra.workflow.SchemaSpec"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
-
-transformWorkflow :: (Graph.Graph -> Core.Term -> Either Util.DecodingError Workflow.TransformWorkflow)
-transformWorkflow cx raw = (Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-  Core.TermRecord v1 ->  
-    let fieldMap = (Helpers.toFieldMap v1)
-    in (Eithers.bind (Helpers.requireField "name" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_name -> Eithers.bind (Helpers.requireField "schemaSpec" schemaSpec fieldMap cx) (\field_schemaSpec -> Eithers.bind (Helpers.requireField "srcDir" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_srcDir -> Eithers.bind (Helpers.requireField "destDir" (\cx -> \raw -> Eithers.either (\err -> Left (Util.DecodingError err)) (\stripped -> (\x -> case x of
-      Core.TermLiteral v2 -> ((\x -> case x of
-        Core.LiteralString v3 -> (Right v3)
-        _ -> (Left (Util.DecodingError "expected string literal"))) v2)
-      _ -> (Left (Util.DecodingError "expected literal"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw)) fieldMap cx) (\field_destDir -> Right (Workflow.TransformWorkflow {
-      Workflow.transformWorkflowName = field_name,
-      Workflow.transformWorkflowSchemaSpec = field_schemaSpec,
-      Workflow.transformWorkflowSrcDir = field_srcDir,
-      Workflow.transformWorkflowDestDir = field_destDir}))))))
-  _ -> (Left (Util.DecodingError "expected record of type hydra.workflow.TransformWorkflow"))) stripped) (Lexical.stripAndDereferenceTermEither cx raw))
diff --git a/src/gen-main/haskell/Hydra/Decoding.hs b/src/gen-main/haskell/Hydra/Decoding.hs
--- a/src/gen-main/haskell/Hydra/Decoding.hs
+++ b/src/gen-main/haskell/Hydra/Decoding.hs
@@ -5,1531 +5,1655 @@
 module Hydra.Decoding where
 
 import qualified Hydra.Annotations as Annotations
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Decode.Core as Core_
-import qualified Hydra.Extract.Helpers as Helpers
-import qualified Hydra.Formatting as Formatting
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Module as Module
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Names as Names
-import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Util as Util
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Collect forall type variable names from a type
-collectForallVariables :: (Core.Type -> [Core.Name])
-collectForallVariables typ = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (collectForallVariables (Core.annotatedTypeBody v1))
-  Core.TypeForall v1 -> (Lists.cons (Core.forallTypeParameter v1) (collectForallVariables (Core.forallTypeBody v1)))
-  _ -> []) typ)
-
--- | Collect type variables needing Ord constraints (from Set element types)
-collectOrdConstrainedVariables :: (Core.Type -> [Core.Name])
-collectOrdConstrainedVariables typ = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (collectOrdConstrainedVariables (Core.annotatedTypeBody v1))
-  Core.TypeApplication v1 -> (Lists.concat2 (collectOrdConstrainedVariables (Core.applicationTypeFunction v1)) (collectOrdConstrainedVariables (Core.applicationTypeArgument v1)))
-  Core.TypeEither v1 -> (Lists.concat2 (collectOrdConstrainedVariables (Core.eitherTypeLeft v1)) (collectOrdConstrainedVariables (Core.eitherTypeRight v1)))
-  Core.TypeForall v1 -> (collectOrdConstrainedVariables (Core.forallTypeBody v1))
-  Core.TypeList v1 -> (collectOrdConstrainedVariables v1)
-  Core.TypeMap v1 -> (Lists.concat2 (collectOrdConstrainedVariables (Core.mapTypeKeys v1)) (collectOrdConstrainedVariables (Core.mapTypeValues v1)))
-  Core.TypeMaybe v1 -> (collectOrdConstrainedVariables v1)
-  Core.TypePair v1 -> (Lists.concat2 (collectOrdConstrainedVariables (Core.pairTypeFirst v1)) (collectOrdConstrainedVariables (Core.pairTypeSecond v1)))
-  Core.TypeRecord v1 -> (Lists.concat (Lists.map (\ft -> collectOrdConstrainedVariables (Core.fieldTypeType ft)) (Core.rowTypeFields v1)))
-  Core.TypeSet v1 -> (Lists.concat2 (collectTypeVariablesFromType v1) (collectOrdConstrainedVariables v1))
-  Core.TypeUnion v1 -> (Lists.concat (Lists.map (\ft -> collectOrdConstrainedVariables (Core.fieldTypeType ft)) (Core.rowTypeFields v1)))
-  Core.TypeWrap v1 -> (collectOrdConstrainedVariables (Core.wrappedTypeBody v1))
-  _ -> []) typ)
-
--- | Collect type variable names from a type (forall parameters only)
-collectTypeVariables :: (Core.Type -> [Core.Name])
-collectTypeVariables typ = (collectForallVariables typ)
-
--- | Collect all type variable names from a type expression
-collectTypeVariablesFromType :: (Core.Type -> [Core.Name])
-collectTypeVariablesFromType typ = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (collectTypeVariablesFromType (Core.annotatedTypeBody v1))
-  Core.TypeApplication v1 -> (Lists.concat2 (collectTypeVariablesFromType (Core.applicationTypeFunction v1)) (collectTypeVariablesFromType (Core.applicationTypeArgument v1)))
-  Core.TypeEither v1 -> (Lists.concat2 (collectTypeVariablesFromType (Core.eitherTypeLeft v1)) (collectTypeVariablesFromType (Core.eitherTypeRight v1)))
-  Core.TypeForall v1 -> (collectTypeVariablesFromType (Core.forallTypeBody v1))
-  Core.TypeList v1 -> (collectTypeVariablesFromType v1)
-  Core.TypeMap v1 -> (Lists.concat2 (collectTypeVariablesFromType (Core.mapTypeKeys v1)) (collectTypeVariablesFromType (Core.mapTypeValues v1)))
-  Core.TypeMaybe v1 -> (collectTypeVariablesFromType v1)
-  Core.TypePair v1 -> (Lists.concat2 (collectTypeVariablesFromType (Core.pairTypeFirst v1)) (collectTypeVariablesFromType (Core.pairTypeSecond v1)))
-  Core.TypeRecord v1 -> (Lists.concat (Lists.map (\ft -> collectTypeVariablesFromType (Core.fieldTypeType ft)) (Core.rowTypeFields v1)))
-  Core.TypeSet v1 -> (collectTypeVariablesFromType v1)
-  Core.TypeUnion v1 -> (Lists.concat (Lists.map (\ft -> collectTypeVariablesFromType (Core.fieldTypeType ft)) (Core.rowTypeFields v1)))
-  Core.TypeVariable v1 -> [
-    v1]
-  Core.TypeWrap v1 -> (collectTypeVariablesFromType (Core.wrappedTypeBody v1))
-  _ -> []) typ)
-
--- | Transform a type binding into a decoder binding
-decodeBinding :: (Core.Binding -> Compute.Flow Graph.Graph Core.Binding)
-decodeBinding b = (Flows.bind Monads.getState (\cx -> Flows.bind (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm b))) (\typ -> Flows.pure (Core.Binding {
-  Core.bindingName = (decodeBindingName (Core.bindingName b)),
-  Core.bindingTerm = (decodeType typ),
-  Core.bindingType = (Just (decoderTypeScheme typ))}))))
-
--- | Generate a binding name for a decoder function from a type name
-decodeBindingName :: (Core.Name -> Core.Name)
-decodeBindingName n = (Logic.ifElse (Logic.not (Lists.null (Lists.tail (Strings.splitOn "." (Core.unName n))))) (Core.Name (Strings.intercalate "." (Lists.concat2 [
-  "hydra",
-  "decode"] (Lists.concat2 (Lists.tail (Lists.init (Strings.splitOn "." (Core.unName n)))) [
-  Formatting.decapitalize (Names.localNameOf n)])))) (Core.Name (Formatting.decapitalize (Names.localNameOf n))))
-
--- | Generate a decoder for an Either type
-decodeEitherType :: (Core.EitherType -> Core.Term)
-decodeEitherType et =  
-  let leftDecoder = (decodeType (Core.eitherTypeLeft et))
-  in  
-    let rightDecoder = (decodeType (Core.eitherTypeRight et))
-    in (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
-        Core.applicationArgument = leftDecoder})),
-      Core.applicationArgument = rightDecoder}))
-
--- | Generate a decoder for a polymorphic (forall) type
-decodeForallType :: (Core.ForallType -> Core.Term)
-decodeForallType ft = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (decodeBindingName (Core.forallTypeParameter ft)),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (decodeType (Core.forallTypeBody ft))})))
-
--- | Generate a decoder for a list type
-decodeListType :: (Core.Type -> Core.Term)
-decodeListType elemType =  
-  let elemDecoder = (decodeType elemType)
-  in (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-    Core.applicationArgument = elemDecoder}))
-
--- | Generate a decoder for a literal type
-decodeLiteralType :: (Core.LiteralType -> Core.Term)
-decodeLiteralType lt = ((\x -> case x of
-  Core.LiteralTypeBinary -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "cx"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "raw"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "err"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "stripped"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected binary literal"))}))))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "binary"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-        Core.applicationArgument = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-  Core.LiteralTypeBoolean -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "cx"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "raw"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "err"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "stripped"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "boolean"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-        Core.applicationArgument = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-  Core.LiteralTypeFloat v1 -> ((\x -> case x of
-    Core.FloatTypeBigfloat -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "bigfloat",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "float"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "bigfloat",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "bigfloat"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "f"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.FloatTypeFloat32 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "float32",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "float"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "float32",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "float32"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "f"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.FloatTypeFloat64 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "float64",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "float"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "float64",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "float64"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "f"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))) v1)
-  Core.LiteralTypeInteger v1 -> ((\x -> case x of
-    Core.IntegerTypeBigint -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "bigint",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "bigint",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "bigint"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.IntegerTypeInt8 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "int8",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "int8",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "int8"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.IntegerTypeInt16 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "int16",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "int16",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "int16"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.IntegerTypeInt32 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "int32",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "int32",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "int32"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.IntegerTypeInt64 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "int64",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "int64",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "int64"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.IntegerTypeUint8 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "uint8",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "uint8",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "uint8"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.IntegerTypeUint16 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "uint16",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "uint16",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "uint16"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.IntegerTypeUint32 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "uint32",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "uint32",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "uint32"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-    Core.IntegerTypeUint64 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                "expected ",
-                                "uint64",
-                                " literal"])))}))))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                                      "expected ",
-                                      "uint64",
-                                      " value"])))}))))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "uint64"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "i"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))) v1)
-  Core.LiteralTypeString -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "cx"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "raw"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "err"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "stripped"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "s"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-        Core.applicationArgument = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))) lt)
-
--- | Generate a decoder for a map type
-decodeMapType :: (Core.MapType -> Core.Term)
-decodeMapType mt =  
-  let keyDecoder = (decodeType (Core.mapTypeKeys mt))
-  in  
-    let valDecoder = (decodeType (Core.mapTypeValues mt))
-    in (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-        Core.applicationArgument = keyDecoder})),
-      Core.applicationArgument = valDecoder}))
-
--- | Generate a decoder for an optional type
-decodeMaybeType :: (Core.Type -> Core.Term)
-decodeMaybeType elemType =  
-  let elemDecoder = (decodeType elemType)
-  in (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-    Core.applicationArgument = elemDecoder}))
-
--- | Transform a type module into a decoder module
-decodeModule :: (Module.Module -> Compute.Flow Graph.Graph (Maybe Module.Module))
-decodeModule mod = (Flows.bind (filterTypeBindings (Module.moduleElements mod)) (\typeBindings -> Logic.ifElse (Lists.null typeBindings) (Flows.pure Nothing) (Flows.bind (Flows.mapList decodeBinding typeBindings) (\decodedBindings ->  
-  let decodedTypeDeps = (Lists.map decodeNamespace (Module.moduleTypeDependencies mod))
-  in  
-    let decodedTermDeps = (Lists.map decodeNamespace (Module.moduleTermDependencies mod))
-    in  
-      let allDecodedDeps = (Lists.nub (Lists.concat2 decodedTypeDeps decodedTermDeps))
-      in (Flows.pure (Just (Module.Module {
-        Module.moduleNamespace = (decodeNamespace (Module.moduleNamespace mod)),
-        Module.moduleElements = decodedBindings,
-        Module.moduleTermDependencies = (Lists.concat2 [
-          Module.Namespace "hydra.extract.helpers",
-          (Module.Namespace "hydra.lexical"),
-          (Module.Namespace "hydra.rewriting")] allDecodedDeps),
-        Module.moduleTypeDependencies = [
-          Module.moduleNamespace mod,
-          (Module.Namespace "hydra.util")],
-        Module.moduleDescription = (Just (Strings.cat [
-          "Term decoders for ",
-          (Module.unNamespace (Module.moduleNamespace mod))]))})))))))
-
--- | Generate a decoder module namespace from a source module namespace
-decodeNamespace :: (Module.Namespace -> Module.Namespace)
-decodeNamespace ns = (Module.Namespace (Strings.cat [
-  "hydra.decode.",
-  (Strings.intercalate "." (Lists.tail (Strings.splitOn "." (Module.unNamespace ns))))]))
-
--- | Generate a decoder for a pair type
-decodePairType :: (Core.PairType -> Core.Term)
-decodePairType pt =  
-  let firstDecoder = (decodeType (Core.pairTypeFirst pt))
-  in  
-    let secondDecoder = (decodeType (Core.pairTypeSecond pt))
-    in (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
-        Core.applicationArgument = firstDecoder})),
-      Core.applicationArgument = secondDecoder}))
-
--- | Generate a decoder for a record type
-decodeRecordType :: (Core.RowType -> Core.Term)
-decodeRecordType rt =  
-  let typeName = (Core.rowTypeTypeName rt)
-  in  
-    let fieldTypes = (Core.rowTypeFields rt)
-    in  
-      let decodeFieldTerm = (\ft -> Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString (Core.unName (Core.fieldTypeName ft))))})),
-                  Core.applicationArgument = (decodeType (Core.fieldTypeType ft))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))
-      in  
-        let localVarName = (\ft -> Core.Name (Strings.cat [
-                "field_",
-                (Core.unName (Core.fieldTypeName ft))]))
-        in  
-          let toFieldLambda = (\ft -> \body -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (localVarName ft),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = body})))
-          in  
-            let decodeBody = (Lists.foldl (\acc -> \ft -> Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                      Core.applicationArgument = (decodeFieldTerm ft)})),
-                    Core.applicationArgument = (toFieldLambda ft acc)})) (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = typeName,
-                    Core.recordFields = (Lists.map (\ft -> Core.Field {
-                      Core.fieldName = (Core.fieldTypeName ft),
-                      Core.fieldTerm = (Core.TermVariable (localVarName ft))}) fieldTypes)})))) (Lists.reverse fieldTypes))
-            in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "cx"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "raw"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "err"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "stripped"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                              "expected record of type ",
-                              (Core.unName typeName)])))}))))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "record"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "record"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermLet (Core.Let {
-                                  Core.letBindings = [
-                                    Core.Binding {
-                                      Core.bindingName = (Core.Name "fieldMap"),
-                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                      Core.bindingType = Nothing}],
-                                  Core.letBody = decodeBody}))})))}]})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-
--- | Generate a decoder for a set type
-decodeSetType :: (Core.Type -> Core.Term)
-decodeSetType elemType =  
-  let elemDecoder = (decodeType elemType)
-  in (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
-    Core.applicationArgument = elemDecoder}))
-
--- | Generate a decoder term for a Type
-decodeType :: (Core.Type -> Core.Term)
-decodeType typ = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (decodeType (Core.annotatedTypeBody v1))
-  Core.TypeApplication v1 -> (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (decodeType (Core.applicationTypeFunction v1)),
-    Core.applicationArgument = (decodeType (Core.applicationTypeArgument v1))}))
-  Core.TypeEither v1 -> (decodeEitherType v1)
-  Core.TypeForall v1 -> (decodeForallType v1)
-  Core.TypeList v1 -> (decodeListType v1)
-  Core.TypeLiteral v1 -> (decodeLiteralType v1)
-  Core.TypeMap v1 -> (decodeMapType v1)
-  Core.TypeMaybe v1 -> (decodeMaybeType v1)
-  Core.TypePair v1 -> (decodePairType v1)
-  Core.TypeRecord v1 -> (decodeRecordType v1)
-  Core.TypeSet v1 -> (decodeSetType v1)
-  Core.TypeUnion v1 -> (decodeUnionType v1)
-  Core.TypeUnit -> decodeUnitType
-  Core.TypeWrap v1 -> (decodeWrappedType v1)
-  Core.TypeVariable v1 -> (Core.TermVariable (decodeBindingName v1))
-  _ -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "cx"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "t"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unsupported type variant"))}))))})))})))) typ)
-
--- | Generate a decoder for the unit type
-decodeUnitType :: Core.Term
-decodeUnitType = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit"))
-
--- | Generate a decoder for a union type
-decodeUnionType :: (Core.RowType -> Core.Term)
-decodeUnionType rt =  
-  let typeName = (Core.rowTypeTypeName rt)
-  in  
-    let toVariantPair = (\ft -> Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName (Core.fieldTypeName ft))))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "input"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "t"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = typeName,
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.fieldTypeName ft),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (decodeType (Core.fieldTypeType ft)),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))
-    in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "cx"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "raw"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "err"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "stripped"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                      "expected union of type ",
-                      (Core.unName typeName)])))}))))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "union"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "inj"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermLet (Core.Let {
-                          Core.letBindings = [
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "tname"),
-                              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                  Core.projectionField = (Core.Name "typeName")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                              Core.bindingType = Nothing},
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "field"),
-                              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                  Core.projectionField = (Core.Name "field")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                              Core.bindingType = Nothing},
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "fname"),
-                              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                  Core.projectionField = (Core.Name "name")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                              Core.bindingType = Nothing},
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "fterm"),
-                              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                  Core.projectionField = (Core.Name "term")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                              Core.bindingType = Nothing},
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "variantMap"),
-                              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                Core.applicationArgument = (Core.TermList (Lists.map toVariantPair (Core.rowTypeFields rt)))})),
-                              Core.bindingType = Nothing}],
-                          Core.letBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                  Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                    Core.applicationArgument = (Core.TermList [
-                                      Core.TermLiteral (Core.LiteralString "no such field "),
-                                      (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                      (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                      (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "f"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-
--- | Generate a decoder for a wrapped type
-decodeWrappedType :: (Core.WrappedType -> Core.Term)
-decodeWrappedType wt =  
-  let bodyDecoder = (decodeType (Core.wrappedTypeBody wt))
-  in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "cx"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "raw"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "err"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "stripped"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
-                    "expected wrapped type ",
-                    (Core.unName (Core.wrappedTypeTypeName wt))])))}))))),
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "wrap"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "b"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.wrappedTypeTypeName wt),
-                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = bodyDecoder,
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                              Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                              Core.projectionField = (Core.Name "body")})))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-        Core.applicationArgument = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
-
--- | Get full result type for decoder
-decoderFullResultType :: (Core.Type -> Core.Type)
-decoderFullResultType typ = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (decoderFullResultType (Core.annotatedTypeBody v1))
-  Core.TypeApplication v1 -> (Core.TypeApplication (Core.ApplicationType {
-    Core.applicationTypeFunction = (decoderFullResultType (Core.applicationTypeFunction v1)),
-    Core.applicationTypeArgument = (Core.applicationTypeArgument v1)}))
-  Core.TypeEither v1 -> (Core.TypeEither (Core.EitherType {
-    Core.eitherTypeLeft = (decoderFullResultType (Core.eitherTypeLeft v1)),
-    Core.eitherTypeRight = (decoderFullResultType (Core.eitherTypeRight v1))}))
-  Core.TypeForall v1 -> (Core.TypeApplication (Core.ApplicationType {
-    Core.applicationTypeFunction = (decoderFullResultType (Core.forallTypeBody v1)),
-    Core.applicationTypeArgument = (Core.TypeVariable (Core.forallTypeParameter v1))}))
-  Core.TypeList v1 -> (Core.TypeList (decoderFullResultType v1))
-  Core.TypeLiteral _ -> (Core.TypeVariable (Core.Name "hydra.core.Literal"))
-  Core.TypeMap v1 -> (Core.TypeMap (Core.MapType {
-    Core.mapTypeKeys = (decoderFullResultType (Core.mapTypeKeys v1)),
-    Core.mapTypeValues = (decoderFullResultType (Core.mapTypeValues v1))}))
-  Core.TypeMaybe v1 -> (Core.TypeMaybe (decoderFullResultType v1))
-  Core.TypePair v1 -> (Core.TypePair (Core.PairType {
-    Core.pairTypeFirst = (decoderFullResultType (Core.pairTypeFirst v1)),
-    Core.pairTypeSecond = (decoderFullResultType (Core.pairTypeSecond v1))}))
-  Core.TypeRecord v1 -> (Core.TypeVariable (Core.rowTypeTypeName v1))
-  Core.TypeSet v1 -> (Core.TypeSet (decoderFullResultType v1))
-  Core.TypeUnion v1 -> (Core.TypeVariable (Core.rowTypeTypeName v1))
-  Core.TypeUnit -> Core.TypeUnit
-  Core.TypeVariable v1 -> (Core.TypeVariable v1)
-  Core.TypeWrap v1 -> (Core.TypeVariable (Core.wrappedTypeTypeName v1))
-  _ -> (Core.TypeVariable (Core.Name "hydra.core.Term"))) typ)
-
--- | Compute the result type name for a decoder
-decoderResultType :: (Core.Type -> Core.Name)
-decoderResultType typ = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (decoderResultType (Core.annotatedTypeBody v1))
-  Core.TypeApplication v1 -> (decoderResultType (Core.applicationTypeFunction v1))
-  Core.TypeForall v1 -> (decoderResultType (Core.forallTypeBody v1))
-  Core.TypeLiteral _ -> (Core.Name "hydra.core.Literal")
-  Core.TypeRecord v1 -> (Core.rowTypeTypeName v1)
-  Core.TypeUnion v1 -> (Core.rowTypeTypeName v1)
-  Core.TypeWrap v1 -> (Core.wrappedTypeTypeName v1)
-  _ -> (Core.Name "hydra.core.Term")) typ)
-
--- | Build decoder function type
-decoderType :: (Core.Type -> Core.Type)
-decoderType typ =  
-  let resultType = (decoderFullResultType typ)
-  in  
-    let baseType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = resultType}))}))}))
-    in (prependForallDecoders baseType typ)
-
--- | Build type scheme for a decoder function
-decoderTypeScheme :: (Core.Type -> Core.TypeScheme)
-decoderTypeScheme typ =  
-  let typeVars = (collectTypeVariables typ)
-  in  
-    let allOrdVars = (collectOrdConstrainedVariables typ)
-    in  
-      let ordVars = (Lists.filter (\v -> Lists.elem v typeVars) allOrdVars)
-      in  
-        let constraints = (Logic.ifElse (Lists.null ordVars) Nothing (Just (Maps.fromList (Lists.map (\v -> (v, Core.TypeVariableMetadata {
-                Core.typeVariableMetadataClasses = (Sets.singleton (Core.Name "ordering"))})) ordVars))))
-        in Core.TypeScheme {
-          Core.typeSchemeVariables = typeVars,
-          Core.typeSchemeType = (decoderType typ),
-          Core.typeSchemeConstraints = constraints}
-
--- | Filter bindings to only decodable type definitions
-filterTypeBindings :: ([Core.Binding] -> Compute.Flow Graph.Graph [Core.Binding])
-filterTypeBindings bindings = (Flows.map Maybes.cat (Flows.mapList isDecodableBinding (Lists.filter Annotations.isNativeType bindings)))
-
--- | Check if a binding is decodable (serializable type)
-isDecodableBinding :: (Core.Binding -> Compute.Flow Graph.Graph (Maybe Core.Binding))
-isDecodableBinding b = (Flows.map (\serializable -> Logic.ifElse serializable (Just b) Nothing) (Schemas.isSerializableByName (Core.bindingName b)))
-
--- | Prepend decoder types for forall parameters to base type
-prependForallDecoders :: (Core.Type -> Core.Type -> Core.Type)
-prependForallDecoders baseType typ = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (prependForallDecoders baseType (Core.annotatedTypeBody v1))
-  Core.TypeForall v1 -> (Core.TypeFunction (Core.FunctionType {
-    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-        Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-          Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-          Core.eitherTypeRight = (Core.TypeVariable (Core.forallTypeParameter v1))}))}))})),
-    Core.functionTypeCodomain = (prependForallDecoders baseType (Core.forallTypeBody v1))}))
-  _ -> baseType) typ)
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Helpers as Helpers
+import qualified Hydra.Formatting as Formatting
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Module as Module
+import qualified Hydra.Names as Names
+import qualified Hydra.Schemas as Schemas
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Collect forall type variable names from a type
+collectForallVariables :: Core.Type -> [Core.Name]
+collectForallVariables typ =
+    case typ of
+      Core.TypeAnnotated v0 -> collectForallVariables (Core.annotatedTypeBody v0)
+      Core.TypeForall v0 -> Lists.cons (Core.forallTypeParameter v0) (collectForallVariables (Core.forallTypeBody v0))
+      _ -> []
+
+-- | Collect type variables needing Ord constraints (from Map key and Set element types)
+collectOrdConstrainedVariables :: Core.Type -> [Core.Name]
+collectOrdConstrainedVariables typ =
+    case typ of
+      Core.TypeAnnotated v0 -> collectOrdConstrainedVariables (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Lists.concat2 (collectOrdConstrainedVariables (Core.applicationTypeFunction v0)) (collectOrdConstrainedVariables (Core.applicationTypeArgument v0))
+      Core.TypeEither v0 -> Lists.concat2 (collectOrdConstrainedVariables (Core.eitherTypeLeft v0)) (collectOrdConstrainedVariables (Core.eitherTypeRight v0))
+      Core.TypeForall v0 -> collectOrdConstrainedVariables (Core.forallTypeBody v0)
+      Core.TypeList v0 -> collectOrdConstrainedVariables v0
+      Core.TypeMap v0 -> Lists.concat [
+        collectTypeVariablesFromType (Core.mapTypeKeys v0),
+        (collectOrdConstrainedVariables (Core.mapTypeKeys v0)),
+        (collectOrdConstrainedVariables (Core.mapTypeValues v0))]
+      Core.TypeMaybe v0 -> collectOrdConstrainedVariables v0
+      Core.TypePair v0 -> Lists.concat2 (collectOrdConstrainedVariables (Core.pairTypeFirst v0)) (collectOrdConstrainedVariables (Core.pairTypeSecond v0))
+      Core.TypeRecord v0 -> Lists.concat (Lists.map (\ft -> collectOrdConstrainedVariables (Core.fieldTypeType ft)) v0)
+      Core.TypeSet v0 -> Lists.concat2 (collectTypeVariablesFromType v0) (collectOrdConstrainedVariables v0)
+      Core.TypeUnion v0 -> Lists.concat (Lists.map (\ft -> collectOrdConstrainedVariables (Core.fieldTypeType ft)) v0)
+      Core.TypeWrap v0 -> collectOrdConstrainedVariables v0
+      _ -> []
+
+-- | Collect type variable names from a type (forall parameters only)
+collectTypeVariables :: Core.Type -> [Core.Name]
+collectTypeVariables typ = collectForallVariables typ
+
+-- | Collect all type variable names from a type expression
+collectTypeVariablesFromType :: Core.Type -> [Core.Name]
+collectTypeVariablesFromType typ =
+    case typ of
+      Core.TypeAnnotated v0 -> collectTypeVariablesFromType (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Lists.concat2 (collectTypeVariablesFromType (Core.applicationTypeFunction v0)) (collectTypeVariablesFromType (Core.applicationTypeArgument v0))
+      Core.TypeEither v0 -> Lists.concat2 (collectTypeVariablesFromType (Core.eitherTypeLeft v0)) (collectTypeVariablesFromType (Core.eitherTypeRight v0))
+      Core.TypeForall v0 -> collectTypeVariablesFromType (Core.forallTypeBody v0)
+      Core.TypeList v0 -> collectTypeVariablesFromType v0
+      Core.TypeMap v0 -> Lists.concat2 (collectTypeVariablesFromType (Core.mapTypeKeys v0)) (collectTypeVariablesFromType (Core.mapTypeValues v0))
+      Core.TypeMaybe v0 -> collectTypeVariablesFromType v0
+      Core.TypePair v0 -> Lists.concat2 (collectTypeVariablesFromType (Core.pairTypeFirst v0)) (collectTypeVariablesFromType (Core.pairTypeSecond v0))
+      Core.TypeRecord v0 -> Lists.concat (Lists.map (\ft -> collectTypeVariablesFromType (Core.fieldTypeType ft)) v0)
+      Core.TypeSet v0 -> collectTypeVariablesFromType v0
+      Core.TypeUnion v0 -> Lists.concat (Lists.map (\ft -> collectTypeVariablesFromType (Core.fieldTypeType ft)) v0)
+      Core.TypeVariable v0 -> [
+        v0]
+      Core.TypeWrap v0 -> collectTypeVariablesFromType v0
+      _ -> []
+
+-- | Transform a type binding into a decoder binding
+decodeBinding :: Context.Context -> Graph.Graph -> Core.Binding -> Either (Context.InContext Errors.DecodingError) Core.Binding
+decodeBinding cx graph b =
+    Eithers.bind (Eithers.bimap (\_wc_e -> Context.InContext {
+      Context.inContextObject = _wc_e,
+      Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Core_.type_ graph (Core.bindingTerm b))) (\typ -> Right (Core.Binding {
+      Core.bindingName = (decodeBindingName (Core.bindingName b)),
+      Core.bindingTerm = (decodeTypeNamed (Core.bindingName b) typ),
+      Core.bindingType = (Just (decoderTypeSchemeNamed (Core.bindingName b) typ))}))
+
+-- | Generate a binding name for a decoder function from a type name
+decodeBindingName :: Core.Name -> Core.Name
+decodeBindingName n =
+    Logic.ifElse (Logic.not (Lists.null (Lists.tail (Strings.splitOn "." (Core.unName n))))) (Core.Name (Strings.intercalate "." (Lists.concat2 [
+      "hydra",
+      "decode"] (Lists.concat2 (Lists.tail (Lists.init (Strings.splitOn "." (Core.unName n)))) [
+      Formatting.decapitalize (Names.localNameOf n)])))) (Core.Name (Formatting.decapitalize (Names.localNameOf n)))
+
+-- | Generate a decoder for an Either type
+decodeEitherType :: Core.EitherType -> Core.Term
+decodeEitherType et =
+
+      let leftDecoder = decodeType (Core.eitherTypeLeft et)
+          rightDecoder = decodeType (Core.eitherTypeRight et)
+      in (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
+          Core.applicationArgument = leftDecoder})),
+        Core.applicationArgument = rightDecoder}))
+
+-- | Generate a decoder for a polymorphic (forall) type
+decodeForallType :: Core.ForallType -> Core.Term
+decodeForallType ft =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (decodeBindingName (Core.forallTypeParameter ft)),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (decodeType (Core.forallTypeBody ft))}))
+
+-- | Generate a decoder for a list type
+decodeListType :: Core.Type -> Core.Term
+decodeListType elemType =
+
+      let elemDecoder = decodeType elemType
+      in (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+        Core.applicationArgument = elemDecoder}))
+
+-- | Generate a decoder for a literal type
+decodeLiteralType :: Core.LiteralType -> Core.Term
+decodeLiteralType lt =
+    case lt of
+      Core.LiteralTypeBinary -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "cx"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "raw"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "err"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "stripped"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected binary literal"))}))))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "binary"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+      Core.LiteralTypeBoolean -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "cx"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "raw"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "err"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "stripped"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "boolean"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+      Core.LiteralTypeFloat v0 -> case v0 of
+        Core.FloatTypeBigfloat -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "bigfloat",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "float"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "bigfloat",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "bigfloat"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "f"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.FloatTypeFloat32 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "float32",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "float"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "float32",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "float32"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "f"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.FloatTypeFloat64 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "float64",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "float"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "float64",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "float64"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "f"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+      Core.LiteralTypeInteger v0 -> case v0 of
+        Core.IntegerTypeBigint -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "bigint",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "bigint",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "bigint"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.IntegerTypeInt8 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "int8",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "int8",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "int8"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.IntegerTypeInt16 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "int16",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "int16",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "int16"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.IntegerTypeInt32 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "int32",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "int32",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "int32"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.IntegerTypeInt64 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "int64",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "int64",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "int64"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.IntegerTypeUint8 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "uint8",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "uint8",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "uint8"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.IntegerTypeUint16 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "uint16",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "uint16",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "uint16"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.IntegerTypeUint32 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "uint32",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "uint32",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "uint32"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+        Core.IntegerTypeUint64 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "cx"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "raw"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "stripped"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                    "expected ",
+                                    "uint64",
+                                    " literal"])))}))))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Strings.cat [
+                                          "expected ",
+                                          "uint64",
+                                          " value"])))}))))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "uint64"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "i"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+      Core.LiteralTypeString -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "cx"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "raw"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "err"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "stripped"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "s"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))
+
+-- | Generate a decoder for a map type
+decodeMapType :: Core.MapType -> Core.Term
+decodeMapType mt =
+
+      let keyDecoder = decodeType (Core.mapTypeKeys mt)
+          valDecoder = decodeType (Core.mapTypeValues mt)
+      in (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+          Core.applicationArgument = keyDecoder})),
+        Core.applicationArgument = valDecoder}))
+
+-- | Generate a decoder for an optional type
+decodeMaybeType :: Core.Type -> Core.Term
+decodeMaybeType elemType =
+
+      let elemDecoder = decodeType elemType
+      in (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+        Core.applicationArgument = elemDecoder}))
+
+-- | Transform a type module into a decoder module
+decodeModule :: Context.Context -> Graph.Graph -> Module.Module -> Either (Context.InContext Errors.Error) (Maybe Module.Module)
+decodeModule cx graph mod =
+    Eithers.bind (filterTypeBindings cx graph (Maybes.cat (Lists.map (\d -> case d of
+      Module.DefinitionType v0 -> Just (Annotations.typeElement (Module.typeDefinitionName v0) (Module.typeDefinitionType v0))
+      _ -> Nothing) (Module.moduleDefinitions mod)))) (\typeBindings -> Logic.ifElse (Lists.null typeBindings) (Right Nothing) (Eithers.bind (Eithers.mapList (\b -> Eithers.bimap (\ic -> Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError (Context.inContextObject ic)))),
+      Context.inContextContext = (Context.inContextContext ic)}) (\x -> x) (decodeBinding cx graph b)) typeBindings) (\decodedBindings ->
+      let decodedTypeDeps = Lists.map decodeNamespace (Module.moduleTypeDependencies mod)
+          decodedTermDeps = Lists.map decodeNamespace (Module.moduleTermDependencies mod)
+          allDecodedDeps = Lists.nub (Lists.concat2 decodedTypeDeps decodedTermDeps)
+      in (Right (Just (Module.Module {
+        Module.moduleNamespace = (decodeNamespace (Module.moduleNamespace mod)),
+        Module.moduleDefinitions = (Lists.map (\b -> Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.bindingName b),
+          Module.termDefinitionTerm = (Core.bindingTerm b),
+          Module.termDefinitionType = (Core.bindingType b)})) decodedBindings),
+        Module.moduleTermDependencies = (Lists.concat2 [
+          Module.Namespace "hydra.extract.helpers",
+          (Module.Namespace "hydra.lexical"),
+          (Module.Namespace "hydra.rewriting")] allDecodedDeps),
+        Module.moduleTypeDependencies = [
+          Module.moduleNamespace mod,
+          (Module.Namespace "hydra.util")],
+        Module.moduleDescription = (Just (Strings.cat [
+          "Term decoders for ",
+          (Module.unNamespace (Module.moduleNamespace mod))]))}))))))
+
+-- | Generate a decoder module namespace from a source module namespace
+decodeNamespace :: Module.Namespace -> Module.Namespace
+decodeNamespace ns =
+    Module.Namespace (Strings.cat [
+      "hydra.decode.",
+      (Strings.intercalate "." (Lists.tail (Strings.splitOn "." (Module.unNamespace ns))))])
+
+-- | Generate a decoder for a pair type
+decodePairType :: Core.PairType -> Core.Term
+decodePairType pt =
+
+      let firstDecoder = decodeType (Core.pairTypeFirst pt)
+          secondDecoder = decodeType (Core.pairTypeSecond pt)
+      in (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
+          Core.applicationArgument = firstDecoder})),
+        Core.applicationArgument = secondDecoder}))
+
+-- | Generate a decoder for a record type
+decodeRecordType :: [Core.FieldType] -> Core.Term
+decodeRecordType rt = decodeRecordTypeImpl (Core.Name "unknown") rt
+
+-- | Generate a decoder for a record type with a type name
+decodeRecordTypeImpl :: Core.Name -> [Core.FieldType] -> Core.Term
+decodeRecordTypeImpl tname rt =
+
+      let decodeFieldTerm =
+              \ft -> Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString (Core.unName (Core.fieldTypeName ft))))})),
+                    Core.applicationArgument = (decodeType (Core.fieldTypeType ft))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})
+          localVarName =
+                  \ft -> Core.Name (Strings.cat [
+                    "field_",
+                    (Core.unName (Core.fieldTypeName ft))])
+          toFieldLambda =
+                  \ft -> \body -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (localVarName ft),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = body}))
+          decodeBody =
+                  Lists.foldl (\acc -> \ft -> Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                      Core.applicationArgument = (decodeFieldTerm ft)})),
+                    Core.applicationArgument = (toFieldLambda ft acc)})) (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = tname,
+                    Core.recordFields = (Lists.map (\ft -> Core.Field {
+                      Core.fieldName = (Core.fieldTypeName ft),
+                      Core.fieldTerm = (Core.TermVariable (localVarName ft))}) rt)})))) (Lists.reverse rt)
+      in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "cx"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "raw"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "err"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "stripped"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "record"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "record"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "fieldMap"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                Core.bindingType = Nothing}],
+                            Core.letBody = decodeBody}))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
+
+-- | Generate a decoder for a record type with element name
+decodeRecordTypeNamed :: Core.Name -> [Core.FieldType] -> Core.Term
+decodeRecordTypeNamed ename rt = decodeRecordTypeImpl ename rt
+
+-- | Generate a decoder for a set type
+decodeSetType :: Core.Type -> Core.Term
+decodeSetType elemType =
+
+      let elemDecoder = decodeType elemType
+      in (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
+        Core.applicationArgument = elemDecoder}))
+
+-- | Generate a decoder term for a Type
+decodeType :: Core.Type -> Core.Term
+decodeType typ =
+    case typ of
+      Core.TypeAnnotated v0 -> decodeType (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = (decodeType (Core.applicationTypeFunction v0)),
+        Core.applicationArgument = (decodeType (Core.applicationTypeArgument v0))})
+      Core.TypeEither v0 -> decodeEitherType v0
+      Core.TypeForall v0 -> decodeForallType v0
+      Core.TypeList v0 -> decodeListType v0
+      Core.TypeLiteral v0 -> decodeLiteralType v0
+      Core.TypeMap v0 -> decodeMapType v0
+      Core.TypeMaybe v0 -> decodeMaybeType v0
+      Core.TypePair v0 -> decodePairType v0
+      Core.TypeRecord v0 -> decodeRecordType v0
+      Core.TypeSet v0 -> decodeSetType v0
+      Core.TypeUnion v0 -> decodeUnionType v0
+      Core.TypeUnit -> decodeUnitType
+      Core.TypeVoid -> decodeUnitType
+      Core.TypeWrap v0 -> decodeWrappedType v0
+      Core.TypeVariable v0 -> Core.TermVariable (decodeBindingName v0)
+      _ -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "cx"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "t"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unsupported type variant"))}))))})))}))
+
+-- | Generate a decoder term for a Type, with element name for nominal types
+decodeTypeNamed :: Core.Name -> Core.Type -> Core.Term
+decodeTypeNamed ename typ =
+    case typ of
+      Core.TypeAnnotated v0 -> decodeTypeNamed ename (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = (decodeType (Core.applicationTypeFunction v0)),
+        Core.applicationArgument = (decodeType (Core.applicationTypeArgument v0))})
+      Core.TypeEither v0 -> decodeEitherType v0
+      Core.TypeForall v0 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (decodeBindingName (Core.forallTypeParameter v0)),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (decodeTypeNamed ename (Core.forallTypeBody v0))}))
+      Core.TypeList v0 -> decodeListType v0
+      Core.TypeLiteral v0 -> decodeLiteralType v0
+      Core.TypeMap v0 -> decodeMapType v0
+      Core.TypeMaybe v0 -> decodeMaybeType v0
+      Core.TypePair v0 -> decodePairType v0
+      Core.TypeRecord v0 -> decodeRecordTypeNamed ename v0
+      Core.TypeSet v0 -> decodeSetType v0
+      Core.TypeUnion v0 -> decodeUnionTypeNamed ename v0
+      Core.TypeUnit -> decodeUnitType
+      Core.TypeVoid -> decodeUnitType
+      Core.TypeWrap v0 -> decodeWrappedTypeNamed ename v0
+      Core.TypeVariable v0 -> Core.TermVariable (decodeBindingName v0)
+      _ -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "cx"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "t"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unsupported type variant"))}))))})))}))
+
+-- | Generate a decoder for a union type
+decodeUnionType :: [Core.FieldType] -> Core.Term
+decodeUnionType rt = decodeUnionTypeNamed (Core.Name "unknown") rt
+
+-- | Generate a decoder for a union type with the given element name
+decodeUnionTypeNamed :: Core.Name -> [Core.FieldType] -> Core.Term
+decodeUnionTypeNamed ename rt =
+
+      let toVariantPair =
+              \ft -> Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName (Core.fieldTypeName ft))))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "input"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "t"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = ename,
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.fieldTypeName ft),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (decodeType (Core.fieldTypeType ft)),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))
+      in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "cx"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "raw"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "err"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "stripped"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "union"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "inj"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "field"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                    Core.projectionField = (Core.Name "field")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                Core.bindingType = Nothing},
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "fname"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                Core.bindingType = Nothing},
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "fterm"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                    Core.projectionField = (Core.Name "term")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                Core.bindingType = Nothing},
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "variantMap"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                  Core.applicationArgument = (Core.TermList (Lists.map toVariantPair rt))})),
+                                Core.bindingType = Nothing}],
+                            Core.letBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermLiteral (Core.LiteralString "no such field "),
+                                        (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                        (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "f"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
+
+-- | Generate a decoder for the unit type
+decodeUnitType :: Core.Term
+decodeUnitType = Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")
+
+-- | Generate a decoder for a wrapped type
+decodeWrappedType :: Core.Type -> Core.Term
+decodeWrappedType wt = decodeWrappedTypeNamed (Core.Name "unknown") wt
+
+-- | Generate a decoder for a wrapped type with the given element name
+decodeWrappedTypeNamed :: Core.Name -> Core.Type -> Core.Term
+decodeWrappedTypeNamed ename wt =
+
+      let bodyDecoder = decodeType wt
+      in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "cx"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "raw"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "err"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "stripped"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "wrap"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "b"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = ename,
+                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = bodyDecoder,
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                  Core.projectionField = (Core.Name "body")})))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))
+
+-- | Get full result type for decoder
+decoderFullResultType :: Core.Type -> Core.Type
+decoderFullResultType typ =
+    case typ of
+      Core.TypeAnnotated v0 -> decoderFullResultType (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = (decoderFullResultType (Core.applicationTypeFunction v0)),
+        Core.applicationTypeArgument = (Core.applicationTypeArgument v0)})
+      Core.TypeEither v0 -> Core.TypeEither (Core.EitherType {
+        Core.eitherTypeLeft = (decoderFullResultType (Core.eitherTypeLeft v0)),
+        Core.eitherTypeRight = (decoderFullResultType (Core.eitherTypeRight v0))})
+      Core.TypeForall v0 -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = (decoderFullResultType (Core.forallTypeBody v0)),
+        Core.applicationTypeArgument = (Core.TypeVariable (Core.forallTypeParameter v0))})
+      Core.TypeList v0 -> Core.TypeList (decoderFullResultType v0)
+      Core.TypeLiteral _ -> Core.TypeVariable (Core.Name "hydra.core.Literal")
+      Core.TypeMap v0 -> Core.TypeMap (Core.MapType {
+        Core.mapTypeKeys = (decoderFullResultType (Core.mapTypeKeys v0)),
+        Core.mapTypeValues = (decoderFullResultType (Core.mapTypeValues v0))})
+      Core.TypeMaybe v0 -> Core.TypeMaybe (decoderFullResultType v0)
+      Core.TypePair v0 -> Core.TypePair (Core.PairType {
+        Core.pairTypeFirst = (decoderFullResultType (Core.pairTypeFirst v0)),
+        Core.pairTypeSecond = (decoderFullResultType (Core.pairTypeSecond v0))})
+      Core.TypeRecord _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+      Core.TypeSet v0 -> Core.TypeSet (decoderFullResultType v0)
+      Core.TypeUnion _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+      Core.TypeUnit -> Core.TypeUnit
+      Core.TypeVariable v0 -> Core.TypeVariable v0
+      Core.TypeVoid -> Core.TypeVoid
+      Core.TypeWrap _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+      _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+
+-- | Get full result type for decoder with element name
+decoderFullResultTypeNamed :: Core.Name -> Core.Type -> Core.Type
+decoderFullResultTypeNamed ename typ =
+    case typ of
+      Core.TypeAnnotated v0 -> decoderFullResultTypeNamed ename (Core.annotatedTypeBody v0)
+      Core.TypeForall v0 -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = (decoderFullResultTypeNamed ename (Core.forallTypeBody v0)),
+        Core.applicationTypeArgument = (Core.TypeVariable (Core.forallTypeParameter v0))})
+      Core.TypeRecord _ -> Core.TypeVariable ename
+      Core.TypeUnion _ -> Core.TypeVariable ename
+      Core.TypeWrap _ -> Core.TypeVariable ename
+      Core.TypeApplication v0 -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = (decoderFullResultType (Core.applicationTypeFunction v0)),
+        Core.applicationTypeArgument = (Core.applicationTypeArgument v0)})
+      Core.TypeEither v0 -> Core.TypeEither (Core.EitherType {
+        Core.eitherTypeLeft = (decoderFullResultType (Core.eitherTypeLeft v0)),
+        Core.eitherTypeRight = (decoderFullResultType (Core.eitherTypeRight v0))})
+      Core.TypeList v0 -> Core.TypeList (decoderFullResultType v0)
+      Core.TypeLiteral _ -> Core.TypeVariable (Core.Name "hydra.core.Literal")
+      Core.TypeMap v0 -> Core.TypeMap (Core.MapType {
+        Core.mapTypeKeys = (decoderFullResultType (Core.mapTypeKeys v0)),
+        Core.mapTypeValues = (decoderFullResultType (Core.mapTypeValues v0))})
+      Core.TypeMaybe v0 -> Core.TypeMaybe (decoderFullResultType v0)
+      Core.TypePair v0 -> Core.TypePair (Core.PairType {
+        Core.pairTypeFirst = (decoderFullResultType (Core.pairTypeFirst v0)),
+        Core.pairTypeSecond = (decoderFullResultType (Core.pairTypeSecond v0))})
+      Core.TypeSet v0 -> Core.TypeSet (decoderFullResultType v0)
+      Core.TypeUnit -> Core.TypeUnit
+      Core.TypeVariable v0 -> Core.TypeVariable v0
+      Core.TypeVoid -> Core.TypeVoid
+      _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+
+-- | Compute the result type name for a decoder
+decoderResultType :: Core.Type -> Core.Name
+decoderResultType typ =
+    case typ of
+      Core.TypeAnnotated v0 -> decoderResultType (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> decoderResultType (Core.applicationTypeFunction v0)
+      Core.TypeForall v0 -> decoderResultType (Core.forallTypeBody v0)
+      Core.TypeLiteral _ -> Core.Name "hydra.core.Literal"
+      Core.TypeRecord _ -> Core.Name "hydra.core.Term"
+      Core.TypeUnion _ -> Core.Name "hydra.core.Term"
+      Core.TypeWrap _ -> Core.Name "hydra.core.Term"
+      _ -> Core.Name "hydra.core.Term"
+
+-- | Build decoder function type
+decoderType :: Core.Type -> Core.Type
+decoderType typ =
+
+      let resultType = decoderFullResultType typ
+          baseType =
+                  Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                      Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                        Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                        Core.eitherTypeRight = resultType}))}))})
+      in (prependForallDecoders baseType typ)
+
+-- | Build decoder function type with element name
+decoderTypeNamed :: Core.Name -> Core.Type -> Core.Type
+decoderTypeNamed ename typ =
+
+      let resultType = decoderFullResultTypeNamed ename typ
+          baseType =
+                  Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                      Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                        Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                        Core.eitherTypeRight = resultType}))}))})
+      in (prependForallDecoders baseType typ)
+
+-- | Build type scheme for a decoder function
+decoderTypeScheme :: Core.Type -> Core.TypeScheme
+decoderTypeScheme typ =
+
+      let typeVars = collectTypeVariables typ
+          allOrdVars = collectOrdConstrainedVariables typ
+          ordVars = Lists.filter (\v -> Lists.elem v typeVars) allOrdVars
+          constraints =
+                  Logic.ifElse (Lists.null ordVars) Nothing (Just (Maps.fromList (Lists.map (\v -> (v, Core.TypeVariableMetadata {
+                    Core.typeVariableMetadataClasses = (Sets.singleton (Core.Name "ordering"))})) ordVars)))
+      in Core.TypeScheme {
+        Core.typeSchemeVariables = typeVars,
+        Core.typeSchemeType = (decoderType typ),
+        Core.typeSchemeConstraints = constraints}
+
+-- | Build type scheme for a decoder function with element name
+decoderTypeSchemeNamed :: Core.Name -> Core.Type -> Core.TypeScheme
+decoderTypeSchemeNamed ename typ =
+
+      let typeVars = collectTypeVariables typ
+          allOrdVars = collectOrdConstrainedVariables typ
+          ordVars = Lists.filter (\v -> Lists.elem v typeVars) allOrdVars
+          constraints =
+                  Logic.ifElse (Lists.null ordVars) Nothing (Just (Maps.fromList (Lists.map (\v -> (v, Core.TypeVariableMetadata {
+                    Core.typeVariableMetadataClasses = (Sets.singleton (Core.Name "ordering"))})) ordVars)))
+      in Core.TypeScheme {
+        Core.typeSchemeVariables = typeVars,
+        Core.typeSchemeType = (decoderTypeNamed ename typ),
+        Core.typeSchemeConstraints = constraints}
+
+-- | Filter bindings to only decodable type definitions
+filterTypeBindings :: Context.Context -> Graph.Graph -> [Core.Binding] -> Either (Context.InContext Errors.Error) [Core.Binding]
+filterTypeBindings cx graph bindings =
+    Eithers.map Maybes.cat (Eithers.mapList (isDecodableBinding cx graph) (Lists.filter Annotations.isNativeType bindings))
+
+-- | Check if a binding is decodable (serializable type)
+isDecodableBinding :: Context.Context -> Graph.Graph -> Core.Binding -> Either (Context.InContext Errors.Error) (Maybe Core.Binding)
+isDecodableBinding cx graph b =
+    Eithers.bind (Schemas.isSerializableByName cx graph (Core.bindingName b)) (\serializable -> Right (Logic.ifElse serializable (Just b) Nothing))
+
+-- | Prepend decoder types for forall parameters to base type
+prependForallDecoders :: Core.Type -> Core.Type -> Core.Type
+prependForallDecoders baseType typ =
+    case typ of
+      Core.TypeAnnotated v0 -> prependForallDecoders baseType (Core.annotatedTypeBody v0)
+      Core.TypeForall v0 -> Core.TypeFunction (Core.FunctionType {
+        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+              Core.eitherTypeRight = (Core.TypeVariable (Core.forallTypeParameter v0))}))}))})),
+        Core.functionTypeCodomain = (prependForallDecoders baseType (Core.forallTypeBody v0))})
+      _ -> baseType
diff --git a/src/gen-main/haskell/Hydra/Dsl/Ast.hs b/src/gen-main/haskell/Hydra/Dsl/Ast.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Ast.hs
@@ -0,0 +1,901 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.ast
+
+module Hydra.Dsl.Ast where
+
+import qualified Hydra.Ast as Ast
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+associativityBoth :: Phantoms.TTerm Ast.Associativity
+associativityBoth =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "both"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+associativityLeft :: Phantoms.TTerm Ast.Associativity
+associativityLeft =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "left"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+associativityNone :: Phantoms.TTerm Ast.Associativity
+associativityNone =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "none"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+associativityRight :: Phantoms.TTerm Ast.Associativity
+associativityRight =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "right"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+blockStyle :: Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Bool -> Phantoms.TTerm Bool -> Phantoms.TTerm Ast.BlockStyle
+blockStyle indent newlineBeforeContent newlineAfterContent =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BlockStyle"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "indent"),
+          Core.fieldTerm = (Phantoms.unTTerm indent)},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineBeforeContent"),
+          Core.fieldTerm = (Phantoms.unTTerm newlineBeforeContent)},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineAfterContent"),
+          Core.fieldTerm = (Phantoms.unTTerm newlineAfterContent)}]}))
+
+blockStyleIndent :: Phantoms.TTerm Ast.BlockStyle -> Phantoms.TTerm (Maybe String)
+blockStyleIndent x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+        Core.projectionField = (Core.Name "indent")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+blockStyleNewlineAfterContent :: Phantoms.TTerm Ast.BlockStyle -> Phantoms.TTerm Bool
+blockStyleNewlineAfterContent x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+        Core.projectionField = (Core.Name "newlineAfterContent")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+blockStyleNewlineBeforeContent :: Phantoms.TTerm Ast.BlockStyle -> Phantoms.TTerm Bool
+blockStyleNewlineBeforeContent x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+        Core.projectionField = (Core.Name "newlineBeforeContent")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+blockStyleWithIndent :: Phantoms.TTerm Ast.BlockStyle -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Ast.BlockStyle
+blockStyleWithIndent original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BlockStyle"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "indent"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineBeforeContent"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+              Core.projectionField = (Core.Name "newlineBeforeContent")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineAfterContent"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+              Core.projectionField = (Core.Name "newlineAfterContent")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+blockStyleWithNewlineAfterContent :: Phantoms.TTerm Ast.BlockStyle -> Phantoms.TTerm Bool -> Phantoms.TTerm Ast.BlockStyle
+blockStyleWithNewlineAfterContent original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BlockStyle"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "indent"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+              Core.projectionField = (Core.Name "indent")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineBeforeContent"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+              Core.projectionField = (Core.Name "newlineBeforeContent")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineAfterContent"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+blockStyleWithNewlineBeforeContent :: Phantoms.TTerm Ast.BlockStyle -> Phantoms.TTerm Bool -> Phantoms.TTerm Ast.BlockStyle
+blockStyleWithNewlineBeforeContent original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BlockStyle"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "indent"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+              Core.projectionField = (Core.Name "indent")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineBeforeContent"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineAfterContent"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+              Core.projectionField = (Core.Name "newlineAfterContent")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+bracketExpr :: Phantoms.TTerm Ast.Brackets -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Ast.BlockStyle -> Phantoms.TTerm Ast.BracketExpr
+bracketExpr brackets enclosed style =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BracketExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "brackets"),
+          Core.fieldTerm = (Phantoms.unTTerm brackets)},
+        Core.Field {
+          Core.fieldName = (Core.Name "enclosed"),
+          Core.fieldTerm = (Phantoms.unTTerm enclosed)},
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (Phantoms.unTTerm style)}]}))
+
+bracketExprBrackets :: Phantoms.TTerm Ast.BracketExpr -> Phantoms.TTerm Ast.Brackets
+bracketExprBrackets x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+        Core.projectionField = (Core.Name "brackets")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bracketExprEnclosed :: Phantoms.TTerm Ast.BracketExpr -> Phantoms.TTerm Ast.Expr
+bracketExprEnclosed x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+        Core.projectionField = (Core.Name "enclosed")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bracketExprStyle :: Phantoms.TTerm Ast.BracketExpr -> Phantoms.TTerm Ast.BlockStyle
+bracketExprStyle x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+        Core.projectionField = (Core.Name "style")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bracketExprWithBrackets :: Phantoms.TTerm Ast.BracketExpr -> Phantoms.TTerm Ast.Brackets -> Phantoms.TTerm Ast.BracketExpr
+bracketExprWithBrackets original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BracketExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "brackets"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "enclosed"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+              Core.projectionField = (Core.Name "enclosed")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+              Core.projectionField = (Core.Name "style")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+bracketExprWithEnclosed :: Phantoms.TTerm Ast.BracketExpr -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Ast.BracketExpr
+bracketExprWithEnclosed original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BracketExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "brackets"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+              Core.projectionField = (Core.Name "brackets")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "enclosed"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+              Core.projectionField = (Core.Name "style")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+bracketExprWithStyle :: Phantoms.TTerm Ast.BracketExpr -> Phantoms.TTerm Ast.BlockStyle -> Phantoms.TTerm Ast.BracketExpr
+bracketExprWithStyle original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BracketExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "brackets"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+              Core.projectionField = (Core.Name "brackets")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "enclosed"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+              Core.projectionField = (Core.Name "enclosed")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+brackets :: Phantoms.TTerm Ast.Symbol -> Phantoms.TTerm Ast.Symbol -> Phantoms.TTerm Ast.Brackets
+brackets open close =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Brackets"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "open"),
+          Core.fieldTerm = (Phantoms.unTTerm open)},
+        Core.Field {
+          Core.fieldName = (Core.Name "close"),
+          Core.fieldTerm = (Phantoms.unTTerm close)}]}))
+
+bracketsClose :: Phantoms.TTerm Ast.Brackets -> Phantoms.TTerm Ast.Symbol
+bracketsClose x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.Brackets"),
+        Core.projectionField = (Core.Name "close")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bracketsOpen :: Phantoms.TTerm Ast.Brackets -> Phantoms.TTerm Ast.Symbol
+bracketsOpen x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.Brackets"),
+        Core.projectionField = (Core.Name "open")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bracketsWithClose :: Phantoms.TTerm Ast.Brackets -> Phantoms.TTerm Ast.Symbol -> Phantoms.TTerm Ast.Brackets
+bracketsWithClose original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Brackets"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "open"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Brackets"),
+              Core.projectionField = (Core.Name "open")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "close"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+bracketsWithOpen :: Phantoms.TTerm Ast.Brackets -> Phantoms.TTerm Ast.Symbol -> Phantoms.TTerm Ast.Brackets
+bracketsWithOpen original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Brackets"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "open"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "close"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Brackets"),
+              Core.projectionField = (Core.Name "close")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+exprBrackets :: Phantoms.TTerm Ast.BracketExpr -> Phantoms.TTerm Ast.Expr
+exprBrackets x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "brackets"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+exprConst :: Phantoms.TTerm Ast.Symbol -> Phantoms.TTerm Ast.Expr
+exprConst x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "const"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+exprIndent :: Phantoms.TTerm Ast.IndentedExpression -> Phantoms.TTerm Ast.Expr
+exprIndent x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "indent"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+exprOp :: Phantoms.TTerm Ast.OpExpr -> Phantoms.TTerm Ast.Expr
+exprOp x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "op"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+exprSeq :: Phantoms.TTerm Ast.SeqExpr -> Phantoms.TTerm Ast.Expr
+exprSeq x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "seq"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+indentStyleAllLines :: Phantoms.TTerm String -> Phantoms.TTerm Ast.IndentStyle
+indentStyleAllLines x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "allLines"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+indentStyleSubsequentLines :: Phantoms.TTerm String -> Phantoms.TTerm Ast.IndentStyle
+indentStyleSubsequentLines x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "subsequentLines"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+indentedExpression :: Phantoms.TTerm Ast.IndentStyle -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Ast.IndentedExpression
+indentedExpression style expr =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (Phantoms.unTTerm style)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expr"),
+          Core.fieldTerm = (Phantoms.unTTerm expr)}]}))
+
+indentedExpressionExpr :: Phantoms.TTerm Ast.IndentedExpression -> Phantoms.TTerm Ast.Expr
+indentedExpressionExpr x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+        Core.projectionField = (Core.Name "expr")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+indentedExpressionStyle :: Phantoms.TTerm Ast.IndentedExpression -> Phantoms.TTerm Ast.IndentStyle
+indentedExpressionStyle x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+        Core.projectionField = (Core.Name "style")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+indentedExpressionWithExpr :: Phantoms.TTerm Ast.IndentedExpression -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Ast.IndentedExpression
+indentedExpressionWithExpr original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+              Core.projectionField = (Core.Name "style")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expr"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+indentedExpressionWithStyle :: Phantoms.TTerm Ast.IndentedExpression -> Phantoms.TTerm Ast.IndentStyle -> Phantoms.TTerm Ast.IndentedExpression
+indentedExpressionWithStyle original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expr"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+              Core.projectionField = (Core.Name "expr")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+op :: Phantoms.TTerm Ast.Symbol -> Phantoms.TTerm Ast.Padding -> Phantoms.TTerm Ast.Precedence -> Phantoms.TTerm Ast.Associativity -> Phantoms.TTerm Ast.Op
+op symbol padding precedence associativity =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Op"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "symbol"),
+          Core.fieldTerm = (Phantoms.unTTerm symbol)},
+        Core.Field {
+          Core.fieldName = (Core.Name "padding"),
+          Core.fieldTerm = (Phantoms.unTTerm padding)},
+        Core.Field {
+          Core.fieldName = (Core.Name "precedence"),
+          Core.fieldTerm = (Phantoms.unTTerm precedence)},
+        Core.Field {
+          Core.fieldName = (Core.Name "associativity"),
+          Core.fieldTerm = (Phantoms.unTTerm associativity)}]}))
+
+opAssociativity :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Associativity
+opAssociativity x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+        Core.projectionField = (Core.Name "associativity")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+opExpr :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Ast.OpExpr
+opExpr op lhs rhs =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.OpExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (Phantoms.unTTerm op)},
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Phantoms.unTTerm lhs)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm rhs)}]}))
+
+opExprLhs :: Phantoms.TTerm Ast.OpExpr -> Phantoms.TTerm Ast.Expr
+opExprLhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+        Core.projectionField = (Core.Name "lhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+opExprOp :: Phantoms.TTerm Ast.OpExpr -> Phantoms.TTerm Ast.Op
+opExprOp x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+        Core.projectionField = (Core.Name "op")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+opExprRhs :: Phantoms.TTerm Ast.OpExpr -> Phantoms.TTerm Ast.Expr
+opExprRhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+        Core.projectionField = (Core.Name "rhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+opExprWithLhs :: Phantoms.TTerm Ast.OpExpr -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Ast.OpExpr
+opExprWithLhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.OpExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+              Core.projectionField = (Core.Name "op")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+opExprWithOp :: Phantoms.TTerm Ast.OpExpr -> Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.OpExpr
+opExprWithOp original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.OpExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+              Core.projectionField = (Core.Name "lhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+opExprWithRhs :: Phantoms.TTerm Ast.OpExpr -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Ast.OpExpr
+opExprWithRhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.OpExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+              Core.projectionField = (Core.Name "op")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+              Core.projectionField = (Core.Name "lhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+opPadding :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Padding
+opPadding x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+        Core.projectionField = (Core.Name "padding")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+opPrecedence :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Precedence
+opPrecedence x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+        Core.projectionField = (Core.Name "precedence")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+opSymbol :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Symbol
+opSymbol x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+        Core.projectionField = (Core.Name "symbol")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+opWithAssociativity :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Associativity -> Phantoms.TTerm Ast.Op
+opWithAssociativity original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Op"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "symbol"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "symbol")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "padding"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "padding")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "precedence"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "precedence")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "associativity"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+opWithPadding :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Padding -> Phantoms.TTerm Ast.Op
+opWithPadding original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Op"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "symbol"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "symbol")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "padding"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "precedence"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "precedence")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "associativity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "associativity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+opWithPrecedence :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Precedence -> Phantoms.TTerm Ast.Op
+opWithPrecedence original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Op"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "symbol"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "symbol")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "padding"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "padding")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "precedence"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "associativity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "associativity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+opWithSymbol :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.Symbol -> Phantoms.TTerm Ast.Op
+opWithSymbol original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Op"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "symbol"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "padding"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "padding")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "precedence"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "precedence")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "associativity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+              Core.projectionField = (Core.Name "associativity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+padding :: Phantoms.TTerm Ast.Ws -> Phantoms.TTerm Ast.Ws -> Phantoms.TTerm Ast.Padding
+padding left right =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Padding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm left)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm right)}]}))
+
+paddingLeft :: Phantoms.TTerm Ast.Padding -> Phantoms.TTerm Ast.Ws
+paddingLeft x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.Padding"),
+        Core.projectionField = (Core.Name "left")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+paddingRight :: Phantoms.TTerm Ast.Padding -> Phantoms.TTerm Ast.Ws
+paddingRight x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.Padding"),
+        Core.projectionField = (Core.Name "right")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+paddingWithLeft :: Phantoms.TTerm Ast.Padding -> Phantoms.TTerm Ast.Ws -> Phantoms.TTerm Ast.Padding
+paddingWithLeft original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Padding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Padding"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+paddingWithRight :: Phantoms.TTerm Ast.Padding -> Phantoms.TTerm Ast.Ws -> Phantoms.TTerm Ast.Padding
+paddingWithRight original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Padding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.Padding"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+precedence :: Phantoms.TTerm Int -> Phantoms.TTerm Ast.Precedence
+precedence x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ast.Precedence"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+seqExpr :: Phantoms.TTerm Ast.Op -> Phantoms.TTerm [Ast.Expr] -> Phantoms.TTerm Ast.SeqExpr
+seqExpr op elements =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.SeqExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (Phantoms.unTTerm op)},
+        Core.Field {
+          Core.fieldName = (Core.Name "elements"),
+          Core.fieldTerm = (Phantoms.unTTerm elements)}]}))
+
+seqExprElements :: Phantoms.TTerm Ast.SeqExpr -> Phantoms.TTerm [Ast.Expr]
+seqExprElements x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.SeqExpr"),
+        Core.projectionField = (Core.Name "elements")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+seqExprOp :: Phantoms.TTerm Ast.SeqExpr -> Phantoms.TTerm Ast.Op
+seqExprOp x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ast.SeqExpr"),
+        Core.projectionField = (Core.Name "op")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+seqExprWithElements :: Phantoms.TTerm Ast.SeqExpr -> Phantoms.TTerm [Ast.Expr] -> Phantoms.TTerm Ast.SeqExpr
+seqExprWithElements original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.SeqExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.SeqExpr"),
+              Core.projectionField = (Core.Name "op")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "elements"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+seqExprWithOp :: Phantoms.TTerm Ast.SeqExpr -> Phantoms.TTerm Ast.Op -> Phantoms.TTerm Ast.SeqExpr
+seqExprWithOp original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.SeqExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "elements"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ast.SeqExpr"),
+              Core.projectionField = (Core.Name "elements")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+symbol :: Phantoms.TTerm String -> Phantoms.TTerm Ast.Symbol
+symbol x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ast.Symbol"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+unPrecedence :: Phantoms.TTerm Ast.Precedence -> Phantoms.TTerm Int
+unPrecedence x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ast.Precedence")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unSymbol :: Phantoms.TTerm Ast.Symbol -> Phantoms.TTerm String
+unSymbol x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ast.Symbol")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+wsBreak :: Phantoms.TTerm Ast.Ws
+wsBreak =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "break"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+wsBreakAndIndent :: Phantoms.TTerm String -> Phantoms.TTerm Ast.Ws
+wsBreakAndIndent x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "breakAndIndent"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+wsDoubleBreak :: Phantoms.TTerm Ast.Ws
+wsDoubleBreak =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "doubleBreak"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+wsNone :: Phantoms.TTerm Ast.Ws
+wsNone =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "none"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+wsSpace :: Phantoms.TTerm Ast.Ws
+wsSpace =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "space"),
+        Core.fieldTerm = Core.TermUnit}}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Classes.hs b/src/gen-main/haskell/Hydra/Dsl/Classes.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Classes.hs
@@ -0,0 +1,31 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.classes
+
+module Hydra.Dsl.Classes where
+
+import qualified Hydra.Classes as Classes
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+typeClassEquality :: Phantoms.TTerm Classes.TypeClass
+typeClassEquality =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "equality"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeClassOrdering :: Phantoms.TTerm Classes.TypeClass
+typeClassOrdering =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "ordering"),
+        Core.fieldTerm = Core.TermUnit}}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Coders.hs b/src/gen-main/haskell/Hydra/Dsl/Coders.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Coders.hs
@@ -0,0 +1,788 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.coders
+
+module Hydra.Dsl.Coders where
+
+import qualified Hydra.Coders as Coders
+import qualified Hydra.Core as Core
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Util as Util
+import qualified Hydra.Variants as Variants
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+adapterContext :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm Coders.Language -> Phantoms.TTerm (M.Map Core.Name (Util.Adapter Core.Type Core.Type Core.Term Core.Term)) -> Phantoms.TTerm Coders.AdapterContext
+adapterContext graph language adapters =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.AdapterContext"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (Phantoms.unTTerm graph)},
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Phantoms.unTTerm language)},
+        Core.Field {
+          Core.fieldName = (Core.Name "adapters"),
+          Core.fieldTerm = (Phantoms.unTTerm adapters)}]}))
+
+adapterContextAdapters :: Phantoms.TTerm Coders.AdapterContext -> Phantoms.TTerm (M.Map Core.Name (Util.Adapter Core.Type Core.Type Core.Term Core.Term))
+adapterContextAdapters x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+        Core.projectionField = (Core.Name "adapters")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+adapterContextGraph :: Phantoms.TTerm Coders.AdapterContext -> Phantoms.TTerm Graph.Graph
+adapterContextGraph x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+        Core.projectionField = (Core.Name "graph")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+adapterContextLanguage :: Phantoms.TTerm Coders.AdapterContext -> Phantoms.TTerm Coders.Language
+adapterContextLanguage x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+        Core.projectionField = (Core.Name "language")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+adapterContextWithAdapters :: Phantoms.TTerm Coders.AdapterContext -> Phantoms.TTerm (M.Map Core.Name (Util.Adapter Core.Type Core.Type Core.Term Core.Term)) -> Phantoms.TTerm Coders.AdapterContext
+adapterContextWithAdapters original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.AdapterContext"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+              Core.projectionField = (Core.Name "graph")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "adapters"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+adapterContextWithGraph :: Phantoms.TTerm Coders.AdapterContext -> Phantoms.TTerm Graph.Graph -> Phantoms.TTerm Coders.AdapterContext
+adapterContextWithGraph original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.AdapterContext"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "adapters"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+              Core.projectionField = (Core.Name "adapters")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+adapterContextWithLanguage :: Phantoms.TTerm Coders.AdapterContext -> Phantoms.TTerm Coders.Language -> Phantoms.TTerm Coders.AdapterContext
+adapterContextWithLanguage original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.AdapterContext"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+              Core.projectionField = (Core.Name "graph")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "adapters"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.AdapterContext"),
+              Core.projectionField = (Core.Name "adapters")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+coderDirectionDecode :: Phantoms.TTerm Coders.CoderDirection
+coderDirectionDecode =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "decode"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+coderDirectionEncode :: Phantoms.TTerm Coders.CoderDirection
+coderDirectionEncode =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "encode"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+language :: Phantoms.TTerm Coders.LanguageName -> Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm Coders.Language
+language name constraints =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.Language"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "constraints"),
+          Core.fieldTerm = (Phantoms.unTTerm constraints)}]}))
+
+languageConstraints :: Phantoms.TTerm Coders.Language -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraints x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.Language"),
+        Core.projectionField = (Core.Name "constraints")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsEliminationVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.EliminationVariant)
+languageConstraintsEliminationVariants x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+        Core.projectionField = (Core.Name "eliminationVariants")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsFloatTypes :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Core.FloatType)
+languageConstraintsFloatTypes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+        Core.projectionField = (Core.Name "floatTypes")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsFunctionVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.FunctionVariant)
+languageConstraintsFunctionVariants x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+        Core.projectionField = (Core.Name "functionVariants")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsIntegerTypes :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Core.IntegerType)
+languageConstraintsIntegerTypes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+        Core.projectionField = (Core.Name "integerTypes")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsLiteralVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.LiteralVariant)
+languageConstraintsLiteralVariants x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+        Core.projectionField = (Core.Name "literalVariants")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsTermVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.TermVariant)
+languageConstraintsTermVariants x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+        Core.projectionField = (Core.Name "termVariants")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsTypeVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.TypeVariant)
+languageConstraintsTypeVariants x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+        Core.projectionField = (Core.Name "typeVariants")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsTypes :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (Core.Type -> Bool)
+languageConstraintsTypes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+        Core.projectionField = (Core.Name "types")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageConstraintsWithEliminationVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.EliminationVariant) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraintsWithEliminationVariants original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "literalVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "floatTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "functionVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "integerTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "termVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "typeVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+languageConstraintsWithFloatTypes :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Core.FloatType) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraintsWithFloatTypes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "eliminationVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "literalVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "functionVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "integerTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "termVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "typeVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+languageConstraintsWithFunctionVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.FunctionVariant) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraintsWithFunctionVariants original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "eliminationVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "literalVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "floatTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "integerTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "termVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "typeVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+languageConstraintsWithIntegerTypes :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Core.IntegerType) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraintsWithIntegerTypes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "eliminationVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "literalVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "floatTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "functionVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "termVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "typeVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+languageConstraintsWithLiteralVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.LiteralVariant) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraintsWithLiteralVariants original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "eliminationVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "floatTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "functionVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "integerTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "termVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "typeVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+languageConstraintsWithTermVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.TermVariant) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraintsWithTermVariants original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "eliminationVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "literalVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "floatTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "functionVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "integerTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "typeVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+languageConstraintsWithTypeVariants :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (S.Set Variants.TypeVariant) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraintsWithTypeVariants original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "eliminationVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "literalVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "floatTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "functionVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "integerTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "termVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+languageConstraintsWithTypes :: Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm (Core.Type -> Bool) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraintsWithTypes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "eliminationVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "literalVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "floatTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "functionVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "integerTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "termVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+              Core.projectionField = (Core.Name "typeVariants")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+languageConstraints_ :: Phantoms.TTerm (S.Set Variants.EliminationVariant) -> Phantoms.TTerm (S.Set Variants.LiteralVariant) -> Phantoms.TTerm (S.Set Core.FloatType) -> Phantoms.TTerm (S.Set Variants.FunctionVariant) -> Phantoms.TTerm (S.Set Core.IntegerType) -> Phantoms.TTerm (S.Set Variants.TermVariant) -> Phantoms.TTerm (S.Set Variants.TypeVariant) -> Phantoms.TTerm (Core.Type -> Bool) -> Phantoms.TTerm Coders.LanguageConstraints
+languageConstraints_ eliminationVariants literalVariants floatTypes functionVariants integerTypes termVariants typeVariants types =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.LanguageConstraints"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "eliminationVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm eliminationVariants)},
+        Core.Field {
+          Core.fieldName = (Core.Name "literalVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm literalVariants)},
+        Core.Field {
+          Core.fieldName = (Core.Name "floatTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm floatTypes)},
+        Core.Field {
+          Core.fieldName = (Core.Name "functionVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm functionVariants)},
+        Core.Field {
+          Core.fieldName = (Core.Name "integerTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm integerTypes)},
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm termVariants)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariants"),
+          Core.fieldTerm = (Phantoms.unTTerm typeVariants)},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Phantoms.unTTerm types)}]}))
+
+languageName :: Phantoms.TTerm Coders.Language -> Phantoms.TTerm Coders.LanguageName
+languageName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.coders.Language"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+languageName_ :: Phantoms.TTerm String -> Phantoms.TTerm Coders.LanguageName
+languageName_ x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.coders.LanguageName"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+languageWithConstraints :: Phantoms.TTerm Coders.Language -> Phantoms.TTerm Coders.LanguageConstraints -> Phantoms.TTerm Coders.Language
+languageWithConstraints original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.Language"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.Language"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "constraints"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+languageWithName :: Phantoms.TTerm Coders.Language -> Phantoms.TTerm Coders.LanguageName -> Phantoms.TTerm Coders.Language
+languageWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.coders.Language"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "constraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.coders.Language"),
+              Core.projectionField = (Core.Name "constraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+traversalOrderPost :: Phantoms.TTerm Coders.TraversalOrder
+traversalOrderPost =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "post"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+traversalOrderPre :: Phantoms.TTerm Coders.TraversalOrder
+traversalOrderPre =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pre"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+unLanguageName :: Phantoms.TTerm Coders.LanguageName -> Phantoms.TTerm String
+unLanguageName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.coders.LanguageName")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Context.hs b/src/gen-main/haskell/Hydra/Dsl/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Context.hs
@@ -0,0 +1,183 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.context
+
+module Hydra.Dsl.Context where
+
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+context :: Phantoms.TTerm [String] -> Phantoms.TTerm [String] -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Context.Context
+context trace messages other =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.Context"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "trace"),
+          Core.fieldTerm = (Phantoms.unTTerm trace)},
+        Core.Field {
+          Core.fieldName = (Core.Name "messages"),
+          Core.fieldTerm = (Phantoms.unTTerm messages)},
+        Core.Field {
+          Core.fieldName = (Core.Name "other"),
+          Core.fieldTerm = (Phantoms.unTTerm other)}]}))
+
+contextMessages :: Phantoms.TTerm Context.Context -> Phantoms.TTerm [String]
+contextMessages x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+        Core.projectionField = (Core.Name "messages")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+contextOther :: Phantoms.TTerm Context.Context -> Phantoms.TTerm (M.Map Core.Name Core.Term)
+contextOther x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+        Core.projectionField = (Core.Name "other")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+contextTrace :: Phantoms.TTerm Context.Context -> Phantoms.TTerm [String]
+contextTrace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+        Core.projectionField = (Core.Name "trace")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+contextWithMessages :: Phantoms.TTerm Context.Context -> Phantoms.TTerm [String] -> Phantoms.TTerm Context.Context
+contextWithMessages original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.Context"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "trace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+              Core.projectionField = (Core.Name "trace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "messages"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "other"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+              Core.projectionField = (Core.Name "other")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+contextWithOther :: Phantoms.TTerm Context.Context -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Context.Context
+contextWithOther original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.Context"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "trace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+              Core.projectionField = (Core.Name "trace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "messages"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+              Core.projectionField = (Core.Name "messages")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "other"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+contextWithTrace :: Phantoms.TTerm Context.Context -> Phantoms.TTerm [String] -> Phantoms.TTerm Context.Context
+contextWithTrace original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.Context"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "trace"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "messages"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+              Core.projectionField = (Core.Name "messages")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "other"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+              Core.projectionField = (Core.Name "other")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+inContext :: Phantoms.TTerm e -> Phantoms.TTerm Context.Context -> Phantoms.TTerm (Context.InContext e)
+inContext object context =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.InContext"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (Phantoms.unTTerm object)},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Phantoms.unTTerm context)}]}))
+
+inContextContext :: Phantoms.TTerm (Context.InContext e) -> Phantoms.TTerm Context.Context
+inContextContext x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.context.InContext"),
+        Core.projectionField = (Core.Name "context")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inContextObject :: Phantoms.TTerm (Context.InContext e) -> Phantoms.TTerm e
+inContextObject x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.context.InContext"),
+        Core.projectionField = (Core.Name "object")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inContextWithContext :: Phantoms.TTerm (Context.InContext e) -> Phantoms.TTerm Context.Context -> Phantoms.TTerm (Context.InContext e)
+inContextWithContext original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.InContext"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.context.InContext"),
+              Core.projectionField = (Core.Name "object")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+inContextWithObject :: Phantoms.TTerm (Context.InContext e) -> Phantoms.TTerm e -> Phantoms.TTerm (Context.InContext e)
+inContextWithObject original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.InContext"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.context.InContext"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Core.hs b/src/gen-main/haskell/Hydra/Dsl/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Core.hs
@@ -0,0 +1,2164 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.core
+
+module Hydra.Dsl.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+annotatedTerm :: Phantoms.TTerm Core.Term -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Core.AnnotatedTerm
+annotatedTerm body annotation =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)},
+        Core.Field {
+          Core.fieldName = (Core.Name "annotation"),
+          Core.fieldTerm = (Phantoms.unTTerm annotation)}]}))
+
+annotatedTermAnnotation :: Phantoms.TTerm Core.AnnotatedTerm -> Phantoms.TTerm (M.Map Core.Name Core.Term)
+annotatedTermAnnotation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+        Core.projectionField = (Core.Name "annotation")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+annotatedTermBody :: Phantoms.TTerm Core.AnnotatedTerm -> Phantoms.TTerm Core.Term
+annotatedTermBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+annotatedTermWithAnnotation :: Phantoms.TTerm Core.AnnotatedTerm -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Core.AnnotatedTerm
+annotatedTermWithAnnotation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "annotation"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+annotatedTermWithBody :: Phantoms.TTerm Core.AnnotatedTerm -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.AnnotatedTerm
+annotatedTermWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "annotation"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+              Core.projectionField = (Core.Name "annotation")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+annotatedType :: Phantoms.TTerm Core.Type -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Core.AnnotatedType
+annotatedType body annotation =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)},
+        Core.Field {
+          Core.fieldName = (Core.Name "annotation"),
+          Core.fieldTerm = (Phantoms.unTTerm annotation)}]}))
+
+annotatedTypeAnnotation :: Phantoms.TTerm Core.AnnotatedType -> Phantoms.TTerm (M.Map Core.Name Core.Term)
+annotatedTypeAnnotation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedType"),
+        Core.projectionField = (Core.Name "annotation")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+annotatedTypeBody :: Phantoms.TTerm Core.AnnotatedType -> Phantoms.TTerm Core.Type
+annotatedTypeBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedType"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+annotatedTypeWithAnnotation :: Phantoms.TTerm Core.AnnotatedType -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Core.AnnotatedType
+annotatedTypeWithAnnotation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedType"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "annotation"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+annotatedTypeWithBody :: Phantoms.TTerm Core.AnnotatedType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.AnnotatedType
+annotatedTypeWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "annotation"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedType"),
+              Core.projectionField = (Core.Name "annotation")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+application :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Application
+application function argument =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Application"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Phantoms.unTTerm function)},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Phantoms.unTTerm argument)}]}))
+
+applicationArgument :: Phantoms.TTerm Core.Application -> Phantoms.TTerm Core.Term
+applicationArgument x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Application"),
+        Core.projectionField = (Core.Name "argument")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationFunction :: Phantoms.TTerm Core.Application -> Phantoms.TTerm Core.Term
+applicationFunction x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Application"),
+        Core.projectionField = (Core.Name "function")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationType :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.ApplicationType
+applicationType function argument =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.ApplicationType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Phantoms.unTTerm function)},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Phantoms.unTTerm argument)}]}))
+
+applicationTypeArgument :: Phantoms.TTerm Core.ApplicationType -> Phantoms.TTerm Core.Type
+applicationTypeArgument x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.ApplicationType"),
+        Core.projectionField = (Core.Name "argument")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationTypeFunction :: Phantoms.TTerm Core.ApplicationType -> Phantoms.TTerm Core.Type
+applicationTypeFunction x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.ApplicationType"),
+        Core.projectionField = (Core.Name "function")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationTypeWithArgument :: Phantoms.TTerm Core.ApplicationType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.ApplicationType
+applicationTypeWithArgument original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.ApplicationType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.ApplicationType"),
+              Core.projectionField = (Core.Name "function")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+applicationTypeWithFunction :: Phantoms.TTerm Core.ApplicationType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.ApplicationType
+applicationTypeWithFunction original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.ApplicationType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.ApplicationType"),
+              Core.projectionField = (Core.Name "argument")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+applicationWithArgument :: Phantoms.TTerm Core.Application -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Application
+applicationWithArgument original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Application"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Application"),
+              Core.projectionField = (Core.Name "function")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+applicationWithFunction :: Phantoms.TTerm Core.Application -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Application
+applicationWithFunction original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Application"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Application"),
+              Core.projectionField = (Core.Name "argument")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+binding :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Term -> Phantoms.TTerm (Maybe Core.TypeScheme) -> Phantoms.TTerm Core.Binding
+binding name term type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Binding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm term)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+bindingName :: Phantoms.TTerm Core.Binding -> Phantoms.TTerm Core.Name
+bindingName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bindingTerm :: Phantoms.TTerm Core.Binding -> Phantoms.TTerm Core.Term
+bindingTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+        Core.projectionField = (Core.Name "term")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bindingType :: Phantoms.TTerm Core.Binding -> Phantoms.TTerm (Maybe Core.TypeScheme)
+bindingType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bindingWithName :: Phantoms.TTerm Core.Binding -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Binding
+bindingWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Binding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+bindingWithTerm :: Phantoms.TTerm Core.Binding -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Binding
+bindingWithTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Binding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+bindingWithType :: Phantoms.TTerm Core.Binding -> Phantoms.TTerm (Maybe Core.TypeScheme) -> Phantoms.TTerm Core.Binding
+bindingWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Binding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+caseStatement :: Phantoms.TTerm Core.Name -> Phantoms.TTerm (Maybe Core.Term) -> Phantoms.TTerm [Core.Field] -> Phantoms.TTerm Core.CaseStatement
+caseStatement typeName default_ cases =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.CaseStatement"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "default"),
+          Core.fieldTerm = (Phantoms.unTTerm default_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Phantoms.unTTerm cases)}]}))
+
+caseStatementCases :: Phantoms.TTerm Core.CaseStatement -> Phantoms.TTerm [Core.Field]
+caseStatementCases x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+        Core.projectionField = (Core.Name "cases")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseStatementDefault :: Phantoms.TTerm Core.CaseStatement -> Phantoms.TTerm (Maybe Core.Term)
+caseStatementDefault x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+        Core.projectionField = (Core.Name "default")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseStatementTypeName :: Phantoms.TTerm Core.CaseStatement -> Phantoms.TTerm Core.Name
+caseStatementTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseStatementWithCases :: Phantoms.TTerm Core.CaseStatement -> Phantoms.TTerm [Core.Field] -> Phantoms.TTerm Core.CaseStatement
+caseStatementWithCases original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.CaseStatement"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "default"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+              Core.projectionField = (Core.Name "default")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+caseStatementWithDefault :: Phantoms.TTerm Core.CaseStatement -> Phantoms.TTerm (Maybe Core.Term) -> Phantoms.TTerm Core.CaseStatement
+caseStatementWithDefault original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.CaseStatement"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "default"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+              Core.projectionField = (Core.Name "cases")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+caseStatementWithTypeName :: Phantoms.TTerm Core.CaseStatement -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.CaseStatement
+caseStatementWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.CaseStatement"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "default"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+              Core.projectionField = (Core.Name "default")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+              Core.projectionField = (Core.Name "cases")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+eitherType :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.EitherType
+eitherType left right =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.EitherType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm left)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm right)}]}))
+
+eitherTypeLeft :: Phantoms.TTerm Core.EitherType -> Phantoms.TTerm Core.Type
+eitherTypeLeft x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.EitherType"),
+        Core.projectionField = (Core.Name "left")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+eitherTypeRight :: Phantoms.TTerm Core.EitherType -> Phantoms.TTerm Core.Type
+eitherTypeRight x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.EitherType"),
+        Core.projectionField = (Core.Name "right")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+eitherTypeWithLeft :: Phantoms.TTerm Core.EitherType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.EitherType
+eitherTypeWithLeft original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.EitherType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.EitherType"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+eitherTypeWithRight :: Phantoms.TTerm Core.EitherType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.EitherType
+eitherTypeWithRight original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.EitherType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.EitherType"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+eliminationRecord :: Phantoms.TTerm Core.Projection -> Phantoms.TTerm Core.Elimination
+eliminationRecord x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "record"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+eliminationUnion :: Phantoms.TTerm Core.CaseStatement -> Phantoms.TTerm Core.Elimination
+eliminationUnion x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "union"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+eliminationWrap :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Elimination
+eliminationWrap x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wrap"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+field :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Field
+field name term =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Field"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm term)}]}))
+
+fieldName :: Phantoms.TTerm Core.Field -> Phantoms.TTerm Core.Name
+fieldName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldTerm :: Phantoms.TTerm Core.Field -> Phantoms.TTerm Core.Term
+fieldTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+        Core.projectionField = (Core.Name "term")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldType :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.FieldType
+fieldType name type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.FieldType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+fieldTypeName :: Phantoms.TTerm Core.FieldType -> Phantoms.TTerm Core.Name
+fieldTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.FieldType"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldTypeType :: Phantoms.TTerm Core.FieldType -> Phantoms.TTerm Core.Type
+fieldTypeType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.FieldType"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldTypeWithName :: Phantoms.TTerm Core.FieldType -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.FieldType
+fieldTypeWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.FieldType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.FieldType"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+fieldTypeWithType :: Phantoms.TTerm Core.FieldType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.FieldType
+fieldTypeWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.FieldType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.FieldType"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+fieldWithName :: Phantoms.TTerm Core.Field -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Field
+fieldWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Field"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+fieldWithTerm :: Phantoms.TTerm Core.Field -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Field
+fieldWithTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Field"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+floatTypeBigfloat :: Phantoms.TTerm Core.FloatType
+floatTypeBigfloat =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "bigfloat"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+floatTypeFloat32 :: Phantoms.TTerm Core.FloatType
+floatTypeFloat32 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float32"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+floatTypeFloat64 :: Phantoms.TTerm Core.FloatType
+floatTypeFloat64 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float64"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+floatValueBigfloat :: Phantoms.TTerm Double -> Phantoms.TTerm Core.FloatValue
+floatValueBigfloat x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "bigfloat"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+floatValueFloat32 :: Phantoms.TTerm Float -> Phantoms.TTerm Core.FloatValue
+floatValueFloat32 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float32"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+floatValueFloat64 :: Phantoms.TTerm Double -> Phantoms.TTerm Core.FloatValue
+floatValueFloat64 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float64"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+forallType :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.ForallType
+forallType parameter body =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.ForallType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Phantoms.unTTerm parameter)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)}]}))
+
+forallTypeBody :: Phantoms.TTerm Core.ForallType -> Phantoms.TTerm Core.Type
+forallTypeBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+forallTypeParameter :: Phantoms.TTerm Core.ForallType -> Phantoms.TTerm Core.Name
+forallTypeParameter x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
+        Core.projectionField = (Core.Name "parameter")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+forallTypeWithBody :: Phantoms.TTerm Core.ForallType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.ForallType
+forallTypeWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.ForallType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
+              Core.projectionField = (Core.Name "parameter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+forallTypeWithParameter :: Phantoms.TTerm Core.ForallType -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.ForallType
+forallTypeWithParameter original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.ForallType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+functionElimination :: Phantoms.TTerm Core.Elimination -> Phantoms.TTerm Core.Function
+functionElimination x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "elimination"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+functionLambda :: Phantoms.TTerm Core.Lambda -> Phantoms.TTerm Core.Function
+functionLambda x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lambda"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+functionPrimitive :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Function
+functionPrimitive x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "primitive"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+functionType :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.FunctionType
+functionType domain codomain =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.FunctionType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Phantoms.unTTerm domain)},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Phantoms.unTTerm codomain)}]}))
+
+functionTypeCodomain :: Phantoms.TTerm Core.FunctionType -> Phantoms.TTerm Core.Type
+functionTypeCodomain x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.FunctionType"),
+        Core.projectionField = (Core.Name "codomain")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionTypeDomain :: Phantoms.TTerm Core.FunctionType -> Phantoms.TTerm Core.Type
+functionTypeDomain x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.FunctionType"),
+        Core.projectionField = (Core.Name "domain")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionTypeWithCodomain :: Phantoms.TTerm Core.FunctionType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.FunctionType
+functionTypeWithCodomain original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.FunctionType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.FunctionType"),
+              Core.projectionField = (Core.Name "domain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+functionTypeWithDomain :: Phantoms.TTerm Core.FunctionType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.FunctionType
+functionTypeWithDomain original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.FunctionType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.FunctionType"),
+              Core.projectionField = (Core.Name "codomain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+injection :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Field -> Phantoms.TTerm Core.Injection
+injection typeName field =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Phantoms.unTTerm field)}]}))
+
+injectionField :: Phantoms.TTerm Core.Injection -> Phantoms.TTerm Core.Field
+injectionField x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+        Core.projectionField = (Core.Name "field")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+injectionTypeName :: Phantoms.TTerm Core.Injection -> Phantoms.TTerm Core.Name
+injectionTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+injectionWithField :: Phantoms.TTerm Core.Injection -> Phantoms.TTerm Core.Field -> Phantoms.TTerm Core.Injection
+injectionWithField original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+injectionWithTypeName :: Phantoms.TTerm Core.Injection -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Injection
+injectionWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+              Core.projectionField = (Core.Name "field")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+integerTypeBigint :: Phantoms.TTerm Core.IntegerType
+integerTypeBigint =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "bigint"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerTypeInt16 :: Phantoms.TTerm Core.IntegerType
+integerTypeInt16 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int16"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerTypeInt32 :: Phantoms.TTerm Core.IntegerType
+integerTypeInt32 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int32"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerTypeInt64 :: Phantoms.TTerm Core.IntegerType
+integerTypeInt64 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int64"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerTypeInt8 :: Phantoms.TTerm Core.IntegerType
+integerTypeInt8 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int8"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerTypeUint16 :: Phantoms.TTerm Core.IntegerType
+integerTypeUint16 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "uint16"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerTypeUint32 :: Phantoms.TTerm Core.IntegerType
+integerTypeUint32 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "uint32"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerTypeUint64 :: Phantoms.TTerm Core.IntegerType
+integerTypeUint64 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "uint64"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerTypeUint8 :: Phantoms.TTerm Core.IntegerType
+integerTypeUint8 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "uint8"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+integerValueBigint :: Phantoms.TTerm Integer -> Phantoms.TTerm Core.IntegerValue
+integerValueBigint x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "bigint"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+integerValueInt16 :: Phantoms.TTerm I.Int16 -> Phantoms.TTerm Core.IntegerValue
+integerValueInt16 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int16"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+integerValueInt32 :: Phantoms.TTerm Int -> Phantoms.TTerm Core.IntegerValue
+integerValueInt32 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int32"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+integerValueInt64 :: Phantoms.TTerm I.Int64 -> Phantoms.TTerm Core.IntegerValue
+integerValueInt64 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int64"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+integerValueInt8 :: Phantoms.TTerm I.Int8 -> Phantoms.TTerm Core.IntegerValue
+integerValueInt8 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int8"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+integerValueUint16 :: Phantoms.TTerm Int -> Phantoms.TTerm Core.IntegerValue
+integerValueUint16 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "uint16"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+integerValueUint32 :: Phantoms.TTerm I.Int64 -> Phantoms.TTerm Core.IntegerValue
+integerValueUint32 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "uint32"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+integerValueUint64 :: Phantoms.TTerm Integer -> Phantoms.TTerm Core.IntegerValue
+integerValueUint64 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "uint64"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+integerValueUint8 :: Phantoms.TTerm I.Int16 -> Phantoms.TTerm Core.IntegerValue
+integerValueUint8 x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "uint8"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+lambda :: Phantoms.TTerm Core.Name -> Phantoms.TTerm (Maybe Core.Type) -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Lambda
+lambda parameter domain body =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Lambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Phantoms.unTTerm parameter)},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Phantoms.unTTerm domain)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)}]}))
+
+lambdaBody :: Phantoms.TTerm Core.Lambda -> Phantoms.TTerm Core.Term
+lambdaBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+lambdaDomain :: Phantoms.TTerm Core.Lambda -> Phantoms.TTerm (Maybe Core.Type)
+lambdaDomain x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+        Core.projectionField = (Core.Name "domain")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+lambdaParameter :: Phantoms.TTerm Core.Lambda -> Phantoms.TTerm Core.Name
+lambdaParameter x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+        Core.projectionField = (Core.Name "parameter")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+lambdaWithBody :: Phantoms.TTerm Core.Lambda -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Lambda
+lambdaWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Lambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+              Core.projectionField = (Core.Name "parameter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+              Core.projectionField = (Core.Name "domain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+lambdaWithDomain :: Phantoms.TTerm Core.Lambda -> Phantoms.TTerm (Maybe Core.Type) -> Phantoms.TTerm Core.Lambda
+lambdaWithDomain original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Lambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+              Core.projectionField = (Core.Name "parameter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+lambdaWithParameter :: Phantoms.TTerm Core.Lambda -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Lambda
+lambdaWithParameter original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Lambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+              Core.projectionField = (Core.Name "domain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+let_ :: Phantoms.TTerm [Core.Binding] -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Let
+let_ bindings body =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Let"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm bindings)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)}]}))
+
+letBindings :: Phantoms.TTerm Core.Let -> Phantoms.TTerm [Core.Binding]
+letBindings x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Let"),
+        Core.projectionField = (Core.Name "bindings")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+letBody :: Phantoms.TTerm Core.Let -> Phantoms.TTerm Core.Term
+letBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Let"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+letWithBindings :: Phantoms.TTerm Core.Let -> Phantoms.TTerm [Core.Binding] -> Phantoms.TTerm Core.Let
+letWithBindings original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Let"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Let"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+letWithBody :: Phantoms.TTerm Core.Let -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Let
+letWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Let"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Let"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+literalBinary :: Phantoms.TTerm B.ByteString -> Phantoms.TTerm Core.Literal
+literalBinary x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "binary"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalBoolean :: Phantoms.TTerm Bool -> Phantoms.TTerm Core.Literal
+literalBoolean x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "boolean"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalFloat :: Phantoms.TTerm Core.FloatValue -> Phantoms.TTerm Core.Literal
+literalFloat x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalInteger :: Phantoms.TTerm Core.IntegerValue -> Phantoms.TTerm Core.Literal
+literalInteger x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "integer"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalString :: Phantoms.TTerm String -> Phantoms.TTerm Core.Literal
+literalString x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "string"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalTypeBinary :: Phantoms.TTerm Core.LiteralType
+literalTypeBinary =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "binary"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+literalTypeBoolean :: Phantoms.TTerm Core.LiteralType
+literalTypeBoolean =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "boolean"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+literalTypeFloat :: Phantoms.TTerm Core.FloatType -> Phantoms.TTerm Core.LiteralType
+literalTypeFloat x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalTypeInteger :: Phantoms.TTerm Core.IntegerType -> Phantoms.TTerm Core.LiteralType
+literalTypeInteger x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "integer"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalTypeString :: Phantoms.TTerm Core.LiteralType
+literalTypeString =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "string"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+mapType :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.MapType
+mapType keys values =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.MapType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keys"),
+          Core.fieldTerm = (Phantoms.unTTerm keys)},
+        Core.Field {
+          Core.fieldName = (Core.Name "values"),
+          Core.fieldTerm = (Phantoms.unTTerm values)}]}))
+
+mapTypeKeys :: Phantoms.TTerm Core.MapType -> Phantoms.TTerm Core.Type
+mapTypeKeys x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.MapType"),
+        Core.projectionField = (Core.Name "keys")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+mapTypeValues :: Phantoms.TTerm Core.MapType -> Phantoms.TTerm Core.Type
+mapTypeValues x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.MapType"),
+        Core.projectionField = (Core.Name "values")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+mapTypeWithKeys :: Phantoms.TTerm Core.MapType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.MapType
+mapTypeWithKeys original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.MapType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keys"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "values"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.MapType"),
+              Core.projectionField = (Core.Name "values")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+mapTypeWithValues :: Phantoms.TTerm Core.MapType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.MapType
+mapTypeWithValues original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.MapType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keys"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.MapType"),
+              Core.projectionField = (Core.Name "keys")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "values"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+name :: Phantoms.TTerm String -> Phantoms.TTerm Core.Name
+name x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+pairType :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.PairType
+pairType first second =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.PairType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "first"),
+          Core.fieldTerm = (Phantoms.unTTerm first)},
+        Core.Field {
+          Core.fieldName = (Core.Name "second"),
+          Core.fieldTerm = (Phantoms.unTTerm second)}]}))
+
+pairTypeFirst :: Phantoms.TTerm Core.PairType -> Phantoms.TTerm Core.Type
+pairTypeFirst x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.PairType"),
+        Core.projectionField = (Core.Name "first")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+pairTypeSecond :: Phantoms.TTerm Core.PairType -> Phantoms.TTerm Core.Type
+pairTypeSecond x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.PairType"),
+        Core.projectionField = (Core.Name "second")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+pairTypeWithFirst :: Phantoms.TTerm Core.PairType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.PairType
+pairTypeWithFirst original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.PairType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "first"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "second"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.PairType"),
+              Core.projectionField = (Core.Name "second")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+pairTypeWithSecond :: Phantoms.TTerm Core.PairType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.PairType
+pairTypeWithSecond original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.PairType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "first"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.PairType"),
+              Core.projectionField = (Core.Name "first")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "second"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+projection :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Projection
+projection typeName field =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Projection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Phantoms.unTTerm field)}]}))
+
+projectionField :: Phantoms.TTerm Core.Projection -> Phantoms.TTerm Core.Name
+projectionField x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Projection"),
+        Core.projectionField = (Core.Name "field")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+projectionTypeName :: Phantoms.TTerm Core.Projection -> Phantoms.TTerm Core.Name
+projectionTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Projection"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+projectionWithField :: Phantoms.TTerm Core.Projection -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Projection
+projectionWithField original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Projection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Projection"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+projectionWithTypeName :: Phantoms.TTerm Core.Projection -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Projection
+projectionWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Projection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Projection"),
+              Core.projectionField = (Core.Name "field")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+record :: Phantoms.TTerm Core.Name -> Phantoms.TTerm [Core.Field] -> Phantoms.TTerm Core.Record
+record typeName fields =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Record"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm fields)}]}))
+
+recordFields :: Phantoms.TTerm Core.Record -> Phantoms.TTerm [Core.Field]
+recordFields x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Record"),
+        Core.projectionField = (Core.Name "fields")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+recordTypeName :: Phantoms.TTerm Core.Record -> Phantoms.TTerm Core.Name
+recordTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.Record"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+recordWithFields :: Phantoms.TTerm Core.Record -> Phantoms.TTerm [Core.Field] -> Phantoms.TTerm Core.Record
+recordWithFields original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Record"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Record"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+recordWithTypeName :: Phantoms.TTerm Core.Record -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Record
+recordWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Record"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.Record"),
+              Core.projectionField = (Core.Name "fields")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termAnnotated :: Phantoms.TTerm Core.AnnotatedTerm -> Phantoms.TTerm Core.Term
+termAnnotated x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "annotated"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termApplication :: Phantoms.TTerm Core.Application -> Phantoms.TTerm Core.Term
+termApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "application"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termEither :: Phantoms.TTerm (Either Core.Term Core.Term) -> Phantoms.TTerm Core.Term
+termEither x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "either"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termFunction :: Phantoms.TTerm Core.Function -> Phantoms.TTerm Core.Term
+termFunction x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "function"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termLet :: Phantoms.TTerm Core.Let -> Phantoms.TTerm Core.Term
+termLet x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "let"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termList :: Phantoms.TTerm [Core.Term] -> Phantoms.TTerm Core.Term
+termList x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termLiteral :: Phantoms.TTerm Core.Literal -> Phantoms.TTerm Core.Term
+termLiteral x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "literal"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termMap :: Phantoms.TTerm (M.Map Core.Term Core.Term) -> Phantoms.TTerm Core.Term
+termMap x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "map"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termMaybe :: Phantoms.TTerm (Maybe Core.Term) -> Phantoms.TTerm Core.Term
+termMaybe x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "maybe"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termPair :: Phantoms.TTerm (Core.Term, Core.Term) -> Phantoms.TTerm Core.Term
+termPair x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pair"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termRecord :: Phantoms.TTerm Core.Record -> Phantoms.TTerm Core.Term
+termRecord x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "record"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termSet :: Phantoms.TTerm (S.Set Core.Term) -> Phantoms.TTerm Core.Term
+termSet x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "set"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termTypeApplication :: Phantoms.TTerm Core.TypeApplicationTerm -> Phantoms.TTerm Core.Term
+termTypeApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeApplication"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termTypeLambda :: Phantoms.TTerm Core.TypeLambda -> Phantoms.TTerm Core.Term
+termTypeLambda x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeLambda"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termUnion :: Phantoms.TTerm Core.Injection -> Phantoms.TTerm Core.Term
+termUnion x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "union"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termUnit :: Phantoms.TTerm Core.Term
+termUnit =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unit"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariable :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Term
+termVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "variable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+termWrap :: Phantoms.TTerm Core.WrappedTerm -> Phantoms.TTerm Core.Term
+termWrap x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wrap"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeAnnotated :: Phantoms.TTerm Core.AnnotatedType -> Phantoms.TTerm Core.Type
+typeAnnotated x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "annotated"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeApplication :: Phantoms.TTerm Core.ApplicationType -> Phantoms.TTerm Core.Type
+typeApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "application"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeApplicationTerm :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.TypeApplicationTerm
+typeApplicationTerm body type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+typeApplicationTermBody :: Phantoms.TTerm Core.TypeApplicationTerm -> Phantoms.TTerm Core.Term
+typeApplicationTermBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeApplicationTermType :: Phantoms.TTerm Core.TypeApplicationTerm -> Phantoms.TTerm Core.Type
+typeApplicationTermType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeApplicationTermWithBody :: Phantoms.TTerm Core.TypeApplicationTerm -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.TypeApplicationTerm
+typeApplicationTermWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeApplicationTermWithType :: Phantoms.TTerm Core.TypeApplicationTerm -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.TypeApplicationTerm
+typeApplicationTermWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeEither :: Phantoms.TTerm Core.EitherType -> Phantoms.TTerm Core.Type
+typeEither x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "either"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeForall :: Phantoms.TTerm Core.ForallType -> Phantoms.TTerm Core.Type
+typeForall x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "forall"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeFunction :: Phantoms.TTerm Core.FunctionType -> Phantoms.TTerm Core.Type
+typeFunction x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "function"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeLambda :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.TypeLambda
+typeLambda parameter body =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeLambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Phantoms.unTTerm parameter)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)}]}))
+
+typeLambdaBody :: Phantoms.TTerm Core.TypeLambda -> Phantoms.TTerm Core.Term
+typeLambdaBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.TypeLambda"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeLambdaParameter :: Phantoms.TTerm Core.TypeLambda -> Phantoms.TTerm Core.Name
+typeLambdaParameter x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.TypeLambda"),
+        Core.projectionField = (Core.Name "parameter")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeLambdaWithBody :: Phantoms.TTerm Core.TypeLambda -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.TypeLambda
+typeLambdaWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeLambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeLambda"),
+              Core.projectionField = (Core.Name "parameter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeLambdaWithParameter :: Phantoms.TTerm Core.TypeLambda -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.TypeLambda
+typeLambdaWithParameter original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeLambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeLambda"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeList :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type
+typeList x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeLiteral :: Phantoms.TTerm Core.LiteralType -> Phantoms.TTerm Core.Type
+typeLiteral x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "literal"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeMap :: Phantoms.TTerm Core.MapType -> Phantoms.TTerm Core.Type
+typeMap x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "map"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeMaybe :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type
+typeMaybe x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "maybe"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typePair :: Phantoms.TTerm Core.PairType -> Phantoms.TTerm Core.Type
+typePair x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pair"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeRecord :: Phantoms.TTerm [Core.FieldType] -> Phantoms.TTerm Core.Type
+typeRecord x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "record"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeScheme :: Phantoms.TTerm [Core.Name] -> Phantoms.TTerm Core.Type -> Phantoms.TTerm (Maybe (M.Map Core.Name Core.TypeVariableMetadata)) -> Phantoms.TTerm Core.TypeScheme
+typeScheme variables type_ constraints =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeScheme"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Phantoms.unTTerm variables)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "constraints"),
+          Core.fieldTerm = (Phantoms.unTTerm constraints)}]}))
+
+typeSchemeConstraints :: Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm (Maybe (M.Map Core.Name Core.TypeVariableMetadata))
+typeSchemeConstraints x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+        Core.projectionField = (Core.Name "constraints")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeSchemeType :: Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm Core.Type
+typeSchemeType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeSchemeVariables :: Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm [Core.Name]
+typeSchemeVariables x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+        Core.projectionField = (Core.Name "variables")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeSchemeWithConstraints :: Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm (Maybe (M.Map Core.Name Core.TypeVariableMetadata)) -> Phantoms.TTerm Core.TypeScheme
+typeSchemeWithConstraints original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeScheme"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+              Core.projectionField = (Core.Name "variables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "constraints"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeSchemeWithType :: Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.TypeScheme
+typeSchemeWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeScheme"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+              Core.projectionField = (Core.Name "variables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "constraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+              Core.projectionField = (Core.Name "constraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeSchemeWithVariables :: Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm [Core.Name] -> Phantoms.TTerm Core.TypeScheme
+typeSchemeWithVariables original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeScheme"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "constraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+              Core.projectionField = (Core.Name "constraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeSet :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type
+typeSet x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "set"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeUnion :: Phantoms.TTerm [Core.FieldType] -> Phantoms.TTerm Core.Type
+typeUnion x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "union"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeUnit :: Phantoms.TTerm Core.Type
+typeUnit =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unit"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariable :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Type
+typeVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "variable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeVariableMetadata :: Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Core.TypeVariableMetadata
+typeVariableMetadata classes =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "classes"),
+          Core.fieldTerm = (Phantoms.unTTerm classes)}]}))
+
+typeVariableMetadataClasses :: Phantoms.TTerm Core.TypeVariableMetadata -> Phantoms.TTerm (S.Set Core.Name)
+typeVariableMetadataClasses x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
+        Core.projectionField = (Core.Name "classes")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeVariableMetadataWithClasses :: Phantoms.TTerm Core.TypeVariableMetadata -> Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Core.TypeVariableMetadata
+typeVariableMetadataWithClasses original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "classes"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeVoid :: Phantoms.TTerm Core.Type
+typeVoid =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "void"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeWrap :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type
+typeWrap x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wrap"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+unName :: Phantoms.TTerm Core.Name -> Phantoms.TTerm String
+unName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+wrappedTerm :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.WrappedTerm
+wrappedTerm typeName body =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)}]}))
+
+wrappedTermBody :: Phantoms.TTerm Core.WrappedTerm -> Phantoms.TTerm Core.Term
+wrappedTermBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+wrappedTermTypeName :: Phantoms.TTerm Core.WrappedTerm -> Phantoms.TTerm Core.Name
+wrappedTermTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+wrappedTermWithBody :: Phantoms.TTerm Core.WrappedTerm -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.WrappedTerm
+wrappedTermWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+wrappedTermWithTypeName :: Phantoms.TTerm Core.WrappedTerm -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.WrappedTerm
+wrappedTermWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Error/Checking.hs b/src/gen-main/haskell/Hydra/Dsl/Error/Checking.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Error/Checking.hs
@@ -0,0 +1,617 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.error.checking
+
+module Hydra.Dsl.Error.Checking where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Checking as Checking
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Typing as Typing
+import qualified Hydra.Variants as Variants
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+checkingErrorIncorrectUnification :: Phantoms.TTerm Checking.IncorrectUnificationError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorIncorrectUnification x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "incorrectUnification"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorNotAForallType :: Phantoms.TTerm Checking.NotAForallTypeError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorNotAForallType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "notAForallType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorNotAFunctionType :: Phantoms.TTerm Checking.NotAFunctionTypeError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorNotAFunctionType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "notAFunctionType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorTypeArityMismatch :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorTypeArityMismatch x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeArityMismatch"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorTypeMismatch :: Phantoms.TTerm Checking.TypeMismatchError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorTypeMismatch x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeMismatch"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorUnboundTypeVariables :: Phantoms.TTerm Checking.UnboundTypeVariablesError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorUnboundTypeVariables x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unboundTypeVariables"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorUnequalTypes :: Phantoms.TTerm Checking.UnequalTypesError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorUnequalTypes x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unequalTypes"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorUnsupportedTermVariant :: Phantoms.TTerm Checking.UnsupportedTermVariantError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorUnsupportedTermVariant x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unsupportedTermVariant"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorUntypedLambda :: Phantoms.TTerm Checking.UntypedLambdaError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorUntypedLambda x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "untypedLambda"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+checkingErrorUntypedLetBinding :: Phantoms.TTerm Checking.UntypedLetBindingError -> Phantoms.TTerm Checking.CheckingError
+checkingErrorUntypedLetBinding x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "untypedLetBinding"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+incorrectUnificationError :: Phantoms.TTerm Typing.TypeSubst -> Phantoms.TTerm Checking.IncorrectUnificationError
+incorrectUnificationError substitution =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.IncorrectUnificationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "substitution"),
+          Core.fieldTerm = (Phantoms.unTTerm substitution)}]}))
+
+incorrectUnificationErrorSubstitution :: Phantoms.TTerm Checking.IncorrectUnificationError -> Phantoms.TTerm Typing.TypeSubst
+incorrectUnificationErrorSubstitution x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.IncorrectUnificationError"),
+        Core.projectionField = (Core.Name "substitution")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+incorrectUnificationErrorWithSubstitution :: Phantoms.TTerm Checking.IncorrectUnificationError -> Phantoms.TTerm Typing.TypeSubst -> Phantoms.TTerm Checking.IncorrectUnificationError
+incorrectUnificationErrorWithSubstitution original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.IncorrectUnificationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "substitution"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+notAForallTypeError :: Phantoms.TTerm Core.Type -> Phantoms.TTerm [Core.Type] -> Phantoms.TTerm Checking.NotAForallTypeError
+notAForallTypeError type_ typeArguments =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = (Phantoms.unTTerm typeArguments)}]}))
+
+notAForallTypeErrorType :: Phantoms.TTerm Checking.NotAForallTypeError -> Phantoms.TTerm Core.Type
+notAForallTypeErrorType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+notAForallTypeErrorTypeArguments :: Phantoms.TTerm Checking.NotAForallTypeError -> Phantoms.TTerm [Core.Type]
+notAForallTypeErrorTypeArguments x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+        Core.projectionField = (Core.Name "typeArguments")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+notAForallTypeErrorWithType :: Phantoms.TTerm Checking.NotAForallTypeError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.NotAForallTypeError
+notAForallTypeErrorWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+              Core.projectionField = (Core.Name "typeArguments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+notAForallTypeErrorWithTypeArguments :: Phantoms.TTerm Checking.NotAForallTypeError -> Phantoms.TTerm [Core.Type] -> Phantoms.TTerm Checking.NotAForallTypeError
+notAForallTypeErrorWithTypeArguments original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+notAFunctionTypeError :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.NotAFunctionTypeError
+notAFunctionTypeError type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.NotAFunctionTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+notAFunctionTypeErrorType :: Phantoms.TTerm Checking.NotAFunctionTypeError -> Phantoms.TTerm Core.Type
+notAFunctionTypeErrorType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.NotAFunctionTypeError"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+notAFunctionTypeErrorWithType :: Phantoms.TTerm Checking.NotAFunctionTypeError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.NotAFunctionTypeError
+notAFunctionTypeErrorWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.NotAFunctionTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeArityMismatchError :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Int -> Phantoms.TTerm Int -> Phantoms.TTerm [Core.Type] -> Phantoms.TTerm Checking.TypeArityMismatchError
+typeArityMismatchError type_ expectedArity actualArity typeArguments =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedArity"),
+          Core.fieldTerm = (Phantoms.unTTerm expectedArity)},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualArity"),
+          Core.fieldTerm = (Phantoms.unTTerm actualArity)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = (Phantoms.unTTerm typeArguments)}]}))
+
+typeArityMismatchErrorActualArity :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm Int
+typeArityMismatchErrorActualArity x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+        Core.projectionField = (Core.Name "actualArity")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeArityMismatchErrorExpectedArity :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm Int
+typeArityMismatchErrorExpectedArity x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+        Core.projectionField = (Core.Name "expectedArity")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeArityMismatchErrorType :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm Core.Type
+typeArityMismatchErrorType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeArityMismatchErrorTypeArguments :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm [Core.Type]
+typeArityMismatchErrorTypeArguments x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+        Core.projectionField = (Core.Name "typeArguments")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeArityMismatchErrorWithActualArity :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm Int -> Phantoms.TTerm Checking.TypeArityMismatchError
+typeArityMismatchErrorWithActualArity original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedArity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "expectedArity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualArity"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "typeArguments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeArityMismatchErrorWithExpectedArity :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm Int -> Phantoms.TTerm Checking.TypeArityMismatchError
+typeArityMismatchErrorWithExpectedArity original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedArity"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualArity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "actualArity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "typeArguments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeArityMismatchErrorWithType :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.TypeArityMismatchError
+typeArityMismatchErrorWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedArity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "expectedArity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualArity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "actualArity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "typeArguments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeArityMismatchErrorWithTypeArguments :: Phantoms.TTerm Checking.TypeArityMismatchError -> Phantoms.TTerm [Core.Type] -> Phantoms.TTerm Checking.TypeArityMismatchError
+typeArityMismatchErrorWithTypeArguments original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedArity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "expectedArity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualArity"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+              Core.projectionField = (Core.Name "actualArity")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeMismatchError :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.TypeMismatchError
+typeMismatchError expectedType actualType =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedType"),
+          Core.fieldTerm = (Phantoms.unTTerm expectedType)},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualType"),
+          Core.fieldTerm = (Phantoms.unTTerm actualType)}]}))
+
+typeMismatchErrorActualType :: Phantoms.TTerm Checking.TypeMismatchError -> Phantoms.TTerm Core.Type
+typeMismatchErrorActualType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+        Core.projectionField = (Core.Name "actualType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeMismatchErrorExpectedType :: Phantoms.TTerm Checking.TypeMismatchError -> Phantoms.TTerm Core.Type
+typeMismatchErrorExpectedType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+        Core.projectionField = (Core.Name "expectedType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeMismatchErrorWithActualType :: Phantoms.TTerm Checking.TypeMismatchError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.TypeMismatchError
+typeMismatchErrorWithActualType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+              Core.projectionField = (Core.Name "expectedType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeMismatchErrorWithExpectedType :: Phantoms.TTerm Checking.TypeMismatchError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.TypeMismatchError
+typeMismatchErrorWithExpectedType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+              Core.projectionField = (Core.Name "actualType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unboundTypeVariablesError :: Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.UnboundTypeVariablesError
+unboundTypeVariablesError variables type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Phantoms.unTTerm variables)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+unboundTypeVariablesErrorType :: Phantoms.TTerm Checking.UnboundTypeVariablesError -> Phantoms.TTerm Core.Type
+unboundTypeVariablesErrorType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unboundTypeVariablesErrorVariables :: Phantoms.TTerm Checking.UnboundTypeVariablesError -> Phantoms.TTerm (S.Set Core.Name)
+unboundTypeVariablesErrorVariables x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+        Core.projectionField = (Core.Name "variables")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unboundTypeVariablesErrorWithType :: Phantoms.TTerm Checking.UnboundTypeVariablesError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Checking.UnboundTypeVariablesError
+unboundTypeVariablesErrorWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+              Core.projectionField = (Core.Name "variables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unboundTypeVariablesErrorWithVariables :: Phantoms.TTerm Checking.UnboundTypeVariablesError -> Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Checking.UnboundTypeVariablesError
+unboundTypeVariablesErrorWithVariables original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unequalTypesError :: Phantoms.TTerm [Core.Type] -> Phantoms.TTerm String -> Phantoms.TTerm Checking.UnequalTypesError
+unequalTypesError types description =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Phantoms.unTTerm types)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm description)}]}))
+
+unequalTypesErrorDescription :: Phantoms.TTerm Checking.UnequalTypesError -> Phantoms.TTerm String
+unequalTypesErrorDescription x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+        Core.projectionField = (Core.Name "description")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unequalTypesErrorTypes :: Phantoms.TTerm Checking.UnequalTypesError -> Phantoms.TTerm [Core.Type]
+unequalTypesErrorTypes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+        Core.projectionField = (Core.Name "types")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unequalTypesErrorWithDescription :: Phantoms.TTerm Checking.UnequalTypesError -> Phantoms.TTerm String -> Phantoms.TTerm Checking.UnequalTypesError
+unequalTypesErrorWithDescription original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unequalTypesErrorWithTypes :: Phantoms.TTerm Checking.UnequalTypesError -> Phantoms.TTerm [Core.Type] -> Phantoms.TTerm Checking.UnequalTypesError
+unequalTypesErrorWithTypes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unsupportedTermVariantError :: Phantoms.TTerm Variants.TermVariant -> Phantoms.TTerm Checking.UnsupportedTermVariantError
+unsupportedTermVariantError termVariant =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnsupportedTermVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariant"),
+          Core.fieldTerm = (Phantoms.unTTerm termVariant)}]}))
+
+unsupportedTermVariantErrorTermVariant :: Phantoms.TTerm Checking.UnsupportedTermVariantError -> Phantoms.TTerm Variants.TermVariant
+unsupportedTermVariantErrorTermVariant x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.UnsupportedTermVariantError"),
+        Core.projectionField = (Core.Name "termVariant")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unsupportedTermVariantErrorWithTermVariant :: Phantoms.TTerm Checking.UnsupportedTermVariantError -> Phantoms.TTerm Variants.TermVariant -> Phantoms.TTerm Checking.UnsupportedTermVariantError
+unsupportedTermVariantErrorWithTermVariant original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnsupportedTermVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariant"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+untypedLambdaError :: Phantoms.TTerm Checking.UntypedLambdaError
+untypedLambdaError =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UntypedLambdaError"),
+      Core.recordFields = []}))
+
+untypedLetBindingError :: Phantoms.TTerm Core.Binding -> Phantoms.TTerm Checking.UntypedLetBindingError
+untypedLetBindingError binding =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UntypedLetBindingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "binding"),
+          Core.fieldTerm = (Phantoms.unTTerm binding)}]}))
+
+untypedLetBindingErrorBinding :: Phantoms.TTerm Checking.UntypedLetBindingError -> Phantoms.TTerm Core.Binding
+untypedLetBindingErrorBinding x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.checking.UntypedLetBindingError"),
+        Core.projectionField = (Core.Name "binding")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+untypedLetBindingErrorWithBinding :: Phantoms.TTerm Checking.UntypedLetBindingError -> Phantoms.TTerm Core.Binding -> Phantoms.TTerm Checking.UntypedLetBindingError
+untypedLetBindingErrorWithBinding original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UntypedLetBindingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "binding"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Error/Core.hs b/src/gen-main/haskell/Hydra/Dsl/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Error/Core.hs
@@ -0,0 +1,2305 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.error.core
+
+module Hydra.Dsl.Error.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Core as Core_
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Variants as Variants
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+constantConditionError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Bool -> Phantoms.TTerm Core_.ConstantConditionError
+constantConditionError location value =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Phantoms.unTTerm value)}]}))
+
+constantConditionErrorLocation :: Phantoms.TTerm Core_.ConstantConditionError -> Phantoms.TTerm Paths.SubtermPath
+constantConditionErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+constantConditionErrorValue :: Phantoms.TTerm Core_.ConstantConditionError -> Phantoms.TTerm Bool
+constantConditionErrorValue x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+        Core.projectionField = (Core.Name "value")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+constantConditionErrorWithLocation :: Phantoms.TTerm Core_.ConstantConditionError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.ConstantConditionError
+constantConditionErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+              Core.projectionField = (Core.Name "value")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+constantConditionErrorWithValue :: Phantoms.TTerm Core_.ConstantConditionError -> Phantoms.TTerm Bool -> Phantoms.TTerm Core_.ConstantConditionError
+constantConditionErrorWithValue original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+duplicateBindingError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.DuplicateBindingError
+duplicateBindingError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+duplicateBindingErrorLocation :: Phantoms.TTerm Core_.DuplicateBindingError -> Phantoms.TTerm Paths.SubtermPath
+duplicateBindingErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateBindingErrorName :: Phantoms.TTerm Core_.DuplicateBindingError -> Phantoms.TTerm Core.Name
+duplicateBindingErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateBindingErrorWithLocation :: Phantoms.TTerm Core_.DuplicateBindingError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.DuplicateBindingError
+duplicateBindingErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+duplicateBindingErrorWithName :: Phantoms.TTerm Core_.DuplicateBindingError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.DuplicateBindingError
+duplicateBindingErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+duplicateFieldError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.DuplicateFieldError
+duplicateFieldError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+duplicateFieldErrorLocation :: Phantoms.TTerm Core_.DuplicateFieldError -> Phantoms.TTerm Paths.SubtermPath
+duplicateFieldErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateFieldErrorName :: Phantoms.TTerm Core_.DuplicateFieldError -> Phantoms.TTerm Core.Name
+duplicateFieldErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateFieldErrorWithLocation :: Phantoms.TTerm Core_.DuplicateFieldError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.DuplicateFieldError
+duplicateFieldErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+duplicateFieldErrorWithName :: Phantoms.TTerm Core_.DuplicateFieldError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.DuplicateFieldError
+duplicateFieldErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+duplicateRecordTypeFieldNamesError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.DuplicateRecordTypeFieldNamesError
+duplicateRecordTypeFieldNamesError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+duplicateRecordTypeFieldNamesErrorLocation :: Phantoms.TTerm Core_.DuplicateRecordTypeFieldNamesError -> Phantoms.TTerm Paths.SubtermPath
+duplicateRecordTypeFieldNamesErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateRecordTypeFieldNamesErrorName :: Phantoms.TTerm Core_.DuplicateRecordTypeFieldNamesError -> Phantoms.TTerm Core.Name
+duplicateRecordTypeFieldNamesErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateRecordTypeFieldNamesErrorWithLocation :: Phantoms.TTerm Core_.DuplicateRecordTypeFieldNamesError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.DuplicateRecordTypeFieldNamesError
+duplicateRecordTypeFieldNamesErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+duplicateRecordTypeFieldNamesErrorWithName :: Phantoms.TTerm Core_.DuplicateRecordTypeFieldNamesError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.DuplicateRecordTypeFieldNamesError
+duplicateRecordTypeFieldNamesErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+duplicateUnionTypeFieldNamesError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.DuplicateUnionTypeFieldNamesError
+duplicateUnionTypeFieldNamesError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+duplicateUnionTypeFieldNamesErrorLocation :: Phantoms.TTerm Core_.DuplicateUnionTypeFieldNamesError -> Phantoms.TTerm Paths.SubtermPath
+duplicateUnionTypeFieldNamesErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateUnionTypeFieldNamesErrorName :: Phantoms.TTerm Core_.DuplicateUnionTypeFieldNamesError -> Phantoms.TTerm Core.Name
+duplicateUnionTypeFieldNamesErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateUnionTypeFieldNamesErrorWithLocation :: Phantoms.TTerm Core_.DuplicateUnionTypeFieldNamesError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.DuplicateUnionTypeFieldNamesError
+duplicateUnionTypeFieldNamesErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+duplicateUnionTypeFieldNamesErrorWithName :: Phantoms.TTerm Core_.DuplicateUnionTypeFieldNamesError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.DuplicateUnionTypeFieldNamesError
+duplicateUnionTypeFieldNamesErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+emptyCaseStatementError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.EmptyCaseStatementError
+emptyCaseStatementError location typeName =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)}]}))
+
+emptyCaseStatementErrorLocation :: Phantoms.TTerm Core_.EmptyCaseStatementError -> Phantoms.TTerm Paths.SubtermPath
+emptyCaseStatementErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+emptyCaseStatementErrorTypeName :: Phantoms.TTerm Core_.EmptyCaseStatementError -> Phantoms.TTerm Core.Name
+emptyCaseStatementErrorTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+emptyCaseStatementErrorWithLocation :: Phantoms.TTerm Core_.EmptyCaseStatementError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyCaseStatementError
+emptyCaseStatementErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+emptyCaseStatementErrorWithTypeName :: Phantoms.TTerm Core_.EmptyCaseStatementError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.EmptyCaseStatementError
+emptyCaseStatementErrorWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+emptyLetBindingsError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyLetBindingsError
+emptyLetBindingsError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyLetBindingsError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+emptyLetBindingsErrorLocation :: Phantoms.TTerm Core_.EmptyLetBindingsError -> Phantoms.TTerm Paths.SubtermPath
+emptyLetBindingsErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyLetBindingsError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+emptyLetBindingsErrorWithLocation :: Phantoms.TTerm Core_.EmptyLetBindingsError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyLetBindingsError
+emptyLetBindingsErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyLetBindingsError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+emptyRecordTypeError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyRecordTypeError
+emptyRecordTypeError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyRecordTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+emptyRecordTypeErrorLocation :: Phantoms.TTerm Core_.EmptyRecordTypeError -> Phantoms.TTerm Paths.SubtermPath
+emptyRecordTypeErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyRecordTypeError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+emptyRecordTypeErrorWithLocation :: Phantoms.TTerm Core_.EmptyRecordTypeError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyRecordTypeError
+emptyRecordTypeErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyRecordTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+emptyTermAnnotationError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyTermAnnotationError
+emptyTermAnnotationError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTermAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+emptyTermAnnotationErrorLocation :: Phantoms.TTerm Core_.EmptyTermAnnotationError -> Phantoms.TTerm Paths.SubtermPath
+emptyTermAnnotationErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyTermAnnotationError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+emptyTermAnnotationErrorWithLocation :: Phantoms.TTerm Core_.EmptyTermAnnotationError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyTermAnnotationError
+emptyTermAnnotationErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTermAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+emptyTypeAnnotationError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyTypeAnnotationError
+emptyTypeAnnotationError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTypeAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+emptyTypeAnnotationErrorLocation :: Phantoms.TTerm Core_.EmptyTypeAnnotationError -> Phantoms.TTerm Paths.SubtermPath
+emptyTypeAnnotationErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyTypeAnnotationError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+emptyTypeAnnotationErrorWithLocation :: Phantoms.TTerm Core_.EmptyTypeAnnotationError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyTypeAnnotationError
+emptyTypeAnnotationErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTypeAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+emptyTypeNameInTermError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyTypeNameInTermError
+emptyTypeNameInTermError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTypeNameInTermError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+emptyTypeNameInTermErrorLocation :: Phantoms.TTerm Core_.EmptyTypeNameInTermError -> Phantoms.TTerm Paths.SubtermPath
+emptyTypeNameInTermErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyTypeNameInTermError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+emptyTypeNameInTermErrorWithLocation :: Phantoms.TTerm Core_.EmptyTypeNameInTermError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyTypeNameInTermError
+emptyTypeNameInTermErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTypeNameInTermError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+emptyUnionTypeError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyUnionTypeError
+emptyUnionTypeError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyUnionTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+emptyUnionTypeErrorLocation :: Phantoms.TTerm Core_.EmptyUnionTypeError -> Phantoms.TTerm Paths.SubtermPath
+emptyUnionTypeErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyUnionTypeError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+emptyUnionTypeErrorWithLocation :: Phantoms.TTerm Core_.EmptyUnionTypeError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.EmptyUnionTypeError
+emptyUnionTypeErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyUnionTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+invalidForallParameterNameError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidForallParameterNameError
+invalidForallParameterNameError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+invalidForallParameterNameErrorLocation :: Phantoms.TTerm Core_.InvalidForallParameterNameError -> Phantoms.TTerm Paths.SubtermPath
+invalidForallParameterNameErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidForallParameterNameErrorName :: Phantoms.TTerm Core_.InvalidForallParameterNameError -> Phantoms.TTerm Core.Name
+invalidForallParameterNameErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidForallParameterNameErrorWithLocation :: Phantoms.TTerm Core_.InvalidForallParameterNameError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.InvalidForallParameterNameError
+invalidForallParameterNameErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+invalidForallParameterNameErrorWithName :: Phantoms.TTerm Core_.InvalidForallParameterNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidForallParameterNameError
+invalidForallParameterNameErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+invalidLambdaParameterNameError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidLambdaParameterNameError
+invalidLambdaParameterNameError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+invalidLambdaParameterNameErrorLocation :: Phantoms.TTerm Core_.InvalidLambdaParameterNameError -> Phantoms.TTerm Paths.SubtermPath
+invalidLambdaParameterNameErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidLambdaParameterNameErrorName :: Phantoms.TTerm Core_.InvalidLambdaParameterNameError -> Phantoms.TTerm Core.Name
+invalidLambdaParameterNameErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidLambdaParameterNameErrorWithLocation :: Phantoms.TTerm Core_.InvalidLambdaParameterNameError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.InvalidLambdaParameterNameError
+invalidLambdaParameterNameErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+invalidLambdaParameterNameErrorWithName :: Phantoms.TTerm Core_.InvalidLambdaParameterNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidLambdaParameterNameError
+invalidLambdaParameterNameErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+invalidLetBindingNameError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidLetBindingNameError
+invalidLetBindingNameError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+invalidLetBindingNameErrorLocation :: Phantoms.TTerm Core_.InvalidLetBindingNameError -> Phantoms.TTerm Paths.SubtermPath
+invalidLetBindingNameErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidLetBindingNameErrorName :: Phantoms.TTerm Core_.InvalidLetBindingNameError -> Phantoms.TTerm Core.Name
+invalidLetBindingNameErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidLetBindingNameErrorWithLocation :: Phantoms.TTerm Core_.InvalidLetBindingNameError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.InvalidLetBindingNameError
+invalidLetBindingNameErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+invalidLetBindingNameErrorWithName :: Phantoms.TTerm Core_.InvalidLetBindingNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidLetBindingNameError
+invalidLetBindingNameErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+invalidTermErrorConstantCondition :: Phantoms.TTerm Core_.ConstantConditionError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorConstantCondition x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "constantCondition"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorDuplicateBinding :: Phantoms.TTerm Core_.DuplicateBindingError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorDuplicateBinding x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "duplicateBinding"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorDuplicateField :: Phantoms.TTerm Core_.DuplicateFieldError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorDuplicateField x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "duplicateField"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorEmptyCaseStatement :: Phantoms.TTerm Core_.EmptyCaseStatementError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorEmptyCaseStatement x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "emptyCaseStatement"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorEmptyLetBindings :: Phantoms.TTerm Core_.EmptyLetBindingsError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorEmptyLetBindings x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "emptyLetBindings"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorEmptyTermAnnotation :: Phantoms.TTerm Core_.EmptyTermAnnotationError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorEmptyTermAnnotation x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "emptyTermAnnotation"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorEmptyTypeNameInTerm :: Phantoms.TTerm Core_.EmptyTypeNameInTermError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorEmptyTypeNameInTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "emptyTypeNameInTerm"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorInvalidLambdaParameterName :: Phantoms.TTerm Core_.InvalidLambdaParameterNameError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorInvalidLambdaParameterName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "invalidLambdaParameterName"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorInvalidLetBindingName :: Phantoms.TTerm Core_.InvalidLetBindingNameError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorInvalidLetBindingName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "invalidLetBindingName"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorInvalidTypeLambdaParameterName :: Phantoms.TTerm Core_.InvalidTypeLambdaParameterNameError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorInvalidTypeLambdaParameterName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "invalidTypeLambdaParameterName"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorNestedTermAnnotation :: Phantoms.TTerm Core_.NestedTermAnnotationError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorNestedTermAnnotation x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "nestedTermAnnotation"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorRedundantWrapUnwrap :: Phantoms.TTerm Core_.RedundantWrapUnwrapError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorRedundantWrapUnwrap x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "redundantWrapUnwrap"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorSelfApplication :: Phantoms.TTerm Core_.SelfApplicationError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorSelfApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "selfApplication"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorTermVariableShadowing :: Phantoms.TTerm Core_.TermVariableShadowingError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorTermVariableShadowing x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "termVariableShadowing"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorTypeVariableShadowingInTypeLambda :: Phantoms.TTerm Core_.TypeVariableShadowingInTypeLambdaError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorTypeVariableShadowingInTypeLambda x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeVariableShadowingInTypeLambda"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorUndefinedTermVariable :: Phantoms.TTerm Core_.UndefinedTermVariableError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorUndefinedTermVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "undefinedTermVariable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorUndefinedTypeVariableInBindingType :: Phantoms.TTerm Core_.UndefinedTypeVariableInBindingTypeError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorUndefinedTypeVariableInBindingType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "undefinedTypeVariableInBindingType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorUndefinedTypeVariableInLambdaDomain :: Phantoms.TTerm Core_.UndefinedTypeVariableInLambdaDomainError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorUndefinedTypeVariableInLambdaDomain x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "undefinedTypeVariableInLambdaDomain"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorUndefinedTypeVariableInTypeApplication :: Phantoms.TTerm Core_.UndefinedTypeVariableInTypeApplicationError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorUndefinedTypeVariableInTypeApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "undefinedTypeVariableInTypeApplication"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorUnknownPrimitiveName :: Phantoms.TTerm Core_.UnknownPrimitiveNameError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorUnknownPrimitiveName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unknownPrimitiveName"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorUnnecessaryIdentityApplication :: Phantoms.TTerm Core_.UnnecessaryIdentityApplicationError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorUnnecessaryIdentityApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unnecessaryIdentityApplication"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTermErrorUntypedTermVariable :: Phantoms.TTerm Core_.UntypedTermVariableError -> Phantoms.TTerm Core_.InvalidTermError
+invalidTermErrorUntypedTermVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "untypedTermVariable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorDuplicateRecordTypeFieldNames :: Phantoms.TTerm Core_.DuplicateRecordTypeFieldNamesError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorDuplicateRecordTypeFieldNames x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "duplicateRecordTypeFieldNames"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorDuplicateUnionTypeFieldNames :: Phantoms.TTerm Core_.DuplicateUnionTypeFieldNamesError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorDuplicateUnionTypeFieldNames x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "duplicateUnionTypeFieldNames"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorEmptyRecordType :: Phantoms.TTerm Core_.EmptyRecordTypeError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorEmptyRecordType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "emptyRecordType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorEmptyTypeAnnotation :: Phantoms.TTerm Core_.EmptyTypeAnnotationError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorEmptyTypeAnnotation x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "emptyTypeAnnotation"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorEmptyUnionType :: Phantoms.TTerm Core_.EmptyUnionTypeError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorEmptyUnionType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "emptyUnionType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorInvalidForallParameterName :: Phantoms.TTerm Core_.InvalidForallParameterNameError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorInvalidForallParameterName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "invalidForallParameterName"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorInvalidTypeSchemeVariableName :: Phantoms.TTerm Core_.InvalidTypeSchemeVariableNameError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorInvalidTypeSchemeVariableName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "invalidTypeSchemeVariableName"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorNestedTypeAnnotation :: Phantoms.TTerm Core_.NestedTypeAnnotationError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorNestedTypeAnnotation x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "nestedTypeAnnotation"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorNonComparableMapKeyType :: Phantoms.TTerm Core_.NonComparableMapKeyTypeError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorNonComparableMapKeyType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "nonComparableMapKeyType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorNonComparableSetElementType :: Phantoms.TTerm Core_.NonComparableSetElementTypeError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorNonComparableSetElementType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "nonComparableSetElementType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorSingleVariantUnion :: Phantoms.TTerm Core_.SingleVariantUnionError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorSingleVariantUnion x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "singleVariantUnion"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorTypeVariableShadowingInForall :: Phantoms.TTerm Core_.TypeVariableShadowingInForallError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorTypeVariableShadowingInForall x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeVariableShadowingInForall"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorUndefinedTypeVariable :: Phantoms.TTerm Core_.UndefinedTypeVariableError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorUndefinedTypeVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "undefinedTypeVariable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeErrorVoidInNonBottomPosition :: Phantoms.TTerm Core_.VoidInNonBottomPositionError -> Phantoms.TTerm Core_.InvalidTypeError
+invalidTypeErrorVoidInNonBottomPosition x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "voidInNonBottomPosition"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidTypeLambdaParameterNameError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidTypeLambdaParameterNameError
+invalidTypeLambdaParameterNameError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+invalidTypeLambdaParameterNameErrorLocation :: Phantoms.TTerm Core_.InvalidTypeLambdaParameterNameError -> Phantoms.TTerm Paths.SubtermPath
+invalidTypeLambdaParameterNameErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidTypeLambdaParameterNameErrorName :: Phantoms.TTerm Core_.InvalidTypeLambdaParameterNameError -> Phantoms.TTerm Core.Name
+invalidTypeLambdaParameterNameErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidTypeLambdaParameterNameErrorWithLocation :: Phantoms.TTerm Core_.InvalidTypeLambdaParameterNameError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.InvalidTypeLambdaParameterNameError
+invalidTypeLambdaParameterNameErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+invalidTypeLambdaParameterNameErrorWithName :: Phantoms.TTerm Core_.InvalidTypeLambdaParameterNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidTypeLambdaParameterNameError
+invalidTypeLambdaParameterNameErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+invalidTypeSchemeVariableNameError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidTypeSchemeVariableNameError
+invalidTypeSchemeVariableNameError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+invalidTypeSchemeVariableNameErrorLocation :: Phantoms.TTerm Core_.InvalidTypeSchemeVariableNameError -> Phantoms.TTerm Paths.SubtermPath
+invalidTypeSchemeVariableNameErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidTypeSchemeVariableNameErrorName :: Phantoms.TTerm Core_.InvalidTypeSchemeVariableNameError -> Phantoms.TTerm Core.Name
+invalidTypeSchemeVariableNameErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+invalidTypeSchemeVariableNameErrorWithLocation :: Phantoms.TTerm Core_.InvalidTypeSchemeVariableNameError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.InvalidTypeSchemeVariableNameError
+invalidTypeSchemeVariableNameErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+invalidTypeSchemeVariableNameErrorWithName :: Phantoms.TTerm Core_.InvalidTypeSchemeVariableNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.InvalidTypeSchemeVariableNameError
+invalidTypeSchemeVariableNameErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+nestedTermAnnotationError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.NestedTermAnnotationError
+nestedTermAnnotationError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NestedTermAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+nestedTermAnnotationErrorLocation :: Phantoms.TTerm Core_.NestedTermAnnotationError -> Phantoms.TTerm Paths.SubtermPath
+nestedTermAnnotationErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.NestedTermAnnotationError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+nestedTermAnnotationErrorWithLocation :: Phantoms.TTerm Core_.NestedTermAnnotationError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.NestedTermAnnotationError
+nestedTermAnnotationErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NestedTermAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+nestedTypeAnnotationError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.NestedTypeAnnotationError
+nestedTypeAnnotationError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NestedTypeAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+nestedTypeAnnotationErrorLocation :: Phantoms.TTerm Core_.NestedTypeAnnotationError -> Phantoms.TTerm Paths.SubtermPath
+nestedTypeAnnotationErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.NestedTypeAnnotationError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+nestedTypeAnnotationErrorWithLocation :: Phantoms.TTerm Core_.NestedTypeAnnotationError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.NestedTypeAnnotationError
+nestedTypeAnnotationErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NestedTypeAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+nonComparableMapKeyTypeError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core_.NonComparableMapKeyTypeError
+nonComparableMapKeyTypeError location keyType =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "keyType"),
+          Core.fieldTerm = (Phantoms.unTTerm keyType)}]}))
+
+nonComparableMapKeyTypeErrorKeyType :: Phantoms.TTerm Core_.NonComparableMapKeyTypeError -> Phantoms.TTerm Core.Type
+nonComparableMapKeyTypeErrorKeyType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+        Core.projectionField = (Core.Name "keyType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+nonComparableMapKeyTypeErrorLocation :: Phantoms.TTerm Core_.NonComparableMapKeyTypeError -> Phantoms.TTerm Paths.SubtermPath
+nonComparableMapKeyTypeErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+nonComparableMapKeyTypeErrorWithKeyType :: Phantoms.TTerm Core_.NonComparableMapKeyTypeError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core_.NonComparableMapKeyTypeError
+nonComparableMapKeyTypeErrorWithKeyType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "keyType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+nonComparableMapKeyTypeErrorWithLocation :: Phantoms.TTerm Core_.NonComparableMapKeyTypeError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.NonComparableMapKeyTypeError
+nonComparableMapKeyTypeErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "keyType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+              Core.projectionField = (Core.Name "keyType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+nonComparableSetElementTypeError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core_.NonComparableSetElementTypeError
+nonComparableSetElementTypeError location elementType =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "elementType"),
+          Core.fieldTerm = (Phantoms.unTTerm elementType)}]}))
+
+nonComparableSetElementTypeErrorElementType :: Phantoms.TTerm Core_.NonComparableSetElementTypeError -> Phantoms.TTerm Core.Type
+nonComparableSetElementTypeErrorElementType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+        Core.projectionField = (Core.Name "elementType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+nonComparableSetElementTypeErrorLocation :: Phantoms.TTerm Core_.NonComparableSetElementTypeError -> Phantoms.TTerm Paths.SubtermPath
+nonComparableSetElementTypeErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+nonComparableSetElementTypeErrorWithElementType :: Phantoms.TTerm Core_.NonComparableSetElementTypeError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core_.NonComparableSetElementTypeError
+nonComparableSetElementTypeErrorWithElementType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "elementType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+nonComparableSetElementTypeErrorWithLocation :: Phantoms.TTerm Core_.NonComparableSetElementTypeError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.NonComparableSetElementTypeError
+nonComparableSetElementTypeErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "elementType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+              Core.projectionField = (Core.Name "elementType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+redundantWrapUnwrapError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.RedundantWrapUnwrapError
+redundantWrapUnwrapError location typeName =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)}]}))
+
+redundantWrapUnwrapErrorLocation :: Phantoms.TTerm Core_.RedundantWrapUnwrapError -> Phantoms.TTerm Paths.SubtermPath
+redundantWrapUnwrapErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+redundantWrapUnwrapErrorTypeName :: Phantoms.TTerm Core_.RedundantWrapUnwrapError -> Phantoms.TTerm Core.Name
+redundantWrapUnwrapErrorTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+redundantWrapUnwrapErrorWithLocation :: Phantoms.TTerm Core_.RedundantWrapUnwrapError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.RedundantWrapUnwrapError
+redundantWrapUnwrapErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+redundantWrapUnwrapErrorWithTypeName :: Phantoms.TTerm Core_.RedundantWrapUnwrapError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.RedundantWrapUnwrapError
+redundantWrapUnwrapErrorWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+selfApplicationError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.SelfApplicationError
+selfApplicationError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+selfApplicationErrorLocation :: Phantoms.TTerm Core_.SelfApplicationError -> Phantoms.TTerm Paths.SubtermPath
+selfApplicationErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+selfApplicationErrorName :: Phantoms.TTerm Core_.SelfApplicationError -> Phantoms.TTerm Core.Name
+selfApplicationErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+selfApplicationErrorWithLocation :: Phantoms.TTerm Core_.SelfApplicationError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.SelfApplicationError
+selfApplicationErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+selfApplicationErrorWithName :: Phantoms.TTerm Core_.SelfApplicationError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.SelfApplicationError
+selfApplicationErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+singleVariantUnionError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.SingleVariantUnionError
+singleVariantUnionError location fieldName =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fieldName"),
+          Core.fieldTerm = (Phantoms.unTTerm fieldName)}]}))
+
+singleVariantUnionErrorFieldName :: Phantoms.TTerm Core_.SingleVariantUnionError -> Phantoms.TTerm Core.Name
+singleVariantUnionErrorFieldName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+        Core.projectionField = (Core.Name "fieldName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+singleVariantUnionErrorLocation :: Phantoms.TTerm Core_.SingleVariantUnionError -> Phantoms.TTerm Paths.SubtermPath
+singleVariantUnionErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+singleVariantUnionErrorWithFieldName :: Phantoms.TTerm Core_.SingleVariantUnionError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.SingleVariantUnionError
+singleVariantUnionErrorWithFieldName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fieldName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+singleVariantUnionErrorWithLocation :: Phantoms.TTerm Core_.SingleVariantUnionError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.SingleVariantUnionError
+singleVariantUnionErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fieldName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+              Core.projectionField = (Core.Name "fieldName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termVariableShadowingError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.TermVariableShadowingError
+termVariableShadowingError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+termVariableShadowingErrorLocation :: Phantoms.TTerm Core_.TermVariableShadowingError -> Phantoms.TTerm Paths.SubtermPath
+termVariableShadowingErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+termVariableShadowingErrorName :: Phantoms.TTerm Core_.TermVariableShadowingError -> Phantoms.TTerm Core.Name
+termVariableShadowingErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+termVariableShadowingErrorWithLocation :: Phantoms.TTerm Core_.TermVariableShadowingError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.TermVariableShadowingError
+termVariableShadowingErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termVariableShadowingErrorWithName :: Phantoms.TTerm Core_.TermVariableShadowingError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.TermVariableShadowingError
+termVariableShadowingErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeVariableShadowingInForallError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.TypeVariableShadowingInForallError
+typeVariableShadowingInForallError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+typeVariableShadowingInForallErrorLocation :: Phantoms.TTerm Core_.TypeVariableShadowingInForallError -> Phantoms.TTerm Paths.SubtermPath
+typeVariableShadowingInForallErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeVariableShadowingInForallErrorName :: Phantoms.TTerm Core_.TypeVariableShadowingInForallError -> Phantoms.TTerm Core.Name
+typeVariableShadowingInForallErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeVariableShadowingInForallErrorWithLocation :: Phantoms.TTerm Core_.TypeVariableShadowingInForallError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.TypeVariableShadowingInForallError
+typeVariableShadowingInForallErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeVariableShadowingInForallErrorWithName :: Phantoms.TTerm Core_.TypeVariableShadowingInForallError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.TypeVariableShadowingInForallError
+typeVariableShadowingInForallErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeVariableShadowingInTypeLambdaError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.TypeVariableShadowingInTypeLambdaError
+typeVariableShadowingInTypeLambdaError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+typeVariableShadowingInTypeLambdaErrorLocation :: Phantoms.TTerm Core_.TypeVariableShadowingInTypeLambdaError -> Phantoms.TTerm Paths.SubtermPath
+typeVariableShadowingInTypeLambdaErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeVariableShadowingInTypeLambdaErrorName :: Phantoms.TTerm Core_.TypeVariableShadowingInTypeLambdaError -> Phantoms.TTerm Core.Name
+typeVariableShadowingInTypeLambdaErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeVariableShadowingInTypeLambdaErrorWithLocation :: Phantoms.TTerm Core_.TypeVariableShadowingInTypeLambdaError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.TypeVariableShadowingInTypeLambdaError
+typeVariableShadowingInTypeLambdaErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeVariableShadowingInTypeLambdaErrorWithName :: Phantoms.TTerm Core_.TypeVariableShadowingInTypeLambdaError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.TypeVariableShadowingInTypeLambdaError
+typeVariableShadowingInTypeLambdaErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+undefinedFieldError :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedFieldError
+undefinedFieldError fieldName typeName =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fieldName"),
+          Core.fieldTerm = (Phantoms.unTTerm fieldName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)}]}))
+
+undefinedFieldErrorFieldName :: Phantoms.TTerm Core_.UndefinedFieldError -> Phantoms.TTerm Core.Name
+undefinedFieldErrorFieldName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+        Core.projectionField = (Core.Name "fieldName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedFieldErrorTypeName :: Phantoms.TTerm Core_.UndefinedFieldError -> Phantoms.TTerm Core.Name
+undefinedFieldErrorTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedFieldErrorWithFieldName :: Phantoms.TTerm Core_.UndefinedFieldError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedFieldError
+undefinedFieldErrorWithFieldName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fieldName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+undefinedFieldErrorWithTypeName :: Phantoms.TTerm Core_.UndefinedFieldError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedFieldError
+undefinedFieldErrorWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fieldName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+              Core.projectionField = (Core.Name "fieldName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+undefinedTermVariableError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTermVariableError
+undefinedTermVariableError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+undefinedTermVariableErrorLocation :: Phantoms.TTerm Core_.UndefinedTermVariableError -> Phantoms.TTerm Paths.SubtermPath
+undefinedTermVariableErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTermVariableErrorName :: Phantoms.TTerm Core_.UndefinedTermVariableError -> Phantoms.TTerm Core.Name
+undefinedTermVariableErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTermVariableErrorWithLocation :: Phantoms.TTerm Core_.UndefinedTermVariableError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UndefinedTermVariableError
+undefinedTermVariableErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+undefinedTermVariableErrorWithName :: Phantoms.TTerm Core_.UndefinedTermVariableError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTermVariableError
+undefinedTermVariableErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+undefinedTypeVariableError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTypeVariableError
+undefinedTypeVariableError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+undefinedTypeVariableErrorLocation :: Phantoms.TTerm Core_.UndefinedTypeVariableError -> Phantoms.TTerm Paths.SubtermPath
+undefinedTypeVariableErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTypeVariableErrorName :: Phantoms.TTerm Core_.UndefinedTypeVariableError -> Phantoms.TTerm Core.Name
+undefinedTypeVariableErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTypeVariableErrorWithLocation :: Phantoms.TTerm Core_.UndefinedTypeVariableError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UndefinedTypeVariableError
+undefinedTypeVariableErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+undefinedTypeVariableErrorWithName :: Phantoms.TTerm Core_.UndefinedTypeVariableError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTypeVariableError
+undefinedTypeVariableErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+undefinedTypeVariableInBindingTypeError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTypeVariableInBindingTypeError
+undefinedTypeVariableInBindingTypeError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+undefinedTypeVariableInBindingTypeErrorLocation :: Phantoms.TTerm Core_.UndefinedTypeVariableInBindingTypeError -> Phantoms.TTerm Paths.SubtermPath
+undefinedTypeVariableInBindingTypeErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTypeVariableInBindingTypeErrorName :: Phantoms.TTerm Core_.UndefinedTypeVariableInBindingTypeError -> Phantoms.TTerm Core.Name
+undefinedTypeVariableInBindingTypeErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTypeVariableInBindingTypeErrorWithLocation :: Phantoms.TTerm Core_.UndefinedTypeVariableInBindingTypeError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UndefinedTypeVariableInBindingTypeError
+undefinedTypeVariableInBindingTypeErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+undefinedTypeVariableInBindingTypeErrorWithName :: Phantoms.TTerm Core_.UndefinedTypeVariableInBindingTypeError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTypeVariableInBindingTypeError
+undefinedTypeVariableInBindingTypeErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+undefinedTypeVariableInLambdaDomainError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTypeVariableInLambdaDomainError
+undefinedTypeVariableInLambdaDomainError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+undefinedTypeVariableInLambdaDomainErrorLocation :: Phantoms.TTerm Core_.UndefinedTypeVariableInLambdaDomainError -> Phantoms.TTerm Paths.SubtermPath
+undefinedTypeVariableInLambdaDomainErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTypeVariableInLambdaDomainErrorName :: Phantoms.TTerm Core_.UndefinedTypeVariableInLambdaDomainError -> Phantoms.TTerm Core.Name
+undefinedTypeVariableInLambdaDomainErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTypeVariableInLambdaDomainErrorWithLocation :: Phantoms.TTerm Core_.UndefinedTypeVariableInLambdaDomainError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UndefinedTypeVariableInLambdaDomainError
+undefinedTypeVariableInLambdaDomainErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+undefinedTypeVariableInLambdaDomainErrorWithName :: Phantoms.TTerm Core_.UndefinedTypeVariableInLambdaDomainError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTypeVariableInLambdaDomainError
+undefinedTypeVariableInLambdaDomainErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+undefinedTypeVariableInTypeApplicationError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTypeVariableInTypeApplicationError
+undefinedTypeVariableInTypeApplicationError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+undefinedTypeVariableInTypeApplicationErrorLocation :: Phantoms.TTerm Core_.UndefinedTypeVariableInTypeApplicationError -> Phantoms.TTerm Paths.SubtermPath
+undefinedTypeVariableInTypeApplicationErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTypeVariableInTypeApplicationErrorName :: Phantoms.TTerm Core_.UndefinedTypeVariableInTypeApplicationError -> Phantoms.TTerm Core.Name
+undefinedTypeVariableInTypeApplicationErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+undefinedTypeVariableInTypeApplicationErrorWithLocation :: Phantoms.TTerm Core_.UndefinedTypeVariableInTypeApplicationError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UndefinedTypeVariableInTypeApplicationError
+undefinedTypeVariableInTypeApplicationErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+undefinedTypeVariableInTypeApplicationErrorWithName :: Phantoms.TTerm Core_.UndefinedTypeVariableInTypeApplicationError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UndefinedTypeVariableInTypeApplicationError
+undefinedTypeVariableInTypeApplicationErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unexpectedTermVariantError :: Phantoms.TTerm Variants.TermVariant -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core_.UnexpectedTermVariantError
+unexpectedTermVariantError expectedVariant actualTerm =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedVariant"),
+          Core.fieldTerm = (Phantoms.unTTerm expectedVariant)},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualTerm"),
+          Core.fieldTerm = (Phantoms.unTTerm actualTerm)}]}))
+
+unexpectedTermVariantErrorActualTerm :: Phantoms.TTerm Core_.UnexpectedTermVariantError -> Phantoms.TTerm Core.Term
+unexpectedTermVariantErrorActualTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+        Core.projectionField = (Core.Name "actualTerm")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unexpectedTermVariantErrorExpectedVariant :: Phantoms.TTerm Core_.UnexpectedTermVariantError -> Phantoms.TTerm Variants.TermVariant
+unexpectedTermVariantErrorExpectedVariant x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+        Core.projectionField = (Core.Name "expectedVariant")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unexpectedTermVariantErrorWithActualTerm :: Phantoms.TTerm Core_.UnexpectedTermVariantError -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core_.UnexpectedTermVariantError
+unexpectedTermVariantErrorWithActualTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedVariant"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+              Core.projectionField = (Core.Name "expectedVariant")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualTerm"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unexpectedTermVariantErrorWithExpectedVariant :: Phantoms.TTerm Core_.UnexpectedTermVariantError -> Phantoms.TTerm Variants.TermVariant -> Phantoms.TTerm Core_.UnexpectedTermVariantError
+unexpectedTermVariantErrorWithExpectedVariant original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedVariant"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+              Core.projectionField = (Core.Name "actualTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unexpectedTypeVariantError :: Phantoms.TTerm Variants.TypeVariant -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core_.UnexpectedTypeVariantError
+unexpectedTypeVariantError expectedVariant actualType =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedVariant"),
+          Core.fieldTerm = (Phantoms.unTTerm expectedVariant)},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualType"),
+          Core.fieldTerm = (Phantoms.unTTerm actualType)}]}))
+
+unexpectedTypeVariantErrorActualType :: Phantoms.TTerm Core_.UnexpectedTypeVariantError -> Phantoms.TTerm Core.Type
+unexpectedTypeVariantErrorActualType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+        Core.projectionField = (Core.Name "actualType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unexpectedTypeVariantErrorExpectedVariant :: Phantoms.TTerm Core_.UnexpectedTypeVariantError -> Phantoms.TTerm Variants.TypeVariant
+unexpectedTypeVariantErrorExpectedVariant x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+        Core.projectionField = (Core.Name "expectedVariant")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unexpectedTypeVariantErrorWithActualType :: Phantoms.TTerm Core_.UnexpectedTypeVariantError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core_.UnexpectedTypeVariantError
+unexpectedTypeVariantErrorWithActualType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedVariant"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+              Core.projectionField = (Core.Name "expectedVariant")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unexpectedTypeVariantErrorWithExpectedVariant :: Phantoms.TTerm Core_.UnexpectedTypeVariantError -> Phantoms.TTerm Variants.TypeVariant -> Phantoms.TTerm Core_.UnexpectedTypeVariantError
+unexpectedTypeVariantErrorWithExpectedVariant original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedVariant"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+              Core.projectionField = (Core.Name "actualType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unknownPrimitiveNameError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UnknownPrimitiveNameError
+unknownPrimitiveNameError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+unknownPrimitiveNameErrorLocation :: Phantoms.TTerm Core_.UnknownPrimitiveNameError -> Phantoms.TTerm Paths.SubtermPath
+unknownPrimitiveNameErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unknownPrimitiveNameErrorName :: Phantoms.TTerm Core_.UnknownPrimitiveNameError -> Phantoms.TTerm Core.Name
+unknownPrimitiveNameErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unknownPrimitiveNameErrorWithLocation :: Phantoms.TTerm Core_.UnknownPrimitiveNameError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UnknownPrimitiveNameError
+unknownPrimitiveNameErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unknownPrimitiveNameErrorWithName :: Phantoms.TTerm Core_.UnknownPrimitiveNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UnknownPrimitiveNameError
+unknownPrimitiveNameErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unnecessaryIdentityApplicationError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UnnecessaryIdentityApplicationError
+unnecessaryIdentityApplicationError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+unnecessaryIdentityApplicationErrorLocation :: Phantoms.TTerm Core_.UnnecessaryIdentityApplicationError -> Phantoms.TTerm Paths.SubtermPath
+unnecessaryIdentityApplicationErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unnecessaryIdentityApplicationErrorWithLocation :: Phantoms.TTerm Core_.UnnecessaryIdentityApplicationError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UnnecessaryIdentityApplicationError
+unnecessaryIdentityApplicationErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+untypedTermVariableError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UntypedTermVariableError
+untypedTermVariableError location name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+untypedTermVariableErrorLocation :: Phantoms.TTerm Core_.UntypedTermVariableError -> Phantoms.TTerm Paths.SubtermPath
+untypedTermVariableErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+untypedTermVariableErrorName :: Phantoms.TTerm Core_.UntypedTermVariableError -> Phantoms.TTerm Core.Name
+untypedTermVariableErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+untypedTermVariableErrorWithLocation :: Phantoms.TTerm Core_.UntypedTermVariableError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.UntypedTermVariableError
+untypedTermVariableErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+untypedTermVariableErrorWithName :: Phantoms.TTerm Core_.UntypedTermVariableError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core_.UntypedTermVariableError
+untypedTermVariableErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+              Core.projectionField = (Core.Name "location")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+voidInNonBottomPositionError :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.VoidInNonBottomPositionError
+voidInNonBottomPositionError location =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.VoidInNonBottomPositionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm location)}]}))
+
+voidInNonBottomPositionErrorLocation :: Phantoms.TTerm Core_.VoidInNonBottomPositionError -> Phantoms.TTerm Paths.SubtermPath
+voidInNonBottomPositionErrorLocation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.core.VoidInNonBottomPositionError"),
+        Core.projectionField = (Core.Name "location")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+voidInNonBottomPositionErrorWithLocation :: Phantoms.TTerm Core_.VoidInNonBottomPositionError -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Core_.VoidInNonBottomPositionError
+voidInNonBottomPositionErrorWithLocation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.VoidInNonBottomPositionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Error/Packaging.hs b/src/gen-main/haskell/Hydra/Dsl/Error/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Error/Packaging.hs
@@ -0,0 +1,440 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.error.packaging
+
+module Hydra.Dsl.Error.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Packaging as Packaging
+import qualified Hydra.Module as Module
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+conflictingModuleNamespaceError :: Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Packaging.ConflictingModuleNamespaceError
+conflictingModuleNamespaceError first second =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "first"),
+          Core.fieldTerm = (Phantoms.unTTerm first)},
+        Core.Field {
+          Core.fieldName = (Core.Name "second"),
+          Core.fieldTerm = (Phantoms.unTTerm second)}]}))
+
+conflictingModuleNamespaceErrorFirst :: Phantoms.TTerm Packaging.ConflictingModuleNamespaceError -> Phantoms.TTerm Module.Namespace
+conflictingModuleNamespaceErrorFirst x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+        Core.projectionField = (Core.Name "first")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+conflictingModuleNamespaceErrorSecond :: Phantoms.TTerm Packaging.ConflictingModuleNamespaceError -> Phantoms.TTerm Module.Namespace
+conflictingModuleNamespaceErrorSecond x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+        Core.projectionField = (Core.Name "second")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+conflictingModuleNamespaceErrorWithFirst :: Phantoms.TTerm Packaging.ConflictingModuleNamespaceError -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Packaging.ConflictingModuleNamespaceError
+conflictingModuleNamespaceErrorWithFirst original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "first"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "second"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+              Core.projectionField = (Core.Name "second")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+conflictingModuleNamespaceErrorWithSecond :: Phantoms.TTerm Packaging.ConflictingModuleNamespaceError -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Packaging.ConflictingModuleNamespaceError
+conflictingModuleNamespaceErrorWithSecond original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "first"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+              Core.projectionField = (Core.Name "first")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "second"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+conflictingVariantNameError :: Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Packaging.ConflictingVariantNameError
+conflictingVariantNameError namespace typeName variantName conflictingName =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm namespace)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm typeName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "variantName"),
+          Core.fieldTerm = (Phantoms.unTTerm variantName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "conflictingName"),
+          Core.fieldTerm = (Phantoms.unTTerm conflictingName)}]}))
+
+conflictingVariantNameErrorConflictingName :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Core.Name
+conflictingVariantNameErrorConflictingName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+        Core.projectionField = (Core.Name "conflictingName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+conflictingVariantNameErrorNamespace :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Module.Namespace
+conflictingVariantNameErrorNamespace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+        Core.projectionField = (Core.Name "namespace")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+conflictingVariantNameErrorTypeName :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Core.Name
+conflictingVariantNameErrorTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+        Core.projectionField = (Core.Name "typeName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+conflictingVariantNameErrorVariantName :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Core.Name
+conflictingVariantNameErrorVariantName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+        Core.projectionField = (Core.Name "variantName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+conflictingVariantNameErrorWithConflictingName :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Packaging.ConflictingVariantNameError
+conflictingVariantNameErrorWithConflictingName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "variantName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "variantName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "conflictingName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+conflictingVariantNameErrorWithNamespace :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Packaging.ConflictingVariantNameError
+conflictingVariantNameErrorWithNamespace original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "variantName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "variantName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "conflictingName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "conflictingName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+conflictingVariantNameErrorWithTypeName :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Packaging.ConflictingVariantNameError
+conflictingVariantNameErrorWithTypeName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "variantName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "variantName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "conflictingName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "conflictingName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+conflictingVariantNameErrorWithVariantName :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Packaging.ConflictingVariantNameError
+conflictingVariantNameErrorWithVariantName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "typeName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "variantName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "conflictingName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+              Core.projectionField = (Core.Name "conflictingName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+definitionNotInModuleNamespaceError :: Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Packaging.DefinitionNotInModuleNamespaceError
+definitionNotInModuleNamespaceError namespace name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm namespace)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+definitionNotInModuleNamespaceErrorName :: Phantoms.TTerm Packaging.DefinitionNotInModuleNamespaceError -> Phantoms.TTerm Core.Name
+definitionNotInModuleNamespaceErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+definitionNotInModuleNamespaceErrorNamespace :: Phantoms.TTerm Packaging.DefinitionNotInModuleNamespaceError -> Phantoms.TTerm Module.Namespace
+definitionNotInModuleNamespaceErrorNamespace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+        Core.projectionField = (Core.Name "namespace")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+definitionNotInModuleNamespaceErrorWithName :: Phantoms.TTerm Packaging.DefinitionNotInModuleNamespaceError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Packaging.DefinitionNotInModuleNamespaceError
+definitionNotInModuleNamespaceErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+definitionNotInModuleNamespaceErrorWithNamespace :: Phantoms.TTerm Packaging.DefinitionNotInModuleNamespaceError -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Packaging.DefinitionNotInModuleNamespaceError
+definitionNotInModuleNamespaceErrorWithNamespace original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+duplicateDefinitionNameError :: Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Packaging.DuplicateDefinitionNameError
+duplicateDefinitionNameError namespace name =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm namespace)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)}]}))
+
+duplicateDefinitionNameErrorName :: Phantoms.TTerm Packaging.DuplicateDefinitionNameError -> Phantoms.TTerm Core.Name
+duplicateDefinitionNameErrorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateDefinitionNameErrorNamespace :: Phantoms.TTerm Packaging.DuplicateDefinitionNameError -> Phantoms.TTerm Module.Namespace
+duplicateDefinitionNameErrorNamespace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+        Core.projectionField = (Core.Name "namespace")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateDefinitionNameErrorWithName :: Phantoms.TTerm Packaging.DuplicateDefinitionNameError -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Packaging.DuplicateDefinitionNameError
+duplicateDefinitionNameErrorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+duplicateDefinitionNameErrorWithNamespace :: Phantoms.TTerm Packaging.DuplicateDefinitionNameError -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Packaging.DuplicateDefinitionNameError
+duplicateDefinitionNameErrorWithNamespace original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+duplicateModuleNamespaceError :: Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Packaging.DuplicateModuleNamespaceError
+duplicateModuleNamespaceError namespace =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.DuplicateModuleNamespaceError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm namespace)}]}))
+
+duplicateModuleNamespaceErrorNamespace :: Phantoms.TTerm Packaging.DuplicateModuleNamespaceError -> Phantoms.TTerm Module.Namespace
+duplicateModuleNamespaceErrorNamespace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.error.packaging.DuplicateModuleNamespaceError"),
+        Core.projectionField = (Core.Name "namespace")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+duplicateModuleNamespaceErrorWithNamespace :: Phantoms.TTerm Packaging.DuplicateModuleNamespaceError -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Packaging.DuplicateModuleNamespaceError
+duplicateModuleNamespaceErrorWithNamespace original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.packaging.DuplicateModuleNamespaceError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+invalidModuleErrorConflictingVariantName :: Phantoms.TTerm Packaging.ConflictingVariantNameError -> Phantoms.TTerm Packaging.InvalidModuleError
+invalidModuleErrorConflictingVariantName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidModuleError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "conflictingVariantName"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidModuleErrorDefinitionNotInModuleNamespace :: Phantoms.TTerm Packaging.DefinitionNotInModuleNamespaceError -> Phantoms.TTerm Packaging.InvalidModuleError
+invalidModuleErrorDefinitionNotInModuleNamespace x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidModuleError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "definitionNotInModuleNamespace"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidModuleErrorDuplicateDefinitionName :: Phantoms.TTerm Packaging.DuplicateDefinitionNameError -> Phantoms.TTerm Packaging.InvalidModuleError
+invalidModuleErrorDuplicateDefinitionName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidModuleError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "duplicateDefinitionName"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidPackageErrorConflictingModuleNamespace :: Phantoms.TTerm Packaging.ConflictingModuleNamespaceError -> Phantoms.TTerm Packaging.InvalidPackageError
+invalidPackageErrorConflictingModuleNamespace x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidPackageError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "conflictingModuleNamespace"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidPackageErrorDuplicateModuleNamespace :: Phantoms.TTerm Packaging.DuplicateModuleNamespaceError -> Phantoms.TTerm Packaging.InvalidPackageError
+invalidPackageErrorDuplicateModuleNamespace x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidPackageError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "duplicateModuleNamespace"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+invalidPackageErrorInvalidModule :: Phantoms.TTerm Packaging.InvalidModuleError -> Phantoms.TTerm Packaging.InvalidPackageError
+invalidPackageErrorInvalidModule x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidPackageError"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "invalidModule"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Errors.hs b/src/gen-main/haskell/Hydra/Dsl/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Errors.hs
@@ -0,0 +1,237 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.errors
+
+module Hydra.Dsl.Errors where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Checking as Checking
+import qualified Hydra.Error.Core as Core_
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+decodingError :: Phantoms.TTerm String -> Phantoms.TTerm Errors.DecodingError
+decodingError x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+errorChecking :: Phantoms.TTerm Checking.CheckingError -> Phantoms.TTerm Errors.Error
+errorChecking x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "checking"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorDecoding :: Phantoms.TTerm Errors.DecodingError -> Phantoms.TTerm Errors.Error
+errorDecoding x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "decoding"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorDuplicateBinding :: Phantoms.TTerm Core_.DuplicateBindingError -> Phantoms.TTerm Errors.Error
+errorDuplicateBinding x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "duplicateBinding"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorDuplicateField :: Phantoms.TTerm Core_.DuplicateFieldError -> Phantoms.TTerm Errors.Error
+errorDuplicateField x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "duplicateField"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorOther :: Phantoms.TTerm Errors.OtherError -> Phantoms.TTerm Errors.Error
+errorOther x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "other"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorUndefinedField :: Phantoms.TTerm Core_.UndefinedFieldError -> Phantoms.TTerm Errors.Error
+errorUndefinedField x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "undefinedField"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorUndefinedTermVariable :: Phantoms.TTerm Core_.UndefinedTermVariableError -> Phantoms.TTerm Errors.Error
+errorUndefinedTermVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "undefinedTermVariable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorUnexpectedTermVariant :: Phantoms.TTerm Core_.UnexpectedTermVariantError -> Phantoms.TTerm Errors.Error
+errorUnexpectedTermVariant x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unexpectedTermVariant"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorUnexpectedTypeVariant :: Phantoms.TTerm Core_.UnexpectedTypeVariantError -> Phantoms.TTerm Errors.Error
+errorUnexpectedTypeVariant x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unexpectedTypeVariant"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorUnification :: Phantoms.TTerm Errors.UnificationError -> Phantoms.TTerm Errors.Error
+errorUnification x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unification"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+errorUntypedTermVariable :: Phantoms.TTerm Core_.UntypedTermVariableError -> Phantoms.TTerm Errors.Error
+errorUntypedTermVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "untypedTermVariable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+otherError :: Phantoms.TTerm String -> Phantoms.TTerm Errors.OtherError
+otherError x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.errors.OtherError"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+unDecodingError :: Phantoms.TTerm Errors.DecodingError -> Phantoms.TTerm String
+unDecodingError x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.errors.DecodingError")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unOtherError :: Phantoms.TTerm Errors.OtherError -> Phantoms.TTerm String
+unOtherError x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.errors.OtherError")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unificationError :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm String -> Phantoms.TTerm Errors.UnificationError
+unificationError leftType rightType message =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.errors.UnificationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "leftType"),
+          Core.fieldTerm = (Phantoms.unTTerm leftType)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rightType"),
+          Core.fieldTerm = (Phantoms.unTTerm rightType)},
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = (Phantoms.unTTerm message)}]}))
+
+unificationErrorLeftType :: Phantoms.TTerm Errors.UnificationError -> Phantoms.TTerm Core.Type
+unificationErrorLeftType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+        Core.projectionField = (Core.Name "leftType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unificationErrorMessage :: Phantoms.TTerm Errors.UnificationError -> Phantoms.TTerm String
+unificationErrorMessage x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+        Core.projectionField = (Core.Name "message")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unificationErrorRightType :: Phantoms.TTerm Errors.UnificationError -> Phantoms.TTerm Core.Type
+unificationErrorRightType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+        Core.projectionField = (Core.Name "rightType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unificationErrorWithLeftType :: Phantoms.TTerm Errors.UnificationError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Errors.UnificationError
+unificationErrorWithLeftType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.errors.UnificationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "leftType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rightType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+              Core.projectionField = (Core.Name "rightType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+              Core.projectionField = (Core.Name "message")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unificationErrorWithMessage :: Phantoms.TTerm Errors.UnificationError -> Phantoms.TTerm String -> Phantoms.TTerm Errors.UnificationError
+unificationErrorWithMessage original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.errors.UnificationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "leftType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+              Core.projectionField = (Core.Name "leftType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rightType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+              Core.projectionField = (Core.Name "rightType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unificationErrorWithRightType :: Phantoms.TTerm Errors.UnificationError -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Errors.UnificationError
+unificationErrorWithRightType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.errors.UnificationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "leftType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+              Core.projectionField = (Core.Name "leftType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rightType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+              Core.projectionField = (Core.Name "message")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Ext/Haskell/Syntax.hs b/src/gen-main/haskell/Hydra/Dsl/Ext/Haskell/Syntax.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Ext/Haskell/Syntax.hs
@@ -0,0 +1,3759 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.ext.haskell.syntax
+
+module Hydra.Dsl.Ext.Haskell.Syntax where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Ext.Haskell.Syntax as Syntax
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+alternative :: Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.CaseRhs -> Phantoms.TTerm (Maybe Syntax.LocalBindings) -> Phantoms.TTerm Syntax.Alternative
+alternative pattern rhs binds =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Phantoms.unTTerm pattern)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm rhs)},
+        Core.Field {
+          Core.fieldName = (Core.Name "binds"),
+          Core.fieldTerm = (Phantoms.unTTerm binds)}]}))
+
+alternativeBinds :: Phantoms.TTerm Syntax.Alternative -> Phantoms.TTerm (Maybe Syntax.LocalBindings)
+alternativeBinds x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+        Core.projectionField = (Core.Name "binds")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+alternativePattern :: Phantoms.TTerm Syntax.Alternative -> Phantoms.TTerm Syntax.Pattern
+alternativePattern x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+        Core.projectionField = (Core.Name "pattern")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+alternativeRhs :: Phantoms.TTerm Syntax.Alternative -> Phantoms.TTerm Syntax.CaseRhs
+alternativeRhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+        Core.projectionField = (Core.Name "rhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+alternativeWithBinds :: Phantoms.TTerm Syntax.Alternative -> Phantoms.TTerm (Maybe Syntax.LocalBindings) -> Phantoms.TTerm Syntax.Alternative
+alternativeWithBinds original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+              Core.projectionField = (Core.Name "pattern")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "binds"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+alternativeWithPattern :: Phantoms.TTerm Syntax.Alternative -> Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.Alternative
+alternativeWithPattern original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "binds"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+              Core.projectionField = (Core.Name "binds")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+alternativeWithRhs :: Phantoms.TTerm Syntax.Alternative -> Phantoms.TTerm Syntax.CaseRhs -> Phantoms.TTerm Syntax.Alternative
+alternativeWithRhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+              Core.projectionField = (Core.Name "pattern")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "binds"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Alternative"),
+              Core.projectionField = (Core.Name "binds")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+applicationDeclarationHead :: Phantoms.TTerm Syntax.DeclarationHead -> Phantoms.TTerm Syntax.Variable -> Phantoms.TTerm Syntax.ApplicationDeclarationHead
+applicationDeclarationHead function operand =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationDeclarationHead"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Phantoms.unTTerm function)},
+        Core.Field {
+          Core.fieldName = (Core.Name "operand"),
+          Core.fieldTerm = (Phantoms.unTTerm operand)}]}))
+
+applicationDeclarationHeadFunction :: Phantoms.TTerm Syntax.ApplicationDeclarationHead -> Phantoms.TTerm Syntax.DeclarationHead
+applicationDeclarationHeadFunction x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationDeclarationHead"),
+        Core.projectionField = (Core.Name "function")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationDeclarationHeadOperand :: Phantoms.TTerm Syntax.ApplicationDeclarationHead -> Phantoms.TTerm Syntax.Variable
+applicationDeclarationHeadOperand x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationDeclarationHead"),
+        Core.projectionField = (Core.Name "operand")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationDeclarationHeadWithFunction :: Phantoms.TTerm Syntax.ApplicationDeclarationHead -> Phantoms.TTerm Syntax.DeclarationHead -> Phantoms.TTerm Syntax.ApplicationDeclarationHead
+applicationDeclarationHeadWithFunction original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationDeclarationHead"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "operand"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationDeclarationHead"),
+              Core.projectionField = (Core.Name "operand")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+applicationDeclarationHeadWithOperand :: Phantoms.TTerm Syntax.ApplicationDeclarationHead -> Phantoms.TTerm Syntax.Variable -> Phantoms.TTerm Syntax.ApplicationDeclarationHead
+applicationDeclarationHeadWithOperand original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationDeclarationHead"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationDeclarationHead"),
+              Core.projectionField = (Core.Name "function")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operand"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+applicationExpression :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.ApplicationExpression
+applicationExpression function argument =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Phantoms.unTTerm function)},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Phantoms.unTTerm argument)}]}))
+
+applicationExpressionArgument :: Phantoms.TTerm Syntax.ApplicationExpression -> Phantoms.TTerm Syntax.Expression
+applicationExpressionArgument x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationExpression"),
+        Core.projectionField = (Core.Name "argument")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationExpressionFunction :: Phantoms.TTerm Syntax.ApplicationExpression -> Phantoms.TTerm Syntax.Expression
+applicationExpressionFunction x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationExpression"),
+        Core.projectionField = (Core.Name "function")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationExpressionWithArgument :: Phantoms.TTerm Syntax.ApplicationExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.ApplicationExpression
+applicationExpressionWithArgument original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationExpression"),
+              Core.projectionField = (Core.Name "function")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+applicationExpressionWithFunction :: Phantoms.TTerm Syntax.ApplicationExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.ApplicationExpression
+applicationExpressionWithFunction original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationExpression"),
+              Core.projectionField = (Core.Name "argument")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+applicationPattern :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm [Syntax.Pattern] -> Phantoms.TTerm Syntax.ApplicationPattern
+applicationPattern name args =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "args"),
+          Core.fieldTerm = (Phantoms.unTTerm args)}]}))
+
+applicationPatternArgs :: Phantoms.TTerm Syntax.ApplicationPattern -> Phantoms.TTerm [Syntax.Pattern]
+applicationPatternArgs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationPattern"),
+        Core.projectionField = (Core.Name "args")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationPatternName :: Phantoms.TTerm Syntax.ApplicationPattern -> Phantoms.TTerm Syntax.Name
+applicationPatternName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationPattern"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationPatternWithArgs :: Phantoms.TTerm Syntax.ApplicationPattern -> Phantoms.TTerm [Syntax.Pattern] -> Phantoms.TTerm Syntax.ApplicationPattern
+applicationPatternWithArgs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationPattern"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "args"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+applicationPatternWithName :: Phantoms.TTerm Syntax.ApplicationPattern -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.ApplicationPattern
+applicationPatternWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "args"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationPattern"),
+              Core.projectionField = (Core.Name "args")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+applicationType :: Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.ApplicationType
+applicationType context argument =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Phantoms.unTTerm context)},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Phantoms.unTTerm argument)}]}))
+
+applicationTypeArgument :: Phantoms.TTerm Syntax.ApplicationType -> Phantoms.TTerm Syntax.Type
+applicationTypeArgument x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationType"),
+        Core.projectionField = (Core.Name "argument")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationTypeContext :: Phantoms.TTerm Syntax.ApplicationType -> Phantoms.TTerm Syntax.Type
+applicationTypeContext x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationType"),
+        Core.projectionField = (Core.Name "context")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+applicationTypeWithArgument :: Phantoms.TTerm Syntax.ApplicationType -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.ApplicationType
+applicationTypeWithArgument original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationType"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+applicationTypeWithContext :: Phantoms.TTerm Syntax.ApplicationType -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.ApplicationType
+applicationTypeWithContext original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ApplicationType"),
+              Core.projectionField = (Core.Name "argument")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+asPattern :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.AsPattern
+asPattern name inner =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.AsPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm inner)}]}))
+
+asPatternInner :: Phantoms.TTerm Syntax.AsPattern -> Phantoms.TTerm Syntax.Pattern
+asPatternInner x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.AsPattern"),
+        Core.projectionField = (Core.Name "inner")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+asPatternName :: Phantoms.TTerm Syntax.AsPattern -> Phantoms.TTerm Syntax.Name
+asPatternName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.AsPattern"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+asPatternWithInner :: Phantoms.TTerm Syntax.AsPattern -> Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.AsPattern
+asPatternWithInner original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.AsPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.AsPattern"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+asPatternWithName :: Phantoms.TTerm Syntax.AsPattern -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.AsPattern
+asPatternWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.AsPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.AsPattern"),
+              Core.projectionField = (Core.Name "inner")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+assertionClass :: Phantoms.TTerm Syntax.ClassAssertion -> Phantoms.TTerm Syntax.Assertion
+assertionClass x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Assertion"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "class"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+assertionTuple :: Phantoms.TTerm [Syntax.Assertion] -> Phantoms.TTerm Syntax.Assertion
+assertionTuple x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Assertion"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "tuple"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+caseExpression :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm [Syntax.Alternative] -> Phantoms.TTerm Syntax.CaseExpression
+caseExpression case_ alternatives =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.CaseExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (Phantoms.unTTerm case_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "alternatives"),
+          Core.fieldTerm = (Phantoms.unTTerm alternatives)}]}))
+
+caseExpressionAlternatives :: Phantoms.TTerm Syntax.CaseExpression -> Phantoms.TTerm [Syntax.Alternative]
+caseExpressionAlternatives x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.CaseExpression"),
+        Core.projectionField = (Core.Name "alternatives")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseExpressionCase :: Phantoms.TTerm Syntax.CaseExpression -> Phantoms.TTerm Syntax.Expression
+caseExpressionCase x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.CaseExpression"),
+        Core.projectionField = (Core.Name "case")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseExpressionWithAlternatives :: Phantoms.TTerm Syntax.CaseExpression -> Phantoms.TTerm [Syntax.Alternative] -> Phantoms.TTerm Syntax.CaseExpression
+caseExpressionWithAlternatives original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.CaseExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.CaseExpression"),
+              Core.projectionField = (Core.Name "case")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "alternatives"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+caseExpressionWithCase :: Phantoms.TTerm Syntax.CaseExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.CaseExpression
+caseExpressionWithCase original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.CaseExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "alternatives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.CaseExpression"),
+              Core.projectionField = (Core.Name "alternatives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+caseRhs :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.CaseRhs
+caseRhs x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ext.haskell.syntax.CaseRhs"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+classAssertion :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm [Syntax.Type] -> Phantoms.TTerm Syntax.ClassAssertion
+classAssertion name types =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ClassAssertion"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Phantoms.unTTerm types)}]}))
+
+classAssertionName :: Phantoms.TTerm Syntax.ClassAssertion -> Phantoms.TTerm Syntax.Name
+classAssertionName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ClassAssertion"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+classAssertionTypes :: Phantoms.TTerm Syntax.ClassAssertion -> Phantoms.TTerm [Syntax.Type]
+classAssertionTypes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ClassAssertion"),
+        Core.projectionField = (Core.Name "types")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+classAssertionWithName :: Phantoms.TTerm Syntax.ClassAssertion -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.ClassAssertion
+classAssertionWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ClassAssertion"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ClassAssertion"),
+              Core.projectionField = (Core.Name "types")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+classAssertionWithTypes :: Phantoms.TTerm Syntax.ClassAssertion -> Phantoms.TTerm [Syntax.Type] -> Phantoms.TTerm Syntax.ClassAssertion
+classAssertionWithTypes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ClassAssertion"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ClassAssertion"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+constructRecordExpression :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm [Syntax.FieldUpdate] -> Phantoms.TTerm Syntax.ConstructRecordExpression
+constructRecordExpression name fields =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructRecordExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm fields)}]}))
+
+constructRecordExpressionFields :: Phantoms.TTerm Syntax.ConstructRecordExpression -> Phantoms.TTerm [Syntax.FieldUpdate]
+constructRecordExpressionFields x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructRecordExpression"),
+        Core.projectionField = (Core.Name "fields")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+constructRecordExpressionName :: Phantoms.TTerm Syntax.ConstructRecordExpression -> Phantoms.TTerm Syntax.Name
+constructRecordExpressionName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructRecordExpression"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+constructRecordExpressionWithFields :: Phantoms.TTerm Syntax.ConstructRecordExpression -> Phantoms.TTerm [Syntax.FieldUpdate] -> Phantoms.TTerm Syntax.ConstructRecordExpression
+constructRecordExpressionWithFields original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructRecordExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructRecordExpression"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+constructRecordExpressionWithName :: Phantoms.TTerm Syntax.ConstructRecordExpression -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.ConstructRecordExpression
+constructRecordExpressionWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructRecordExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructRecordExpression"),
+              Core.projectionField = (Core.Name "fields")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+constructorOrdinary :: Phantoms.TTerm Syntax.OrdinaryConstructor -> Phantoms.TTerm Syntax.Constructor
+constructorOrdinary x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Constructor"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "ordinary"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+constructorRecord :: Phantoms.TTerm Syntax.RecordConstructor -> Phantoms.TTerm Syntax.Constructor
+constructorRecord x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Constructor"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "record"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+constructorWithComments :: Phantoms.TTerm Syntax.Constructor -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Syntax.ConstructorWithComments
+constructorWithComments body comments =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructorWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Phantoms.unTTerm comments)}]}))
+
+constructorWithCommentsBody :: Phantoms.TTerm Syntax.ConstructorWithComments -> Phantoms.TTerm Syntax.Constructor
+constructorWithCommentsBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructorWithComments"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+constructorWithCommentsComments :: Phantoms.TTerm Syntax.ConstructorWithComments -> Phantoms.TTerm (Maybe String)
+constructorWithCommentsComments x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructorWithComments"),
+        Core.projectionField = (Core.Name "comments")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+constructorWithCommentsWithBody :: Phantoms.TTerm Syntax.ConstructorWithComments -> Phantoms.TTerm Syntax.Constructor -> Phantoms.TTerm Syntax.ConstructorWithComments
+constructorWithCommentsWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructorWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructorWithComments"),
+              Core.projectionField = (Core.Name "comments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+constructorWithCommentsWithComments :: Phantoms.TTerm Syntax.ConstructorWithComments -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Syntax.ConstructorWithComments
+constructorWithCommentsWithComments original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructorWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ConstructorWithComments"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+contextType :: Phantoms.TTerm Syntax.Assertion -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.ContextType
+contextType ctx type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ContextType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "ctx"),
+          Core.fieldTerm = (Phantoms.unTTerm ctx)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+contextTypeCtx :: Phantoms.TTerm Syntax.ContextType -> Phantoms.TTerm Syntax.Assertion
+contextTypeCtx x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ContextType"),
+        Core.projectionField = (Core.Name "ctx")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+contextTypeType :: Phantoms.TTerm Syntax.ContextType -> Phantoms.TTerm Syntax.Type
+contextTypeType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ContextType"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+contextTypeWithCtx :: Phantoms.TTerm Syntax.ContextType -> Phantoms.TTerm Syntax.Assertion -> Phantoms.TTerm Syntax.ContextType
+contextTypeWithCtx original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ContextType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "ctx"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ContextType"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+contextTypeWithType :: Phantoms.TTerm Syntax.ContextType -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.ContextType
+contextTypeWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ContextType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "ctx"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ContextType"),
+              Core.projectionField = (Core.Name "ctx")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+dataDeclaration :: Phantoms.TTerm Syntax.DataOrNewtype -> Phantoms.TTerm [Syntax.Assertion] -> Phantoms.TTerm Syntax.DeclarationHead -> Phantoms.TTerm [Syntax.ConstructorWithComments] -> Phantoms.TTerm [Syntax.Deriving] -> Phantoms.TTerm Syntax.DataDeclaration
+dataDeclaration keyword context head constructors deriving_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keyword"),
+          Core.fieldTerm = (Phantoms.unTTerm keyword)},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Phantoms.unTTerm context)},
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Phantoms.unTTerm head)},
+        Core.Field {
+          Core.fieldName = (Core.Name "constructors"),
+          Core.fieldTerm = (Phantoms.unTTerm constructors)},
+        Core.Field {
+          Core.fieldName = (Core.Name "deriving"),
+          Core.fieldTerm = (Phantoms.unTTerm deriving_)}]}))
+
+dataDeclarationConstructors :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm [Syntax.ConstructorWithComments]
+dataDeclarationConstructors x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+        Core.projectionField = (Core.Name "constructors")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+dataDeclarationContext :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm [Syntax.Assertion]
+dataDeclarationContext x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+        Core.projectionField = (Core.Name "context")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+dataDeclarationDeriving :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm [Syntax.Deriving]
+dataDeclarationDeriving x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+        Core.projectionField = (Core.Name "deriving")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+dataDeclarationHead :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm Syntax.DeclarationHead
+dataDeclarationHead x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+        Core.projectionField = (Core.Name "head")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+dataDeclarationKeyword :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm Syntax.DataOrNewtype
+dataDeclarationKeyword x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+        Core.projectionField = (Core.Name "keyword")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+dataDeclarationWithConstructors :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm [Syntax.ConstructorWithComments] -> Phantoms.TTerm Syntax.DataDeclaration
+dataDeclarationWithConstructors original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keyword"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "keyword")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "head")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "constructors"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "deriving"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "deriving")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+dataDeclarationWithContext :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm [Syntax.Assertion] -> Phantoms.TTerm Syntax.DataDeclaration
+dataDeclarationWithContext original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keyword"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "keyword")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "head")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "constructors"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "constructors")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "deriving"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "deriving")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+dataDeclarationWithDeriving :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm [Syntax.Deriving] -> Phantoms.TTerm Syntax.DataDeclaration
+dataDeclarationWithDeriving original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keyword"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "keyword")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "head")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "constructors"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "constructors")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "deriving"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+dataDeclarationWithHead :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm Syntax.DeclarationHead -> Phantoms.TTerm Syntax.DataDeclaration
+dataDeclarationWithHead original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keyword"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "keyword")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "constructors"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "constructors")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "deriving"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "deriving")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+dataDeclarationWithKeyword :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm Syntax.DataOrNewtype -> Phantoms.TTerm Syntax.DataDeclaration
+dataDeclarationWithKeyword original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keyword"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "head")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "constructors"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "constructors")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "deriving"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataDeclaration"),
+              Core.projectionField = (Core.Name "deriving")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+dataOrNewtypeData :: Phantoms.TTerm Syntax.DataOrNewtype
+dataOrNewtypeData =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataOrNewtype"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "data"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+dataOrNewtypeNewtype :: Phantoms.TTerm Syntax.DataOrNewtype
+dataOrNewtypeNewtype =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DataOrNewtype"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "newtype"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+declarationData :: Phantoms.TTerm Syntax.DataDeclaration -> Phantoms.TTerm Syntax.Declaration
+declarationData x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Declaration"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "data"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+declarationHeadApplication :: Phantoms.TTerm Syntax.ApplicationDeclarationHead -> Phantoms.TTerm Syntax.DeclarationHead
+declarationHeadApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationHead"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "application"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+declarationHeadParens :: Phantoms.TTerm Syntax.DeclarationHead -> Phantoms.TTerm Syntax.DeclarationHead
+declarationHeadParens x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationHead"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "parens"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+declarationHeadSimple :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.DeclarationHead
+declarationHeadSimple x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationHead"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "simple"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+declarationType :: Phantoms.TTerm Syntax.TypeDeclaration -> Phantoms.TTerm Syntax.Declaration
+declarationType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Declaration"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "type"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+declarationTypedBinding :: Phantoms.TTerm Syntax.TypedBinding -> Phantoms.TTerm Syntax.Declaration
+declarationTypedBinding x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Declaration"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typedBinding"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+declarationValueBinding :: Phantoms.TTerm Syntax.ValueBinding -> Phantoms.TTerm Syntax.Declaration
+declarationValueBinding x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Declaration"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "valueBinding"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+declarationWithComments :: Phantoms.TTerm Syntax.Declaration -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Syntax.DeclarationWithComments
+declarationWithComments body comments =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Phantoms.unTTerm comments)}]}))
+
+declarationWithCommentsBody :: Phantoms.TTerm Syntax.DeclarationWithComments -> Phantoms.TTerm Syntax.Declaration
+declarationWithCommentsBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationWithComments"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+declarationWithCommentsComments :: Phantoms.TTerm Syntax.DeclarationWithComments -> Phantoms.TTerm (Maybe String)
+declarationWithCommentsComments x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationWithComments"),
+        Core.projectionField = (Core.Name "comments")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+declarationWithCommentsWithBody :: Phantoms.TTerm Syntax.DeclarationWithComments -> Phantoms.TTerm Syntax.Declaration -> Phantoms.TTerm Syntax.DeclarationWithComments
+declarationWithCommentsWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationWithComments"),
+              Core.projectionField = (Core.Name "comments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+declarationWithCommentsWithComments :: Phantoms.TTerm Syntax.DeclarationWithComments -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Syntax.DeclarationWithComments
+declarationWithCommentsWithComments original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.DeclarationWithComments"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+deriving_ :: Phantoms.TTerm [Syntax.Name] -> Phantoms.TTerm Syntax.Deriving
+deriving_ x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ext.haskell.syntax.Deriving"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+exportDeclaration :: Phantoms.TTerm Syntax.ImportExportSpec -> Phantoms.TTerm Syntax.Export
+exportDeclaration x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Export"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "declaration"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+exportModule :: Phantoms.TTerm Syntax.ModuleName -> Phantoms.TTerm Syntax.Export
+exportModule x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Export"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "module"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionApplication :: Phantoms.TTerm Syntax.ApplicationExpression -> Phantoms.TTerm Syntax.Expression
+expressionApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "application"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionCase :: Phantoms.TTerm Syntax.CaseExpression -> Phantoms.TTerm Syntax.Expression
+expressionCase x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "case"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionConstructRecord :: Phantoms.TTerm Syntax.ConstructRecordExpression -> Phantoms.TTerm Syntax.Expression
+expressionConstructRecord x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "constructRecord"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionDo :: Phantoms.TTerm [Syntax.Statement] -> Phantoms.TTerm Syntax.Expression
+expressionDo x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "do"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionIf :: Phantoms.TTerm Syntax.IfExpression -> Phantoms.TTerm Syntax.Expression
+expressionIf x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "if"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionInfixApplication :: Phantoms.TTerm Syntax.InfixApplicationExpression -> Phantoms.TTerm Syntax.Expression
+expressionInfixApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "infixApplication"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionLambda :: Phantoms.TTerm Syntax.LambdaExpression -> Phantoms.TTerm Syntax.Expression
+expressionLambda x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lambda"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionLeftSection :: Phantoms.TTerm Syntax.SectionExpression -> Phantoms.TTerm Syntax.Expression
+expressionLeftSection x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "leftSection"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionLet :: Phantoms.TTerm Syntax.LetExpression -> Phantoms.TTerm Syntax.Expression
+expressionLet x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "let"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionList :: Phantoms.TTerm [Syntax.Expression] -> Phantoms.TTerm Syntax.Expression
+expressionList x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionLiteral :: Phantoms.TTerm Syntax.Literal -> Phantoms.TTerm Syntax.Expression
+expressionLiteral x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "literal"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionParens :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.Expression
+expressionParens x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "parens"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionPrefixApplication :: Phantoms.TTerm Syntax.PrefixApplicationExpression -> Phantoms.TTerm Syntax.Expression
+expressionPrefixApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "prefixApplication"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionRightSection :: Phantoms.TTerm Syntax.SectionExpression -> Phantoms.TTerm Syntax.Expression
+expressionRightSection x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "rightSection"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionTuple :: Phantoms.TTerm [Syntax.Expression] -> Phantoms.TTerm Syntax.Expression
+expressionTuple x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "tuple"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionTypeSignature :: Phantoms.TTerm Syntax.TypeSignatureExpression -> Phantoms.TTerm Syntax.Expression
+expressionTypeSignature x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeSignature"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionUpdateRecord :: Phantoms.TTerm Syntax.UpdateRecordExpression -> Phantoms.TTerm Syntax.Expression
+expressionUpdateRecord x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "updateRecord"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+expressionVariable :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Expression
+expressionVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Expression"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "variable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+field :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.Field
+field name type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Field"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+fieldName :: Phantoms.TTerm Syntax.Field -> Phantoms.TTerm Syntax.Name
+fieldName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Field"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldType :: Phantoms.TTerm Syntax.Field -> Phantoms.TTerm Syntax.Type
+fieldType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Field"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldUpdate :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.FieldUpdate
+fieldUpdate name value =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldUpdate"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Phantoms.unTTerm value)}]}))
+
+fieldUpdateName :: Phantoms.TTerm Syntax.FieldUpdate -> Phantoms.TTerm Syntax.Name
+fieldUpdateName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldUpdate"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldUpdateValue :: Phantoms.TTerm Syntax.FieldUpdate -> Phantoms.TTerm Syntax.Expression
+fieldUpdateValue x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldUpdate"),
+        Core.projectionField = (Core.Name "value")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldUpdateWithName :: Phantoms.TTerm Syntax.FieldUpdate -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.FieldUpdate
+fieldUpdateWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldUpdate"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldUpdate"),
+              Core.projectionField = (Core.Name "value")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+fieldUpdateWithValue :: Phantoms.TTerm Syntax.FieldUpdate -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.FieldUpdate
+fieldUpdateWithValue original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldUpdate"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldUpdate"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+fieldWithComments :: Phantoms.TTerm Syntax.Field -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Syntax.FieldWithComments
+fieldWithComments field comments =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Phantoms.unTTerm field)},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Phantoms.unTTerm comments)}]}))
+
+fieldWithCommentsComments :: Phantoms.TTerm Syntax.FieldWithComments -> Phantoms.TTerm (Maybe String)
+fieldWithCommentsComments x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldWithComments"),
+        Core.projectionField = (Core.Name "comments")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldWithCommentsField :: Phantoms.TTerm Syntax.FieldWithComments -> Phantoms.TTerm Syntax.Field
+fieldWithCommentsField x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldWithComments"),
+        Core.projectionField = (Core.Name "field")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+fieldWithCommentsWithComments :: Phantoms.TTerm Syntax.FieldWithComments -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Syntax.FieldWithComments
+fieldWithCommentsWithComments original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldWithComments"),
+              Core.projectionField = (Core.Name "field")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+fieldWithCommentsWithField :: Phantoms.TTerm Syntax.FieldWithComments -> Phantoms.TTerm Syntax.Field -> Phantoms.TTerm Syntax.FieldWithComments
+fieldWithCommentsWithField original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldWithComments"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FieldWithComments"),
+              Core.projectionField = (Core.Name "comments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+fieldWithName :: Phantoms.TTerm Syntax.Field -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Field
+fieldWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Field"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Field"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+fieldWithType :: Phantoms.TTerm Syntax.Field -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.Field
+fieldWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Field"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Field"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+functionType :: Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.FunctionType
+functionType domain codomain =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FunctionType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Phantoms.unTTerm domain)},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Phantoms.unTTerm codomain)}]}))
+
+functionTypeCodomain :: Phantoms.TTerm Syntax.FunctionType -> Phantoms.TTerm Syntax.Type
+functionTypeCodomain x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FunctionType"),
+        Core.projectionField = (Core.Name "codomain")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionTypeDomain :: Phantoms.TTerm Syntax.FunctionType -> Phantoms.TTerm Syntax.Type
+functionTypeDomain x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FunctionType"),
+        Core.projectionField = (Core.Name "domain")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionTypeWithCodomain :: Phantoms.TTerm Syntax.FunctionType -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.FunctionType
+functionTypeWithCodomain original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FunctionType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FunctionType"),
+              Core.projectionField = (Core.Name "domain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+functionTypeWithDomain :: Phantoms.TTerm Syntax.FunctionType -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.FunctionType
+functionTypeWithDomain original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.FunctionType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.FunctionType"),
+              Core.projectionField = (Core.Name "codomain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+ifExpression :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.IfExpression
+ifExpression condition then_ else_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "condition"),
+          Core.fieldTerm = (Phantoms.unTTerm condition)},
+        Core.Field {
+          Core.fieldName = (Core.Name "then"),
+          Core.fieldTerm = (Phantoms.unTTerm then_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "else"),
+          Core.fieldTerm = (Phantoms.unTTerm else_)}]}))
+
+ifExpressionCondition :: Phantoms.TTerm Syntax.IfExpression -> Phantoms.TTerm Syntax.Expression
+ifExpressionCondition x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+        Core.projectionField = (Core.Name "condition")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+ifExpressionElse :: Phantoms.TTerm Syntax.IfExpression -> Phantoms.TTerm Syntax.Expression
+ifExpressionElse x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+        Core.projectionField = (Core.Name "else")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+ifExpressionThen :: Phantoms.TTerm Syntax.IfExpression -> Phantoms.TTerm Syntax.Expression
+ifExpressionThen x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+        Core.projectionField = (Core.Name "then")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+ifExpressionWithCondition :: Phantoms.TTerm Syntax.IfExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.IfExpression
+ifExpressionWithCondition original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "condition"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "then"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+              Core.projectionField = (Core.Name "then")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "else"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+              Core.projectionField = (Core.Name "else")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+ifExpressionWithElse :: Phantoms.TTerm Syntax.IfExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.IfExpression
+ifExpressionWithElse original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "condition"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+              Core.projectionField = (Core.Name "condition")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "then"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+              Core.projectionField = (Core.Name "then")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "else"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+ifExpressionWithThen :: Phantoms.TTerm Syntax.IfExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.IfExpression
+ifExpressionWithThen original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "condition"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+              Core.projectionField = (Core.Name "condition")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "then"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "else"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.IfExpression"),
+              Core.projectionField = (Core.Name "else")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+import_ :: Phantoms.TTerm Bool -> Phantoms.TTerm Syntax.ModuleName -> Phantoms.TTerm (Maybe Syntax.ModuleName) -> Phantoms.TTerm (Maybe Syntax.SpecImport) -> Phantoms.TTerm Syntax.Import
+import_ qualified module_ as spec =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "qualified"),
+          Core.fieldTerm = (Phantoms.unTTerm qualified)},
+        Core.Field {
+          Core.fieldName = (Core.Name "module"),
+          Core.fieldTerm = (Phantoms.unTTerm module_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "as"),
+          Core.fieldTerm = (Phantoms.unTTerm as)},
+        Core.Field {
+          Core.fieldName = (Core.Name "spec"),
+          Core.fieldTerm = (Phantoms.unTTerm spec)}]}))
+
+importAs :: Phantoms.TTerm Syntax.Import -> Phantoms.TTerm (Maybe Syntax.ModuleName)
+importAs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+        Core.projectionField = (Core.Name "as")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+importExportSpec :: Phantoms.TTerm (Maybe Syntax.ImportModifier) -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm (Maybe Syntax.SubspecImportExportSpec) -> Phantoms.TTerm Syntax.ImportExportSpec
+importExportSpec modifier name subspec =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "modifier"),
+          Core.fieldTerm = (Phantoms.unTTerm modifier)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "subspec"),
+          Core.fieldTerm = (Phantoms.unTTerm subspec)}]}))
+
+importExportSpecModifier :: Phantoms.TTerm Syntax.ImportExportSpec -> Phantoms.TTerm (Maybe Syntax.ImportModifier)
+importExportSpecModifier x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+        Core.projectionField = (Core.Name "modifier")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+importExportSpecName :: Phantoms.TTerm Syntax.ImportExportSpec -> Phantoms.TTerm Syntax.Name
+importExportSpecName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+importExportSpecSubspec :: Phantoms.TTerm Syntax.ImportExportSpec -> Phantoms.TTerm (Maybe Syntax.SubspecImportExportSpec)
+importExportSpecSubspec x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+        Core.projectionField = (Core.Name "subspec")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+importExportSpecWithModifier :: Phantoms.TTerm Syntax.ImportExportSpec -> Phantoms.TTerm (Maybe Syntax.ImportModifier) -> Phantoms.TTerm Syntax.ImportExportSpec
+importExportSpecWithModifier original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "modifier"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subspec"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+              Core.projectionField = (Core.Name "subspec")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+importExportSpecWithName :: Phantoms.TTerm Syntax.ImportExportSpec -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.ImportExportSpec
+importExportSpecWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "modifier"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+              Core.projectionField = (Core.Name "modifier")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "subspec"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+              Core.projectionField = (Core.Name "subspec")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+importExportSpecWithSubspec :: Phantoms.TTerm Syntax.ImportExportSpec -> Phantoms.TTerm (Maybe Syntax.SubspecImportExportSpec) -> Phantoms.TTerm Syntax.ImportExportSpec
+importExportSpecWithSubspec original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "modifier"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+              Core.projectionField = (Core.Name "modifier")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subspec"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+importModifierPattern :: Phantoms.TTerm Syntax.ImportModifier
+importModifierPattern =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportModifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pattern"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+importModifierType :: Phantoms.TTerm Syntax.ImportModifier
+importModifierType =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ImportModifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "type"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+importModule :: Phantoms.TTerm Syntax.Import -> Phantoms.TTerm Syntax.ModuleName
+importModule x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+        Core.projectionField = (Core.Name "module")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+importQualified :: Phantoms.TTerm Syntax.Import -> Phantoms.TTerm Bool
+importQualified x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+        Core.projectionField = (Core.Name "qualified")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+importSpec :: Phantoms.TTerm Syntax.Import -> Phantoms.TTerm (Maybe Syntax.SpecImport)
+importSpec x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+        Core.projectionField = (Core.Name "spec")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+importWithAs :: Phantoms.TTerm Syntax.Import -> Phantoms.TTerm (Maybe Syntax.ModuleName) -> Phantoms.TTerm Syntax.Import
+importWithAs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "qualified"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "qualified")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "module"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "module")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "as"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "spec"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "spec")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+importWithModule :: Phantoms.TTerm Syntax.Import -> Phantoms.TTerm Syntax.ModuleName -> Phantoms.TTerm Syntax.Import
+importWithModule original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "qualified"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "qualified")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "module"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "as"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "as")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "spec"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "spec")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+importWithQualified :: Phantoms.TTerm Syntax.Import -> Phantoms.TTerm Bool -> Phantoms.TTerm Syntax.Import
+importWithQualified original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "qualified"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "module"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "module")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "as"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "as")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "spec"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "spec")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+importWithSpec :: Phantoms.TTerm Syntax.Import -> Phantoms.TTerm (Maybe Syntax.SpecImport) -> Phantoms.TTerm Syntax.Import
+importWithSpec original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "qualified"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "qualified")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "module"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "module")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "as"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Import"),
+              Core.projectionField = (Core.Name "as")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "spec"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+infixApplicationExpression :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.InfixApplicationExpression
+infixApplicationExpression lhs operator rhs =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Phantoms.unTTerm lhs)},
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Phantoms.unTTerm operator)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm rhs)}]}))
+
+infixApplicationExpressionLhs :: Phantoms.TTerm Syntax.InfixApplicationExpression -> Phantoms.TTerm Syntax.Expression
+infixApplicationExpressionLhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+        Core.projectionField = (Core.Name "lhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+infixApplicationExpressionOperator :: Phantoms.TTerm Syntax.InfixApplicationExpression -> Phantoms.TTerm Syntax.Operator
+infixApplicationExpressionOperator x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+        Core.projectionField = (Core.Name "operator")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+infixApplicationExpressionRhs :: Phantoms.TTerm Syntax.InfixApplicationExpression -> Phantoms.TTerm Syntax.Expression
+infixApplicationExpressionRhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+        Core.projectionField = (Core.Name "rhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+infixApplicationExpressionWithLhs :: Phantoms.TTerm Syntax.InfixApplicationExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.InfixApplicationExpression
+infixApplicationExpressionWithLhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+              Core.projectionField = (Core.Name "operator")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+infixApplicationExpressionWithOperator :: Phantoms.TTerm Syntax.InfixApplicationExpression -> Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.InfixApplicationExpression
+infixApplicationExpressionWithOperator original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+              Core.projectionField = (Core.Name "lhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+infixApplicationExpressionWithRhs :: Phantoms.TTerm Syntax.InfixApplicationExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.InfixApplicationExpression
+infixApplicationExpressionWithRhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+              Core.projectionField = (Core.Name "lhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"),
+              Core.projectionField = (Core.Name "operator")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+infixType :: Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.InfixType
+infixType lhs operator rhs =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Phantoms.unTTerm lhs)},
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Phantoms.unTTerm operator)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm rhs)}]}))
+
+infixTypeLhs :: Phantoms.TTerm Syntax.InfixType -> Phantoms.TTerm Syntax.Type
+infixTypeLhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+        Core.projectionField = (Core.Name "lhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+infixTypeOperator :: Phantoms.TTerm Syntax.InfixType -> Phantoms.TTerm Syntax.Operator
+infixTypeOperator x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+        Core.projectionField = (Core.Name "operator")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+infixTypeRhs :: Phantoms.TTerm Syntax.InfixType -> Phantoms.TTerm Syntax.Operator
+infixTypeRhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+        Core.projectionField = (Core.Name "rhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+infixTypeWithLhs :: Phantoms.TTerm Syntax.InfixType -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.InfixType
+infixTypeWithLhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+              Core.projectionField = (Core.Name "operator")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+infixTypeWithOperator :: Phantoms.TTerm Syntax.InfixType -> Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.InfixType
+infixTypeWithOperator original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+              Core.projectionField = (Core.Name "lhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+infixTypeWithRhs :: Phantoms.TTerm Syntax.InfixType -> Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.InfixType
+infixTypeWithRhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+              Core.projectionField = (Core.Name "lhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.InfixType"),
+              Core.projectionField = (Core.Name "operator")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+lambdaExpression :: Phantoms.TTerm [Syntax.Pattern] -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.LambdaExpression
+lambdaExpression bindings inner =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.LambdaExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm bindings)},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm inner)}]}))
+
+lambdaExpressionBindings :: Phantoms.TTerm Syntax.LambdaExpression -> Phantoms.TTerm [Syntax.Pattern]
+lambdaExpressionBindings x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LambdaExpression"),
+        Core.projectionField = (Core.Name "bindings")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+lambdaExpressionInner :: Phantoms.TTerm Syntax.LambdaExpression -> Phantoms.TTerm Syntax.Expression
+lambdaExpressionInner x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LambdaExpression"),
+        Core.projectionField = (Core.Name "inner")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+lambdaExpressionWithBindings :: Phantoms.TTerm Syntax.LambdaExpression -> Phantoms.TTerm [Syntax.Pattern] -> Phantoms.TTerm Syntax.LambdaExpression
+lambdaExpressionWithBindings original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.LambdaExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LambdaExpression"),
+              Core.projectionField = (Core.Name "inner")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+lambdaExpressionWithInner :: Phantoms.TTerm Syntax.LambdaExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.LambdaExpression
+lambdaExpressionWithInner original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.LambdaExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LambdaExpression"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+letExpression :: Phantoms.TTerm [Syntax.LocalBinding] -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.LetExpression
+letExpression bindings inner =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.LetExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm bindings)},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm inner)}]}))
+
+letExpressionBindings :: Phantoms.TTerm Syntax.LetExpression -> Phantoms.TTerm [Syntax.LocalBinding]
+letExpressionBindings x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LetExpression"),
+        Core.projectionField = (Core.Name "bindings")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+letExpressionInner :: Phantoms.TTerm Syntax.LetExpression -> Phantoms.TTerm Syntax.Expression
+letExpressionInner x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LetExpression"),
+        Core.projectionField = (Core.Name "inner")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+letExpressionWithBindings :: Phantoms.TTerm Syntax.LetExpression -> Phantoms.TTerm [Syntax.LocalBinding] -> Phantoms.TTerm Syntax.LetExpression
+letExpressionWithBindings original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.LetExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LetExpression"),
+              Core.projectionField = (Core.Name "inner")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+letExpressionWithInner :: Phantoms.TTerm Syntax.LetExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.LetExpression
+letExpressionWithInner original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.LetExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LetExpression"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+literalChar :: Phantoms.TTerm Int -> Phantoms.TTerm Syntax.Literal
+literalChar x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "char"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalDouble :: Phantoms.TTerm Double -> Phantoms.TTerm Syntax.Literal
+literalDouble x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "double"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalFloat :: Phantoms.TTerm Float -> Phantoms.TTerm Syntax.Literal
+literalFloat x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalInt :: Phantoms.TTerm Int -> Phantoms.TTerm Syntax.Literal
+literalInt x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalInteger :: Phantoms.TTerm Integer -> Phantoms.TTerm Syntax.Literal
+literalInteger x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "integer"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+literalString :: Phantoms.TTerm String -> Phantoms.TTerm Syntax.Literal
+literalString x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Literal"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "string"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+localBindingSignature :: Phantoms.TTerm Syntax.TypeSignature -> Phantoms.TTerm Syntax.LocalBinding
+localBindingSignature x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LocalBinding"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "signature"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+localBindingValue :: Phantoms.TTerm Syntax.ValueBinding -> Phantoms.TTerm Syntax.LocalBinding
+localBindingValue x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.LocalBinding"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "value"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+localBindings :: Phantoms.TTerm [Syntax.LocalBinding] -> Phantoms.TTerm Syntax.LocalBindings
+localBindings x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ext.haskell.syntax.LocalBindings"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+module_ :: Phantoms.TTerm (Maybe Syntax.ModuleHead) -> Phantoms.TTerm [Syntax.Import] -> Phantoms.TTerm [Syntax.DeclarationWithComments] -> Phantoms.TTerm Syntax.Module
+module_ head imports declarations =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Phantoms.unTTerm head)},
+        Core.Field {
+          Core.fieldName = (Core.Name "imports"),
+          Core.fieldTerm = (Phantoms.unTTerm imports)},
+        Core.Field {
+          Core.fieldName = (Core.Name "declarations"),
+          Core.fieldTerm = (Phantoms.unTTerm declarations)}]}))
+
+moduleDeclarations :: Phantoms.TTerm Syntax.Module -> Phantoms.TTerm [Syntax.DeclarationWithComments]
+moduleDeclarations x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+        Core.projectionField = (Core.Name "declarations")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleHead :: Phantoms.TTerm Syntax.Module -> Phantoms.TTerm (Maybe Syntax.ModuleHead)
+moduleHead x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+        Core.projectionField = (Core.Name "head")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleHeadComments :: Phantoms.TTerm Syntax.ModuleHead -> Phantoms.TTerm (Maybe String)
+moduleHeadComments x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+        Core.projectionField = (Core.Name "comments")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleHeadExports :: Phantoms.TTerm Syntax.ModuleHead -> Phantoms.TTerm [Syntax.Export]
+moduleHeadExports x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+        Core.projectionField = (Core.Name "exports")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleHeadName :: Phantoms.TTerm Syntax.ModuleHead -> Phantoms.TTerm Syntax.ModuleName
+moduleHeadName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleHeadWithComments :: Phantoms.TTerm Syntax.ModuleHead -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Syntax.ModuleHead
+moduleHeadWithComments original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "exports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+              Core.projectionField = (Core.Name "exports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+moduleHeadWithExports :: Phantoms.TTerm Syntax.ModuleHead -> Phantoms.TTerm [Syntax.Export] -> Phantoms.TTerm Syntax.ModuleHead
+moduleHeadWithExports original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+              Core.projectionField = (Core.Name "comments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "exports"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+moduleHeadWithName :: Phantoms.TTerm Syntax.ModuleHead -> Phantoms.TTerm Syntax.ModuleName -> Phantoms.TTerm Syntax.ModuleHead
+moduleHeadWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+              Core.projectionField = (Core.Name "comments")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "exports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+              Core.projectionField = (Core.Name "exports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+moduleHead_ :: Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Syntax.ModuleName -> Phantoms.TTerm [Syntax.Export] -> Phantoms.TTerm Syntax.ModuleHead
+moduleHead_ comments name exports =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleHead"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "comments"),
+          Core.fieldTerm = (Phantoms.unTTerm comments)},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "exports"),
+          Core.fieldTerm = (Phantoms.unTTerm exports)}]}))
+
+moduleImports :: Phantoms.TTerm Syntax.Module -> Phantoms.TTerm [Syntax.Import]
+moduleImports x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+        Core.projectionField = (Core.Name "imports")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleName :: Phantoms.TTerm String -> Phantoms.TTerm Syntax.ModuleName
+moduleName x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ext.haskell.syntax.ModuleName"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+moduleWithDeclarations :: Phantoms.TTerm Syntax.Module -> Phantoms.TTerm [Syntax.DeclarationWithComments] -> Phantoms.TTerm Syntax.Module
+moduleWithDeclarations original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+              Core.projectionField = (Core.Name "head")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "imports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+              Core.projectionField = (Core.Name "imports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "declarations"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+moduleWithHead :: Phantoms.TTerm Syntax.Module -> Phantoms.TTerm (Maybe Syntax.ModuleHead) -> Phantoms.TTerm Syntax.Module
+moduleWithHead original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "imports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+              Core.projectionField = (Core.Name "imports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "declarations"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+              Core.projectionField = (Core.Name "declarations")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+moduleWithImports :: Phantoms.TTerm Syntax.Module -> Phantoms.TTerm [Syntax.Import] -> Phantoms.TTerm Syntax.Module
+moduleWithImports original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "head"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+              Core.projectionField = (Core.Name "head")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "imports"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "declarations"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Module"),
+              Core.projectionField = (Core.Name "declarations")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+nameImplicit :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm Syntax.Name
+nameImplicit x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Name"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "implicit"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+nameNormal :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm Syntax.Name
+nameNormal x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Name"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "normal"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+nameParens :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm Syntax.Name
+nameParens x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Name"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "parens"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+namePart :: Phantoms.TTerm String -> Phantoms.TTerm Syntax.NamePart
+namePart x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ext.haskell.syntax.NamePart"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+operatorBacktick :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm Syntax.Operator
+operatorBacktick x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Operator"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "backtick"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+operatorNormal :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm Syntax.Operator
+operatorNormal x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Operator"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "normal"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+ordinaryConstructor :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm [Syntax.Type] -> Phantoms.TTerm Syntax.OrdinaryConstructor
+ordinaryConstructor name fields =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.OrdinaryConstructor"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm fields)}]}))
+
+ordinaryConstructorFields :: Phantoms.TTerm Syntax.OrdinaryConstructor -> Phantoms.TTerm [Syntax.Type]
+ordinaryConstructorFields x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.OrdinaryConstructor"),
+        Core.projectionField = (Core.Name "fields")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+ordinaryConstructorName :: Phantoms.TTerm Syntax.OrdinaryConstructor -> Phantoms.TTerm Syntax.Name
+ordinaryConstructorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.OrdinaryConstructor"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+ordinaryConstructorWithFields :: Phantoms.TTerm Syntax.OrdinaryConstructor -> Phantoms.TTerm [Syntax.Type] -> Phantoms.TTerm Syntax.OrdinaryConstructor
+ordinaryConstructorWithFields original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.OrdinaryConstructor"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.OrdinaryConstructor"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+ordinaryConstructorWithName :: Phantoms.TTerm Syntax.OrdinaryConstructor -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.OrdinaryConstructor
+ordinaryConstructorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.OrdinaryConstructor"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.OrdinaryConstructor"),
+              Core.projectionField = (Core.Name "fields")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+patternApplication :: Phantoms.TTerm Syntax.ApplicationPattern -> Phantoms.TTerm Syntax.Pattern
+patternApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "application"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternAs :: Phantoms.TTerm Syntax.AsPattern -> Phantoms.TTerm Syntax.Pattern
+patternAs x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "as"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternField :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.PatternField
+patternField name pattern =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.PatternField"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Phantoms.unTTerm pattern)}]}))
+
+patternFieldName :: Phantoms.TTerm Syntax.PatternField -> Phantoms.TTerm Syntax.Name
+patternFieldName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.PatternField"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+patternFieldPattern :: Phantoms.TTerm Syntax.PatternField -> Phantoms.TTerm Syntax.Pattern
+patternFieldPattern x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.PatternField"),
+        Core.projectionField = (Core.Name "pattern")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+patternFieldWithName :: Phantoms.TTerm Syntax.PatternField -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.PatternField
+patternFieldWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.PatternField"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.PatternField"),
+              Core.projectionField = (Core.Name "pattern")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+patternFieldWithPattern :: Phantoms.TTerm Syntax.PatternField -> Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.PatternField
+patternFieldWithPattern original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.PatternField"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.PatternField"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+patternList :: Phantoms.TTerm [Syntax.Pattern] -> Phantoms.TTerm Syntax.Pattern
+patternList x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternLiteral :: Phantoms.TTerm Syntax.Literal -> Phantoms.TTerm Syntax.Pattern
+patternLiteral x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "literal"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternName :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Pattern
+patternName x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "name"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternParens :: Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.Pattern
+patternParens x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "parens"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternRecord :: Phantoms.TTerm Syntax.RecordPattern -> Phantoms.TTerm Syntax.Pattern
+patternRecord x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "record"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternTuple :: Phantoms.TTerm [Syntax.Pattern] -> Phantoms.TTerm Syntax.Pattern
+patternTuple x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "tuple"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternTyped :: Phantoms.TTerm Syntax.TypedPattern -> Phantoms.TTerm Syntax.Pattern
+patternTyped x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typed"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternWildcard :: Phantoms.TTerm Syntax.Pattern
+patternWildcard =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wildcard"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+prefixApplicationExpression :: Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.PrefixApplicationExpression
+prefixApplicationExpression operator rhs =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.PrefixApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Phantoms.unTTerm operator)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm rhs)}]}))
+
+prefixApplicationExpressionOperator :: Phantoms.TTerm Syntax.PrefixApplicationExpression -> Phantoms.TTerm Syntax.Operator
+prefixApplicationExpressionOperator x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.PrefixApplicationExpression"),
+        Core.projectionField = (Core.Name "operator")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+prefixApplicationExpressionRhs :: Phantoms.TTerm Syntax.PrefixApplicationExpression -> Phantoms.TTerm Syntax.Expression
+prefixApplicationExpressionRhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.PrefixApplicationExpression"),
+        Core.projectionField = (Core.Name "rhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+prefixApplicationExpressionWithOperator :: Phantoms.TTerm Syntax.PrefixApplicationExpression -> Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.PrefixApplicationExpression
+prefixApplicationExpressionWithOperator original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.PrefixApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.PrefixApplicationExpression"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+prefixApplicationExpressionWithRhs :: Phantoms.TTerm Syntax.PrefixApplicationExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.PrefixApplicationExpression
+prefixApplicationExpressionWithRhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.PrefixApplicationExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.PrefixApplicationExpression"),
+              Core.projectionField = (Core.Name "operator")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+qualifiedName :: Phantoms.TTerm [Syntax.NamePart] -> Phantoms.TTerm Syntax.NamePart -> Phantoms.TTerm Syntax.QualifiedName
+qualifiedName qualifiers unqualified =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.QualifiedName"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "qualifiers"),
+          Core.fieldTerm = (Phantoms.unTTerm qualifiers)},
+        Core.Field {
+          Core.fieldName = (Core.Name "unqualified"),
+          Core.fieldTerm = (Phantoms.unTTerm unqualified)}]}))
+
+qualifiedNameQualifiers :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm [Syntax.NamePart]
+qualifiedNameQualifiers x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.QualifiedName"),
+        Core.projectionField = (Core.Name "qualifiers")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+qualifiedNameUnqualified :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm Syntax.NamePart
+qualifiedNameUnqualified x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.QualifiedName"),
+        Core.projectionField = (Core.Name "unqualified")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+qualifiedNameWithQualifiers :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm [Syntax.NamePart] -> Phantoms.TTerm Syntax.QualifiedName
+qualifiedNameWithQualifiers original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.QualifiedName"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "qualifiers"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "unqualified"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.QualifiedName"),
+              Core.projectionField = (Core.Name "unqualified")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+qualifiedNameWithUnqualified :: Phantoms.TTerm Syntax.QualifiedName -> Phantoms.TTerm Syntax.NamePart -> Phantoms.TTerm Syntax.QualifiedName
+qualifiedNameWithUnqualified original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.QualifiedName"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "qualifiers"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.QualifiedName"),
+              Core.projectionField = (Core.Name "qualifiers")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "unqualified"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+recordConstructor :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm [Syntax.FieldWithComments] -> Phantoms.TTerm Syntax.RecordConstructor
+recordConstructor name fields =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordConstructor"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm fields)}]}))
+
+recordConstructorFields :: Phantoms.TTerm Syntax.RecordConstructor -> Phantoms.TTerm [Syntax.FieldWithComments]
+recordConstructorFields x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordConstructor"),
+        Core.projectionField = (Core.Name "fields")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+recordConstructorName :: Phantoms.TTerm Syntax.RecordConstructor -> Phantoms.TTerm Syntax.Name
+recordConstructorName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordConstructor"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+recordConstructorWithFields :: Phantoms.TTerm Syntax.RecordConstructor -> Phantoms.TTerm [Syntax.FieldWithComments] -> Phantoms.TTerm Syntax.RecordConstructor
+recordConstructorWithFields original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordConstructor"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordConstructor"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+recordConstructorWithName :: Phantoms.TTerm Syntax.RecordConstructor -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.RecordConstructor
+recordConstructorWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordConstructor"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordConstructor"),
+              Core.projectionField = (Core.Name "fields")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+recordPattern :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm [Syntax.PatternField] -> Phantoms.TTerm Syntax.RecordPattern
+recordPattern name fields =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm fields)}]}))
+
+recordPatternFields :: Phantoms.TTerm Syntax.RecordPattern -> Phantoms.TTerm [Syntax.PatternField]
+recordPatternFields x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordPattern"),
+        Core.projectionField = (Core.Name "fields")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+recordPatternName :: Phantoms.TTerm Syntax.RecordPattern -> Phantoms.TTerm Syntax.Name
+recordPatternName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordPattern"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+recordPatternWithFields :: Phantoms.TTerm Syntax.RecordPattern -> Phantoms.TTerm [Syntax.PatternField] -> Phantoms.TTerm Syntax.RecordPattern
+recordPatternWithFields original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordPattern"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+recordPatternWithName :: Phantoms.TTerm Syntax.RecordPattern -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.RecordPattern
+recordPatternWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.RecordPattern"),
+              Core.projectionField = (Core.Name "fields")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+rightHandSide :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.RightHandSide
+rightHandSide x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ext.haskell.syntax.RightHandSide"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+sectionExpression :: Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.SectionExpression
+sectionExpression operator expression =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.SectionExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Phantoms.unTTerm operator)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expression"),
+          Core.fieldTerm = (Phantoms.unTTerm expression)}]}))
+
+sectionExpressionExpression :: Phantoms.TTerm Syntax.SectionExpression -> Phantoms.TTerm Syntax.Expression
+sectionExpressionExpression x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SectionExpression"),
+        Core.projectionField = (Core.Name "expression")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+sectionExpressionOperator :: Phantoms.TTerm Syntax.SectionExpression -> Phantoms.TTerm Syntax.Operator
+sectionExpressionOperator x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SectionExpression"),
+        Core.projectionField = (Core.Name "operator")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+sectionExpressionWithExpression :: Phantoms.TTerm Syntax.SectionExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.SectionExpression
+sectionExpressionWithExpression original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.SectionExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SectionExpression"),
+              Core.projectionField = (Core.Name "operator")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expression"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+sectionExpressionWithOperator :: Phantoms.TTerm Syntax.SectionExpression -> Phantoms.TTerm Syntax.Operator -> Phantoms.TTerm Syntax.SectionExpression
+sectionExpressionWithOperator original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.SectionExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "operator"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expression"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SectionExpression"),
+              Core.projectionField = (Core.Name "expression")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+simpleValueBinding :: Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.RightHandSide -> Phantoms.TTerm (Maybe Syntax.LocalBindings) -> Phantoms.TTerm Syntax.SimpleValueBinding
+simpleValueBinding pattern rhs localBindings =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Phantoms.unTTerm pattern)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm rhs)},
+        Core.Field {
+          Core.fieldName = (Core.Name "localBindings"),
+          Core.fieldTerm = (Phantoms.unTTerm localBindings)}]}))
+
+simpleValueBindingLocalBindings :: Phantoms.TTerm Syntax.SimpleValueBinding -> Phantoms.TTerm (Maybe Syntax.LocalBindings)
+simpleValueBindingLocalBindings x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+        Core.projectionField = (Core.Name "localBindings")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+simpleValueBindingPattern :: Phantoms.TTerm Syntax.SimpleValueBinding -> Phantoms.TTerm Syntax.Pattern
+simpleValueBindingPattern x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+        Core.projectionField = (Core.Name "pattern")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+simpleValueBindingRhs :: Phantoms.TTerm Syntax.SimpleValueBinding -> Phantoms.TTerm Syntax.RightHandSide
+simpleValueBindingRhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+        Core.projectionField = (Core.Name "rhs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+simpleValueBindingWithLocalBindings :: Phantoms.TTerm Syntax.SimpleValueBinding -> Phantoms.TTerm (Maybe Syntax.LocalBindings) -> Phantoms.TTerm Syntax.SimpleValueBinding
+simpleValueBindingWithLocalBindings original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+              Core.projectionField = (Core.Name "pattern")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "localBindings"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+simpleValueBindingWithPattern :: Phantoms.TTerm Syntax.SimpleValueBinding -> Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.SimpleValueBinding
+simpleValueBindingWithPattern original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+              Core.projectionField = (Core.Name "rhs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "localBindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+              Core.projectionField = (Core.Name "localBindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+simpleValueBindingWithRhs :: Phantoms.TTerm Syntax.SimpleValueBinding -> Phantoms.TTerm Syntax.RightHandSide -> Phantoms.TTerm Syntax.SimpleValueBinding
+simpleValueBindingWithRhs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "pattern"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+              Core.projectionField = (Core.Name "pattern")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "localBindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"),
+              Core.projectionField = (Core.Name "localBindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+specImportHiding :: Phantoms.TTerm [Syntax.ImportExportSpec] -> Phantoms.TTerm Syntax.SpecImport
+specImportHiding x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SpecImport"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "hiding"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+specImportList :: Phantoms.TTerm [Syntax.ImportExportSpec] -> Phantoms.TTerm Syntax.SpecImport
+specImportList x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SpecImport"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+statement :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.Statement
+statement x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ext.haskell.syntax.Statement"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+subspecImportExportSpecAll :: Phantoms.TTerm Syntax.SubspecImportExportSpec
+subspecImportExportSpecAll =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SubspecImportExportSpec"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "all"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subspecImportExportSpecList :: Phantoms.TTerm [Syntax.Name] -> Phantoms.TTerm Syntax.SubspecImportExportSpec
+subspecImportExportSpecList x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.SubspecImportExportSpec"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeApplication :: Phantoms.TTerm Syntax.ApplicationType -> Phantoms.TTerm Syntax.Type
+typeApplication x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "application"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeCtx :: Phantoms.TTerm Syntax.ContextType -> Phantoms.TTerm Syntax.Type
+typeCtx x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "ctx"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeDeclaration :: Phantoms.TTerm Syntax.DeclarationHead -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.TypeDeclaration
+typeDeclaration name type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+typeDeclarationName :: Phantoms.TTerm Syntax.TypeDeclaration -> Phantoms.TTerm Syntax.DeclarationHead
+typeDeclarationName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeDeclaration"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeDeclarationType :: Phantoms.TTerm Syntax.TypeDeclaration -> Phantoms.TTerm Syntax.Type
+typeDeclarationType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeDeclaration"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeDeclarationWithName :: Phantoms.TTerm Syntax.TypeDeclaration -> Phantoms.TTerm Syntax.DeclarationHead -> Phantoms.TTerm Syntax.TypeDeclaration
+typeDeclarationWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeDeclaration"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeDeclarationWithType :: Phantoms.TTerm Syntax.TypeDeclaration -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.TypeDeclaration
+typeDeclarationWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeDeclaration"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeDeclaration"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeFunction :: Phantoms.TTerm Syntax.FunctionType -> Phantoms.TTerm Syntax.Type
+typeFunction x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "function"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeInfix :: Phantoms.TTerm Syntax.InfixType -> Phantoms.TTerm Syntax.Type
+typeInfix x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "infix"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeList :: Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.Type
+typeList x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeParens :: Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.Type
+typeParens x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "parens"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeSignature :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.TypeSignature
+typeSignature name type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignature"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+typeSignatureExpression :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.TypeSignatureExpression
+typeSignatureExpression inner type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignatureExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm inner)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+typeSignatureExpressionInner :: Phantoms.TTerm Syntax.TypeSignatureExpression -> Phantoms.TTerm Syntax.Expression
+typeSignatureExpressionInner x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignatureExpression"),
+        Core.projectionField = (Core.Name "inner")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeSignatureExpressionType :: Phantoms.TTerm Syntax.TypeSignatureExpression -> Phantoms.TTerm Syntax.Type
+typeSignatureExpressionType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignatureExpression"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeSignatureExpressionWithInner :: Phantoms.TTerm Syntax.TypeSignatureExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.TypeSignatureExpression
+typeSignatureExpressionWithInner original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignatureExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignatureExpression"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeSignatureExpressionWithType :: Phantoms.TTerm Syntax.TypeSignatureExpression -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.TypeSignatureExpression
+typeSignatureExpressionWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignatureExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignatureExpression"),
+              Core.projectionField = (Core.Name "inner")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeSignatureName :: Phantoms.TTerm Syntax.TypeSignature -> Phantoms.TTerm Syntax.Name
+typeSignatureName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignature"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeSignatureType :: Phantoms.TTerm Syntax.TypeSignature -> Phantoms.TTerm Syntax.Type
+typeSignatureType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignature"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeSignatureWithName :: Phantoms.TTerm Syntax.TypeSignature -> Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.TypeSignature
+typeSignatureWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignature"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignature"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeSignatureWithType :: Phantoms.TTerm Syntax.TypeSignature -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.TypeSignature
+typeSignatureWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignature"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypeSignature"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeTuple :: Phantoms.TTerm [Syntax.Type] -> Phantoms.TTerm Syntax.Type
+typeTuple x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "tuple"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typeVariable :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Type
+typeVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.Type"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "variable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+typedBinding :: Phantoms.TTerm Syntax.TypeSignature -> Phantoms.TTerm Syntax.ValueBinding -> Phantoms.TTerm Syntax.TypedBinding
+typedBinding typeSignature valueBinding =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedBinding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeSignature"),
+          Core.fieldTerm = (Phantoms.unTTerm typeSignature)},
+        Core.Field {
+          Core.fieldName = (Core.Name "valueBinding"),
+          Core.fieldTerm = (Phantoms.unTTerm valueBinding)}]}))
+
+typedBindingTypeSignature :: Phantoms.TTerm Syntax.TypedBinding -> Phantoms.TTerm Syntax.TypeSignature
+typedBindingTypeSignature x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedBinding"),
+        Core.projectionField = (Core.Name "typeSignature")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typedBindingValueBinding :: Phantoms.TTerm Syntax.TypedBinding -> Phantoms.TTerm Syntax.ValueBinding
+typedBindingValueBinding x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedBinding"),
+        Core.projectionField = (Core.Name "valueBinding")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typedBindingWithTypeSignature :: Phantoms.TTerm Syntax.TypedBinding -> Phantoms.TTerm Syntax.TypeSignature -> Phantoms.TTerm Syntax.TypedBinding
+typedBindingWithTypeSignature original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedBinding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeSignature"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "valueBinding"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedBinding"),
+              Core.projectionField = (Core.Name "valueBinding")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typedBindingWithValueBinding :: Phantoms.TTerm Syntax.TypedBinding -> Phantoms.TTerm Syntax.ValueBinding -> Phantoms.TTerm Syntax.TypedBinding
+typedBindingWithValueBinding original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedBinding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeSignature"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedBinding"),
+              Core.projectionField = (Core.Name "typeSignature")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "valueBinding"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typedPattern :: Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.TypedPattern
+typedPattern inner type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm inner)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+typedPatternInner :: Phantoms.TTerm Syntax.TypedPattern -> Phantoms.TTerm Syntax.Pattern
+typedPatternInner x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedPattern"),
+        Core.projectionField = (Core.Name "inner")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typedPatternType :: Phantoms.TTerm Syntax.TypedPattern -> Phantoms.TTerm Syntax.Type
+typedPatternType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedPattern"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typedPatternWithInner :: Phantoms.TTerm Syntax.TypedPattern -> Phantoms.TTerm Syntax.Pattern -> Phantoms.TTerm Syntax.TypedPattern
+typedPatternWithInner original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedPattern"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typedPatternWithType :: Phantoms.TTerm Syntax.TypedPattern -> Phantoms.TTerm Syntax.Type -> Phantoms.TTerm Syntax.TypedPattern
+typedPatternWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.TypedPattern"),
+              Core.projectionField = (Core.Name "inner")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unCaseRhs :: Phantoms.TTerm Syntax.CaseRhs -> Phantoms.TTerm Syntax.Expression
+unCaseRhs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ext.haskell.syntax.CaseRhs")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unDeriving :: Phantoms.TTerm Syntax.Deriving -> Phantoms.TTerm [Syntax.Name]
+unDeriving x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ext.haskell.syntax.Deriving")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unLocalBindings :: Phantoms.TTerm Syntax.LocalBindings -> Phantoms.TTerm [Syntax.LocalBinding]
+unLocalBindings x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ext.haskell.syntax.LocalBindings")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unModuleName :: Phantoms.TTerm Syntax.ModuleName -> Phantoms.TTerm String
+unModuleName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ext.haskell.syntax.ModuleName")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unNamePart :: Phantoms.TTerm Syntax.NamePart -> Phantoms.TTerm String
+unNamePart x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ext.haskell.syntax.NamePart")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unRightHandSide :: Phantoms.TTerm Syntax.RightHandSide -> Phantoms.TTerm Syntax.Expression
+unRightHandSide x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ext.haskell.syntax.RightHandSide")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unStatement :: Phantoms.TTerm Syntax.Statement -> Phantoms.TTerm Syntax.Expression
+unStatement x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ext.haskell.syntax.Statement")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unVariable :: Phantoms.TTerm Syntax.Variable -> Phantoms.TTerm Syntax.Name
+unVariable x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ext.haskell.syntax.Variable")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+updateRecordExpression :: Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm [Syntax.FieldUpdate] -> Phantoms.TTerm Syntax.UpdateRecordExpression
+updateRecordExpression inner fields =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.UpdateRecordExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm inner)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm fields)}]}))
+
+updateRecordExpressionFields :: Phantoms.TTerm Syntax.UpdateRecordExpression -> Phantoms.TTerm [Syntax.FieldUpdate]
+updateRecordExpressionFields x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.UpdateRecordExpression"),
+        Core.projectionField = (Core.Name "fields")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+updateRecordExpressionInner :: Phantoms.TTerm Syntax.UpdateRecordExpression -> Phantoms.TTerm Syntax.Expression
+updateRecordExpressionInner x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.UpdateRecordExpression"),
+        Core.projectionField = (Core.Name "inner")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+updateRecordExpressionWithFields :: Phantoms.TTerm Syntax.UpdateRecordExpression -> Phantoms.TTerm [Syntax.FieldUpdate] -> Phantoms.TTerm Syntax.UpdateRecordExpression
+updateRecordExpressionWithFields original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.UpdateRecordExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.UpdateRecordExpression"),
+              Core.projectionField = (Core.Name "inner")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+updateRecordExpressionWithInner :: Phantoms.TTerm Syntax.UpdateRecordExpression -> Phantoms.TTerm Syntax.Expression -> Phantoms.TTerm Syntax.UpdateRecordExpression
+updateRecordExpressionWithInner original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ext.haskell.syntax.UpdateRecordExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "inner"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.ext.haskell.syntax.UpdateRecordExpression"),
+              Core.projectionField = (Core.Name "fields")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+valueBindingSimple :: Phantoms.TTerm Syntax.SimpleValueBinding -> Phantoms.TTerm Syntax.ValueBinding
+valueBindingSimple x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.haskell.syntax.ValueBinding"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "simple"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+variable :: Phantoms.TTerm Syntax.Name -> Phantoms.TTerm Syntax.Variable
+variable x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ext.haskell.syntax.Variable"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Ext/Org/Yaml/Model.hs b/src/gen-main/haskell/Hydra/Dsl/Ext/Org/Yaml/Model.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Ext/Org/Yaml/Model.hs
@@ -0,0 +1,79 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.ext.org.yaml.model
+
+module Hydra.Dsl.Ext.Org.Yaml.Model where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Ext.Org.Yaml.Model as Model
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+nodeMapping :: Phantoms.TTerm (M.Map Model.Node Model.Node) -> Phantoms.TTerm Model.Node
+nodeMapping x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.org.yaml.model.Node"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "mapping"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+nodeScalar :: Phantoms.TTerm Model.Scalar -> Phantoms.TTerm Model.Node
+nodeScalar x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.org.yaml.model.Node"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "scalar"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+nodeSequence :: Phantoms.TTerm [Model.Node] -> Phantoms.TTerm Model.Node
+nodeSequence x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.org.yaml.model.Node"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "sequence"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+scalarBool :: Phantoms.TTerm Bool -> Phantoms.TTerm Model.Scalar
+scalarBool x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.org.yaml.model.Scalar"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "bool"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+scalarFloat :: Phantoms.TTerm Double -> Phantoms.TTerm Model.Scalar
+scalarFloat x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.org.yaml.model.Scalar"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+scalarInt :: Phantoms.TTerm Integer -> Phantoms.TTerm Model.Scalar
+scalarInt x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.org.yaml.model.Scalar"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "int"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+scalarNull :: Phantoms.TTerm Model.Scalar
+scalarNull =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.org.yaml.model.Scalar"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "null"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+scalarStr :: Phantoms.TTerm String -> Phantoms.TTerm Model.Scalar
+scalarStr x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.ext.org.yaml.model.Scalar"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "str"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Graph.hs b/src/gen-main/haskell/Hydra/Dsl/Graph.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Graph.hs
@@ -0,0 +1,791 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.graph
+
+module Hydra.Dsl.Graph where
+
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+graph :: Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm (M.Map Core.Name Core.TypeScheme) -> Phantoms.TTerm (M.Map Core.Name Core.TypeVariableMetadata) -> Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm (M.Map Core.Name Graph.Primitive) -> Phantoms.TTerm (M.Map Core.Name Core.TypeScheme) -> Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Graph.Graph
+graph boundTerms boundTypes classConstraints lambdaVariables metadata primitives schemaTypes typeVariables =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Phantoms.unTTerm boundTerms)},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm boundTypes)},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Phantoms.unTTerm classConstraints)},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Phantoms.unTTerm lambdaVariables)},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Phantoms.unTTerm metadata)},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Phantoms.unTTerm primitives)},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm schemaTypes)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Phantoms.unTTerm typeVariables)}]}))
+
+graphBoundTerms :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.Term)
+graphBoundTerms x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+        Core.projectionField = (Core.Name "boundTerms")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphBoundTypes :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.TypeScheme)
+graphBoundTypes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+        Core.projectionField = (Core.Name "boundTypes")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphClassConstraints :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.TypeVariableMetadata)
+graphClassConstraints x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+        Core.projectionField = (Core.Name "classConstraints")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphLambdaVariables :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (S.Set Core.Name)
+graphLambdaVariables x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+        Core.projectionField = (Core.Name "lambdaVariables")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphMetadata :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.Term)
+graphMetadata x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+        Core.projectionField = (Core.Name "metadata")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphPrimitives :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Graph.Primitive)
+graphPrimitives x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+        Core.projectionField = (Core.Name "primitives")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphSchemaTypes :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.TypeScheme)
+graphSchemaTypes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+        Core.projectionField = (Core.Name "schemaTypes")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphTypeVariables :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (S.Set Core.Name)
+graphTypeVariables x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+        Core.projectionField = (Core.Name "typeVariables")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphWithBoundTerms :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Graph.Graph
+graphWithBoundTerms original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "lambdaVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "metadata")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "typeVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphWithBoundTypes :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.TypeScheme) -> Phantoms.TTerm Graph.Graph
+graphWithBoundTypes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTerms")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "lambdaVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "metadata")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "typeVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphWithClassConstraints :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.TypeVariableMetadata) -> Phantoms.TTerm Graph.Graph
+graphWithClassConstraints original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTerms")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "lambdaVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "metadata")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "typeVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphWithLambdaVariables :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Graph.Graph
+graphWithLambdaVariables original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTerms")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "metadata")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "typeVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphWithMetadata :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Graph.Graph
+graphWithMetadata original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTerms")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "lambdaVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "typeVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphWithPrimitives :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Graph.Primitive) -> Phantoms.TTerm Graph.Graph
+graphWithPrimitives original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTerms")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "lambdaVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "metadata")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "typeVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphWithSchemaTypes :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (M.Map Core.Name Core.TypeScheme) -> Phantoms.TTerm Graph.Graph
+graphWithSchemaTypes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTerms")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "lambdaVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "metadata")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "typeVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphWithTypeVariables :: Phantoms.TTerm Graph.Graph -> Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Graph.Graph
+graphWithTypeVariables original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Graph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTerms"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTerms")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "boundTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "boundTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lambdaVariables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "lambdaVariables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "metadata"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "metadata")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Graph"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeVariables"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+primitive :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm (Context.Context -> Graph.Graph -> [Core.Term] -> Either (Context.InContext Errors.Error) Core.Term) -> Phantoms.TTerm Graph.Primitive
+primitive name type_ implementation =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Primitive"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "implementation"),
+          Core.fieldTerm = (Phantoms.unTTerm implementation)}]}))
+
+primitiveImplementation :: Phantoms.TTerm Graph.Primitive -> Phantoms.TTerm (Context.Context -> Graph.Graph -> [Core.Term] -> Either (Context.InContext Errors.Error) Core.Term)
+primitiveImplementation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+        Core.projectionField = (Core.Name "implementation")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+primitiveName :: Phantoms.TTerm Graph.Primitive -> Phantoms.TTerm Core.Name
+primitiveName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+primitiveType :: Phantoms.TTerm Graph.Primitive -> Phantoms.TTerm Core.TypeScheme
+primitiveType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+primitiveWithImplementation :: Phantoms.TTerm Graph.Primitive -> Phantoms.TTerm (Context.Context -> Graph.Graph -> [Core.Term] -> Either (Context.InContext Errors.Error) Core.Term) -> Phantoms.TTerm Graph.Primitive
+primitiveWithImplementation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Primitive"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "implementation"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+primitiveWithName :: Phantoms.TTerm Graph.Primitive -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Graph.Primitive
+primitiveWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Primitive"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "implementation"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+              Core.projectionField = (Core.Name "implementation")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+primitiveWithType :: Phantoms.TTerm Graph.Primitive -> Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm Graph.Primitive
+primitiveWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.Primitive"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "implementation"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.Primitive"),
+              Core.projectionField = (Core.Name "implementation")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termCoder :: Phantoms.TTerm Core.Type -> Phantoms.TTerm (Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) a) -> Phantoms.TTerm (Context.Context -> a -> Either (Context.InContext Errors.Error) Core.Term) -> Phantoms.TTerm (Graph.TermCoder a)
+termCoder type_ encode decode =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.TermCoder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Phantoms.unTTerm encode)},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Phantoms.unTTerm decode)}]}))
+
+termCoderDecode :: Phantoms.TTerm (Graph.TermCoder a) -> Phantoms.TTerm (Context.Context -> a -> Either (Context.InContext Errors.Error) Core.Term)
+termCoderDecode x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+        Core.projectionField = (Core.Name "decode")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+termCoderEncode :: Phantoms.TTerm (Graph.TermCoder a) -> Phantoms.TTerm (Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) a)
+termCoderEncode x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+        Core.projectionField = (Core.Name "encode")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+termCoderType :: Phantoms.TTerm (Graph.TermCoder a) -> Phantoms.TTerm Core.Type
+termCoderType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+termCoderWithDecode :: Phantoms.TTerm (Graph.TermCoder a) -> Phantoms.TTerm (Context.Context -> a -> Either (Context.InContext Errors.Error) Core.Term) -> Phantoms.TTerm (Graph.TermCoder a)
+termCoderWithDecode original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.TermCoder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+              Core.projectionField = (Core.Name "encode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+termCoderWithEncode :: Phantoms.TTerm (Graph.TermCoder a) -> Phantoms.TTerm (Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) a) -> Phantoms.TTerm (Graph.TermCoder a)
+termCoderWithEncode original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.TermCoder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+              Core.projectionField = (Core.Name "decode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termCoderWithType :: Phantoms.TTerm (Graph.TermCoder a) -> Phantoms.TTerm Core.Type -> Phantoms.TTerm (Graph.TermCoder a)
+termCoderWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.graph.TermCoder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+              Core.projectionField = (Core.Name "encode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.graph.TermCoder"),
+              Core.projectionField = (Core.Name "decode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Json/Model.hs b/src/gen-main/haskell/Hydra/Dsl/Json/Model.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Json/Model.hs
@@ -0,0 +1,63 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.json.model
+
+module Hydra.Dsl.Json.Model where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Json.Model as Model
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+valueArray :: Phantoms.TTerm [Model.Value] -> Phantoms.TTerm Model.Value
+valueArray x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "array"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+valueBoolean :: Phantoms.TTerm Bool -> Phantoms.TTerm Model.Value
+valueBoolean x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "boolean"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+valueNull :: Phantoms.TTerm Model.Value
+valueNull =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "null"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+valueNumber :: Phantoms.TTerm Double -> Phantoms.TTerm Model.Value
+valueNumber x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "number"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+valueObject :: Phantoms.TTerm (M.Map String Model.Value) -> Phantoms.TTerm Model.Value
+valueObject x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "object"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+valueString :: Phantoms.TTerm String -> Phantoms.TTerm Model.Value
+valueString x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "string"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Module.hs b/src/gen-main/haskell/Hydra/Dsl/Module.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Module.hs
@@ -0,0 +1,698 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.module
+
+module Hydra.Dsl.Module where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Module as Module
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+definitionTerm :: Phantoms.TTerm Module.TermDefinition -> Phantoms.TTerm Module.Definition
+definitionTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "term"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+definitionType :: Phantoms.TTerm Module.TypeDefinition -> Phantoms.TTerm Module.Definition
+definitionType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "type"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+fileExtension :: Phantoms.TTerm String -> Phantoms.TTerm Module.FileExtension
+fileExtension x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.module.FileExtension"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+library :: Phantoms.TTerm Module.Namespace -> Phantoms.TTerm String -> Phantoms.TTerm [Graph.Primitive] -> Phantoms.TTerm Module.Library
+library namespace prefix primitives =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Library"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm namespace)},
+        Core.Field {
+          Core.fieldName = (Core.Name "prefix"),
+          Core.fieldTerm = (Phantoms.unTTerm prefix)},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Phantoms.unTTerm primitives)}]}))
+
+libraryNamespace :: Phantoms.TTerm Module.Library -> Phantoms.TTerm Module.Namespace
+libraryNamespace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+        Core.projectionField = (Core.Name "namespace")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+libraryPrefix :: Phantoms.TTerm Module.Library -> Phantoms.TTerm String
+libraryPrefix x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+        Core.projectionField = (Core.Name "prefix")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+libraryPrimitives :: Phantoms.TTerm Module.Library -> Phantoms.TTerm [Graph.Primitive]
+libraryPrimitives x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+        Core.projectionField = (Core.Name "primitives")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+libraryWithNamespace :: Phantoms.TTerm Module.Library -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Module.Library
+libraryWithNamespace original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Library"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "prefix"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+              Core.projectionField = (Core.Name "prefix")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+libraryWithPrefix :: Phantoms.TTerm Module.Library -> Phantoms.TTerm String -> Phantoms.TTerm Module.Library
+libraryWithPrefix original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Library"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "prefix"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+              Core.projectionField = (Core.Name "primitives")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+libraryWithPrimitives :: Phantoms.TTerm Module.Library -> Phantoms.TTerm [Graph.Primitive] -> Phantoms.TTerm Module.Library
+libraryWithPrimitives original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Library"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "prefix"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Library"),
+              Core.projectionField = (Core.Name "prefix")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primitives"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+module_ :: Phantoms.TTerm Module.Namespace -> Phantoms.TTerm [Module.Definition] -> Phantoms.TTerm [Module.Namespace] -> Phantoms.TTerm [Module.Namespace] -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Module.Module
+module_ namespace definitions termDependencies typeDependencies description =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm namespace)},
+        Core.Field {
+          Core.fieldName = (Core.Name "definitions"),
+          Core.fieldTerm = (Phantoms.unTTerm definitions)},
+        Core.Field {
+          Core.fieldName = (Core.Name "termDependencies"),
+          Core.fieldTerm = (Phantoms.unTTerm termDependencies)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeDependencies"),
+          Core.fieldTerm = (Phantoms.unTTerm typeDependencies)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm description)}]}))
+
+moduleDefinitions :: Phantoms.TTerm Module.Module -> Phantoms.TTerm [Module.Definition]
+moduleDefinitions x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+        Core.projectionField = (Core.Name "definitions")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleDescription :: Phantoms.TTerm Module.Module -> Phantoms.TTerm (Maybe String)
+moduleDescription x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+        Core.projectionField = (Core.Name "description")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleNamespace :: Phantoms.TTerm Module.Module -> Phantoms.TTerm Module.Namespace
+moduleNamespace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+        Core.projectionField = (Core.Name "namespace")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleTermDependencies :: Phantoms.TTerm Module.Module -> Phantoms.TTerm [Module.Namespace]
+moduleTermDependencies x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+        Core.projectionField = (Core.Name "termDependencies")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleTypeDependencies :: Phantoms.TTerm Module.Module -> Phantoms.TTerm [Module.Namespace]
+moduleTypeDependencies x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+        Core.projectionField = (Core.Name "typeDependencies")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+moduleWithDefinitions :: Phantoms.TTerm Module.Module -> Phantoms.TTerm [Module.Definition] -> Phantoms.TTerm Module.Module
+moduleWithDefinitions original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "definitions"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "termDependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "termDependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeDependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "typeDependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+moduleWithDescription :: Phantoms.TTerm Module.Module -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Module.Module
+moduleWithDescription original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "definitions"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "definitions")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termDependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "termDependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeDependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "typeDependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+moduleWithNamespace :: Phantoms.TTerm Module.Module -> Phantoms.TTerm Module.Namespace -> Phantoms.TTerm Module.Module
+moduleWithNamespace original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "definitions"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "definitions")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termDependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "termDependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeDependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "typeDependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+moduleWithTermDependencies :: Phantoms.TTerm Module.Module -> Phantoms.TTerm [Module.Namespace] -> Phantoms.TTerm Module.Module
+moduleWithTermDependencies original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "definitions"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "definitions")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termDependencies"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeDependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "typeDependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+moduleWithTypeDependencies :: Phantoms.TTerm Module.Module -> Phantoms.TTerm [Module.Namespace] -> Phantoms.TTerm Module.Module
+moduleWithTypeDependencies original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "definitions"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "definitions")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termDependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "termDependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeDependencies"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+namespace :: Phantoms.TTerm String -> Phantoms.TTerm Module.Namespace
+namespace x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.module.Namespace"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+namespaces :: Phantoms.TTerm (Module.Namespace, n) -> Phantoms.TTerm (M.Map Module.Namespace n) -> Phantoms.TTerm (Module.Namespaces n)
+namespaces focus mapping =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Namespaces"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "focus"),
+          Core.fieldTerm = (Phantoms.unTTerm focus)},
+        Core.Field {
+          Core.fieldName = (Core.Name "mapping"),
+          Core.fieldTerm = (Phantoms.unTTerm mapping)}]}))
+
+namespacesFocus :: Phantoms.TTerm (Module.Namespaces n) -> Phantoms.TTerm (Module.Namespace, n)
+namespacesFocus x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Namespaces"),
+        Core.projectionField = (Core.Name "focus")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+namespacesMapping :: Phantoms.TTerm (Module.Namespaces n) -> Phantoms.TTerm (M.Map Module.Namespace n)
+namespacesMapping x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.Namespaces"),
+        Core.projectionField = (Core.Name "mapping")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+namespacesWithFocus :: Phantoms.TTerm (Module.Namespaces n) -> Phantoms.TTerm (Module.Namespace, n) -> Phantoms.TTerm (Module.Namespaces n)
+namespacesWithFocus original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Namespaces"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "focus"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "mapping"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Namespaces"),
+              Core.projectionField = (Core.Name "mapping")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+namespacesWithMapping :: Phantoms.TTerm (Module.Namespaces n) -> Phantoms.TTerm (M.Map Module.Namespace n) -> Phantoms.TTerm (Module.Namespaces n)
+namespacesWithMapping original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Namespaces"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "focus"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.Namespaces"),
+              Core.projectionField = (Core.Name "focus")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "mapping"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+qualifiedName :: Phantoms.TTerm (Maybe Module.Namespace) -> Phantoms.TTerm String -> Phantoms.TTerm Module.QualifiedName
+qualifiedName namespace local =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.QualifiedName"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm namespace)},
+        Core.Field {
+          Core.fieldName = (Core.Name "local"),
+          Core.fieldTerm = (Phantoms.unTTerm local)}]}))
+
+qualifiedNameLocal :: Phantoms.TTerm Module.QualifiedName -> Phantoms.TTerm String
+qualifiedNameLocal x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.QualifiedName"),
+        Core.projectionField = (Core.Name "local")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+qualifiedNameNamespace :: Phantoms.TTerm Module.QualifiedName -> Phantoms.TTerm (Maybe Module.Namespace)
+qualifiedNameNamespace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.QualifiedName"),
+        Core.projectionField = (Core.Name "namespace")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+qualifiedNameWithLocal :: Phantoms.TTerm Module.QualifiedName -> Phantoms.TTerm String -> Phantoms.TTerm Module.QualifiedName
+qualifiedNameWithLocal original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.QualifiedName"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.QualifiedName"),
+              Core.projectionField = (Core.Name "namespace")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "local"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+qualifiedNameWithNamespace :: Phantoms.TTerm Module.QualifiedName -> Phantoms.TTerm (Maybe Module.Namespace) -> Phantoms.TTerm Module.QualifiedName
+qualifiedNameWithNamespace original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.QualifiedName"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "local"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.QualifiedName"),
+              Core.projectionField = (Core.Name "local")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termDefinition :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Term -> Phantoms.TTerm (Maybe Core.TypeScheme) -> Phantoms.TTerm Module.TermDefinition
+termDefinition name term type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TermDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm term)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+termDefinitionName :: Phantoms.TTerm Module.TermDefinition -> Phantoms.TTerm Core.Name
+termDefinitionName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+termDefinitionTerm :: Phantoms.TTerm Module.TermDefinition -> Phantoms.TTerm Core.Term
+termDefinitionTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+        Core.projectionField = (Core.Name "term")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+termDefinitionType :: Phantoms.TTerm Module.TermDefinition -> Phantoms.TTerm (Maybe Core.TypeScheme)
+termDefinitionType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+termDefinitionWithName :: Phantoms.TTerm Module.TermDefinition -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Module.TermDefinition
+termDefinitionWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TermDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termDefinitionWithTerm :: Phantoms.TTerm Module.TermDefinition -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Module.TermDefinition
+termDefinitionWithTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TermDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termDefinitionWithType :: Phantoms.TTerm Module.TermDefinition -> Phantoms.TTerm (Maybe Core.TypeScheme) -> Phantoms.TTerm Module.TermDefinition
+termDefinitionWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TermDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeDefinition :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Module.TypeDefinition
+typeDefinition name type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TypeDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+typeDefinitionName :: Phantoms.TTerm Module.TypeDefinition -> Phantoms.TTerm Core.Name
+typeDefinitionName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.TypeDefinition"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeDefinitionType :: Phantoms.TTerm Module.TypeDefinition -> Phantoms.TTerm Core.Type
+typeDefinitionType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.module.TypeDefinition"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeDefinitionWithName :: Phantoms.TTerm Module.TypeDefinition -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Module.TypeDefinition
+typeDefinitionWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TypeDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.TypeDefinition"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeDefinitionWithType :: Phantoms.TTerm Module.TypeDefinition -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Module.TypeDefinition
+typeDefinitionWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TypeDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.module.TypeDefinition"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unFileExtension :: Phantoms.TTerm Module.FileExtension -> Phantoms.TTerm String
+unFileExtension x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.module.FileExtension")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unNamespace :: Phantoms.TTerm Module.Namespace -> Phantoms.TTerm String
+unNamespace x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.module.Namespace")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Packaging.hs b/src/gen-main/haskell/Hydra/Dsl/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Packaging.hs
@@ -0,0 +1,198 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.packaging
+
+module Hydra.Dsl.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import qualified Hydra.Packaging as Packaging
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+package :: Phantoms.TTerm Packaging.PackageName -> Phantoms.TTerm [Module.Module] -> Phantoms.TTerm [Packaging.PackageName] -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Packaging.Package
+package name modules dependencies description =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.packaging.Package"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "modules"),
+          Core.fieldTerm = (Phantoms.unTTerm modules)},
+        Core.Field {
+          Core.fieldName = (Core.Name "dependencies"),
+          Core.fieldTerm = (Phantoms.unTTerm dependencies)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm description)}]}))
+
+packageDependencies :: Phantoms.TTerm Packaging.Package -> Phantoms.TTerm [Packaging.PackageName]
+packageDependencies x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+        Core.projectionField = (Core.Name "dependencies")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+packageDescription :: Phantoms.TTerm Packaging.Package -> Phantoms.TTerm (Maybe String)
+packageDescription x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+        Core.projectionField = (Core.Name "description")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+packageModules :: Phantoms.TTerm Packaging.Package -> Phantoms.TTerm [Module.Module]
+packageModules x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+        Core.projectionField = (Core.Name "modules")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+packageName :: Phantoms.TTerm Packaging.Package -> Phantoms.TTerm Packaging.PackageName
+packageName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+packageName_ :: Phantoms.TTerm String -> Phantoms.TTerm Packaging.PackageName
+packageName_ x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.packaging.PackageName"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+packageWithDependencies :: Phantoms.TTerm Packaging.Package -> Phantoms.TTerm [Packaging.PackageName] -> Phantoms.TTerm Packaging.Package
+packageWithDependencies original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.packaging.Package"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "modules"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "modules")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "dependencies"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+packageWithDescription :: Phantoms.TTerm Packaging.Package -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Packaging.Package
+packageWithDescription original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.packaging.Package"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "modules"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "modules")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "dependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "dependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+packageWithModules :: Phantoms.TTerm Packaging.Package -> Phantoms.TTerm [Module.Module] -> Phantoms.TTerm Packaging.Package
+packageWithModules original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.packaging.Package"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "modules"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "dependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "dependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+packageWithName :: Phantoms.TTerm Packaging.Package -> Phantoms.TTerm Packaging.PackageName -> Phantoms.TTerm Packaging.Package
+packageWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.packaging.Package"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "modules"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "modules")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "dependencies"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "dependencies")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unPackageName :: Phantoms.TTerm Packaging.PackageName -> Phantoms.TTerm String
+unPackageName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.packaging.PackageName")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Parsing.hs b/src/gen-main/haskell/Hydra/Dsl/Parsing.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Parsing.hs
@@ -0,0 +1,163 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.parsing
+
+module Hydra.Dsl.Parsing where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Parsing as Parsing
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+parseError :: Phantoms.TTerm String -> Phantoms.TTerm String -> Phantoms.TTerm Parsing.ParseError
+parseError message remainder =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.parsing.ParseError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = (Phantoms.unTTerm message)},
+        Core.Field {
+          Core.fieldName = (Core.Name "remainder"),
+          Core.fieldTerm = (Phantoms.unTTerm remainder)}]}))
+
+parseErrorMessage :: Phantoms.TTerm Parsing.ParseError -> Phantoms.TTerm String
+parseErrorMessage x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.parsing.ParseError"),
+        Core.projectionField = (Core.Name "message")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+parseErrorRemainder :: Phantoms.TTerm Parsing.ParseError -> Phantoms.TTerm String
+parseErrorRemainder x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.parsing.ParseError"),
+        Core.projectionField = (Core.Name "remainder")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+parseErrorWithMessage :: Phantoms.TTerm Parsing.ParseError -> Phantoms.TTerm String -> Phantoms.TTerm Parsing.ParseError
+parseErrorWithMessage original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.parsing.ParseError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "remainder"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.parsing.ParseError"),
+              Core.projectionField = (Core.Name "remainder")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+parseErrorWithRemainder :: Phantoms.TTerm Parsing.ParseError -> Phantoms.TTerm String -> Phantoms.TTerm Parsing.ParseError
+parseErrorWithRemainder original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.parsing.ParseError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.parsing.ParseError"),
+              Core.projectionField = (Core.Name "message")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "remainder"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+parseResultFailure :: Phantoms.TTerm Parsing.ParseError -> Phantoms.TTerm (Parsing.ParseResult a)
+parseResultFailure x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "failure"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+parseResultSuccess :: Phantoms.TTerm (Parsing.ParseSuccess a) -> Phantoms.TTerm (Parsing.ParseResult a)
+parseResultSuccess x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "success"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+parseSuccess :: Phantoms.TTerm a -> Phantoms.TTerm String -> Phantoms.TTerm (Parsing.ParseSuccess a)
+parseSuccess value remainder =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Phantoms.unTTerm value)},
+        Core.Field {
+          Core.fieldName = (Core.Name "remainder"),
+          Core.fieldTerm = (Phantoms.unTTerm remainder)}]}))
+
+parseSuccessRemainder :: Phantoms.TTerm (Parsing.ParseSuccess a) -> Phantoms.TTerm String
+parseSuccessRemainder x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+        Core.projectionField = (Core.Name "remainder")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+parseSuccessValue :: Phantoms.TTerm (Parsing.ParseSuccess a) -> Phantoms.TTerm a
+parseSuccessValue x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+        Core.projectionField = (Core.Name "value")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+parseSuccessWithRemainder :: Phantoms.TTerm (Parsing.ParseSuccess a) -> Phantoms.TTerm String -> Phantoms.TTerm (Parsing.ParseSuccess a)
+parseSuccessWithRemainder original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+              Core.projectionField = (Core.Name "value")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "remainder"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+parseSuccessWithValue :: Phantoms.TTerm (Parsing.ParseSuccess a) -> Phantoms.TTerm a -> Phantoms.TTerm (Parsing.ParseSuccess a)
+parseSuccessWithValue original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "remainder"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+              Core.projectionField = (Core.Name "remainder")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+parser :: Phantoms.TTerm (String -> Parsing.ParseResult a) -> Phantoms.TTerm (Parsing.Parser a)
+parser x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.parsing.Parser"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+unParser :: Phantoms.TTerm (Parsing.Parser a) -> Phantoms.TTerm (String -> Parsing.ParseResult a)
+unParser x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.parsing.Parser")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Paths.hs b/src/gen-main/haskell/Hydra/Dsl/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Paths.hs
@@ -0,0 +1,895 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.paths
+
+module Hydra.Dsl.Paths where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Phantoms as Phantoms
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+subtermEdge :: Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm Paths.SubtermEdge
+subtermEdge source path target =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Phantoms.unTTerm source)},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Phantoms.unTTerm path)},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Phantoms.unTTerm target)}]}))
+
+subtermEdgePath :: Phantoms.TTerm Paths.SubtermEdge -> Phantoms.TTerm Paths.SubtermPath
+subtermEdgePath x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+        Core.projectionField = (Core.Name "path")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtermEdgeSource :: Phantoms.TTerm Paths.SubtermEdge -> Phantoms.TTerm Paths.SubtermNode
+subtermEdgeSource x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+        Core.projectionField = (Core.Name "source")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtermEdgeTarget :: Phantoms.TTerm Paths.SubtermEdge -> Phantoms.TTerm Paths.SubtermNode
+subtermEdgeTarget x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+        Core.projectionField = (Core.Name "target")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtermEdgeWithPath :: Phantoms.TTerm Paths.SubtermEdge -> Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm Paths.SubtermEdge
+subtermEdgeWithPath original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+              Core.projectionField = (Core.Name "source")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+              Core.projectionField = (Core.Name "target")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtermEdgeWithSource :: Phantoms.TTerm Paths.SubtermEdge -> Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm Paths.SubtermEdge
+subtermEdgeWithSource original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+              Core.projectionField = (Core.Name "path")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+              Core.projectionField = (Core.Name "target")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtermEdgeWithTarget :: Phantoms.TTerm Paths.SubtermEdge -> Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm Paths.SubtermEdge
+subtermEdgeWithTarget original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+              Core.projectionField = (Core.Name "source")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+              Core.projectionField = (Core.Name "path")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+subtermGraph :: Phantoms.TTerm [Paths.SubtermNode] -> Phantoms.TTerm [Paths.SubtermEdge] -> Phantoms.TTerm Paths.SubtermGraph
+subtermGraph nodes edges =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "nodes"),
+          Core.fieldTerm = (Phantoms.unTTerm nodes)},
+        Core.Field {
+          Core.fieldName = (Core.Name "edges"),
+          Core.fieldTerm = (Phantoms.unTTerm edges)}]}))
+
+subtermGraphEdges :: Phantoms.TTerm Paths.SubtermGraph -> Phantoms.TTerm [Paths.SubtermEdge]
+subtermGraphEdges x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+        Core.projectionField = (Core.Name "edges")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtermGraphNodes :: Phantoms.TTerm Paths.SubtermGraph -> Phantoms.TTerm [Paths.SubtermNode]
+subtermGraphNodes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+        Core.projectionField = (Core.Name "nodes")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtermGraphWithEdges :: Phantoms.TTerm Paths.SubtermGraph -> Phantoms.TTerm [Paths.SubtermEdge] -> Phantoms.TTerm Paths.SubtermGraph
+subtermGraphWithEdges original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "nodes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+              Core.projectionField = (Core.Name "nodes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "edges"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+subtermGraphWithNodes :: Phantoms.TTerm Paths.SubtermGraph -> Phantoms.TTerm [Paths.SubtermNode] -> Phantoms.TTerm Paths.SubtermGraph
+subtermGraphWithNodes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "nodes"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "edges"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+              Core.projectionField = (Core.Name "edges")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtermNode :: Phantoms.TTerm Core.Name -> Phantoms.TTerm String -> Phantoms.TTerm String -> Phantoms.TTerm Paths.SubtermNode
+subtermNode name label id =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = (Phantoms.unTTerm label)},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = (Phantoms.unTTerm id)}]}))
+
+subtermNodeId :: Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm String
+subtermNodeId x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+        Core.projectionField = (Core.Name "id")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtermNodeLabel :: Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm String
+subtermNodeLabel x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+        Core.projectionField = (Core.Name "label")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtermNodeName :: Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm Core.Name
+subtermNodeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtermNodeWithId :: Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm String -> Phantoms.TTerm Paths.SubtermNode
+subtermNodeWithId original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+              Core.projectionField = (Core.Name "label")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+subtermNodeWithLabel :: Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm String -> Phantoms.TTerm Paths.SubtermNode
+subtermNodeWithLabel original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+              Core.projectionField = (Core.Name "id")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtermNodeWithName :: Phantoms.TTerm Paths.SubtermNode -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Paths.SubtermNode
+subtermNodeWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+              Core.projectionField = (Core.Name "label")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+              Core.projectionField = (Core.Name "id")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtermPath :: Phantoms.TTerm [Paths.SubtermStep] -> Phantoms.TTerm Paths.SubtermPath
+subtermPath x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.paths.SubtermPath"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+subtermStepAnnotatedBody :: Phantoms.TTerm Paths.SubtermStep
+subtermStepAnnotatedBody =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "annotatedBody"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepApplicationArgument :: Phantoms.TTerm Paths.SubtermStep
+subtermStepApplicationArgument =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "applicationArgument"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepApplicationFunction :: Phantoms.TTerm Paths.SubtermStep
+subtermStepApplicationFunction =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "applicationFunction"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepInjectionTerm :: Phantoms.TTerm Paths.SubtermStep
+subtermStepInjectionTerm =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "injectionTerm"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepLambdaBody :: Phantoms.TTerm Paths.SubtermStep
+subtermStepLambdaBody =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lambdaBody"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepLetBinding :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Paths.SubtermStep
+subtermStepLetBinding x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "letBinding"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtermStepLetBody :: Phantoms.TTerm Paths.SubtermStep
+subtermStepLetBody =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "letBody"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepListElement :: Phantoms.TTerm Int -> Phantoms.TTerm Paths.SubtermStep
+subtermStepListElement x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "listElement"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtermStepMapKey :: Phantoms.TTerm Int -> Phantoms.TTerm Paths.SubtermStep
+subtermStepMapKey x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "mapKey"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtermStepMapValue :: Phantoms.TTerm Int -> Phantoms.TTerm Paths.SubtermStep
+subtermStepMapValue x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "mapValue"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtermStepMaybeTerm :: Phantoms.TTerm Paths.SubtermStep
+subtermStepMaybeTerm =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "maybeTerm"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepProductTerm :: Phantoms.TTerm Int -> Phantoms.TTerm Paths.SubtermStep
+subtermStepProductTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "productTerm"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtermStepRecordField :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Paths.SubtermStep
+subtermStepRecordField x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "recordField"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtermStepSetElement :: Phantoms.TTerm Int -> Phantoms.TTerm Paths.SubtermStep
+subtermStepSetElement x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "setElement"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtermStepSumTerm :: Phantoms.TTerm Paths.SubtermStep
+subtermStepSumTerm =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "sumTerm"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepTypeApplicationTerm :: Phantoms.TTerm Paths.SubtermStep
+subtermStepTypeApplicationTerm =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeApplicationTerm"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepTypeLambdaBody :: Phantoms.TTerm Paths.SubtermStep
+subtermStepTypeLambdaBody =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeLambdaBody"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepUnionCasesBranch :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Paths.SubtermStep
+subtermStepUnionCasesBranch x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unionCasesBranch"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtermStepUnionCasesDefault :: Phantoms.TTerm Paths.SubtermStep
+subtermStepUnionCasesDefault =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unionCasesDefault"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtermStepWrappedTerm :: Phantoms.TTerm Paths.SubtermStep
+subtermStepWrappedTerm =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wrappedTerm"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeEdge :: Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm Paths.SubtypePath -> Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm Paths.SubtypeEdge
+subtypeEdge source path target =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Phantoms.unTTerm source)},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Phantoms.unTTerm path)},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Phantoms.unTTerm target)}]}))
+
+subtypeEdgePath :: Phantoms.TTerm Paths.SubtypeEdge -> Phantoms.TTerm Paths.SubtypePath
+subtypeEdgePath x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+        Core.projectionField = (Core.Name "path")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtypeEdgeSource :: Phantoms.TTerm Paths.SubtypeEdge -> Phantoms.TTerm Paths.SubtypeNode
+subtypeEdgeSource x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+        Core.projectionField = (Core.Name "source")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtypeEdgeTarget :: Phantoms.TTerm Paths.SubtypeEdge -> Phantoms.TTerm Paths.SubtypeNode
+subtypeEdgeTarget x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+        Core.projectionField = (Core.Name "target")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtypeEdgeWithPath :: Phantoms.TTerm Paths.SubtypeEdge -> Phantoms.TTerm Paths.SubtypePath -> Phantoms.TTerm Paths.SubtypeEdge
+subtypeEdgeWithPath original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+              Core.projectionField = (Core.Name "source")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+              Core.projectionField = (Core.Name "target")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtypeEdgeWithSource :: Phantoms.TTerm Paths.SubtypeEdge -> Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm Paths.SubtypeEdge
+subtypeEdgeWithSource original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+              Core.projectionField = (Core.Name "path")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+              Core.projectionField = (Core.Name "target")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtypeEdgeWithTarget :: Phantoms.TTerm Paths.SubtypeEdge -> Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm Paths.SubtypeEdge
+subtypeEdgeWithTarget original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+              Core.projectionField = (Core.Name "source")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+              Core.projectionField = (Core.Name "path")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+subtypeGraph :: Phantoms.TTerm [Paths.SubtypeNode] -> Phantoms.TTerm [Paths.SubtypeEdge] -> Phantoms.TTerm Paths.SubtypeGraph
+subtypeGraph nodes edges =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "nodes"),
+          Core.fieldTerm = (Phantoms.unTTerm nodes)},
+        Core.Field {
+          Core.fieldName = (Core.Name "edges"),
+          Core.fieldTerm = (Phantoms.unTTerm edges)}]}))
+
+subtypeGraphEdges :: Phantoms.TTerm Paths.SubtypeGraph -> Phantoms.TTerm [Paths.SubtypeEdge]
+subtypeGraphEdges x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+        Core.projectionField = (Core.Name "edges")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtypeGraphNodes :: Phantoms.TTerm Paths.SubtypeGraph -> Phantoms.TTerm [Paths.SubtypeNode]
+subtypeGraphNodes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+        Core.projectionField = (Core.Name "nodes")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtypeGraphWithEdges :: Phantoms.TTerm Paths.SubtypeGraph -> Phantoms.TTerm [Paths.SubtypeEdge] -> Phantoms.TTerm Paths.SubtypeGraph
+subtypeGraphWithEdges original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "nodes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+              Core.projectionField = (Core.Name "nodes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "edges"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+subtypeGraphWithNodes :: Phantoms.TTerm Paths.SubtypeGraph -> Phantoms.TTerm [Paths.SubtypeNode] -> Phantoms.TTerm Paths.SubtypeGraph
+subtypeGraphWithNodes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "nodes"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "edges"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+              Core.projectionField = (Core.Name "edges")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtypeNode :: Phantoms.TTerm Core.Name -> Phantoms.TTerm String -> Phantoms.TTerm String -> Phantoms.TTerm Paths.SubtypeNode
+subtypeNode name label id =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = (Phantoms.unTTerm label)},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = (Phantoms.unTTerm id)}]}))
+
+subtypeNodeId :: Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm String
+subtypeNodeId x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+        Core.projectionField = (Core.Name "id")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtypeNodeLabel :: Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm String
+subtypeNodeLabel x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+        Core.projectionField = (Core.Name "label")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtypeNodeName :: Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm Core.Name
+subtypeNodeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+subtypeNodeWithId :: Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm String -> Phantoms.TTerm Paths.SubtypeNode
+subtypeNodeWithId original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+              Core.projectionField = (Core.Name "label")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+subtypeNodeWithLabel :: Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm String -> Phantoms.TTerm Paths.SubtypeNode
+subtypeNodeWithLabel original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+              Core.projectionField = (Core.Name "id")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtypeNodeWithName :: Phantoms.TTerm Paths.SubtypeNode -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Paths.SubtypeNode
+subtypeNodeWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+              Core.projectionField = (Core.Name "label")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+              Core.projectionField = (Core.Name "id")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+subtypePath :: Phantoms.TTerm [Paths.SubtypeStep] -> Phantoms.TTerm Paths.SubtypePath
+subtypePath x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.paths.SubtypePath"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+subtypeStepAnnotatedBody :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepAnnotatedBody =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "annotatedBody"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepApplicationArgument :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepApplicationArgument =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "applicationArgument"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepApplicationFunction :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepApplicationFunction =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "applicationFunction"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepEitherLeft :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepEitherLeft =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "eitherLeft"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepEitherRight :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepEitherRight =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "eitherRight"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepForallBody :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepForallBody =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "forallBody"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepFunctionCodomain :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepFunctionCodomain =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "functionCodomain"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepFunctionDomain :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepFunctionDomain =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "functionDomain"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepListElement :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepListElement =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "listElement"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepMapKeys :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepMapKeys =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "mapKeys"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepMapValues :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepMapValues =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "mapValues"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepMaybeElement :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepMaybeElement =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "maybeElement"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepPairFirst :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepPairFirst =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pairFirst"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepPairSecond :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepPairSecond =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pairSecond"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepRecordField :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Paths.SubtypeStep
+subtypeStepRecordField x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "recordField"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtypeStepSetElement :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepSetElement =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "setElement"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+subtypeStepUnionField :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Paths.SubtypeStep
+subtypeStepUnionField x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unionField"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+subtypeStepWrappedType :: Phantoms.TTerm Paths.SubtypeStep
+subtypeStepWrappedType =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wrappedType"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+unSubtermPath :: Phantoms.TTerm Paths.SubtermPath -> Phantoms.TTerm [Paths.SubtermStep]
+unSubtermPath x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.paths.SubtermPath")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unSubtypePath :: Phantoms.TTerm Paths.SubtypePath -> Phantoms.TTerm [Paths.SubtypeStep]
+unSubtypePath x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.paths.SubtypePath")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Query.hs b/src/gen-main/haskell/Hydra/Dsl/Query.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Query.hs
@@ -0,0 +1,819 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.query
+
+module Hydra.Dsl.Query where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Query as Query
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+comparisonConstraintEqual :: Phantoms.TTerm Query.ComparisonConstraint
+comparisonConstraintEqual =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "equal"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+comparisonConstraintGreaterThan :: Phantoms.TTerm Query.ComparisonConstraint
+comparisonConstraintGreaterThan =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "greaterThan"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+comparisonConstraintGreaterThanOrEqual :: Phantoms.TTerm Query.ComparisonConstraint
+comparisonConstraintGreaterThanOrEqual =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "greaterThanOrEqual"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+comparisonConstraintLessThan :: Phantoms.TTerm Query.ComparisonConstraint
+comparisonConstraintLessThan =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lessThan"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+comparisonConstraintLessThanOrEqual :: Phantoms.TTerm Query.ComparisonConstraint
+comparisonConstraintLessThanOrEqual =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lessThanOrEqual"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+comparisonConstraintNotEqual :: Phantoms.TTerm Query.ComparisonConstraint
+comparisonConstraintNotEqual =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "notEqual"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+edge :: Phantoms.TTerm Core.Name -> Phantoms.TTerm (Maybe Core.Name) -> Phantoms.TTerm (Maybe Core.Name) -> Phantoms.TTerm Query.Edge
+edge type_ out in_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Edge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "out"),
+          Core.fieldTerm = (Phantoms.unTTerm out)},
+        Core.Field {
+          Core.fieldName = (Core.Name "in"),
+          Core.fieldTerm = (Phantoms.unTTerm in_)}]}))
+
+edgeIn :: Phantoms.TTerm Query.Edge -> Phantoms.TTerm (Maybe Core.Name)
+edgeIn x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+        Core.projectionField = (Core.Name "in")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+edgeOut :: Phantoms.TTerm Query.Edge -> Phantoms.TTerm (Maybe Core.Name)
+edgeOut x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+        Core.projectionField = (Core.Name "out")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+edgeType :: Phantoms.TTerm Query.Edge -> Phantoms.TTerm Core.Name
+edgeType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+edgeWithIn :: Phantoms.TTerm Query.Edge -> Phantoms.TTerm (Maybe Core.Name) -> Phantoms.TTerm Query.Edge
+edgeWithIn original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Edge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "out"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+              Core.projectionField = (Core.Name "out")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "in"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+edgeWithOut :: Phantoms.TTerm Query.Edge -> Phantoms.TTerm (Maybe Core.Name) -> Phantoms.TTerm Query.Edge
+edgeWithOut original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Edge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "out"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "in"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+              Core.projectionField = (Core.Name "in")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+edgeWithType :: Phantoms.TTerm Query.Edge -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Query.Edge
+edgeWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Edge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "out"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+              Core.projectionField = (Core.Name "out")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "in"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+              Core.projectionField = (Core.Name "in")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphPattern :: Phantoms.TTerm Core.Name -> Phantoms.TTerm [Query.Pattern] -> Phantoms.TTerm Query.GraphPattern
+graphPattern graph patterns =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.GraphPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (Phantoms.unTTerm graph)},
+        Core.Field {
+          Core.fieldName = (Core.Name "patterns"),
+          Core.fieldTerm = (Phantoms.unTTerm patterns)}]}))
+
+graphPatternGraph :: Phantoms.TTerm Query.GraphPattern -> Phantoms.TTerm Core.Name
+graphPatternGraph x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.GraphPattern"),
+        Core.projectionField = (Core.Name "graph")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphPatternPatterns :: Phantoms.TTerm Query.GraphPattern -> Phantoms.TTerm [Query.Pattern]
+graphPatternPatterns x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.GraphPattern"),
+        Core.projectionField = (Core.Name "patterns")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+graphPatternWithGraph :: Phantoms.TTerm Query.GraphPattern -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Query.GraphPattern
+graphPatternWithGraph original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.GraphPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "patterns"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.GraphPattern"),
+              Core.projectionField = (Core.Name "patterns")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+graphPatternWithPatterns :: Phantoms.TTerm Query.GraphPattern -> Phantoms.TTerm [Query.Pattern] -> Phantoms.TTerm Query.GraphPattern
+graphPatternWithPatterns original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.GraphPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.GraphPattern"),
+              Core.projectionField = (Core.Name "graph")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "patterns"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+nodeTerm :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Query.Node
+nodeTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "term"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+nodeVariable :: Phantoms.TTerm Query.Variable -> Phantoms.TTerm Query.Node
+nodeVariable x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "variable"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+nodeWildcard :: Phantoms.TTerm Query.Node
+nodeWildcard =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wildcard"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+pathEquation :: Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.PathEquation
+pathEquation left right =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.PathEquation"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm left)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm right)}]}))
+
+pathEquationLeft :: Phantoms.TTerm Query.PathEquation -> Phantoms.TTerm Query.Path
+pathEquationLeft x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.PathEquation"),
+        Core.projectionField = (Core.Name "left")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+pathEquationRight :: Phantoms.TTerm Query.PathEquation -> Phantoms.TTerm Query.Path
+pathEquationRight x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.PathEquation"),
+        Core.projectionField = (Core.Name "right")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+pathEquationWithLeft :: Phantoms.TTerm Query.PathEquation -> Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.PathEquation
+pathEquationWithLeft original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.PathEquation"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.PathEquation"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+pathEquationWithRight :: Phantoms.TTerm Query.PathEquation -> Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.PathEquation
+pathEquationWithRight original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.PathEquation"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.PathEquation"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+pathInverse :: Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.Path
+pathInverse x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "inverse"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+pathRegex :: Phantoms.TTerm Query.RegexSequence -> Phantoms.TTerm Query.Path
+pathRegex x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "regex"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+pathStep :: Phantoms.TTerm Query.Step -> Phantoms.TTerm Query.Path
+pathStep x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "step"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternConjunction :: Phantoms.TTerm [Query.Pattern] -> Phantoms.TTerm Query.Pattern
+patternConjunction x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "conjunction"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternDisjunction :: Phantoms.TTerm [Query.Pattern] -> Phantoms.TTerm Query.Pattern
+patternDisjunction x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "disjunction"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternGraph :: Phantoms.TTerm Query.GraphPattern -> Phantoms.TTerm Query.Pattern
+patternGraph x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "graph"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternImplication :: Phantoms.TTerm Query.Pattern -> Phantoms.TTerm Query.Pattern -> Phantoms.TTerm Query.PatternImplication
+patternImplication antecedent consequent =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.PatternImplication"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "antecedent"),
+          Core.fieldTerm = (Phantoms.unTTerm antecedent)},
+        Core.Field {
+          Core.fieldName = (Core.Name "consequent"),
+          Core.fieldTerm = (Phantoms.unTTerm consequent)}]}))
+
+patternImplicationAntecedent :: Phantoms.TTerm Query.PatternImplication -> Phantoms.TTerm Query.Pattern
+patternImplicationAntecedent x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.PatternImplication"),
+        Core.projectionField = (Core.Name "antecedent")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+patternImplicationConsequent :: Phantoms.TTerm Query.PatternImplication -> Phantoms.TTerm Query.Pattern
+patternImplicationConsequent x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.PatternImplication"),
+        Core.projectionField = (Core.Name "consequent")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+patternImplicationWithAntecedent :: Phantoms.TTerm Query.PatternImplication -> Phantoms.TTerm Query.Pattern -> Phantoms.TTerm Query.PatternImplication
+patternImplicationWithAntecedent original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.PatternImplication"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "antecedent"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "consequent"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.PatternImplication"),
+              Core.projectionField = (Core.Name "consequent")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+patternImplicationWithConsequent :: Phantoms.TTerm Query.PatternImplication -> Phantoms.TTerm Query.Pattern -> Phantoms.TTerm Query.PatternImplication
+patternImplicationWithConsequent original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.PatternImplication"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "antecedent"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.PatternImplication"),
+              Core.projectionField = (Core.Name "antecedent")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "consequent"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+patternNegation :: Phantoms.TTerm Query.Pattern -> Phantoms.TTerm Query.Pattern
+patternNegation x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "negation"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+patternTriple :: Phantoms.TTerm Query.TriplePattern -> Phantoms.TTerm Query.Pattern
+patternTriple x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "triple"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+query :: Phantoms.TTerm [Query.Variable] -> Phantoms.TTerm [Query.Pattern] -> Phantoms.TTerm Query.Query
+query variables patterns =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Query"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Phantoms.unTTerm variables)},
+        Core.Field {
+          Core.fieldName = (Core.Name "patterns"),
+          Core.fieldTerm = (Phantoms.unTTerm patterns)}]}))
+
+queryPatterns :: Phantoms.TTerm Query.Query -> Phantoms.TTerm [Query.Pattern]
+queryPatterns x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.Query"),
+        Core.projectionField = (Core.Name "patterns")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+queryVariables :: Phantoms.TTerm Query.Query -> Phantoms.TTerm [Query.Variable]
+queryVariables x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.Query"),
+        Core.projectionField = (Core.Name "variables")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+queryWithPatterns :: Phantoms.TTerm Query.Query -> Phantoms.TTerm [Query.Pattern] -> Phantoms.TTerm Query.Query
+queryWithPatterns original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Query"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Query"),
+              Core.projectionField = (Core.Name "variables")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "patterns"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+queryWithVariables :: Phantoms.TTerm Query.Query -> Phantoms.TTerm [Query.Variable] -> Phantoms.TTerm Query.Query
+queryWithVariables original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Query"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "patterns"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Query"),
+              Core.projectionField = (Core.Name "patterns")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+range :: Phantoms.TTerm Int -> Phantoms.TTerm Int -> Phantoms.TTerm Query.Range
+range min max =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Range"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "min"),
+          Core.fieldTerm = (Phantoms.unTTerm min)},
+        Core.Field {
+          Core.fieldName = (Core.Name "max"),
+          Core.fieldTerm = (Phantoms.unTTerm max)}]}))
+
+rangeMax :: Phantoms.TTerm Query.Range -> Phantoms.TTerm Int
+rangeMax x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.Range"),
+        Core.projectionField = (Core.Name "max")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+rangeMin :: Phantoms.TTerm Query.Range -> Phantoms.TTerm Int
+rangeMin x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.Range"),
+        Core.projectionField = (Core.Name "min")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+rangeWithMax :: Phantoms.TTerm Query.Range -> Phantoms.TTerm Int -> Phantoms.TTerm Query.Range
+rangeWithMax original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Range"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "min"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Range"),
+              Core.projectionField = (Core.Name "min")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "max"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+rangeWithMin :: Phantoms.TTerm Query.Range -> Phantoms.TTerm Int -> Phantoms.TTerm Query.Range
+rangeWithMin original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Range"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "min"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "max"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.Range"),
+              Core.projectionField = (Core.Name "max")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+regexQuantifierAtLeast :: Phantoms.TTerm Int -> Phantoms.TTerm Query.RegexQuantifier
+regexQuantifierAtLeast x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "atLeast"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+regexQuantifierExactly :: Phantoms.TTerm Int -> Phantoms.TTerm Query.RegexQuantifier
+regexQuantifierExactly x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "exactly"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+regexQuantifierOne :: Phantoms.TTerm Query.RegexQuantifier
+regexQuantifierOne =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "one"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+regexQuantifierOneOrMore :: Phantoms.TTerm Query.RegexQuantifier
+regexQuantifierOneOrMore =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "oneOrMore"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+regexQuantifierRange :: Phantoms.TTerm Query.Range -> Phantoms.TTerm Query.RegexQuantifier
+regexQuantifierRange x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "range"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+regexQuantifierZeroOrMore :: Phantoms.TTerm Query.RegexQuantifier
+regexQuantifierZeroOrMore =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "zeroOrMore"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+regexQuantifierZeroOrOne :: Phantoms.TTerm Query.RegexQuantifier
+regexQuantifierZeroOrOne =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "zeroOrOne"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+regexSequence :: Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.RegexQuantifier -> Phantoms.TTerm Query.RegexSequence
+regexSequence path quantifier =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.RegexSequence"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Phantoms.unTTerm path)},
+        Core.Field {
+          Core.fieldName = (Core.Name "quantifier"),
+          Core.fieldTerm = (Phantoms.unTTerm quantifier)}]}))
+
+regexSequencePath :: Phantoms.TTerm Query.RegexSequence -> Phantoms.TTerm Query.Path
+regexSequencePath x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.RegexSequence"),
+        Core.projectionField = (Core.Name "path")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+regexSequenceQuantifier :: Phantoms.TTerm Query.RegexSequence -> Phantoms.TTerm Query.RegexQuantifier
+regexSequenceQuantifier x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.RegexSequence"),
+        Core.projectionField = (Core.Name "quantifier")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+regexSequenceWithPath :: Phantoms.TTerm Query.RegexSequence -> Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.RegexSequence
+regexSequenceWithPath original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.RegexSequence"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "quantifier"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.RegexSequence"),
+              Core.projectionField = (Core.Name "quantifier")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+regexSequenceWithQuantifier :: Phantoms.TTerm Query.RegexSequence -> Phantoms.TTerm Query.RegexQuantifier -> Phantoms.TTerm Query.RegexSequence
+regexSequenceWithQuantifier original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.RegexSequence"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.RegexSequence"),
+              Core.projectionField = (Core.Name "path")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "quantifier"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+stepCompare :: Phantoms.TTerm Query.ComparisonConstraint -> Phantoms.TTerm Query.Step
+stepCompare x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "compare"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+stepEdge :: Phantoms.TTerm Query.Edge -> Phantoms.TTerm Query.Step
+stepEdge x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "edge"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+stepProject :: Phantoms.TTerm Core.Projection -> Phantoms.TTerm Query.Step
+stepProject x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "project"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+triplePattern :: Phantoms.TTerm Query.Node -> Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.Node -> Phantoms.TTerm Query.TriplePattern
+triplePattern subject predicate object =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.TriplePattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "subject"),
+          Core.fieldTerm = (Phantoms.unTTerm subject)},
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (Phantoms.unTTerm predicate)},
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (Phantoms.unTTerm object)}]}))
+
+triplePatternObject :: Phantoms.TTerm Query.TriplePattern -> Phantoms.TTerm Query.Node
+triplePatternObject x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+        Core.projectionField = (Core.Name "object")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+triplePatternPredicate :: Phantoms.TTerm Query.TriplePattern -> Phantoms.TTerm Query.Path
+triplePatternPredicate x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+        Core.projectionField = (Core.Name "predicate")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+triplePatternSubject :: Phantoms.TTerm Query.TriplePattern -> Phantoms.TTerm Query.Node
+triplePatternSubject x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+        Core.projectionField = (Core.Name "subject")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+triplePatternWithObject :: Phantoms.TTerm Query.TriplePattern -> Phantoms.TTerm Query.Node -> Phantoms.TTerm Query.TriplePattern
+triplePatternWithObject original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.TriplePattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "subject"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+              Core.projectionField = (Core.Name "subject")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+              Core.projectionField = (Core.Name "predicate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+triplePatternWithPredicate :: Phantoms.TTerm Query.TriplePattern -> Phantoms.TTerm Query.Path -> Phantoms.TTerm Query.TriplePattern
+triplePatternWithPredicate original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.TriplePattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "subject"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+              Core.projectionField = (Core.Name "subject")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+              Core.projectionField = (Core.Name "object")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+triplePatternWithSubject :: Phantoms.TTerm Query.TriplePattern -> Phantoms.TTerm Query.Node -> Phantoms.TTerm Query.TriplePattern
+triplePatternWithSubject original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.TriplePattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "subject"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+              Core.projectionField = (Core.Name "predicate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+              Core.projectionField = (Core.Name "object")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unVariable :: Phantoms.TTerm Query.Variable -> Phantoms.TTerm String
+unVariable x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.query.Variable")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+variable :: Phantoms.TTerm String -> Phantoms.TTerm Query.Variable
+variable x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.query.Variable"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Relational.hs b/src/gen-main/haskell/Hydra/Dsl/Relational.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Relational.hs
@@ -0,0 +1,377 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.relational
+
+module Hydra.Dsl.Relational where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Relational as Relational
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+columnName :: Phantoms.TTerm String -> Phantoms.TTerm Relational.ColumnName
+columnName x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.ColumnName"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+columnSchema :: Phantoms.TTerm Relational.ColumnName -> Phantoms.TTerm t -> Phantoms.TTerm (Relational.ColumnSchema t)
+columnSchema name domain =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Phantoms.unTTerm domain)}]}))
+
+columnSchemaDomain :: Phantoms.TTerm (Relational.ColumnSchema t) -> Phantoms.TTerm t
+columnSchemaDomain x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+        Core.projectionField = (Core.Name "domain")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+columnSchemaName :: Phantoms.TTerm (Relational.ColumnSchema t) -> Phantoms.TTerm Relational.ColumnName
+columnSchemaName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+columnSchemaWithDomain :: Phantoms.TTerm (Relational.ColumnSchema t) -> Phantoms.TTerm t -> Phantoms.TTerm (Relational.ColumnSchema t)
+columnSchemaWithDomain original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+columnSchemaWithName :: Phantoms.TTerm (Relational.ColumnSchema t) -> Phantoms.TTerm Relational.ColumnName -> Phantoms.TTerm (Relational.ColumnSchema t)
+columnSchemaWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+              Core.projectionField = (Core.Name "domain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+foreignKey :: Phantoms.TTerm Relational.RelationName -> Phantoms.TTerm (M.Map Relational.ColumnName Relational.ColumnName) -> Phantoms.TTerm Relational.ForeignKey
+foreignKey foreignRelation keys =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.ForeignKey"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignRelation"),
+          Core.fieldTerm = (Phantoms.unTTerm foreignRelation)},
+        Core.Field {
+          Core.fieldName = (Core.Name "keys"),
+          Core.fieldTerm = (Phantoms.unTTerm keys)}]}))
+
+foreignKeyForeignRelation :: Phantoms.TTerm Relational.ForeignKey -> Phantoms.TTerm Relational.RelationName
+foreignKeyForeignRelation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.relational.ForeignKey"),
+        Core.projectionField = (Core.Name "foreignRelation")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+foreignKeyKeys :: Phantoms.TTerm Relational.ForeignKey -> Phantoms.TTerm (M.Map Relational.ColumnName Relational.ColumnName)
+foreignKeyKeys x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.relational.ForeignKey"),
+        Core.projectionField = (Core.Name "keys")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+foreignKeyWithForeignRelation :: Phantoms.TTerm Relational.ForeignKey -> Phantoms.TTerm Relational.RelationName -> Phantoms.TTerm Relational.ForeignKey
+foreignKeyWithForeignRelation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.ForeignKey"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignRelation"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "keys"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.ForeignKey"),
+              Core.projectionField = (Core.Name "keys")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+foreignKeyWithKeys :: Phantoms.TTerm Relational.ForeignKey -> Phantoms.TTerm (M.Map Relational.ColumnName Relational.ColumnName) -> Phantoms.TTerm Relational.ForeignKey
+foreignKeyWithKeys original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.ForeignKey"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignRelation"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.ForeignKey"),
+              Core.projectionField = (Core.Name "foreignRelation")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "keys"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+primaryKey :: Phantoms.TTerm [Relational.ColumnName] -> Phantoms.TTerm Relational.PrimaryKey
+primaryKey x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.PrimaryKey"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+relation :: Phantoms.TTerm [Relational.Row v] -> Phantoms.TTerm (Relational.Relation v)
+relation x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relation"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+relationName :: Phantoms.TTerm String -> Phantoms.TTerm Relational.RelationName
+relationName x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.RelationName"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+relationSchema :: Phantoms.TTerm Relational.RelationName -> Phantoms.TTerm [Relational.ColumnSchema t] -> Phantoms.TTerm [Relational.PrimaryKey] -> Phantoms.TTerm [Relational.ForeignKey] -> Phantoms.TTerm (Relational.RelationSchema t)
+relationSchema name columns primaryKeys foreignKeys =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = (Phantoms.unTTerm columns)},
+        Core.Field {
+          Core.fieldName = (Core.Name "primaryKeys"),
+          Core.fieldTerm = (Phantoms.unTTerm primaryKeys)},
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignKeys"),
+          Core.fieldTerm = (Phantoms.unTTerm foreignKeys)}]}))
+
+relationSchemaColumns :: Phantoms.TTerm (Relational.RelationSchema t) -> Phantoms.TTerm [Relational.ColumnSchema t]
+relationSchemaColumns x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+        Core.projectionField = (Core.Name "columns")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+relationSchemaForeignKeys :: Phantoms.TTerm (Relational.RelationSchema t) -> Phantoms.TTerm [Relational.ForeignKey]
+relationSchemaForeignKeys x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+        Core.projectionField = (Core.Name "foreignKeys")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+relationSchemaName :: Phantoms.TTerm (Relational.RelationSchema t) -> Phantoms.TTerm Relational.RelationName
+relationSchemaName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+relationSchemaPrimaryKeys :: Phantoms.TTerm (Relational.RelationSchema t) -> Phantoms.TTerm [Relational.PrimaryKey]
+relationSchemaPrimaryKeys x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+        Core.projectionField = (Core.Name "primaryKeys")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+relationSchemaWithColumns :: Phantoms.TTerm (Relational.RelationSchema t) -> Phantoms.TTerm [Relational.ColumnSchema t] -> Phantoms.TTerm (Relational.RelationSchema t)
+relationSchemaWithColumns original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "primaryKeys"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "primaryKeys")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignKeys"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "foreignKeys")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+relationSchemaWithForeignKeys :: Phantoms.TTerm (Relational.RelationSchema t) -> Phantoms.TTerm [Relational.ForeignKey] -> Phantoms.TTerm (Relational.RelationSchema t)
+relationSchemaWithForeignKeys original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "columns")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primaryKeys"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "primaryKeys")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignKeys"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+relationSchemaWithName :: Phantoms.TTerm (Relational.RelationSchema t) -> Phantoms.TTerm Relational.RelationName -> Phantoms.TTerm (Relational.RelationSchema t)
+relationSchemaWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "columns")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primaryKeys"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "primaryKeys")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignKeys"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "foreignKeys")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+relationSchemaWithPrimaryKeys :: Phantoms.TTerm (Relational.RelationSchema t) -> Phantoms.TTerm [Relational.PrimaryKey] -> Phantoms.TTerm (Relational.RelationSchema t)
+relationSchemaWithPrimaryKeys original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "columns")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primaryKeys"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignKeys"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+              Core.projectionField = (Core.Name "foreignKeys")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+relationship :: Phantoms.TTerm (S.Set (M.Map Relational.ColumnName v)) -> Phantoms.TTerm (Relational.Relationship v)
+relationship x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relationship"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+row :: Phantoms.TTerm [v] -> Phantoms.TTerm (Relational.Row v)
+row x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.Row"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+unColumnName :: Phantoms.TTerm Relational.ColumnName -> Phantoms.TTerm String
+unColumnName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.ColumnName")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unPrimaryKey :: Phantoms.TTerm Relational.PrimaryKey -> Phantoms.TTerm [Relational.ColumnName]
+unPrimaryKey x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.PrimaryKey")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unRelation :: Phantoms.TTerm (Relational.Relation v) -> Phantoms.TTerm [Relational.Row v]
+unRelation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Relation")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unRelationName :: Phantoms.TTerm Relational.RelationName -> Phantoms.TTerm String
+unRelationName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.RelationName")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unRelationship :: Phantoms.TTerm (Relational.Relationship v) -> Phantoms.TTerm (S.Set (M.Map Relational.ColumnName v))
+unRelationship x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Relationship")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unRow :: Phantoms.TTerm (Relational.Row v) -> Phantoms.TTerm [v]
+unRow x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Row")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Tabular.hs b/src/gen-main/haskell/Hydra/Dsl/Tabular.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Tabular.hs
@@ -0,0 +1,220 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.tabular
+
+module Hydra.Dsl.Tabular where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Relational as Relational
+import qualified Hydra.Tabular as Tabular
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+columnType :: Phantoms.TTerm Relational.ColumnName -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Tabular.ColumnType
+columnType name type_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.ColumnType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)}]}))
+
+columnTypeName :: Phantoms.TTerm Tabular.ColumnType -> Phantoms.TTerm Relational.ColumnName
+columnTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.tabular.ColumnType"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+columnTypeType :: Phantoms.TTerm Tabular.ColumnType -> Phantoms.TTerm Core.Type
+columnTypeType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.tabular.ColumnType"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+columnTypeWithName :: Phantoms.TTerm Tabular.ColumnType -> Phantoms.TTerm Relational.ColumnName -> Phantoms.TTerm Tabular.ColumnType
+columnTypeWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.ColumnType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.tabular.ColumnType"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+columnTypeWithType :: Phantoms.TTerm Tabular.ColumnType -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Tabular.ColumnType
+columnTypeWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.ColumnType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.tabular.ColumnType"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+dataRow :: Phantoms.TTerm [Maybe v] -> Phantoms.TTerm (Tabular.DataRow v)
+dataRow x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.tabular.DataRow"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+headerRow :: Phantoms.TTerm [String] -> Phantoms.TTerm Tabular.HeaderRow
+headerRow x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.tabular.HeaderRow"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+table :: Phantoms.TTerm (Maybe Tabular.HeaderRow) -> Phantoms.TTerm [Tabular.DataRow v] -> Phantoms.TTerm (Tabular.Table v)
+table header data_ =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.Table"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "header"),
+          Core.fieldTerm = (Phantoms.unTTerm header)},
+        Core.Field {
+          Core.fieldName = (Core.Name "data"),
+          Core.fieldTerm = (Phantoms.unTTerm data_)}]}))
+
+tableData :: Phantoms.TTerm (Tabular.Table v) -> Phantoms.TTerm [Tabular.DataRow v]
+tableData x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.tabular.Table"),
+        Core.projectionField = (Core.Name "data")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tableHeader :: Phantoms.TTerm (Tabular.Table v) -> Phantoms.TTerm (Maybe Tabular.HeaderRow)
+tableHeader x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.tabular.Table"),
+        Core.projectionField = (Core.Name "header")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tableType :: Phantoms.TTerm Relational.RelationName -> Phantoms.TTerm [Tabular.ColumnType] -> Phantoms.TTerm Tabular.TableType
+tableType name columns =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.TableType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = (Phantoms.unTTerm columns)}]}))
+
+tableTypeColumns :: Phantoms.TTerm Tabular.TableType -> Phantoms.TTerm [Tabular.ColumnType]
+tableTypeColumns x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.tabular.TableType"),
+        Core.projectionField = (Core.Name "columns")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tableTypeName :: Phantoms.TTerm Tabular.TableType -> Phantoms.TTerm Relational.RelationName
+tableTypeName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.tabular.TableType"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tableTypeWithColumns :: Phantoms.TTerm Tabular.TableType -> Phantoms.TTerm [Tabular.ColumnType] -> Phantoms.TTerm Tabular.TableType
+tableTypeWithColumns original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.TableType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.tabular.TableType"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+tableTypeWithName :: Phantoms.TTerm Tabular.TableType -> Phantoms.TTerm Relational.RelationName -> Phantoms.TTerm Tabular.TableType
+tableTypeWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.TableType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.tabular.TableType"),
+              Core.projectionField = (Core.Name "columns")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+tableWithData :: Phantoms.TTerm (Tabular.Table v) -> Phantoms.TTerm [Tabular.DataRow v] -> Phantoms.TTerm (Tabular.Table v)
+tableWithData original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.Table"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "header"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.tabular.Table"),
+              Core.projectionField = (Core.Name "header")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "data"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+tableWithHeader :: Phantoms.TTerm (Tabular.Table v) -> Phantoms.TTerm (Maybe Tabular.HeaderRow) -> Phantoms.TTerm (Tabular.Table v)
+tableWithHeader original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.Table"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "header"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "data"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.tabular.Table"),
+              Core.projectionField = (Core.Name "data")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unDataRow :: Phantoms.TTerm (Tabular.DataRow v) -> Phantoms.TTerm [Maybe v]
+unDataRow x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.tabular.DataRow")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unHeaderRow :: Phantoms.TTerm Tabular.HeaderRow -> Phantoms.TTerm [String]
+unHeaderRow x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.tabular.HeaderRow")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Testing.hs b/src/gen-main/haskell/Hydra/Dsl/Testing.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Testing.hs
@@ -0,0 +1,5142 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.testing
+
+module Hydra.Dsl.Testing where
+
+import qualified Hydra.Ast as Ast
+import qualified Hydra.Coders as Coders
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Core as Core_
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Json.Model as Model
+import qualified Hydra.Module as Module
+import qualified Hydra.Parsing as Parsing
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Testing as Testing
+import qualified Hydra.Typing as Typing
+import qualified Hydra.Util as Util
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+alphaConversionTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.AlphaConversionTestCase
+alphaConversionTestCase term oldVariable newVariable result =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm term)},
+        Core.Field {
+          Core.fieldName = (Core.Name "oldVariable"),
+          Core.fieldTerm = (Phantoms.unTTerm oldVariable)},
+        Core.Field {
+          Core.fieldName = (Core.Name "newVariable"),
+          Core.fieldTerm = (Phantoms.unTTerm newVariable)},
+        Core.Field {
+          Core.fieldName = (Core.Name "result"),
+          Core.fieldTerm = (Phantoms.unTTerm result)}]}))
+
+alphaConversionTestCaseNewVariable :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Core.Name
+alphaConversionTestCaseNewVariable x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+        Core.projectionField = (Core.Name "newVariable")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+alphaConversionTestCaseOldVariable :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Core.Name
+alphaConversionTestCaseOldVariable x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+        Core.projectionField = (Core.Name "oldVariable")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+alphaConversionTestCaseResult :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Core.Term
+alphaConversionTestCaseResult x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+        Core.projectionField = (Core.Name "result")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+alphaConversionTestCaseTerm :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Core.Term
+alphaConversionTestCaseTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+        Core.projectionField = (Core.Name "term")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+alphaConversionTestCaseWithNewVariable :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Testing.AlphaConversionTestCase
+alphaConversionTestCaseWithNewVariable original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "oldVariable"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "oldVariable")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newVariable"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "result"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "result")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+alphaConversionTestCaseWithOldVariable :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Testing.AlphaConversionTestCase
+alphaConversionTestCaseWithOldVariable original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "oldVariable"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "newVariable"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "newVariable")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "result"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "result")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+alphaConversionTestCaseWithResult :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.AlphaConversionTestCase
+alphaConversionTestCaseWithResult original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "oldVariable"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "oldVariable")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newVariable"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "newVariable")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "result"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+alphaConversionTestCaseWithTerm :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.AlphaConversionTestCase
+alphaConversionTestCaseWithTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "oldVariable"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "oldVariable")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newVariable"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "newVariable")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "result"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+              Core.projectionField = (Core.Name "result")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+caseConversionTestCase :: Phantoms.TTerm Util.CaseConvention -> Phantoms.TTerm Util.CaseConvention -> Phantoms.TTerm String -> Phantoms.TTerm String -> Phantoms.TTerm Testing.CaseConversionTestCase
+caseConversionTestCase fromConvention toConvention fromString toString =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fromConvention"),
+          Core.fieldTerm = (Phantoms.unTTerm fromConvention)},
+        Core.Field {
+          Core.fieldName = (Core.Name "toConvention"),
+          Core.fieldTerm = (Phantoms.unTTerm toConvention)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fromString"),
+          Core.fieldTerm = (Phantoms.unTTerm fromString)},
+        Core.Field {
+          Core.fieldName = (Core.Name "toString"),
+          Core.fieldTerm = (Phantoms.unTTerm toString)}]}))
+
+caseConversionTestCaseFromConvention :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm Util.CaseConvention
+caseConversionTestCaseFromConvention x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+        Core.projectionField = (Core.Name "fromConvention")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseConversionTestCaseFromString :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm String
+caseConversionTestCaseFromString x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+        Core.projectionField = (Core.Name "fromString")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseConversionTestCaseToConvention :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm Util.CaseConvention
+caseConversionTestCaseToConvention x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+        Core.projectionField = (Core.Name "toConvention")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseConversionTestCaseToString :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm String
+caseConversionTestCaseToString x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+        Core.projectionField = (Core.Name "toString")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+caseConversionTestCaseWithFromConvention :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm Util.CaseConvention -> Phantoms.TTerm Testing.CaseConversionTestCase
+caseConversionTestCaseWithFromConvention original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fromConvention"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "toConvention"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "toConvention")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fromString"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "fromString")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "toString"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "toString")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+caseConversionTestCaseWithFromString :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm String -> Phantoms.TTerm Testing.CaseConversionTestCase
+caseConversionTestCaseWithFromString original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fromConvention"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "fromConvention")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "toConvention"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "toConvention")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fromString"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "toString"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "toString")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+caseConversionTestCaseWithToConvention :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm Util.CaseConvention -> Phantoms.TTerm Testing.CaseConversionTestCase
+caseConversionTestCaseWithToConvention original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fromConvention"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "fromConvention")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "toConvention"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fromString"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "fromString")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "toString"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "toString")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+caseConversionTestCaseWithToString :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm String -> Phantoms.TTerm Testing.CaseConversionTestCase
+caseConversionTestCaseWithToString original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fromConvention"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "fromConvention")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "toConvention"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "toConvention")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fromString"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+              Core.projectionField = (Core.Name "fromString")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "toString"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+deannotateTermTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.DeannotateTermTestCase
+deannotateTermTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+deannotateTermTestCaseInput :: Phantoms.TTerm Testing.DeannotateTermTestCase -> Phantoms.TTerm Core.Term
+deannotateTermTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+deannotateTermTestCaseOutput :: Phantoms.TTerm Testing.DeannotateTermTestCase -> Phantoms.TTerm Core.Term
+deannotateTermTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+deannotateTermTestCaseWithInput :: Phantoms.TTerm Testing.DeannotateTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.DeannotateTermTestCase
+deannotateTermTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+deannotateTermTestCaseWithOutput :: Phantoms.TTerm Testing.DeannotateTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.DeannotateTermTestCase
+deannotateTermTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+deannotateTypeTestCase :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.DeannotateTypeTestCase
+deannotateTypeTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+deannotateTypeTestCaseInput :: Phantoms.TTerm Testing.DeannotateTypeTestCase -> Phantoms.TTerm Core.Type
+deannotateTypeTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+deannotateTypeTestCaseOutput :: Phantoms.TTerm Testing.DeannotateTypeTestCase -> Phantoms.TTerm Core.Type
+deannotateTypeTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+deannotateTypeTestCaseWithInput :: Phantoms.TTerm Testing.DeannotateTypeTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.DeannotateTypeTestCase
+deannotateTypeTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+deannotateTypeTestCaseWithOutput :: Phantoms.TTerm Testing.DeannotateTypeTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.DeannotateTypeTestCase
+deannotateTypeTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+delegatedEvaluationTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.DelegatedEvaluationTestCase
+delegatedEvaluationTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+delegatedEvaluationTestCaseInput :: Phantoms.TTerm Testing.DelegatedEvaluationTestCase -> Phantoms.TTerm Core.Term
+delegatedEvaluationTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+delegatedEvaluationTestCaseOutput :: Phantoms.TTerm Testing.DelegatedEvaluationTestCase -> Phantoms.TTerm Core.Term
+delegatedEvaluationTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+delegatedEvaluationTestCaseWithInput :: Phantoms.TTerm Testing.DelegatedEvaluationTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.DelegatedEvaluationTestCase
+delegatedEvaluationTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+delegatedEvaluationTestCaseWithOutput :: Phantoms.TTerm Testing.DelegatedEvaluationTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.DelegatedEvaluationTestCase
+delegatedEvaluationTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+etaExpansionTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.EtaExpansionTestCase
+etaExpansionTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+etaExpansionTestCaseInput :: Phantoms.TTerm Testing.EtaExpansionTestCase -> Phantoms.TTerm Core.Term
+etaExpansionTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+etaExpansionTestCaseOutput :: Phantoms.TTerm Testing.EtaExpansionTestCase -> Phantoms.TTerm Core.Term
+etaExpansionTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+etaExpansionTestCaseWithInput :: Phantoms.TTerm Testing.EtaExpansionTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.EtaExpansionTestCase
+etaExpansionTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+etaExpansionTestCaseWithOutput :: Phantoms.TTerm Testing.EtaExpansionTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.EtaExpansionTestCase
+etaExpansionTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+evaluationStyleEager :: Phantoms.TTerm Testing.EvaluationStyle
+evaluationStyleEager =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "eager"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+evaluationStyleLazy :: Phantoms.TTerm Testing.EvaluationStyle
+evaluationStyleLazy =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lazy"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+evaluationTestCase :: Phantoms.TTerm Testing.EvaluationStyle -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.EvaluationTestCase
+evaluationTestCase evaluationStyle input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "evaluationStyle"),
+          Core.fieldTerm = (Phantoms.unTTerm evaluationStyle)},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+evaluationTestCaseEvaluationStyle :: Phantoms.TTerm Testing.EvaluationTestCase -> Phantoms.TTerm Testing.EvaluationStyle
+evaluationTestCaseEvaluationStyle x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+        Core.projectionField = (Core.Name "evaluationStyle")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+evaluationTestCaseInput :: Phantoms.TTerm Testing.EvaluationTestCase -> Phantoms.TTerm Core.Term
+evaluationTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+evaluationTestCaseOutput :: Phantoms.TTerm Testing.EvaluationTestCase -> Phantoms.TTerm Core.Term
+evaluationTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+evaluationTestCaseWithEvaluationStyle :: Phantoms.TTerm Testing.EvaluationTestCase -> Phantoms.TTerm Testing.EvaluationStyle -> Phantoms.TTerm Testing.EvaluationTestCase
+evaluationTestCaseWithEvaluationStyle original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "evaluationStyle"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+evaluationTestCaseWithInput :: Phantoms.TTerm Testing.EvaluationTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.EvaluationTestCase
+evaluationTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "evaluationStyle"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+              Core.projectionField = (Core.Name "evaluationStyle")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+evaluationTestCaseWithOutput :: Phantoms.TTerm Testing.EvaluationTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.EvaluationTestCase
+evaluationTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "evaluationStyle"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+              Core.projectionField = (Core.Name "evaluationStyle")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+flattenLetTermsTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.FlattenLetTermsTestCase
+flattenLetTermsTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+flattenLetTermsTestCaseInput :: Phantoms.TTerm Testing.FlattenLetTermsTestCase -> Phantoms.TTerm Core.Term
+flattenLetTermsTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+flattenLetTermsTestCaseOutput :: Phantoms.TTerm Testing.FlattenLetTermsTestCase -> Phantoms.TTerm Core.Term
+flattenLetTermsTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+flattenLetTermsTestCaseWithInput :: Phantoms.TTerm Testing.FlattenLetTermsTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.FlattenLetTermsTestCase
+flattenLetTermsTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+flattenLetTermsTestCaseWithOutput :: Phantoms.TTerm Testing.FlattenLetTermsTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.FlattenLetTermsTestCase
+flattenLetTermsTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+foldOperationCollectLabels :: Phantoms.TTerm Testing.FoldOperation
+foldOperationCollectLabels =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "collectLabels"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+foldOperationCollectListLengths :: Phantoms.TTerm Testing.FoldOperation
+foldOperationCollectListLengths =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "collectListLengths"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+foldOperationSumInt32Literals :: Phantoms.TTerm Testing.FoldOperation
+foldOperationSumInt32Literals =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "sumInt32Literals"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+foldOverTermTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Coders.TraversalOrder -> Phantoms.TTerm Testing.FoldOperation -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.FoldOverTermTestCase
+foldOverTermTestCase input traversalOrder operation output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "traversalOrder"),
+          Core.fieldTerm = (Phantoms.unTTerm traversalOrder)},
+        Core.Field {
+          Core.fieldName = (Core.Name "operation"),
+          Core.fieldTerm = (Phantoms.unTTerm operation)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+foldOverTermTestCaseInput :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Core.Term
+foldOverTermTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+foldOverTermTestCaseOperation :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Testing.FoldOperation
+foldOverTermTestCaseOperation x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+        Core.projectionField = (Core.Name "operation")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+foldOverTermTestCaseOutput :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Core.Term
+foldOverTermTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+foldOverTermTestCaseTraversalOrder :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Coders.TraversalOrder
+foldOverTermTestCaseTraversalOrder x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+        Core.projectionField = (Core.Name "traversalOrder")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+foldOverTermTestCaseWithInput :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.FoldOverTermTestCase
+foldOverTermTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "traversalOrder"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "traversalOrder")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operation"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "operation")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+foldOverTermTestCaseWithOperation :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Testing.FoldOperation -> Phantoms.TTerm Testing.FoldOverTermTestCase
+foldOverTermTestCaseWithOperation original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "traversalOrder"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "traversalOrder")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operation"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+foldOverTermTestCaseWithOutput :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.FoldOverTermTestCase
+foldOverTermTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "traversalOrder"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "traversalOrder")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operation"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "operation")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+foldOverTermTestCaseWithTraversalOrder :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Coders.TraversalOrder -> Phantoms.TTerm Testing.FoldOverTermTestCase
+foldOverTermTestCaseWithTraversalOrder original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "traversalOrder"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "operation"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "operation")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+freeVariablesTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Testing.FreeVariablesTestCase
+freeVariablesTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+freeVariablesTestCaseInput :: Phantoms.TTerm Testing.FreeVariablesTestCase -> Phantoms.TTerm Core.Term
+freeVariablesTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+freeVariablesTestCaseOutput :: Phantoms.TTerm Testing.FreeVariablesTestCase -> Phantoms.TTerm (S.Set Core.Name)
+freeVariablesTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+freeVariablesTestCaseWithInput :: Phantoms.TTerm Testing.FreeVariablesTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.FreeVariablesTestCase
+freeVariablesTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+freeVariablesTestCaseWithOutput :: Phantoms.TTerm Testing.FreeVariablesTestCase -> Phantoms.TTerm (S.Set Core.Name) -> Phantoms.TTerm Testing.FreeVariablesTestCase
+freeVariablesTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+hoistCaseStatementsTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.HoistCaseStatementsTestCase
+hoistCaseStatementsTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+hoistCaseStatementsTestCaseInput :: Phantoms.TTerm Testing.HoistCaseStatementsTestCase -> Phantoms.TTerm Core.Term
+hoistCaseStatementsTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistCaseStatementsTestCaseOutput :: Phantoms.TTerm Testing.HoistCaseStatementsTestCase -> Phantoms.TTerm Core.Term
+hoistCaseStatementsTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistCaseStatementsTestCaseWithInput :: Phantoms.TTerm Testing.HoistCaseStatementsTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.HoistCaseStatementsTestCase
+hoistCaseStatementsTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+hoistCaseStatementsTestCaseWithOutput :: Phantoms.TTerm Testing.HoistCaseStatementsTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.HoistCaseStatementsTestCase
+hoistCaseStatementsTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+hoistLetBindingsTestCase :: Phantoms.TTerm Core.Let -> Phantoms.TTerm Core.Let -> Phantoms.TTerm Testing.HoistLetBindingsTestCase
+hoistLetBindingsTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+hoistLetBindingsTestCaseInput :: Phantoms.TTerm Testing.HoistLetBindingsTestCase -> Phantoms.TTerm Core.Let
+hoistLetBindingsTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistLetBindingsTestCaseOutput :: Phantoms.TTerm Testing.HoistLetBindingsTestCase -> Phantoms.TTerm Core.Let
+hoistLetBindingsTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistLetBindingsTestCaseWithInput :: Phantoms.TTerm Testing.HoistLetBindingsTestCase -> Phantoms.TTerm Core.Let -> Phantoms.TTerm Testing.HoistLetBindingsTestCase
+hoistLetBindingsTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+hoistLetBindingsTestCaseWithOutput :: Phantoms.TTerm Testing.HoistLetBindingsTestCase -> Phantoms.TTerm Core.Let -> Phantoms.TTerm Testing.HoistLetBindingsTestCase
+hoistLetBindingsTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+hoistPolymorphicLetBindingsTestCase :: Phantoms.TTerm Core.Let -> Phantoms.TTerm Core.Let -> Phantoms.TTerm Testing.HoistPolymorphicLetBindingsTestCase
+hoistPolymorphicLetBindingsTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+hoistPolymorphicLetBindingsTestCaseInput :: Phantoms.TTerm Testing.HoistPolymorphicLetBindingsTestCase -> Phantoms.TTerm Core.Let
+hoistPolymorphicLetBindingsTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistPolymorphicLetBindingsTestCaseOutput :: Phantoms.TTerm Testing.HoistPolymorphicLetBindingsTestCase -> Phantoms.TTerm Core.Let
+hoistPolymorphicLetBindingsTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistPolymorphicLetBindingsTestCaseWithInput :: Phantoms.TTerm Testing.HoistPolymorphicLetBindingsTestCase -> Phantoms.TTerm Core.Let -> Phantoms.TTerm Testing.HoistPolymorphicLetBindingsTestCase
+hoistPolymorphicLetBindingsTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+hoistPolymorphicLetBindingsTestCaseWithOutput :: Phantoms.TTerm Testing.HoistPolymorphicLetBindingsTestCase -> Phantoms.TTerm Core.Let -> Phantoms.TTerm Testing.HoistPolymorphicLetBindingsTestCase
+hoistPolymorphicLetBindingsTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+hoistPredicateApplications :: Phantoms.TTerm Testing.HoistPredicate
+hoistPredicateApplications =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "applications"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+hoistPredicateCaseStatements :: Phantoms.TTerm Testing.HoistPredicate
+hoistPredicateCaseStatements =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "caseStatements"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+hoistPredicateLists :: Phantoms.TTerm Testing.HoistPredicate
+hoistPredicateLists =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lists"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+hoistPredicateNothing :: Phantoms.TTerm Testing.HoistPredicate
+hoistPredicateNothing =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "nothing"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+hoistSubtermsTestCase :: Phantoms.TTerm Testing.HoistPredicate -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.HoistSubtermsTestCase
+hoistSubtermsTestCase predicate input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (Phantoms.unTTerm predicate)},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+hoistSubtermsTestCaseInput :: Phantoms.TTerm Testing.HoistSubtermsTestCase -> Phantoms.TTerm Core.Term
+hoistSubtermsTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistSubtermsTestCaseOutput :: Phantoms.TTerm Testing.HoistSubtermsTestCase -> Phantoms.TTerm Core.Term
+hoistSubtermsTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistSubtermsTestCasePredicate :: Phantoms.TTerm Testing.HoistSubtermsTestCase -> Phantoms.TTerm Testing.HoistPredicate
+hoistSubtermsTestCasePredicate x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+        Core.projectionField = (Core.Name "predicate")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+hoistSubtermsTestCaseWithInput :: Phantoms.TTerm Testing.HoistSubtermsTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.HoistSubtermsTestCase
+hoistSubtermsTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+              Core.projectionField = (Core.Name "predicate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+hoistSubtermsTestCaseWithOutput :: Phantoms.TTerm Testing.HoistSubtermsTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.HoistSubtermsTestCase
+hoistSubtermsTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+              Core.projectionField = (Core.Name "predicate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+hoistSubtermsTestCaseWithPredicate :: Phantoms.TTerm Testing.HoistSubtermsTestCase -> Phantoms.TTerm Testing.HoistPredicate -> Phantoms.TTerm Testing.HoistSubtermsTestCase
+hoistSubtermsTestCaseWithPredicate original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+inferenceFailureTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.InferenceFailureTestCase
+inferenceFailureTestCase input =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)}]}))
+
+inferenceFailureTestCaseInput :: Phantoms.TTerm Testing.InferenceFailureTestCase -> Phantoms.TTerm Core.Term
+inferenceFailureTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inferenceFailureTestCaseWithInput :: Phantoms.TTerm Testing.InferenceFailureTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.InferenceFailureTestCase
+inferenceFailureTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+inferenceTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm Testing.InferenceTestCase
+inferenceTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+inferenceTestCaseInput :: Phantoms.TTerm Testing.InferenceTestCase -> Phantoms.TTerm Core.Term
+inferenceTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inferenceTestCaseOutput :: Phantoms.TTerm Testing.InferenceTestCase -> Phantoms.TTerm Core.TypeScheme
+inferenceTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inferenceTestCaseWithInput :: Phantoms.TTerm Testing.InferenceTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.InferenceTestCase
+inferenceTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+inferenceTestCaseWithOutput :: Phantoms.TTerm Testing.InferenceTestCase -> Phantoms.TTerm Core.TypeScheme -> Phantoms.TTerm Testing.InferenceTestCase
+inferenceTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+joinTypesTestCase :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm (Either () [Typing.TypeConstraint]) -> Phantoms.TTerm Testing.JoinTypesTestCase
+joinTypesTestCase left right expected =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm left)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm right)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm expected)}]}))
+
+joinTypesTestCaseExpected :: Phantoms.TTerm Testing.JoinTypesTestCase -> Phantoms.TTerm (Either () [Typing.TypeConstraint])
+joinTypesTestCaseExpected x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+        Core.projectionField = (Core.Name "expected")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+joinTypesTestCaseLeft :: Phantoms.TTerm Testing.JoinTypesTestCase -> Phantoms.TTerm Core.Type
+joinTypesTestCaseLeft x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+        Core.projectionField = (Core.Name "left")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+joinTypesTestCaseRight :: Phantoms.TTerm Testing.JoinTypesTestCase -> Phantoms.TTerm Core.Type
+joinTypesTestCaseRight x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+        Core.projectionField = (Core.Name "right")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+joinTypesTestCaseWithExpected :: Phantoms.TTerm Testing.JoinTypesTestCase -> Phantoms.TTerm (Either () [Typing.TypeConstraint]) -> Phantoms.TTerm Testing.JoinTypesTestCase
+joinTypesTestCaseWithExpected original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+joinTypesTestCaseWithLeft :: Phantoms.TTerm Testing.JoinTypesTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.JoinTypesTestCase
+joinTypesTestCaseWithLeft original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+joinTypesTestCaseWithRight :: Phantoms.TTerm Testing.JoinTypesTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.JoinTypesTestCase
+joinTypesTestCaseWithRight original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+jsonDecodeTestCase :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Model.Value -> Phantoms.TTerm (Either String Core.Term) -> Phantoms.TTerm Testing.JsonDecodeTestCase
+jsonDecodeTestCase type_ json expected =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "json"),
+          Core.fieldTerm = (Phantoms.unTTerm json)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm expected)}]}))
+
+jsonDecodeTestCaseExpected :: Phantoms.TTerm Testing.JsonDecodeTestCase -> Phantoms.TTerm (Either String Core.Term)
+jsonDecodeTestCaseExpected x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+        Core.projectionField = (Core.Name "expected")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+jsonDecodeTestCaseJson :: Phantoms.TTerm Testing.JsonDecodeTestCase -> Phantoms.TTerm Model.Value
+jsonDecodeTestCaseJson x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+        Core.projectionField = (Core.Name "json")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+jsonDecodeTestCaseType :: Phantoms.TTerm Testing.JsonDecodeTestCase -> Phantoms.TTerm Core.Type
+jsonDecodeTestCaseType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+jsonDecodeTestCaseWithExpected :: Phantoms.TTerm Testing.JsonDecodeTestCase -> Phantoms.TTerm (Either String Core.Term) -> Phantoms.TTerm Testing.JsonDecodeTestCase
+jsonDecodeTestCaseWithExpected original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "json"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+              Core.projectionField = (Core.Name "json")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+jsonDecodeTestCaseWithJson :: Phantoms.TTerm Testing.JsonDecodeTestCase -> Phantoms.TTerm Model.Value -> Phantoms.TTerm Testing.JsonDecodeTestCase
+jsonDecodeTestCaseWithJson original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "json"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+jsonDecodeTestCaseWithType :: Phantoms.TTerm Testing.JsonDecodeTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.JsonDecodeTestCase
+jsonDecodeTestCaseWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "json"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+              Core.projectionField = (Core.Name "json")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+jsonEncodeTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm (Either String Model.Value) -> Phantoms.TTerm Testing.JsonEncodeTestCase
+jsonEncodeTestCase term expected =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm term)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm expected)}]}))
+
+jsonEncodeTestCaseExpected :: Phantoms.TTerm Testing.JsonEncodeTestCase -> Phantoms.TTerm (Either String Model.Value)
+jsonEncodeTestCaseExpected x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+        Core.projectionField = (Core.Name "expected")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+jsonEncodeTestCaseTerm :: Phantoms.TTerm Testing.JsonEncodeTestCase -> Phantoms.TTerm Core.Term
+jsonEncodeTestCaseTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+        Core.projectionField = (Core.Name "term")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+jsonEncodeTestCaseWithExpected :: Phantoms.TTerm Testing.JsonEncodeTestCase -> Phantoms.TTerm (Either String Model.Value) -> Phantoms.TTerm Testing.JsonEncodeTestCase
+jsonEncodeTestCaseWithExpected original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+jsonEncodeTestCaseWithTerm :: Phantoms.TTerm Testing.JsonEncodeTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.JsonEncodeTestCase
+jsonEncodeTestCaseWithTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+jsonRoundtripTestCase :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.JsonRoundtripTestCase
+jsonRoundtripTestCase type_ term =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm term)}]}))
+
+jsonRoundtripTestCaseTerm :: Phantoms.TTerm Testing.JsonRoundtripTestCase -> Phantoms.TTerm Core.Term
+jsonRoundtripTestCaseTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+        Core.projectionField = (Core.Name "term")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+jsonRoundtripTestCaseType :: Phantoms.TTerm Testing.JsonRoundtripTestCase -> Phantoms.TTerm Core.Type
+jsonRoundtripTestCaseType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+jsonRoundtripTestCaseWithTerm :: Phantoms.TTerm Testing.JsonRoundtripTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.JsonRoundtripTestCase
+jsonRoundtripTestCaseWithTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+jsonRoundtripTestCaseWithType :: Phantoms.TTerm Testing.JsonRoundtripTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.JsonRoundtripTestCase
+jsonRoundtripTestCaseWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+liftLambdaAboveLetTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.LiftLambdaAboveLetTestCase
+liftLambdaAboveLetTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+liftLambdaAboveLetTestCaseInput :: Phantoms.TTerm Testing.LiftLambdaAboveLetTestCase -> Phantoms.TTerm Core.Term
+liftLambdaAboveLetTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+liftLambdaAboveLetTestCaseOutput :: Phantoms.TTerm Testing.LiftLambdaAboveLetTestCase -> Phantoms.TTerm Core.Term
+liftLambdaAboveLetTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+liftLambdaAboveLetTestCaseWithInput :: Phantoms.TTerm Testing.LiftLambdaAboveLetTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.LiftLambdaAboveLetTestCase
+liftLambdaAboveLetTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+liftLambdaAboveLetTestCaseWithOutput :: Phantoms.TTerm Testing.LiftLambdaAboveLetTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.LiftLambdaAboveLetTestCase
+liftLambdaAboveLetTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+normalizeTypeVariablesTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.NormalizeTypeVariablesTestCase
+normalizeTypeVariablesTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+normalizeTypeVariablesTestCaseInput :: Phantoms.TTerm Testing.NormalizeTypeVariablesTestCase -> Phantoms.TTerm Core.Term
+normalizeTypeVariablesTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+normalizeTypeVariablesTestCaseOutput :: Phantoms.TTerm Testing.NormalizeTypeVariablesTestCase -> Phantoms.TTerm Core.Term
+normalizeTypeVariablesTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+normalizeTypeVariablesTestCaseWithInput :: Phantoms.TTerm Testing.NormalizeTypeVariablesTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.NormalizeTypeVariablesTestCase
+normalizeTypeVariablesTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+normalizeTypeVariablesTestCaseWithOutput :: Phantoms.TTerm Testing.NormalizeTypeVariablesTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.NormalizeTypeVariablesTestCase
+normalizeTypeVariablesTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+parserTestCase :: Phantoms.TTerm String -> Phantoms.TTerm (Parsing.ParseResult a) -> Phantoms.TTerm (Testing.ParserTestCase a)
+parserTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+parserTestCaseInput :: Phantoms.TTerm (Testing.ParserTestCase a) -> Phantoms.TTerm String
+parserTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+parserTestCaseOutput :: Phantoms.TTerm (Testing.ParserTestCase a) -> Phantoms.TTerm (Parsing.ParseResult a)
+parserTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+parserTestCaseWithInput :: Phantoms.TTerm (Testing.ParserTestCase a) -> Phantoms.TTerm String -> Phantoms.TTerm (Testing.ParserTestCase a)
+parserTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+parserTestCaseWithOutput :: Phantoms.TTerm (Testing.ParserTestCase a) -> Phantoms.TTerm (Parsing.ParseResult a) -> Phantoms.TTerm (Testing.ParserTestCase a)
+parserTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+rewriteTermTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.TermRewriter -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.RewriteTermTestCase
+rewriteTermTestCase input rewriter output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (Phantoms.unTTerm rewriter)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+rewriteTermTestCaseInput :: Phantoms.TTerm Testing.RewriteTermTestCase -> Phantoms.TTerm Core.Term
+rewriteTermTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+rewriteTermTestCaseOutput :: Phantoms.TTerm Testing.RewriteTermTestCase -> Phantoms.TTerm Core.Term
+rewriteTermTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+rewriteTermTestCaseRewriter :: Phantoms.TTerm Testing.RewriteTermTestCase -> Phantoms.TTerm Testing.TermRewriter
+rewriteTermTestCaseRewriter x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+        Core.projectionField = (Core.Name "rewriter")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+rewriteTermTestCaseWithInput :: Phantoms.TTerm Testing.RewriteTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.RewriteTermTestCase
+rewriteTermTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+              Core.projectionField = (Core.Name "rewriter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+rewriteTermTestCaseWithOutput :: Phantoms.TTerm Testing.RewriteTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.RewriteTermTestCase
+rewriteTermTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+              Core.projectionField = (Core.Name "rewriter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+rewriteTermTestCaseWithRewriter :: Phantoms.TTerm Testing.RewriteTermTestCase -> Phantoms.TTerm Testing.TermRewriter -> Phantoms.TTerm Testing.RewriteTermTestCase
+rewriteTermTestCaseWithRewriter original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+rewriteTypeTestCase :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.TypeRewriter -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.RewriteTypeTestCase
+rewriteTypeTestCase input rewriter output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (Phantoms.unTTerm rewriter)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+rewriteTypeTestCaseInput :: Phantoms.TTerm Testing.RewriteTypeTestCase -> Phantoms.TTerm Core.Type
+rewriteTypeTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+rewriteTypeTestCaseOutput :: Phantoms.TTerm Testing.RewriteTypeTestCase -> Phantoms.TTerm Core.Type
+rewriteTypeTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+rewriteTypeTestCaseRewriter :: Phantoms.TTerm Testing.RewriteTypeTestCase -> Phantoms.TTerm Testing.TypeRewriter
+rewriteTypeTestCaseRewriter x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+        Core.projectionField = (Core.Name "rewriter")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+rewriteTypeTestCaseWithInput :: Phantoms.TTerm Testing.RewriteTypeTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.RewriteTypeTestCase
+rewriteTypeTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+              Core.projectionField = (Core.Name "rewriter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+rewriteTypeTestCaseWithOutput :: Phantoms.TTerm Testing.RewriteTypeTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.RewriteTypeTestCase
+rewriteTypeTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+              Core.projectionField = (Core.Name "rewriter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+rewriteTypeTestCaseWithRewriter :: Phantoms.TTerm Testing.RewriteTypeTestCase -> Phantoms.TTerm Testing.TypeRewriter -> Phantoms.TTerm Testing.RewriteTypeTestCase
+rewriteTypeTestCaseWithRewriter original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+serializationTestCase :: Phantoms.TTerm Ast.Expr -> Phantoms.TTerm String -> Phantoms.TTerm Testing.SerializationTestCase
+serializationTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+serializationTestCaseInput :: Phantoms.TTerm Testing.SerializationTestCase -> Phantoms.TTerm Ast.Expr
+serializationTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+serializationTestCaseOutput :: Phantoms.TTerm Testing.SerializationTestCase -> Phantoms.TTerm String
+serializationTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+serializationTestCaseWithInput :: Phantoms.TTerm Testing.SerializationTestCase -> Phantoms.TTerm Ast.Expr -> Phantoms.TTerm Testing.SerializationTestCase
+serializationTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+serializationTestCaseWithOutput :: Phantoms.TTerm Testing.SerializationTestCase -> Phantoms.TTerm String -> Phantoms.TTerm Testing.SerializationTestCase
+serializationTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+simplifyTermTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.SimplifyTermTestCase
+simplifyTermTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+simplifyTermTestCaseInput :: Phantoms.TTerm Testing.SimplifyTermTestCase -> Phantoms.TTerm Core.Term
+simplifyTermTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+simplifyTermTestCaseOutput :: Phantoms.TTerm Testing.SimplifyTermTestCase -> Phantoms.TTerm Core.Term
+simplifyTermTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+simplifyTermTestCaseWithInput :: Phantoms.TTerm Testing.SimplifyTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.SimplifyTermTestCase
+simplifyTermTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+simplifyTermTestCaseWithOutput :: Phantoms.TTerm Testing.SimplifyTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.SimplifyTermTestCase
+simplifyTermTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+substInTypeTestCase :: Phantoms.TTerm [(Core.Name, Core.Type)] -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.SubstInTypeTestCase
+substInTypeTestCase substitution input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "substitution"),
+          Core.fieldTerm = (Phantoms.unTTerm substitution)},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+substInTypeTestCaseInput :: Phantoms.TTerm Testing.SubstInTypeTestCase -> Phantoms.TTerm Core.Type
+substInTypeTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+substInTypeTestCaseOutput :: Phantoms.TTerm Testing.SubstInTypeTestCase -> Phantoms.TTerm Core.Type
+substInTypeTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+substInTypeTestCaseSubstitution :: Phantoms.TTerm Testing.SubstInTypeTestCase -> Phantoms.TTerm [(Core.Name, Core.Type)]
+substInTypeTestCaseSubstitution x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+        Core.projectionField = (Core.Name "substitution")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+substInTypeTestCaseWithInput :: Phantoms.TTerm Testing.SubstInTypeTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.SubstInTypeTestCase
+substInTypeTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "substitution"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+              Core.projectionField = (Core.Name "substitution")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+substInTypeTestCaseWithOutput :: Phantoms.TTerm Testing.SubstInTypeTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.SubstInTypeTestCase
+substInTypeTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "substitution"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+              Core.projectionField = (Core.Name "substitution")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+substInTypeTestCaseWithSubstitution :: Phantoms.TTerm Testing.SubstInTypeTestCase -> Phantoms.TTerm [(Core.Name, Core.Type)] -> Phantoms.TTerm Testing.SubstInTypeTestCase
+substInTypeTestCaseWithSubstitution original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "substitution"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+tag :: Phantoms.TTerm String -> Phantoms.TTerm Testing.Tag
+tag x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.testing.Tag"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+termRewriterReplaceFooWithBar :: Phantoms.TTerm Testing.TermRewriter
+termRewriterReplaceFooWithBar =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "replaceFooWithBar"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termRewriterReplaceInt32WithInt64 :: Phantoms.TTerm Testing.TermRewriter
+termRewriterReplaceInt32WithInt64 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "replaceInt32WithInt64"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+testCaseAlphaConversion :: Phantoms.TTerm Testing.AlphaConversionTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseAlphaConversion x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "alphaConversion"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseCaseConversion :: Phantoms.TTerm Testing.CaseConversionTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseCaseConversion x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "caseConversion"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseDeannotateTerm :: Phantoms.TTerm Testing.DeannotateTermTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseDeannotateTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "deannotateTerm"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseDeannotateType :: Phantoms.TTerm Testing.DeannotateTypeTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseDeannotateType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "deannotateType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseDelegatedEvaluation :: Phantoms.TTerm Testing.DelegatedEvaluationTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseDelegatedEvaluation x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "delegatedEvaluation"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseEtaExpansion :: Phantoms.TTerm Testing.EtaExpansionTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseEtaExpansion x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "etaExpansion"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseEvaluation :: Phantoms.TTerm Testing.EvaluationTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseEvaluation x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "evaluation"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseFlattenLetTerms :: Phantoms.TTerm Testing.FlattenLetTermsTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseFlattenLetTerms x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "flattenLetTerms"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseFoldOverTerm :: Phantoms.TTerm Testing.FoldOverTermTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseFoldOverTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "foldOverTerm"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseFreeVariables :: Phantoms.TTerm Testing.FreeVariablesTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseFreeVariables x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "freeVariables"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseHoistCaseStatements :: Phantoms.TTerm Testing.HoistCaseStatementsTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseHoistCaseStatements x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "hoistCaseStatements"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseHoistLetBindings :: Phantoms.TTerm Testing.HoistLetBindingsTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseHoistLetBindings x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "hoistLetBindings"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseHoistPolymorphicLetBindings :: Phantoms.TTerm Testing.HoistPolymorphicLetBindingsTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseHoistPolymorphicLetBindings x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "hoistPolymorphicLetBindings"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseHoistSubterms :: Phantoms.TTerm Testing.HoistSubtermsTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseHoistSubterms x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "hoistSubterms"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseInference :: Phantoms.TTerm Testing.InferenceTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseInference x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "inference"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseInferenceFailure :: Phantoms.TTerm Testing.InferenceFailureTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseInferenceFailure x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "inferenceFailure"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseJoinTypes :: Phantoms.TTerm Testing.JoinTypesTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseJoinTypes x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "joinTypes"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseJsonDecode :: Phantoms.TTerm Testing.JsonDecodeTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseJsonDecode x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "jsonDecode"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseJsonEncode :: Phantoms.TTerm Testing.JsonEncodeTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseJsonEncode x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "jsonEncode"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseJsonParser :: Phantoms.TTerm Testing.JsonParserTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseJsonParser x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "jsonParser"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseJsonRoundtrip :: Phantoms.TTerm Testing.JsonRoundtripTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseJsonRoundtrip x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "jsonRoundtrip"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseJsonWriter :: Phantoms.TTerm Testing.JsonWriterTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseJsonWriter x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "jsonWriter"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseLiftLambdaAboveLet :: Phantoms.TTerm Testing.LiftLambdaAboveLetTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseLiftLambdaAboveLet x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "liftLambdaAboveLet"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseNormalizeTypeVariables :: Phantoms.TTerm Testing.NormalizeTypeVariablesTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseNormalizeTypeVariables x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "normalizeTypeVariables"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseRewriteTerm :: Phantoms.TTerm Testing.RewriteTermTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseRewriteTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "rewriteTerm"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseRewriteType :: Phantoms.TTerm Testing.RewriteTypeTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseRewriteType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "rewriteType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseSerialization :: Phantoms.TTerm Testing.SerializationTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseSerialization x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "serialization"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseSimplifyTerm :: Phantoms.TTerm Testing.SimplifyTermTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseSimplifyTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "simplifyTerm"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseSubstInType :: Phantoms.TTerm Testing.SubstInTypeTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseSubstInType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "substInType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseTopologicalSort :: Phantoms.TTerm Testing.TopologicalSortTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseTopologicalSort x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "topologicalSort"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseTopologicalSortBindings :: Phantoms.TTerm Testing.TopologicalSortBindingsTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseTopologicalSortBindings x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "topologicalSortBindings"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseTopologicalSortSCC :: Phantoms.TTerm Testing.TopologicalSortSCCTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseTopologicalSortSCC x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "topologicalSortSCC"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseTypeChecking :: Phantoms.TTerm Testing.TypeCheckingTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseTypeChecking x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeChecking"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseTypeCheckingFailure :: Phantoms.TTerm Testing.TypeCheckingFailureTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseTypeCheckingFailure x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeCheckingFailure"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseTypeReduction :: Phantoms.TTerm Testing.TypeReductionTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseTypeReduction x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeReduction"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseUnifyTypes :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseUnifyTypes x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unifyTypes"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseUnshadowVariables :: Phantoms.TTerm Testing.UnshadowVariablesTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseUnshadowVariables x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unshadowVariables"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseValidateCoreTerm :: Phantoms.TTerm Testing.ValidateCoreTermTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseValidateCoreTerm x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "validateCoreTerm"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseVariableOccursInType :: Phantoms.TTerm Testing.VariableOccursInTypeTestCase -> Phantoms.TTerm Testing.TestCase
+testCaseVariableOccursInType x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "variableOccursInType"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
+
+testCaseWithMetadata :: Phantoms.TTerm String -> Phantoms.TTerm Testing.TestCase -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm [Testing.Tag] -> Phantoms.TTerm Testing.TestCaseWithMetadata
+testCaseWithMetadata name case_ description tags =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (Phantoms.unTTerm case_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm description)},
+        Core.Field {
+          Core.fieldName = (Core.Name "tags"),
+          Core.fieldTerm = (Phantoms.unTTerm tags)}]}))
+
+testCaseWithMetadataCase :: Phantoms.TTerm Testing.TestCaseWithMetadata -> Phantoms.TTerm Testing.TestCase
+testCaseWithMetadataCase x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+        Core.projectionField = (Core.Name "case")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCaseWithMetadataDescription :: Phantoms.TTerm Testing.TestCaseWithMetadata -> Phantoms.TTerm (Maybe String)
+testCaseWithMetadataDescription x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+        Core.projectionField = (Core.Name "description")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCaseWithMetadataName :: Phantoms.TTerm Testing.TestCaseWithMetadata -> Phantoms.TTerm String
+testCaseWithMetadataName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCaseWithMetadataTags :: Phantoms.TTerm Testing.TestCaseWithMetadata -> Phantoms.TTerm [Testing.Tag]
+testCaseWithMetadataTags x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+        Core.projectionField = (Core.Name "tags")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCaseWithMetadataWithCase :: Phantoms.TTerm Testing.TestCaseWithMetadata -> Phantoms.TTerm Testing.TestCase -> Phantoms.TTerm Testing.TestCaseWithMetadata
+testCaseWithMetadataWithCase original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "tags"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "tags")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCaseWithMetadataWithDescription :: Phantoms.TTerm Testing.TestCaseWithMetadata -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Testing.TestCaseWithMetadata
+testCaseWithMetadataWithDescription original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "case")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "tags"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "tags")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCaseWithMetadataWithName :: Phantoms.TTerm Testing.TestCaseWithMetadata -> Phantoms.TTerm String -> Phantoms.TTerm Testing.TestCaseWithMetadata
+testCaseWithMetadataWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "case")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "tags"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "tags")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCaseWithMetadataWithTags :: Phantoms.TTerm Testing.TestCaseWithMetadata -> Phantoms.TTerm [Testing.Tag] -> Phantoms.TTerm Testing.TestCaseWithMetadata
+testCaseWithMetadataWithTags original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "case")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "tags"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+testCodec :: Phantoms.TTerm Coders.LanguageName -> Phantoms.TTerm Module.FileExtension -> Phantoms.TTerm (Core.Term -> Graph.Graph -> Either String String) -> Phantoms.TTerm (Core.Type -> Graph.Graph -> Either String String) -> Phantoms.TTerm (String -> String) -> Phantoms.TTerm (Module.Namespace -> String) -> Phantoms.TTerm String -> Phantoms.TTerm String -> Phantoms.TTerm String -> Phantoms.TTerm String -> Phantoms.TTerm (S.Set Core.Name -> [String]) -> Phantoms.TTerm Testing.TestCodec
+testCodec language fileExtension encodeTerm encodeType formatTestName formatModuleName testCaseTemplate testGroupTemplate moduleTemplate importTemplate findImports =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Phantoms.unTTerm language)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Phantoms.unTTerm fileExtension)},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Phantoms.unTTerm encodeTerm)},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Phantoms.unTTerm encodeType)},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Phantoms.unTTerm formatTestName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Phantoms.unTTerm formatModuleName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Phantoms.unTTerm testCaseTemplate)},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Phantoms.unTTerm testGroupTemplate)},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Phantoms.unTTerm moduleTemplate)},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Phantoms.unTTerm importTemplate)},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Phantoms.unTTerm findImports)}]}))
+
+testCodecEncodeTerm :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (Core.Term -> Graph.Graph -> Either String String)
+testCodecEncodeTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "encodeTerm")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecEncodeType :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (Core.Type -> Graph.Graph -> Either String String)
+testCodecEncodeType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "encodeType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecFileExtension :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm Module.FileExtension
+testCodecFileExtension x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "fileExtension")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecFindImports :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (S.Set Core.Name -> [String])
+testCodecFindImports x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "findImports")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecFormatModuleName :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (Module.Namespace -> String)
+testCodecFormatModuleName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "formatModuleName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecFormatTestName :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (String -> String)
+testCodecFormatTestName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "formatTestName")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecImportTemplate :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm String
+testCodecImportTemplate x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "importTemplate")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecLanguage :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm Coders.LanguageName
+testCodecLanguage x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "language")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecModuleTemplate :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm String
+testCodecModuleTemplate x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "moduleTemplate")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecTestCaseTemplate :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm String
+testCodecTestCaseTemplate x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "testCaseTemplate")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecTestGroupTemplate :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm String
+testCodecTestGroupTemplate x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+        Core.projectionField = (Core.Name "testGroupTemplate")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testCodecWithEncodeTerm :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (Core.Term -> Graph.Graph -> Either String String) -> Phantoms.TTerm Testing.TestCodec
+testCodecWithEncodeTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithEncodeType :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (Core.Type -> Graph.Graph -> Either String String) -> Phantoms.TTerm Testing.TestCodec
+testCodecWithEncodeType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithFileExtension :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm Module.FileExtension -> Phantoms.TTerm Testing.TestCodec
+testCodecWithFileExtension original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithFindImports :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (S.Set Core.Name -> [String]) -> Phantoms.TTerm Testing.TestCodec
+testCodecWithFindImports original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+testCodecWithFormatModuleName :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (Module.Namespace -> String) -> Phantoms.TTerm Testing.TestCodec
+testCodecWithFormatModuleName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithFormatTestName :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm (String -> String) -> Phantoms.TTerm Testing.TestCodec
+testCodecWithFormatTestName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithImportTemplate :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm String -> Phantoms.TTerm Testing.TestCodec
+testCodecWithImportTemplate original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithLanguage :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm Coders.LanguageName -> Phantoms.TTerm Testing.TestCodec
+testCodecWithLanguage original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithModuleTemplate :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm String -> Phantoms.TTerm Testing.TestCodec
+testCodecWithModuleTemplate original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithTestCaseTemplate :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm String -> Phantoms.TTerm Testing.TestCodec
+testCodecWithTestCaseTemplate original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testGroupTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testCodecWithTestGroupTemplate :: Phantoms.TTerm Testing.TestCodec -> Phantoms.TTerm String -> Phantoms.TTerm Testing.TestCodec
+testCodecWithTestGroupTemplate original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCodec"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "language"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "language")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fileExtension"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "fileExtension")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "encodeType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "encodeType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatTestName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatTestName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "formatModuleName"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "formatModuleName")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testCaseTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "testCaseTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "testGroupTemplate"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "moduleTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "moduleTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "importTemplate"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "importTemplate")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "findImports"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestCodec"),
+              Core.projectionField = (Core.Name "findImports")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testGenerator :: Phantoms.TTerm (Module.Module -> Graph.Graph -> Either String (Module.Namespaces a)) -> Phantoms.TTerm (Module.Namespaces a -> Testing.TestCodec) -> Phantoms.TTerm (Module.Module -> Testing.TestGroup -> Graph.Graph -> Either String (String, String)) -> Phantoms.TTerm (Maybe (String -> [Module.Module] -> (String, String))) -> Phantoms.TTerm (Testing.TestGenerator a)
+testGenerator namespacesForModule createCodec generateTestFile aggregatorFile =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGenerator"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespacesForModule"),
+          Core.fieldTerm = (Phantoms.unTTerm namespacesForModule)},
+        Core.Field {
+          Core.fieldName = (Core.Name "createCodec"),
+          Core.fieldTerm = (Phantoms.unTTerm createCodec)},
+        Core.Field {
+          Core.fieldName = (Core.Name "generateTestFile"),
+          Core.fieldTerm = (Phantoms.unTTerm generateTestFile)},
+        Core.Field {
+          Core.fieldName = (Core.Name "aggregatorFile"),
+          Core.fieldTerm = (Phantoms.unTTerm aggregatorFile)}]}))
+
+testGeneratorAggregatorFile :: Phantoms.TTerm (Testing.TestGenerator a) -> Phantoms.TTerm (Maybe (String -> [Module.Module] -> (String, String)))
+testGeneratorAggregatorFile x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+        Core.projectionField = (Core.Name "aggregatorFile")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testGeneratorCreateCodec :: Phantoms.TTerm (Testing.TestGenerator a) -> Phantoms.TTerm (Module.Namespaces a -> Testing.TestCodec)
+testGeneratorCreateCodec x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+        Core.projectionField = (Core.Name "createCodec")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testGeneratorGenerateTestFile :: Phantoms.TTerm (Testing.TestGenerator a) -> Phantoms.TTerm (Module.Module -> Testing.TestGroup -> Graph.Graph -> Either String (String, String))
+testGeneratorGenerateTestFile x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+        Core.projectionField = (Core.Name "generateTestFile")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testGeneratorNamespacesForModule :: Phantoms.TTerm (Testing.TestGenerator a) -> Phantoms.TTerm (Module.Module -> Graph.Graph -> Either String (Module.Namespaces a))
+testGeneratorNamespacesForModule x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+        Core.projectionField = (Core.Name "namespacesForModule")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testGeneratorWithAggregatorFile :: Phantoms.TTerm (Testing.TestGenerator a) -> Phantoms.TTerm (Maybe (String -> [Module.Module] -> (String, String))) -> Phantoms.TTerm (Testing.TestGenerator a)
+testGeneratorWithAggregatorFile original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGenerator"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespacesForModule"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "namespacesForModule")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "createCodec"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "createCodec")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "generateTestFile"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "generateTestFile")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "aggregatorFile"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+testGeneratorWithCreateCodec :: Phantoms.TTerm (Testing.TestGenerator a) -> Phantoms.TTerm (Module.Namespaces a -> Testing.TestCodec) -> Phantoms.TTerm (Testing.TestGenerator a)
+testGeneratorWithCreateCodec original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGenerator"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespacesForModule"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "namespacesForModule")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "createCodec"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "generateTestFile"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "generateTestFile")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "aggregatorFile"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "aggregatorFile")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testGeneratorWithGenerateTestFile :: Phantoms.TTerm (Testing.TestGenerator a) -> Phantoms.TTerm (Module.Module -> Testing.TestGroup -> Graph.Graph -> Either String (String, String)) -> Phantoms.TTerm (Testing.TestGenerator a)
+testGeneratorWithGenerateTestFile original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGenerator"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespacesForModule"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "namespacesForModule")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "createCodec"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "createCodec")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "generateTestFile"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "aggregatorFile"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "aggregatorFile")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testGeneratorWithNamespacesForModule :: Phantoms.TTerm (Testing.TestGenerator a) -> Phantoms.TTerm (Module.Module -> Graph.Graph -> Either String (Module.Namespaces a)) -> Phantoms.TTerm (Testing.TestGenerator a)
+testGeneratorWithNamespacesForModule original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGenerator"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespacesForModule"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "createCodec"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "createCodec")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "generateTestFile"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "generateTestFile")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "aggregatorFile"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGenerator"),
+              Core.projectionField = (Core.Name "aggregatorFile")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testGroup :: Phantoms.TTerm String -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm [Testing.TestGroup] -> Phantoms.TTerm [Testing.TestCaseWithMetadata] -> Phantoms.TTerm Testing.TestGroup
+testGroup name description subgroups cases =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm name)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm description)},
+        Core.Field {
+          Core.fieldName = (Core.Name "subgroups"),
+          Core.fieldTerm = (Phantoms.unTTerm subgroups)},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Phantoms.unTTerm cases)}]}))
+
+testGroupCases :: Phantoms.TTerm Testing.TestGroup -> Phantoms.TTerm [Testing.TestCaseWithMetadata]
+testGroupCases x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+        Core.projectionField = (Core.Name "cases")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testGroupDescription :: Phantoms.TTerm Testing.TestGroup -> Phantoms.TTerm (Maybe String)
+testGroupDescription x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+        Core.projectionField = (Core.Name "description")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testGroupName :: Phantoms.TTerm Testing.TestGroup -> Phantoms.TTerm String
+testGroupName x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+        Core.projectionField = (Core.Name "name")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testGroupSubgroups :: Phantoms.TTerm Testing.TestGroup -> Phantoms.TTerm [Testing.TestGroup]
+testGroupSubgroups x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+        Core.projectionField = (Core.Name "subgroups")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+testGroupWithCases :: Phantoms.TTerm Testing.TestGroup -> Phantoms.TTerm [Testing.TestCaseWithMetadata] -> Phantoms.TTerm Testing.TestGroup
+testGroupWithCases original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subgroups"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "subgroups")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+testGroupWithDescription :: Phantoms.TTerm Testing.TestGroup -> Phantoms.TTerm (Maybe String) -> Phantoms.TTerm Testing.TestGroup
+testGroupWithDescription original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "subgroups"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "subgroups")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "cases")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testGroupWithName :: Phantoms.TTerm Testing.TestGroup -> Phantoms.TTerm String -> Phantoms.TTerm Testing.TestGroup
+testGroupWithName original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subgroups"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "subgroups")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "cases")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+testGroupWithSubgroups :: Phantoms.TTerm Testing.TestGroup -> Phantoms.TTerm [Testing.TestGroup] -> Phantoms.TTerm Testing.TestGroup
+testGroupWithSubgroups original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "name")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "description")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subgroups"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+              Core.projectionField = (Core.Name "cases")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+topologicalSortBindingsTestCase :: Phantoms.TTerm [(Core.Name, Core.Term)] -> Phantoms.TTerm [[(Core.Name, Core.Term)]] -> Phantoms.TTerm Testing.TopologicalSortBindingsTestCase
+topologicalSortBindingsTestCase bindings expected =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm bindings)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm expected)}]}))
+
+topologicalSortBindingsTestCaseBindings :: Phantoms.TTerm Testing.TopologicalSortBindingsTestCase -> Phantoms.TTerm [(Core.Name, Core.Term)]
+topologicalSortBindingsTestCaseBindings x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+        Core.projectionField = (Core.Name "bindings")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+topologicalSortBindingsTestCaseExpected :: Phantoms.TTerm Testing.TopologicalSortBindingsTestCase -> Phantoms.TTerm [[(Core.Name, Core.Term)]]
+topologicalSortBindingsTestCaseExpected x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+        Core.projectionField = (Core.Name "expected")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+topologicalSortBindingsTestCaseWithBindings :: Phantoms.TTerm Testing.TopologicalSortBindingsTestCase -> Phantoms.TTerm [(Core.Name, Core.Term)] -> Phantoms.TTerm Testing.TopologicalSortBindingsTestCase
+topologicalSortBindingsTestCaseWithBindings original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+topologicalSortBindingsTestCaseWithExpected :: Phantoms.TTerm Testing.TopologicalSortBindingsTestCase -> Phantoms.TTerm [[(Core.Name, Core.Term)]] -> Phantoms.TTerm Testing.TopologicalSortBindingsTestCase
+topologicalSortBindingsTestCaseWithExpected original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+topologicalSortSCCTestCase :: Phantoms.TTerm [(Int, [Int])] -> Phantoms.TTerm [[Int]] -> Phantoms.TTerm Testing.TopologicalSortSCCTestCase
+topologicalSortSCCTestCase adjacencyList expected =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "adjacencyList"),
+          Core.fieldTerm = (Phantoms.unTTerm adjacencyList)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm expected)}]}))
+
+topologicalSortSCCTestCaseAdjacencyList :: Phantoms.TTerm Testing.TopologicalSortSCCTestCase -> Phantoms.TTerm [(Int, [Int])]
+topologicalSortSCCTestCaseAdjacencyList x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+        Core.projectionField = (Core.Name "adjacencyList")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+topologicalSortSCCTestCaseExpected :: Phantoms.TTerm Testing.TopologicalSortSCCTestCase -> Phantoms.TTerm [[Int]]
+topologicalSortSCCTestCaseExpected x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+        Core.projectionField = (Core.Name "expected")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+topologicalSortSCCTestCaseWithAdjacencyList :: Phantoms.TTerm Testing.TopologicalSortSCCTestCase -> Phantoms.TTerm [(Int, [Int])] -> Phantoms.TTerm Testing.TopologicalSortSCCTestCase
+topologicalSortSCCTestCaseWithAdjacencyList original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "adjacencyList"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+topologicalSortSCCTestCaseWithExpected :: Phantoms.TTerm Testing.TopologicalSortSCCTestCase -> Phantoms.TTerm [[Int]] -> Phantoms.TTerm Testing.TopologicalSortSCCTestCase
+topologicalSortSCCTestCaseWithExpected original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "adjacencyList"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+              Core.projectionField = (Core.Name "adjacencyList")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+topologicalSortTestCase :: Phantoms.TTerm [(Int, [Int])] -> Phantoms.TTerm (Either [[Int]] [Int]) -> Phantoms.TTerm Testing.TopologicalSortTestCase
+topologicalSortTestCase adjacencyList expected =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "adjacencyList"),
+          Core.fieldTerm = (Phantoms.unTTerm adjacencyList)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm expected)}]}))
+
+topologicalSortTestCaseAdjacencyList :: Phantoms.TTerm Testing.TopologicalSortTestCase -> Phantoms.TTerm [(Int, [Int])]
+topologicalSortTestCaseAdjacencyList x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+        Core.projectionField = (Core.Name "adjacencyList")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+topologicalSortTestCaseExpected :: Phantoms.TTerm Testing.TopologicalSortTestCase -> Phantoms.TTerm (Either [[Int]] [Int])
+topologicalSortTestCaseExpected x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+        Core.projectionField = (Core.Name "expected")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+topologicalSortTestCaseWithAdjacencyList :: Phantoms.TTerm Testing.TopologicalSortTestCase -> Phantoms.TTerm [(Int, [Int])] -> Phantoms.TTerm Testing.TopologicalSortTestCase
+topologicalSortTestCaseWithAdjacencyList original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "adjacencyList"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+topologicalSortTestCaseWithExpected :: Phantoms.TTerm Testing.TopologicalSortTestCase -> Phantoms.TTerm (Either [[Int]] [Int]) -> Phantoms.TTerm Testing.TopologicalSortTestCase
+topologicalSortTestCaseWithExpected original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "adjacencyList"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+              Core.projectionField = (Core.Name "adjacencyList")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeCheckingFailureTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.TypeCheckingFailureTestCase
+typeCheckingFailureTestCase input =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)}]}))
+
+typeCheckingFailureTestCaseInput :: Phantoms.TTerm Testing.TypeCheckingFailureTestCase -> Phantoms.TTerm Core.Term
+typeCheckingFailureTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeCheckingFailureTestCaseWithInput :: Phantoms.TTerm Testing.TypeCheckingFailureTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.TypeCheckingFailureTestCase
+typeCheckingFailureTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeCheckingTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.TypeCheckingTestCase
+typeCheckingTestCase input outputTerm outputType =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputTerm"),
+          Core.fieldTerm = (Phantoms.unTTerm outputTerm)},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputType"),
+          Core.fieldTerm = (Phantoms.unTTerm outputType)}]}))
+
+typeCheckingTestCaseInput :: Phantoms.TTerm Testing.TypeCheckingTestCase -> Phantoms.TTerm Core.Term
+typeCheckingTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeCheckingTestCaseOutputTerm :: Phantoms.TTerm Testing.TypeCheckingTestCase -> Phantoms.TTerm Core.Term
+typeCheckingTestCaseOutputTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+        Core.projectionField = (Core.Name "outputTerm")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeCheckingTestCaseOutputType :: Phantoms.TTerm Testing.TypeCheckingTestCase -> Phantoms.TTerm Core.Type
+typeCheckingTestCaseOutputType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+        Core.projectionField = (Core.Name "outputType")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeCheckingTestCaseWithInput :: Phantoms.TTerm Testing.TypeCheckingTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.TypeCheckingTestCase
+typeCheckingTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+              Core.projectionField = (Core.Name "outputTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+              Core.projectionField = (Core.Name "outputType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeCheckingTestCaseWithOutputTerm :: Phantoms.TTerm Testing.TypeCheckingTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.TypeCheckingTestCase
+typeCheckingTestCaseWithOutputTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputTerm"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputType"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+              Core.projectionField = (Core.Name "outputType")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeCheckingTestCaseWithOutputType :: Phantoms.TTerm Testing.TypeCheckingTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.TypeCheckingTestCase
+typeCheckingTestCaseWithOutputType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputTerm"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+              Core.projectionField = (Core.Name "outputTerm")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputType"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeReductionTestCase :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.TypeReductionTestCase
+typeReductionTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+typeReductionTestCaseInput :: Phantoms.TTerm Testing.TypeReductionTestCase -> Phantoms.TTerm Core.Type
+typeReductionTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeReductionTestCaseOutput :: Phantoms.TTerm Testing.TypeReductionTestCase -> Phantoms.TTerm Core.Type
+typeReductionTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeReductionTestCaseWithInput :: Phantoms.TTerm Testing.TypeReductionTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.TypeReductionTestCase
+typeReductionTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeReductionTestCaseWithOutput :: Phantoms.TTerm Testing.TypeReductionTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.TypeReductionTestCase
+typeReductionTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeRewriterReplaceStringWithInt32 :: Phantoms.TTerm Testing.TypeRewriter
+typeRewriterReplaceStringWithInt32 =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.testing.TypeRewriter"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "replaceStringWithInt32"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+unTag :: Phantoms.TTerm Testing.Tag -> Phantoms.TTerm String
+unTag x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.testing.Tag")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unifyTypesTestCase :: Phantoms.TTerm [Core.Name] -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm (Either String Typing.TypeSubst) -> Phantoms.TTerm Testing.UnifyTypesTestCase
+unifyTypesTestCase schemaTypes left right expected =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm schemaTypes)},
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm left)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm right)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm expected)}]}))
+
+unifyTypesTestCaseExpected :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm (Either String Typing.TypeSubst)
+unifyTypesTestCaseExpected x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+        Core.projectionField = (Core.Name "expected")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unifyTypesTestCaseLeft :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm Core.Type
+unifyTypesTestCaseLeft x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+        Core.projectionField = (Core.Name "left")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unifyTypesTestCaseRight :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm Core.Type
+unifyTypesTestCaseRight x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+        Core.projectionField = (Core.Name "right")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unifyTypesTestCaseSchemaTypes :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm [Core.Name]
+unifyTypesTestCaseSchemaTypes x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+        Core.projectionField = (Core.Name "schemaTypes")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unifyTypesTestCaseWithExpected :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm (Either String Typing.TypeSubst) -> Phantoms.TTerm Testing.UnifyTypesTestCase
+unifyTypesTestCaseWithExpected original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+unifyTypesTestCaseWithLeft :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.UnifyTypesTestCase
+unifyTypesTestCaseWithLeft original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unifyTypesTestCaseWithRight :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.UnifyTypesTestCase
+unifyTypesTestCaseWithRight original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "schemaTypes")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unifyTypesTestCaseWithSchemaTypes :: Phantoms.TTerm Testing.UnifyTypesTestCase -> Phantoms.TTerm [Core.Name] -> Phantoms.TTerm Testing.UnifyTypesTestCase
+unifyTypesTestCaseWithSchemaTypes original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unshadowVariablesTestCase :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.UnshadowVariablesTestCase
+unshadowVariablesTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+unshadowVariablesTestCaseInput :: Phantoms.TTerm Testing.UnshadowVariablesTestCase -> Phantoms.TTerm Core.Term
+unshadowVariablesTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unshadowVariablesTestCaseOutput :: Phantoms.TTerm Testing.UnshadowVariablesTestCase -> Phantoms.TTerm Core.Term
+unshadowVariablesTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unshadowVariablesTestCaseWithInput :: Phantoms.TTerm Testing.UnshadowVariablesTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.UnshadowVariablesTestCase
+unshadowVariablesTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+unshadowVariablesTestCaseWithOutput :: Phantoms.TTerm Testing.UnshadowVariablesTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.UnshadowVariablesTestCase
+unshadowVariablesTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+validateCoreTermTestCase :: Phantoms.TTerm Bool -> Phantoms.TTerm Core.Term -> Phantoms.TTerm (Maybe Core_.InvalidTermError) -> Phantoms.TTerm Testing.ValidateCoreTermTestCase
+validateCoreTermTestCase typed input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typed"),
+          Core.fieldTerm = (Phantoms.unTTerm typed)},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+validateCoreTermTestCaseInput :: Phantoms.TTerm Testing.ValidateCoreTermTestCase -> Phantoms.TTerm Core.Term
+validateCoreTermTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+validateCoreTermTestCaseOutput :: Phantoms.TTerm Testing.ValidateCoreTermTestCase -> Phantoms.TTerm (Maybe Core_.InvalidTermError)
+validateCoreTermTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+validateCoreTermTestCaseTyped :: Phantoms.TTerm Testing.ValidateCoreTermTestCase -> Phantoms.TTerm Bool
+validateCoreTermTestCaseTyped x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+        Core.projectionField = (Core.Name "typed")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+validateCoreTermTestCaseWithInput :: Phantoms.TTerm Testing.ValidateCoreTermTestCase -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Testing.ValidateCoreTermTestCase
+validateCoreTermTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typed"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+              Core.projectionField = (Core.Name "typed")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+validateCoreTermTestCaseWithOutput :: Phantoms.TTerm Testing.ValidateCoreTermTestCase -> Phantoms.TTerm (Maybe Core_.InvalidTermError) -> Phantoms.TTerm Testing.ValidateCoreTermTestCase
+validateCoreTermTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typed"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+              Core.projectionField = (Core.Name "typed")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+validateCoreTermTestCaseWithTyped :: Phantoms.TTerm Testing.ValidateCoreTermTestCase -> Phantoms.TTerm Bool -> Phantoms.TTerm Testing.ValidateCoreTermTestCase
+validateCoreTermTestCaseWithTyped original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typed"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+variableOccursInTypeTestCase :: Phantoms.TTerm Core.Name -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Bool -> Phantoms.TTerm Testing.VariableOccursInTypeTestCase
+variableOccursInTypeTestCase variable type_ expected =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = (Phantoms.unTTerm variable)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm expected)}]}))
+
+variableOccursInTypeTestCaseExpected :: Phantoms.TTerm Testing.VariableOccursInTypeTestCase -> Phantoms.TTerm Bool
+variableOccursInTypeTestCaseExpected x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+        Core.projectionField = (Core.Name "expected")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+variableOccursInTypeTestCaseType :: Phantoms.TTerm Testing.VariableOccursInTypeTestCase -> Phantoms.TTerm Core.Type
+variableOccursInTypeTestCaseType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+variableOccursInTypeTestCaseVariable :: Phantoms.TTerm Testing.VariableOccursInTypeTestCase -> Phantoms.TTerm Core.Name
+variableOccursInTypeTestCaseVariable x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+        Core.projectionField = (Core.Name "variable")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+variableOccursInTypeTestCaseWithExpected :: Phantoms.TTerm Testing.VariableOccursInTypeTestCase -> Phantoms.TTerm Bool -> Phantoms.TTerm Testing.VariableOccursInTypeTestCase
+variableOccursInTypeTestCaseWithExpected original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+              Core.projectionField = (Core.Name "variable")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+variableOccursInTypeTestCaseWithType :: Phantoms.TTerm Testing.VariableOccursInTypeTestCase -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Testing.VariableOccursInTypeTestCase
+variableOccursInTypeTestCaseWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+              Core.projectionField = (Core.Name "variable")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+variableOccursInTypeTestCaseWithVariable :: Phantoms.TTerm Testing.VariableOccursInTypeTestCase -> Phantoms.TTerm Core.Name -> Phantoms.TTerm Testing.VariableOccursInTypeTestCase
+variableOccursInTypeTestCaseWithVariable original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+              Core.projectionField = (Core.Name "expected")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+writerTestCase :: Phantoms.TTerm a -> Phantoms.TTerm String -> Phantoms.TTerm (Testing.WriterTestCase a)
+writerTestCase input output =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm input)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm output)}]}))
+
+writerTestCaseInput :: Phantoms.TTerm (Testing.WriterTestCase a) -> Phantoms.TTerm a
+writerTestCaseInput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+        Core.projectionField = (Core.Name "input")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+writerTestCaseOutput :: Phantoms.TTerm (Testing.WriterTestCase a) -> Phantoms.TTerm String
+writerTestCaseOutput x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+        Core.projectionField = (Core.Name "output")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+writerTestCaseWithInput :: Phantoms.TTerm (Testing.WriterTestCase a) -> Phantoms.TTerm a -> Phantoms.TTerm (Testing.WriterTestCase a)
+writerTestCaseWithInput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+              Core.projectionField = (Core.Name "output")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+writerTestCaseWithOutput :: Phantoms.TTerm (Testing.WriterTestCase a) -> Phantoms.TTerm String -> Phantoms.TTerm (Testing.WriterTestCase a)
+writerTestCaseWithOutput original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+              Core.projectionField = (Core.Name "input")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Topology.hs b/src/gen-main/haskell/Hydra/Dsl/Topology.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Topology.hs
@@ -0,0 +1,411 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.topology
+
+module Hydra.Dsl.Topology where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Topology as Topology
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+orderingIsomorphism :: Phantoms.TTerm ([a] -> [a]) -> Phantoms.TTerm ([a] -> [a]) -> Phantoms.TTerm (Topology.OrderingIsomorphism a)
+orderingIsomorphism encode decode =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.OrderingIsomorphism"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Phantoms.unTTerm encode)},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Phantoms.unTTerm decode)}]}))
+
+orderingIsomorphismDecode :: Phantoms.TTerm (Topology.OrderingIsomorphism a) -> Phantoms.TTerm ([a] -> [a])
+orderingIsomorphismDecode x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.topology.OrderingIsomorphism"),
+        Core.projectionField = (Core.Name "decode")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+orderingIsomorphismEncode :: Phantoms.TTerm (Topology.OrderingIsomorphism a) -> Phantoms.TTerm ([a] -> [a])
+orderingIsomorphismEncode x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.topology.OrderingIsomorphism"),
+        Core.projectionField = (Core.Name "encode")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+orderingIsomorphismWithDecode :: Phantoms.TTerm (Topology.OrderingIsomorphism a) -> Phantoms.TTerm ([a] -> [a]) -> Phantoms.TTerm (Topology.OrderingIsomorphism a)
+orderingIsomorphismWithDecode original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.OrderingIsomorphism"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.OrderingIsomorphism"),
+              Core.projectionField = (Core.Name "encode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+orderingIsomorphismWithEncode :: Phantoms.TTerm (Topology.OrderingIsomorphism a) -> Phantoms.TTerm ([a] -> [a]) -> Phantoms.TTerm (Topology.OrderingIsomorphism a)
+orderingIsomorphismWithEncode original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.OrderingIsomorphism"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.OrderingIsomorphism"),
+              Core.projectionField = (Core.Name "decode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+tarjanState :: Phantoms.TTerm Int -> Phantoms.TTerm (M.Map Topology.Vertex Int) -> Phantoms.TTerm (M.Map Topology.Vertex Int) -> Phantoms.TTerm [Topology.Vertex] -> Phantoms.TTerm (S.Set Topology.Vertex) -> Phantoms.TTerm [[Topology.Vertex]] -> Phantoms.TTerm Topology.TarjanState
+tarjanState counter indices lowLinks stack onStack sccs =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "counter"),
+          Core.fieldTerm = (Phantoms.unTTerm counter)},
+        Core.Field {
+          Core.fieldName = (Core.Name "indices"),
+          Core.fieldTerm = (Phantoms.unTTerm indices)},
+        Core.Field {
+          Core.fieldName = (Core.Name "lowLinks"),
+          Core.fieldTerm = (Phantoms.unTTerm lowLinks)},
+        Core.Field {
+          Core.fieldName = (Core.Name "stack"),
+          Core.fieldTerm = (Phantoms.unTTerm stack)},
+        Core.Field {
+          Core.fieldName = (Core.Name "onStack"),
+          Core.fieldTerm = (Phantoms.unTTerm onStack)},
+        Core.Field {
+          Core.fieldName = (Core.Name "sccs"),
+          Core.fieldTerm = (Phantoms.unTTerm sccs)}]}))
+
+tarjanStateCounter :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm Int
+tarjanStateCounter x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+        Core.projectionField = (Core.Name "counter")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tarjanStateIndices :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm (M.Map Topology.Vertex Int)
+tarjanStateIndices x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+        Core.projectionField = (Core.Name "indices")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tarjanStateLowLinks :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm (M.Map Topology.Vertex Int)
+tarjanStateLowLinks x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+        Core.projectionField = (Core.Name "lowLinks")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tarjanStateOnStack :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm (S.Set Topology.Vertex)
+tarjanStateOnStack x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+        Core.projectionField = (Core.Name "onStack")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tarjanStateSccs :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm [[Topology.Vertex]]
+tarjanStateSccs x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+        Core.projectionField = (Core.Name "sccs")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tarjanStateStack :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm [Topology.Vertex]
+tarjanStateStack x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+        Core.projectionField = (Core.Name "stack")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+tarjanStateWithCounter :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm Int -> Phantoms.TTerm Topology.TarjanState
+tarjanStateWithCounter original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "counter"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "indices"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "indices")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lowLinks"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "lowLinks")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "stack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "stack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "onStack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "onStack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "sccs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "sccs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+tarjanStateWithIndices :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm (M.Map Topology.Vertex Int) -> Phantoms.TTerm Topology.TarjanState
+tarjanStateWithIndices original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "counter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "counter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "indices"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "lowLinks"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "lowLinks")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "stack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "stack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "onStack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "onStack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "sccs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "sccs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+tarjanStateWithLowLinks :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm (M.Map Topology.Vertex Int) -> Phantoms.TTerm Topology.TarjanState
+tarjanStateWithLowLinks original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "counter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "counter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "indices"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "indices")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lowLinks"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "stack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "stack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "onStack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "onStack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "sccs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "sccs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+tarjanStateWithOnStack :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm (S.Set Topology.Vertex) -> Phantoms.TTerm Topology.TarjanState
+tarjanStateWithOnStack original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "counter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "counter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "indices"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "indices")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lowLinks"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "lowLinks")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "stack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "stack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "onStack"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "sccs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "sccs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+tarjanStateWithSccs :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm [[Topology.Vertex]] -> Phantoms.TTerm Topology.TarjanState
+tarjanStateWithSccs original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "counter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "counter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "indices"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "indices")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lowLinks"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "lowLinks")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "stack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "stack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "onStack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "onStack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "sccs"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+tarjanStateWithStack :: Phantoms.TTerm Topology.TarjanState -> Phantoms.TTerm [Topology.Vertex] -> Phantoms.TTerm Topology.TarjanState
+tarjanStateWithStack original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "counter"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "counter")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "indices"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "indices")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lowLinks"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "lowLinks")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "stack"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "onStack"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "onStack")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "sccs"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+              Core.projectionField = (Core.Name "sccs")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Typing.hs b/src/gen-main/haskell/Hydra/Dsl/Typing.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Typing.hs
@@ -0,0 +1,834 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.typing
+
+module Hydra.Dsl.Typing where
+
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Typing as Typing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+functionStructure :: Phantoms.TTerm [Core.Name] -> Phantoms.TTerm [Core.Name] -> Phantoms.TTerm [Core.Binding] -> Phantoms.TTerm Core.Term -> Phantoms.TTerm [Core.Type] -> Phantoms.TTerm (Maybe Core.Type) -> Phantoms.TTerm env -> Phantoms.TTerm (Typing.FunctionStructure env)
+functionStructure typeParams params bindings body domains codomain environment =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = (Phantoms.unTTerm typeParams)},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = (Phantoms.unTTerm params)},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm bindings)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm body)},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = (Phantoms.unTTerm domains)},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Phantoms.unTTerm codomain)},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (Phantoms.unTTerm environment)}]}))
+
+functionStructureBindings :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm [Core.Binding]
+functionStructureBindings x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+        Core.projectionField = (Core.Name "bindings")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionStructureBody :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm Core.Term
+functionStructureBody x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+        Core.projectionField = (Core.Name "body")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionStructureCodomain :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm (Maybe Core.Type)
+functionStructureCodomain x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+        Core.projectionField = (Core.Name "codomain")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionStructureDomains :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm [Core.Type]
+functionStructureDomains x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+        Core.projectionField = (Core.Name "domains")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionStructureEnvironment :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm env
+functionStructureEnvironment x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+        Core.projectionField = (Core.Name "environment")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionStructureParams :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm [Core.Name]
+functionStructureParams x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+        Core.projectionField = (Core.Name "params")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionStructureTypeParams :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm [Core.Name]
+functionStructureTypeParams x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+        Core.projectionField = (Core.Name "typeParams")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+functionStructureWithBindings :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm [Core.Binding] -> Phantoms.TTerm (Typing.FunctionStructure env)
+functionStructureWithBindings original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "typeParams")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "params")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "domains")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "codomain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "environment")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+functionStructureWithBody :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm Core.Term -> Phantoms.TTerm (Typing.FunctionStructure env)
+functionStructureWithBody original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "typeParams")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "params")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "domains")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "codomain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "environment")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+functionStructureWithCodomain :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm (Maybe Core.Type) -> Phantoms.TTerm (Typing.FunctionStructure env)
+functionStructureWithCodomain original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "typeParams")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "params")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "domains")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "environment")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+functionStructureWithDomains :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm [Core.Type] -> Phantoms.TTerm (Typing.FunctionStructure env)
+functionStructureWithDomains original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "typeParams")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "params")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "codomain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "environment")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+functionStructureWithEnvironment :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm env -> Phantoms.TTerm (Typing.FunctionStructure env)
+functionStructureWithEnvironment original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "typeParams")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "params")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "domains")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "codomain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+functionStructureWithParams :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm [Core.Name] -> Phantoms.TTerm (Typing.FunctionStructure env)
+functionStructureWithParams original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "typeParams")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "domains")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "codomain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "environment")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+functionStructureWithTypeParams :: Phantoms.TTerm (Typing.FunctionStructure env) -> Phantoms.TTerm [Core.Name] -> Phantoms.TTerm (Typing.FunctionStructure env)
+functionStructureWithTypeParams original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "params")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "bindings")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "body")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "domains")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "codomain")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+              Core.projectionField = (Core.Name "environment")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+inferenceResult :: Phantoms.TTerm Core.Term -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Typing.TypeSubst -> Phantoms.TTerm (M.Map Core.Name Core.TypeVariableMetadata) -> Phantoms.TTerm Context.Context -> Phantoms.TTerm Typing.InferenceResult
+inferenceResult term type_ subst classConstraints context =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm term)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm type_)},
+        Core.Field {
+          Core.fieldName = (Core.Name "subst"),
+          Core.fieldTerm = (Phantoms.unTTerm subst)},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Phantoms.unTTerm classConstraints)},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Phantoms.unTTerm context)}]}))
+
+inferenceResultClassConstraints :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm (M.Map Core.Name Core.TypeVariableMetadata)
+inferenceResultClassConstraints x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+        Core.projectionField = (Core.Name "classConstraints")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inferenceResultContext :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm Context.Context
+inferenceResultContext x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+        Core.projectionField = (Core.Name "context")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inferenceResultSubst :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm Typing.TypeSubst
+inferenceResultSubst x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+        Core.projectionField = (Core.Name "subst")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inferenceResultTerm :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm Core.Term
+inferenceResultTerm x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+        Core.projectionField = (Core.Name "term")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inferenceResultType :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm Core.Type
+inferenceResultType x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+        Core.projectionField = (Core.Name "type")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+inferenceResultWithClassConstraints :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm (M.Map Core.Name Core.TypeVariableMetadata) -> Phantoms.TTerm Typing.InferenceResult
+inferenceResultWithClassConstraints original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subst"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "subst")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+inferenceResultWithContext :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm Context.Context -> Phantoms.TTerm Typing.InferenceResult
+inferenceResultWithContext original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subst"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "subst")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+inferenceResultWithSubst :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm Typing.TypeSubst -> Phantoms.TTerm Typing.InferenceResult
+inferenceResultWithSubst original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subst"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+inferenceResultWithTerm :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm Core.Term -> Phantoms.TTerm Typing.InferenceResult
+inferenceResultWithTerm original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "type")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subst"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "subst")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+inferenceResultWithType :: Phantoms.TTerm Typing.InferenceResult -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Typing.InferenceResult
+inferenceResultWithType original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "term")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "subst"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "subst")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "classConstraints")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+              Core.projectionField = (Core.Name "context")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+termSubst :: Phantoms.TTerm (M.Map Core.Name Core.Term) -> Phantoms.TTerm Typing.TermSubst
+termSubst x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.typing.TermSubst"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+typeConstraint :: Phantoms.TTerm Core.Type -> Phantoms.TTerm Core.Type -> Phantoms.TTerm String -> Phantoms.TTerm Typing.TypeConstraint
+typeConstraint left right comment =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm left)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm right)},
+        Core.Field {
+          Core.fieldName = (Core.Name "comment"),
+          Core.fieldTerm = (Phantoms.unTTerm comment)}]}))
+
+typeConstraintComment :: Phantoms.TTerm Typing.TypeConstraint -> Phantoms.TTerm String
+typeConstraintComment x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+        Core.projectionField = (Core.Name "comment")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeConstraintLeft :: Phantoms.TTerm Typing.TypeConstraint -> Phantoms.TTerm Core.Type
+typeConstraintLeft x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+        Core.projectionField = (Core.Name "left")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeConstraintRight :: Phantoms.TTerm Typing.TypeConstraint -> Phantoms.TTerm Core.Type
+typeConstraintRight x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+        Core.projectionField = (Core.Name "right")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+typeConstraintWithComment :: Phantoms.TTerm Typing.TypeConstraint -> Phantoms.TTerm String -> Phantoms.TTerm Typing.TypeConstraint
+typeConstraintWithComment original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "comment"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+typeConstraintWithLeft :: Phantoms.TTerm Typing.TypeConstraint -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Typing.TypeConstraint
+typeConstraintWithLeft original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+              Core.projectionField = (Core.Name "right")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "comment"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+              Core.projectionField = (Core.Name "comment")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeConstraintWithRight :: Phantoms.TTerm Typing.TypeConstraint -> Phantoms.TTerm Core.Type -> Phantoms.TTerm Typing.TypeConstraint
+typeConstraintWithRight original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+              Core.projectionField = (Core.Name "left")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "comment"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+              Core.projectionField = (Core.Name "comment")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+typeSubst :: Phantoms.TTerm (M.Map Core.Name Core.Type) -> Phantoms.TTerm Typing.TypeSubst
+typeSubst x =
+    Phantoms.TTerm (Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.typing.TypeSubst"),
+      Core.wrappedTermBody = (Phantoms.unTTerm x)}))
+
+unTermSubst :: Phantoms.TTerm Typing.TermSubst -> Phantoms.TTerm (M.Map Core.Name Core.Term)
+unTermSubst x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.typing.TermSubst")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+unTypeSubst :: Phantoms.TTerm Typing.TypeSubst -> Phantoms.TTerm (M.Map Core.Name Core.Type)
+unTypeSubst x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.typing.TypeSubst")))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Util.hs b/src/gen-main/haskell/Hydra/Dsl/Util.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Util.hs
@@ -0,0 +1,379 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.util
+
+module Hydra.Dsl.Util where
+
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Util as Util
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+adapter :: Phantoms.TTerm Bool -> Phantoms.TTerm t1 -> Phantoms.TTerm t2 -> Phantoms.TTerm (Util.Coder v1 v2) -> Phantoms.TTerm (Util.Adapter t1 t2 v1 v2)
+adapter isLossy source target coder =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Adapter"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "isLossy"),
+          Core.fieldTerm = (Phantoms.unTTerm isLossy)},
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Phantoms.unTTerm source)},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Phantoms.unTTerm target)},
+        Core.Field {
+          Core.fieldName = (Core.Name "coder"),
+          Core.fieldTerm = (Phantoms.unTTerm coder)}]}))
+
+adapterCoder :: Phantoms.TTerm (Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm (Util.Coder v1 v2)
+adapterCoder x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+        Core.projectionField = (Core.Name "coder")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+adapterIsLossy :: Phantoms.TTerm (Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm Bool
+adapterIsLossy x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+        Core.projectionField = (Core.Name "isLossy")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+adapterSource :: Phantoms.TTerm (Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm t1
+adapterSource x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+        Core.projectionField = (Core.Name "source")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+adapterTarget :: Phantoms.TTerm (Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm t2
+adapterTarget x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+        Core.projectionField = (Core.Name "target")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+adapterWithCoder :: Phantoms.TTerm (Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm (Util.Coder v1 v2) -> Phantoms.TTerm (Util.Adapter t1 t2 v1 v2)
+adapterWithCoder original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Adapter"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "isLossy"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "isLossy")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "source")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "target")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "coder"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+adapterWithIsLossy :: Phantoms.TTerm (Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm Bool -> Phantoms.TTerm (Util.Adapter t1 t2 v1 v2)
+adapterWithIsLossy original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Adapter"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "isLossy"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "source")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "target")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "coder"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "coder")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+adapterWithSource :: Phantoms.TTerm (Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm t1 -> Phantoms.TTerm (Util.Adapter t1 t2 v1 v2)
+adapterWithSource original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Adapter"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "isLossy"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "isLossy")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "target")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "coder"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "coder")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+adapterWithTarget :: Phantoms.TTerm (Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm t2 -> Phantoms.TTerm (Util.Adapter t1 t2 v1 v2)
+adapterWithTarget original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Adapter"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "isLossy"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "isLossy")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "source")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "coder"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Adapter"),
+              Core.projectionField = (Core.Name "coder")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+bicoder :: Phantoms.TTerm (t1 -> Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm (t2 -> Util.Adapter t2 t1 v2 v1) -> Phantoms.TTerm (Util.Bicoder t1 t2 v1 v2)
+bicoder encode decode =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Bicoder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Phantoms.unTTerm encode)},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Phantoms.unTTerm decode)}]}))
+
+bicoderDecode :: Phantoms.TTerm (Util.Bicoder t1 t2 v1 v2) -> Phantoms.TTerm (t2 -> Util.Adapter t2 t1 v2 v1)
+bicoderDecode x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.util.Bicoder"),
+        Core.projectionField = (Core.Name "decode")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bicoderEncode :: Phantoms.TTerm (Util.Bicoder t1 t2 v1 v2) -> Phantoms.TTerm (t1 -> Util.Adapter t1 t2 v1 v2)
+bicoderEncode x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.util.Bicoder"),
+        Core.projectionField = (Core.Name "encode")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+bicoderWithDecode :: Phantoms.TTerm (Util.Bicoder t1 t2 v1 v2) -> Phantoms.TTerm (t2 -> Util.Adapter t2 t1 v2 v1) -> Phantoms.TTerm (Util.Bicoder t1 t2 v1 v2)
+bicoderWithDecode original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Bicoder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Bicoder"),
+              Core.projectionField = (Core.Name "encode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+bicoderWithEncode :: Phantoms.TTerm (Util.Bicoder t1 t2 v1 v2) -> Phantoms.TTerm (t1 -> Util.Adapter t1 t2 v1 v2) -> Phantoms.TTerm (Util.Bicoder t1 t2 v1 v2)
+bicoderWithEncode original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Bicoder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Bicoder"),
+              Core.projectionField = (Core.Name "decode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+caseConventionCamel :: Phantoms.TTerm Util.CaseConvention
+caseConventionCamel =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "camel"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+caseConventionLowerSnake :: Phantoms.TTerm Util.CaseConvention
+caseConventionLowerSnake =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lowerSnake"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+caseConventionPascal :: Phantoms.TTerm Util.CaseConvention
+caseConventionPascal =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pascal"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+caseConventionUpperSnake :: Phantoms.TTerm Util.CaseConvention
+caseConventionUpperSnake =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "upperSnake"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+coder :: Phantoms.TTerm (Context.Context -> v1 -> Either (Context.InContext Errors.Error) v2) -> Phantoms.TTerm (Context.Context -> v2 -> Either (Context.InContext Errors.Error) v1) -> Phantoms.TTerm (Util.Coder v1 v2)
+coder encode decode =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Coder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Phantoms.unTTerm encode)},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Phantoms.unTTerm decode)}]}))
+
+coderDecode :: Phantoms.TTerm (Util.Coder v1 v2) -> Phantoms.TTerm (Context.Context -> v2 -> Either (Context.InContext Errors.Error) v1)
+coderDecode x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+        Core.projectionField = (Core.Name "decode")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+coderEncode :: Phantoms.TTerm (Util.Coder v1 v2) -> Phantoms.TTerm (Context.Context -> v1 -> Either (Context.InContext Errors.Error) v2)
+coderEncode x =
+    Phantoms.TTerm (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+        Core.projectionField = (Core.Name "encode")})))),
+      Core.applicationArgument = (Phantoms.unTTerm x)}))
+
+coderWithDecode :: Phantoms.TTerm (Util.Coder v1 v2) -> Phantoms.TTerm (Context.Context -> v2 -> Either (Context.InContext Errors.Error) v1) -> Phantoms.TTerm (Util.Coder v1 v2)
+coderWithDecode original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Coder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+              Core.projectionField = (Core.Name "encode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)}]}))
+
+coderWithEncode :: Phantoms.TTerm (Util.Coder v1 v2) -> Phantoms.TTerm (Context.Context -> v1 -> Either (Context.InContext Errors.Error) v2) -> Phantoms.TTerm (Util.Coder v1 v2)
+coderWithEncode original newVal =
+    Phantoms.TTerm (Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.util.Coder"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = (Phantoms.unTTerm newVal)},
+        Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+              Core.projectionField = (Core.Name "decode")})))),
+            Core.applicationArgument = (Phantoms.unTTerm original)}))}]}))
+
+comparisonEqualTo :: Phantoms.TTerm Util.Comparison
+comparisonEqualTo =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "equalTo"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+comparisonGreaterThan :: Phantoms.TTerm Util.Comparison
+comparisonGreaterThan =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "greaterThan"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+comparisonLessThan :: Phantoms.TTerm Util.Comparison
+comparisonLessThan =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lessThan"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+precisionArbitrary :: Phantoms.TTerm Util.Precision
+precisionArbitrary =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "arbitrary"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+precisionBits :: Phantoms.TTerm Int -> Phantoms.TTerm Util.Precision
+precisionBits x =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "bits"),
+        Core.fieldTerm = (Phantoms.unTTerm x)}}))
diff --git a/src/gen-main/haskell/Hydra/Dsl/Variants.hs b/src/gen-main/haskell/Hydra/Dsl/Variants.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsl/Variants.hs
@@ -0,0 +1,383 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | DSL functions for hydra.variants
+
+module Hydra.Dsl.Variants where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Phantoms as Phantoms
+import qualified Hydra.Variants as Variants
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+eliminationVariantRecord :: Phantoms.TTerm Variants.EliminationVariant
+eliminationVariantRecord =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "record"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+eliminationVariantUnion :: Phantoms.TTerm Variants.EliminationVariant
+eliminationVariantUnion =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "union"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+eliminationVariantWrap :: Phantoms.TTerm Variants.EliminationVariant
+eliminationVariantWrap =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wrap"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+functionVariantElimination :: Phantoms.TTerm Variants.FunctionVariant
+functionVariantElimination =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "elimination"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+functionVariantLambda :: Phantoms.TTerm Variants.FunctionVariant
+functionVariantLambda =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "lambda"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+functionVariantPrimitive :: Phantoms.TTerm Variants.FunctionVariant
+functionVariantPrimitive =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "primitive"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+literalVariantBinary :: Phantoms.TTerm Variants.LiteralVariant
+literalVariantBinary =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "binary"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+literalVariantBoolean :: Phantoms.TTerm Variants.LiteralVariant
+literalVariantBoolean =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "boolean"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+literalVariantFloat :: Phantoms.TTerm Variants.LiteralVariant
+literalVariantFloat =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "float"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+literalVariantInteger :: Phantoms.TTerm Variants.LiteralVariant
+literalVariantInteger =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "integer"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+literalVariantString :: Phantoms.TTerm Variants.LiteralVariant
+literalVariantString =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "string"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantAnnotated :: Phantoms.TTerm Variants.TermVariant
+termVariantAnnotated =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "annotated"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantApplication :: Phantoms.TTerm Variants.TermVariant
+termVariantApplication =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "application"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantEither :: Phantoms.TTerm Variants.TermVariant
+termVariantEither =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "either"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantFunction :: Phantoms.TTerm Variants.TermVariant
+termVariantFunction =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "function"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantLet :: Phantoms.TTerm Variants.TermVariant
+termVariantLet =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "let"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantList :: Phantoms.TTerm Variants.TermVariant
+termVariantList =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantLiteral :: Phantoms.TTerm Variants.TermVariant
+termVariantLiteral =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "literal"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantMap :: Phantoms.TTerm Variants.TermVariant
+termVariantMap =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "map"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantMaybe :: Phantoms.TTerm Variants.TermVariant
+termVariantMaybe =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "maybe"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantPair :: Phantoms.TTerm Variants.TermVariant
+termVariantPair =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pair"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantRecord :: Phantoms.TTerm Variants.TermVariant
+termVariantRecord =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "record"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantSet :: Phantoms.TTerm Variants.TermVariant
+termVariantSet =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "set"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantTypeApplication :: Phantoms.TTerm Variants.TermVariant
+termVariantTypeApplication =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeApplication"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantTypeLambda :: Phantoms.TTerm Variants.TermVariant
+termVariantTypeLambda =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "typeLambda"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantUnion :: Phantoms.TTerm Variants.TermVariant
+termVariantUnion =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "union"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantUnit :: Phantoms.TTerm Variants.TermVariant
+termVariantUnit =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unit"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantVariable :: Phantoms.TTerm Variants.TermVariant
+termVariantVariable =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "variable"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+termVariantWrap :: Phantoms.TTerm Variants.TermVariant
+termVariantWrap =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wrap"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantAnnotated :: Phantoms.TTerm Variants.TypeVariant
+typeVariantAnnotated =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "annotated"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantApplication :: Phantoms.TTerm Variants.TypeVariant
+typeVariantApplication =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "application"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantEither :: Phantoms.TTerm Variants.TypeVariant
+typeVariantEither =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "either"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantForall :: Phantoms.TTerm Variants.TypeVariant
+typeVariantForall =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "forall"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantFunction :: Phantoms.TTerm Variants.TypeVariant
+typeVariantFunction =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "function"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantList :: Phantoms.TTerm Variants.TypeVariant
+typeVariantList =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "list"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantLiteral :: Phantoms.TTerm Variants.TypeVariant
+typeVariantLiteral =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "literal"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantMap :: Phantoms.TTerm Variants.TypeVariant
+typeVariantMap =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "map"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantMaybe :: Phantoms.TTerm Variants.TypeVariant
+typeVariantMaybe =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "maybe"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantPair :: Phantoms.TTerm Variants.TypeVariant
+typeVariantPair =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "pair"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantRecord :: Phantoms.TTerm Variants.TypeVariant
+typeVariantRecord =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "record"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantSet :: Phantoms.TTerm Variants.TypeVariant
+typeVariantSet =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "set"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantUnion :: Phantoms.TTerm Variants.TypeVariant
+typeVariantUnion =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "union"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantUnit :: Phantoms.TTerm Variants.TypeVariant
+typeVariantUnit =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "unit"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantVariable :: Phantoms.TTerm Variants.TypeVariant
+typeVariantVariable =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "variable"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantVoid :: Phantoms.TTerm Variants.TypeVariant
+typeVariantVoid =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "void"),
+        Core.fieldTerm = Core.TermUnit}}))
+
+typeVariantWrap :: Phantoms.TTerm Variants.TypeVariant
+typeVariantWrap =
+    Phantoms.TTerm (Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = (Core.Name "wrap"),
+        Core.fieldTerm = Core.TermUnit}}))
diff --git a/src/gen-main/haskell/Hydra/Dsls.hs b/src/gen-main/haskell/Hydra/Dsls.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Dsls.hs
@@ -0,0 +1,561 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Functions for generating domain-specific DSL modules from type modules
+
+module Hydra.Dsls where
+
+import qualified Hydra.Annotations as Annotations
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Formatting as Formatting
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Module as Module
+import qualified Hydra.Names as Names
+import qualified Hydra.Rewriting as Rewriting
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Collect forall type variable names from a type
+collectForallVars :: Core.Type -> [Core.Name]
+collectForallVars typ =
+    case typ of
+      Core.TypeAnnotated v0 -> collectForallVars (Core.annotatedTypeBody v0)
+      Core.TypeForall v0 -> Lists.cons (Core.forallTypeParameter v0) (collectForallVars (Core.forallTypeBody v0))
+      _ -> []
+
+-- | Deduplicate bindings by appending underscore suffixes to duplicate names
+deduplicateBindings :: [Core.Binding] -> [Core.Binding]
+deduplicateBindings bindings =
+    Lists.foldl (\acc -> \b ->
+      let n = Core.unName (Core.bindingName b)
+          usedNames = Lists.map (\a -> Core.unName (Core.bindingName a)) acc
+          uniqueName = findUniqueName n usedNames
+      in (Lists.concat2 acc [
+        Core.Binding {
+          Core.bindingName = (Core.Name uniqueName),
+          Core.bindingTerm = (Core.bindingTerm b),
+          Core.bindingType = (Core.bindingType b)}])) [] bindings
+
+-- | Generate a binding name for a DSL function from a type name
+dslBindingName :: Core.Name -> Core.Name
+dslBindingName n =
+
+      let parts = Strings.splitOn "." (Core.unName n)
+      in (Logic.ifElse (Logic.not (Lists.null (Lists.tail parts))) (Logic.ifElse (Equality.equal (Lists.head parts) "hydra") (Core.Name (Strings.intercalate "." (Lists.concat2 [
+        "hydra",
+        "dsl"] (Lists.concat2 (Lists.tail (Lists.init parts)) [
+        Formatting.decapitalize (Names.localNameOf n)])))) (Core.Name (Strings.intercalate "." (Lists.concat2 [
+        "hydra",
+        "dsl"] (Lists.concat2 (Lists.init parts) [
+        Formatting.decapitalize (Names.localNameOf n)]))))) (Core.Name (Formatting.decapitalize (Names.localNameOf n))))
+
+-- | Generate a qualified DSL element name from a type name and local element name
+dslElementName :: Core.Name -> String -> Core.Name
+dslElementName typeName localName =
+
+      let parts = Strings.splitOn "." (Core.unName typeName)
+          nsParts = Lists.init parts
+          dslNsParts =
+                  Logic.ifElse (Equality.equal (Lists.head nsParts) "hydra") (Lists.concat2 [
+                    "hydra",
+                    "dsl"] (Lists.tail nsParts)) (Lists.concat2 [
+                    "hydra",
+                    "dsl"] nsParts)
+      in (Core.Name (Strings.intercalate "." (Lists.concat2 dslNsParts [
+        localName])))
+
+-- | Transform a type module into a DSL module
+dslModule :: Context.Context -> Graph.Graph -> Module.Module -> Either (Context.InContext Errors.Error) (Maybe Module.Module)
+dslModule cx graph mod =
+    Eithers.bind (filterTypeBindings cx graph (Maybes.cat (Lists.map (\d -> case d of
+      Module.DefinitionType v0 -> Just (Annotations.typeElement (Module.typeDefinitionName v0) (Module.typeDefinitionType v0))
+      _ -> Nothing) (Module.moduleDefinitions mod)))) (\typeBindings -> Logic.ifElse (Lists.null typeBindings) (Right Nothing) (Eithers.bind (Eithers.mapList (\b -> Eithers.bimap (\ic -> Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError (Context.inContextObject ic)))),
+      Context.inContextContext = (Context.inContextContext ic)}) (\x -> x) (generateBindingsForType cx graph b)) typeBindings) (\dslBindings -> Right (Just (Module.Module {
+      Module.moduleNamespace = (dslNamespace (Module.moduleNamespace mod)),
+      Module.moduleDefinitions = (Lists.map (\b -> Module.DefinitionTerm (Module.TermDefinition {
+        Module.termDefinitionName = (Core.bindingName b),
+        Module.termDefinitionTerm = (Core.bindingTerm b),
+        Module.termDefinitionType = (Core.bindingType b)})) (deduplicateBindings (Lists.concat dslBindings))),
+      Module.moduleTermDependencies = (Lists.nub (Lists.map dslNamespace (Module.moduleTypeDependencies mod))),
+      Module.moduleTypeDependencies = (Lists.nub (Lists.concat2 [
+        Module.moduleNamespace mod,
+        (Module.Namespace "hydra.phantoms")] (Module.moduleTypeDependencies mod))),
+      Module.moduleDescription = (Just (Strings.cat [
+        "DSL functions for ",
+        (Module.unNamespace (Module.moduleNamespace mod))]))})))))
+
+-- | Generate a DSL module namespace from a source module namespace
+dslNamespace :: Module.Namespace -> Module.Namespace
+dslNamespace ns =
+
+      let parts = Strings.splitOn "." (Module.unNamespace ns)
+      in (Logic.ifElse (Equality.equal (Lists.head parts) "hydra") (Module.Namespace (Strings.cat [
+        "hydra.dsl.",
+        (Strings.intercalate "." (Lists.tail parts))])) (Module.Namespace (Strings.cat [
+        "hydra.dsl.",
+        (Module.unNamespace ns)])))
+
+-- | Build a TypeScheme with TTerm-wrapped parameter and result types
+dslTypeScheme :: Core.Type -> [Core.Type] -> Core.Type -> Core.TypeScheme
+dslTypeScheme origType paramTypes resultType =
+
+      let typeVars = collectForallVars origType
+          wrappedResult =
+                  Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                    Core.applicationTypeArgument = resultType})
+          funType =
+                  Lists.foldr (\paramType -> \acc -> Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                      Core.applicationTypeArgument = paramType})),
+                    Core.functionTypeCodomain = acc})) wrappedResult paramTypes
+      in Core.TypeScheme {
+        Core.typeSchemeVariables = typeVars,
+        Core.typeSchemeType = funType,
+        Core.typeSchemeConstraints = Nothing}
+
+-- | Filter bindings to only DSL-eligible type definitions
+filterTypeBindings :: t0 -> t1 -> [Core.Binding] -> Either t2 [Core.Binding]
+filterTypeBindings cx graph bindings =
+    Eithers.map Maybes.cat (Eithers.mapList (isDslEligibleBinding cx graph) (Lists.filter Annotations.isNativeType bindings))
+
+-- | Find a unique name by appending underscores
+findUniqueName :: String -> [String] -> String
+findUniqueName candidate usedNames =
+    Logic.ifElse (Lists.null (Lists.filter (Equality.equal candidate) usedNames)) candidate (findUniqueName (Strings.cat [
+      candidate,
+      "_"]) usedNames)
+
+-- | Generate all DSL bindings for a type binding
+generateBindingsForType :: Context.Context -> Graph.Graph -> Core.Binding -> Either (Context.InContext Errors.DecodingError) [Core.Binding]
+generateBindingsForType cx graph b =
+
+      let typeName = Core.bindingName b
+      in (Eithers.bind (Eithers.bimap (\_wc_e -> Context.InContext {
+        Context.inContextObject = _wc_e,
+        Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Core_.type_ graph (Core.bindingTerm b))) (\rawType ->
+        let typ = Rewriting.deannotateTypeParameters (Rewriting.deannotateType rawType)
+        in (Right (case typ of
+          Core.TypeRecord v0 -> Lists.concat [
+            generateRecordConstructor rawType typeName v0,
+            (Lists.map (generateRecordAccessor rawType typeName) v0),
+            (Lists.map (generateRecordWithUpdater rawType typeName v0) v0)]
+          Core.TypeUnion v0 -> Lists.map (generateUnionInjector rawType typeName) v0
+          Core.TypeWrap v0 -> generateWrappedTypeAccessors rawType typeName v0
+          _ -> []))))
+
+-- | Generate a record field accessor function
+generateRecordAccessor :: Core.Type -> Core.Name -> Core.FieldType -> Core.Binding
+generateRecordAccessor origType typeName ft =
+
+      let fieldName = Core.fieldTypeName ft
+          accessorLocalName =
+                  Strings.cat [
+                    Formatting.decapitalize (Names.localNameOf typeName),
+                    (Strings.intercalate "" (Lists.map (\s -> Formatting.capitalize s) (Strings.splitOn "." (Core.unName fieldName))))]
+          accessorName = dslElementName typeName accessorLocalName
+          paramDomain =
+                  Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                    Core.applicationTypeArgument = (nominalResultType typeName origType)})
+          body =
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just paramDomain),
+                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
+                      Core.wrappedTermBody = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "application"),
+                          Core.fieldTerm = (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Application"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "function"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "function"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "elimination"),
+                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                          Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+                                          Core.injectionField = Core.Field {
+                                            Core.fieldName = (Core.Name "record"),
+                                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.core.Projection"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "typeName"),
+                                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName typeName)))}))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "field"),
+                                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName fieldName)))}))}]}))}}))}}))}}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "argument"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}]}))}}))}))}))
+          ts = dslTypeScheme origType [
+                nominalResultType typeName origType] (Core.fieldTypeType ft)
+      in Core.Binding {
+        Core.bindingName = accessorName,
+        Core.bindingTerm = body,
+        Core.bindingType = (Just ts)}
+
+-- | Generate a record constructor function
+generateRecordConstructor :: Core.Type -> Core.Name -> [Core.FieldType] -> [Core.Binding]
+generateRecordConstructor origType typeName fieldTypes =
+
+      let dFields =
+              Lists.map (\ft -> Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "name"),
+                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName (Core.fieldTypeName ft))))}))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "term"),
+                    Core.fieldTerm = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name (Formatting.decapitalize (Names.localNameOf (Core.fieldTypeName ft)))))}))}]})) fieldTypes
+          recordTerm =
+                  Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
+                    Core.wrappedTermBody = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "record"),
+                        Core.fieldTerm = (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "typeName"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName typeName)))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "fields"),
+                              Core.fieldTerm = (Core.TermList dFields)}]}))}}))})
+          paramPairs =
+                  Lists.map (\ft -> (Formatting.decapitalize (Names.localNameOf (Core.fieldTypeName ft)), (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                    Core.applicationTypeArgument = (Core.fieldTypeType ft)})))) fieldTypes
+          body =
+                  Lists.foldl (\acc -> \pp -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name (Pairs.first pp)),
+                    Core.lambdaDomain = (Just (Pairs.second pp)),
+                    Core.lambdaBody = acc}))) recordTerm (Lists.reverse paramPairs)
+          paramTypes = Lists.map (\ft -> Core.fieldTypeType ft) fieldTypes
+          resultType = nominalResultType typeName origType
+          ts = dslTypeScheme origType paramTypes resultType
+      in [
+        Core.Binding {
+          Core.bindingName = (dslBindingName typeName),
+          Core.bindingTerm = body,
+          Core.bindingType = (Just ts)}]
+
+-- | Generate a withXxx record field updater function
+generateRecordWithUpdater :: Core.Type -> Core.Name -> [Core.FieldType] -> Core.FieldType -> Core.Binding
+generateRecordWithUpdater origType typeName allFields targetField =
+
+      let targetFieldName = Core.fieldTypeName targetField
+          updaterLocalName =
+                  Strings.cat [
+                    Formatting.decapitalize (Names.localNameOf typeName),
+                    "With",
+                    (Strings.intercalate "" (Lists.map (\s -> Formatting.capitalize s) (Strings.splitOn "." (Core.unName targetFieldName))))]
+          updaterName = dslElementName typeName updaterLocalName
+          dFields =
+                  Lists.map (\ft -> Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "name"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName (Core.fieldTypeName ft))))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "term"),
+                        Core.fieldTerm = (Logic.ifElse (Equality.equal (Core.unName (Core.fieldTypeName ft)) (Core.unName targetFieldName)) (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "newVal"))})) (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "application"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Application"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "function"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "function"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "elimination"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "record"),
+                                              Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                                Core.recordTypeName = (Core.Name "hydra.core.Projection"),
+                                                Core.recordFields = [
+                                                  Core.Field {
+                                                    Core.fieldName = (Core.Name "typeName"),
+                                                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName typeName)))}))},
+                                                  Core.Field {
+                                                    Core.fieldName = (Core.Name "field"),
+                                                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName (Core.fieldTypeName ft))))}))}]}))}}))}}))}}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "argument"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "original"))}))}]}))}})))}]})) allFields
+          recDomain =
+                  Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                    Core.applicationTypeArgument = (nominalResultType typeName origType)})
+          fieldDomain =
+                  Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                    Core.applicationTypeArgument = (Core.fieldTypeType targetField)})
+          body =
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "original"),
+                    Core.lambdaDomain = (Just recDomain),
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "newVal"),
+                      Core.lambdaDomain = (Just fieldDomain),
+                      Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
+                        Core.wrappedTermBody = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "typeName"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName typeName)))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "fields"),
+                                  Core.fieldTerm = (Core.TermList dFields)}]}))}}))}))})))}))
+          recType = nominalResultType typeName origType
+          ts =
+                  dslTypeScheme origType [
+                    recType,
+                    (Core.fieldTypeType targetField)] recType
+      in Core.Binding {
+        Core.bindingName = updaterName,
+        Core.bindingTerm = body,
+        Core.bindingType = (Just ts)}
+
+-- | Generate a union injection helper
+generateUnionInjector :: Core.Type -> Core.Name -> Core.FieldType -> Core.Binding
+generateUnionInjector origType typeName ft =
+
+      let fieldName = Core.fieldTypeName ft
+          fieldType = Core.fieldTypeType ft
+          injectorLocalName =
+                  Strings.cat [
+                    Formatting.decapitalize (Names.localNameOf typeName),
+                    (Strings.intercalate "" (Lists.map (\s -> Formatting.capitalize s) (Strings.splitOn "." (Core.unName fieldName))))]
+          injectorName = dslElementName typeName injectorLocalName
+          isUnit =
+                  (\t -> case (Rewriting.deannotateType t) of
+                    Core.TypeUnit -> True
+                    _ -> False) fieldType
+          dFieldValue =
+                  Logic.ifElse isUnit (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "unit"),
+                      Core.fieldTerm = Core.TermUnit}})) (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))
+          injectionTerm =
+                  Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
+                    Core.wrappedTermBody = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "union"),
+                        Core.fieldTerm = (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "typeName"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName typeName)))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "field"),
+                              Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                                Core.recordFields = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "name"),
+                                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName fieldName)))}))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "term"),
+                                    Core.fieldTerm = dFieldValue}]}))}]}))}}))})
+          variantDomain =
+                  Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                    Core.applicationTypeArgument = (Core.fieldTypeType ft)})
+          body =
+                  Logic.ifElse isUnit injectionTerm (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just variantDomain),
+                    Core.lambdaBody = injectionTerm})))
+          unionType = nominalResultType typeName origType
+          ts = Logic.ifElse isUnit (dslTypeScheme origType [] unionType) (dslTypeScheme origType [
+                Core.fieldTypeType ft] unionType)
+      in Core.Binding {
+        Core.bindingName = injectorName,
+        Core.bindingTerm = body,
+        Core.bindingType = (Just ts)}
+
+-- | Generate wrap/unwrap accessors for a wrapped type
+generateWrappedTypeAccessors :: Core.Type -> Core.Name -> Core.Type -> [Core.Binding]
+generateWrappedTypeAccessors origType typeName innerType =
+
+      let localName = Names.localNameOf typeName
+          wrapName = dslElementName typeName (Formatting.decapitalize localName)
+          unwrapLocalName =
+                  Strings.cat [
+                    "un",
+                    localName]
+          unwrapName = dslElementName typeName unwrapLocalName
+          wrapperType = nominalResultType typeName origType
+          wrapDomain =
+                  Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                    Core.applicationTypeArgument = innerType})
+          wrapBody =
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just wrapDomain),
+                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
+                      Core.wrappedTermBody = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "wrap"),
+                          Core.fieldTerm = (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "typeName"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName typeName)))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "body"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}]}))}}))}))}))
+          unwrapDomain =
+                  Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                    Core.applicationTypeArgument = wrapperType})
+          unwrapBody =
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just unwrapDomain),
+                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
+                      Core.wrappedTermBody = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "application"),
+                          Core.fieldTerm = (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Application"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "function"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "function"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "elimination"),
+                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                          Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+                                          Core.injectionField = Core.Field {
+                                            Core.fieldName = (Core.Name "wrap"),
+                                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName typeName)))}))}}))}}))}}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "argument"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}]}))}}))}))}))
+          wrapTs = dslTypeScheme origType [
+                innerType] wrapperType
+          unwrapTs = dslTypeScheme origType [
+                wrapperType] innerType
+      in [
+        Core.Binding {
+          Core.bindingName = wrapName,
+          Core.bindingTerm = wrapBody,
+          Core.bindingType = (Just wrapTs)},
+        Core.Binding {
+          Core.bindingName = unwrapName,
+          Core.bindingTerm = unwrapBody,
+          Core.bindingType = (Just unwrapTs)}]
+
+-- | Check if a binding is eligible for DSL generation
+isDslEligibleBinding :: t0 -> t1 -> Core.Binding -> Either t2 (Maybe Core.Binding)
+isDslEligibleBinding cx graph b =
+
+      let ns = Names.namespaceOf (Core.bindingName b)
+      in (Logic.ifElse (Equality.equal (Maybes.maybe "" Module.unNamespace ns) "hydra.phantoms") (Right Nothing) (Right (Just b)))
+
+-- | Build the nominal result type with type applications for forall variables
+nominalResultType :: Core.Name -> Core.Type -> Core.Type
+nominalResultType typeName origType =
+
+      let vars = collectForallVars origType
+      in (Lists.foldl (\acc -> \v -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = acc,
+        Core.applicationTypeArgument = (Core.TypeVariable v)})) (Core.TypeVariable typeName) vars)
diff --git a/src/gen-main/haskell/Hydra/Encode/Accessors.hs b/src/gen-main/haskell/Hydra/Encode/Accessors.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Encode/Accessors.hs
+++ /dev/null
@@ -1,163 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term encoders for hydra.accessors
-
-module Hydra.Encode.Accessors where
-
-import qualified Hydra.Accessors as Accessors
-import qualified Hydra.Core as Core
-import qualified Hydra.Encode.Core as Core_
-import qualified Hydra.Lib.Lists as Lists
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-accessorEdge :: (Accessors.AccessorEdge -> Core.Term)
-accessorEdge x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.accessors.AccessorEdge"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "source"),
-      Core.fieldTerm = (accessorNode (Accessors.accessorEdgeSource x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "path"),
-      Core.fieldTerm = (accessorPath (Accessors.accessorEdgePath x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "target"),
-      Core.fieldTerm = (accessorNode (Accessors.accessorEdgeTarget x))}]}))
-
-accessorGraph :: (Accessors.AccessorGraph -> Core.Term)
-accessorGraph x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.accessors.AccessorGraph"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "nodes"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map accessorNode xs)) (Accessors.accessorGraphNodes x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "edges"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map accessorEdge xs)) (Accessors.accessorGraphEdges x))}]}))
-
-accessorNode :: (Accessors.AccessorNode -> Core.Term)
-accessorNode x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.accessors.AccessorNode"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (Core_.name (Accessors.accessorNodeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "label"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Accessors.accessorNodeLabel x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "id"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Accessors.accessorNodeId x))}]}))
-
-accessorPath :: (Accessors.AccessorPath -> Core.Term)
-accessorPath x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.accessors.AccessorPath"),
-  Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map termAccessor xs)) (Accessors.unAccessorPath x))}))
-
-termAccessor :: (Accessors.TermAccessor -> Core.Term)
-termAccessor x = case x of
-  Accessors.TermAccessorAnnotatedBody -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "annotatedBody"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorApplicationFunction -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "applicationFunction"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorApplicationArgument -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "applicationArgument"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorLambdaBody -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lambdaBody"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorUnionCasesDefault -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "unionCasesDefault"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorUnionCasesBranch v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "unionCasesBranch"),
-      Core.fieldTerm = (Core_.name v1)}}))
-  Accessors.TermAccessorLetBody -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "letBody"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorLetBinding v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "letBinding"),
-      Core.fieldTerm = (Core_.name v1)}}))
-  Accessors.TermAccessorListElement v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "listElement"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
-  Accessors.TermAccessorMapKey v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "mapKey"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
-  Accessors.TermAccessorMapValue v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "mapValue"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
-  Accessors.TermAccessorMaybeTerm -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "maybeTerm"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorProductTerm v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "productTerm"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
-  Accessors.TermAccessorRecordField v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "recordField"),
-      Core.fieldTerm = (Core_.name v1)}}))
-  Accessors.TermAccessorSetElement v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "setElement"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
-  Accessors.TermAccessorSumTerm -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "sumTerm"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorTypeLambdaBody -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeLambdaBody"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorTypeApplicationTerm -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeApplicationTerm"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorInjectionTerm -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "injectionTerm"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Accessors.TermAccessorWrappedTerm -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wrappedTerm"),
-      Core.fieldTerm = Core.TermUnit}}))
diff --git a/src/gen-main/haskell/Hydra/Encode/Ast.hs b/src/gen-main/haskell/Hydra/Encode/Ast.hs
--- a/src/gen-main/haskell/Hydra/Encode/Ast.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Ast.hs
@@ -6,6 +6,7 @@
 
 import qualified Hydra.Ast as Ast
 import qualified Hydra.Core as Core
+import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Maybes as Maybes
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -14,191 +15,221 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-associativity :: (Ast.Associativity -> Core.Term)
-associativity x = case x of
-  Ast.AssociativityNone -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "none"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Ast.AssociativityLeft -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "left"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Ast.AssociativityRight -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "right"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Ast.AssociativityBoth -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "both"),
-      Core.fieldTerm = Core.TermUnit}}))
+associativity :: Ast.Associativity -> Core.Term
+associativity x =
+    case x of
+      Ast.AssociativityNone -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "none"),
+          Core.fieldTerm = Core.TermUnit}})
+      Ast.AssociativityLeft -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = Core.TermUnit}})
+      Ast.AssociativityRight -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = Core.TermUnit}})
+      Ast.AssociativityBoth -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "both"),
+          Core.fieldTerm = Core.TermUnit}})
 
-blockStyle :: (Ast.BlockStyle -> Core.Term)
-blockStyle x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.ast.BlockStyle"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "indent"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\x -> Core.TermLiteral (Core.LiteralString x)) opt)) (Ast.blockStyleIndent x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "newlineBeforeContent"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Ast.blockStyleNewlineBeforeContent x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "newlineAfterContent"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Ast.blockStyleNewlineAfterContent x))}]}))
+blockStyle :: Ast.BlockStyle -> Core.Term
+blockStyle x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BlockStyle"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "indent"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\x -> Core.TermLiteral (Core.LiteralString x)) opt)) (Ast.blockStyleIndent x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineBeforeContent"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Ast.blockStyleNewlineBeforeContent x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newlineAfterContent"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Ast.blockStyleNewlineAfterContent x))}]})
 
-bracketExpr :: (Ast.BracketExpr -> Core.Term)
-bracketExpr x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.ast.BracketExpr"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "brackets"),
-      Core.fieldTerm = (brackets (Ast.bracketExprBrackets x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "enclosed"),
-      Core.fieldTerm = (expr (Ast.bracketExprEnclosed x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "style"),
-      Core.fieldTerm = (blockStyle (Ast.bracketExprStyle x))}]}))
+bracketExpr :: Ast.BracketExpr -> Core.Term
+bracketExpr x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.BracketExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "brackets"),
+          Core.fieldTerm = (brackets (Ast.bracketExprBrackets x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "enclosed"),
+          Core.fieldTerm = (expr (Ast.bracketExprEnclosed x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (blockStyle (Ast.bracketExprStyle x))}]})
 
-brackets :: (Ast.Brackets -> Core.Term)
-brackets x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.ast.Brackets"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "open"),
-      Core.fieldTerm = (symbol (Ast.bracketsOpen x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "close"),
-      Core.fieldTerm = (symbol (Ast.bracketsClose x))}]}))
+brackets :: Ast.Brackets -> Core.Term
+brackets x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Brackets"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "open"),
+          Core.fieldTerm = (symbol (Ast.bracketsOpen x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "close"),
+          Core.fieldTerm = (symbol (Ast.bracketsClose x))}]})
 
-expr :: (Ast.Expr -> Core.Term)
-expr x = case x of
-  Ast.ExprConst v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "const"),
-      Core.fieldTerm = (symbol v1)}}))
-  Ast.ExprIndent v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "indent"),
-      Core.fieldTerm = (indentedExpression v1)}}))
-  Ast.ExprOp v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "op"),
-      Core.fieldTerm = (opExpr v1)}}))
-  Ast.ExprBrackets v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "brackets"),
-      Core.fieldTerm = (bracketExpr v1)}}))
+expr :: Ast.Expr -> Core.Term
+expr x =
+    case x of
+      Ast.ExprConst v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "const"),
+          Core.fieldTerm = (symbol v0)}})
+      Ast.ExprIndent v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "indent"),
+          Core.fieldTerm = (indentedExpression v0)}})
+      Ast.ExprOp v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (opExpr v0)}})
+      Ast.ExprBrackets v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "brackets"),
+          Core.fieldTerm = (bracketExpr v0)}})
+      Ast.ExprSeq v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "seq"),
+          Core.fieldTerm = (seqExpr v0)}})
 
-indentedExpression :: (Ast.IndentedExpression -> Core.Term)
-indentedExpression x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.ast.IndentedExpression"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "style"),
-      Core.fieldTerm = (indentStyle (Ast.indentedExpressionStyle x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expr"),
-      Core.fieldTerm = (expr (Ast.indentedExpressionExpr x))}]}))
+indentStyle :: Ast.IndentStyle -> Core.Term
+indentStyle x =
+    case x of
+      Ast.IndentStyleAllLines v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "allLines"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v0))}})
+      Ast.IndentStyleSubsequentLines v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "subsequentLines"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v0))}})
 
-indentStyle :: (Ast.IndentStyle -> Core.Term)
-indentStyle x = case x of
-  Ast.IndentStyleAllLines v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "allLines"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v1))}}))
-  Ast.IndentStyleSubsequentLines v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "subsequentLines"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v1))}}))
+indentedExpression :: Ast.IndentedExpression -> Core.Term
+indentedExpression x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "style"),
+          Core.fieldTerm = (indentStyle (Ast.indentedExpressionStyle x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expr"),
+          Core.fieldTerm = (expr (Ast.indentedExpressionExpr x))}]})
 
-op :: (Ast.Op -> Core.Term)
-op x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.ast.Op"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "symbol"),
-      Core.fieldTerm = (symbol (Ast.opSymbol x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "padding"),
-      Core.fieldTerm = (padding (Ast.opPadding x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "precedence"),
-      Core.fieldTerm = (precedence (Ast.opPrecedence x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "associativity"),
-      Core.fieldTerm = (associativity (Ast.opAssociativity x))}]}))
+op :: Ast.Op -> Core.Term
+op x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Op"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "symbol"),
+          Core.fieldTerm = (symbol (Ast.opSymbol x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "padding"),
+          Core.fieldTerm = (padding (Ast.opPadding x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "precedence"),
+          Core.fieldTerm = (precedence (Ast.opPrecedence x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "associativity"),
+          Core.fieldTerm = (associativity (Ast.opAssociativity x))}]})
 
-opExpr :: (Ast.OpExpr -> Core.Term)
-opExpr x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.ast.OpExpr"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "op"),
-      Core.fieldTerm = (op (Ast.opExprOp x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "lhs"),
-      Core.fieldTerm = (expr (Ast.opExprLhs x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "rhs"),
-      Core.fieldTerm = (expr (Ast.opExprRhs x))}]}))
+opExpr :: Ast.OpExpr -> Core.Term
+opExpr x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.OpExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (op (Ast.opExprOp x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lhs"),
+          Core.fieldTerm = (expr (Ast.opExprLhs x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rhs"),
+          Core.fieldTerm = (expr (Ast.opExprRhs x))}]})
 
-padding :: (Ast.Padding -> Core.Term)
-padding x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.ast.Padding"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "left"),
-      Core.fieldTerm = (ws (Ast.paddingLeft x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "right"),
-      Core.fieldTerm = (ws (Ast.paddingRight x))}]}))
+padding :: Ast.Padding -> Core.Term
+padding x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.Padding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (ws (Ast.paddingLeft x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (ws (Ast.paddingRight x))}]})
 
-precedence :: (Ast.Precedence -> Core.Term)
-precedence x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.ast.Precedence"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Ast.unPrecedence x))}))
+precedence :: Ast.Precedence -> Core.Term
+precedence x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ast.Precedence"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Ast.unPrecedence x))})
 
-symbol :: (Ast.Symbol -> Core.Term)
-symbol x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.ast.Symbol"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Ast.unSymbol x))}))
+seqExpr :: Ast.SeqExpr -> Core.Term
+seqExpr x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.ast.SeqExpr"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "op"),
+          Core.fieldTerm = (op (Ast.seqExprOp x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "elements"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map expr xs)) (Ast.seqExprElements x))}]})
 
-ws :: (Ast.Ws -> Core.Term)
-ws x = case x of
-  Ast.WsNone -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "none"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Ast.WsSpace -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "space"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Ast.WsBreak -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "break"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Ast.WsBreakAndIndent v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "breakAndIndent"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v1))}}))
-  Ast.WsDoubleBreak -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "doubleBreak"),
-      Core.fieldTerm = Core.TermUnit}}))
+symbol :: Ast.Symbol -> Core.Term
+symbol x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.ast.Symbol"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Ast.unSymbol x))})
+
+ws :: Ast.Ws -> Core.Term
+ws x =
+    case x of
+      Ast.WsNone -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "none"),
+          Core.fieldTerm = Core.TermUnit}})
+      Ast.WsSpace -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "space"),
+          Core.fieldTerm = Core.TermUnit}})
+      Ast.WsBreak -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "break"),
+          Core.fieldTerm = Core.TermUnit}})
+      Ast.WsBreakAndIndent v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "breakAndIndent"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v0))}})
+      Ast.WsDoubleBreak -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "doubleBreak"),
+          Core.fieldTerm = Core.TermUnit}})
diff --git a/src/gen-main/haskell/Hydra/Encode/Classes.hs b/src/gen-main/haskell/Hydra/Encode/Classes.hs
--- a/src/gen-main/haskell/Hydra/Encode/Classes.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Classes.hs
@@ -13,15 +13,16 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-typeClass :: (Classes.TypeClass -> Core.Term)
-typeClass x = case x of
-  Classes.TypeClassEquality -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "equality"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Classes.TypeClassOrdering -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "ordering"),
-      Core.fieldTerm = Core.TermUnit}}))
+typeClass :: Classes.TypeClass -> Core.Term
+typeClass x =
+    case x of
+      Classes.TypeClassEquality -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "equality"),
+          Core.fieldTerm = Core.TermUnit}})
+      Classes.TypeClassOrdering -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "ordering"),
+          Core.fieldTerm = Core.TermUnit}})
diff --git a/src/gen-main/haskell/Hydra/Encode/Coders.hs b/src/gen-main/haskell/Hydra/Encode/Coders.hs
--- a/src/gen-main/haskell/Hydra/Encode/Coders.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Coders.hs
@@ -13,33 +13,36 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-coderDirection :: (Coders.CoderDirection -> Core.Term)
-coderDirection x = case x of
-  Coders.CoderDirectionEncode -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "encode"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Coders.CoderDirectionDecode -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "decode"),
-      Core.fieldTerm = Core.TermUnit}}))
+coderDirection :: Coders.CoderDirection -> Core.Term
+coderDirection x =
+    case x of
+      Coders.CoderDirectionEncode -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "encode"),
+          Core.fieldTerm = Core.TermUnit}})
+      Coders.CoderDirectionDecode -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "decode"),
+          Core.fieldTerm = Core.TermUnit}})
 
-languageName :: (Coders.LanguageName -> Core.Term)
-languageName x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.coders.LanguageName"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Coders.unLanguageName x))}))
+languageName :: Coders.LanguageName -> Core.Term
+languageName x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.coders.LanguageName"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Coders.unLanguageName x))})
 
-traversalOrder :: (Coders.TraversalOrder -> Core.Term)
-traversalOrder x = case x of
-  Coders.TraversalOrderPre -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "pre"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Coders.TraversalOrderPost -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "post"),
-      Core.fieldTerm = Core.TermUnit}}))
+traversalOrder :: Coders.TraversalOrder -> Core.Term
+traversalOrder x =
+    case x of
+      Coders.TraversalOrderPre -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pre"),
+          Core.fieldTerm = Core.TermUnit}})
+      Coders.TraversalOrderPost -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "post"),
+          Core.fieldTerm = Core.TermUnit}})
diff --git a/src/gen-main/haskell/Hydra/Encode/Compute.hs b/src/gen-main/haskell/Hydra/Encode/Compute.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Encode/Compute.hs
+++ /dev/null
@@ -1,46 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term encoders for hydra.compute
-
-module Hydra.Encode.Compute where
-
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Encode.Core as Core_
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-flowState :: ((t0 -> Core.Term) -> (t1 -> Core.Term) -> Compute.FlowState t0 t1 -> Core.Term)
-flowState s v x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "value"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map v opt)) (Compute.flowStateValue x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "state"),
-      Core.fieldTerm = (s (Compute.flowStateState x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "trace"),
-      Core.fieldTerm = (trace (Compute.flowStateTrace x))}]}))
-
-trace :: (Compute.Trace -> Core.Term)
-trace x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "stack"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralString x)) xs)) (Compute.traceStack x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "messages"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralString x)) xs)) (Compute.traceMessages x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "other"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.term m)) (Compute.traceOther x))}]}))
diff --git a/src/gen-main/haskell/Hydra/Encode/Constraints.hs b/src/gen-main/haskell/Hydra/Encode/Constraints.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Encode/Constraints.hs
+++ /dev/null
@@ -1,37 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term encoders for hydra.constraints
-
-module Hydra.Encode.Constraints where
-
-import qualified Hydra.Constraints as Constraints
-import qualified Hydra.Core as Core
-import qualified Hydra.Encode.Query as Query
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-pathEquation :: (Constraints.PathEquation -> Core.Term)
-pathEquation x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.constraints.PathEquation"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "left"),
-      Core.fieldTerm = (Query.path (Constraints.pathEquationLeft x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "right"),
-      Core.fieldTerm = (Query.path (Constraints.pathEquationRight x))}]}))
-
-patternImplication :: (Constraints.PatternImplication -> Core.Term)
-patternImplication x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.constraints.PatternImplication"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "antecedent"),
-      Core.fieldTerm = (Query.pattern (Constraints.patternImplicationAntecedent x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "consequent"),
-      Core.fieldTerm = (Query.pattern (Constraints.patternImplicationConsequent x))}]}))
diff --git a/src/gen-main/haskell/Hydra/Encode/Context.hs b/src/gen-main/haskell/Hydra/Encode/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Encode/Context.hs
@@ -0,0 +1,44 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term encoders for hydra.context
+
+module Hydra.Encode.Context where
+
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Encode.Core as Core_
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Maps as Maps
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+context :: Context.Context -> Core.Term
+context x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.Context"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "trace"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralString x)) xs)) (Context.contextTrace x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "messages"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralString x)) xs)) (Context.contextMessages x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "other"),
+          Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.term m)) (Context.contextOther x))}]})
+
+inContext :: (t0 -> Core.Term) -> Context.InContext t0 -> Core.Term
+inContext e x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.context.InContext"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (e (Context.inContextObject x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (context (Context.inContextContext x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Core.hs b/src/gen-main/haskell/Hydra/Encode/Core.hs
--- a/src/gen-main/haskell/Hydra/Encode/Core.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Core.hs
@@ -18,691 +18,708 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-annotatedTerm :: (Core.AnnotatedTerm -> Core.Term)
-annotatedTerm x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (term (Core.annotatedTermBody x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "annotation"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap name term m)) (Core.annotatedTermAnnotation x))}]}))
-
-annotatedType :: (Core.AnnotatedType -> Core.Term)
-annotatedType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (type_ (Core.annotatedTypeBody x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "annotation"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap name term m)) (Core.annotatedTypeAnnotation x))}]}))
-
-application :: (Core.Application -> Core.Term)
-application x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Application"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "function"),
-      Core.fieldTerm = (term (Core.applicationFunction x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "argument"),
-      Core.fieldTerm = (term (Core.applicationArgument x))}]}))
-
-applicationType :: (Core.ApplicationType -> Core.Term)
-applicationType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.ApplicationType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "function"),
-      Core.fieldTerm = (type_ (Core.applicationTypeFunction x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "argument"),
-      Core.fieldTerm = (type_ (Core.applicationTypeArgument x))}]}))
-
-binding :: (Core.Binding -> Core.Term)
-binding x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Binding"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (name (Core.bindingName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (term (Core.bindingTerm x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map typeScheme opt)) (Core.bindingType x))}]}))
-
-caseStatement :: (Core.CaseStatement -> Core.Term)
-caseStatement x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.CaseStatement"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (name (Core.caseStatementTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "default"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map term opt)) (Core.caseStatementDefault x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "cases"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map field xs)) (Core.caseStatementCases x))}]}))
-
-eitherType :: (Core.EitherType -> Core.Term)
-eitherType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.EitherType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "left"),
-      Core.fieldTerm = (type_ (Core.eitherTypeLeft x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "right"),
-      Core.fieldTerm = (type_ (Core.eitherTypeRight x))}]}))
-
-pairType :: (Core.PairType -> Core.Term)
-pairType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.PairType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "first"),
-      Core.fieldTerm = (type_ (Core.pairTypeFirst x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "second"),
-      Core.fieldTerm = (type_ (Core.pairTypeSecond x))}]}))
-
-elimination :: (Core.Elimination -> Core.Term)
-elimination x = case x of
-  Core.EliminationRecord v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "record"),
-      Core.fieldTerm = (projection v1)}}))
-  Core.EliminationUnion v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "union"),
-      Core.fieldTerm = (caseStatement v1)}}))
-  Core.EliminationWrap v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wrap"),
-      Core.fieldTerm = (name v1)}}))
-
-field :: (Core.Field -> Core.Term)
-field x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Field"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (name (Core.fieldName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (term (Core.fieldTerm x))}]}))
-
-fieldType :: (Core.FieldType -> Core.Term)
-fieldType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.FieldType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (name (Core.fieldTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (type_ (Core.fieldTypeType x))}]}))
-
-floatType :: (Core.FloatType -> Core.Term)
-floatType x = case x of
-  Core.FloatTypeBigfloat -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "bigfloat"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.FloatTypeFloat32 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "float32"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.FloatTypeFloat64 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "float64"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-floatValue :: (Core.FloatValue -> Core.Term)
-floatValue x = case x of
-  Core.FloatValueBigfloat v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "bigfloat"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat v1)))}}))
-  Core.FloatValueFloat32 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "float32"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 v1)))}}))
-  Core.FloatValueFloat64 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "float64"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 v1)))}}))
-
-forallType :: (Core.ForallType -> Core.Term)
-forallType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.ForallType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "parameter"),
-      Core.fieldTerm = (name (Core.forallTypeParameter x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (type_ (Core.forallTypeBody x))}]}))
-
-function :: (Core.Function -> Core.Term)
-function x = case x of
-  Core.FunctionElimination v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Function"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "elimination"),
-      Core.fieldTerm = (elimination v1)}}))
-  Core.FunctionLambda v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Function"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lambda"),
-      Core.fieldTerm = (lambda v1)}}))
-  Core.FunctionPrimitive v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Function"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "primitive"),
-      Core.fieldTerm = (name v1)}}))
-
-functionType :: (Core.FunctionType -> Core.Term)
-functionType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.FunctionType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "domain"),
-      Core.fieldTerm = (type_ (Core.functionTypeDomain x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "codomain"),
-      Core.fieldTerm = (type_ (Core.functionTypeCodomain x))}]}))
-
-injection :: (Core.Injection -> Core.Term)
-injection x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (name (Core.injectionTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "field"),
-      Core.fieldTerm = (field (Core.injectionField x))}]}))
-
-integerType :: (Core.IntegerType -> Core.Term)
-integerType x = case x of
-  Core.IntegerTypeBigint -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "bigint"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.IntegerTypeInt8 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "int8"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.IntegerTypeInt16 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "int16"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.IntegerTypeInt32 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "int32"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.IntegerTypeInt64 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "int64"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.IntegerTypeUint8 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "uint8"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.IntegerTypeUint16 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "uint16"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.IntegerTypeUint32 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "uint32"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.IntegerTypeUint64 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "uint64"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-integerValue :: (Core.IntegerValue -> Core.Term)
-integerValue x = case x of
-  Core.IntegerValueBigint v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "bigint"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint v1)))}}))
-  Core.IntegerValueInt8 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "int8"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 v1)))}}))
-  Core.IntegerValueInt16 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "int16"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 v1)))}}))
-  Core.IntegerValueInt32 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "int32"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
-  Core.IntegerValueInt64 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "int64"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 v1)))}}))
-  Core.IntegerValueUint8 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "uint8"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 v1)))}}))
-  Core.IntegerValueUint16 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "uint16"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 v1)))}}))
-  Core.IntegerValueUint32 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "uint32"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 v1)))}}))
-  Core.IntegerValueUint64 v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "uint64"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 v1)))}}))
-
-lambda :: (Core.Lambda -> Core.Term)
-lambda x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Lambda"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "parameter"),
-      Core.fieldTerm = (name (Core.lambdaParameter x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "domain"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map type_ opt)) (Core.lambdaDomain x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (term (Core.lambdaBody x))}]}))
-
-let_ :: (Core.Let -> Core.Term)
-let_ x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Let"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "bindings"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map binding xs)) (Core.letBindings x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (term (Core.letBody x))}]}))
-
-literal :: (Core.Literal -> Core.Term)
-literal x = case x of
-  Core.LiteralBinary v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "binary"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralBinary v1))}}))
-  Core.LiteralBoolean v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "boolean"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean v1))}}))
-  Core.LiteralFloat v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "float"),
-      Core.fieldTerm = (floatValue v1)}}))
-  Core.LiteralInteger v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "integer"),
-      Core.fieldTerm = (integerValue v1)}}))
-  Core.LiteralString v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "string"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v1))}}))
-
-literalType :: (Core.LiteralType -> Core.Term)
-literalType x = case x of
-  Core.LiteralTypeBinary -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "binary"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.LiteralTypeBoolean -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "boolean"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.LiteralTypeFloat v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "float"),
-      Core.fieldTerm = (floatType v1)}}))
-  Core.LiteralTypeInteger v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "integer"),
-      Core.fieldTerm = (integerType v1)}}))
-  Core.LiteralTypeString -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "string"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-mapType :: (Core.MapType -> Core.Term)
-mapType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.MapType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "keys"),
-      Core.fieldTerm = (type_ (Core.mapTypeKeys x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "values"),
-      Core.fieldTerm = (type_ (Core.mapTypeValues x))}]}))
-
-name :: (Core.Name -> Core.Term)
-name x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Core.unName x))}))
-
-projection :: (Core.Projection -> Core.Term)
-projection x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Projection"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (name (Core.projectionTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "field"),
-      Core.fieldTerm = (name (Core.projectionField x))}]}))
-
-record :: (Core.Record -> Core.Term)
-record x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Record"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (name (Core.recordTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "fields"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map field xs)) (Core.recordFields x))}]}))
-
-rowType :: (Core.RowType -> Core.Term)
-rowType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.RowType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (name (Core.rowTypeTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "fields"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map fieldType xs)) (Core.rowTypeFields x))}]}))
-
-term :: (Core.Term -> Core.Term)
-term x = case x of
-  Core.TermAnnotated v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "annotated"),
-      Core.fieldTerm = (annotatedTerm v1)}}))
-  Core.TermApplication v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "application"),
-      Core.fieldTerm = (application v1)}}))
-  Core.TermEither v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "either"),
-      Core.fieldTerm = (Core.TermEither (Eithers.bimap term term v1))}}))
-  Core.TermFunction v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "function"),
-      Core.fieldTerm = (function v1)}}))
-  Core.TermLet v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "let"),
-      Core.fieldTerm = (let_ v1)}}))
-  Core.TermList v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "list"),
-      Core.fieldTerm = (Core.TermList (Lists.map term v1))}}))
-  Core.TermLiteral v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "literal"),
-      Core.fieldTerm = (literal v1)}}))
-  Core.TermMap v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "map"),
-      Core.fieldTerm = (Core.TermMap (Maps.bimap term term v1))}}))
-  Core.TermMaybe v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "maybe"),
-      Core.fieldTerm = (Core.TermMaybe (Maybes.map term v1))}}))
-  Core.TermPair v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "pair"),
-      Core.fieldTerm = (Core.TermPair (Pairs.bimap term term v1))}}))
-  Core.TermRecord v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "record"),
-      Core.fieldTerm = (record v1)}}))
-  Core.TermSet v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "set"),
-      Core.fieldTerm = (Core.TermSet (Sets.map term v1))}}))
-  Core.TermTypeApplication v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeApplication"),
-      Core.fieldTerm = (typeApplicationTerm v1)}}))
-  Core.TermTypeLambda v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeLambda"),
-      Core.fieldTerm = (typeLambda v1)}}))
-  Core.TermUnion v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "union"),
-      Core.fieldTerm = (injection v1)}}))
-  Core.TermUnit -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "unit"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.TermVariable v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "variable"),
-      Core.fieldTerm = (name v1)}}))
-  Core.TermWrap v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wrap"),
-      Core.fieldTerm = (wrappedTerm v1)}}))
-
-type_ :: (Core.Type -> Core.Term)
-type_ x = case x of
-  Core.TypeAnnotated v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "annotated"),
-      Core.fieldTerm = (annotatedType v1)}}))
-  Core.TypeApplication v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "application"),
-      Core.fieldTerm = (applicationType v1)}}))
-  Core.TypeEither v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "either"),
-      Core.fieldTerm = (eitherType v1)}}))
-  Core.TypeForall v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "forall"),
-      Core.fieldTerm = (forallType v1)}}))
-  Core.TypeFunction v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "function"),
-      Core.fieldTerm = (functionType v1)}}))
-  Core.TypeList v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "list"),
-      Core.fieldTerm = (type_ v1)}}))
-  Core.TypeLiteral v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "literal"),
-      Core.fieldTerm = (literalType v1)}}))
-  Core.TypeMap v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "map"),
-      Core.fieldTerm = (mapType v1)}}))
-  Core.TypeMaybe v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "maybe"),
-      Core.fieldTerm = (type_ v1)}}))
-  Core.TypePair v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "pair"),
-      Core.fieldTerm = (pairType v1)}}))
-  Core.TypeRecord v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "record"),
-      Core.fieldTerm = (rowType v1)}}))
-  Core.TypeSet v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "set"),
-      Core.fieldTerm = (type_ v1)}}))
-  Core.TypeUnion v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "union"),
-      Core.fieldTerm = (rowType v1)}}))
-  Core.TypeUnit -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "unit"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Core.TypeVariable v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "variable"),
-      Core.fieldTerm = (name v1)}}))
-  Core.TypeWrap v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wrap"),
-      Core.fieldTerm = (wrappedType v1)}}))
-
-typeApplicationTerm :: (Core.TypeApplicationTerm -> Core.Term)
-typeApplicationTerm x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (term (Core.typeApplicationTermBody x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (type_ (Core.typeApplicationTermType x))}]}))
-
-typeLambda :: (Core.TypeLambda -> Core.Term)
-typeLambda x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.TypeLambda"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "parameter"),
-      Core.fieldTerm = (name (Core.typeLambdaParameter x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (term (Core.typeLambdaBody x))}]}))
-
-typeScheme :: (Core.TypeScheme -> Core.Term)
-typeScheme x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.TypeScheme"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "variables"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map name xs)) (Core.typeSchemeVariables x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (type_ (Core.typeSchemeType x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "constraints"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\m -> Core.TermMap (Maps.bimap name typeVariableMetadata m)) opt)) (Core.typeSchemeConstraints x))}]}))
-
-typeVariableMetadata :: (Core.TypeVariableMetadata -> Core.Term)
-typeVariableMetadata x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "classes"),
-      Core.fieldTerm = ((\s -> Core.TermSet (Sets.map name s)) (Core.typeVariableMetadataClasses x))}]}))
-
-wrappedTerm :: (Core.WrappedTerm -> Core.Term)
-wrappedTerm x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (name (Core.wrappedTermTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (term (Core.wrappedTermBody x))}]}))
-
-wrappedType :: (Core.WrappedType -> Core.Term)
-wrappedType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.WrappedType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (name (Core.wrappedTypeTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (type_ (Core.wrappedTypeBody x))}]}))
+annotatedTerm :: Core.AnnotatedTerm -> Core.Term
+annotatedTerm x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (term (Core.annotatedTermBody x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "annotation"),
+          Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap name term m)) (Core.annotatedTermAnnotation x))}]})
+
+annotatedType :: Core.AnnotatedType -> Core.Term
+annotatedType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (type_ (Core.annotatedTypeBody x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "annotation"),
+          Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap name term m)) (Core.annotatedTypeAnnotation x))}]})
+
+application :: Core.Application -> Core.Term
+application x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Application"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (term (Core.applicationFunction x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (term (Core.applicationArgument x))}]})
+
+applicationType :: Core.ApplicationType -> Core.Term
+applicationType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.ApplicationType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (type_ (Core.applicationTypeFunction x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "argument"),
+          Core.fieldTerm = (type_ (Core.applicationTypeArgument x))}]})
+
+binding :: Core.Binding -> Core.Term
+binding x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Binding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (name (Core.bindingName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (term (Core.bindingTerm x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map typeScheme opt)) (Core.bindingType x))}]})
+
+caseStatement :: Core.CaseStatement -> Core.Term
+caseStatement x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.CaseStatement"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (name (Core.caseStatementTypeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "default"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map term opt)) (Core.caseStatementDefault x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map field xs)) (Core.caseStatementCases x))}]})
+
+eitherType :: Core.EitherType -> Core.Term
+eitherType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.EitherType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (type_ (Core.eitherTypeLeft x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (type_ (Core.eitherTypeRight x))}]})
+
+elimination :: Core.Elimination -> Core.Term
+elimination x =
+    case x of
+      Core.EliminationRecord v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "record"),
+          Core.fieldTerm = (projection v0)}})
+      Core.EliminationUnion v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "union"),
+          Core.fieldTerm = (caseStatement v0)}})
+      Core.EliminationWrap v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrap"),
+          Core.fieldTerm = (name v0)}})
+
+field :: Core.Field -> Core.Term
+field x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Field"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (name (Core.fieldName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (term (Core.fieldTerm x))}]})
+
+fieldType :: Core.FieldType -> Core.Term
+fieldType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.FieldType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (name (Core.fieldTypeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (type_ (Core.fieldTypeType x))}]})
+
+floatType :: Core.FloatType -> Core.Term
+floatType x =
+    case x of
+      Core.FloatTypeBigfloat -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "bigfloat"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.FloatTypeFloat32 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "float32"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.FloatTypeFloat64 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "float64"),
+          Core.fieldTerm = Core.TermUnit}})
+
+floatValue :: Core.FloatValue -> Core.Term
+floatValue x =
+    case x of
+      Core.FloatValueBigfloat v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "bigfloat"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat v0)))}})
+      Core.FloatValueFloat32 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "float32"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 v0)))}})
+      Core.FloatValueFloat64 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "float64"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 v0)))}})
+
+forallType :: Core.ForallType -> Core.Term
+forallType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.ForallType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (name (Core.forallTypeParameter x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (type_ (Core.forallTypeBody x))}]})
+
+function :: Core.Function -> Core.Term
+function x =
+    case x of
+      Core.FunctionElimination v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "elimination"),
+          Core.fieldTerm = (elimination v0)}})
+      Core.FunctionLambda v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lambda"),
+          Core.fieldTerm = (lambda v0)}})
+      Core.FunctionPrimitive v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "primitive"),
+          Core.fieldTerm = (name v0)}})
+
+functionType :: Core.FunctionType -> Core.Term
+functionType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.FunctionType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (type_ (Core.functionTypeDomain x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = (type_ (Core.functionTypeCodomain x))}]})
+
+injection :: Core.Injection -> Core.Term
+injection x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (name (Core.injectionTypeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (field (Core.injectionField x))}]})
+
+integerType :: Core.IntegerType -> Core.Term
+integerType x =
+    case x of
+      Core.IntegerTypeBigint -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "bigint"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.IntegerTypeInt8 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "int8"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.IntegerTypeInt16 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "int16"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.IntegerTypeInt32 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "int32"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.IntegerTypeInt64 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "int64"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.IntegerTypeUint8 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "uint8"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.IntegerTypeUint16 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "uint16"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.IntegerTypeUint32 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "uint32"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.IntegerTypeUint64 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "uint64"),
+          Core.fieldTerm = Core.TermUnit}})
+
+integerValue :: Core.IntegerValue -> Core.Term
+integerValue x =
+    case x of
+      Core.IntegerValueBigint v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "bigint"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint v0)))}})
+      Core.IntegerValueInt8 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "int8"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 v0)))}})
+      Core.IntegerValueInt16 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "int16"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 v0)))}})
+      Core.IntegerValueInt32 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "int32"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
+      Core.IntegerValueInt64 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "int64"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 v0)))}})
+      Core.IntegerValueUint8 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "uint8"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 v0)))}})
+      Core.IntegerValueUint16 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "uint16"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 v0)))}})
+      Core.IntegerValueUint32 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "uint32"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 v0)))}})
+      Core.IntegerValueUint64 v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "uint64"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 v0)))}})
+
+lambda :: Core.Lambda -> Core.Term
+lambda x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Lambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (name (Core.lambdaParameter x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map type_ opt)) (Core.lambdaDomain x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (term (Core.lambdaBody x))}]})
+
+let_ :: Core.Let -> Core.Term
+let_ x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Let"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map binding xs)) (Core.letBindings x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (term (Core.letBody x))}]})
+
+literal :: Core.Literal -> Core.Term
+literal x =
+    case x of
+      Core.LiteralBinary v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "binary"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralBinary v0))}})
+      Core.LiteralBoolean v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "boolean"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean v0))}})
+      Core.LiteralFloat v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "float"),
+          Core.fieldTerm = (floatValue v0)}})
+      Core.LiteralInteger v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "integer"),
+          Core.fieldTerm = (integerValue v0)}})
+      Core.LiteralString v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "string"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v0))}})
+
+literalType :: Core.LiteralType -> Core.Term
+literalType x =
+    case x of
+      Core.LiteralTypeBinary -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "binary"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.LiteralTypeBoolean -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "boolean"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.LiteralTypeFloat v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "float"),
+          Core.fieldTerm = (floatType v0)}})
+      Core.LiteralTypeInteger v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "integer"),
+          Core.fieldTerm = (integerType v0)}})
+      Core.LiteralTypeString -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "string"),
+          Core.fieldTerm = Core.TermUnit}})
+
+mapType :: Core.MapType -> Core.Term
+mapType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.MapType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "keys"),
+          Core.fieldTerm = (type_ (Core.mapTypeKeys x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "values"),
+          Core.fieldTerm = (type_ (Core.mapTypeValues x))}]})
+
+name :: Core.Name -> Core.Term
+name x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Core.unName x))})
+
+pairType :: Core.PairType -> Core.Term
+pairType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.PairType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "first"),
+          Core.fieldTerm = (type_ (Core.pairTypeFirst x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "second"),
+          Core.fieldTerm = (type_ (Core.pairTypeSecond x))}]})
+
+projection :: Core.Projection -> Core.Term
+projection x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Projection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (name (Core.projectionTypeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = (name (Core.projectionField x))}]})
+
+record :: Core.Record -> Core.Term
+record x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Record"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (name (Core.recordTypeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fields"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map field xs)) (Core.recordFields x))}]})
+
+term :: Core.Term -> Core.Term
+term x =
+    case x of
+      Core.TermAnnotated v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "annotated"),
+          Core.fieldTerm = (annotatedTerm v0)}})
+      Core.TermApplication v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "application"),
+          Core.fieldTerm = (application v0)}})
+      Core.TermEither v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "either"),
+          Core.fieldTerm = (Core.TermEither (Eithers.bimap term term v0))}})
+      Core.TermFunction v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (function v0)}})
+      Core.TermLet v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "let"),
+          Core.fieldTerm = (let_ v0)}})
+      Core.TermList v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "list"),
+          Core.fieldTerm = (Core.TermList (Lists.map term v0))}})
+      Core.TermLiteral v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "literal"),
+          Core.fieldTerm = (literal v0)}})
+      Core.TermMap v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "map"),
+          Core.fieldTerm = (Core.TermMap (Maps.bimap term term v0))}})
+      Core.TermMaybe v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "maybe"),
+          Core.fieldTerm = (Core.TermMaybe (Maybes.map term v0))}})
+      Core.TermPair v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pair"),
+          Core.fieldTerm = (Core.TermPair (Pairs.bimap term term v0))}})
+      Core.TermRecord v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "record"),
+          Core.fieldTerm = (record v0)}})
+      Core.TermSet v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "set"),
+          Core.fieldTerm = (Core.TermSet (Sets.map term v0))}})
+      Core.TermTypeApplication v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeApplication"),
+          Core.fieldTerm = (typeApplicationTerm v0)}})
+      Core.TermTypeLambda v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeLambda"),
+          Core.fieldTerm = (typeLambda v0)}})
+      Core.TermUnion v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "union"),
+          Core.fieldTerm = (injection v0)}})
+      Core.TermUnit -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unit"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.TermVariable v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = (name v0)}})
+      Core.TermWrap v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrap"),
+          Core.fieldTerm = (wrappedTerm v0)}})
+
+type_ :: Core.Type -> Core.Term
+type_ x =
+    case x of
+      Core.TypeAnnotated v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "annotated"),
+          Core.fieldTerm = (annotatedType v0)}})
+      Core.TypeApplication v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "application"),
+          Core.fieldTerm = (applicationType v0)}})
+      Core.TypeEither v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "either"),
+          Core.fieldTerm = (eitherType v0)}})
+      Core.TypeForall v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "forall"),
+          Core.fieldTerm = (forallType v0)}})
+      Core.TypeFunction v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = (functionType v0)}})
+      Core.TypeList v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "list"),
+          Core.fieldTerm = (type_ v0)}})
+      Core.TypeLiteral v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "literal"),
+          Core.fieldTerm = (literalType v0)}})
+      Core.TypeMap v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "map"),
+          Core.fieldTerm = (mapType v0)}})
+      Core.TypeMaybe v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "maybe"),
+          Core.fieldTerm = (type_ v0)}})
+      Core.TypePair v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pair"),
+          Core.fieldTerm = (pairType v0)}})
+      Core.TypeRecord v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "record"),
+          Core.fieldTerm = (Core.TermList (Lists.map fieldType v0))}})
+      Core.TypeSet v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "set"),
+          Core.fieldTerm = (type_ v0)}})
+      Core.TypeUnion v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "union"),
+          Core.fieldTerm = (Core.TermList (Lists.map fieldType v0))}})
+      Core.TypeUnit -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unit"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.TypeVariable v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = (name v0)}})
+      Core.TypeVoid -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "void"),
+          Core.fieldTerm = Core.TermUnit}})
+      Core.TypeWrap v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrap"),
+          Core.fieldTerm = (type_ v0)}})
+
+typeApplicationTerm :: Core.TypeApplicationTerm -> Core.Term
+typeApplicationTerm x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (term (Core.typeApplicationTermBody x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (type_ (Core.typeApplicationTermType x))}]})
+
+typeLambda :: Core.TypeLambda -> Core.Term
+typeLambda x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeLambda"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "parameter"),
+          Core.fieldTerm = (name (Core.typeLambdaParameter x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (term (Core.typeLambdaBody x))}]})
+
+typeScheme :: Core.TypeScheme -> Core.Term
+typeScheme x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeScheme"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map name xs)) (Core.typeSchemeVariables x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (type_ (Core.typeSchemeType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "constraints"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\m -> Core.TermMap (Maps.bimap name typeVariableMetadata m)) opt)) (Core.typeSchemeConstraints x))}]})
+
+typeVariableMetadata :: Core.TypeVariableMetadata -> Core.Term
+typeVariableMetadata x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "classes"),
+          Core.fieldTerm = ((\s -> Core.TermSet (Sets.map name s)) (Core.typeVariableMetadataClasses x))}]})
+
+wrappedTerm :: Core.WrappedTerm -> Core.Term
+wrappedTerm x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (name (Core.wrappedTermTypeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (term (Core.wrappedTermBody x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Error/Checking.hs b/src/gen-main/haskell/Hydra/Encode/Error/Checking.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Encode/Error/Checking.hs
@@ -0,0 +1,181 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term encoders for hydra.error.checking
+
+module Hydra.Encode.Error.Checking where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Encode.Core as Core_
+import qualified Hydra.Encode.Typing as Typing
+import qualified Hydra.Encode.Variants as Variants
+import qualified Hydra.Error.Checking as Checking
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Sets as Sets
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+checkingError :: Checking.CheckingError -> Core.Term
+checkingError x =
+    case x of
+      Checking.CheckingErrorIncorrectUnification v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "incorrectUnification"),
+          Core.fieldTerm = (incorrectUnificationError v0)}})
+      Checking.CheckingErrorNotAForallType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "notAForallType"),
+          Core.fieldTerm = (notAForallTypeError v0)}})
+      Checking.CheckingErrorNotAFunctionType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "notAFunctionType"),
+          Core.fieldTerm = (notAFunctionTypeError v0)}})
+      Checking.CheckingErrorTypeArityMismatch v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeArityMismatch"),
+          Core.fieldTerm = (typeArityMismatchError v0)}})
+      Checking.CheckingErrorTypeMismatch v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeMismatch"),
+          Core.fieldTerm = (typeMismatchError v0)}})
+      Checking.CheckingErrorUnboundTypeVariables v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unboundTypeVariables"),
+          Core.fieldTerm = (unboundTypeVariablesError v0)}})
+      Checking.CheckingErrorUnequalTypes v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unequalTypes"),
+          Core.fieldTerm = (unequalTypesError v0)}})
+      Checking.CheckingErrorUnsupportedTermVariant v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unsupportedTermVariant"),
+          Core.fieldTerm = (unsupportedTermVariantError v0)}})
+      Checking.CheckingErrorUntypedLambda v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "untypedLambda"),
+          Core.fieldTerm = (untypedLambdaError v0)}})
+      Checking.CheckingErrorUntypedLetBinding v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "untypedLetBinding"),
+          Core.fieldTerm = (untypedLetBindingError v0)}})
+
+incorrectUnificationError :: Checking.IncorrectUnificationError -> Core.Term
+incorrectUnificationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.IncorrectUnificationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "substitution"),
+          Core.fieldTerm = (Typing.typeSubst (Checking.incorrectUnificationErrorSubstitution x))}]})
+
+notAForallTypeError :: Checking.NotAForallTypeError -> Core.Term
+notAForallTypeError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Checking.notAForallTypeErrorType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.type_ xs)) (Checking.notAForallTypeErrorTypeArguments x))}]})
+
+notAFunctionTypeError :: Checking.NotAFunctionTypeError -> Core.Term
+notAFunctionTypeError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.NotAFunctionTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Checking.notAFunctionTypeErrorType x))}]})
+
+typeArityMismatchError :: Checking.TypeArityMismatchError -> Core.Term
+typeArityMismatchError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Checking.typeArityMismatchErrorType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedArity"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Checking.typeArityMismatchErrorExpectedArity x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualArity"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Checking.typeArityMismatchErrorActualArity x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeArguments"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.type_ xs)) (Checking.typeArityMismatchErrorTypeArguments x))}]})
+
+typeMismatchError :: Checking.TypeMismatchError -> Core.Term
+typeMismatchError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedType"),
+          Core.fieldTerm = (Core_.type_ (Checking.typeMismatchErrorExpectedType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualType"),
+          Core.fieldTerm = (Core_.type_ (Checking.typeMismatchErrorActualType x))}]})
+
+unboundTypeVariablesError :: Checking.UnboundTypeVariablesError -> Core.Term
+unboundTypeVariablesError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = ((\s -> Core.TermSet (Sets.map Core_.name s)) (Checking.unboundTypeVariablesErrorVariables x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Checking.unboundTypeVariablesErrorType x))}]})
+
+unequalTypesError :: Checking.UnequalTypesError -> Core.Term
+unequalTypesError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "types"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.type_ xs)) (Checking.unequalTypesErrorTypes x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Checking.unequalTypesErrorDescription x))}]})
+
+unsupportedTermVariantError :: Checking.UnsupportedTermVariantError -> Core.Term
+unsupportedTermVariantError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UnsupportedTermVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "termVariant"),
+          Core.fieldTerm = (Variants.termVariant (Checking.unsupportedTermVariantErrorTermVariant x))}]})
+
+untypedLambdaError :: t0 -> Core.Term
+untypedLambdaError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UntypedLambdaError"),
+      Core.recordFields = []})
+
+untypedLetBindingError :: Checking.UntypedLetBindingError -> Core.Term
+untypedLetBindingError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.checking.UntypedLetBindingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "binding"),
+          Core.fieldTerm = (Core_.binding (Checking.untypedLetBindingErrorBinding x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Error/Core.hs b/src/gen-main/haskell/Hydra/Encode/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Encode/Error/Core.hs
@@ -0,0 +1,643 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term encoders for hydra.error.core
+
+module Hydra.Encode.Error.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Encode.Core as Core_
+import qualified Hydra.Encode.Paths as Paths
+import qualified Hydra.Encode.Variants as Variants
+import qualified Hydra.Error.Core as Core__
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+constantConditionError :: Core__.ConstantConditionError -> Core.Term
+constantConditionError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.constantConditionErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Core__.constantConditionErrorValue x))}]})
+
+duplicateBindingError :: Core__.DuplicateBindingError -> Core.Term
+duplicateBindingError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.duplicateBindingErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.duplicateBindingErrorName x))}]})
+
+duplicateFieldError :: Core__.DuplicateFieldError -> Core.Term
+duplicateFieldError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.duplicateFieldErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.duplicateFieldErrorName x))}]})
+
+duplicateRecordTypeFieldNamesError :: Core__.DuplicateRecordTypeFieldNamesError -> Core.Term
+duplicateRecordTypeFieldNamesError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.duplicateRecordTypeFieldNamesErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.duplicateRecordTypeFieldNamesErrorName x))}]})
+
+duplicateUnionTypeFieldNamesError :: Core__.DuplicateUnionTypeFieldNamesError -> Core.Term
+duplicateUnionTypeFieldNamesError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.duplicateUnionTypeFieldNamesErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.duplicateUnionTypeFieldNamesErrorName x))}]})
+
+emptyCaseStatementError :: Core__.EmptyCaseStatementError -> Core.Term
+emptyCaseStatementError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.emptyCaseStatementErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core_.name (Core__.emptyCaseStatementErrorTypeName x))}]})
+
+emptyLetBindingsError :: Core__.EmptyLetBindingsError -> Core.Term
+emptyLetBindingsError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyLetBindingsError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.emptyLetBindingsErrorLocation x))}]})
+
+emptyRecordTypeError :: Core__.EmptyRecordTypeError -> Core.Term
+emptyRecordTypeError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyRecordTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.emptyRecordTypeErrorLocation x))}]})
+
+emptyTermAnnotationError :: Core__.EmptyTermAnnotationError -> Core.Term
+emptyTermAnnotationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTermAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.emptyTermAnnotationErrorLocation x))}]})
+
+emptyTypeAnnotationError :: Core__.EmptyTypeAnnotationError -> Core.Term
+emptyTypeAnnotationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTypeAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.emptyTypeAnnotationErrorLocation x))}]})
+
+emptyTypeNameInTermError :: Core__.EmptyTypeNameInTermError -> Core.Term
+emptyTypeNameInTermError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTypeNameInTermError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.emptyTypeNameInTermErrorLocation x))}]})
+
+emptyUnionTypeError :: Core__.EmptyUnionTypeError -> Core.Term
+emptyUnionTypeError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyUnionTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.emptyUnionTypeErrorLocation x))}]})
+
+invalidForallParameterNameError :: Core__.InvalidForallParameterNameError -> Core.Term
+invalidForallParameterNameError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.invalidForallParameterNameErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.invalidForallParameterNameErrorName x))}]})
+
+invalidLambdaParameterNameError :: Core__.InvalidLambdaParameterNameError -> Core.Term
+invalidLambdaParameterNameError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.invalidLambdaParameterNameErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.invalidLambdaParameterNameErrorName x))}]})
+
+invalidLetBindingNameError :: Core__.InvalidLetBindingNameError -> Core.Term
+invalidLetBindingNameError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.invalidLetBindingNameErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.invalidLetBindingNameErrorName x))}]})
+
+invalidTermError :: Core__.InvalidTermError -> Core.Term
+invalidTermError x =
+    case x of
+      Core__.InvalidTermErrorConstantCondition v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "constantCondition"),
+          Core.fieldTerm = (constantConditionError v0)}})
+      Core__.InvalidTermErrorDuplicateBinding v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "duplicateBinding"),
+          Core.fieldTerm = (duplicateBindingError v0)}})
+      Core__.InvalidTermErrorDuplicateField v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "duplicateField"),
+          Core.fieldTerm = (duplicateFieldError v0)}})
+      Core__.InvalidTermErrorEmptyCaseStatement v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "emptyCaseStatement"),
+          Core.fieldTerm = (emptyCaseStatementError v0)}})
+      Core__.InvalidTermErrorEmptyLetBindings v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "emptyLetBindings"),
+          Core.fieldTerm = (emptyLetBindingsError v0)}})
+      Core__.InvalidTermErrorEmptyTermAnnotation v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "emptyTermAnnotation"),
+          Core.fieldTerm = (emptyTermAnnotationError v0)}})
+      Core__.InvalidTermErrorEmptyTypeNameInTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "emptyTypeNameInTerm"),
+          Core.fieldTerm = (emptyTypeNameInTermError v0)}})
+      Core__.InvalidTermErrorInvalidLambdaParameterName v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "invalidLambdaParameterName"),
+          Core.fieldTerm = (invalidLambdaParameterNameError v0)}})
+      Core__.InvalidTermErrorInvalidLetBindingName v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "invalidLetBindingName"),
+          Core.fieldTerm = (invalidLetBindingNameError v0)}})
+      Core__.InvalidTermErrorInvalidTypeLambdaParameterName v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "invalidTypeLambdaParameterName"),
+          Core.fieldTerm = (invalidTypeLambdaParameterNameError v0)}})
+      Core__.InvalidTermErrorNestedTermAnnotation v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "nestedTermAnnotation"),
+          Core.fieldTerm = (nestedTermAnnotationError v0)}})
+      Core__.InvalidTermErrorRedundantWrapUnwrap v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "redundantWrapUnwrap"),
+          Core.fieldTerm = (redundantWrapUnwrapError v0)}})
+      Core__.InvalidTermErrorSelfApplication v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "selfApplication"),
+          Core.fieldTerm = (selfApplicationError v0)}})
+      Core__.InvalidTermErrorTermVariableShadowing v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "termVariableShadowing"),
+          Core.fieldTerm = (termVariableShadowingError v0)}})
+      Core__.InvalidTermErrorTypeVariableShadowingInTypeLambda v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeVariableShadowingInTypeLambda"),
+          Core.fieldTerm = (typeVariableShadowingInTypeLambdaError v0)}})
+      Core__.InvalidTermErrorUndefinedTermVariable v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "undefinedTermVariable"),
+          Core.fieldTerm = (undefinedTermVariableError v0)}})
+      Core__.InvalidTermErrorUndefinedTypeVariableInBindingType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "undefinedTypeVariableInBindingType"),
+          Core.fieldTerm = (undefinedTypeVariableInBindingTypeError v0)}})
+      Core__.InvalidTermErrorUndefinedTypeVariableInLambdaDomain v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "undefinedTypeVariableInLambdaDomain"),
+          Core.fieldTerm = (undefinedTypeVariableInLambdaDomainError v0)}})
+      Core__.InvalidTermErrorUndefinedTypeVariableInTypeApplication v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "undefinedTypeVariableInTypeApplication"),
+          Core.fieldTerm = (undefinedTypeVariableInTypeApplicationError v0)}})
+      Core__.InvalidTermErrorUnknownPrimitiveName v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unknownPrimitiveName"),
+          Core.fieldTerm = (unknownPrimitiveNameError v0)}})
+      Core__.InvalidTermErrorUnnecessaryIdentityApplication v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unnecessaryIdentityApplication"),
+          Core.fieldTerm = (unnecessaryIdentityApplicationError v0)}})
+      Core__.InvalidTermErrorUntypedTermVariable v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "untypedTermVariable"),
+          Core.fieldTerm = (untypedTermVariableError v0)}})
+
+invalidTypeError :: Core__.InvalidTypeError -> Core.Term
+invalidTypeError x =
+    case x of
+      Core__.InvalidTypeErrorDuplicateRecordTypeFieldNames v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "duplicateRecordTypeFieldNames"),
+          Core.fieldTerm = (duplicateRecordTypeFieldNamesError v0)}})
+      Core__.InvalidTypeErrorDuplicateUnionTypeFieldNames v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "duplicateUnionTypeFieldNames"),
+          Core.fieldTerm = (duplicateUnionTypeFieldNamesError v0)}})
+      Core__.InvalidTypeErrorEmptyRecordType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "emptyRecordType"),
+          Core.fieldTerm = (emptyRecordTypeError v0)}})
+      Core__.InvalidTypeErrorEmptyTypeAnnotation v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "emptyTypeAnnotation"),
+          Core.fieldTerm = (emptyTypeAnnotationError v0)}})
+      Core__.InvalidTypeErrorEmptyUnionType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "emptyUnionType"),
+          Core.fieldTerm = (emptyUnionTypeError v0)}})
+      Core__.InvalidTypeErrorInvalidForallParameterName v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "invalidForallParameterName"),
+          Core.fieldTerm = (invalidForallParameterNameError v0)}})
+      Core__.InvalidTypeErrorInvalidTypeSchemeVariableName v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "invalidTypeSchemeVariableName"),
+          Core.fieldTerm = (invalidTypeSchemeVariableNameError v0)}})
+      Core__.InvalidTypeErrorNestedTypeAnnotation v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "nestedTypeAnnotation"),
+          Core.fieldTerm = (nestedTypeAnnotationError v0)}})
+      Core__.InvalidTypeErrorNonComparableMapKeyType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "nonComparableMapKeyType"),
+          Core.fieldTerm = (nonComparableMapKeyTypeError v0)}})
+      Core__.InvalidTypeErrorNonComparableSetElementType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "nonComparableSetElementType"),
+          Core.fieldTerm = (nonComparableSetElementTypeError v0)}})
+      Core__.InvalidTypeErrorSingleVariantUnion v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "singleVariantUnion"),
+          Core.fieldTerm = (singleVariantUnionError v0)}})
+      Core__.InvalidTypeErrorTypeVariableShadowingInForall v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeVariableShadowingInForall"),
+          Core.fieldTerm = (typeVariableShadowingInForallError v0)}})
+      Core__.InvalidTypeErrorUndefinedTypeVariable v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "undefinedTypeVariable"),
+          Core.fieldTerm = (undefinedTypeVariableError v0)}})
+      Core__.InvalidTypeErrorVoidInNonBottomPosition v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "voidInNonBottomPosition"),
+          Core.fieldTerm = (voidInNonBottomPositionError v0)}})
+
+invalidTypeLambdaParameterNameError :: Core__.InvalidTypeLambdaParameterNameError -> Core.Term
+invalidTypeLambdaParameterNameError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.invalidTypeLambdaParameterNameErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.invalidTypeLambdaParameterNameErrorName x))}]})
+
+invalidTypeSchemeVariableNameError :: Core__.InvalidTypeSchemeVariableNameError -> Core.Term
+invalidTypeSchemeVariableNameError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.invalidTypeSchemeVariableNameErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.invalidTypeSchemeVariableNameErrorName x))}]})
+
+nestedTermAnnotationError :: Core__.NestedTermAnnotationError -> Core.Term
+nestedTermAnnotationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NestedTermAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.nestedTermAnnotationErrorLocation x))}]})
+
+nestedTypeAnnotationError :: Core__.NestedTypeAnnotationError -> Core.Term
+nestedTypeAnnotationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NestedTypeAnnotationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.nestedTypeAnnotationErrorLocation x))}]})
+
+nonComparableMapKeyTypeError :: Core__.NonComparableMapKeyTypeError -> Core.Term
+nonComparableMapKeyTypeError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.nonComparableMapKeyTypeErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "keyType"),
+          Core.fieldTerm = (Core_.type_ (Core__.nonComparableMapKeyTypeErrorKeyType x))}]})
+
+nonComparableSetElementTypeError :: Core__.NonComparableSetElementTypeError -> Core.Term
+nonComparableSetElementTypeError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.nonComparableSetElementTypeErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "elementType"),
+          Core.fieldTerm = (Core_.type_ (Core__.nonComparableSetElementTypeErrorElementType x))}]})
+
+redundantWrapUnwrapError :: Core__.RedundantWrapUnwrapError -> Core.Term
+redundantWrapUnwrapError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.redundantWrapUnwrapErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core_.name (Core__.redundantWrapUnwrapErrorTypeName x))}]})
+
+selfApplicationError :: Core__.SelfApplicationError -> Core.Term
+selfApplicationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.selfApplicationErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.selfApplicationErrorName x))}]})
+
+singleVariantUnionError :: Core__.SingleVariantUnionError -> Core.Term
+singleVariantUnionError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.singleVariantUnionErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fieldName"),
+          Core.fieldTerm = (Core_.name (Core__.singleVariantUnionErrorFieldName x))}]})
+
+termVariableShadowingError :: Core__.TermVariableShadowingError -> Core.Term
+termVariableShadowingError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.termVariableShadowingErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.termVariableShadowingErrorName x))}]})
+
+typeVariableShadowingInForallError :: Core__.TypeVariableShadowingInForallError -> Core.Term
+typeVariableShadowingInForallError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.typeVariableShadowingInForallErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.typeVariableShadowingInForallErrorName x))}]})
+
+typeVariableShadowingInTypeLambdaError :: Core__.TypeVariableShadowingInTypeLambdaError -> Core.Term
+typeVariableShadowingInTypeLambdaError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.typeVariableShadowingInTypeLambdaErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.typeVariableShadowingInTypeLambdaErrorName x))}]})
+
+undefinedFieldError :: Core__.UndefinedFieldError -> Core.Term
+undefinedFieldError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fieldName"),
+          Core.fieldTerm = (Core_.name (Core__.undefinedFieldErrorFieldName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (Core_.name (Core__.undefinedFieldErrorTypeName x))}]})
+
+undefinedTermVariableError :: Core__.UndefinedTermVariableError -> Core.Term
+undefinedTermVariableError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.undefinedTermVariableErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.undefinedTermVariableErrorName x))}]})
+
+undefinedTypeVariableError :: Core__.UndefinedTypeVariableError -> Core.Term
+undefinedTypeVariableError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.undefinedTypeVariableErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.undefinedTypeVariableErrorName x))}]})
+
+undefinedTypeVariableInBindingTypeError :: Core__.UndefinedTypeVariableInBindingTypeError -> Core.Term
+undefinedTypeVariableInBindingTypeError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.undefinedTypeVariableInBindingTypeErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.undefinedTypeVariableInBindingTypeErrorName x))}]})
+
+undefinedTypeVariableInLambdaDomainError :: Core__.UndefinedTypeVariableInLambdaDomainError -> Core.Term
+undefinedTypeVariableInLambdaDomainError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.undefinedTypeVariableInLambdaDomainErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.undefinedTypeVariableInLambdaDomainErrorName x))}]})
+
+undefinedTypeVariableInTypeApplicationError :: Core__.UndefinedTypeVariableInTypeApplicationError -> Core.Term
+undefinedTypeVariableInTypeApplicationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.undefinedTypeVariableInTypeApplicationErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.undefinedTypeVariableInTypeApplicationErrorName x))}]})
+
+unexpectedTermVariantError :: Core__.UnexpectedTermVariantError -> Core.Term
+unexpectedTermVariantError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedVariant"),
+          Core.fieldTerm = (Variants.termVariant (Core__.unexpectedTermVariantErrorExpectedVariant x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualTerm"),
+          Core.fieldTerm = (Core_.term (Core__.unexpectedTermVariantErrorActualTerm x))}]})
+
+unexpectedTypeVariantError :: Core__.UnexpectedTypeVariantError -> Core.Term
+unexpectedTypeVariantError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "expectedVariant"),
+          Core.fieldTerm = (Variants.typeVariant (Core__.unexpectedTypeVariantErrorExpectedVariant x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "actualType"),
+          Core.fieldTerm = (Core_.type_ (Core__.unexpectedTypeVariantErrorActualType x))}]})
+
+unknownPrimitiveNameError :: Core__.UnknownPrimitiveNameError -> Core.Term
+unknownPrimitiveNameError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.unknownPrimitiveNameErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.unknownPrimitiveNameErrorName x))}]})
+
+unnecessaryIdentityApplicationError :: Core__.UnnecessaryIdentityApplicationError -> Core.Term
+unnecessaryIdentityApplicationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.unnecessaryIdentityApplicationErrorLocation x))}]})
+
+untypedTermVariableError :: Core__.UntypedTermVariableError -> Core.Term
+untypedTermVariableError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.untypedTermVariableErrorLocation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Core__.untypedTermVariableErrorName x))}]})
+
+voidInNonBottomPositionError :: Core__.VoidInNonBottomPositionError -> Core.Term
+voidInNonBottomPositionError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.error.core.VoidInNonBottomPositionError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "location"),
+          Core.fieldTerm = (Paths.subtermPath (Core__.voidInNonBottomPositionErrorLocation x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Errors.hs b/src/gen-main/haskell/Hydra/Encode/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Encode/Errors.hs
@@ -0,0 +1,103 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term encoders for hydra.errors
+
+module Hydra.Encode.Errors where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Encode.Core as Core_
+import qualified Hydra.Encode.Error.Checking as Checking
+import qualified Hydra.Encode.Error.Core as Core__
+import qualified Hydra.Errors as Errors
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+decodingError :: Errors.DecodingError -> Core.Term
+decodingError x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Errors.unDecodingError x))})
+
+error :: Errors.Error -> Core.Term
+error x =
+    case x of
+      Errors.ErrorChecking v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "checking"),
+          Core.fieldTerm = (Checking.checkingError v0)}})
+      Errors.ErrorDecoding v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "decoding"),
+          Core.fieldTerm = (decodingError v0)}})
+      Errors.ErrorDuplicateBinding v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "duplicateBinding"),
+          Core.fieldTerm = (Core__.duplicateBindingError v0)}})
+      Errors.ErrorDuplicateField v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "duplicateField"),
+          Core.fieldTerm = (Core__.duplicateFieldError v0)}})
+      Errors.ErrorOther v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "other"),
+          Core.fieldTerm = (otherError v0)}})
+      Errors.ErrorUndefinedField v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "undefinedField"),
+          Core.fieldTerm = (Core__.undefinedFieldError v0)}})
+      Errors.ErrorUndefinedTermVariable v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "undefinedTermVariable"),
+          Core.fieldTerm = (Core__.undefinedTermVariableError v0)}})
+      Errors.ErrorUntypedTermVariable v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "untypedTermVariable"),
+          Core.fieldTerm = (Core__.untypedTermVariableError v0)}})
+      Errors.ErrorUnexpectedTermVariant v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unexpectedTermVariant"),
+          Core.fieldTerm = (Core__.unexpectedTermVariantError v0)}})
+      Errors.ErrorUnexpectedTypeVariant v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unexpectedTypeVariant"),
+          Core.fieldTerm = (Core__.unexpectedTypeVariantError v0)}})
+      Errors.ErrorUnification v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unification"),
+          Core.fieldTerm = (unificationError v0)}})
+
+otherError :: Errors.OtherError -> Core.Term
+otherError x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.errors.OtherError"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Errors.unOtherError x))})
+
+unificationError :: Errors.UnificationError -> Core.Term
+unificationError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.errors.UnificationError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "leftType"),
+          Core.fieldTerm = (Core_.type_ (Errors.unificationErrorLeftType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rightType"),
+          Core.fieldTerm = (Core_.type_ (Errors.unificationErrorRightType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Errors.unificationErrorMessage x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Grammar.hs b/src/gen-main/haskell/Hydra/Encode/Grammar.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Encode/Grammar.hs
+++ /dev/null
@@ -1,120 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term encoders for hydra.grammar
-
-module Hydra.Encode.Grammar where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Grammar as Grammar
-import qualified Hydra.Lib.Lists as Lists
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-constant :: (Grammar.Constant -> Core.Term)
-constant x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Constant"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Grammar.unConstant x))}))
-
-grammar :: (Grammar.Grammar -> Core.Term)
-grammar x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Grammar"),
-  Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map production xs)) (Grammar.unGrammar x))}))
-
-label :: (Grammar.Label -> Core.Term)
-label x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Label"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Grammar.unLabel x))}))
-
-labeledPattern :: (Grammar.LabeledPattern -> Core.Term)
-labeledPattern x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.grammar.LabeledPattern"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "label"),
-      Core.fieldTerm = (label (Grammar.labeledPatternLabel x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "pattern"),
-      Core.fieldTerm = (pattern (Grammar.labeledPatternPattern x))}]}))
-
-pattern :: (Grammar.Pattern -> Core.Term)
-pattern x = case x of
-  Grammar.PatternAlternatives v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "alternatives"),
-      Core.fieldTerm = (Core.TermList (Lists.map pattern v1))}}))
-  Grammar.PatternConstant v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "constant"),
-      Core.fieldTerm = (constant v1)}}))
-  Grammar.PatternIgnored v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "ignored"),
-      Core.fieldTerm = (pattern v1)}}))
-  Grammar.PatternLabeled v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "labeled"),
-      Core.fieldTerm = (labeledPattern v1)}}))
-  Grammar.PatternNil -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "nil"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Grammar.PatternNonterminal v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "nonterminal"),
-      Core.fieldTerm = (symbol v1)}}))
-  Grammar.PatternOption v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "option"),
-      Core.fieldTerm = (pattern v1)}}))
-  Grammar.PatternPlus v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "plus"),
-      Core.fieldTerm = (pattern v1)}}))
-  Grammar.PatternRegex v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "regex"),
-      Core.fieldTerm = (regex v1)}}))
-  Grammar.PatternSequence v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "sequence"),
-      Core.fieldTerm = (Core.TermList (Lists.map pattern v1))}}))
-  Grammar.PatternStar v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "star"),
-      Core.fieldTerm = (pattern v1)}}))
-
-production :: (Grammar.Production -> Core.Term)
-production x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.grammar.Production"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "symbol"),
-      Core.fieldTerm = (symbol (Grammar.productionSymbol x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "pattern"),
-      Core.fieldTerm = (pattern (Grammar.productionPattern x))}]}))
-
-regex :: (Grammar.Regex -> Core.Term)
-regex x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Regex"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Grammar.unRegex x))}))
-
-symbol :: (Grammar.Symbol -> Core.Term)
-symbol x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Symbol"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Grammar.unSymbol x))}))
diff --git a/src/gen-main/haskell/Hydra/Encode/Json/Model.hs b/src/gen-main/haskell/Hydra/Encode/Json/Model.hs
--- a/src/gen-main/haskell/Hydra/Encode/Json/Model.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Json/Model.hs
@@ -15,35 +15,36 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-value :: (Model.Value -> Core.Term)
-value x = case x of
-  Model.ValueArray v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "array"),
-      Core.fieldTerm = (Core.TermList (Lists.map value v1))}}))
-  Model.ValueBoolean v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "boolean"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean v1))}}))
-  Model.ValueNull -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "null"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Model.ValueNumber v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "number"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat v1)))}}))
-  Model.ValueObject v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "object"),
-      Core.fieldTerm = (Core.TermMap (Maps.bimap (\x -> Core.TermLiteral (Core.LiteralString x)) value v1))}}))
-  Model.ValueString v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "string"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v1))}}))
+value :: Model.Value -> Core.Term
+value x =
+    case x of
+      Model.ValueArray v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "array"),
+          Core.fieldTerm = (Core.TermList (Lists.map value v0))}})
+      Model.ValueBoolean v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "boolean"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean v0))}})
+      Model.ValueNull -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "null"),
+          Core.fieldTerm = Core.TermUnit}})
+      Model.ValueNumber v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "number"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat v0)))}})
+      Model.ValueObject v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (Core.TermMap (Maps.bimap (\x -> Core.TermLiteral (Core.LiteralString x)) value v0))}})
+      Model.ValueString v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "string"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v0))}})
diff --git a/src/gen-main/haskell/Hydra/Encode/Module.hs b/src/gen-main/haskell/Hydra/Encode/Module.hs
--- a/src/gen-main/haskell/Hydra/Encode/Module.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Module.hs
@@ -18,92 +18,100 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-definition :: (Module.Definition -> Core.Term)
-definition x = case x of
-  Module.DefinitionTerm v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (termDefinition v1)}}))
-  Module.DefinitionType v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (typeDefinition v1)}}))
+definition :: Module.Definition -> Core.Term
+definition x =
+    case x of
+      Module.DefinitionTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (termDefinition v0)}})
+      Module.DefinitionType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (typeDefinition v0)}})
 
-fileExtension :: (Module.FileExtension -> Core.Term)
-fileExtension x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.module.FileExtension"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Module.unFileExtension x))}))
+fileExtension :: Module.FileExtension -> Core.Term
+fileExtension x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.module.FileExtension"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Module.unFileExtension x))})
 
-module_ :: (Module.Module -> Core.Term)
-module_ x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.module.Module"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "namespace"),
-      Core.fieldTerm = (namespace (Module.moduleNamespace x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "elements"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.binding xs)) (Module.moduleElements x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "termDependencies"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map namespace xs)) (Module.moduleTermDependencies x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "typeDependencies"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map namespace xs)) (Module.moduleTypeDependencies x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "description"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\x -> Core.TermLiteral (Core.LiteralString x)) opt)) (Module.moduleDescription x))}]}))
+module_ :: Module.Module -> Core.Term
+module_ x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Module"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = (namespace (Module.moduleNamespace x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "definitions"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map definition xs)) (Module.moduleDefinitions x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "termDependencies"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map namespace xs)) (Module.moduleTermDependencies x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "typeDependencies"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map namespace xs)) (Module.moduleTypeDependencies x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\x -> Core.TermLiteral (Core.LiteralString x)) opt)) (Module.moduleDescription x))}]})
 
-namespace :: (Module.Namespace -> Core.Term)
-namespace x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.module.Namespace"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Module.unNamespace x))}))
+namespace :: Module.Namespace -> Core.Term
+namespace x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.module.Namespace"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Module.unNamespace x))})
 
-namespaces :: ((t0 -> Core.Term) -> Module.Namespaces t0 -> Core.Term)
-namespaces n x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.module.Namespaces"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "focus"),
-      Core.fieldTerm = ((\p -> Core.TermPair (Pairs.bimap namespace n p)) (Module.namespacesFocus x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "mapping"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap namespace n m)) (Module.namespacesMapping x))}]}))
+namespaces :: (t0 -> Core.Term) -> Module.Namespaces t0 -> Core.Term
+namespaces n x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.Namespaces"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "focus"),
+          Core.fieldTerm = ((\p -> Core.TermPair (Pairs.bimap namespace n p)) (Module.namespacesFocus x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "mapping"),
+          Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap namespace n m)) (Module.namespacesMapping x))}]})
 
-qualifiedName :: (Module.QualifiedName -> Core.Term)
-qualifiedName x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.module.QualifiedName"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "namespace"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map namespace opt)) (Module.qualifiedNameNamespace x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "local"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Module.qualifiedNameLocal x))}]}))
+qualifiedName :: Module.QualifiedName -> Core.Term
+qualifiedName x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.QualifiedName"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "namespace"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map namespace opt)) (Module.qualifiedNameNamespace x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "local"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Module.qualifiedNameLocal x))}]})
 
-termDefinition :: (Module.TermDefinition -> Core.Term)
-termDefinition x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.module.TermDefinition"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (Core_.name (Module.termDefinitionName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (Core_.term (Module.termDefinitionTerm x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.typeScheme (Module.termDefinitionType x))}]}))
+termDefinition :: Module.TermDefinition -> Core.Term
+termDefinition x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TermDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Module.termDefinitionName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core_.term (Module.termDefinitionTerm x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map Core_.typeScheme opt)) (Module.termDefinitionType x))}]})
 
-typeDefinition :: (Module.TypeDefinition -> Core.Term)
-typeDefinition x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.module.TypeDefinition"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (Core_.name (Module.typeDefinitionName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.type_ (Module.typeDefinitionType x))}]}))
+typeDefinition :: Module.TypeDefinition -> Core.Term
+typeDefinition x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.module.TypeDefinition"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Module.typeDefinitionName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Module.typeDefinitionType x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Parsing.hs b/src/gen-main/haskell/Hydra/Encode/Parsing.hs
--- a/src/gen-main/haskell/Hydra/Encode/Parsing.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Parsing.hs
@@ -13,37 +13,40 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-parseError :: (Parsing.ParseError -> Core.Term)
-parseError x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.parsing.ParseError"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "message"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Parsing.parseErrorMessage x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "remainder"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Parsing.parseErrorRemainder x))}]}))
+parseError :: Parsing.ParseError -> Core.Term
+parseError x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.parsing.ParseError"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "message"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Parsing.parseErrorMessage x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "remainder"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Parsing.parseErrorRemainder x))}]})
 
-parseResult :: ((t0 -> Core.Term) -> Parsing.ParseResult t0 -> Core.Term)
-parseResult a x = case x of
-  Parsing.ParseResultSuccess v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "success"),
-      Core.fieldTerm = (parseSuccess a v1)}}))
-  Parsing.ParseResultFailure v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "failure"),
-      Core.fieldTerm = (parseError v1)}}))
+parseResult :: (t0 -> Core.Term) -> Parsing.ParseResult t0 -> Core.Term
+parseResult a x =
+    case x of
+      Parsing.ParseResultSuccess v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "success"),
+          Core.fieldTerm = (parseSuccess a v0)}})
+      Parsing.ParseResultFailure v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "failure"),
+          Core.fieldTerm = (parseError v0)}})
 
-parseSuccess :: ((t0 -> Core.Term) -> Parsing.ParseSuccess t0 -> Core.Term)
-parseSuccess a x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "value"),
-      Core.fieldTerm = (a (Parsing.parseSuccessValue x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "remainder"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Parsing.parseSuccessRemainder x))}]}))
+parseSuccess :: (t0 -> Core.Term) -> Parsing.ParseSuccess t0 -> Core.Term
+parseSuccess a x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "value"),
+          Core.fieldTerm = (a (Parsing.parseSuccessValue x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "remainder"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Parsing.parseSuccessRemainder x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Paths.hs b/src/gen-main/haskell/Hydra/Encode/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Encode/Paths.hs
@@ -0,0 +1,310 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Term encoders for hydra.paths
+
+module Hydra.Encode.Paths where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Encode.Core as Core_
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Paths as Paths
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+subtermEdge :: Paths.SubtermEdge -> Core.Term
+subtermEdge x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (subtermNode (Paths.subtermEdgeSource x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (subtermPath (Paths.subtermEdgePath x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (subtermNode (Paths.subtermEdgeTarget x))}]})
+
+subtermGraph :: Paths.SubtermGraph -> Core.Term
+subtermGraph x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "nodes"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map subtermNode xs)) (Paths.subtermGraphNodes x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "edges"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map subtermEdge xs)) (Paths.subtermGraphEdges x))}]})
+
+subtermNode :: Paths.SubtermNode -> Core.Term
+subtermNode x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtermNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Paths.subtermNodeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Paths.subtermNodeLabel x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Paths.subtermNodeId x))}]})
+
+subtermPath :: Paths.SubtermPath -> Core.Term
+subtermPath x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.paths.SubtermPath"),
+      Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map subtermStep xs)) (Paths.unSubtermPath x))})
+
+subtermStep :: Paths.SubtermStep -> Core.Term
+subtermStep x =
+    case x of
+      Paths.SubtermStepAnnotatedBody -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "annotatedBody"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepApplicationFunction -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "applicationFunction"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepApplicationArgument -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "applicationArgument"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepLambdaBody -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lambdaBody"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepUnionCasesDefault -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unionCasesDefault"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepUnionCasesBranch v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unionCasesBranch"),
+          Core.fieldTerm = (Core_.name v0)}})
+      Paths.SubtermStepLetBody -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "letBody"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepLetBinding v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "letBinding"),
+          Core.fieldTerm = (Core_.name v0)}})
+      Paths.SubtermStepListElement v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "listElement"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
+      Paths.SubtermStepMapKey v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "mapKey"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
+      Paths.SubtermStepMapValue v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "mapValue"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
+      Paths.SubtermStepMaybeTerm -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "maybeTerm"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepProductTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "productTerm"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
+      Paths.SubtermStepRecordField v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "recordField"),
+          Core.fieldTerm = (Core_.name v0)}})
+      Paths.SubtermStepSetElement v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "setElement"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
+      Paths.SubtermStepSumTerm -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "sumTerm"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepTypeLambdaBody -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeLambdaBody"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepTypeApplicationTerm -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeApplicationTerm"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepInjectionTerm -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "injectionTerm"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtermStepWrappedTerm -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrappedTerm"),
+          Core.fieldTerm = Core.TermUnit}})
+
+subtypeEdge :: Paths.SubtypeEdge -> Core.Term
+subtypeEdge x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "source"),
+          Core.fieldTerm = (subtypeNode (Paths.subtypeEdgeSource x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (subtypePath (Paths.subtypeEdgePath x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "target"),
+          Core.fieldTerm = (subtypeNode (Paths.subtypeEdgeTarget x))}]})
+
+subtypeGraph :: Paths.SubtypeGraph -> Core.Term
+subtypeGraph x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "nodes"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map subtypeNode xs)) (Paths.subtypeGraphNodes x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "edges"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map subtypeEdge xs)) (Paths.subtypeGraphEdges x))}]})
+
+subtypeNode :: Paths.SubtypeNode -> Core.Term
+subtypeNode x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Paths.subtypeNodeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "label"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Paths.subtypeNodeLabel x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "id"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Paths.subtypeNodeId x))}]})
+
+subtypePath :: Paths.SubtypePath -> Core.Term
+subtypePath x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.paths.SubtypePath"),
+      Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map subtypeStep xs)) (Paths.unSubtypePath x))})
+
+subtypeStep :: Paths.SubtypeStep -> Core.Term
+subtypeStep x =
+    case x of
+      Paths.SubtypeStepAnnotatedBody -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "annotatedBody"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepApplicationFunction -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "applicationFunction"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepApplicationArgument -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "applicationArgument"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepEitherLeft -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "eitherLeft"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepEitherRight -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "eitherRight"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepForallBody -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "forallBody"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepFunctionDomain -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "functionDomain"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepFunctionCodomain -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "functionCodomain"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepListElement -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "listElement"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepMapKeys -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "mapKeys"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepMapValues -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "mapValues"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepMaybeElement -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "maybeElement"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepPairFirst -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pairFirst"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepPairSecond -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pairSecond"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepRecordField v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "recordField"),
+          Core.fieldTerm = (Core_.name v0)}})
+      Paths.SubtypeStepSetElement -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "setElement"),
+          Core.fieldTerm = Core.TermUnit}})
+      Paths.SubtypeStepUnionField v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unionField"),
+          Core.fieldTerm = (Core_.name v0)}})
+      Paths.SubtypeStepWrappedType -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrappedType"),
+          Core.fieldTerm = Core.TermUnit}})
diff --git a/src/gen-main/haskell/Hydra/Encode/Phantoms.hs b/src/gen-main/haskell/Hydra/Encode/Phantoms.hs
--- a/src/gen-main/haskell/Hydra/Encode/Phantoms.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Phantoms.hs
@@ -14,18 +14,20 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-tBinding :: (t0 -> Phantoms.TBinding t1 -> Core.Term)
-tBinding a x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.phantoms.TBinding"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (Core_.name (Phantoms.tBindingName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (tTerm a (Phantoms.tBindingTerm x))}]}))
+tBinding :: t0 -> Phantoms.TBinding t1 -> Core.Term
+tBinding a x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.phantoms.TBinding"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Core_.name (Phantoms.tBindingName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (tTerm a (Phantoms.tBindingTerm x))}]})
 
-tTerm :: (t0 -> Phantoms.TTerm t1 -> Core.Term)
-tTerm a x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
-  Core.wrappedTermBody = (Core_.term (Phantoms.unTTerm x))}))
+tTerm :: t0 -> Phantoms.TTerm t1 -> Core.Term
+tTerm a x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
+      Core.wrappedTermBody = (Core_.term (Phantoms.unTTerm x))})
diff --git a/src/gen-main/haskell/Hydra/Encode/Query.hs b/src/gen-main/haskell/Hydra/Encode/Query.hs
--- a/src/gen-main/haskell/Hydra/Encode/Query.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Query.hs
@@ -16,232 +16,269 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-comparisonConstraint :: (Query.ComparisonConstraint -> Core.Term)
-comparisonConstraint x = case x of
-  Query.ComparisonConstraintEqual -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "equal"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.ComparisonConstraintNotEqual -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "notEqual"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.ComparisonConstraintLessThan -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lessThan"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.ComparisonConstraintGreaterThan -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "greaterThan"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.ComparisonConstraintLessThanOrEqual -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lessThanOrEqual"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.ComparisonConstraintGreaterThanOrEqual -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "greaterThanOrEqual"),
-      Core.fieldTerm = Core.TermUnit}}))
+comparisonConstraint :: Query.ComparisonConstraint -> Core.Term
+comparisonConstraint x =
+    case x of
+      Query.ComparisonConstraintEqual -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "equal"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.ComparisonConstraintNotEqual -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "notEqual"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.ComparisonConstraintLessThan -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lessThan"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.ComparisonConstraintGreaterThan -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "greaterThan"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.ComparisonConstraintLessThanOrEqual -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lessThanOrEqual"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.ComparisonConstraintGreaterThanOrEqual -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "greaterThanOrEqual"),
+          Core.fieldTerm = Core.TermUnit}})
 
-edge :: (Query.Edge -> Core.Term)
-edge x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.query.Edge"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.name (Query.edgeType x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "out"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map Core_.name opt)) (Query.edgeOut x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "in"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map Core_.name opt)) (Query.edgeIn x))}]}))
+edge :: Query.Edge -> Core.Term
+edge x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Edge"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.name (Query.edgeType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "out"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map Core_.name opt)) (Query.edgeOut x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "in"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map Core_.name opt)) (Query.edgeIn x))}]})
 
-graphPattern :: (Query.GraphPattern -> Core.Term)
-graphPattern x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.query.GraphPattern"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "graph"),
-      Core.fieldTerm = (Core_.name (Query.graphPatternGraph x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "patterns"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map pattern xs)) (Query.graphPatternPatterns x))}]}))
+graphPattern :: Query.GraphPattern -> Core.Term
+graphPattern x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.GraphPattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (Core_.name (Query.graphPatternGraph x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "patterns"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map pattern xs)) (Query.graphPatternPatterns x))}]})
 
-node :: (Query.Node -> Core.Term)
-node x = case x of
-  Query.NodeTerm v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Node"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (Core_.term v1)}}))
-  Query.NodeVariable v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Node"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "variable"),
-      Core.fieldTerm = (variable v1)}}))
-  Query.NodeWildcard -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Node"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wildcard"),
-      Core.fieldTerm = Core.TermUnit}}))
+node :: Query.Node -> Core.Term
+node x =
+    case x of
+      Query.NodeTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core_.term v0)}})
+      Query.NodeVariable v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = (variable v0)}})
+      Query.NodeWildcard -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wildcard"),
+          Core.fieldTerm = Core.TermUnit}})
 
-path :: (Query.Path -> Core.Term)
-path x = case x of
-  Query.PathStep v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Path"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "step"),
-      Core.fieldTerm = (step v1)}}))
-  Query.PathRegex v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Path"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "regex"),
-      Core.fieldTerm = (regexSequence v1)}}))
-  Query.PathInverse v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Path"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "inverse"),
-      Core.fieldTerm = (path v1)}}))
+path :: Query.Path -> Core.Term
+path x =
+    case x of
+      Query.PathStep v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "step"),
+          Core.fieldTerm = (step v0)}})
+      Query.PathRegex v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "regex"),
+          Core.fieldTerm = (regexSequence v0)}})
+      Query.PathInverse v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "inverse"),
+          Core.fieldTerm = (path v0)}})
 
-pattern :: (Query.Pattern -> Core.Term)
-pattern x = case x of
-  Query.PatternTriple v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "triple"),
-      Core.fieldTerm = (triplePattern v1)}}))
-  Query.PatternNegation v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "negation"),
-      Core.fieldTerm = (pattern v1)}}))
-  Query.PatternConjunction v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "conjunction"),
-      Core.fieldTerm = (Core.TermList (Lists.map pattern v1))}}))
-  Query.PatternDisjunction v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "disjunction"),
-      Core.fieldTerm = (Core.TermList (Lists.map pattern v1))}}))
-  Query.PatternGraph v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "graph"),
-      Core.fieldTerm = (graphPattern v1)}}))
+pathEquation :: Query.PathEquation -> Core.Term
+pathEquation x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.PathEquation"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (path (Query.pathEquationLeft x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (path (Query.pathEquationRight x))}]})
 
-query :: (Query.Query -> Core.Term)
-query x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.query.Query"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "variables"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map variable xs)) (Query.queryVariables x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "patterns"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map pattern xs)) (Query.queryPatterns x))}]}))
+pattern :: Query.Pattern -> Core.Term
+pattern x =
+    case x of
+      Query.PatternTriple v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "triple"),
+          Core.fieldTerm = (triplePattern v0)}})
+      Query.PatternNegation v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "negation"),
+          Core.fieldTerm = (pattern v0)}})
+      Query.PatternConjunction v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "conjunction"),
+          Core.fieldTerm = (Core.TermList (Lists.map pattern v0))}})
+      Query.PatternDisjunction v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "disjunction"),
+          Core.fieldTerm = (Core.TermList (Lists.map pattern v0))}})
+      Query.PatternGraph v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "graph"),
+          Core.fieldTerm = (graphPattern v0)}})
 
-range :: (Query.Range -> Core.Term)
-range x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.query.Range"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "min"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Query.rangeMin x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "max"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Query.rangeMax x))}]}))
+patternImplication :: Query.PatternImplication -> Core.Term
+patternImplication x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.PatternImplication"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "antecedent"),
+          Core.fieldTerm = (pattern (Query.patternImplicationAntecedent x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "consequent"),
+          Core.fieldTerm = (pattern (Query.patternImplicationConsequent x))}]})
 
-regexQuantifier :: (Query.RegexQuantifier -> Core.Term)
-regexQuantifier x = case x of
-  Query.RegexQuantifierOne -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "one"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.RegexQuantifierZeroOrOne -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "zeroOrOne"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.RegexQuantifierZeroOrMore -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "zeroOrMore"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.RegexQuantifierOneOrMore -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "oneOrMore"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Query.RegexQuantifierExactly v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "exactly"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
-  Query.RegexQuantifierAtLeast v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "atLeast"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
-  Query.RegexQuantifierRange v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "range"),
-      Core.fieldTerm = (range v1)}}))
+query :: Query.Query -> Core.Term
+query x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Query"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variables"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map variable xs)) (Query.queryVariables x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "patterns"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map pattern xs)) (Query.queryPatterns x))}]})
 
-regexSequence :: (Query.RegexSequence -> Core.Term)
-regexSequence x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.query.RegexSequence"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "path"),
-      Core.fieldTerm = (path (Query.regexSequencePath x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "quantifier"),
-      Core.fieldTerm = (regexQuantifier (Query.regexSequenceQuantifier x))}]}))
+range :: Query.Range -> Core.Term
+range x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.Range"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "min"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Query.rangeMin x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "max"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Query.rangeMax x))}]})
 
-step :: (Query.Step -> Core.Term)
-step x = case x of
-  Query.StepEdge v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Step"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "edge"),
-      Core.fieldTerm = (edge v1)}}))
-  Query.StepProject v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Step"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "project"),
-      Core.fieldTerm = (Core_.projection v1)}}))
-  Query.StepCompare v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.query.Step"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "compare"),
-      Core.fieldTerm = (comparisonConstraint v1)}}))
+regexQuantifier :: Query.RegexQuantifier -> Core.Term
+regexQuantifier x =
+    case x of
+      Query.RegexQuantifierOne -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "one"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.RegexQuantifierZeroOrOne -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "zeroOrOne"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.RegexQuantifierZeroOrMore -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "zeroOrMore"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.RegexQuantifierOneOrMore -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "oneOrMore"),
+          Core.fieldTerm = Core.TermUnit}})
+      Query.RegexQuantifierExactly v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "exactly"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
+      Query.RegexQuantifierAtLeast v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "atLeast"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
+      Query.RegexQuantifierRange v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "range"),
+          Core.fieldTerm = (range v0)}})
 
-triplePattern :: (Query.TriplePattern -> Core.Term)
-triplePattern x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.query.TriplePattern"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "subject"),
-      Core.fieldTerm = (node (Query.triplePatternSubject x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "predicate"),
-      Core.fieldTerm = (path (Query.triplePatternPredicate x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "object"),
-      Core.fieldTerm = (node (Query.triplePatternObject x))}]}))
+regexSequence :: Query.RegexSequence -> Core.Term
+regexSequence x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.RegexSequence"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "path"),
+          Core.fieldTerm = (path (Query.regexSequencePath x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "quantifier"),
+          Core.fieldTerm = (regexQuantifier (Query.regexSequenceQuantifier x))}]})
 
-variable :: (Query.Variable -> Core.Term)
-variable x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.query.Variable"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Query.unVariable x))}))
+step :: Query.Step -> Core.Term
+step x =
+    case x of
+      Query.StepEdge v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "edge"),
+          Core.fieldTerm = (edge v0)}})
+      Query.StepProject v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "project"),
+          Core.fieldTerm = (Core_.projection v0)}})
+      Query.StepCompare v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "compare"),
+          Core.fieldTerm = (comparisonConstraint v0)}})
+
+triplePattern :: Query.TriplePattern -> Core.Term
+triplePattern x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.query.TriplePattern"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "subject"),
+          Core.fieldTerm = (node (Query.triplePatternSubject x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (path (Query.triplePatternPredicate x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "object"),
+          Core.fieldTerm = (node (Query.triplePatternObject x))}]})
+
+variable :: Query.Variable -> Core.Term
+variable x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.query.Variable"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Query.unVariable x))})
diff --git a/src/gen-main/haskell/Hydra/Encode/Relational.hs b/src/gen-main/haskell/Hydra/Encode/Relational.hs
--- a/src/gen-main/haskell/Hydra/Encode/Relational.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Relational.hs
@@ -16,71 +16,80 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-columnName :: (Relational.ColumnName -> Core.Term)
-columnName x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.relational.ColumnName"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Relational.unColumnName x))}))
+columnName :: Relational.ColumnName -> Core.Term
+columnName x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.ColumnName"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Relational.unColumnName x))})
 
-columnSchema :: ((t0 -> Core.Term) -> Relational.ColumnSchema t0 -> Core.Term)
-columnSchema t x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.relational.ColumnSchema"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (columnName (Relational.columnSchemaName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "domain"),
-      Core.fieldTerm = (t (Relational.columnSchemaDomain x))}]}))
+columnSchema :: (t0 -> Core.Term) -> Relational.ColumnSchema t0 -> Core.Term
+columnSchema t x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (columnName (Relational.columnSchemaName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domain"),
+          Core.fieldTerm = (t (Relational.columnSchemaDomain x))}]})
 
-foreignKey :: (Relational.ForeignKey -> Core.Term)
-foreignKey x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.relational.ForeignKey"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "foreignRelation"),
-      Core.fieldTerm = (relationName (Relational.foreignKeyForeignRelation x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "keys"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap columnName columnName m)) (Relational.foreignKeyKeys x))}]}))
+foreignKey :: Relational.ForeignKey -> Core.Term
+foreignKey x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.ForeignKey"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignRelation"),
+          Core.fieldTerm = (relationName (Relational.foreignKeyForeignRelation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "keys"),
+          Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap columnName columnName m)) (Relational.foreignKeyKeys x))}]})
 
-primaryKey :: (Relational.PrimaryKey -> Core.Term)
-primaryKey x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.relational.PrimaryKey"),
-  Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map columnName xs)) (Relational.unPrimaryKey x))}))
+primaryKey :: Relational.PrimaryKey -> Core.Term
+primaryKey x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.PrimaryKey"),
+      Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map columnName xs)) (Relational.unPrimaryKey x))})
 
-relation :: ((t0 -> Core.Term) -> Relational.Relation t0 -> Core.Term)
-relation v x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relation"),
-  Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map (row v) xs)) (Relational.unRelation x))}))
+relation :: (t0 -> Core.Term) -> Relational.Relation t0 -> Core.Term
+relation v x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relation"),
+      Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map (row v) xs)) (Relational.unRelation x))})
 
-relationName :: (Relational.RelationName -> Core.Term)
-relationName x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.relational.RelationName"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Relational.unRelationName x))}))
+relationName :: Relational.RelationName -> Core.Term
+relationName x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.RelationName"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Relational.unRelationName x))})
 
-relationSchema :: ((t0 -> Core.Term) -> Relational.RelationSchema t0 -> Core.Term)
-relationSchema t x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (relationName (Relational.relationSchemaName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "columns"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (columnSchema t) xs)) (Relational.relationSchemaColumns x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "primaryKeys"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map primaryKey xs)) (Relational.relationSchemaPrimaryKeys x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "foreignKeys"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map foreignKey xs)) (Relational.relationSchemaForeignKeys x))}]}))
+relationSchema :: (t0 -> Core.Term) -> Relational.RelationSchema t0 -> Core.Term
+relationSchema t x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (relationName (Relational.relationSchemaName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (columnSchema t) xs)) (Relational.relationSchemaColumns x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "primaryKeys"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map primaryKey xs)) (Relational.relationSchemaPrimaryKeys x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "foreignKeys"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map foreignKey xs)) (Relational.relationSchemaForeignKeys x))}]})
 
-relationship :: ((t0 -> Core.Term) -> Relational.Relationship t0 -> Core.Term)
-relationship v x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relationship"),
-  Core.wrappedTermBody = ((\s -> Core.TermSet (Sets.map (\m -> Core.TermMap (Maps.bimap columnName v m)) s)) (Relational.unRelationship x))}))
+relationship :: Ord t0 => ((t0 -> Core.Term) -> Relational.Relationship t0 -> Core.Term)
+relationship v x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relationship"),
+      Core.wrappedTermBody = ((\s -> Core.TermSet (Sets.map (\m -> Core.TermMap (Maps.bimap columnName v m)) s)) (Relational.unRelationship x))})
 
-row :: ((t0 -> Core.Term) -> Relational.Row t0 -> Core.Term)
-row v x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.relational.Row"),
-  Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map v xs)) (Relational.unRow x))}))
+row :: (t0 -> Core.Term) -> Relational.Row t0 -> Core.Term
+row v x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.relational.Row"),
+      Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map v xs)) (Relational.unRow x))})
diff --git a/src/gen-main/haskell/Hydra/Encode/Tabular.hs b/src/gen-main/haskell/Hydra/Encode/Tabular.hs
--- a/src/gen-main/haskell/Hydra/Encode/Tabular.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Tabular.hs
@@ -17,45 +17,50 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-columnType :: (Tabular.ColumnType -> Core.Term)
-columnType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.tabular.ColumnType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (Relational.columnName (Tabular.columnTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.type_ (Tabular.columnTypeType x))}]}))
+columnType :: Tabular.ColumnType -> Core.Term
+columnType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.ColumnType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Relational.columnName (Tabular.columnTypeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Tabular.columnTypeType x))}]})
 
-dataRow :: ((t0 -> Core.Term) -> Tabular.DataRow t0 -> Core.Term)
-dataRow v x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.tabular.DataRow"),
-  Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map (\opt -> Core.TermMaybe (Maybes.map v opt)) xs)) (Tabular.unDataRow x))}))
+dataRow :: (t0 -> Core.Term) -> Tabular.DataRow t0 -> Core.Term
+dataRow v x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.tabular.DataRow"),
+      Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map (\opt -> Core.TermMaybe (Maybes.map v opt)) xs)) (Tabular.unDataRow x))})
 
-headerRow :: (Tabular.HeaderRow -> Core.Term)
-headerRow x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.tabular.HeaderRow"),
-  Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralString x)) xs)) (Tabular.unHeaderRow x))}))
+headerRow :: Tabular.HeaderRow -> Core.Term
+headerRow x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.tabular.HeaderRow"),
+      Core.wrappedTermBody = ((\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralString x)) xs)) (Tabular.unHeaderRow x))})
 
-table :: ((t0 -> Core.Term) -> Tabular.Table t0 -> Core.Term)
-table v x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.tabular.Table"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "header"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map headerRow opt)) (Tabular.tableHeader x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "data"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (dataRow v) xs)) (Tabular.tableData x))}]}))
+table :: (t0 -> Core.Term) -> Tabular.Table t0 -> Core.Term
+table v x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.Table"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "header"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map headerRow opt)) (Tabular.tableHeader x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "data"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (dataRow v) xs)) (Tabular.tableData x))}]})
 
-tableType :: (Tabular.TableType -> Core.Term)
-tableType x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.tabular.TableType"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = (Relational.relationName (Tabular.tableTypeName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "columns"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map columnType xs)) (Tabular.tableTypeColumns x))}]}))
+tableType :: Tabular.TableType -> Core.Term
+tableType x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.tabular.TableType"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = (Relational.relationName (Tabular.tableTypeName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "columns"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map columnType xs)) (Tabular.tableTypeColumns x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Testing.hs b/src/gen-main/haskell/Hydra/Encode/Testing.hs
--- a/src/gen-main/haskell/Hydra/Encode/Testing.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Testing.hs
@@ -8,815 +8,864 @@
 import qualified Hydra.Encode.Ast as Ast
 import qualified Hydra.Encode.Coders as Coders
 import qualified Hydra.Encode.Core as Core_
-import qualified Hydra.Encode.Json.Model as Model
-import qualified Hydra.Encode.Parsing as Parsing
-import qualified Hydra.Encode.Typing as Typing
-import qualified Hydra.Encode.Util as Util
-import qualified Hydra.Json.Model as Model_
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Testing as Testing
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-alphaConversionTestCase :: (Testing.AlphaConversionTestCase -> Core.Term)
-alphaConversionTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (Core_.term (Testing.alphaConversionTestCaseTerm x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "oldVariable"),
-      Core.fieldTerm = (Core_.name (Testing.alphaConversionTestCaseOldVariable x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "newVariable"),
-      Core.fieldTerm = (Core_.name (Testing.alphaConversionTestCaseNewVariable x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "result"),
-      Core.fieldTerm = (Core_.term (Testing.alphaConversionTestCaseResult x))}]}))
-
-evaluationStyle :: (Testing.EvaluationStyle -> Core.Term)
-evaluationStyle x = case x of
-  Testing.EvaluationStyleEager -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "eager"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Testing.EvaluationStyleLazy -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lazy"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-caseConversionTestCase :: (Testing.CaseConversionTestCase -> Core.Term)
-caseConversionTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "fromConvention"),
-      Core.fieldTerm = (Util.caseConvention (Testing.caseConversionTestCaseFromConvention x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "toConvention"),
-      Core.fieldTerm = (Util.caseConvention (Testing.caseConversionTestCaseToConvention x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "fromString"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.caseConversionTestCaseFromString x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "toString"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.caseConversionTestCaseToString x))}]}))
-
-delegatedEvaluationTestCase :: (Testing.DelegatedEvaluationTestCase -> Core.Term)
-delegatedEvaluationTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.delegatedEvaluationTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.delegatedEvaluationTestCaseOutput x))}]}))
-
-etaExpansionTestCase :: (Testing.EtaExpansionTestCase -> Core.Term)
-etaExpansionTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.etaExpansionTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.etaExpansionTestCaseOutput x))}]}))
-
-deannotateTermTestCase :: (Testing.DeannotateTermTestCase -> Core.Term)
-deannotateTermTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.deannotateTermTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.deannotateTermTestCaseOutput x))}]}))
-
-deannotateTypeTestCase :: (Testing.DeannotateTypeTestCase -> Core.Term)
-deannotateTypeTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.type_ (Testing.deannotateTypeTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.type_ (Testing.deannotateTypeTestCaseOutput x))}]}))
-
-flattenLetTermsTestCase :: (Testing.FlattenLetTermsTestCase -> Core.Term)
-flattenLetTermsTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.flattenLetTermsTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.flattenLetTermsTestCaseOutput x))}]}))
-
-foldOperation :: (Testing.FoldOperation -> Core.Term)
-foldOperation x = case x of
-  Testing.FoldOperationSumInt32Literals -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "sumInt32Literals"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Testing.FoldOperationCollectListLengths -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "collectListLengths"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Testing.FoldOperationCollectLabels -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "collectLabels"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-foldOverTermTestCase :: (Testing.FoldOverTermTestCase -> Core.Term)
-foldOverTermTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.foldOverTermTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "traversalOrder"),
-      Core.fieldTerm = (Coders.traversalOrder (Testing.foldOverTermTestCaseTraversalOrder x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "operation"),
-      Core.fieldTerm = (foldOperation (Testing.foldOverTermTestCaseOperation x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.foldOverTermTestCaseOutput x))}]}))
-
-freeVariablesTestCase :: (Testing.FreeVariablesTestCase -> Core.Term)
-freeVariablesTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.freeVariablesTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = ((\s -> Core.TermSet (Sets.map Core_.name s)) (Testing.freeVariablesTestCaseOutput x))}]}))
-
-hoistPredicate :: (Testing.HoistPredicate -> Core.Term)
-hoistPredicate x = case x of
-  Testing.HoistPredicateCaseStatements -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "caseStatements"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Testing.HoistPredicateApplications -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "applications"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Testing.HoistPredicateLists -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lists"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Testing.HoistPredicateNothing -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "nothing"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-hoistLetBindingsTestCase :: (Testing.HoistLetBindingsTestCase -> Core.Term)
-hoistLetBindingsTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.let_ (Testing.hoistLetBindingsTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.let_ (Testing.hoistLetBindingsTestCaseOutput x))}]}))
-
-hoistPolymorphicLetBindingsTestCase :: (Testing.HoistPolymorphicLetBindingsTestCase -> Core.Term)
-hoistPolymorphicLetBindingsTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.let_ (Testing.hoistPolymorphicLetBindingsTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.let_ (Testing.hoistPolymorphicLetBindingsTestCaseOutput x))}]}))
-
-hoistSubtermsTestCase :: (Testing.HoistSubtermsTestCase -> Core.Term)
-hoistSubtermsTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "predicate"),
-      Core.fieldTerm = (hoistPredicate (Testing.hoistSubtermsTestCasePredicate x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.hoistSubtermsTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.hoistSubtermsTestCaseOutput x))}]}))
-
-hoistCaseStatementsTestCase :: (Testing.HoistCaseStatementsTestCase -> Core.Term)
-hoistCaseStatementsTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.hoistCaseStatementsTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.hoistCaseStatementsTestCaseOutput x))}]}))
-
-termRewriter :: (Testing.TermRewriter -> Core.Term)
-termRewriter x = case x of
-  Testing.TermRewriterReplaceFooWithBar -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "replaceFooWithBar"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Testing.TermRewriterReplaceInt32WithInt64 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "replaceInt32WithInt64"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-rewriteTermTestCase :: (Testing.RewriteTermTestCase -> Core.Term)
-rewriteTermTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.rewriteTermTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "rewriter"),
-      Core.fieldTerm = (termRewriter (Testing.rewriteTermTestCaseRewriter x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.rewriteTermTestCaseOutput x))}]}))
-
-typeRewriter :: (Testing.TypeRewriter -> Core.Term)
-typeRewriter x = case x of
-  Testing.TypeRewriterReplaceStringWithInt32 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TypeRewriter"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "replaceStringWithInt32"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-rewriteTypeTestCase :: (Testing.RewriteTypeTestCase -> Core.Term)
-rewriteTypeTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.type_ (Testing.rewriteTypeTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "rewriter"),
-      Core.fieldTerm = (typeRewriter (Testing.rewriteTypeTestCaseRewriter x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.type_ (Testing.rewriteTypeTestCaseOutput x))}]}))
-
-evaluationTestCase :: (Testing.EvaluationTestCase -> Core.Term)
-evaluationTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "evaluationStyle"),
-      Core.fieldTerm = (evaluationStyle (Testing.evaluationTestCaseEvaluationStyle x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.evaluationTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.evaluationTestCaseOutput x))}]}))
-
-inferenceFailureTestCase :: (Testing.InferenceFailureTestCase -> Core.Term)
-inferenceFailureTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.inferenceFailureTestCaseInput x))}]}))
-
-inferenceTestCase :: (Testing.InferenceTestCase -> Core.Term)
-inferenceTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.inferenceTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.typeScheme (Testing.inferenceTestCaseOutput x))}]}))
-
-jsonCoderTestCase :: (Testing.JsonCoderTestCase -> Core.Term)
-jsonCoderTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.JsonCoderTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.type_ (Testing.jsonCoderTestCaseType x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (Core_.term (Testing.jsonCoderTestCaseTerm x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "json"),
-      Core.fieldTerm = (Model.value (Testing.jsonCoderTestCaseJson x))}]}))
-
-jsonDecodeTestCase :: (Testing.JsonDecodeTestCase -> Core.Term)
-jsonDecodeTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.type_ (Testing.jsonDecodeTestCaseType x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "json"),
-      Core.fieldTerm = (Model.value (Testing.jsonDecodeTestCaseJson x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expected"),
-      Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\x -> Core.TermLiteral (Core.LiteralString x)) Core_.term e)) (Testing.jsonDecodeTestCaseExpected x))}]}))
-
-jsonEncodeTestCase :: (Testing.JsonEncodeTestCase -> Core.Term)
-jsonEncodeTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (Core_.term (Testing.jsonEncodeTestCaseTerm x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expected"),
-      Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\x -> Core.TermLiteral (Core.LiteralString x)) Model.value e)) (Testing.jsonEncodeTestCaseExpected x))}]}))
-
-jsonParserTestCase :: (Testing.ParserTestCase Model_.Value -> Core.Term)
-jsonParserTestCase = (parserTestCase Model.value)
-
-jsonRoundtripTestCase :: (Testing.JsonRoundtripTestCase -> Core.Term)
-jsonRoundtripTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.type_ (Testing.jsonRoundtripTestCaseType x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (Core_.term (Testing.jsonRoundtripTestCaseTerm x))}]}))
-
-liftLambdaAboveLetTestCase :: (Testing.LiftLambdaAboveLetTestCase -> Core.Term)
-liftLambdaAboveLetTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.liftLambdaAboveLetTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.liftLambdaAboveLetTestCaseOutput x))}]}))
-
-jsonWriterTestCase :: (Testing.WriterTestCase Model_.Value -> Core.Term)
-jsonWriterTestCase = (writerTestCase Model.value)
-
-parserTestCase :: ((t0 -> Core.Term) -> Testing.ParserTestCase t0 -> Core.Term)
-parserTestCase a x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.ParserTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.parserTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Parsing.parseResult a (Testing.parserTestCaseOutput x))}]}))
-
-tag :: (Testing.Tag -> Core.Term)
-tag x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.testing.Tag"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.unTag x))}))
-
-testCase :: (Testing.TestCase -> Core.Term)
-testCase x = case x of
-  Testing.TestCaseAlphaConversion v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "alphaConversion"),
-      Core.fieldTerm = (alphaConversionTestCase v1)}}))
-  Testing.TestCaseCaseConversion v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "caseConversion"),
-      Core.fieldTerm = (caseConversionTestCase v1)}}))
-  Testing.TestCaseDeannotateTerm v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "deannotateTerm"),
-      Core.fieldTerm = (deannotateTermTestCase v1)}}))
-  Testing.TestCaseDeannotateType v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "deannotateType"),
-      Core.fieldTerm = (deannotateTypeTestCase v1)}}))
-  Testing.TestCaseDelegatedEvaluation v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "delegatedEvaluation"),
-      Core.fieldTerm = (delegatedEvaluationTestCase v1)}}))
-  Testing.TestCaseEtaExpansion v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "etaExpansion"),
-      Core.fieldTerm = (etaExpansionTestCase v1)}}))
-  Testing.TestCaseFlattenLetTerms v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "flattenLetTerms"),
-      Core.fieldTerm = (flattenLetTermsTestCase v1)}}))
-  Testing.TestCaseFreeVariables v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "freeVariables"),
-      Core.fieldTerm = (freeVariablesTestCase v1)}}))
-  Testing.TestCaseEvaluation v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "evaluation"),
-      Core.fieldTerm = (evaluationTestCase v1)}}))
-  Testing.TestCaseInference v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "inference"),
-      Core.fieldTerm = (inferenceTestCase v1)}}))
-  Testing.TestCaseInferenceFailure v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "inferenceFailure"),
-      Core.fieldTerm = (inferenceFailureTestCase v1)}}))
-  Testing.TestCaseJsonCoder v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "jsonCoder"),
-      Core.fieldTerm = (jsonCoderTestCase v1)}}))
-  Testing.TestCaseJsonDecode v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "jsonDecode"),
-      Core.fieldTerm = (jsonDecodeTestCase v1)}}))
-  Testing.TestCaseJsonEncode v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "jsonEncode"),
-      Core.fieldTerm = (jsonEncodeTestCase v1)}}))
-  Testing.TestCaseJsonParser v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "jsonParser"),
-      Core.fieldTerm = (jsonParserTestCase v1)}}))
-  Testing.TestCaseJsonRoundtrip v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "jsonRoundtrip"),
-      Core.fieldTerm = (jsonRoundtripTestCase v1)}}))
-  Testing.TestCaseJsonWriter v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "jsonWriter"),
-      Core.fieldTerm = (jsonWriterTestCase v1)}}))
-  Testing.TestCaseLiftLambdaAboveLet v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "liftLambdaAboveLet"),
-      Core.fieldTerm = (liftLambdaAboveLetTestCase v1)}}))
-  Testing.TestCaseSerialization v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "serialization"),
-      Core.fieldTerm = (serializationTestCase v1)}}))
-  Testing.TestCaseSimplifyTerm v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "simplifyTerm"),
-      Core.fieldTerm = (simplifyTermTestCase v1)}}))
-  Testing.TestCaseTopologicalSort v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "topologicalSort"),
-      Core.fieldTerm = (topologicalSortTestCase v1)}}))
-  Testing.TestCaseTopologicalSortBindings v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "topologicalSortBindings"),
-      Core.fieldTerm = (topologicalSortBindingsTestCase v1)}}))
-  Testing.TestCaseTopologicalSortSCC v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "topologicalSortSCC"),
-      Core.fieldTerm = (topologicalSortSCCTestCase v1)}}))
-  Testing.TestCaseTypeChecking v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeChecking"),
-      Core.fieldTerm = (typeCheckingTestCase v1)}}))
-  Testing.TestCaseTypeCheckingFailure v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeCheckingFailure"),
-      Core.fieldTerm = (typeCheckingFailureTestCase v1)}}))
-  Testing.TestCaseTypeReduction v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeReduction"),
-      Core.fieldTerm = (typeReductionTestCase v1)}}))
-  Testing.TestCaseNormalizeTypeVariables v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "normalizeTypeVariables"),
-      Core.fieldTerm = (normalizeTypeVariablesTestCase v1)}}))
-  Testing.TestCaseFoldOverTerm v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "foldOverTerm"),
-      Core.fieldTerm = (foldOverTermTestCase v1)}}))
-  Testing.TestCaseRewriteTerm v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "rewriteTerm"),
-      Core.fieldTerm = (rewriteTermTestCase v1)}}))
-  Testing.TestCaseRewriteType v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "rewriteType"),
-      Core.fieldTerm = (rewriteTypeTestCase v1)}}))
-  Testing.TestCaseHoistSubterms v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "hoistSubterms"),
-      Core.fieldTerm = (hoistSubtermsTestCase v1)}}))
-  Testing.TestCaseHoistCaseStatements v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "hoistCaseStatements"),
-      Core.fieldTerm = (hoistCaseStatementsTestCase v1)}}))
-  Testing.TestCaseHoistLetBindings v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "hoistLetBindings"),
-      Core.fieldTerm = (hoistLetBindingsTestCase v1)}}))
-  Testing.TestCaseHoistPolymorphicLetBindings v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "hoistPolymorphicLetBindings"),
-      Core.fieldTerm = (hoistPolymorphicLetBindingsTestCase v1)}}))
-  Testing.TestCaseSubstInType v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "substInType"),
-      Core.fieldTerm = (substInTypeTestCase v1)}}))
-  Testing.TestCaseVariableOccursInType v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "variableOccursInType"),
-      Core.fieldTerm = (variableOccursInTypeTestCase v1)}}))
-  Testing.TestCaseUnifyTypes v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "unifyTypes"),
-      Core.fieldTerm = (unifyTypesTestCase v1)}}))
-  Testing.TestCaseJoinTypes v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "joinTypes"),
-      Core.fieldTerm = (joinTypesTestCase v1)}}))
-  Testing.TestCaseUnshadowVariables v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "unshadowVariables"),
-      Core.fieldTerm = (unshadowVariablesTestCase v1)}}))
-
-testCaseWithMetadata :: (Testing.TestCaseWithMetadata -> Core.Term)
-testCaseWithMetadata x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.testCaseWithMetadataName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "case"),
-      Core.fieldTerm = (testCase (Testing.testCaseWithMetadataCase x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "description"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\x -> Core.TermLiteral (Core.LiteralString x)) opt)) (Testing.testCaseWithMetadataDescription x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "tags"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map tag xs)) (Testing.testCaseWithMetadataTags x))}]}))
-
-testGroup :: (Testing.TestGroup -> Core.Term)
-testGroup x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.testGroupName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "description"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\x -> Core.TermLiteral (Core.LiteralString x)) opt)) (Testing.testGroupDescription x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "subgroups"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map testGroup xs)) (Testing.testGroupSubgroups x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "cases"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map testCaseWithMetadata xs)) (Testing.testGroupCases x))}]}))
-
-typeCheckingTestCase :: (Testing.TypeCheckingTestCase -> Core.Term)
-typeCheckingTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.typeCheckingTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "outputTerm"),
-      Core.fieldTerm = (Core_.term (Testing.typeCheckingTestCaseOutputTerm x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "outputType"),
-      Core.fieldTerm = (Core_.type_ (Testing.typeCheckingTestCaseOutputType x))}]}))
-
-typeCheckingFailureTestCase :: (Testing.TypeCheckingFailureTestCase -> Core.Term)
-typeCheckingFailureTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.typeCheckingFailureTestCaseInput x))}]}))
-
-topologicalSortBindingsTestCase :: (Testing.TopologicalSortBindingsTestCase -> Core.Term)
-topologicalSortBindingsTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "bindings"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap Core_.name Core_.term p)) xs)) (Testing.topologicalSortBindingsTestCaseBindings x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expected"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap Core_.name Core_.term p)) xs)) xs)) (Testing.topologicalSortBindingsTestCaseExpected x))}]}))
-
-topologicalSortTestCase :: (Testing.TopologicalSortTestCase -> Core.Term)
-topologicalSortTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "adjacencyList"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) p)) xs)) (Testing.topologicalSortTestCaseAdjacencyList x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expected"),
-      Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\xs -> Core.TermList (Lists.map (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) xs)) (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) e)) (Testing.topologicalSortTestCaseExpected x))}]}))
-
-topologicalSortSCCTestCase :: (Testing.TopologicalSortSCCTestCase -> Core.Term)
-topologicalSortSCCTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "adjacencyList"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) p)) xs)) (Testing.topologicalSortSCCTestCaseAdjacencyList x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expected"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) xs)) (Testing.topologicalSortSCCTestCaseExpected x))}]}))
-
-serializationTestCase :: (Testing.SerializationTestCase -> Core.Term)
-serializationTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Ast.expr (Testing.serializationTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.serializationTestCaseOutput x))}]}))
-
-simplifyTermTestCase :: (Testing.SimplifyTermTestCase -> Core.Term)
-simplifyTermTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.simplifyTermTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.simplifyTermTestCaseOutput x))}]}))
-
-normalizeTypeVariablesTestCase :: (Testing.NormalizeTypeVariablesTestCase -> Core.Term)
-normalizeTypeVariablesTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.normalizeTypeVariablesTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.normalizeTypeVariablesTestCaseOutput x))}]}))
-
-typeReductionTestCase :: (Testing.TypeReductionTestCase -> Core.Term)
-typeReductionTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.type_ (Testing.typeReductionTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.type_ (Testing.typeReductionTestCaseOutput x))}]}))
-
-writerTestCase :: ((t0 -> Core.Term) -> Testing.WriterTestCase t0 -> Core.Term)
-writerTestCase a x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.WriterTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (a (Testing.writerTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.writerTestCaseOutput x))}]}))
-
-substInTypeTestCase :: (Testing.SubstInTypeTestCase -> Core.Term)
-substInTypeTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "substitution"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap Core_.name Core_.type_ p)) xs)) (Testing.substInTypeTestCaseSubstitution x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.type_ (Testing.substInTypeTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.type_ (Testing.substInTypeTestCaseOutput x))}]}))
-
-variableOccursInTypeTestCase :: (Testing.VariableOccursInTypeTestCase -> Core.Term)
-variableOccursInTypeTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "variable"),
-      Core.fieldTerm = (Core_.name (Testing.variableOccursInTypeTestCaseVariable x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.type_ (Testing.variableOccursInTypeTestCaseType x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expected"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Testing.variableOccursInTypeTestCaseExpected x))}]}))
-
-unshadowVariablesTestCase :: (Testing.UnshadowVariablesTestCase -> Core.Term)
-unshadowVariablesTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "input"),
-      Core.fieldTerm = (Core_.term (Testing.unshadowVariablesTestCaseInput x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "output"),
-      Core.fieldTerm = (Core_.term (Testing.unshadowVariablesTestCaseOutput x))}]}))
-
-unifyTypesTestCase :: (Testing.UnifyTypesTestCase -> Core.Term)
-unifyTypesTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "schemaTypes"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.name xs)) (Testing.unifyTypesTestCaseSchemaTypes x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "left"),
-      Core.fieldTerm = (Core_.type_ (Testing.unifyTypesTestCaseLeft x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "right"),
-      Core.fieldTerm = (Core_.type_ (Testing.unifyTypesTestCaseRight x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expected"),
-      Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\x -> Core.TermLiteral (Core.LiteralString x)) Typing.typeSubst e)) (Testing.unifyTypesTestCaseExpected x))}]}))
-
-joinTypesTestCase :: (Testing.JoinTypesTestCase -> Core.Term)
-joinTypesTestCase x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "left"),
-      Core.fieldTerm = (Core_.type_ (Testing.joinTypesTestCaseLeft x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "right"),
-      Core.fieldTerm = (Core_.type_ (Testing.joinTypesTestCaseRight x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "expected"),
-      Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\_ -> Core.TermUnit) (\xs -> Core.TermList (Lists.map Typing.typeConstraint xs)) e)) (Testing.joinTypesTestCaseExpected x))}]}))
+import qualified Hydra.Encode.Error.Core as Core__
+import qualified Hydra.Encode.Json.Model as Model
+import qualified Hydra.Encode.Parsing as Parsing
+import qualified Hydra.Encode.Typing as Typing
+import qualified Hydra.Encode.Util as Util
+import qualified Hydra.Json.Model as Model_
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+alphaConversionTestCase :: Testing.AlphaConversionTestCase -> Core.Term
+alphaConversionTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core_.term (Testing.alphaConversionTestCaseTerm x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "oldVariable"),
+          Core.fieldTerm = (Core_.name (Testing.alphaConversionTestCaseOldVariable x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "newVariable"),
+          Core.fieldTerm = (Core_.name (Testing.alphaConversionTestCaseNewVariable x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "result"),
+          Core.fieldTerm = (Core_.term (Testing.alphaConversionTestCaseResult x))}]})
+
+caseConversionTestCase :: Testing.CaseConversionTestCase -> Core.Term
+caseConversionTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "fromConvention"),
+          Core.fieldTerm = (Util.caseConvention (Testing.caseConversionTestCaseFromConvention x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "toConvention"),
+          Core.fieldTerm = (Util.caseConvention (Testing.caseConversionTestCaseToConvention x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "fromString"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.caseConversionTestCaseFromString x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "toString"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.caseConversionTestCaseToString x))}]})
+
+deannotateTermTestCase :: Testing.DeannotateTermTestCase -> Core.Term
+deannotateTermTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.deannotateTermTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.deannotateTermTestCaseOutput x))}]})
+
+deannotateTypeTestCase :: Testing.DeannotateTypeTestCase -> Core.Term
+deannotateTypeTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.type_ (Testing.deannotateTypeTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.type_ (Testing.deannotateTypeTestCaseOutput x))}]})
+
+delegatedEvaluationTestCase :: Testing.DelegatedEvaluationTestCase -> Core.Term
+delegatedEvaluationTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.delegatedEvaluationTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.delegatedEvaluationTestCaseOutput x))}]})
+
+etaExpansionTestCase :: Testing.EtaExpansionTestCase -> Core.Term
+etaExpansionTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.etaExpansionTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.etaExpansionTestCaseOutput x))}]})
+
+evaluationStyle :: Testing.EvaluationStyle -> Core.Term
+evaluationStyle x =
+    case x of
+      Testing.EvaluationStyleEager -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "eager"),
+          Core.fieldTerm = Core.TermUnit}})
+      Testing.EvaluationStyleLazy -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lazy"),
+          Core.fieldTerm = Core.TermUnit}})
+
+evaluationTestCase :: Testing.EvaluationTestCase -> Core.Term
+evaluationTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "evaluationStyle"),
+          Core.fieldTerm = (evaluationStyle (Testing.evaluationTestCaseEvaluationStyle x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.evaluationTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.evaluationTestCaseOutput x))}]})
+
+flattenLetTermsTestCase :: Testing.FlattenLetTermsTestCase -> Core.Term
+flattenLetTermsTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.flattenLetTermsTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.flattenLetTermsTestCaseOutput x))}]})
+
+foldOperation :: Testing.FoldOperation -> Core.Term
+foldOperation x =
+    case x of
+      Testing.FoldOperationSumInt32Literals -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "sumInt32Literals"),
+          Core.fieldTerm = Core.TermUnit}})
+      Testing.FoldOperationCollectListLengths -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "collectListLengths"),
+          Core.fieldTerm = Core.TermUnit}})
+      Testing.FoldOperationCollectLabels -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "collectLabels"),
+          Core.fieldTerm = Core.TermUnit}})
+
+foldOverTermTestCase :: Testing.FoldOverTermTestCase -> Core.Term
+foldOverTermTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.foldOverTermTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "traversalOrder"),
+          Core.fieldTerm = (Coders.traversalOrder (Testing.foldOverTermTestCaseTraversalOrder x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "operation"),
+          Core.fieldTerm = (foldOperation (Testing.foldOverTermTestCaseOperation x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.foldOverTermTestCaseOutput x))}]})
+
+freeVariablesTestCase :: Testing.FreeVariablesTestCase -> Core.Term
+freeVariablesTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.freeVariablesTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = ((\s -> Core.TermSet (Sets.map Core_.name s)) (Testing.freeVariablesTestCaseOutput x))}]})
+
+hoistCaseStatementsTestCase :: Testing.HoistCaseStatementsTestCase -> Core.Term
+hoistCaseStatementsTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.hoistCaseStatementsTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.hoistCaseStatementsTestCaseOutput x))}]})
+
+hoistLetBindingsTestCase :: Testing.HoistLetBindingsTestCase -> Core.Term
+hoistLetBindingsTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.let_ (Testing.hoistLetBindingsTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.let_ (Testing.hoistLetBindingsTestCaseOutput x))}]})
+
+hoistPolymorphicLetBindingsTestCase :: Testing.HoistPolymorphicLetBindingsTestCase -> Core.Term
+hoistPolymorphicLetBindingsTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.let_ (Testing.hoistPolymorphicLetBindingsTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.let_ (Testing.hoistPolymorphicLetBindingsTestCaseOutput x))}]})
+
+hoistPredicate :: Testing.HoistPredicate -> Core.Term
+hoistPredicate x =
+    case x of
+      Testing.HoistPredicateCaseStatements -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "caseStatements"),
+          Core.fieldTerm = Core.TermUnit}})
+      Testing.HoistPredicateApplications -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "applications"),
+          Core.fieldTerm = Core.TermUnit}})
+      Testing.HoistPredicateLists -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lists"),
+          Core.fieldTerm = Core.TermUnit}})
+      Testing.HoistPredicateNothing -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "nothing"),
+          Core.fieldTerm = Core.TermUnit}})
+
+hoistSubtermsTestCase :: Testing.HoistSubtermsTestCase -> Core.Term
+hoistSubtermsTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "predicate"),
+          Core.fieldTerm = (hoistPredicate (Testing.hoistSubtermsTestCasePredicate x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.hoistSubtermsTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.hoistSubtermsTestCaseOutput x))}]})
+
+inferenceFailureTestCase :: Testing.InferenceFailureTestCase -> Core.Term
+inferenceFailureTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.inferenceFailureTestCaseInput x))}]})
+
+inferenceTestCase :: Testing.InferenceTestCase -> Core.Term
+inferenceTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.inferenceTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.typeScheme (Testing.inferenceTestCaseOutput x))}]})
+
+joinTypesTestCase :: Testing.JoinTypesTestCase -> Core.Term
+joinTypesTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core_.type_ (Testing.joinTypesTestCaseLeft x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core_.type_ (Testing.joinTypesTestCaseRight x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\_ -> Core.TermUnit) (\xs -> Core.TermList (Lists.map Typing.typeConstraint xs)) e)) (Testing.joinTypesTestCaseExpected x))}]})
+
+jsonDecodeTestCase :: Testing.JsonDecodeTestCase -> Core.Term
+jsonDecodeTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Testing.jsonDecodeTestCaseType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "json"),
+          Core.fieldTerm = (Model.value (Testing.jsonDecodeTestCaseJson x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\x -> Core.TermLiteral (Core.LiteralString x)) Core_.term e)) (Testing.jsonDecodeTestCaseExpected x))}]})
+
+jsonEncodeTestCase :: Testing.JsonEncodeTestCase -> Core.Term
+jsonEncodeTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core_.term (Testing.jsonEncodeTestCaseTerm x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\x -> Core.TermLiteral (Core.LiteralString x)) Model.value e)) (Testing.jsonEncodeTestCaseExpected x))}]})
+
+jsonParserTestCase :: Testing.ParserTestCase Model_.Value -> Core.Term
+jsonParserTestCase = parserTestCase Model.value
+
+jsonRoundtripTestCase :: Testing.JsonRoundtripTestCase -> Core.Term
+jsonRoundtripTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Testing.jsonRoundtripTestCaseType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core_.term (Testing.jsonRoundtripTestCaseTerm x))}]})
+
+jsonWriterTestCase :: Testing.WriterTestCase Model_.Value -> Core.Term
+jsonWriterTestCase = writerTestCase Model.value
+
+liftLambdaAboveLetTestCase :: Testing.LiftLambdaAboveLetTestCase -> Core.Term
+liftLambdaAboveLetTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.liftLambdaAboveLetTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.liftLambdaAboveLetTestCaseOutput x))}]})
+
+normalizeTypeVariablesTestCase :: Testing.NormalizeTypeVariablesTestCase -> Core.Term
+normalizeTypeVariablesTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.normalizeTypeVariablesTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.normalizeTypeVariablesTestCaseOutput x))}]})
+
+parserTestCase :: (t0 -> Core.Term) -> Testing.ParserTestCase t0 -> Core.Term
+parserTestCase a x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.parserTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Parsing.parseResult a (Testing.parserTestCaseOutput x))}]})
+
+rewriteTermTestCase :: Testing.RewriteTermTestCase -> Core.Term
+rewriteTermTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.rewriteTermTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (termRewriter (Testing.rewriteTermTestCaseRewriter x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.rewriteTermTestCaseOutput x))}]})
+
+rewriteTypeTestCase :: Testing.RewriteTypeTestCase -> Core.Term
+rewriteTypeTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.type_ (Testing.rewriteTypeTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "rewriter"),
+          Core.fieldTerm = (typeRewriter (Testing.rewriteTypeTestCaseRewriter x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.type_ (Testing.rewriteTypeTestCaseOutput x))}]})
+
+serializationTestCase :: Testing.SerializationTestCase -> Core.Term
+serializationTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Ast.expr (Testing.serializationTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.serializationTestCaseOutput x))}]})
+
+simplifyTermTestCase :: Testing.SimplifyTermTestCase -> Core.Term
+simplifyTermTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.simplifyTermTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.simplifyTermTestCaseOutput x))}]})
+
+substInTypeTestCase :: Testing.SubstInTypeTestCase -> Core.Term
+substInTypeTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "substitution"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap Core_.name Core_.type_ p)) xs)) (Testing.substInTypeTestCaseSubstitution x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.type_ (Testing.substInTypeTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.type_ (Testing.substInTypeTestCaseOutput x))}]})
+
+tag :: Testing.Tag -> Core.Term
+tag x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.testing.Tag"),
+      Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.unTag x))})
+
+termRewriter :: Testing.TermRewriter -> Core.Term
+termRewriter x =
+    case x of
+      Testing.TermRewriterReplaceFooWithBar -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "replaceFooWithBar"),
+          Core.fieldTerm = Core.TermUnit}})
+      Testing.TermRewriterReplaceInt32WithInt64 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "replaceInt32WithInt64"),
+          Core.fieldTerm = Core.TermUnit}})
+
+testCase :: Testing.TestCase -> Core.Term
+testCase x =
+    case x of
+      Testing.TestCaseAlphaConversion v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "alphaConversion"),
+          Core.fieldTerm = (alphaConversionTestCase v0)}})
+      Testing.TestCaseCaseConversion v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "caseConversion"),
+          Core.fieldTerm = (caseConversionTestCase v0)}})
+      Testing.TestCaseDeannotateTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "deannotateTerm"),
+          Core.fieldTerm = (deannotateTermTestCase v0)}})
+      Testing.TestCaseDeannotateType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "deannotateType"),
+          Core.fieldTerm = (deannotateTypeTestCase v0)}})
+      Testing.TestCaseDelegatedEvaluation v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "delegatedEvaluation"),
+          Core.fieldTerm = (delegatedEvaluationTestCase v0)}})
+      Testing.TestCaseEtaExpansion v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "etaExpansion"),
+          Core.fieldTerm = (etaExpansionTestCase v0)}})
+      Testing.TestCaseFlattenLetTerms v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "flattenLetTerms"),
+          Core.fieldTerm = (flattenLetTermsTestCase v0)}})
+      Testing.TestCaseFreeVariables v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "freeVariables"),
+          Core.fieldTerm = (freeVariablesTestCase v0)}})
+      Testing.TestCaseEvaluation v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "evaluation"),
+          Core.fieldTerm = (evaluationTestCase v0)}})
+      Testing.TestCaseInference v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "inference"),
+          Core.fieldTerm = (inferenceTestCase v0)}})
+      Testing.TestCaseInferenceFailure v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "inferenceFailure"),
+          Core.fieldTerm = (inferenceFailureTestCase v0)}})
+      Testing.TestCaseJsonDecode v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "jsonDecode"),
+          Core.fieldTerm = (jsonDecodeTestCase v0)}})
+      Testing.TestCaseJsonEncode v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "jsonEncode"),
+          Core.fieldTerm = (jsonEncodeTestCase v0)}})
+      Testing.TestCaseJsonParser v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "jsonParser"),
+          Core.fieldTerm = (jsonParserTestCase v0)}})
+      Testing.TestCaseJsonRoundtrip v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "jsonRoundtrip"),
+          Core.fieldTerm = (jsonRoundtripTestCase v0)}})
+      Testing.TestCaseJsonWriter v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "jsonWriter"),
+          Core.fieldTerm = (jsonWriterTestCase v0)}})
+      Testing.TestCaseLiftLambdaAboveLet v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "liftLambdaAboveLet"),
+          Core.fieldTerm = (liftLambdaAboveLetTestCase v0)}})
+      Testing.TestCaseSerialization v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "serialization"),
+          Core.fieldTerm = (serializationTestCase v0)}})
+      Testing.TestCaseSimplifyTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "simplifyTerm"),
+          Core.fieldTerm = (simplifyTermTestCase v0)}})
+      Testing.TestCaseTopologicalSort v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "topologicalSort"),
+          Core.fieldTerm = (topologicalSortTestCase v0)}})
+      Testing.TestCaseTopologicalSortBindings v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "topologicalSortBindings"),
+          Core.fieldTerm = (topologicalSortBindingsTestCase v0)}})
+      Testing.TestCaseTopologicalSortSCC v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "topologicalSortSCC"),
+          Core.fieldTerm = (topologicalSortSCCTestCase v0)}})
+      Testing.TestCaseTypeChecking v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeChecking"),
+          Core.fieldTerm = (typeCheckingTestCase v0)}})
+      Testing.TestCaseTypeCheckingFailure v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeCheckingFailure"),
+          Core.fieldTerm = (typeCheckingFailureTestCase v0)}})
+      Testing.TestCaseTypeReduction v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeReduction"),
+          Core.fieldTerm = (typeReductionTestCase v0)}})
+      Testing.TestCaseNormalizeTypeVariables v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "normalizeTypeVariables"),
+          Core.fieldTerm = (normalizeTypeVariablesTestCase v0)}})
+      Testing.TestCaseFoldOverTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "foldOverTerm"),
+          Core.fieldTerm = (foldOverTermTestCase v0)}})
+      Testing.TestCaseRewriteTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "rewriteTerm"),
+          Core.fieldTerm = (rewriteTermTestCase v0)}})
+      Testing.TestCaseRewriteType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "rewriteType"),
+          Core.fieldTerm = (rewriteTypeTestCase v0)}})
+      Testing.TestCaseHoistSubterms v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "hoistSubterms"),
+          Core.fieldTerm = (hoistSubtermsTestCase v0)}})
+      Testing.TestCaseHoistCaseStatements v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "hoistCaseStatements"),
+          Core.fieldTerm = (hoistCaseStatementsTestCase v0)}})
+      Testing.TestCaseHoistLetBindings v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "hoistLetBindings"),
+          Core.fieldTerm = (hoistLetBindingsTestCase v0)}})
+      Testing.TestCaseHoistPolymorphicLetBindings v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "hoistPolymorphicLetBindings"),
+          Core.fieldTerm = (hoistPolymorphicLetBindingsTestCase v0)}})
+      Testing.TestCaseSubstInType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "substInType"),
+          Core.fieldTerm = (substInTypeTestCase v0)}})
+      Testing.TestCaseVariableOccursInType v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "variableOccursInType"),
+          Core.fieldTerm = (variableOccursInTypeTestCase v0)}})
+      Testing.TestCaseUnifyTypes v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unifyTypes"),
+          Core.fieldTerm = (unifyTypesTestCase v0)}})
+      Testing.TestCaseJoinTypes v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "joinTypes"),
+          Core.fieldTerm = (joinTypesTestCase v0)}})
+      Testing.TestCaseUnshadowVariables v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unshadowVariables"),
+          Core.fieldTerm = (unshadowVariablesTestCase v0)}})
+      Testing.TestCaseValidateCoreTerm v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "validateCoreTerm"),
+          Core.fieldTerm = (validateCoreTermTestCase v0)}})
+
+testCaseWithMetadata :: Testing.TestCaseWithMetadata -> Core.Term
+testCaseWithMetadata x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.testCaseWithMetadataName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "case"),
+          Core.fieldTerm = (testCase (Testing.testCaseWithMetadataCase x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\x -> Core.TermLiteral (Core.LiteralString x)) opt)) (Testing.testCaseWithMetadataDescription x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "tags"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map tag xs)) (Testing.testCaseWithMetadataTags x))}]})
+
+testGroup :: Testing.TestGroup -> Core.Term
+testGroup x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "name"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.testGroupName x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "description"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map (\x -> Core.TermLiteral (Core.LiteralString x)) opt)) (Testing.testGroupDescription x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subgroups"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map testGroup xs)) (Testing.testGroupSubgroups x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "cases"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map testCaseWithMetadata xs)) (Testing.testGroupCases x))}]})
+
+topologicalSortBindingsTestCase :: Testing.TopologicalSortBindingsTestCase -> Core.Term
+topologicalSortBindingsTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap Core_.name Core_.term p)) xs)) (Testing.topologicalSortBindingsTestCaseBindings x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap Core_.name Core_.term p)) xs)) xs)) (Testing.topologicalSortBindingsTestCaseExpected x))}]})
+
+topologicalSortSCCTestCase :: Testing.TopologicalSortSCCTestCase -> Core.Term
+topologicalSortSCCTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "adjacencyList"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) p)) xs)) (Testing.topologicalSortSCCTestCaseAdjacencyList x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) xs)) (Testing.topologicalSortSCCTestCaseExpected x))}]})
+
+topologicalSortTestCase :: Testing.TopologicalSortTestCase -> Core.Term
+topologicalSortTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "adjacencyList"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\p -> Core.TermPair (Pairs.bimap (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) p)) xs)) (Testing.topologicalSortTestCaseAdjacencyList x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\xs -> Core.TermList (Lists.map (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) xs)) (\xs -> Core.TermList (Lists.map (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) xs)) e)) (Testing.topologicalSortTestCaseExpected x))}]})
+
+typeCheckingFailureTestCase :: Testing.TypeCheckingFailureTestCase -> Core.Term
+typeCheckingFailureTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.typeCheckingFailureTestCaseInput x))}]})
+
+typeCheckingTestCase :: Testing.TypeCheckingTestCase -> Core.Term
+typeCheckingTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.typeCheckingTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputTerm"),
+          Core.fieldTerm = (Core_.term (Testing.typeCheckingTestCaseOutputTerm x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "outputType"),
+          Core.fieldTerm = (Core_.type_ (Testing.typeCheckingTestCaseOutputType x))}]})
+
+typeReductionTestCase :: Testing.TypeReductionTestCase -> Core.Term
+typeReductionTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.type_ (Testing.typeReductionTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.type_ (Testing.typeReductionTestCaseOutput x))}]})
+
+typeRewriter :: Testing.TypeRewriter -> Core.Term
+typeRewriter x =
+    case x of
+      Testing.TypeRewriterReplaceStringWithInt32 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.testing.TypeRewriter"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "replaceStringWithInt32"),
+          Core.fieldTerm = Core.TermUnit}})
+
+unifyTypesTestCase :: Testing.UnifyTypesTestCase -> Core.Term
+unifyTypesTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "schemaTypes"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.name xs)) (Testing.unifyTypesTestCaseSchemaTypes x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core_.type_ (Testing.unifyTypesTestCaseLeft x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core_.type_ (Testing.unifyTypesTestCaseRight x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = ((\e -> Core.TermEither (Eithers.bimap (\x -> Core.TermLiteral (Core.LiteralString x)) Typing.typeSubst e)) (Testing.unifyTypesTestCaseExpected x))}]})
+
+unshadowVariablesTestCase :: Testing.UnshadowVariablesTestCase -> Core.Term
+unshadowVariablesTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.unshadowVariablesTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = (Core_.term (Testing.unshadowVariablesTestCaseOutput x))}]})
+
+validateCoreTermTestCase :: Testing.ValidateCoreTermTestCase -> Core.Term
+validateCoreTermTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typed"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Testing.validateCoreTermTestCaseTyped x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (Core_.term (Testing.validateCoreTermTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map Core__.invalidTermError opt)) (Testing.validateCoreTermTestCaseOutput x))}]})
+
+variableOccursInTypeTestCase :: Testing.VariableOccursInTypeTestCase -> Core.Term
+variableOccursInTypeTestCase x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = (Core_.name (Testing.variableOccursInTypeTestCaseVariable x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Testing.variableOccursInTypeTestCaseType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "expected"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Testing.variableOccursInTypeTestCaseExpected x))}]})
+
+writerTestCase :: (t0 -> Core.Term) -> Testing.WriterTestCase t0 -> Core.Term
+writerTestCase a x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "input"),
+          Core.fieldTerm = (a (Testing.writerTestCaseInput x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "output"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Testing.writerTestCaseOutput x))}]})
diff --git a/src/gen-main/haskell/Hydra/Encode/Topology.hs b/src/gen-main/haskell/Hydra/Encode/Topology.hs
--- a/src/gen-main/haskell/Hydra/Encode/Topology.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Topology.hs
@@ -16,31 +16,32 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-graph :: (M.Map Int [Int] -> Core.Term)
-graph m = (Core.TermMap (Maps.bimap vertex (\xs -> Core.TermList (Lists.map vertex xs)) m))
+graph :: M.Map Int [Int] -> Core.Term
+graph m = Core.TermMap (Maps.bimap vertex (\xs -> Core.TermList (Lists.map vertex xs)) m)
 
-tarjanState :: (Topology.TarjanState -> Core.Term)
-tarjanState x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "counter"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Topology.tarjanStateCounter x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "indices"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap vertex (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) m)) (Topology.tarjanStateIndices x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "lowLinks"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap vertex (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) m)) (Topology.tarjanStateLowLinks x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "stack"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map vertex xs)) (Topology.tarjanStateStack x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "onStack"),
-      Core.fieldTerm = ((\s -> Core.TermSet (Sets.map vertex s)) (Topology.tarjanStateOnStack x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "sccs"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\xs -> Core.TermList (Lists.map vertex xs)) xs)) (Topology.tarjanStateSccs x))}]}))
+tarjanState :: Topology.TarjanState -> Core.Term
+tarjanState x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "counter"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) (Topology.tarjanStateCounter x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "indices"),
+          Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap vertex (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) m)) (Topology.tarjanStateIndices x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lowLinks"),
+          Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap vertex (\x -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))) m)) (Topology.tarjanStateLowLinks x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "stack"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map vertex xs)) (Topology.tarjanStateStack x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "onStack"),
+          Core.fieldTerm = ((\s -> Core.TermSet (Sets.map vertex s)) (Topology.tarjanStateOnStack x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "sccs"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map (\xs -> Core.TermList (Lists.map vertex xs)) xs)) (Topology.tarjanStateSccs x))}]})
 
-vertex :: (Int -> Core.Term)
-vertex x = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x)))
+vertex :: Int -> Core.Term
+vertex x = Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 x))
diff --git a/src/gen-main/haskell/Hydra/Encode/Typing.hs b/src/gen-main/haskell/Hydra/Encode/Typing.hs
--- a/src/gen-main/haskell/Hydra/Encode/Typing.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Typing.hs
@@ -5,11 +5,11 @@
 module Hydra.Encode.Typing where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Encode.Context as Context
 import qualified Hydra.Encode.Core as Core_
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Typing as Typing
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -18,112 +18,77 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-functionStructure :: ((t0 -> Core.Term) -> Typing.FunctionStructure t0 -> Core.Term)
-functionStructure env x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeParams"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.name xs)) (Typing.functionStructureTypeParams x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "params"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.name xs)) (Typing.functionStructureParams x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "bindings"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.binding xs)) (Typing.functionStructureBindings x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "body"),
-      Core.fieldTerm = (Core_.term (Typing.functionStructureBody x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "domains"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.type_ xs)) (Typing.functionStructureDomains x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "codomain"),
-      Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map Core_.type_ opt)) (Typing.functionStructureCodomain x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "environment"),
-      Core.fieldTerm = (env (Typing.functionStructureEnvironment x))}]}))
-
-inferenceContext :: (Typing.InferenceContext -> Core.Term)
-inferenceContext x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.typing.InferenceContext"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "schemaTypes"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.typeScheme m)) (Typing.inferenceContextSchemaTypes x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "primitiveTypes"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.typeScheme m)) (Typing.inferenceContextPrimitiveTypes x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "dataTypes"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.typeScheme m)) (Typing.inferenceContextDataTypes x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "classConstraints"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.typeVariableMetadata m)) (Typing.inferenceContextClassConstraints x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "debug"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralBoolean x)) (Typing.inferenceContextDebug x))}]}))
-
-inferenceResult :: (Typing.InferenceResult -> Core.Term)
-inferenceResult x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "term"),
-      Core.fieldTerm = (Core_.term (Typing.inferenceResultTerm x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "type"),
-      Core.fieldTerm = (Core_.type_ (Typing.inferenceResultType x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "subst"),
-      Core.fieldTerm = (typeSubst (Typing.inferenceResultSubst x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "classConstraints"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.typeVariableMetadata m)) (Typing.inferenceResultClassConstraints x))}]}))
+functionStructure :: (t0 -> Core.Term) -> Typing.FunctionStructure t0 -> Core.Term
+functionStructure env x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeParams"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.name xs)) (Typing.functionStructureTypeParams x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "params"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.name xs)) (Typing.functionStructureParams x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "bindings"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.binding xs)) (Typing.functionStructureBindings x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "body"),
+          Core.fieldTerm = (Core_.term (Typing.functionStructureBody x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "domains"),
+          Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Core_.type_ xs)) (Typing.functionStructureDomains x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "codomain"),
+          Core.fieldTerm = ((\opt -> Core.TermMaybe (Maybes.map Core_.type_ opt)) (Typing.functionStructureCodomain x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "environment"),
+          Core.fieldTerm = (env (Typing.functionStructureEnvironment x))}]})
 
-termSubst :: (Typing.TermSubst -> Core.Term)
-termSubst x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.typing.TermSubst"),
-  Core.wrappedTermBody = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.term m)) (Typing.unTermSubst x))}))
+inferenceResult :: Typing.InferenceResult -> Core.Term
+inferenceResult x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "term"),
+          Core.fieldTerm = (Core_.term (Typing.inferenceResultTerm x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "type"),
+          Core.fieldTerm = (Core_.type_ (Typing.inferenceResultType x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "subst"),
+          Core.fieldTerm = (typeSubst (Typing.inferenceResultSubst x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "classConstraints"),
+          Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.typeVariableMetadata m)) (Typing.inferenceResultClassConstraints x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "context"),
+          Core.fieldTerm = (Context.context (Typing.inferenceResultContext x))}]})
 
-typeConstraint :: (Typing.TypeConstraint -> Core.Term)
-typeConstraint x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.typing.TypeConstraint"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "left"),
-      Core.fieldTerm = (Core_.type_ (Typing.typeConstraintLeft x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "right"),
-      Core.fieldTerm = (Core_.type_ (Typing.typeConstraintRight x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "comment"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Typing.typeConstraintComment x))}]}))
+termSubst :: Typing.TermSubst -> Core.Term
+termSubst x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.typing.TermSubst"),
+      Core.wrappedTermBody = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.term m)) (Typing.unTermSubst x))})
 
-typeContext :: (Typing.TypeContext -> Core.Term)
-typeContext x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.typing.TypeContext"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "types"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.type_ m)) (Typing.typeContextTypes x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "metadata"),
-      Core.fieldTerm = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.term m)) (Typing.typeContextMetadata x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "typeVariables"),
-      Core.fieldTerm = ((\s -> Core.TermSet (Sets.map Core_.name s)) (Typing.typeContextTypeVariables x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "lambdaVariables"),
-      Core.fieldTerm = ((\s -> Core.TermSet (Sets.map Core_.name s)) (Typing.typeContextLambdaVariables x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "letVariables"),
-      Core.fieldTerm = ((\s -> Core.TermSet (Sets.map Core_.name s)) (Typing.typeContextLetVariables x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "inferenceContext"),
-      Core.fieldTerm = (inferenceContext (Typing.typeContextInferenceContext x))}]}))
+typeConstraint :: Typing.TypeConstraint -> Core.Term
+typeConstraint x =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "left"),
+          Core.fieldTerm = (Core_.type_ (Typing.typeConstraintLeft x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "right"),
+          Core.fieldTerm = (Core_.type_ (Typing.typeConstraintRight x))},
+        Core.Field {
+          Core.fieldName = (Core.Name "comment"),
+          Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Typing.typeConstraintComment x))}]})
 
-typeSubst :: (Typing.TypeSubst -> Core.Term)
-typeSubst x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.typing.TypeSubst"),
-  Core.wrappedTermBody = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.type_ m)) (Typing.unTypeSubst x))}))
+typeSubst :: Typing.TypeSubst -> Core.Term
+typeSubst x =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.typing.TypeSubst"),
+      Core.wrappedTermBody = ((\m -> Core.TermMap (Maps.bimap Core_.name Core_.type_ m)) (Typing.unTypeSubst x))})
diff --git a/src/gen-main/haskell/Hydra/Encode/Util.hs b/src/gen-main/haskell/Hydra/Encode/Util.hs
--- a/src/gen-main/haskell/Hydra/Encode/Util.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Util.hs
@@ -13,61 +13,59 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-caseConvention :: (Util.CaseConvention -> Core.Term)
-caseConvention x = case x of
-  Util.CaseConventionCamel -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "camel"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Util.CaseConventionPascal -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "pascal"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Util.CaseConventionLowerSnake -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lowerSnake"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Util.CaseConventionUpperSnake -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "upperSnake"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-comparison :: (Util.Comparison -> Core.Term)
-comparison x = case x of
-  Util.ComparisonLessThan -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lessThan"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Util.ComparisonEqualTo -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "equalTo"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Util.ComparisonGreaterThan -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "greaterThan"),
-      Core.fieldTerm = Core.TermUnit}}))
+caseConvention :: Util.CaseConvention -> Core.Term
+caseConvention x =
+    case x of
+      Util.CaseConventionCamel -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "camel"),
+          Core.fieldTerm = Core.TermUnit}})
+      Util.CaseConventionPascal -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pascal"),
+          Core.fieldTerm = Core.TermUnit}})
+      Util.CaseConventionLowerSnake -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lowerSnake"),
+          Core.fieldTerm = Core.TermUnit}})
+      Util.CaseConventionUpperSnake -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "upperSnake"),
+          Core.fieldTerm = Core.TermUnit}})
 
-decodingError :: (Util.DecodingError -> Core.Term)
-decodingError x = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-  Core.wrappedTermBody = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Util.unDecodingError x))}))
+comparison :: Util.Comparison -> Core.Term
+comparison x =
+    case x of
+      Util.ComparisonLessThan -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lessThan"),
+          Core.fieldTerm = Core.TermUnit}})
+      Util.ComparisonEqualTo -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "equalTo"),
+          Core.fieldTerm = Core.TermUnit}})
+      Util.ComparisonGreaterThan -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "greaterThan"),
+          Core.fieldTerm = Core.TermUnit}})
 
-precision :: (Util.Precision -> Core.Term)
-precision x = case x of
-  Util.PrecisionArbitrary -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "arbitrary"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Util.PrecisionBits v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "bits"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v1)))}}))
+precision :: Util.Precision -> Core.Term
+precision x =
+    case x of
+      Util.PrecisionArbitrary -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "arbitrary"),
+          Core.fieldTerm = Core.TermUnit}})
+      Util.PrecisionBits v0 -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "bits"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 v0)))}})
diff --git a/src/gen-main/haskell/Hydra/Encode/Variants.hs b/src/gen-main/haskell/Hydra/Encode/Variants.hs
--- a/src/gen-main/haskell/Hydra/Encode/Variants.hs
+++ b/src/gen-main/haskell/Hydra/Encode/Variants.hs
@@ -13,242 +13,252 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-eliminationVariant :: (Variants.EliminationVariant -> Core.Term)
-eliminationVariant x = case x of
-  Variants.EliminationVariantRecord -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "record"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.EliminationVariantUnion -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "union"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.EliminationVariantWrap -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wrap"),
-      Core.fieldTerm = Core.TermUnit}}))
+eliminationVariant :: Variants.EliminationVariant -> Core.Term
+eliminationVariant x =
+    case x of
+      Variants.EliminationVariantRecord -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "record"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.EliminationVariantUnion -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "union"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.EliminationVariantWrap -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrap"),
+          Core.fieldTerm = Core.TermUnit}})
 
-functionVariant :: (Variants.FunctionVariant -> Core.Term)
-functionVariant x = case x of
-  Variants.FunctionVariantElimination -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "elimination"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.FunctionVariantLambda -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "lambda"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.FunctionVariantPrimitive -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "primitive"),
-      Core.fieldTerm = Core.TermUnit}}))
+functionVariant :: Variants.FunctionVariant -> Core.Term
+functionVariant x =
+    case x of
+      Variants.FunctionVariantElimination -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "elimination"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.FunctionVariantLambda -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "lambda"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.FunctionVariantPrimitive -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "primitive"),
+          Core.fieldTerm = Core.TermUnit}})
 
-literalVariant :: (Variants.LiteralVariant -> Core.Term)
-literalVariant x = case x of
-  Variants.LiteralVariantBinary -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "binary"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.LiteralVariantBoolean -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "boolean"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.LiteralVariantFloat -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "float"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.LiteralVariantInteger -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "integer"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.LiteralVariantString -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "string"),
-      Core.fieldTerm = Core.TermUnit}}))
+literalVariant :: Variants.LiteralVariant -> Core.Term
+literalVariant x =
+    case x of
+      Variants.LiteralVariantBinary -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "binary"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.LiteralVariantBoolean -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "boolean"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.LiteralVariantFloat -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "float"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.LiteralVariantInteger -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "integer"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.LiteralVariantString -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "string"),
+          Core.fieldTerm = Core.TermUnit}})
 
-termVariant :: (Variants.TermVariant -> Core.Term)
-termVariant x = case x of
-  Variants.TermVariantAnnotated -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "annotated"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantApplication -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "application"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantEither -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "either"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantFunction -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "function"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantLet -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "let"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantList -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "list"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantLiteral -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "literal"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantMap -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "map"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantMaybe -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "maybe"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantPair -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "pair"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantRecord -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "record"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantSet -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "set"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantTypeApplication -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeApplication"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantTypeLambda -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "typeLambda"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantUnion -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "union"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantUnit -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "unit"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantVariable -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "variable"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TermVariantWrap -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wrap"),
-      Core.fieldTerm = Core.TermUnit}}))
+termVariant :: Variants.TermVariant -> Core.Term
+termVariant x =
+    case x of
+      Variants.TermVariantAnnotated -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "annotated"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantApplication -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "application"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantEither -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "either"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantFunction -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantLet -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "let"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantList -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "list"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantLiteral -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "literal"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantMap -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "map"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantMaybe -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "maybe"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantPair -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pair"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantRecord -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "record"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantSet -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "set"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantTypeApplication -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeApplication"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantTypeLambda -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "typeLambda"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantUnion -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "union"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantUnit -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unit"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantVariable -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TermVariantWrap -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrap"),
+          Core.fieldTerm = Core.TermUnit}})
 
-typeVariant :: (Variants.TypeVariant -> Core.Term)
-typeVariant x = case x of
-  Variants.TypeVariantAnnotated -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "annotated"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantApplication -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "application"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantEither -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "either"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantForall -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "forall"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantFunction -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "function"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantList -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "list"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantLiteral -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "literal"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantMap -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "map"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantMaybe -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "maybe"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantPair -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "pair"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantRecord -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "record"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantSet -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "set"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantUnion -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "union"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantUnit -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "unit"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantVariable -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "variable"),
-      Core.fieldTerm = Core.TermUnit}}))
-  Variants.TypeVariantWrap -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wrap"),
-      Core.fieldTerm = Core.TermUnit}}))
+typeVariant :: Variants.TypeVariant -> Core.Term
+typeVariant x =
+    case x of
+      Variants.TypeVariantAnnotated -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "annotated"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantApplication -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "application"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantEither -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "either"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantForall -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "forall"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantFunction -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "function"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantList -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "list"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantLiteral -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "literal"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantMap -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "map"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantMaybe -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "maybe"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantPair -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pair"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantRecord -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "record"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantSet -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "set"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantUnion -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "union"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantUnit -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "unit"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantVariable -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "variable"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantVoid -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "void"),
+          Core.fieldTerm = Core.TermUnit}})
+      Variants.TypeVariantWrap -> Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrap"),
+          Core.fieldTerm = Core.TermUnit}})
diff --git a/src/gen-main/haskell/Hydra/Encode/Workflow.hs b/src/gen-main/haskell/Hydra/Encode/Workflow.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Encode/Workflow.hs
+++ /dev/null
@@ -1,63 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Term encoders for hydra.workflow
-
-module Hydra.Encode.Workflow where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Encode.Core as Core_
-import qualified Hydra.Encode.Module as Module
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Workflow as Workflow
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-hydraSchemaSpec :: (Workflow.HydraSchemaSpec -> Core.Term)
-hydraSchemaSpec x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.workflow.HydraSchemaSpec"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "modules"),
-      Core.fieldTerm = ((\xs -> Core.TermList (Lists.map Module.module_ xs)) (Workflow.hydraSchemaSpecModules x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (Core_.name (Workflow.hydraSchemaSpecTypeName x))}]}))
-
-schemaSpec :: (Workflow.SchemaSpec -> Core.Term)
-schemaSpec x = case x of
-  Workflow.SchemaSpecHydra v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.workflow.SchemaSpec"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "hydra"),
-      Core.fieldTerm = (hydraSchemaSpec v1)}}))
-  Workflow.SchemaSpecFile v1 -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.workflow.SchemaSpec"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "file"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString v1))}}))
-  Workflow.SchemaSpecProvided -> (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.workflow.SchemaSpec"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "provided"),
-      Core.fieldTerm = Core.TermUnit}}))
-
-transformWorkflow :: (Workflow.TransformWorkflow -> Core.Term)
-transformWorkflow x = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.workflow.TransformWorkflow"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "name"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Workflow.transformWorkflowName x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "schemaSpec"),
-      Core.fieldTerm = (schemaSpec (Workflow.transformWorkflowSchemaSpec x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "srcDir"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Workflow.transformWorkflowSrcDir x))},
-    Core.Field {
-      Core.fieldName = (Core.Name "destDir"),
-      Core.fieldTerm = ((\x -> Core.TermLiteral (Core.LiteralString x)) (Workflow.transformWorkflowDestDir x))}]}))
diff --git a/src/gen-main/haskell/Hydra/Encoding.hs b/src/gen-main/haskell/Hydra/Encoding.hs
--- a/src/gen-main/haskell/Hydra/Encoding.hs
+++ b/src/gen-main/haskell/Hydra/Encoding.hs
@@ -5,21 +5,22 @@
 module Hydra.Encoding where
 
 import qualified Hydra.Annotations as Annotations
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Formatting as Formatting
 import qualified Hydra.Graph as Graph
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Module as Module
-import qualified Hydra.Monads as Monads
 import qualified Hydra.Names as Names
 import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -28,386 +29,665 @@
 import qualified Data.Set as S
 
 -- | Transform a type binding into an encoder binding
-encodeBinding :: (Core.Binding -> Compute.Flow Graph.Graph Core.Binding)
-encodeBinding b = (Flows.bind Monads.getState (\cx -> Flows.bind (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm b))) (\typ -> Flows.pure (Core.Binding {
-  Core.bindingName = (encodeBindingName (Core.bindingName b)),
-  Core.bindingTerm = (encodeType typ),
-  Core.bindingType = Nothing}))))
+encodeBinding :: Context.Context -> Graph.Graph -> Core.Binding -> Either (Context.InContext Errors.DecodingError) Core.Binding
+encodeBinding cx graph b =
+    Eithers.bind (Eithers.bimap (\_wc_e -> Context.InContext {
+      Context.inContextObject = _wc_e,
+      Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Core_.type_ graph (Core.bindingTerm b))) (\typ -> Right (Core.Binding {
+      Core.bindingName = (encodeBindingName (Core.bindingName b)),
+      Core.bindingTerm = (encodeTypeNamed (Core.bindingName b) typ),
+      Core.bindingType = (Just (encoderTypeSchemeNamed (Core.bindingName b) typ))}))
 
 -- | Generate a binding name for an encoder function from a type name
-encodeBindingName :: (Core.Name -> Core.Name)
-encodeBindingName n = (Logic.ifElse (Logic.not (Lists.null (Lists.tail (Strings.splitOn "." (Core.unName n))))) (Core.Name (Strings.intercalate "." (Lists.concat2 [
-  "hydra",
-  "encode"] (Lists.concat2 (Lists.tail (Lists.init (Strings.splitOn "." (Core.unName n)))) [
-  Formatting.decapitalize (Names.localNameOf n)])))) (Core.Name (Formatting.decapitalize (Names.localNameOf n))))
+encodeBindingName :: Core.Name -> Core.Name
+encodeBindingName n =
+    Logic.ifElse (Logic.not (Lists.null (Lists.tail (Strings.splitOn "." (Core.unName n))))) (Core.Name (Strings.intercalate "." (Lists.concat2 [
+      "hydra",
+      "encode"] (Lists.concat2 (Lists.tail (Lists.init (Strings.splitOn "." (Core.unName n)))) [
+      Formatting.decapitalize (Names.localNameOf n)])))) (Core.Name (Formatting.decapitalize (Names.localNameOf n)))
 
+-- | Generate an encoder for an Either type
+encodeEitherType :: Core.EitherType -> Core.Term
+encodeEitherType et =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "e"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "either"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                Core.applicationArgument = (encodeType (Core.eitherTypeLeft et))})),
+              Core.applicationArgument = (encodeType (Core.eitherTypeRight et))})),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))
+
 -- | Generate the encoder for a field's value
-encodeFieldValue :: (Core.Name -> Core.Name -> Core.Type -> Core.Term)
-encodeFieldValue typeName fieldName fieldType = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "y"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "union"),
-      Core.fieldTerm = (encodeInjection typeName fieldName (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (encodeType fieldType),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})))}}))})))
+encodeFieldValue :: Core.Name -> Core.Name -> Core.Type -> Core.Term
+encodeFieldValue typeName fieldName fieldType =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "y"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "union"),
+          Core.fieldTerm = (encodeInjection typeName fieldName (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (encodeType fieldType),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})))}}))}))
 
 -- | Encode a float value based on its float type
-encodeFloatValue :: (Core.FloatType -> Core.Term -> Core.Term)
-encodeFloatValue floatType valTerm = (Core.TermUnion (Core.Injection {
-  Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-  Core.injectionField = Core.Field {
-    Core.fieldName = ((\x -> case x of
-      Core.FloatTypeBigfloat -> (Core.Name "bigfloat")
-      Core.FloatTypeFloat32 -> (Core.Name "float32")
-      Core.FloatTypeFloat64 -> (Core.Name "float64")) floatType),
-    Core.fieldTerm = valTerm}}))
+encodeFloatValue :: Core.FloatType -> Core.Term -> Core.Term
+encodeFloatValue floatType valTerm =
+    Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = case floatType of
+          Core.FloatTypeBigfloat -> Core.Name "bigfloat"
+          Core.FloatTypeFloat32 -> Core.Name "float32"
+          Core.FloatTypeFloat64 -> Core.Name "float64",
+        Core.fieldTerm = valTerm}})
 
+-- | Generate an encoder for a polymorphic (forall) type
+encodeForallType :: Core.ForallType -> Core.Term
+encodeForallType ft =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (encodeBindingName (Core.forallTypeParameter ft)),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (encodeType (Core.forallTypeBody ft))}))
+
 -- | Encode an Injection as a term
-encodeInjection :: (Core.Name -> Core.Name -> Core.Term -> Core.Term)
-encodeInjection typeName fieldName fieldTerm = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "typeName"),
-      Core.fieldTerm = (encodeName typeName)},
-    Core.Field {
-      Core.fieldName = (Core.Name "field"),
-      Core.fieldTerm = ((\fname -> \fterm -> Core.TermRecord (Core.Record {
-        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-        Core.recordFields = [
-          Core.Field {
-            Core.fieldName = (Core.Name "name"),
-            Core.fieldTerm = (encodeName fname)},
-          Core.Field {
-            Core.fieldName = (Core.Name "term"),
-            Core.fieldTerm = fterm}]})) fieldName fieldTerm)}]}))
+encodeInjection :: Core.Name -> Core.Name -> Core.Term -> Core.Term
+encodeInjection typeName fieldName fieldTerm =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "typeName"),
+          Core.fieldTerm = (encodeName typeName)},
+        Core.Field {
+          Core.fieldName = (Core.Name "field"),
+          Core.fieldTerm = ((\fname -> \fterm -> Core.TermRecord (Core.Record {
+            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+            Core.recordFields = [
+              Core.Field {
+                Core.fieldName = (Core.Name "name"),
+                Core.fieldTerm = (encodeName fname)},
+              Core.Field {
+                Core.fieldName = (Core.Name "term"),
+                Core.fieldTerm = fterm}]})) fieldName fieldTerm)}]})
 
 -- | Encode an integer value based on its integer type
-encodeIntegerValue :: (Core.IntegerType -> Core.Term -> Core.Term)
-encodeIntegerValue intType valTerm = (Core.TermUnion (Core.Injection {
-  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-  Core.injectionField = Core.Field {
-    Core.fieldName = ((\x -> case x of
-      Core.IntegerTypeBigint -> (Core.Name "bigint")
-      Core.IntegerTypeInt8 -> (Core.Name "int8")
-      Core.IntegerTypeInt16 -> (Core.Name "int16")
-      Core.IntegerTypeInt32 -> (Core.Name "int32")
-      Core.IntegerTypeInt64 -> (Core.Name "int64")
-      Core.IntegerTypeUint8 -> (Core.Name "uint8")
-      Core.IntegerTypeUint16 -> (Core.Name "uint16")
-      Core.IntegerTypeUint32 -> (Core.Name "uint32")
-      Core.IntegerTypeUint64 -> (Core.Name "uint64")) intType),
-    Core.fieldTerm = valTerm}}))
+encodeIntegerValue :: Core.IntegerType -> Core.Term -> Core.Term
+encodeIntegerValue intType valTerm =
+    Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = case intType of
+          Core.IntegerTypeBigint -> Core.Name "bigint"
+          Core.IntegerTypeInt8 -> Core.Name "int8"
+          Core.IntegerTypeInt16 -> Core.Name "int16"
+          Core.IntegerTypeInt32 -> Core.Name "int32"
+          Core.IntegerTypeInt64 -> Core.Name "int64"
+          Core.IntegerTypeUint8 -> Core.Name "uint8"
+          Core.IntegerTypeUint16 -> Core.Name "uint16"
+          Core.IntegerTypeUint32 -> Core.Name "uint32"
+          Core.IntegerTypeUint64 -> Core.Name "uint64",
+        Core.fieldTerm = valTerm}})
 
 -- | Generate an encoder for a list type
-encodeListType :: (Core.Type -> Core.Term)
-encodeListType elemType = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "xs"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "list"),
-      Core.fieldTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-          Core.applicationArgument = (encodeType elemType)})),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))
+encodeListType :: Core.Type -> Core.Term
+encodeListType elemType =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "xs"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "list"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+              Core.applicationArgument = (encodeType elemType)})),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))
 
 -- | Generate an encoder for a literal type
-encodeLiteralType :: (Core.LiteralType -> Core.Term)
-encodeLiteralType x = case x of
-  Core.LiteralTypeBinary -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "x"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-      Core.injectionField = Core.Field {
-        Core.fieldName = (Core.Name "literal"),
-        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+encodeLiteralType :: Core.LiteralType -> Core.Term
+encodeLiteralType x =
+    case x of
+      Core.LiteralTypeBinary -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
           Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "binary"),
-            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))
-  Core.LiteralTypeBoolean -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "x"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-      Core.injectionField = Core.Field {
-        Core.fieldName = (Core.Name "literal"),
-        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+            Core.fieldName = (Core.Name "literal"),
+            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "binary"),
+                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))
+      Core.LiteralTypeBoolean -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
           Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "boolean"),
-            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))
-  Core.LiteralTypeString -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "x"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-      Core.injectionField = Core.Field {
-        Core.fieldName = (Core.Name "literal"),
-        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+            Core.fieldName = (Core.Name "literal"),
+            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "boolean"),
+                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))
+      Core.LiteralTypeString -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
           Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "string"),
-            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))
-  Core.LiteralTypeInteger v1 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "x"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-      Core.injectionField = Core.Field {
-        Core.fieldName = (Core.Name "literal"),
-        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+            Core.fieldName = (Core.Name "literal"),
+            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "string"),
+                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))
+      Core.LiteralTypeInteger v0 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
           Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "integer"),
-            Core.fieldTerm = (encodeIntegerValue v1 (Core.TermVariable (Core.Name "x")))}}))}}))})))
-  Core.LiteralTypeFloat v1 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "x"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-      Core.injectionField = Core.Field {
-        Core.fieldName = (Core.Name "literal"),
-        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+            Core.fieldName = (Core.Name "literal"),
+            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "integer"),
+                Core.fieldTerm = (encodeIntegerValue v0 (Core.TermVariable (Core.Name "x")))}}))}}))}))
+      Core.LiteralTypeFloat v0 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
           Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "float"),
-            Core.fieldTerm = (encodeFloatValue v1 (Core.TermVariable (Core.Name "x")))}}))}}))})))
-  _ -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "x"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))
-
--- | Generate an encoder for an Either type
-encodeEitherType :: (Core.EitherType -> Core.Term)
-encodeEitherType et = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "e"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "either"),
-      Core.fieldTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-            Core.applicationArgument = (encodeType (Core.eitherTypeLeft et))})),
-          Core.applicationArgument = (encodeType (Core.eitherTypeRight et))})),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))})))
-
--- | Generate an encoder for a polymorphic (forall) type
-encodeForallType :: (Core.ForallType -> Core.Term)
-encodeForallType ft = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (encodeBindingName (Core.forallTypeParameter ft)),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (encodeType (Core.forallTypeBody ft))})))
+            Core.fieldName = (Core.Name "literal"),
+            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "float"),
+                Core.fieldTerm = (encodeFloatValue v0 (Core.TermVariable (Core.Name "x")))}}))}}))}))
+      _ -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))
 
 -- | Generate an encoder for a map type
-encodeMapType :: (Core.MapType -> Core.Term)
-encodeMapType mt = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "m"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "map"),
-      Core.fieldTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-            Core.applicationArgument = (encodeType (Core.mapTypeKeys mt))})),
-          Core.applicationArgument = (encodeType (Core.mapTypeValues mt))})),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))})))
-
--- | Generate an encoder for an optional type
-encodeOptionalType :: (Core.Type -> Core.Term)
-encodeOptionalType elemType = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "opt"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "maybe"),
-      Core.fieldTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-          Core.applicationArgument = (encodeType elemType)})),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))})))
-
--- | Generate an encoder for a pair type
-encodePairType :: (Core.PairType -> Core.Term)
-encodePairType pt = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "p"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "pair"),
-      Core.fieldTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-            Core.applicationArgument = (encodeType (Core.pairTypeFirst pt))})),
-          Core.applicationArgument = (encodeType (Core.pairTypeSecond pt))})),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))
+encodeMapType :: Core.MapType -> Core.Term
+encodeMapType mt =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "m"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "map"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                Core.applicationArgument = (encodeType (Core.mapTypeKeys mt))})),
+              Core.applicationArgument = (encodeType (Core.mapTypeValues mt))})),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))
 
 -- | Transform a type module into an encoder module
-encodeModule :: (Module.Module -> Compute.Flow Graph.Graph (Maybe Module.Module))
-encodeModule mod = (Flows.bind (filterTypeBindings (Module.moduleElements mod)) (\typeBindings -> Logic.ifElse (Lists.null typeBindings) (Flows.pure Nothing) (Flows.bind (Flows.mapList encodeBinding typeBindings) (\encodedBindings -> Flows.pure (Just (Module.Module {
-  Module.moduleNamespace = (encodeNamespace (Module.moduleNamespace mod)),
-  Module.moduleElements = encodedBindings,
-  Module.moduleTermDependencies = (Lists.map encodeNamespace (Module.moduleTypeDependencies mod)),
-  Module.moduleTypeDependencies = [
-    Module.moduleNamespace mod],
-  Module.moduleDescription = (Just (Strings.cat [
-    "Term encoders for ",
-    (Module.unNamespace (Module.moduleNamespace mod))]))}))))))
+encodeModule :: Context.Context -> Graph.Graph -> Module.Module -> Either (Context.InContext Errors.Error) (Maybe Module.Module)
+encodeModule cx graph mod =
+    Eithers.bind (filterTypeBindings cx graph (Maybes.cat (Lists.map (\d -> case d of
+      Module.DefinitionType v0 -> Just (Annotations.typeElement (Module.typeDefinitionName v0) (Module.typeDefinitionType v0))
+      _ -> Nothing) (Module.moduleDefinitions mod)))) (\typeBindings -> Logic.ifElse (Lists.null typeBindings) (Right Nothing) (Eithers.bind (Eithers.mapList (\b -> Eithers.bimap (\ic -> Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError (Context.inContextObject ic)))),
+      Context.inContextContext = (Context.inContextContext ic)}) (\x -> x) (encodeBinding cx graph b)) typeBindings) (\encodedBindings -> Right (Just (Module.Module {
+      Module.moduleNamespace = (encodeNamespace (Module.moduleNamespace mod)),
+      Module.moduleDefinitions = (Lists.map (\b -> Module.DefinitionTerm (Module.TermDefinition {
+        Module.termDefinitionName = (Core.bindingName b),
+        Module.termDefinitionTerm = (Core.bindingTerm b),
+        Module.termDefinitionType = (Core.bindingType b)})) encodedBindings),
+      Module.moduleTermDependencies = (Lists.nub (Lists.concat2 (Lists.map encodeNamespace (Module.moduleTypeDependencies mod)) (Lists.map encodeNamespace (Module.moduleTermDependencies mod)))),
+      Module.moduleTypeDependencies = [
+        Module.moduleNamespace mod],
+      Module.moduleDescription = (Just (Strings.cat [
+        "Term encoders for ",
+        (Module.unNamespace (Module.moduleNamespace mod))]))})))))
 
 -- | Encode a Name as a term
-encodeName :: (Core.Name -> Core.Term)
-encodeName n = (Core.TermWrap (Core.WrappedTerm {
-  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName n)))}))
+encodeName :: Core.Name -> Core.Term
+encodeName n =
+    Core.TermWrap (Core.WrappedTerm {
+      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString (Core.unName n)))})
 
 -- | Generate an encoder module namespace from a source module namespace
-encodeNamespace :: (Module.Namespace -> Module.Namespace)
-encodeNamespace ns = (Module.Namespace (Strings.cat [
-  "hydra.encode.",
-  (Strings.intercalate "." (Lists.tail (Strings.splitOn "." (Module.unNamespace ns))))]))
+encodeNamespace :: Module.Namespace -> Module.Namespace
+encodeNamespace ns =
+    Module.Namespace (Strings.cat [
+      "hydra.encode.",
+      (Strings.intercalate "." (Lists.tail (Strings.splitOn "." (Module.unNamespace ns))))])
 
--- | Generate an encoder for a record type
-encodeRecordType :: (Core.RowType -> Core.Term)
-encodeRecordType rt = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "x"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "record"),
-      Core.fieldTerm = (Core.TermRecord (Core.Record {
-        Core.recordTypeName = (Core.Name "hydra.core.Record"),
-        Core.recordFields = [
-          Core.Field {
-            Core.fieldName = (Core.Name "typeName"),
-            Core.fieldTerm = (encodeName (Core.rowTypeTypeName rt))},
-          Core.Field {
-            Core.fieldName = (Core.Name "fields"),
-            Core.fieldTerm = (Core.TermList (Lists.map ((\recType -> \ft -> Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Field"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "name"),
-                  Core.fieldTerm = (encodeName (Core.fieldTypeName ft))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "term"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (encodeType (Core.fieldTypeType ft)),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = (Core.rowTypeTypeName recType),
-                        Core.projectionField = (Core.fieldTypeName ft)})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})) rt) (Core.rowTypeFields rt)))}]}))}}))})))
+-- | Generate an encoder for an optional type
+encodeOptionalType :: Core.Type -> Core.Term
+encodeOptionalType elemType =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "opt"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "maybe"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+              Core.applicationArgument = (encodeType elemType)})),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))
 
+-- | Generate an encoder for a pair type
+encodePairType :: Core.PairType -> Core.Term
+encodePairType pt =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "p"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "pair"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                Core.applicationArgument = (encodeType (Core.pairTypeFirst pt))})),
+              Core.applicationArgument = (encodeType (Core.pairTypeSecond pt))})),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))}))
+
+-- | Generate an encoder for a record type (unnamed — should not be called directly)
+encodeRecordType :: [Core.FieldType] -> Core.Term
+encodeRecordType rt = encodeRecordTypeNamed (Core.Name "unknown") rt
+
+-- | Generate an encoder for a record type with the given element name
+encodeRecordTypeNamed :: Core.Name -> [Core.FieldType] -> Core.Term
+encodeRecordTypeNamed ename rt =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "x"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "record"),
+          Core.fieldTerm = (Core.TermRecord (Core.Record {
+            Core.recordTypeName = (Core.Name "hydra.core.Record"),
+            Core.recordFields = [
+              Core.Field {
+                Core.fieldName = (Core.Name "typeName"),
+                Core.fieldTerm = (encodeName ename)},
+              Core.Field {
+                Core.fieldName = (Core.Name "fields"),
+                Core.fieldTerm = (Core.TermList (Lists.map ((\tname -> \recType -> \ft -> Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "name"),
+                      Core.fieldTerm = (encodeName (Core.fieldTypeName ft))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "term"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (encodeType (Core.fieldTypeType ft)),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = tname,
+                            Core.projectionField = (Core.fieldTypeName ft)})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})) ename rt) rt))}]}))}}))}))
+
 -- | Generate an encoder for a set type
-encodeSetType :: (Core.Type -> Core.Term)
-encodeSetType elemType = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "s"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "set"),
-      Core.fieldTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-          Core.applicationArgument = (encodeType elemType)})),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))})))
+encodeSetType :: Core.Type -> Core.Term
+encodeSetType elemType =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "s"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "set"),
+          Core.fieldTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+              Core.applicationArgument = (encodeType elemType)})),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))
 
 -- | Generate an encoder term for a Type
-encodeType :: (Core.Type -> Core.Term)
-encodeType x = case x of
-  Core.TypeAnnotated v1 -> (encodeType (Core.annotatedTypeBody v1))
-  Core.TypeApplication v1 -> (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (encodeType (Core.applicationTypeFunction v1)),
-    Core.applicationArgument = (encodeType (Core.applicationTypeArgument v1))}))
-  Core.TypeEither v1 -> (encodeEitherType v1)
-  Core.TypeForall v1 -> (encodeForallType v1)
-  Core.TypeFunction _ -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "x"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))
-  Core.TypeList v1 -> (encodeListType v1)
-  Core.TypeLiteral v1 -> (encodeLiteralType v1)
-  Core.TypeMap v1 -> (encodeMapType v1)
-  Core.TypeMaybe v1 -> (encodeOptionalType v1)
-  Core.TypePair v1 -> (encodePairType v1)
-  Core.TypeRecord v1 -> (encodeRecordType v1)
-  Core.TypeSet v1 -> (encodeSetType v1)
-  Core.TypeUnion v1 -> (encodeUnionType v1)
-  Core.TypeWrap v1 -> (encodeWrappedType v1)
-  Core.TypeUnit -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "_"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-      Core.injectionField = Core.Field {
-        Core.fieldName = (Core.Name "unit"),
-        Core.fieldTerm = Core.TermUnit}}))})))
-  Core.TypeVariable v1 -> (Core.TermVariable (encodeBindingName v1))
-  _ -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "x"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))
+encodeType :: Core.Type -> Core.Term
+encodeType x =
+    case x of
+      Core.TypeAnnotated v0 -> encodeType (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = (encodeType (Core.applicationTypeFunction v0)),
+        Core.applicationArgument = (encodeType (Core.applicationTypeArgument v0))})
+      Core.TypeEither v0 -> encodeEitherType v0
+      Core.TypeForall v0 -> encodeForallType v0
+      Core.TypeFunction _ -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))
+      Core.TypeList v0 -> encodeListType v0
+      Core.TypeLiteral v0 -> encodeLiteralType v0
+      Core.TypeMap v0 -> encodeMapType v0
+      Core.TypeMaybe v0 -> encodeOptionalType v0
+      Core.TypePair v0 -> encodePairType v0
+      Core.TypeRecord v0 -> encodeRecordType v0
+      Core.TypeSet v0 -> encodeSetType v0
+      Core.TypeUnion v0 -> encodeUnionType v0
+      Core.TypeWrap v0 -> encodeWrappedType v0
+      Core.TypeUnit -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "_"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+          Core.injectionField = Core.Field {
+            Core.fieldName = (Core.Name "unit"),
+            Core.fieldTerm = Core.TermUnit}}))}))
+      Core.TypeVoid -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "_"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+          Core.injectionField = Core.Field {
+            Core.fieldName = (Core.Name "unit"),
+            Core.fieldTerm = Core.TermUnit}}))}))
+      Core.TypeVariable v0 -> Core.TermVariable (encodeBindingName v0)
+      _ -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))
 
--- | Generate an encoder for a union type
-encodeUnionType :: (Core.RowType -> Core.Term)
-encodeUnionType rt = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-  Core.caseStatementTypeName = (Core.rowTypeTypeName rt),
-  Core.caseStatementDefault = Nothing,
-  Core.caseStatementCases = (Lists.map (\ft -> Core.Field {
-    Core.fieldName = (Core.fieldTypeName ft),
-    Core.fieldTerm = (encodeFieldValue (Core.rowTypeTypeName rt) (Core.fieldTypeName ft) (Core.fieldTypeType ft))}) (Core.rowTypeFields rt))}))))
+-- | Generate an encoder term for a Type, with the element name for nominal types
+encodeTypeNamed :: Core.Name -> Core.Type -> Core.Term
+encodeTypeNamed ename typ =
+    case typ of
+      Core.TypeAnnotated v0 -> encodeTypeNamed ename (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = (encodeType (Core.applicationTypeFunction v0)),
+        Core.applicationArgument = (encodeType (Core.applicationTypeArgument v0))})
+      Core.TypeEither v0 -> encodeEitherType v0
+      Core.TypeForall v0 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (encodeBindingName (Core.forallTypeParameter v0)),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (encodeTypeNamed ename (Core.forallTypeBody v0))}))
+      Core.TypeFunction _ -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))
+      Core.TypeList v0 -> encodeListType v0
+      Core.TypeLiteral v0 -> encodeLiteralType v0
+      Core.TypeMap v0 -> encodeMapType v0
+      Core.TypeMaybe v0 -> encodeOptionalType v0
+      Core.TypePair v0 -> encodePairType v0
+      Core.TypeRecord v0 -> encodeRecordTypeNamed ename v0
+      Core.TypeSet v0 -> encodeSetType v0
+      Core.TypeUnion v0 -> encodeUnionTypeNamed ename v0
+      Core.TypeWrap v0 -> encodeWrappedTypeNamed ename v0
+      Core.TypeUnit -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "_"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+          Core.injectionField = Core.Field {
+            Core.fieldName = (Core.Name "unit"),
+            Core.fieldTerm = Core.TermUnit}}))}))
+      Core.TypeVoid -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "_"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+          Core.injectionField = Core.Field {
+            Core.fieldName = (Core.Name "unit"),
+            Core.fieldTerm = Core.TermUnit}}))}))
+      Core.TypeVariable v0 -> Core.TermVariable (encodeBindingName v0)
+      _ -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "x"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))
 
--- | Generate an encoder for a wrapped type
-encodeWrappedType :: (Core.WrappedType -> Core.Term)
-encodeWrappedType wt = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-  Core.lambdaParameter = (Core.Name "x"),
-  Core.lambdaDomain = Nothing,
-  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-    Core.injectionField = Core.Field {
-      Core.fieldName = (Core.Name "wrap"),
-      Core.fieldTerm = (Core.TermRecord (Core.Record {
-        Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-        Core.recordFields = [
-          Core.Field {
-            Core.fieldName = (Core.Name "typeName"),
-            Core.fieldTerm = (encodeName (Core.wrappedTypeTypeName wt))},
-          Core.Field {
-            Core.fieldName = (Core.Name "body"),
-            Core.fieldTerm = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (encodeType (Core.wrappedTypeBody wt)),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.wrappedTypeTypeName wt)))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))
+-- | Generate an encoder for a union type (placeholder name)
+encodeUnionType :: [Core.FieldType] -> Core.Term
+encodeUnionType rt = encodeUnionTypeNamed (Core.Name "unknown") rt
 
+-- | Generate an encoder for a union type with the given element name
+encodeUnionTypeNamed :: Core.Name -> [Core.FieldType] -> Core.Term
+encodeUnionTypeNamed ename rt =
+    Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+      Core.caseStatementTypeName = ename,
+      Core.caseStatementDefault = Nothing,
+      Core.caseStatementCases = (Lists.map (\ft -> Core.Field {
+        Core.fieldName = (Core.fieldTypeName ft),
+        Core.fieldTerm = (encodeFieldValue ename (Core.fieldTypeName ft) (Core.fieldTypeType ft))}) rt)})))
+
+-- | Generate an encoder for a wrapped type (placeholder name)
+encodeWrappedType :: Core.Type -> Core.Term
+encodeWrappedType wt = encodeWrappedTypeNamed (Core.Name "unknown") wt
+
+-- | Generate an encoder for a wrapped type with the given element name
+encodeWrappedTypeNamed :: Core.Name -> Core.Type -> Core.Term
+encodeWrappedTypeNamed ename wt =
+    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+      Core.lambdaParameter = (Core.Name "x"),
+      Core.lambdaDomain = Nothing,
+      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+        Core.injectionField = Core.Field {
+          Core.fieldName = (Core.Name "wrap"),
+          Core.fieldTerm = (Core.TermRecord (Core.Record {
+            Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+            Core.recordFields = [
+              Core.Field {
+                Core.fieldName = (Core.Name "typeName"),
+                Core.fieldTerm = (encodeName ename)},
+              Core.Field {
+                Core.fieldName = (Core.Name "body"),
+                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (encodeType wt),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap ename))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))
+
+-- | Collect forall type variable names from a type
+encoderCollectForallVariables :: Core.Type -> [Core.Name]
+encoderCollectForallVariables typ =
+    case typ of
+      Core.TypeAnnotated v0 -> encoderCollectForallVariables (Core.annotatedTypeBody v0)
+      Core.TypeForall v0 -> Lists.cons (Core.forallTypeParameter v0) (encoderCollectForallVariables (Core.forallTypeBody v0))
+      _ -> []
+
+-- | Collect type variables needing Ord constraints
+encoderCollectOrdVars :: Core.Type -> [Core.Name]
+encoderCollectOrdVars typ =
+    case typ of
+      Core.TypeAnnotated v0 -> encoderCollectOrdVars (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Lists.concat2 (encoderCollectOrdVars (Core.applicationTypeFunction v0)) (encoderCollectOrdVars (Core.applicationTypeArgument v0))
+      Core.TypeEither v0 -> Lists.concat2 (encoderCollectOrdVars (Core.eitherTypeLeft v0)) (encoderCollectOrdVars (Core.eitherTypeRight v0))
+      Core.TypeForall v0 -> encoderCollectOrdVars (Core.forallTypeBody v0)
+      Core.TypeList v0 -> encoderCollectOrdVars v0
+      Core.TypeMap v0 -> Lists.concat [
+        encoderCollectTypeVarsFromType (Core.mapTypeKeys v0),
+        (encoderCollectOrdVars (Core.mapTypeKeys v0)),
+        (encoderCollectOrdVars (Core.mapTypeValues v0))]
+      Core.TypeMaybe v0 -> encoderCollectOrdVars v0
+      Core.TypePair v0 -> Lists.concat2 (encoderCollectOrdVars (Core.pairTypeFirst v0)) (encoderCollectOrdVars (Core.pairTypeSecond v0))
+      Core.TypeRecord v0 -> Lists.concat (Lists.map (\ft -> encoderCollectOrdVars (Core.fieldTypeType ft)) v0)
+      Core.TypeSet v0 -> Lists.concat2 (encoderCollectTypeVarsFromType v0) (encoderCollectOrdVars v0)
+      Core.TypeUnion v0 -> Lists.concat (Lists.map (\ft -> encoderCollectOrdVars (Core.fieldTypeType ft)) v0)
+      Core.TypeWrap v0 -> encoderCollectOrdVars v0
+      _ -> []
+
+-- | Collect all type variable names from a type expression
+encoderCollectTypeVarsFromType :: Core.Type -> [Core.Name]
+encoderCollectTypeVarsFromType typ =
+    case typ of
+      Core.TypeAnnotated v0 -> encoderCollectTypeVarsFromType (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Lists.concat2 (encoderCollectTypeVarsFromType (Core.applicationTypeFunction v0)) (encoderCollectTypeVarsFromType (Core.applicationTypeArgument v0))
+      Core.TypeForall v0 -> encoderCollectTypeVarsFromType (Core.forallTypeBody v0)
+      Core.TypeList v0 -> encoderCollectTypeVarsFromType v0
+      Core.TypeMap v0 -> Lists.concat2 (encoderCollectTypeVarsFromType (Core.mapTypeKeys v0)) (encoderCollectTypeVarsFromType (Core.mapTypeValues v0))
+      Core.TypeMaybe v0 -> encoderCollectTypeVarsFromType v0
+      Core.TypePair v0 -> Lists.concat2 (encoderCollectTypeVarsFromType (Core.pairTypeFirst v0)) (encoderCollectTypeVarsFromType (Core.pairTypeSecond v0))
+      Core.TypeRecord v0 -> Lists.concat (Lists.map (\ft -> encoderCollectTypeVarsFromType (Core.fieldTypeType ft)) v0)
+      Core.TypeSet v0 -> encoderCollectTypeVarsFromType v0
+      Core.TypeUnion v0 -> Lists.concat (Lists.map (\ft -> encoderCollectTypeVarsFromType (Core.fieldTypeType ft)) v0)
+      Core.TypeVariable v0 -> [
+        v0]
+      Core.TypeWrap v0 -> encoderCollectTypeVarsFromType v0
+      _ -> []
+
+-- | Get full result type for encoder input
+encoderFullResultType :: Core.Type -> Core.Type
+encoderFullResultType typ =
+    case typ of
+      Core.TypeAnnotated v0 -> encoderFullResultType (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = (encoderFullResultType (Core.applicationTypeFunction v0)),
+        Core.applicationTypeArgument = (Core.applicationTypeArgument v0)})
+      Core.TypeEither v0 -> Core.TypeEither (Core.EitherType {
+        Core.eitherTypeLeft = (encoderFullResultType (Core.eitherTypeLeft v0)),
+        Core.eitherTypeRight = (encoderFullResultType (Core.eitherTypeRight v0))})
+      Core.TypeForall v0 -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = (encoderFullResultType (Core.forallTypeBody v0)),
+        Core.applicationTypeArgument = (Core.TypeVariable (Core.forallTypeParameter v0))})
+      Core.TypeList v0 -> Core.TypeList (encoderFullResultType v0)
+      Core.TypeLiteral _ -> Core.TypeVariable (Core.Name "hydra.core.Literal")
+      Core.TypeMap v0 -> Core.TypeMap (Core.MapType {
+        Core.mapTypeKeys = (encoderFullResultType (Core.mapTypeKeys v0)),
+        Core.mapTypeValues = (encoderFullResultType (Core.mapTypeValues v0))})
+      Core.TypeMaybe v0 -> Core.TypeMaybe (encoderFullResultType v0)
+      Core.TypePair v0 -> Core.TypePair (Core.PairType {
+        Core.pairTypeFirst = (encoderFullResultType (Core.pairTypeFirst v0)),
+        Core.pairTypeSecond = (encoderFullResultType (Core.pairTypeSecond v0))})
+      Core.TypeRecord _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+      Core.TypeSet v0 -> Core.TypeSet (encoderFullResultType v0)
+      Core.TypeUnion _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+      Core.TypeUnit -> Core.TypeUnit
+      Core.TypeVariable v0 -> Core.TypeVariable v0
+      Core.TypeVoid -> Core.TypeVoid
+      Core.TypeWrap _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+      _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+
+-- | Get full result type for encoder input, using element name for nominal types
+encoderFullResultTypeNamed :: Core.Name -> Core.Type -> Core.Type
+encoderFullResultTypeNamed ename typ =
+    case typ of
+      Core.TypeAnnotated v0 -> encoderFullResultTypeNamed ename (Core.annotatedTypeBody v0)
+      Core.TypeApplication v0 -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = (encoderFullResultType (Core.applicationTypeFunction v0)),
+        Core.applicationTypeArgument = (Core.applicationTypeArgument v0)})
+      Core.TypeEither v0 -> Core.TypeEither (Core.EitherType {
+        Core.eitherTypeLeft = (encoderFullResultType (Core.eitherTypeLeft v0)),
+        Core.eitherTypeRight = (encoderFullResultType (Core.eitherTypeRight v0))})
+      Core.TypeForall v0 -> Core.TypeApplication (Core.ApplicationType {
+        Core.applicationTypeFunction = (encoderFullResultTypeNamed ename (Core.forallTypeBody v0)),
+        Core.applicationTypeArgument = (Core.TypeVariable (Core.forallTypeParameter v0))})
+      Core.TypeList v0 -> Core.TypeList (encoderFullResultType v0)
+      Core.TypeLiteral _ -> Core.TypeVariable (Core.Name "hydra.core.Literal")
+      Core.TypeMap v0 -> Core.TypeMap (Core.MapType {
+        Core.mapTypeKeys = (encoderFullResultType (Core.mapTypeKeys v0)),
+        Core.mapTypeValues = (encoderFullResultType (Core.mapTypeValues v0))})
+      Core.TypeMaybe v0 -> Core.TypeMaybe (encoderFullResultType v0)
+      Core.TypePair v0 -> Core.TypePair (Core.PairType {
+        Core.pairTypeFirst = (encoderFullResultType (Core.pairTypeFirst v0)),
+        Core.pairTypeSecond = (encoderFullResultType (Core.pairTypeSecond v0))})
+      Core.TypeRecord _ -> Core.TypeVariable ename
+      Core.TypeSet v0 -> Core.TypeSet (encoderFullResultType v0)
+      Core.TypeUnion _ -> Core.TypeVariable ename
+      Core.TypeUnit -> Core.TypeUnit
+      Core.TypeVariable v0 -> Core.TypeVariable v0
+      Core.TypeVoid -> Core.TypeVoid
+      Core.TypeWrap _ -> Core.TypeVariable ename
+      _ -> Core.TypeVariable (Core.Name "hydra.core.Term")
+
+-- | Build encoder function type
+encoderType :: Core.Type -> Core.Type
+encoderType typ =
+
+      let resultType = encoderFullResultType typ
+          baseType =
+                  Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = resultType,
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})
+      in (prependForallEncoders baseType typ)
+
+-- | Build encoder function type with element name for nominal types
+encoderTypeNamed :: Core.Name -> Core.Type -> Core.Type
+encoderTypeNamed ename typ =
+
+      let resultType = encoderFullResultTypeNamed ename typ
+          baseType =
+                  Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = resultType,
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})
+      in (prependForallEncoders baseType typ)
+
+-- | Construct a TypeScheme for an encoder function from a source type
+encoderTypeScheme :: Core.Type -> Core.TypeScheme
+encoderTypeScheme typ =
+
+      let typeVars = encoderCollectForallVariables typ
+          encoderFunType = encoderType typ
+          allOrdVars = encoderCollectOrdVars typ
+          ordVars = Lists.filter (\v -> Lists.elem v typeVars) allOrdVars
+          constraints =
+                  Logic.ifElse (Lists.null ordVars) Nothing (Just (Maps.fromList (Lists.map (\v -> (v, Core.TypeVariableMetadata {
+                    Core.typeVariableMetadataClasses = (Sets.singleton (Core.Name "ordering"))})) ordVars)))
+      in Core.TypeScheme {
+        Core.typeSchemeVariables = typeVars,
+        Core.typeSchemeType = encoderFunType,
+        Core.typeSchemeConstraints = constraints}
+
+-- | Construct a TypeScheme for an encoder function, with element name for nominal types
+encoderTypeSchemeNamed :: Core.Name -> Core.Type -> Core.TypeScheme
+encoderTypeSchemeNamed ename typ =
+
+      let typeVars = encoderCollectForallVariables typ
+          encoderFunType = encoderTypeNamed ename typ
+          allOrdVars = encoderCollectOrdVars typ
+          ordVars = Lists.filter (\v -> Lists.elem v typeVars) allOrdVars
+          constraints =
+                  Logic.ifElse (Lists.null ordVars) Nothing (Just (Maps.fromList (Lists.map (\v -> (v, Core.TypeVariableMetadata {
+                    Core.typeVariableMetadataClasses = (Sets.singleton (Core.Name "ordering"))})) ordVars)))
+      in Core.TypeScheme {
+        Core.typeSchemeVariables = typeVars,
+        Core.typeSchemeType = encoderFunType,
+        Core.typeSchemeConstraints = constraints}
+
 -- | Filter bindings to only encodable type definitions
-filterTypeBindings :: ([Core.Binding] -> Compute.Flow Graph.Graph [Core.Binding])
-filterTypeBindings bindings = (Flows.map Maybes.cat (Flows.mapList isEncodableBinding (Lists.filter Annotations.isNativeType bindings)))
+filterTypeBindings :: Context.Context -> Graph.Graph -> [Core.Binding] -> Either (Context.InContext Errors.Error) [Core.Binding]
+filterTypeBindings cx graph bindings =
+    Eithers.map Maybes.cat (Eithers.mapList (isEncodableBinding cx graph) (Lists.filter Annotations.isNativeType bindings))
 
 -- | Check if a binding is encodable (serializable type)
-isEncodableBinding :: (Core.Binding -> Compute.Flow Graph.Graph (Maybe Core.Binding))
-isEncodableBinding b = (Flows.map (\serializable -> Logic.ifElse serializable (Just b) Nothing) (Schemas.isSerializableByName (Core.bindingName b)))
+isEncodableBinding :: Context.Context -> Graph.Graph -> Core.Binding -> Either (Context.InContext Errors.Error) (Maybe Core.Binding)
+isEncodableBinding cx graph b =
+    Eithers.bind (Schemas.isSerializableByName cx graph (Core.bindingName b)) (\serializable -> Right (Logic.ifElse serializable (Just b) Nothing))
 
 -- | Check whether a type is the unit type
-isUnitType :: (Core.Type -> Bool)
-isUnitType x = case x of
-  Core.TypeUnit -> True
-  _ -> False
+isUnitType :: Core.Type -> Bool
+isUnitType x =
+    case x of
+      Core.TypeUnit -> True
+      _ -> False
+
+-- | Prepend encoder types for forall parameters to base type
+prependForallEncoders :: Core.Type -> Core.Type -> Core.Type
+prependForallEncoders baseType typ =
+    case typ of
+      Core.TypeAnnotated v0 -> prependForallEncoders baseType (Core.annotatedTypeBody v0)
+      Core.TypeForall v0 -> Core.TypeFunction (Core.FunctionType {
+        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+          Core.functionTypeDomain = (Core.TypeVariable (Core.forallTypeParameter v0)),
+          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+        Core.functionTypeCodomain = (prependForallEncoders baseType (Core.forallTypeBody v0))})
+      _ -> baseType
diff --git a/src/gen-main/haskell/Hydra/Error/Checking.hs b/src/gen-main/haskell/Hydra/Error/Checking.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Error/Checking.hs
@@ -0,0 +1,195 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Error types for type checking
+
+module Hydra.Error.Checking where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Typing as Typing
+import qualified Hydra.Variants as Variants
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | An error that occurred during type checking
+data CheckingError =
+  -- | A post-unification consistency check failure
+  CheckingErrorIncorrectUnification IncorrectUnificationError |
+  -- | A type that is not a forall type when one was expected
+  CheckingErrorNotAForallType NotAForallTypeError |
+  -- | A type that is not a function type when one was expected
+  CheckingErrorNotAFunctionType NotAFunctionTypeError |
+  -- | A type constructor applied to the wrong number of arguments
+  CheckingErrorTypeArityMismatch TypeArityMismatchError |
+  -- | A type mismatch between expected and actual types
+  CheckingErrorTypeMismatch TypeMismatchError |
+  -- | Type variables that are not bound in scope
+  CheckingErrorUnboundTypeVariables UnboundTypeVariablesError |
+  -- | Multiple types that should be equal but are not
+  CheckingErrorUnequalTypes UnequalTypesError |
+  -- | A term variant that the type checker does not support
+  CheckingErrorUnsupportedTermVariant UnsupportedTermVariantError |
+  -- | A lambda expression without a type annotation on its parameter
+  CheckingErrorUntypedLambda UntypedLambdaError |
+  -- | A let binding without a type annotation
+  CheckingErrorUntypedLetBinding UntypedLetBindingError
+  deriving (Eq, Ord, Read, Show)
+
+_CheckingError = Core.Name "hydra.error.checking.CheckingError"
+
+_CheckingError_incorrectUnification = Core.Name "incorrectUnification"
+
+_CheckingError_notAForallType = Core.Name "notAForallType"
+
+_CheckingError_notAFunctionType = Core.Name "notAFunctionType"
+
+_CheckingError_typeArityMismatch = Core.Name "typeArityMismatch"
+
+_CheckingError_typeMismatch = Core.Name "typeMismatch"
+
+_CheckingError_unboundTypeVariables = Core.Name "unboundTypeVariables"
+
+_CheckingError_unequalTypes = Core.Name "unequalTypes"
+
+_CheckingError_unsupportedTermVariant = Core.Name "unsupportedTermVariant"
+
+_CheckingError_untypedLambda = Core.Name "untypedLambda"
+
+_CheckingError_untypedLetBinding = Core.Name "untypedLetBinding"
+
+-- | A post-unification consistency check failure
+data IncorrectUnificationError =
+  IncorrectUnificationError {
+    -- | The substitution that failed the consistency check
+    incorrectUnificationErrorSubstitution :: Typing.TypeSubst}
+  deriving (Eq, Ord, Read, Show)
+
+_IncorrectUnificationError = Core.Name "hydra.error.checking.IncorrectUnificationError"
+
+_IncorrectUnificationError_substitution = Core.Name "substitution"
+
+-- | A type that is not a forall type when type arguments are being applied
+data NotAForallTypeError =
+  NotAForallTypeError {
+    -- | The actual type encountered
+    notAForallTypeErrorType :: Core.Type,
+    -- | The type arguments that were being applied
+    notAForallTypeErrorTypeArguments :: [Core.Type]}
+  deriving (Eq, Ord, Read, Show)
+
+_NotAForallTypeError = Core.Name "hydra.error.checking.NotAForallTypeError"
+
+_NotAForallTypeError_type = Core.Name "type"
+
+_NotAForallTypeError_typeArguments = Core.Name "typeArguments"
+
+-- | A type that is not a function type when one was expected in an application
+data NotAFunctionTypeError =
+  NotAFunctionTypeError {
+    -- | The actual type encountered
+    notAFunctionTypeErrorType :: Core.Type}
+  deriving (Eq, Ord, Read, Show)
+
+_NotAFunctionTypeError = Core.Name "hydra.error.checking.NotAFunctionTypeError"
+
+_NotAFunctionTypeError_type = Core.Name "type"
+
+-- | A type constructor applied to the wrong number of type arguments
+data TypeArityMismatchError =
+  TypeArityMismatchError {
+    -- | The type being checked
+    typeArityMismatchErrorType :: Core.Type,
+    -- | The expected number of type arguments
+    typeArityMismatchErrorExpectedArity :: Int,
+    -- | The actual number of type arguments provided
+    typeArityMismatchErrorActualArity :: Int,
+    -- | The type arguments that were provided
+    typeArityMismatchErrorTypeArguments :: [Core.Type]}
+  deriving (Eq, Ord, Read, Show)
+
+_TypeArityMismatchError = Core.Name "hydra.error.checking.TypeArityMismatchError"
+
+_TypeArityMismatchError_type = Core.Name "type"
+
+_TypeArityMismatchError_expectedArity = Core.Name "expectedArity"
+
+_TypeArityMismatchError_actualArity = Core.Name "actualArity"
+
+_TypeArityMismatchError_typeArguments = Core.Name "typeArguments"
+
+-- | A type mismatch between expected and actual types
+data TypeMismatchError =
+  TypeMismatchError {
+    -- | The expected type
+    typeMismatchErrorExpectedType :: Core.Type,
+    -- | The actual type encountered
+    typeMismatchErrorActualType :: Core.Type}
+  deriving (Eq, Ord, Read, Show)
+
+_TypeMismatchError = Core.Name "hydra.error.checking.TypeMismatchError"
+
+_TypeMismatchError_expectedType = Core.Name "expectedType"
+
+_TypeMismatchError_actualType = Core.Name "actualType"
+
+-- | Type variables that appear free in a type but are not bound in scope
+data UnboundTypeVariablesError =
+  UnboundTypeVariablesError {
+    -- | The set of unbound type variable names
+    unboundTypeVariablesErrorVariables :: (S.Set Core.Name),
+    -- | The type containing the unbound variables
+    unboundTypeVariablesErrorType :: Core.Type}
+  deriving (Eq, Ord, Read, Show)
+
+_UnboundTypeVariablesError = Core.Name "hydra.error.checking.UnboundTypeVariablesError"
+
+_UnboundTypeVariablesError_variables = Core.Name "variables"
+
+_UnboundTypeVariablesError_type = Core.Name "type"
+
+-- | Multiple types that should all be equal but are not
+data UnequalTypesError =
+  UnequalTypesError {
+    -- | The list of types that are not all equal
+    unequalTypesErrorTypes :: [Core.Type],
+    -- | A description of the context in which the types were expected to be equal
+    unequalTypesErrorDescription :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_UnequalTypesError = Core.Name "hydra.error.checking.UnequalTypesError"
+
+_UnequalTypesError_types = Core.Name "types"
+
+_UnequalTypesError_description = Core.Name "description"
+
+-- | A term variant that the type checker does not support
+data UnsupportedTermVariantError =
+  UnsupportedTermVariantError {
+    -- | The unsupported term variant
+    unsupportedTermVariantErrorTermVariant :: Variants.TermVariant}
+  deriving (Eq, Ord, Read, Show)
+
+_UnsupportedTermVariantError = Core.Name "hydra.error.checking.UnsupportedTermVariantError"
+
+_UnsupportedTermVariantError_termVariant = Core.Name "termVariant"
+
+-- | A lambda expression without a type annotation on its parameter
+data UntypedLambdaError =
+  UntypedLambdaError {}
+  deriving (Eq, Ord, Read, Show)
+
+_UntypedLambdaError = Core.Name "hydra.error.checking.UntypedLambdaError"
+
+-- | A let binding without a type annotation
+data UntypedLetBindingError =
+  UntypedLetBindingError {
+    -- | The untyped binding
+    untypedLetBindingErrorBinding :: Core.Binding}
+  deriving (Eq, Ord, Read, Show)
+
+_UntypedLetBindingError = Core.Name "hydra.error.checking.UntypedLetBindingError"
+
+_UntypedLetBindingError_binding = Core.Name "binding"
diff --git a/src/gen-main/haskell/Hydra/Error/Core.hs b/src/gen-main/haskell/Hydra/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Error/Core.hs
@@ -0,0 +1,716 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Error types for core type and term validation
+
+module Hydra.Error.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Variants as Variants
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | A duplicate binding name in a let expression
+data DuplicateBindingError =
+  DuplicateBindingError {
+    -- | The path to the duplicate binding within the term
+    duplicateBindingErrorLocation :: Paths.SubtermPath,
+    -- | The duplicated binding name
+    duplicateBindingErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_DuplicateBindingError = Core.Name "hydra.error.core.DuplicateBindingError"
+
+_DuplicateBindingError_location = Core.Name "location"
+
+_DuplicateBindingError_name = Core.Name "name"
+
+-- | A duplicate field name in a record or union type
+data DuplicateFieldError =
+  DuplicateFieldError {
+    -- | The path to the duplicate field within the term
+    duplicateFieldErrorLocation :: Paths.SubtermPath,
+    -- | The duplicated field name
+    duplicateFieldErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_DuplicateFieldError = Core.Name "hydra.error.core.DuplicateFieldError"
+
+_DuplicateFieldError_location = Core.Name "location"
+
+_DuplicateFieldError_name = Core.Name "name"
+
+-- | A reference to a field that does not exist in the given type
+data UndefinedFieldError =
+  UndefinedFieldError {
+    -- | The name of the undefined field
+    undefinedFieldErrorFieldName :: Core.Name,
+    -- | The name of the type in which the field was expected
+    undefinedFieldErrorTypeName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_UndefinedFieldError = Core.Name "hydra.error.core.UndefinedFieldError"
+
+_UndefinedFieldError_fieldName = Core.Name "fieldName"
+
+_UndefinedFieldError_typeName = Core.Name "typeName"
+
+-- | An unexpected term variant was encountered
+data UnexpectedTermVariantError =
+  UnexpectedTermVariantError {
+    -- | The expected term variant
+    unexpectedTermVariantErrorExpectedVariant :: Variants.TermVariant,
+    -- | The actual term that was encountered
+    unexpectedTermVariantErrorActualTerm :: Core.Term}
+  deriving (Eq, Ord, Read, Show)
+
+_UnexpectedTermVariantError = Core.Name "hydra.error.core.UnexpectedTermVariantError"
+
+_UnexpectedTermVariantError_expectedVariant = Core.Name "expectedVariant"
+
+_UnexpectedTermVariantError_actualTerm = Core.Name "actualTerm"
+
+-- | An unexpected type variant was encountered
+data UnexpectedTypeVariantError =
+  UnexpectedTypeVariantError {
+    -- | The expected type variant
+    unexpectedTypeVariantErrorExpectedVariant :: Variants.TypeVariant,
+    -- | The actual type that was encountered
+    unexpectedTypeVariantErrorActualType :: Core.Type}
+  deriving (Eq, Ord, Read, Show)
+
+_UnexpectedTypeVariantError = Core.Name "hydra.error.core.UnexpectedTypeVariantError"
+
+_UnexpectedTypeVariantError_expectedVariant = Core.Name "expectedVariant"
+
+_UnexpectedTypeVariantError_actualType = Core.Name "actualType"
+
+-- | An application of ifElse where the condition is a literal boolean, creating a dead branch (optional)
+data ConstantConditionError =
+  ConstantConditionError {
+    -- | The path to the constant condition within the term
+    constantConditionErrorLocation :: Paths.SubtermPath,
+    -- | The constant boolean value of the condition
+    constantConditionErrorValue :: Bool}
+  deriving (Eq, Ord, Read, Show)
+
+_ConstantConditionError = Core.Name "hydra.error.core.ConstantConditionError"
+
+_ConstantConditionError_location = Core.Name "location"
+
+_ConstantConditionError_value = Core.Name "value"
+
+-- | A case statement with no cases and no default (optional)
+data EmptyCaseStatementError =
+  EmptyCaseStatementError {
+    -- | The path to the empty case statement within the term
+    emptyCaseStatementErrorLocation :: Paths.SubtermPath,
+    -- | The name of the union type being matched
+    emptyCaseStatementErrorTypeName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_EmptyCaseStatementError = Core.Name "hydra.error.core.EmptyCaseStatementError"
+
+_EmptyCaseStatementError_location = Core.Name "location"
+
+_EmptyCaseStatementError_typeName = Core.Name "typeName"
+
+-- | A let expression with an empty list of bindings (optional)
+data EmptyLetBindingsError =
+  EmptyLetBindingsError {
+    -- | The path to the empty let expression within the term
+    emptyLetBindingsErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_EmptyLetBindingsError = Core.Name "hydra.error.core.EmptyLetBindingsError"
+
+_EmptyLetBindingsError_location = Core.Name "location"
+
+-- | A term annotation with an empty annotation map (optional)
+data EmptyTermAnnotationError =
+  EmptyTermAnnotationError {
+    -- | The path to the empty annotation within the term
+    emptyTermAnnotationErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_EmptyTermAnnotationError = Core.Name "hydra.error.core.EmptyTermAnnotationError"
+
+_EmptyTermAnnotationError_location = Core.Name "location"
+
+-- | A record, injection, projection, or case statement with an empty type name (optional)
+data EmptyTypeNameInTermError =
+  EmptyTypeNameInTermError {
+    -- | The path to the term with the empty type name
+    emptyTypeNameInTermErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_EmptyTypeNameInTermError = Core.Name "hydra.error.core.EmptyTypeNameInTermError"
+
+_EmptyTypeNameInTermError_location = Core.Name "location"
+
+-- | A lambda parameter name that violates naming conventions (optional)
+data InvalidLambdaParameterNameError =
+  InvalidLambdaParameterNameError {
+    -- | The path to the lambda within the term
+    invalidLambdaParameterNameErrorLocation :: Paths.SubtermPath,
+    -- | The invalid parameter name
+    invalidLambdaParameterNameErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidLambdaParameterNameError = Core.Name "hydra.error.core.InvalidLambdaParameterNameError"
+
+_InvalidLambdaParameterNameError_location = Core.Name "location"
+
+_InvalidLambdaParameterNameError_name = Core.Name "name"
+
+-- | A let binding name that violates naming conventions (optional)
+data InvalidLetBindingNameError =
+  InvalidLetBindingNameError {
+    -- | The path to the binding within the term
+    invalidLetBindingNameErrorLocation :: Paths.SubtermPath,
+    -- | The invalid binding name
+    invalidLetBindingNameErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidLetBindingNameError = Core.Name "hydra.error.core.InvalidLetBindingNameError"
+
+_InvalidLetBindingNameError_location = Core.Name "location"
+
+_InvalidLetBindingNameError_name = Core.Name "name"
+
+-- | A type lambda parameter name that violates naming conventions (optional)
+data InvalidTypeLambdaParameterNameError =
+  InvalidTypeLambdaParameterNameError {
+    -- | The path to the type lambda within the term
+    invalidTypeLambdaParameterNameErrorLocation :: Paths.SubtermPath,
+    -- | The invalid type lambda parameter name
+    invalidTypeLambdaParameterNameErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidTypeLambdaParameterNameError = Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"
+
+_InvalidTypeLambdaParameterNameError_location = Core.Name "location"
+
+_InvalidTypeLambdaParameterNameError_name = Core.Name "name"
+
+-- | A term annotation directly wrapping another term annotation; annotations should be merged (optional)
+data NestedTermAnnotationError =
+  NestedTermAnnotationError {
+    -- | The path to the outer annotation within the term
+    nestedTermAnnotationErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_NestedTermAnnotationError = Core.Name "hydra.error.core.NestedTermAnnotationError"
+
+_NestedTermAnnotationError_location = Core.Name "location"
+
+-- | An unwrap elimination applied to a wrap term of the same type, forming a no-op round-trip (optional)
+data RedundantWrapUnwrapError =
+  RedundantWrapUnwrapError {
+    -- | The path to the redundant wrap/unwrap within the term
+    redundantWrapUnwrapErrorLocation :: Paths.SubtermPath,
+    -- | The type name of the wrapper
+    redundantWrapUnwrapErrorTypeName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_RedundantWrapUnwrapError = Core.Name "hydra.error.core.RedundantWrapUnwrapError"
+
+_RedundantWrapUnwrapError_location = Core.Name "location"
+
+_RedundantWrapUnwrapError_typeName = Core.Name "typeName"
+
+-- | A variable applied to itself, which is almost always a mistake in Hydra's type system (optional)
+data SelfApplicationError =
+  SelfApplicationError {
+    -- | The path to the self-application within the term
+    selfApplicationErrorLocation :: Paths.SubtermPath,
+    -- | The name of the variable applied to itself
+    selfApplicationErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_SelfApplicationError = Core.Name "hydra.error.core.SelfApplicationError"
+
+_SelfApplicationError_location = Core.Name "location"
+
+_SelfApplicationError_name = Core.Name "name"
+
+-- | A lambda parameter or let binding name that shadows a variable already in scope (optional)
+data TermVariableShadowingError =
+  TermVariableShadowingError {
+    -- | The path to the shadowing binding within the term
+    termVariableShadowingErrorLocation :: Paths.SubtermPath,
+    -- | The name of the shadowed variable
+    termVariableShadowingErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_TermVariableShadowingError = Core.Name "hydra.error.core.TermVariableShadowingError"
+
+_TermVariableShadowingError_location = Core.Name "location"
+
+_TermVariableShadowingError_name = Core.Name "name"
+
+-- | A type lambda parameter that shadows a type variable already in scope (optional)
+data TypeVariableShadowingInTypeLambdaError =
+  TypeVariableShadowingInTypeLambdaError {
+    -- | The path to the type lambda within the term
+    typeVariableShadowingInTypeLambdaErrorLocation :: Paths.SubtermPath,
+    -- | The name of the shadowed type variable
+    typeVariableShadowingInTypeLambdaErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_TypeVariableShadowingInTypeLambdaError = Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"
+
+_TypeVariableShadowingInTypeLambdaError_location = Core.Name "location"
+
+_TypeVariableShadowingInTypeLambdaError_name = Core.Name "name"
+
+-- | A variable reference to a term name that is not bound in scope
+data UndefinedTermVariableError =
+  UndefinedTermVariableError {
+    -- | The path to the undefined variable within the term
+    undefinedTermVariableErrorLocation :: Paths.SubtermPath,
+    -- | The name of the undefined variable
+    undefinedTermVariableErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_UndefinedTermVariableError = Core.Name "hydra.error.core.UndefinedTermVariableError"
+
+_UndefinedTermVariableError_location = Core.Name "location"
+
+_UndefinedTermVariableError_name = Core.Name "name"
+
+-- | A type variable in a let binding's type scheme that is not bound by the scheme or enclosing scope
+data UndefinedTypeVariableInBindingTypeError =
+  UndefinedTypeVariableInBindingTypeError {
+    -- | The path to the binding within the term
+    undefinedTypeVariableInBindingTypeErrorLocation :: Paths.SubtermPath,
+    -- | The name of the undefined type variable
+    undefinedTypeVariableInBindingTypeErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_UndefinedTypeVariableInBindingTypeError = Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"
+
+_UndefinedTypeVariableInBindingTypeError_location = Core.Name "location"
+
+_UndefinedTypeVariableInBindingTypeError_name = Core.Name "name"
+
+-- | A type variable in a lambda domain annotation that is not bound in scope
+data UndefinedTypeVariableInLambdaDomainError =
+  UndefinedTypeVariableInLambdaDomainError {
+    -- | The path to the lambda within the term
+    undefinedTypeVariableInLambdaDomainErrorLocation :: Paths.SubtermPath,
+    -- | The name of the undefined type variable
+    undefinedTypeVariableInLambdaDomainErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_UndefinedTypeVariableInLambdaDomainError = Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"
+
+_UndefinedTypeVariableInLambdaDomainError_location = Core.Name "location"
+
+_UndefinedTypeVariableInLambdaDomainError_name = Core.Name "name"
+
+-- | A type variable in a type application term that is not bound in scope
+data UndefinedTypeVariableInTypeApplicationError =
+  UndefinedTypeVariableInTypeApplicationError {
+    -- | The path to the type application within the term
+    undefinedTypeVariableInTypeApplicationErrorLocation :: Paths.SubtermPath,
+    -- | The name of the undefined type variable
+    undefinedTypeVariableInTypeApplicationErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_UndefinedTypeVariableInTypeApplicationError = Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"
+
+_UndefinedTypeVariableInTypeApplicationError_location = Core.Name "location"
+
+_UndefinedTypeVariableInTypeApplicationError_name = Core.Name "name"
+
+-- | A primitive function reference to a name not in the known primitive registry
+data UnknownPrimitiveNameError =
+  UnknownPrimitiveNameError {
+    -- | The path to the primitive reference within the term
+    unknownPrimitiveNameErrorLocation :: Paths.SubtermPath,
+    -- | The unknown primitive name
+    unknownPrimitiveNameErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_UnknownPrimitiveNameError = Core.Name "hydra.error.core.UnknownPrimitiveNameError"
+
+_UnknownPrimitiveNameError_location = Core.Name "location"
+
+_UnknownPrimitiveNameError_name = Core.Name "name"
+
+-- | An application of an identity lambda to an argument, which simplifies to the argument (optional)
+data UnnecessaryIdentityApplicationError =
+  UnnecessaryIdentityApplicationError {
+    -- | The path to the identity application within the term
+    unnecessaryIdentityApplicationErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_UnnecessaryIdentityApplicationError = Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError"
+
+_UnnecessaryIdentityApplicationError_location = Core.Name "location"
+
+-- | A term variable whose type is not known in the current scope
+data UntypedTermVariableError =
+  UntypedTermVariableError {
+    -- | The path to the untyped variable within the term
+    untypedTermVariableErrorLocation :: Paths.SubtermPath,
+    -- | The name of the untyped variable
+    untypedTermVariableErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_UntypedTermVariableError = Core.Name "hydra.error.core.UntypedTermVariableError"
+
+_UntypedTermVariableError_location = Core.Name "location"
+
+_UntypedTermVariableError_name = Core.Name "name"
+
+-- | An error indicating that a term is invalid
+data InvalidTermError =
+  -- | An ifElse with a literal boolean condition (optional)
+  InvalidTermErrorConstantCondition ConstantConditionError |
+  -- | A duplicate binding name in a let expression
+  InvalidTermErrorDuplicateBinding DuplicateBindingError |
+  -- | A duplicate field name in a record or case statement
+  InvalidTermErrorDuplicateField DuplicateFieldError |
+  -- | A case statement with no cases and no default (optional)
+  InvalidTermErrorEmptyCaseStatement EmptyCaseStatementError |
+  -- | A let expression with no bindings (optional)
+  InvalidTermErrorEmptyLetBindings EmptyLetBindingsError |
+  -- | A term annotation with an empty annotation map (optional)
+  InvalidTermErrorEmptyTermAnnotation EmptyTermAnnotationError |
+  -- | A term with an empty type name (optional)
+  InvalidTermErrorEmptyTypeNameInTerm EmptyTypeNameInTermError |
+  -- | A lambda parameter name violating naming conventions (optional)
+  InvalidTermErrorInvalidLambdaParameterName InvalidLambdaParameterNameError |
+  -- | A let binding name violating naming conventions (optional)
+  InvalidTermErrorInvalidLetBindingName InvalidLetBindingNameError |
+  -- | A type lambda parameter name violating naming conventions (optional)
+  InvalidTermErrorInvalidTypeLambdaParameterName InvalidTypeLambdaParameterNameError |
+  -- | Nested term annotations that should be merged (optional)
+  InvalidTermErrorNestedTermAnnotation NestedTermAnnotationError |
+  -- | A no-op unwrap-of-wrap round-trip (optional)
+  InvalidTermErrorRedundantWrapUnwrap RedundantWrapUnwrapError |
+  -- | A variable applied to itself (optional)
+  InvalidTermErrorSelfApplication SelfApplicationError |
+  -- | A binding that shadows a variable already in scope (optional)
+  InvalidTermErrorTermVariableShadowing TermVariableShadowingError |
+  -- | A type lambda parameter that shadows a type variable in scope (optional)
+  InvalidTermErrorTypeVariableShadowingInTypeLambda TypeVariableShadowingInTypeLambdaError |
+  -- | A variable reference to an unbound term name
+  InvalidTermErrorUndefinedTermVariable UndefinedTermVariableError |
+  -- | An unbound type variable in a let binding's type scheme
+  InvalidTermErrorUndefinedTypeVariableInBindingType UndefinedTypeVariableInBindingTypeError |
+  -- | An unbound type variable in a lambda domain annotation
+  InvalidTermErrorUndefinedTypeVariableInLambdaDomain UndefinedTypeVariableInLambdaDomainError |
+  -- | An unbound type variable in a type application term
+  InvalidTermErrorUndefinedTypeVariableInTypeApplication UndefinedTypeVariableInTypeApplicationError |
+  -- | A reference to an unknown primitive function
+  InvalidTermErrorUnknownPrimitiveName UnknownPrimitiveNameError |
+  -- | An identity lambda applied to an argument (optional)
+  InvalidTermErrorUnnecessaryIdentityApplication UnnecessaryIdentityApplicationError |
+  -- | A term variable whose type is not known
+  InvalidTermErrorUntypedTermVariable UntypedTermVariableError
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidTermError = Core.Name "hydra.error.core.InvalidTermError"
+
+_InvalidTermError_constantCondition = Core.Name "constantCondition"
+
+_InvalidTermError_duplicateBinding = Core.Name "duplicateBinding"
+
+_InvalidTermError_duplicateField = Core.Name "duplicateField"
+
+_InvalidTermError_emptyCaseStatement = Core.Name "emptyCaseStatement"
+
+_InvalidTermError_emptyLetBindings = Core.Name "emptyLetBindings"
+
+_InvalidTermError_emptyTermAnnotation = Core.Name "emptyTermAnnotation"
+
+_InvalidTermError_emptyTypeNameInTerm = Core.Name "emptyTypeNameInTerm"
+
+_InvalidTermError_invalidLambdaParameterName = Core.Name "invalidLambdaParameterName"
+
+_InvalidTermError_invalidLetBindingName = Core.Name "invalidLetBindingName"
+
+_InvalidTermError_invalidTypeLambdaParameterName = Core.Name "invalidTypeLambdaParameterName"
+
+_InvalidTermError_nestedTermAnnotation = Core.Name "nestedTermAnnotation"
+
+_InvalidTermError_redundantWrapUnwrap = Core.Name "redundantWrapUnwrap"
+
+_InvalidTermError_selfApplication = Core.Name "selfApplication"
+
+_InvalidTermError_termVariableShadowing = Core.Name "termVariableShadowing"
+
+_InvalidTermError_typeVariableShadowingInTypeLambda = Core.Name "typeVariableShadowingInTypeLambda"
+
+_InvalidTermError_undefinedTermVariable = Core.Name "undefinedTermVariable"
+
+_InvalidTermError_undefinedTypeVariableInBindingType = Core.Name "undefinedTypeVariableInBindingType"
+
+_InvalidTermError_undefinedTypeVariableInLambdaDomain = Core.Name "undefinedTypeVariableInLambdaDomain"
+
+_InvalidTermError_undefinedTypeVariableInTypeApplication = Core.Name "undefinedTypeVariableInTypeApplication"
+
+_InvalidTermError_unknownPrimitiveName = Core.Name "unknownPrimitiveName"
+
+_InvalidTermError_unnecessaryIdentityApplication = Core.Name "unnecessaryIdentityApplication"
+
+_InvalidTermError_untypedTermVariable = Core.Name "untypedTermVariable"
+
+-- | A record type with duplicate field names
+data DuplicateRecordTypeFieldNamesError =
+  DuplicateRecordTypeFieldNamesError {
+    -- | The path to the record type with duplicate fields
+    duplicateRecordTypeFieldNamesErrorLocation :: Paths.SubtermPath,
+    -- | The duplicated field name
+    duplicateRecordTypeFieldNamesErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_DuplicateRecordTypeFieldNamesError = Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"
+
+_DuplicateRecordTypeFieldNamesError_location = Core.Name "location"
+
+_DuplicateRecordTypeFieldNamesError_name = Core.Name "name"
+
+-- | A union type with duplicate field names
+data DuplicateUnionTypeFieldNamesError =
+  DuplicateUnionTypeFieldNamesError {
+    -- | The path to the union type with duplicate fields
+    duplicateUnionTypeFieldNamesErrorLocation :: Paths.SubtermPath,
+    -- | The duplicated field name
+    duplicateUnionTypeFieldNamesErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_DuplicateUnionTypeFieldNamesError = Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"
+
+_DuplicateUnionTypeFieldNamesError_location = Core.Name "location"
+
+_DuplicateUnionTypeFieldNamesError_name = Core.Name "name"
+
+-- | A record type with no fields; TypeUnit is preferred for the unit-like case (optional)
+data EmptyRecordTypeError =
+  EmptyRecordTypeError {
+    -- | The path to the empty record type
+    emptyRecordTypeErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_EmptyRecordTypeError = Core.Name "hydra.error.core.EmptyRecordTypeError"
+
+_EmptyRecordTypeError_location = Core.Name "location"
+
+-- | A type annotation with an empty annotation map (optional)
+data EmptyTypeAnnotationError =
+  EmptyTypeAnnotationError {
+    -- | The path to the empty annotation
+    emptyTypeAnnotationErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_EmptyTypeAnnotationError = Core.Name "hydra.error.core.EmptyTypeAnnotationError"
+
+_EmptyTypeAnnotationError_location = Core.Name "location"
+
+-- | A union type with no alternatives; TypeVoid is preferred (optional)
+data EmptyUnionTypeError =
+  EmptyUnionTypeError {
+    -- | The path to the empty union type
+    emptyUnionTypeErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_EmptyUnionTypeError = Core.Name "hydra.error.core.EmptyUnionTypeError"
+
+_EmptyUnionTypeError_location = Core.Name "location"
+
+-- | A forall type parameter name that violates type variable naming conventions (optional)
+data InvalidForallParameterNameError =
+  InvalidForallParameterNameError {
+    -- | The path to the forall type
+    invalidForallParameterNameErrorLocation :: Paths.SubtermPath,
+    -- | The invalid parameter name
+    invalidForallParameterNameErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidForallParameterNameError = Core.Name "hydra.error.core.InvalidForallParameterNameError"
+
+_InvalidForallParameterNameError_location = Core.Name "location"
+
+_InvalidForallParameterNameError_name = Core.Name "name"
+
+-- | A type scheme variable name that violates type variable naming conventions (optional)
+data InvalidTypeSchemeVariableNameError =
+  InvalidTypeSchemeVariableNameError {
+    -- | The path to the type scheme
+    invalidTypeSchemeVariableNameErrorLocation :: Paths.SubtermPath,
+    -- | The invalid variable name
+    invalidTypeSchemeVariableNameErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidTypeSchemeVariableNameError = Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"
+
+_InvalidTypeSchemeVariableNameError_location = Core.Name "location"
+
+_InvalidTypeSchemeVariableNameError_name = Core.Name "name"
+
+-- | A type annotation directly wrapping another type annotation; annotations should be merged (optional)
+data NestedTypeAnnotationError =
+  NestedTypeAnnotationError {
+    -- | The path to the outer annotation
+    nestedTypeAnnotationErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_NestedTypeAnnotationError = Core.Name "hydra.error.core.NestedTypeAnnotationError"
+
+_NestedTypeAnnotationError_location = Core.Name "location"
+
+-- | A map type whose key type is or directly contains a function type, which cannot be compared for equality
+data NonComparableMapKeyTypeError =
+  NonComparableMapKeyTypeError {
+    -- | The path to the map type
+    nonComparableMapKeyTypeErrorLocation :: Paths.SubtermPath,
+    -- | The non-comparable key type
+    nonComparableMapKeyTypeErrorKeyType :: Core.Type}
+  deriving (Eq, Ord, Read, Show)
+
+_NonComparableMapKeyTypeError = Core.Name "hydra.error.core.NonComparableMapKeyTypeError"
+
+_NonComparableMapKeyTypeError_location = Core.Name "location"
+
+_NonComparableMapKeyTypeError_keyType = Core.Name "keyType"
+
+-- | A set type whose element type is or directly contains a function type, which cannot be compared for equality
+data NonComparableSetElementTypeError =
+  NonComparableSetElementTypeError {
+    -- | The path to the set type
+    nonComparableSetElementTypeErrorLocation :: Paths.SubtermPath,
+    -- | The non-comparable element type
+    nonComparableSetElementTypeErrorElementType :: Core.Type}
+  deriving (Eq, Ord, Read, Show)
+
+_NonComparableSetElementTypeError = Core.Name "hydra.error.core.NonComparableSetElementTypeError"
+
+_NonComparableSetElementTypeError_location = Core.Name "location"
+
+_NonComparableSetElementTypeError_elementType = Core.Name "elementType"
+
+-- | A union type with exactly one field; could be a wrapped type or record instead (optional)
+data SingleVariantUnionError =
+  SingleVariantUnionError {
+    -- | The path to the single-variant union type
+    singleVariantUnionErrorLocation :: Paths.SubtermPath,
+    -- | The name of the single field
+    singleVariantUnionErrorFieldName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_SingleVariantUnionError = Core.Name "hydra.error.core.SingleVariantUnionError"
+
+_SingleVariantUnionError_location = Core.Name "location"
+
+_SingleVariantUnionError_fieldName = Core.Name "fieldName"
+
+-- | A forall type parameter that shadows a type variable already in scope (optional)
+data TypeVariableShadowingInForallError =
+  TypeVariableShadowingInForallError {
+    -- | The path to the shadowing forall type
+    typeVariableShadowingInForallErrorLocation :: Paths.SubtermPath,
+    -- | The name of the shadowed type variable
+    typeVariableShadowingInForallErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_TypeVariableShadowingInForallError = Core.Name "hydra.error.core.TypeVariableShadowingInForallError"
+
+_TypeVariableShadowingInForallError_location = Core.Name "location"
+
+_TypeVariableShadowingInForallError_name = Core.Name "name"
+
+-- | A type variable reference to a name that is not bound in scope
+data UndefinedTypeVariableError =
+  UndefinedTypeVariableError {
+    -- | The path to the undefined type variable
+    undefinedTypeVariableErrorLocation :: Paths.SubtermPath,
+    -- | The name of the undefined type variable
+    undefinedTypeVariableErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_UndefinedTypeVariableError = Core.Name "hydra.error.core.UndefinedTypeVariableError"
+
+_UndefinedTypeVariableError_location = Core.Name "location"
+
+_UndefinedTypeVariableError_name = Core.Name "name"
+
+-- | TypeVoid appearing in a position where no value can be constructed, such as a record field, list element, map key/value, set element, pair component, or function codomain (optional)
+data VoidInNonBottomPositionError =
+  VoidInNonBottomPositionError {
+    -- | The path to the void type in a non-bottom position
+    voidInNonBottomPositionErrorLocation :: Paths.SubtermPath}
+  deriving (Eq, Ord, Read, Show)
+
+_VoidInNonBottomPositionError = Core.Name "hydra.error.core.VoidInNonBottomPositionError"
+
+_VoidInNonBottomPositionError_location = Core.Name "location"
+
+-- | An error indicating that a type is invalid
+data InvalidTypeError =
+  -- | A record type with duplicate field names
+  InvalidTypeErrorDuplicateRecordTypeFieldNames DuplicateRecordTypeFieldNamesError |
+  -- | A union type with duplicate field names
+  InvalidTypeErrorDuplicateUnionTypeFieldNames DuplicateUnionTypeFieldNamesError |
+  -- | A record type with no fields (optional)
+  InvalidTypeErrorEmptyRecordType EmptyRecordTypeError |
+  -- | A type annotation with an empty annotation map (optional)
+  InvalidTypeErrorEmptyTypeAnnotation EmptyTypeAnnotationError |
+  -- | A union type with no alternatives (optional)
+  InvalidTypeErrorEmptyUnionType EmptyUnionTypeError |
+  -- | A forall parameter name violating naming conventions (optional)
+  InvalidTypeErrorInvalidForallParameterName InvalidForallParameterNameError |
+  -- | A type scheme variable name violating naming conventions (optional)
+  InvalidTypeErrorInvalidTypeSchemeVariableName InvalidTypeSchemeVariableNameError |
+  -- | Nested type annotations that should be merged (optional)
+  InvalidTypeErrorNestedTypeAnnotation NestedTypeAnnotationError |
+  -- | A map with a non-comparable key type
+  InvalidTypeErrorNonComparableMapKeyType NonComparableMapKeyTypeError |
+  -- | A set with a non-comparable element type
+  InvalidTypeErrorNonComparableSetElementType NonComparableSetElementTypeError |
+  -- | A union type with only one variant (optional)
+  InvalidTypeErrorSingleVariantUnion SingleVariantUnionError |
+  -- | A forall parameter that shadows a type variable in scope (optional)
+  InvalidTypeErrorTypeVariableShadowingInForall TypeVariableShadowingInForallError |
+  -- | A type variable reference to an unbound name
+  InvalidTypeErrorUndefinedTypeVariable UndefinedTypeVariableError |
+  -- | TypeVoid in a position where no value can be constructed (optional)
+  InvalidTypeErrorVoidInNonBottomPosition VoidInNonBottomPositionError
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidTypeError = Core.Name "hydra.error.core.InvalidTypeError"
+
+_InvalidTypeError_duplicateRecordTypeFieldNames = Core.Name "duplicateRecordTypeFieldNames"
+
+_InvalidTypeError_duplicateUnionTypeFieldNames = Core.Name "duplicateUnionTypeFieldNames"
+
+_InvalidTypeError_emptyRecordType = Core.Name "emptyRecordType"
+
+_InvalidTypeError_emptyTypeAnnotation = Core.Name "emptyTypeAnnotation"
+
+_InvalidTypeError_emptyUnionType = Core.Name "emptyUnionType"
+
+_InvalidTypeError_invalidForallParameterName = Core.Name "invalidForallParameterName"
+
+_InvalidTypeError_invalidTypeSchemeVariableName = Core.Name "invalidTypeSchemeVariableName"
+
+_InvalidTypeError_nestedTypeAnnotation = Core.Name "nestedTypeAnnotation"
+
+_InvalidTypeError_nonComparableMapKeyType = Core.Name "nonComparableMapKeyType"
+
+_InvalidTypeError_nonComparableSetElementType = Core.Name "nonComparableSetElementType"
+
+_InvalidTypeError_singleVariantUnion = Core.Name "singleVariantUnion"
+
+_InvalidTypeError_typeVariableShadowingInForall = Core.Name "typeVariableShadowingInForall"
+
+_InvalidTypeError_undefinedTypeVariable = Core.Name "undefinedTypeVariable"
+
+_InvalidTypeError_voidInNonBottomPosition = Core.Name "voidInNonBottomPosition"
diff --git a/src/gen-main/haskell/Hydra/Error/Packaging.hs b/src/gen-main/haskell/Hydra/Error/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Error/Packaging.hs
@@ -0,0 +1,129 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Error types for module and package validation
+
+module Hydra.Error.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | A module namespace which, when mapped to a target language's directory or package structure, conflicts with another module's mapped namespace. For example, hydra.foo.bar and hydra.fooBar might both map to the same directory in a case-insensitive filesystem.
+data ConflictingModuleNamespaceError =
+  ConflictingModuleNamespaceError {
+    -- | The first module namespace
+    conflictingModuleNamespaceErrorFirst :: Module.Namespace,
+    -- | The second module namespace that conflicts with the first
+    conflictingModuleNamespaceErrorSecond :: Module.Namespace}
+  deriving (Eq, Ord, Read, Show)
+
+_ConflictingModuleNamespaceError = Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"
+
+_ConflictingModuleNamespaceError_first = Core.Name "first"
+
+_ConflictingModuleNamespaceError_second = Core.Name "second"
+
+-- | A union type variant name which, when capitalized and concatenated with its type name, conflicts with another type definition name. For example, a union type Foo with a variant bar produces FooBar, which conflicts with an existing type definition FooBar. This is currently a problem only for the Haskell target.
+data ConflictingVariantNameError =
+  ConflictingVariantNameError {
+    -- | The namespace of the module containing the conflict
+    conflictingVariantNameErrorNamespace :: Module.Namespace,
+    -- | The name of the union type
+    conflictingVariantNameErrorTypeName :: Core.Name,
+    -- | The name of the variant field causing the conflict
+    conflictingVariantNameErrorVariantName :: Core.Name,
+    -- | The name of the other type definition that conflicts with the generated constructor name
+    conflictingVariantNameErrorConflictingName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_ConflictingVariantNameError = Core.Name "hydra.error.packaging.ConflictingVariantNameError"
+
+_ConflictingVariantNameError_namespace = Core.Name "namespace"
+
+_ConflictingVariantNameError_typeName = Core.Name "typeName"
+
+_ConflictingVariantNameError_variantName = Core.Name "variantName"
+
+_ConflictingVariantNameError_conflictingName = Core.Name "conflictingName"
+
+-- | A definition whose name does not have the module's namespace as a prefix. If the module namespace is foo.bar, all definition names must have the form foo.bar.quux.
+data DefinitionNotInModuleNamespaceError =
+  DefinitionNotInModuleNamespaceError {
+    -- | The namespace of the module
+    definitionNotInModuleNamespaceErrorNamespace :: Module.Namespace,
+    -- | The definition name that does not match the module namespace
+    definitionNotInModuleNamespaceErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_DefinitionNotInModuleNamespaceError = Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"
+
+_DefinitionNotInModuleNamespaceError_namespace = Core.Name "namespace"
+
+_DefinitionNotInModuleNamespaceError_name = Core.Name "name"
+
+-- | Two or more definitions in the same module share the same name
+data DuplicateDefinitionNameError =
+  DuplicateDefinitionNameError {
+    -- | The namespace of the module containing the duplicates
+    duplicateDefinitionNameErrorNamespace :: Module.Namespace,
+    -- | The duplicated definition name
+    duplicateDefinitionNameErrorName :: Core.Name}
+  deriving (Eq, Ord, Read, Show)
+
+_DuplicateDefinitionNameError = Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"
+
+_DuplicateDefinitionNameError_namespace = Core.Name "namespace"
+
+_DuplicateDefinitionNameError_name = Core.Name "name"
+
+-- | Two or more modules in the same package share the same namespace
+data DuplicateModuleNamespaceError =
+  DuplicateModuleNamespaceError {
+    -- | The duplicated module namespace
+    duplicateModuleNamespaceErrorNamespace :: Module.Namespace}
+  deriving (Eq, Ord, Read, Show)
+
+_DuplicateModuleNamespaceError = Core.Name "hydra.error.packaging.DuplicateModuleNamespaceError"
+
+_DuplicateModuleNamespaceError_namespace = Core.Name "namespace"
+
+-- | An error indicating that a module is invalid
+data InvalidModuleError =
+  -- | A union variant name that conflicts with another type definition when mapped to a target language
+  InvalidModuleErrorConflictingVariantName ConflictingVariantNameError |
+  -- | A definition whose name does not have the module's namespace as a prefix
+  InvalidModuleErrorDefinitionNotInModuleNamespace DefinitionNotInModuleNamespaceError |
+  -- | Two or more definitions in the same module share the same name
+  InvalidModuleErrorDuplicateDefinitionName DuplicateDefinitionNameError
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidModuleError = Core.Name "hydra.error.packaging.InvalidModuleError"
+
+_InvalidModuleError_conflictingVariantName = Core.Name "conflictingVariantName"
+
+_InvalidModuleError_definitionNotInModuleNamespace = Core.Name "definitionNotInModuleNamespace"
+
+_InvalidModuleError_duplicateDefinitionName = Core.Name "duplicateDefinitionName"
+
+-- | An error indicating that a package is invalid
+data InvalidPackageError =
+  -- | Two module namespaces that conflict when mapped to a target language
+  InvalidPackageErrorConflictingModuleNamespace ConflictingModuleNamespaceError |
+  -- | Two or more modules in the same package share the same namespace
+  InvalidPackageErrorDuplicateModuleNamespace DuplicateModuleNamespaceError |
+  -- | A module within the package is invalid
+  InvalidPackageErrorInvalidModule InvalidModuleError
+  deriving (Eq, Ord, Read, Show)
+
+_InvalidPackageError = Core.Name "hydra.error.packaging.InvalidPackageError"
+
+_InvalidPackageError_conflictingModuleNamespace = Core.Name "conflictingModuleNamespace"
+
+_InvalidPackageError_duplicateModuleNamespace = Core.Name "duplicateModuleNamespace"
+
+_InvalidPackageError_invalidModule = Core.Name "invalidModule"
diff --git a/src/gen-main/haskell/Hydra/Errors.hs b/src/gen-main/haskell/Hydra/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Errors.hs
@@ -0,0 +1,100 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Top-level error types for the Hydra kernel
+
+module Hydra.Errors where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Checking as Checking
+import qualified Hydra.Error.Core as Core_
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | An error that occurred during decoding of a term
+newtype DecodingError =
+  DecodingError {
+    unDecodingError :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_DecodingError = Core.Name "hydra.errors.DecodingError"
+
+-- | An error of any kind, with kernel errors particularly differentiated
+data Error =
+  -- | A type checking error
+  ErrorChecking Checking.CheckingError |
+  -- | An error that occurred during decoding of a term
+  ErrorDecoding DecodingError |
+  -- | A duplicate binding name error
+  ErrorDuplicateBinding Core_.DuplicateBindingError |
+  -- | A duplicate field name error
+  ErrorDuplicateField Core_.DuplicateFieldError |
+  -- | Any other error
+  ErrorOther OtherError |
+  -- | A reference to an undefined field
+  ErrorUndefinedField Core_.UndefinedFieldError |
+  -- | A reference to an undefined term variable
+  ErrorUndefinedTermVariable Core_.UndefinedTermVariableError |
+  -- | A term variable whose type is not known
+  ErrorUntypedTermVariable Core_.UntypedTermVariableError |
+  -- | An unexpected term variant
+  ErrorUnexpectedTermVariant Core_.UnexpectedTermVariantError |
+  -- | An unexpected type variant
+  ErrorUnexpectedTypeVariant Core_.UnexpectedTypeVariantError |
+  -- | A type unification error
+  ErrorUnification UnificationError
+  deriving (Eq, Ord, Read, Show)
+
+_Error = Core.Name "hydra.errors.Error"
+
+_Error_checking = Core.Name "checking"
+
+_Error_decoding = Core.Name "decoding"
+
+_Error_duplicateBinding = Core.Name "duplicateBinding"
+
+_Error_duplicateField = Core.Name "duplicateField"
+
+_Error_other = Core.Name "other"
+
+_Error_undefinedField = Core.Name "undefinedField"
+
+_Error_undefinedTermVariable = Core.Name "undefinedTermVariable"
+
+_Error_untypedTermVariable = Core.Name "untypedTermVariable"
+
+_Error_unexpectedTermVariant = Core.Name "unexpectedTermVariant"
+
+_Error_unexpectedTypeVariant = Core.Name "unexpectedTypeVariant"
+
+_Error_unification = Core.Name "unification"
+
+-- | Any other error
+newtype OtherError =
+  OtherError {
+    unOtherError :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_OtherError = Core.Name "hydra.errors.OtherError"
+
+-- | An error that occurred during type unification
+data UnificationError =
+  UnificationError {
+    -- | The left-hand type in the unification
+    unificationErrorLeftType :: Core.Type,
+    -- | The right-hand type in the unification
+    unificationErrorRightType :: Core.Type,
+    -- | A human-readable error message
+    unificationErrorMessage :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_UnificationError = Core.Name "hydra.errors.UnificationError"
+
+_UnificationError_leftType = Core.Name "leftType"
+
+_UnificationError_rightType = Core.Name "rightType"
+
+_UnificationError_message = Core.Name "message"
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Eithers.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Eithers.hs
--- a/src/gen-main/haskell/Hydra/Eval/Lib/Eithers.hs
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Eithers.hs
@@ -4,15 +4,17 @@
 
 module Hydra.Eval.Lib.Eithers where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Core as Core_
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Monads as Monads
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Show.Core as Core__
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -21,92 +23,224 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | Interpreter-friendly bind for Either terms.
-bind :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-bind eitherTerm funTerm = ((\x -> case x of
-  Core.TermEither v1 -> (Flows.pure (Eithers.either (\val -> Core.TermEither (Left val)) (\val -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = val})) v1))
-  _ -> (Monads.unexpected "either value" (Core__.term eitherTerm))) eitherTerm)
-
 -- | Interpreter-friendly bimap for Either terms.
-bimap :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-bimap leftFun rightFun eitherTerm = ((\x -> case x of
-  Core.TermEither v1 -> (Flows.pure (Eithers.either (\val -> Core.TermEither (Left (Core.TermApplication (Core.Application {
-    Core.applicationFunction = leftFun,
-    Core.applicationArgument = val})))) (\val -> Core.TermEither (Right (Core.TermApplication (Core.Application {
-    Core.applicationFunction = rightFun,
-    Core.applicationArgument = val})))) v1))
-  _ -> (Monads.unexpected "either value" (Core__.term eitherTerm))) eitherTerm)
+bimap :: Context.Context -> t0 -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+bimap cx g leftFun rightFun eitherTerm =
+    case eitherTerm of
+      Core.TermEither v0 -> Right (Eithers.either (\val -> Core.TermEither (Left (Core.TermApplication (Core.Application {
+        Core.applicationFunction = leftFun,
+        Core.applicationArgument = val})))) (\val -> Core.TermEither (Right (Core.TermApplication (Core.Application {
+        Core.applicationFunction = rightFun,
+        Core.applicationArgument = val})))) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core__.term eitherTerm)))),
+        Context.inContextContext = cx})
 
+-- | Interpreter-friendly bind for Either terms.
+bind :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+bind cx g eitherTerm funTerm =
+    case eitherTerm of
+      Core.TermEither v0 -> Right (Eithers.either (\val -> Core.TermEither (Left val)) (\val -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = val})) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core__.term eitherTerm)))),
+        Context.inContextContext = cx})
+
 -- | Interpreter-friendly case analysis for Either terms.
-either :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-either leftFun rightFun eitherTerm = ((\x -> case x of
-  Core.TermEither v1 -> (Flows.pure (Eithers.either (\val -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = leftFun,
-    Core.applicationArgument = val})) (\val -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = rightFun,
-    Core.applicationArgument = val})) v1))
-  _ -> (Monads.unexpected "either value" (Core__.term eitherTerm))) eitherTerm)
+either :: Context.Context -> t0 -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+either cx g leftFun rightFun eitherTerm =
+    case eitherTerm of
+      Core.TermEither v0 -> Right (Eithers.either (\val -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = leftFun,
+        Core.applicationArgument = val})) (\val -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = rightFun,
+        Core.applicationArgument = val})) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core__.term eitherTerm)))),
+        Context.inContextContext = cx})
 
+-- | Interpreter-friendly foldl for Either.
+foldl :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+foldl cx g funTerm initTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "err"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "err"))))})))})),
+        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "a"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = funTerm,
+              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+            Core.applicationArgument = el}))})))})),
+      Core.applicationArgument = acc})) (Core.TermEither (Right initTerm)) elements))
+
+-- | Interpreter-friendly fromLeft for Either terms.
+fromLeft :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+fromLeft cx g defaultTerm eitherTerm =
+    case eitherTerm of
+      Core.TermEither v0 -> Right (Eithers.either (\val -> val) (\_ -> defaultTerm) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core__.term eitherTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly fromRight for Either terms.
+fromRight :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+fromRight cx g defaultTerm eitherTerm =
+    case eitherTerm of
+      Core.TermEither v0 -> Right (Eithers.either (\_ -> defaultTerm) (\val -> val) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core__.term eitherTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly isLeft for Either terms.
+isLeft :: Context.Context -> t0 -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+isLeft cx g eitherTerm =
+    case eitherTerm of
+      Core.TermEither v0 -> Right (Eithers.either (\_ -> Core.TermLiteral (Core.LiteralBoolean True)) (\_ -> Core.TermLiteral (Core.LiteralBoolean False)) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core__.term eitherTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly isRight for Either terms.
+isRight :: Context.Context -> t0 -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+isRight cx g eitherTerm =
+    case eitherTerm of
+      Core.TermEither v0 -> Right (Eithers.either (\_ -> Core.TermLiteral (Core.LiteralBoolean False)) (\_ -> Core.TermLiteral (Core.LiteralBoolean True)) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core__.term eitherTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly lefts for list of Either terms.
+lefts :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+lefts cx g listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Core.TermList (Lists.foldl (\acc -> \el -> case el of
+      Core.TermEither v0 -> Eithers.either (\val -> Lists.concat2 acc (Lists.pure val)) (\_ -> acc) v0
+      _ -> acc) [] elements)))
+
 -- | Interpreter-friendly map for Either terms.
-map :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-map rightFun eitherTerm = ((\x -> case x of
-  Core.TermEither v1 -> (Flows.pure (Eithers.either (\val -> Core.TermEither (Left val)) (\val -> Core.TermEither (Right (Core.TermApplication (Core.Application {
-    Core.applicationFunction = rightFun,
-    Core.applicationArgument = val})))) v1))
-  _ -> (Monads.unexpected "either value" (Core__.term eitherTerm))) eitherTerm)
+map :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+map cx g rightFun eitherTerm =
+    case eitherTerm of
+      Core.TermEither v0 -> Right (Eithers.either (\val -> Core.TermEither (Left val)) (\val -> Core.TermEither (Right (Core.TermApplication (Core.Application {
+        Core.applicationFunction = rightFun,
+        Core.applicationArgument = val})))) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core__.term eitherTerm)))),
+        Context.inContextContext = cx})
 
 -- | Interpreter-friendly mapList for Either (traverse).
-mapList :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-mapList funTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "err"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "err"))))})))})),
-    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-      Core.lambdaParameter = (Core.Name "y"),
-      Core.lambdaDomain = Nothing,
-      Core.lambdaBody = (Core.TermApplication (Core.Application {
+mapList :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+mapList cx g funTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
         Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "err"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "err"))))})))})),
+        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "y"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "accErr"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "accErr"))))})))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "ys"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "ys"))}))))})))})),
+            Core.applicationArgument = acc}))})))})),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = el}))})) (Core.TermEither (Right (Core.TermList []))) (Lists.reverse elements)))
+
+-- | Interpreter-friendly mapMaybe for Either (traverse over Maybe).
+mapMaybe :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+mapMaybe cx g funTerm maybeTerm =
+    case maybeTerm of
+      Core.TermMaybe v0 -> Right (Maybes.maybe (Core.TermEither (Right (Core.TermMaybe Nothing))) (\val -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
           Core.applicationFunction = (Core.TermApplication (Core.Application {
             Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
             Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "accErr"),
+              Core.lambdaParameter = (Core.Name "err"),
               Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "accErr"))))})))})),
+              Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "err"))))})))})),
           Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "ys"),
+            Core.lambdaParameter = (Core.Name "y"),
             Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "ys"))}))))})))})),
-        Core.applicationArgument = acc}))})))})),
-  Core.applicationArgument = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = el}))})) (Core.TermEither (Right (Core.TermList []))) (Lists.reverse elements))))
+            Core.lambdaBody = (Core.TermEither (Right (Core.TermMaybe (Just (Core.TermVariable (Core.Name "y"))))))})))})),
+        Core.applicationArgument = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = funTerm,
+          Core.applicationArgument = val}))})) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "maybe value") " but found ") (Core__.term maybeTerm)))),
+        Context.inContextContext = cx})
 
--- | Interpreter-friendly mapMaybe for Either (traverse over Maybe).
-mapMaybe :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-mapMaybe funTerm maybeTerm = ((\x -> case x of
-  Core.TermMaybe v1 -> (Flows.pure (Maybes.maybe (Core.TermEither (Right (Core.TermMaybe Nothing))) (\val -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermApplication (Core.Application {
+-- | Interpreter-friendly mapSet for Either (traverse over Set).
+mapSet :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+mapSet cx g funTerm setTerm =
+    Eithers.bind (Core_.set cx g setTerm) (\elements -> Right (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
       Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "err"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "err"))))})))})),
         Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "err"),
+          Core.lambdaParameter = (Core.Name "y"),
           Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "err"))))})))})),
-      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "y"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermEither (Right (Core.TermMaybe (Just (Core.TermVariable (Core.Name "y"))))))})))})),
-    Core.applicationArgument = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = funTerm,
-      Core.applicationArgument = val}))})) v1))
-  _ -> (Monads.unexpected "maybe value" (Core__.term maybeTerm))) maybeTerm)
+          Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "accErr"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "accErr"))))})))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "ys"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "ys"))}))))})))})),
+            Core.applicationArgument = acc}))})))})),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = el}))})) (Core.TermEither (Right (Core.TermSet (Sets.fromList [])))) (Sets.toList elements)))
+
+-- | Interpreter-friendly partitionEithers for list of Either terms.
+partitionEithers :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) ([Core.Term], [Core.Term])
+partitionEithers cx g listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Lists.foldl (\acc -> \el ->
+      let ls = Pairs.first acc
+          rs = Pairs.second acc
+      in case el of
+        Core.TermEither v0 -> Eithers.either (\val -> (Lists.concat2 ls (Lists.pure val), rs)) (\val -> (ls, (Lists.concat2 rs (Lists.pure val)))) v0
+        _ -> acc) ([], []) elements))
+
+-- | Interpreter-friendly rights for list of Either terms.
+rights :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+rights cx g listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Core.TermList (Lists.foldl (\acc -> \el -> case el of
+      Core.TermEither v0 -> Eithers.either (\_ -> acc) (\val -> Lists.concat2 acc (Lists.pure val)) v0
+      _ -> acc) [] elements)))
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Equality.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Equality.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Equality.hs
@@ -0,0 +1,47 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Evaluation-level implementations of Equality functions for the Hydra interpreter.
+
+module Hydra.Eval.Lib.Equality where
+
+import qualified Hydra.Core as Core
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Interpreter-friendly identity function.
+identity :: t0 -> t1 -> t2 -> Either t3 t2
+identity cx g x = Right x
+
+-- | Interpreter-friendly max.
+max :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+max cx g x y =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+          Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
+              Core.applicationArgument = x})),
+            Core.applicationArgument = y}))})),
+        Core.applicationArgument = x})),
+      Core.applicationArgument = y}))
+
+-- | Interpreter-friendly min.
+min :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+min cx g x y =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+          Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
+              Core.applicationArgument = x})),
+            Core.applicationArgument = y}))})),
+        Core.applicationArgument = x})),
+      Core.applicationArgument = y}))
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Flows.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Flows.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Eval/Lib/Flows.hs
+++ /dev/null
@@ -1,377 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Evaluation-level implementations of Flow functions for the Hydra interpreter.
-
-module Hydra.Eval.Lib.Flows where
-
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Extract.Core as Core_
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Show.Core as Core__
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Interpreter-friendly applicative apply for Flow.
-apply :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-apply flowFun flowArg = (Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.bind"))),
-    Core.applicationArgument = flowFun})),
-  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "f"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.bind"))),
-        Core.applicationArgument = flowArg})),
-      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.pure"))),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))})))})))
-
--- | Interpreter-friendly monadic bind for Flow.
-bind :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-bind flowTerm funTerm = ((\x -> case x of
-  Core.TermWrap v1 ->  
-    let innerFun = (Core.wrappedTermBody v1)
-    in (Flows.pure (Core.TermWrap (Core.WrappedTerm {
-      Core.wrappedTermTypeName = (Core.Name "hydra.compute.Flow"),
-      Core.wrappedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "s"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "t"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                Core.applicationArgument = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermMaybe Nothing)},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "state"),
-                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                          Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                          Core.projectionField = (Core.Name "state")})))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = innerFun,
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "trace"),
-                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                          Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                          Core.projectionField = (Core.Name "trace")})))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = innerFun,
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))}]}))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "v"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = funTerm,
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                        Core.projectionField = (Core.Name "state")})))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = innerFun,
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                        Core.projectionField = (Core.Name "trace")})))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = innerFun,
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))}))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                Core.projectionField = (Core.Name "value")})))),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = innerFun,
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))}))})))})))})))
-  _ -> (Monads.unexpected "flow term" (Core__.term flowTerm))) flowTerm)
-
--- | Interpreter-friendly foldl for Flow.
-foldl :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-foldl funTerm initTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.bind"))),
-    Core.applicationArgument = acc})),
-  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-    Core.lambdaParameter = (Core.Name "accVal"),
-    Core.lambdaDomain = Nothing,
-    Core.lambdaBody = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = funTerm,
-        Core.applicationArgument = (Core.TermVariable (Core.Name "accVal"))})),
-      Core.applicationArgument = el}))})))})) (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.pure"))),
-  Core.applicationArgument = initTerm})) elements)))
-
--- | Interpreter-friendly functor map for Flow.
-map :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-map funTerm flowTerm = ((\x -> case x of
-  Core.TermWrap v1 ->  
-    let innerFun = (Core.wrappedTermBody v1)
-    in (Flows.pure (Core.TermWrap (Core.WrappedTerm {
-      Core.wrappedTermTypeName = (Core.Name "hydra.compute.Flow"),
-      Core.wrappedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "s"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "t"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "value"),
-                Core.fieldTerm = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = funTerm,
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))})),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                      Core.projectionField = (Core.Name "value")})))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = innerFun,
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))}))},
-              Core.Field {
-                Core.fieldName = (Core.Name "state"),
-                Core.fieldTerm = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                    Core.projectionField = (Core.Name "state")})))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = innerFun,
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))},
-              Core.Field {
-                Core.fieldName = (Core.Name "trace"),
-                Core.fieldTerm = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                    Core.projectionField = (Core.Name "trace")})))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = innerFun,
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))}]}))})))})))})))
-  _ -> (Monads.unexpected "flow term" (Core__.term flowTerm))) flowTerm)
-
--- | Interpreter-friendly mapElems for Map with Flow.
-mapElems :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-mapElems funTerm mapTerm = ((\x -> case x of
-  Core.TermMap v1 ->  
-    let pairs = (Maps.toList v1)
-    in (Flows.pure (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.bind"))),
-        Core.applicationArgument = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.sequence"))),
-          Core.applicationArgument = (Core.TermList (Lists.map (\p ->  
-            let k = (Pairs.first p)
-            in  
-              let v = (Pairs.second p)
-              in (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.map"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v'"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermPair (k, (Core.TermVariable (Core.Name "v'"))))})))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = funTerm,
-                  Core.applicationArgument = v}))}))) pairs))}))})),
-      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "newPairs"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.pure"))),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "newPairs"))}))}))})))})))
-  _ -> (Monads.unexpected "map value" (Core__.term mapTerm))) mapTerm)
-
--- | Interpreter-friendly mapKeys for Map with Flow.
-mapKeys :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-mapKeys funTerm mapTerm = ((\x -> case x of
-  Core.TermMap v1 ->  
-    let pairs = (Maps.toList v1)
-    in (Flows.pure (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.bind"))),
-        Core.applicationArgument = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.sequence"))),
-          Core.applicationArgument = (Core.TermList (Lists.map (\p ->  
-            let k = (Pairs.first p)
-            in  
-              let v = (Pairs.second p)
-              in (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.map"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "k'"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "k'"), v))})))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = funTerm,
-                  Core.applicationArgument = k}))}))) pairs))}))})),
-      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "newPairs"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.pure"))),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "newPairs"))}))}))})))})))
-  _ -> (Monads.unexpected "map value" (Core__.term mapTerm))) mapTerm)
-
--- | Interpreter-friendly mapList for List with Flow.
-mapList :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-mapList funTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.sequence"))),
-  Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = el})) elements))}))))
-
--- | Interpreter-friendly mapMaybe for Maybe with Flow.
-mapMaybe :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-mapMaybe funTerm maybeTerm = ((\x -> case x of
-  Core.TermMaybe v1 -> (Flows.pure (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isNothing"))),
-            Core.applicationArgument = (Core.TermMaybe v1)}))})),
-        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "_"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.pure"))),
-            Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "_"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.map"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = funTerm,
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromJust"))),
-              Core.applicationArgument = (Core.TermMaybe v1)}))}))}))})))})),
-    Core.applicationArgument = Core.TermUnit})))
-  _ -> (Monads.unexpected "optional value" (Core__.term maybeTerm))) maybeTerm)
-
--- | Interpreter-friendly mapSet for Set with Flow.
-mapSet :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-mapSet funTerm setTerm = (Flows.bind (Core_.set setTerm) (\elements -> Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.map"))),
-    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
-  Core.applicationArgument = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.sequence"))),
-    Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
-      Core.applicationFunction = funTerm,
-      Core.applicationArgument = el})) (Sets.toList elements)))}))}))))
-
--- | Interpreter-friendly withDefault for Flow.
-withDefault :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-withDefault fallbackTerm flowTerm = ((\x -> case x of
-  Core.TermWrap v1 ->  
-    let innerFun = (Core.wrappedTermBody v1)
-    in (Flows.pure (Core.TermWrap (Core.WrappedTerm {
-      Core.wrappedTermTypeName = (Core.Name "hydra.compute.Flow"),
-      Core.wrappedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "s"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "t"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                Core.applicationArgument = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermMaybe (Just fallbackTerm))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "state"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "s"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "trace"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}]}))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "_"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = innerFun,
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                Core.projectionField = (Core.Name "value")})))),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = innerFun,
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))}))})))})))})))
-  _ -> (Monads.unexpected "flow term" (Core__.term flowTerm))) flowTerm)
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Lists.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Lists.hs
--- a/src/gen-main/haskell/Hydra/Eval/Lib/Lists.hs
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Lists.hs
@@ -4,13 +4,16 @@
 
 module Hydra.Eval.Lib.Lists where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Core as Core_
 import qualified Hydra.Graph as Graph
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Reduction as Reduction
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -19,130 +22,351 @@
 import qualified Data.Set as S
 
 -- | Interpreter-friendly applicative apply for List terms.
-apply :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-apply funsTerm argsTerm = (Flows.bind (Core_.list funsTerm) (\funs -> Flows.bind (Core_.list argsTerm) (\arguments ->  
-  let applyOne = (\f -> Lists.map (\arg -> Core.TermApplication (Core.Application {
-          Core.applicationFunction = f,
-          Core.applicationArgument = arg})) arguments)
-  in (Flows.pure (Core.TermList (Lists.concat (Lists.map applyOne funs)))))))
+apply :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+apply cx g funsTerm argsTerm =
+    Eithers.bind (Core_.list cx g funsTerm) (\funs -> Eithers.bind (Core_.list cx g argsTerm) (\arguments ->
+      let applyOne =
+              \f -> Lists.map (\arg -> Core.TermApplication (Core.Application {
+                Core.applicationFunction = f,
+                Core.applicationArgument = arg})) arguments
+      in (Right (Core.TermList (Lists.concat (Lists.map applyOne funs))))))
 
 -- | Interpreter-friendly monadic bind for List terms.
-bind :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-bind listTerm funTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-  Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = el})) elements))}))))
+bind :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+bind cx g listTerm funTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+      Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = el})) elements))})))
 
+-- | Interpreter-friendly concat2 for List terms.
+concat2 :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+concat2 cx g list1 list2 =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+      Core.applicationArgument = (Core.TermList [
+        list1,
+        list2])}))
+
 -- | Interpreter-friendly dropWhile for List terms.
-dropWhile :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-dropWhile predTerm listTerm = (Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-  Core.applicationArgument = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
-      Core.applicationArgument = predTerm})),
-    Core.applicationArgument = listTerm}))})))
+dropWhile :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+dropWhile cx g predTerm listTerm =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
+          Core.applicationArgument = predTerm})),
+        Core.applicationArgument = listTerm}))}))
 
+-- | Interpreter-friendly elem for List terms.
+elem :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+elem cx g x listTerm =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isJust"))),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
+          Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+            Core.applicationArgument = x}))})),
+        Core.applicationArgument = listTerm}))}))
+
 -- | Interpreter-friendly filter for List terms.
-filter :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-filter predTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-  Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-        Core.applicationArgument = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = predTerm,
-          Core.applicationArgument = el}))})),
-      Core.applicationArgument = (Core.TermList (Lists.pure el))})),
-    Core.applicationArgument = (Core.TermList [])})) elements))}))))
+filter :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+filter cx g predTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+      Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = predTerm,
+              Core.applicationArgument = el}))})),
+          Core.applicationArgument = (Core.TermList (Lists.pure el))})),
+        Core.applicationArgument = (Core.TermList [])})) elements))})))
 
 -- | Interpreter-friendly find for List terms.
-find :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-find predTerm listTerm = (Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
-  Core.applicationArgument = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-      Core.applicationArgument = predTerm})),
-    Core.applicationArgument = listTerm}))})))
+find :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+find cx g predTerm listTerm =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+          Core.applicationArgument = predTerm})),
+        Core.applicationArgument = listTerm}))}))
 
 -- | Interpreter-friendly left fold for List terms.
-foldl :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-foldl funTerm initTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = acc})),
-  Core.applicationArgument = el})) initTerm elements)))
+foldl :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+foldl cx g funTerm initTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Lists.foldl (\acc -> \el -> Eithers.bind acc (\reducedAcc -> Reduction.reduceTerm cx g True (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = reducedAcc})),
+      Core.applicationArgument = el})))) (Right initTerm) elements)
 
+-- | Interpreter-friendly right fold for List terms.
+foldr :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+foldr cx g funTerm initTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Lists.foldr (\el -> \acc -> Eithers.bind acc (\reducedAcc -> Reduction.reduceTerm cx g True (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = el})),
+      Core.applicationArgument = reducedAcc})))) (Right initTerm) elements)
+
+-- | Interpreter-friendly group for List terms.
+group :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+group cx g listTerm =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+        Core.lambdaParameter = (Core.Name "foldResult"),
+        Core.lambdaDomain = Nothing,
+        Core.lambdaBody = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "foldResult"))}))}))})),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "foldResult"))}))})),
+          Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "foldResult"))}))})),
+            Core.applicationArgument = (Core.TermList [
+              Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "foldResult"))})])}))}))}))),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "acc"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "el"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                      Core.applicationArgument = (Core.TermPair (Core.TermList [
+                        Core.TermVariable (Core.Name "el")], (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))}))))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "h"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "el"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "h"))}))})),
+                          Core.applicationArgument = (Core.TermPair (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))}))})),
+                            Core.applicationArgument = (Core.TermList [
+                              Core.TermVariable (Core.Name "el")])}), (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))}))))})),
+                        Core.applicationArgument = (Core.TermPair (Core.TermList [
+                          Core.TermVariable (Core.Name "el")], (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))}))})),
+                          Core.applicationArgument = (Core.TermList [
+                            Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))})])}))))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))}))}))}))})))})))})),
+          Core.applicationArgument = (Core.TermPair (Core.TermList [], (Core.TermList [])))})),
+        Core.applicationArgument = listTerm}))}))
+
+-- | Interpreter-friendly intercalate for List terms.
+intercalate :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+intercalate cx g sep listsTerm =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
+          Core.applicationArgument = sep})),
+        Core.applicationArgument = listsTerm}))}))
+
+-- | Interpreter-friendly intersperse for List terms.
+intersperse :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+intersperse cx g sep listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Logic.ifElse (Lists.null elements) (Core.TermList []) (Core.TermList (Lists.cons (Lists.head elements) (Lists.concat (Lists.map (\el -> [
+      sep,
+      el]) (Lists.tail elements)))))))
+
 -- | Interpreter-friendly map for List terms.
-map :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-map funTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Core.TermList (Lists.reverse (Lists.foldl (\acc -> \el -> Lists.cons (Core.TermApplication (Core.Application {
-  Core.applicationFunction = funTerm,
-  Core.applicationArgument = el})) acc) [] elements)))))
+map :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+map cx g funTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Core.TermList (Lists.reverse (Lists.foldl (\acc -> \el -> Lists.cons (Core.TermApplication (Core.Application {
+      Core.applicationFunction = funTerm,
+      Core.applicationArgument = el})) acc) [] elements))))
 
--- | Interpreter-friendly partition for List terms.
-partition :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-partition predTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements ->  
-  let initialState = (Core.TermPair (Core.TermList [], (Core.TermList [])))
-  in  
-    let finalState = (Lists.foldl (\acc -> \el ->  
-            let yeses = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                    Core.applicationArgument = acc}))
-            in  
-              let nos = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-                      Core.applicationArgument = acc}))
-              in (Core.TermApplication (Core.Application {
+-- | Interpreter-friendly nub for List terms.
+nub :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+nub cx g listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "acc"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
                 Core.applicationFunction = (Core.TermApplication (Core.Application {
                   Core.applicationFunction = (Core.TermApplication (Core.Application {
                     Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
                     Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = predTerm,
-                      Core.applicationArgument = el}))})),
-                  Core.applicationArgument = (Core.TermPair (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                      Core.applicationArgument = yeses})),
-                    Core.applicationArgument = (Core.TermList [
-                      el])}), nos))})),
-                Core.applicationArgument = (Core.TermPair (yeses, (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))}))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
                   Core.applicationFunction = (Core.TermApplication (Core.Application {
                     Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                    Core.applicationArgument = nos})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))})),
                   Core.applicationArgument = (Core.TermList [
-                    el])}))))}))) initialState elements)
-    in (Flows.pure finalState)))
+                    Core.TermVariable (Core.Name "x")])}))}))})))})))})),
+        Core.applicationArgument = (Core.TermList [])})),
+      Core.applicationArgument = listTerm})))
 
+-- | Interpreter-friendly partition for List terms.
+partition :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+partition cx g predTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements ->
+      let initialState = Core.TermPair (Core.TermList [], (Core.TermList []))
+          finalState =
+                  Lists.foldl (\acc -> \el ->
+                    let yeses =
+                            Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                              Core.applicationArgument = acc})
+                        nos =
+                                Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                                  Core.applicationArgument = acc})
+                    in (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = predTerm,
+                            Core.applicationArgument = el}))})),
+                        Core.applicationArgument = (Core.TermPair (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                            Core.applicationArgument = yeses})),
+                          Core.applicationArgument = (Core.TermList [
+                            el])}), nos))})),
+                      Core.applicationArgument = (Core.TermPair (yeses, (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                          Core.applicationArgument = nos})),
+                        Core.applicationArgument = (Core.TermList [
+                          el])}))))}))) initialState elements
+      in (Right finalState))
+
+-- | Interpreter-friendly pure for List terms.
+pure :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+pure cx g x = Right (Core.TermList [
+  x])
+
+-- | Interpreter-friendly replicate for List terms.
+replicate :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+replicate cx g n x =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+          Core.lambdaParameter = (Core.Name "_"),
+          Core.lambdaDomain = Nothing,
+          Core.lambdaBody = x})))})),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
+          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+        Core.applicationArgument = n}))}))
+
+-- | Interpreter-friendly safeHead for List terms.
+safeHead :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+safeHead cx g listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Logic.ifElse (Lists.null elements) (Core.TermMaybe Nothing) (Core.TermMaybe (Just (Lists.head elements)))))
+
+-- | Interpreter-friendly singleton for List terms.
+singleton :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+singleton cx g x = Right (Core.TermList [
+  x])
+
+-- | Interpreter-friendly sort for List terms.
+sort :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+sort cx g listTerm =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
+        Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity")))})),
+      Core.applicationArgument = listTerm}))
+
 -- | Interpreter-friendly sortOn for List terms.
-sortOn :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-sortOn projTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Lists.foldl (\sorted -> \x ->  
-  let splitResult = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
+sortOn :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+sortOn cx g projTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Lists.foldl (\sorted -> \x ->
+      let splitResult =
+              Core.TermApplication (Core.Application {
                 Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = projTerm,
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = projTerm,
-                  Core.applicationArgument = x}))}))})))})),
-          Core.applicationArgument = sorted}))
-  in  
-    let before = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-            Core.applicationArgument = splitResult}))
-    in  
-      let after = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-              Core.applicationArgument = splitResult}))
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = projTerm,
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = projTerm,
+                        Core.applicationArgument = x}))}))})))})),
+                Core.applicationArgument = sorted})
+          before =
+                  Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                    Core.applicationArgument = splitResult})
+          after =
+                  Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                    Core.applicationArgument = splitResult})
       in (Core.TermApplication (Core.Application {
         Core.applicationFunction = (Core.TermApplication (Core.Application {
           Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
@@ -151,68 +375,71 @@
           Core.applicationFunction = (Core.TermApplication (Core.Application {
             Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
             Core.applicationArgument = x})),
-          Core.applicationArgument = after}))}))) (Core.TermList []) elements)))
+          Core.applicationArgument = after}))}))) (Core.TermList []) elements))
 
 -- | Interpreter-friendly span for List terms.
-span :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-span predTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements ->  
-  let initialState = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermList [])), (Core.TermList [])))
-  in  
-    let finalState = (Lists.foldl (\acc -> \el ->  
-            let takingLeft = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                    Core.applicationArgument = acc}))
-            in  
-              let right = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-                      Core.applicationArgument = acc}))
-              in  
-                let taking = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                        Core.applicationArgument = takingLeft}))
-                in  
-                  let left = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-                          Core.applicationArgument = takingLeft}))
-                  in (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+span :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+span cx g predTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements ->
+      let initialState =
+              Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermList [])), (Core.TermList []))
+          finalState =
+                  Lists.foldl (\acc -> \el ->
+                    let takingLeft =
+                            Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                              Core.applicationArgument = acc})
+                        right =
+                                Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                                  Core.applicationArgument = acc})
+                        taking =
+                                Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                                  Core.applicationArgument = takingLeft})
+                        left =
+                                Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                                  Core.applicationArgument = takingLeft})
+                    in (Core.TermApplication (Core.Application {
                       Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
-                            Core.applicationArgument = taking})),
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
                           Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = predTerm,
-                            Core.applicationArgument = el}))}))})),
-                      Core.applicationArgument = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
+                              Core.applicationArgument = taking})),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = predTerm,
+                              Core.applicationArgument = el}))}))})),
+                        Core.applicationArgument = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                            Core.applicationArgument = left})),
+                          Core.applicationArgument = (Core.TermList [
+                            el])}))), right))})),
+                      Core.applicationArgument = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean False), left), (Core.TermApplication (Core.Application {
                         Core.applicationFunction = (Core.TermApplication (Core.Application {
                           Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                          Core.applicationArgument = left})),
+                          Core.applicationArgument = right})),
                         Core.applicationArgument = (Core.TermList [
-                          el])}))), right))})),
-                    Core.applicationArgument = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean False), left), (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                        Core.applicationArgument = right})),
-                      Core.applicationArgument = (Core.TermList [
-                        el])}))))}))) initialState elements)
-    in (Flows.pure (Core.TermPair (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-      Core.applicationArgument = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-        Core.applicationArgument = finalState}))}), (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-      Core.applicationArgument = finalState})))))))
+                          el])}))))}))) initialState elements
+      in (Right (Core.TermPair (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+        Core.applicationArgument = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+          Core.applicationArgument = finalState}))}), (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+        Core.applicationArgument = finalState}))))))
 
 -- | Interpreter-friendly zipWith for List terms.
-zipWith :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-zipWith funTerm listTerm1 listTerm2 = (Flows.bind (Core_.list listTerm1) (\elements1 -> Flows.bind (Core_.list listTerm2) (\elements2 -> Flows.pure (Core.TermList (Lists.map (\p ->  
-  let a = (Pairs.first p)
-  in  
-    let b = (Pairs.second p)
-    in (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = funTerm,
-        Core.applicationArgument = a})),
-      Core.applicationArgument = b}))) (Lists.zip elements1 elements2))))))
+zipWith :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+zipWith cx g funTerm listTerm1 listTerm2 =
+    Eithers.bind (Core_.list cx g listTerm1) (\elements1 -> Eithers.bind (Core_.list cx g listTerm2) (\elements2 -> Right (Core.TermList (Lists.map (\p ->
+      let a = Pairs.first p
+          b = Pairs.second p
+      in (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = funTerm,
+          Core.applicationArgument = a})),
+        Core.applicationArgument = b}))) (Lists.zip elements1 elements2)))))
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Logic.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Logic.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Logic.hs
@@ -0,0 +1,46 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Evaluation-level implementations of Logic functions for the Hydra interpreter.
+
+module Hydra.Eval.Lib.Logic where
+
+import qualified Hydra.Core as Core
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Interpreter-friendly logical AND.
+and :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+and cx g a b =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+          Core.applicationArgument = a})),
+        Core.applicationArgument = b})),
+      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))
+
+-- | Interpreter-friendly logical NOT.
+not :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+not cx g a =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+          Core.applicationArgument = a})),
+        Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))
+
+-- | Interpreter-friendly logical OR.
+or :: t0 -> t1 -> Core.Term -> Core.Term -> Either t2 Core.Term
+or cx g a b =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+          Core.applicationArgument = a})),
+        Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+      Core.applicationArgument = b}))
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Maps.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Maps.hs
--- a/src/gen-main/haskell/Hydra/Eval/Lib/Maps.hs
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Maps.hs
@@ -4,13 +4,13 @@
 
 module Hydra.Eval.Lib.Maps where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Monads as Monads
+import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Show.Core as Core_
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -20,124 +20,151 @@
 import qualified Data.Set as S
 
 -- | Interpreter-friendly alter for Map terms.
-alter :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-alter funTerm keyTerm mapTerm = ((\x -> case x of
-  Core.TermMap v1 ->  
-    let currentVal = (Maps.lookup keyTerm v1)
-    in  
-      let newVal = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = funTerm,
-              Core.applicationArgument = (Core.TermMaybe currentVal)}))
-      in (Flows.pure (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
+alter :: Context.Context -> t0 -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+alter cx g funTerm keyTerm mapTerm =
+    case mapTerm of
+      Core.TermMap v0 ->
+        let currentVal = Maps.lookup keyTerm v0
+            newVal =
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = funTerm,
+                      Core.applicationArgument = (Core.TermMaybe currentVal)})
+        in (Right (Core.TermApplication (Core.Application {
           Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.delete"))),
-                Core.applicationArgument = keyTerm})),
-              Core.applicationArgument = mapTerm}))})),
-          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "newV"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
                 Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.delete"))),
                   Core.applicationArgument = keyTerm})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "newV"))})),
-              Core.applicationArgument = mapTerm}))})))})),
-        Core.applicationArgument = newVal})))
-  _ -> (Monads.unexpected "map value" (Core_.term mapTerm))) mapTerm)
+                Core.applicationArgument = mapTerm}))})),
+            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "newV"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                    Core.applicationArgument = keyTerm})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "newV"))})),
+                Core.applicationArgument = mapTerm}))})))})),
+          Core.applicationArgument = newVal})))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "map value") " but found ") (Core_.term mapTerm)))),
+        Context.inContextContext = cx})
 
 -- | Interpreter-friendly bimap for Map terms.
-bimap :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-bimap keyFun valFun mapTerm = ((\x -> case x of
-  Core.TermMap v1 ->  
-    let pairs = (Maps.toList v1)
-    in (Flows.pure (Core.TermMap (Maps.fromList (Lists.map (\p ->  
-      let k = (Pairs.first p)
-      in  
-        let v = (Pairs.second p)
-        in (Core.TermApplication (Core.Application {
-          Core.applicationFunction = keyFun,
-          Core.applicationArgument = k}), (Core.TermApplication (Core.Application {
-          Core.applicationFunction = valFun,
-          Core.applicationArgument = v})))) pairs))))
-  _ -> (Monads.unexpected "map value" (Core_.term mapTerm))) mapTerm)
+bimap :: Context.Context -> t0 -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+bimap cx g keyFun valFun mapTerm =
+    case mapTerm of
+      Core.TermMap v0 ->
+        let pairs = Maps.toList v0
+        in (Right (Core.TermMap (Maps.fromList (Lists.map (\p ->
+          let k = Pairs.first p
+              v = Pairs.second p
+          in (Core.TermApplication (Core.Application {
+            Core.applicationFunction = keyFun,
+            Core.applicationArgument = k}), (Core.TermApplication (Core.Application {
+            Core.applicationFunction = valFun,
+            Core.applicationArgument = v})))) pairs))))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "map value") " but found ") (Core_.term mapTerm)))),
+        Context.inContextContext = cx})
 
 -- | Interpreter-friendly filter for Map terms.
-filter :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-filter valPred mapTerm = ((\x -> case x of
-  Core.TermMap v1 ->  
-    let pairs = (Maps.toList v1)
-    in (Flows.pure (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-      Core.applicationArgument = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-        Core.applicationArgument = (Core.TermList (Lists.map (\p ->  
-          let v = (Pairs.second p)
-          in (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = valPred,
-                  Core.applicationArgument = v}))})),
-              Core.applicationArgument = (Core.TermList (Lists.pure (Core.TermPair (Pairs.first p, v))))})),
-            Core.applicationArgument = (Core.TermList [])}))) pairs))}))})))
-  _ -> (Monads.unexpected "map value" (Core_.term mapTerm))) mapTerm)
+filter :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+filter cx g valPred mapTerm =
+    case mapTerm of
+      Core.TermMap v0 ->
+        let pairs = Maps.toList v0
+        in (Right (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+          Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+            Core.applicationArgument = (Core.TermList (Lists.map (\p ->
+              let v = Pairs.second p
+              in (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = valPred,
+                      Core.applicationArgument = v}))})),
+                  Core.applicationArgument = (Core.TermList (Lists.pure (Core.TermPair (Pairs.first p, v))))})),
+                Core.applicationArgument = (Core.TermList [])}))) pairs))}))})))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "map value") " but found ") (Core_.term mapTerm)))),
+        Context.inContextContext = cx})
 
 -- | Interpreter-friendly filterWithKey for Map terms.
-filterWithKey :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-filterWithKey pred mapTerm = ((\x -> case x of
-  Core.TermMap v1 ->  
-    let pairs = (Maps.toList v1)
-    in (Flows.pure (Core.TermApplication (Core.Application {
-      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-      Core.applicationArgument = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-        Core.applicationArgument = (Core.TermList (Lists.map (\p ->  
-          let k = (Pairs.first p)
-          in  
-            let v = (Pairs.second p)
-            in (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
+filterWithKey :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+filterWithKey cx g pred mapTerm =
+    case mapTerm of
+      Core.TermMap v0 ->
+        let pairs = Maps.toList v0
+        in (Right (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+          Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+            Core.applicationArgument = (Core.TermList (Lists.map (\p ->
+              let k = Pairs.first p
+                  v = Pairs.second p
+              in (Core.TermApplication (Core.Application {
                 Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = pred,
-                      Core.applicationArgument = k})),
-                    Core.applicationArgument = v}))})),
-                Core.applicationArgument = (Core.TermList (Lists.pure (Core.TermPair (k, v))))})),
-              Core.applicationArgument = (Core.TermList [])}))) pairs))}))})))
-  _ -> (Monads.unexpected "map value" (Core_.term mapTerm))) mapTerm)
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = pred,
+                        Core.applicationArgument = k})),
+                      Core.applicationArgument = v}))})),
+                  Core.applicationArgument = (Core.TermList (Lists.pure (Core.TermPair (k, v))))})),
+                Core.applicationArgument = (Core.TermList [])}))) pairs))}))})))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "map value") " but found ") (Core_.term mapTerm)))),
+        Context.inContextContext = cx})
 
+-- | Interpreter-friendly findWithDefault for Map terms.
+findWithDefault :: t0 -> t1 -> Core.Term -> Core.Term -> Core.Term -> Either t2 Core.Term
+findWithDefault cx g defaultTerm keyTerm mapTerm =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromMaybe"))),
+        Core.applicationArgument = defaultTerm})),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+          Core.applicationArgument = keyTerm})),
+        Core.applicationArgument = mapTerm}))}))
+
 -- | Interpreter-friendly map for Map terms.
-map :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-map valFun mapTerm = ((\x -> case x of
-  Core.TermMap v1 ->  
-    let pairs = (Maps.toList v1)
-    in (Flows.pure (Core.TermMap (Maps.fromList (Lists.map (\p ->  
-      let k = (Pairs.first p)
-      in  
-        let v = (Pairs.second p)
-        in (k, (Core.TermApplication (Core.Application {
-          Core.applicationFunction = valFun,
-          Core.applicationArgument = v})))) pairs))))
-  _ -> (Monads.unexpected "map value" (Core_.term mapTerm))) mapTerm)
+map :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+map cx g valFun mapTerm =
+    case mapTerm of
+      Core.TermMap v0 ->
+        let pairs = Maps.toList v0
+        in (Right (Core.TermMap (Maps.fromList (Lists.map (\p ->
+          let k = Pairs.first p
+              v = Pairs.second p
+          in (k, (Core.TermApplication (Core.Application {
+            Core.applicationFunction = valFun,
+            Core.applicationArgument = v})))) pairs))))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "map value") " but found ") (Core_.term mapTerm)))),
+        Context.inContextContext = cx})
 
 -- | Interpreter-friendly mapKeys for Map terms.
-mapKeys :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-mapKeys keyFun mapTerm = ((\x -> case x of
-  Core.TermMap v1 ->  
-    let pairs = (Maps.toList v1)
-    in (Flows.pure (Core.TermMap (Maps.fromList (Lists.map (\p ->  
-      let k = (Pairs.first p)
-      in  
-        let v = (Pairs.second p)
-        in (Core.TermApplication (Core.Application {
-          Core.applicationFunction = keyFun,
-          Core.applicationArgument = k}), v)) pairs))))
-  _ -> (Monads.unexpected "map value" (Core_.term mapTerm))) mapTerm)
+mapKeys :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+mapKeys cx g keyFun mapTerm =
+    case mapTerm of
+      Core.TermMap v0 ->
+        let pairs = Maps.toList v0
+        in (Right (Core.TermMap (Maps.fromList (Lists.map (\p ->
+          let k = Pairs.first p
+              v = Pairs.second p
+          in (Core.TermApplication (Core.Application {
+            Core.applicationFunction = keyFun,
+            Core.applicationArgument = k}), v)) pairs))))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "map value") " but found ") (Core_.term mapTerm)))),
+        Context.inContextContext = cx})
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Math.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Math.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Math.hs
@@ -0,0 +1,53 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Evaluation-level implementations of Math functions for the Hydra interpreter.
+
+module Hydra.Eval.Lib.Math where
+
+import qualified Hydra.Core as Core
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Interpreter-friendly even.
+even :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+even cx g x =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+        Core.applicationArgument = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
+            Core.applicationArgument = x})),
+          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
+      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))
+
+-- | Interpreter-friendly odd.
+odd :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+odd cx g x =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
+        Core.applicationArgument = x}))}))
+
+-- | Interpreter-friendly predecessor.
+pred :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+pred cx g x =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+        Core.applicationArgument = x})),
+      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))
+
+-- | Interpreter-friendly successor.
+succ :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+succ cx g x =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+        Core.applicationArgument = x})),
+      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Maybes.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Maybes.hs
--- a/src/gen-main/haskell/Hydra/Eval/Lib/Maybes.hs
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Maybes.hs
@@ -4,14 +4,15 @@
 
 module Hydra.Eval.Lib.Maybes where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Core as Core_
 import qualified Hydra.Graph as Graph
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Monads as Monads
+import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Show.Core as Core__
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -21,61 +22,138 @@
 import qualified Data.Set as S
 
 -- | Interpreter-friendly applicative apply for Maybe terms.
-apply :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-apply funOptTerm argOptTerm = ((\x -> case x of
-  Core.TermMaybe v1 -> ((\x -> case x of
-    Core.TermMaybe v2 -> (Flows.pure (Core.TermMaybe (Maybes.bind v1 (\f -> Maybes.map (\x -> Core.TermApplication (Core.Application {
-      Core.applicationFunction = f,
-      Core.applicationArgument = x})) v2))))
-    _ -> (Monads.unexpected "optional value" (Core__.term argOptTerm))) argOptTerm)
-  _ -> (Monads.unexpected "optional function" (Core__.term funOptTerm))) funOptTerm)
+apply :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+apply cx g funOptTerm argOptTerm =
+    case funOptTerm of
+      Core.TermMaybe v0 -> case argOptTerm of
+        Core.TermMaybe v1 -> Right (Core.TermMaybe (Maybes.bind v0 (\f -> Maybes.map (\x -> Core.TermApplication (Core.Application {
+          Core.applicationFunction = f,
+          Core.applicationArgument = x})) v1)))
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term argOptTerm)))),
+          Context.inContextContext = cx})
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional function") " but found ") (Core__.term funOptTerm)))),
+        Context.inContextContext = cx})
 
 -- | Interpreter-friendly monadic bind for Maybe terms.
-bind :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-bind optTerm funTerm = ((\x -> case x of
-  Core.TermMaybe v1 -> (Flows.pure (Maybes.maybe (Core.TermMaybe Nothing) (\val -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = val})) v1))
-  _ -> (Monads.unexpected "optional value" (Core__.term optTerm))) optTerm)
+bind :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+bind cx g optTerm funTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Right (Maybes.maybe (Core.TermMaybe Nothing) (\val -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = val})) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
 
 -- | Interpreter-friendly case analysis for Maybe terms (cases argument order).
-cases :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-cases optTerm defaultTerm funTerm = ((\x -> case x of
-  Core.TermMaybe v1 -> (Flows.pure (Maybes.maybe defaultTerm (\val -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = val})) v1))
-  _ -> (Monads.unexpected "optional value" (Core__.term optTerm))) optTerm)
+cases :: Context.Context -> t0 -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+cases cx g optTerm defaultTerm funTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Right (Maybes.maybe defaultTerm (\val -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = val})) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
 
+-- | Interpreter-friendly cat for list of Maybe terms.
+cat :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) [Core.Term]
+cat cx g listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Lists.foldl (\acc -> \el -> case el of
+      Core.TermMaybe v0 -> Maybes.maybe acc (\v -> Lists.concat2 acc (Lists.pure v)) v0
+      _ -> acc) [] elements))
+
 -- | Interpreter-friendly Kleisli composition for Maybe.
-compose :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-compose funF funG xTerm = (Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermApplication (Core.Application {
-    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.bind"))),
-    Core.applicationArgument = (Core.TermApplication (Core.Application {
-      Core.applicationFunction = funF,
-      Core.applicationArgument = xTerm}))})),
-  Core.applicationArgument = funG})))
+compose :: t0 -> t1 -> Core.Term -> Core.Term -> Core.Term -> Either t2 Core.Term
+compose cx g funF funG xTerm =
+    Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.bind"))),
+        Core.applicationArgument = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = funF,
+          Core.applicationArgument = xTerm}))})),
+      Core.applicationArgument = funG}))
 
+-- | Interpreter-friendly fromJust for Maybe terms.
+fromJust :: Context.Context -> t0 -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+fromJust cx g optTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Maybes.maybe (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "Just value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})) (\val -> Right val) v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly fromMaybe for Maybe terms.
+fromMaybe :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+fromMaybe cx g defaultTerm optTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Right (Maybes.maybe defaultTerm (\val -> val) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly isJust for Maybe terms.
+isJust :: Context.Context -> t0 -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+isJust cx g optTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Right (Maybes.maybe (Core.TermLiteral (Core.LiteralBoolean False)) (\_ -> Core.TermLiteral (Core.LiteralBoolean True)) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly isNothing for Maybe terms.
+isNothing :: Context.Context -> t0 -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+isNothing cx g optTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Right (Maybes.maybe (Core.TermLiteral (Core.LiteralBoolean True)) (\_ -> Core.TermLiteral (Core.LiteralBoolean False)) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
+
 -- | Interpreter-friendly map for Maybe terms.
-map :: (Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-map funTerm optTerm = ((\x -> case x of
-  Core.TermMaybe v1 -> (Flows.pure (Core.TermMaybe (Maybes.map (\val -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = val})) v1)))
-  _ -> (Monads.unexpected "optional value" (Core__.term optTerm))) optTerm)
+map :: Context.Context -> t0 -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+map cx g funTerm optTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Right (Core.TermMaybe (Maybes.map (\val -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = val})) v0))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
 
 -- | Interpreter-friendly mapMaybe for List terms.
-mapMaybe :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-mapMaybe funTerm listTerm = (Flows.bind (Core_.list listTerm) (\elements -> Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
-  Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = el})) elements))}))))
+mapMaybe :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+mapMaybe cx g funTerm listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
+      Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = el})) elements))})))
 
 -- | Interpreter-friendly case analysis for Maybe terms.
-maybe :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-maybe defaultTerm funTerm optTerm = ((\x -> case x of
-  Core.TermMaybe v1 -> (Flows.pure (Maybes.maybe defaultTerm (\val -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = funTerm,
-    Core.applicationArgument = val})) v1))
-  _ -> (Monads.unexpected "optional value" (Core__.term optTerm))) optTerm)
+maybe :: Context.Context -> t0 -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+maybe cx g defaultTerm funTerm optTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Right (Maybes.maybe defaultTerm (\val -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = funTerm,
+        Core.applicationArgument = val})) v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly pure for Maybe terms.
+pure :: t0 -> t1 -> Core.Term -> Either t2 Core.Term
+pure cx g x = Right (Core.TermMaybe (Just x))
+
+-- | Interpreter-friendly toList for Maybe terms.
+toList :: Context.Context -> t0 -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+toList cx g optTerm =
+    case optTerm of
+      Core.TermMaybe v0 -> Right (Core.TermList (Maybes.maybe [] (\val -> Lists.pure val) v0))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "optional value") " but found ") (Core__.term optTerm)))),
+        Context.inContextContext = cx})
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Pairs.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Pairs.hs
--- a/src/gen-main/haskell/Hydra/Eval/Lib/Pairs.hs
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Pairs.hs
@@ -4,11 +4,11 @@
 
 module Hydra.Eval.Lib.Pairs where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Monads as Monads
+import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Show.Core as Core_
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -18,15 +18,35 @@
 import qualified Data.Set as S
 
 -- | Interpreter-friendly bimap for Pair terms.
-bimap :: (Core.Term -> Core.Term -> Core.Term -> Compute.Flow t0 Core.Term)
-bimap firstFun secondFun pairTerm = ((\x -> case x of
-  Core.TermPair v1 ->  
-    let fst = (Pairs.first v1)
-    in  
-      let snd = (Pairs.second v1)
-      in (Flows.pure (Core.TermPair (Core.TermApplication (Core.Application {
-        Core.applicationFunction = firstFun,
-        Core.applicationArgument = fst}), (Core.TermApplication (Core.Application {
-        Core.applicationFunction = secondFun,
-        Core.applicationArgument = snd})))))
-  _ -> (Monads.unexpected "pair value" (Core_.term pairTerm))) pairTerm)
+bimap :: Context.Context -> t0 -> Core.Term -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+bimap cx g firstFun secondFun pairTerm =
+    case pairTerm of
+      Core.TermPair v0 ->
+        let fst = Pairs.first v0
+            snd = Pairs.second v0
+        in (Right (Core.TermPair (Core.TermApplication (Core.Application {
+          Core.applicationFunction = firstFun,
+          Core.applicationArgument = fst}), (Core.TermApplication (Core.Application {
+          Core.applicationFunction = secondFun,
+          Core.applicationArgument = snd})))))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "pair value") " but found ") (Core_.term pairTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly first for Pair terms.
+first :: Context.Context -> t0 -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+first cx g pairTerm =
+    case pairTerm of
+      Core.TermPair v0 -> Right (Pairs.first v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "pair value") " but found ") (Core_.term pairTerm)))),
+        Context.inContextContext = cx})
+
+-- | Interpreter-friendly second for Pair terms.
+second :: Context.Context -> t0 -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+second cx g pairTerm =
+    case pairTerm of
+      Core.TermPair v0 -> Right (Pairs.second v0)
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "pair value") " but found ") (Core_.term pairTerm)))),
+        Context.inContextContext = cx})
diff --git a/src/gen-main/haskell/Hydra/Eval/Lib/Sets.hs b/src/gen-main/haskell/Hydra/Eval/Lib/Sets.hs
--- a/src/gen-main/haskell/Hydra/Eval/Lib/Sets.hs
+++ b/src/gen-main/haskell/Hydra/Eval/Lib/Sets.hs
@@ -4,11 +4,12 @@
 
 module Hydra.Eval.Lib.Sets where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Core as Core_
 import qualified Hydra.Graph as Graph
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Sets as Sets
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
@@ -18,10 +19,67 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
+-- | Interpreter-friendly set difference.
+difference :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+difference cx g set1Term set2Term =
+    Eithers.bind (Core_.set cx g set1Term) (\elements -> Right (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+          Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+              Core.applicationArgument = el})),
+            Core.applicationArgument = set2Term}))})),
+        Core.applicationArgument = acc})),
+      Core.applicationArgument = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
+          Core.applicationArgument = el})),
+        Core.applicationArgument = acc}))})) (Core.TermSet (Sets.fromList [])) (Sets.toList elements)))
+
+-- | Interpreter-friendly set intersection.
+intersection :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+intersection cx g set1Term set2Term =
+    Eithers.bind (Core_.set cx g set1Term) (\elements -> Right (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+          Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+              Core.applicationArgument = el})),
+            Core.applicationArgument = set2Term}))})),
+        Core.applicationArgument = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
+            Core.applicationArgument = el})),
+          Core.applicationArgument = acc}))})),
+      Core.applicationArgument = acc})) (Core.TermSet (Sets.fromList [])) (Sets.toList elements)))
+
 -- | Interpreter-friendly map for Set terms.
-map :: (Core.Term -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-map fun setTerm = (Flows.bind (Core_.set setTerm) (\elements -> Flows.pure (Core.TermApplication (Core.Application {
-  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
-  Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
-    Core.applicationFunction = fun,
-    Core.applicationArgument = el})) (Sets.toList elements)))}))))
+map :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+map cx g fun setTerm =
+    Eithers.bind (Core_.set cx g setTerm) (\elements -> Right (Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+      Core.applicationArgument = (Core.TermList (Lists.map (\el -> Core.TermApplication (Core.Application {
+        Core.applicationFunction = fun,
+        Core.applicationArgument = el})) (Sets.toList elements)))})))
+
+-- | Interpreter-friendly set union.
+union :: Context.Context -> Graph.Graph -> Core.Term -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+union cx g set1Term set2Term =
+    Eithers.bind (Core_.set cx g set1Term) (\elements -> Right (Lists.foldl (\acc -> \el -> Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
+        Core.applicationArgument = el})),
+      Core.applicationArgument = acc})) set2Term (Sets.toList elements)))
+
+-- | Interpreter-friendly unions for list of Set terms.
+unions :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+unions cx g listTerm =
+    Eithers.bind (Core_.list cx g listTerm) (\elements -> Right (Lists.foldl (\acc -> \s -> Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.union"))),
+        Core.applicationArgument = acc})),
+      Core.applicationArgument = s})) (Core.TermSet (Sets.fromList [])) elements))
diff --git a/src/gen-main/haskell/Hydra/Ext/Haskell/Ast.hs b/src/gen-main/haskell/Hydra/Ext/Haskell/Ast.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Ext/Haskell/Ast.hs
+++ /dev/null
@@ -1,1111 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | A Haskell syntax model, loosely based on Language.Haskell.Tools.AST
-
-module Hydra.Ext.Haskell.Ast where
-
-import qualified Hydra.Core as Core
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | A pattern-matching alternative
-data Alternative = 
-  Alternative {
-    -- | The pattern to match
-    alternativePattern :: Pattern,
-    -- | The right-hand side of the alternative
-    alternativeRhs :: CaseRhs,
-    -- | Optional local bindings
-    alternativeBinds :: (Maybe LocalBindings)}
-  deriving (Eq, Ord, Read, Show)
-
-_Alternative = (Core.Name "hydra.ext.haskell.ast.Alternative")
-
-_Alternative_pattern = (Core.Name "pattern")
-
-_Alternative_rhs = (Core.Name "rhs")
-
-_Alternative_binds = (Core.Name "binds")
-
--- | A type assertion
-data Assertion = 
-  -- | A class assertion
-  AssertionClass ClassAssertion |
-  -- | A tuple of assertions
-  AssertionTuple [Assertion]
-  deriving (Eq, Ord, Read, Show)
-
-_Assertion = (Core.Name "hydra.ext.haskell.ast.Assertion")
-
-_Assertion_class = (Core.Name "class")
-
-_Assertion_tuple = (Core.Name "tuple")
-
--- | A class assertion
-data ClassAssertion = 
-  ClassAssertion {
-    -- | The name of the class
-    classAssertionName :: Name,
-    -- | The types to which the class is applied
-    classAssertionTypes :: [Type]}
-  deriving (Eq, Ord, Read, Show)
-
-_ClassAssertion = (Core.Name "hydra.ext.haskell.ast.ClassAssertion")
-
-_ClassAssertion_name = (Core.Name "name")
-
-_ClassAssertion_types = (Core.Name "types")
-
--- | The right-hand side of a pattern-matching alternative
-newtype CaseRhs = 
-  CaseRhs {
-    unCaseRhs :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_CaseRhs = (Core.Name "hydra.ext.haskell.ast.CaseRhs")
-
--- | A data constructor
-data Constructor = 
-  -- | An ordinary (positional) constructor
-  ConstructorOrdinary OrdinaryConstructor |
-  -- | A record constructor
-  ConstructorRecord RecordConstructor
-  deriving (Eq, Ord, Read, Show)
-
-_Constructor = (Core.Name "hydra.ext.haskell.ast.Constructor")
-
-_Constructor_ordinary = (Core.Name "ordinary")
-
-_Constructor_record = (Core.Name "record")
-
--- | An ordinary (positional) data constructor
-data OrdinaryConstructor = 
-  OrdinaryConstructor {
-    -- | The name of the constructor
-    ordinaryConstructorName :: Name,
-    -- | The types of the positional fields
-    ordinaryConstructorFields :: [Type]}
-  deriving (Eq, Ord, Read, Show)
-
-_OrdinaryConstructor = (Core.Name "hydra.ext.haskell.ast.OrdinaryConstructor")
-
-_OrdinaryConstructor_name = (Core.Name "name")
-
-_OrdinaryConstructor_fields = (Core.Name "fields")
-
--- | A record-style data constructor
-data RecordConstructor = 
-  RecordConstructor {
-    -- | The name of the constructor
-    recordConstructorName :: Name,
-    -- | The named fields of the record
-    recordConstructorFields :: [FieldWithComments]}
-  deriving (Eq, Ord, Read, Show)
-
-_RecordConstructor = (Core.Name "hydra.ext.haskell.ast.RecordConstructor")
-
-_RecordConstructor_name = (Core.Name "name")
-
-_RecordConstructor_fields = (Core.Name "fields")
-
--- | A data constructor together with any comments
-data ConstructorWithComments = 
-  ConstructorWithComments {
-    -- | The constructor
-    constructorWithCommentsBody :: Constructor,
-    -- | Optional comments
-    constructorWithCommentsComments :: (Maybe String)}
-  deriving (Eq, Ord, Read, Show)
-
-_ConstructorWithComments = (Core.Name "hydra.ext.haskell.ast.ConstructorWithComments")
-
-_ConstructorWithComments_body = (Core.Name "body")
-
-_ConstructorWithComments_comments = (Core.Name "comments")
-
--- | A data type declaration
-data DataDeclaration = 
-  DataDeclaration {
-    -- | The 'data' or 'newtype' keyword
-    dataDeclarationKeyword :: DataOrNewtype,
-    -- | Type class constraints
-    dataDeclarationContext :: [Assertion],
-    -- | The declaration head
-    dataDeclarationHead :: DeclarationHead,
-    -- | The data constructors
-    dataDeclarationConstructors :: [ConstructorWithComments],
-    -- | Derived type class instances
-    dataDeclarationDeriving :: [Deriving]}
-  deriving (Eq, Ord, Read, Show)
-
-_DataDeclaration = (Core.Name "hydra.ext.haskell.ast.DataDeclaration")
-
-_DataDeclaration_keyword = (Core.Name "keyword")
-
-_DataDeclaration_context = (Core.Name "context")
-
-_DataDeclaration_head = (Core.Name "head")
-
-_DataDeclaration_constructors = (Core.Name "constructors")
-
-_DataDeclaration_deriving = (Core.Name "deriving")
-
--- | The 'data' versus 'newtype keyword
-data DataOrNewtype = 
-  DataOrNewtypeData  |
-  DataOrNewtypeNewtype 
-  deriving (Eq, Ord, Read, Show)
-
-_DataOrNewtype = (Core.Name "hydra.ext.haskell.ast.DataOrNewtype")
-
-_DataOrNewtype_data = (Core.Name "data")
-
-_DataOrNewtype_newtype = (Core.Name "newtype")
-
--- | A data declaration together with any comments
-data DeclarationWithComments = 
-  DeclarationWithComments {
-    -- | The declaration
-    declarationWithCommentsBody :: Declaration,
-    -- | Optional comments
-    declarationWithCommentsComments :: (Maybe String)}
-  deriving (Eq, Ord, Read, Show)
-
-_DeclarationWithComments = (Core.Name "hydra.ext.haskell.ast.DeclarationWithComments")
-
-_DeclarationWithComments_body = (Core.Name "body")
-
-_DeclarationWithComments_comments = (Core.Name "comments")
-
--- | A data or value declaration
-data Declaration = 
-  -- | A data type declaration
-  DeclarationData DataDeclaration |
-  -- | A type synonym declaration
-  DeclarationType TypeDeclaration |
-  -- | A value binding
-  DeclarationValueBinding ValueBinding |
-  -- | A typed binding
-  DeclarationTypedBinding TypedBinding
-  deriving (Eq, Ord, Read, Show)
-
-_Declaration = (Core.Name "hydra.ext.haskell.ast.Declaration")
-
-_Declaration_data = (Core.Name "data")
-
-_Declaration_type = (Core.Name "type")
-
-_Declaration_valueBinding = (Core.Name "valueBinding")
-
-_Declaration_typedBinding = (Core.Name "typedBinding")
-
--- | The left-hand side of a declaration
-data DeclarationHead = 
-  -- | An application-style declaration head
-  DeclarationHeadApplication ApplicationDeclarationHead |
-  -- | A parenthesized declaration head
-  DeclarationHeadParens DeclarationHead |
-  -- | A simple name
-  DeclarationHeadSimple Name
-  deriving (Eq, Ord, Read, Show)
-
-_DeclarationHead = (Core.Name "hydra.ext.haskell.ast.DeclarationHead")
-
-_DeclarationHead_application = (Core.Name "application")
-
-_DeclarationHead_parens = (Core.Name "parens")
-
-_DeclarationHead_simple = (Core.Name "simple")
-
--- | An application-style declaration head
-data ApplicationDeclarationHead = 
-  ApplicationDeclarationHead {
-    -- | The function being applied
-    applicationDeclarationHeadFunction :: DeclarationHead,
-    -- | The type variable operand
-    applicationDeclarationHeadOperand :: Variable}
-  deriving (Eq, Ord, Read, Show)
-
-_ApplicationDeclarationHead = (Core.Name "hydra.ext.haskell.ast.ApplicationDeclarationHead")
-
-_ApplicationDeclarationHead_function = (Core.Name "function")
-
-_ApplicationDeclarationHead_operand = (Core.Name "operand")
-
--- | A 'deriving' statement
-newtype Deriving = 
-  Deriving {
-    unDeriving :: [Name]}
-  deriving (Eq, Ord, Read, Show)
-
-_Deriving = (Core.Name "hydra.ext.haskell.ast.Deriving")
-
--- | An export statement
-data Export = 
-  -- | An exported declaration
-  ExportDeclaration ImportExportSpec |
-  -- | An exported module
-  ExportModule ModuleName
-  deriving (Eq, Ord, Read, Show)
-
-_Export = (Core.Name "hydra.ext.haskell.ast.Export")
-
-_Export_declaration = (Core.Name "declaration")
-
-_Export_module = (Core.Name "module")
-
--- | A data expression
-data Expression = 
-  -- | A function application
-  ExpressionApplication ApplicationExpression |
-  -- | A case expression
-  ExpressionCase CaseExpression |
-  -- | A record constructor expression
-  ExpressionConstructRecord ConstructRecordExpression |
-  -- | A 'do' expression
-  ExpressionDo [Statement] |
-  -- | An 'if' expression
-  ExpressionIf IfExpression |
-  -- | An infix application
-  ExpressionInfixApplication InfixApplicationExpression |
-  -- | A literal value
-  ExpressionLiteral Literal |
-  -- | A lambda expression
-  ExpressionLambda LambdaExpression |
-  -- | A left section expression
-  ExpressionLeftSection SectionExpression |
-  -- | A 'let' expression
-  ExpressionLet LetExpression |
-  -- | A list expression
-  ExpressionList [Expression] |
-  -- | A parenthesized expression
-  ExpressionParens Expression |
-  -- | A prefix application
-  ExpressionPrefixApplication PrefixApplicationExpression |
-  -- | A right section expression
-  ExpressionRightSection SectionExpression |
-  -- | A tuple expression
-  ExpressionTuple [Expression] |
-  -- | A type signature expression
-  ExpressionTypeSignature TypeSignatureExpression |
-  -- | A record update expression
-  ExpressionUpdateRecord UpdateRecordExpression |
-  -- | A variable reference
-  ExpressionVariable Name
-  deriving (Eq, Ord, Read, Show)
-
-_Expression = (Core.Name "hydra.ext.haskell.ast.Expression")
-
-_Expression_application = (Core.Name "application")
-
-_Expression_case = (Core.Name "case")
-
-_Expression_constructRecord = (Core.Name "constructRecord")
-
-_Expression_do = (Core.Name "do")
-
-_Expression_if = (Core.Name "if")
-
-_Expression_infixApplication = (Core.Name "infixApplication")
-
-_Expression_literal = (Core.Name "literal")
-
-_Expression_lambda = (Core.Name "lambda")
-
-_Expression_leftSection = (Core.Name "leftSection")
-
-_Expression_let = (Core.Name "let")
-
-_Expression_list = (Core.Name "list")
-
-_Expression_parens = (Core.Name "parens")
-
-_Expression_prefixApplication = (Core.Name "prefixApplication")
-
-_Expression_rightSection = (Core.Name "rightSection")
-
-_Expression_tuple = (Core.Name "tuple")
-
-_Expression_typeSignature = (Core.Name "typeSignature")
-
-_Expression_updateRecord = (Core.Name "updateRecord")
-
-_Expression_variable = (Core.Name "variable")
-
--- | An application expression
-data ApplicationExpression = 
-  ApplicationExpression {
-    -- | The function being applied
-    applicationExpressionFunction :: Expression,
-    -- | The argument
-    applicationExpressionArgument :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_ApplicationExpression = (Core.Name "hydra.ext.haskell.ast.ApplicationExpression")
-
-_ApplicationExpression_function = (Core.Name "function")
-
-_ApplicationExpression_argument = (Core.Name "argument")
-
--- | A case expression
-data CaseExpression = 
-  CaseExpression {
-    -- | The expression being matched
-    caseExpressionCase :: Expression,
-    -- | The pattern-matching alternatives
-    caseExpressionAlternatives :: [Alternative]}
-  deriving (Eq, Ord, Read, Show)
-
-_CaseExpression = (Core.Name "hydra.ext.haskell.ast.CaseExpression")
-
-_CaseExpression_case = (Core.Name "case")
-
-_CaseExpression_alternatives = (Core.Name "alternatives")
-
--- | A record constructor expression
-data ConstructRecordExpression = 
-  ConstructRecordExpression {
-    -- | The constructor name
-    constructRecordExpressionName :: Name,
-    -- | The field assignments
-    constructRecordExpressionFields :: [FieldUpdate]}
-  deriving (Eq, Ord, Read, Show)
-
-_ConstructRecordExpression = (Core.Name "hydra.ext.haskell.ast.ConstructRecordExpression")
-
-_ConstructRecordExpression_name = (Core.Name "name")
-
-_ConstructRecordExpression_fields = (Core.Name "fields")
-
--- | An 'if' expression
-data IfExpression = 
-  IfExpression {
-    -- | The condition expression
-    ifExpressionCondition :: Expression,
-    -- | The 'then' branch
-    ifExpressionThen :: Expression,
-    -- | The 'else' branch
-    ifExpressionElse :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_IfExpression = (Core.Name "hydra.ext.haskell.ast.IfExpression")
-
-_IfExpression_condition = (Core.Name "condition")
-
-_IfExpression_then = (Core.Name "then")
-
-_IfExpression_else = (Core.Name "else")
-
--- | An infix application expression
-data InfixApplicationExpression = 
-  InfixApplicationExpression {
-    -- | The left-hand operand
-    infixApplicationExpressionLhs :: Expression,
-    -- | The infix operator
-    infixApplicationExpressionOperator :: Operator,
-    -- | The right-hand operand
-    infixApplicationExpressionRhs :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_InfixApplicationExpression = (Core.Name "hydra.ext.haskell.ast.InfixApplicationExpression")
-
-_InfixApplicationExpression_lhs = (Core.Name "lhs")
-
-_InfixApplicationExpression_operator = (Core.Name "operator")
-
-_InfixApplicationExpression_rhs = (Core.Name "rhs")
-
--- | A lambda expression
-data LambdaExpression = 
-  LambdaExpression {
-    -- | The patterns binding parameters
-    lambdaExpressionBindings :: [Pattern],
-    -- | The body of the lambda
-    lambdaExpressionInner :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_LambdaExpression = (Core.Name "hydra.ext.haskell.ast.LambdaExpression")
-
-_LambdaExpression_bindings = (Core.Name "bindings")
-
-_LambdaExpression_inner = (Core.Name "inner")
-
--- | A 'let' expression
-data LetExpression = 
-  LetExpression {
-    -- | The local bindings
-    letExpressionBindings :: [LocalBinding],
-    -- | The body of the let expression
-    letExpressionInner :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_LetExpression = (Core.Name "hydra.ext.haskell.ast.LetExpression")
-
-_LetExpression_bindings = (Core.Name "bindings")
-
-_LetExpression_inner = (Core.Name "inner")
-
--- | A prefix expression
-data PrefixApplicationExpression = 
-  PrefixApplicationExpression {
-    -- | The prefix operator
-    prefixApplicationExpressionOperator :: Operator,
-    -- | The operand
-    prefixApplicationExpressionRhs :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_PrefixApplicationExpression = (Core.Name "hydra.ext.haskell.ast.PrefixApplicationExpression")
-
-_PrefixApplicationExpression_operator = (Core.Name "operator")
-
-_PrefixApplicationExpression_rhs = (Core.Name "rhs")
-
--- | A section expression
-data SectionExpression = 
-  SectionExpression {
-    -- | The operator
-    sectionExpressionOperator :: Operator,
-    -- | The operand
-    sectionExpressionExpression :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_SectionExpression = (Core.Name "hydra.ext.haskell.ast.SectionExpression")
-
-_SectionExpression_operator = (Core.Name "operator")
-
-_SectionExpression_expression = (Core.Name "expression")
-
--- | A type signature expression
-data TypeSignatureExpression = 
-  TypeSignatureExpression {
-    -- | The expression being typed
-    typeSignatureExpressionInner :: Expression,
-    -- | The type signature
-    typeSignatureExpressionType :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_TypeSignatureExpression = (Core.Name "hydra.ext.haskell.ast.TypeSignatureExpression")
-
-_TypeSignatureExpression_inner = (Core.Name "inner")
-
-_TypeSignatureExpression_type = (Core.Name "type")
-
--- | An update record expression
-data UpdateRecordExpression = 
-  UpdateRecordExpression {
-    -- | The record being updated
-    updateRecordExpressionInner :: Expression,
-    -- | The field updates
-    updateRecordExpressionFields :: [FieldUpdate]}
-  deriving (Eq, Ord, Read, Show)
-
-_UpdateRecordExpression = (Core.Name "hydra.ext.haskell.ast.UpdateRecordExpression")
-
-_UpdateRecordExpression_inner = (Core.Name "inner")
-
-_UpdateRecordExpression_fields = (Core.Name "fields")
-
--- | A field (name/type pair)
-data Field = 
-  Field {
-    -- | The field name
-    fieldName :: Name,
-    -- | The field type
-    fieldType :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_Field = (Core.Name "hydra.ext.haskell.ast.Field")
-
-_Field_name = (Core.Name "name")
-
-_Field_type = (Core.Name "type")
-
--- | A field together with any comments
-data FieldWithComments = 
-  FieldWithComments {
-    -- | The field
-    fieldWithCommentsField :: Field,
-    -- | Optional comments
-    fieldWithCommentsComments :: (Maybe String)}
-  deriving (Eq, Ord, Read, Show)
-
-_FieldWithComments = (Core.Name "hydra.ext.haskell.ast.FieldWithComments")
-
-_FieldWithComments_field = (Core.Name "field")
-
-_FieldWithComments_comments = (Core.Name "comments")
-
--- | A field name and value
-data FieldUpdate = 
-  FieldUpdate {
-    -- | The field name
-    fieldUpdateName :: Name,
-    -- | The field value
-    fieldUpdateValue :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_FieldUpdate = (Core.Name "hydra.ext.haskell.ast.FieldUpdate")
-
-_FieldUpdate_name = (Core.Name "name")
-
-_FieldUpdate_value = (Core.Name "value")
-
--- | An import statement
-data Import = 
-  Import {
-    -- | Whether the import is qualified
-    importQualified :: Bool,
-    -- | The module being imported
-    importModule :: ModuleName,
-    -- | Optional alias for the module
-    importAs :: (Maybe ModuleName),
-    -- | Optional import specification
-    importSpec :: (Maybe SpecImport)}
-  deriving (Eq, Ord, Read, Show)
-
-_Import = (Core.Name "hydra.ext.haskell.ast.Import")
-
-_Import_qualified = (Core.Name "qualified")
-
-_Import_module = (Core.Name "module")
-
-_Import_as = (Core.Name "as")
-
-_Import_spec = (Core.Name "spec")
-
--- | An import specification
-data SpecImport = 
-  -- | A list of imports to include
-  SpecImportList [ImportExportSpec] |
-  -- | A list of imports to exclude
-  SpecImportHiding [ImportExportSpec]
-  deriving (Eq, Ord, Read, Show)
-
-_SpecImport = (Core.Name "hydra.ext.haskell.ast.SpecImport")
-
-_SpecImport_list = (Core.Name "list")
-
-_SpecImport_hiding = (Core.Name "hiding")
-
--- | An import modifier ('pattern' or 'type')
-data ImportModifier = 
-  ImportModifierPattern  |
-  ImportModifierType 
-  deriving (Eq, Ord, Read, Show)
-
-_ImportModifier = (Core.Name "hydra.ext.haskell.ast.ImportModifier")
-
-_ImportModifier_pattern = (Core.Name "pattern")
-
-_ImportModifier_type = (Core.Name "type")
-
--- | An import or export specification
-data ImportExportSpec = 
-  ImportExportSpec {
-    -- | Optional import modifier
-    importExportSpecModifier :: (Maybe ImportModifier),
-    -- | The name being imported or exported
-    importExportSpecName :: Name,
-    -- | Optional subspecification
-    importExportSpecSubspec :: (Maybe SubspecImportExportSpec)}
-  deriving (Eq, Ord, Read, Show)
-
-_ImportExportSpec = (Core.Name "hydra.ext.haskell.ast.ImportExportSpec")
-
-_ImportExportSpec_modifier = (Core.Name "modifier")
-
-_ImportExportSpec_name = (Core.Name "name")
-
-_ImportExportSpec_subspec = (Core.Name "subspec")
-
--- | A subspecification within an import/export
-data SubspecImportExportSpec = 
-  -- | Import/export all
-  SubspecImportExportSpecAll  |
-  -- | Import/export specific names
-  SubspecImportExportSpecList [Name]
-  deriving (Eq, Ord, Read, Show)
-
-_SubspecImportExportSpec = (Core.Name "hydra.ext.haskell.ast.SubspecImportExportSpec")
-
-_SubspecImportExportSpec_all = (Core.Name "all")
-
-_SubspecImportExportSpec_list = (Core.Name "list")
-
--- | A literal value
-data Literal = 
-  -- | A character literal
-  LiteralChar Int |
-  -- | A double-precision floating point literal
-  LiteralDouble Double |
-  -- | A single-precision floating point literal
-  LiteralFloat Float |
-  -- | A 32-bit integer literal
-  LiteralInt Int |
-  -- | An arbitrary-precision integer literal
-  LiteralInteger Integer |
-  -- | A string literal
-  LiteralString String
-  deriving (Eq, Ord, Read, Show)
-
-_Literal = (Core.Name "hydra.ext.haskell.ast.Literal")
-
-_Literal_char = (Core.Name "char")
-
-_Literal_double = (Core.Name "double")
-
-_Literal_float = (Core.Name "float")
-
-_Literal_int = (Core.Name "int")
-
-_Literal_integer = (Core.Name "integer")
-
-_Literal_string = (Core.Name "string")
-
--- | A local binding
-data LocalBinding = 
-  -- | A type signature
-  LocalBindingSignature TypeSignature |
-  -- | A value binding
-  LocalBindingValue ValueBinding
-  deriving (Eq, Ord, Read, Show)
-
-_LocalBinding = (Core.Name "hydra.ext.haskell.ast.LocalBinding")
-
-_LocalBinding_signature = (Core.Name "signature")
-
-_LocalBinding_value = (Core.Name "value")
-
--- | A collection of local bindings
-newtype LocalBindings = 
-  LocalBindings {
-    unLocalBindings :: [LocalBinding]}
-  deriving (Eq, Ord, Read, Show)
-
-_LocalBindings = (Core.Name "hydra.ext.haskell.ast.LocalBindings")
-
--- | A Haskell module
-data Module = 
-  Module {
-    -- | Optional module head
-    moduleHead :: (Maybe ModuleHead),
-    -- | Import statements
-    moduleImports :: [Import],
-    -- | Module declarations
-    moduleDeclarations :: [DeclarationWithComments]}
-  deriving (Eq, Ord, Read, Show)
-
-_Module = (Core.Name "hydra.ext.haskell.ast.Module")
-
-_Module_head = (Core.Name "head")
-
-_Module_imports = (Core.Name "imports")
-
-_Module_declarations = (Core.Name "declarations")
-
--- | A module head
-data ModuleHead = 
-  ModuleHead {
-    -- | Optional module-level comments
-    moduleHeadComments :: (Maybe String),
-    -- | The module name
-    moduleHeadName :: ModuleName,
-    -- | Export list
-    moduleHeadExports :: [Export]}
-  deriving (Eq, Ord, Read, Show)
-
-_ModuleHead = (Core.Name "hydra.ext.haskell.ast.ModuleHead")
-
-_ModuleHead_comments = (Core.Name "comments")
-
-_ModuleHead_name = (Core.Name "name")
-
-_ModuleHead_exports = (Core.Name "exports")
-
--- | A module name
-newtype ModuleName = 
-  ModuleName {
-    unModuleName :: String}
-  deriving (Eq, Ord, Read, Show)
-
-_ModuleName = (Core.Name "hydra.ext.haskell.ast.ModuleName")
-
--- | A name
-data Name = 
-  -- | An implicit name
-  NameImplicit QualifiedName |
-  -- | A normal name
-  NameNormal QualifiedName |
-  -- | A parenthesized name
-  NameParens QualifiedName
-  deriving (Eq, Ord, Read, Show)
-
-_Name = (Core.Name "hydra.ext.haskell.ast.Name")
-
-_Name_implicit = (Core.Name "implicit")
-
-_Name_normal = (Core.Name "normal")
-
-_Name_parens = (Core.Name "parens")
-
--- | A component of a qualified name
-newtype NamePart = 
-  NamePart {
-    unNamePart :: String}
-  deriving (Eq, Ord, Read, Show)
-
-_NamePart = (Core.Name "hydra.ext.haskell.ast.NamePart")
-
--- | An operator
-data Operator = 
-  -- | A function used as an infix operator
-  OperatorBacktick QualifiedName |
-  -- | A normal infix operator
-  OperatorNormal QualifiedName
-  deriving (Eq, Ord, Read, Show)
-
-_Operator = (Core.Name "hydra.ext.haskell.ast.Operator")
-
-_Operator_backtick = (Core.Name "backtick")
-
-_Operator_normal = (Core.Name "normal")
-
--- | A pattern
-data Pattern = 
-  -- | An application pattern
-  PatternApplication ApplicationPattern |
-  -- | An 'as' pattern
-  PatternAs AsPattern |
-  -- | A list pattern
-  PatternList [Pattern] |
-  -- | A literal pattern
-  PatternLiteral Literal |
-  -- | A name pattern
-  PatternName Name |
-  -- | A parenthesized pattern
-  PatternParens Pattern |
-  -- | A record pattern
-  PatternRecord RecordPattern |
-  -- | A tuple pattern
-  PatternTuple [Pattern] |
-  -- | A typed pattern
-  PatternTyped TypedPattern |
-  -- | A wildcard pattern
-  PatternWildcard 
-  deriving (Eq, Ord, Read, Show)
-
-_Pattern = (Core.Name "hydra.ext.haskell.ast.Pattern")
-
-_Pattern_application = (Core.Name "application")
-
-_Pattern_as = (Core.Name "as")
-
-_Pattern_list = (Core.Name "list")
-
-_Pattern_literal = (Core.Name "literal")
-
-_Pattern_name = (Core.Name "name")
-
-_Pattern_parens = (Core.Name "parens")
-
-_Pattern_record = (Core.Name "record")
-
-_Pattern_tuple = (Core.Name "tuple")
-
-_Pattern_typed = (Core.Name "typed")
-
-_Pattern_wildcard = (Core.Name "wildcard")
-
--- | An application pattern
-data ApplicationPattern = 
-  ApplicationPattern {
-    -- | The constructor name
-    applicationPatternName :: Name,
-    -- | The pattern arguments
-    applicationPatternArgs :: [Pattern]}
-  deriving (Eq, Ord, Read, Show)
-
-_ApplicationPattern = (Core.Name "hydra.ext.haskell.ast.ApplicationPattern")
-
-_ApplicationPattern_name = (Core.Name "name")
-
-_ApplicationPattern_args = (Core.Name "args")
-
--- | An 'as' pattern
-data AsPattern = 
-  AsPattern {
-    -- | The bound name
-    asPatternName :: Name,
-    -- | The inner pattern
-    asPatternInner :: Pattern}
-  deriving (Eq, Ord, Read, Show)
-
-_AsPattern = (Core.Name "hydra.ext.haskell.ast.AsPattern")
-
-_AsPattern_name = (Core.Name "name")
-
-_AsPattern_inner = (Core.Name "inner")
-
--- | A record pattern
-data RecordPattern = 
-  RecordPattern {
-    -- | The constructor name
-    recordPatternName :: Name,
-    -- | The field patterns
-    recordPatternFields :: [PatternField]}
-  deriving (Eq, Ord, Read, Show)
-
-_RecordPattern = (Core.Name "hydra.ext.haskell.ast.RecordPattern")
-
-_RecordPattern_name = (Core.Name "name")
-
-_RecordPattern_fields = (Core.Name "fields")
-
--- | A typed pattern
-data TypedPattern = 
-  TypedPattern {
-    -- | The inner pattern
-    typedPatternInner :: Pattern,
-    -- | The type annotation
-    typedPatternType :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_TypedPattern = (Core.Name "hydra.ext.haskell.ast.TypedPattern")
-
-_TypedPattern_inner = (Core.Name "inner")
-
-_TypedPattern_type = (Core.Name "type")
-
--- | A pattern field
-data PatternField = 
-  PatternField {
-    -- | The field name
-    patternFieldName :: Name,
-    -- | The field pattern
-    patternFieldPattern :: Pattern}
-  deriving (Eq, Ord, Read, Show)
-
-_PatternField = (Core.Name "hydra.ext.haskell.ast.PatternField")
-
-_PatternField_name = (Core.Name "name")
-
-_PatternField_pattern = (Core.Name "pattern")
-
--- | A qualified name
-data QualifiedName = 
-  QualifiedName {
-    -- | The qualifier parts
-    qualifiedNameQualifiers :: [NamePart],
-    -- | The unqualified name part
-    qualifiedNameUnqualified :: NamePart}
-  deriving (Eq, Ord, Read, Show)
-
-_QualifiedName = (Core.Name "hydra.ext.haskell.ast.QualifiedName")
-
-_QualifiedName_qualifiers = (Core.Name "qualifiers")
-
-_QualifiedName_unqualified = (Core.Name "unqualified")
-
--- | A right-hand side of a binding
-newtype RightHandSide = 
-  RightHandSide {
-    unRightHandSide :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_RightHandSide = (Core.Name "hydra.ext.haskell.ast.RightHandSide")
-
--- | A do-notation statement
-newtype Statement = 
-  Statement {
-    unStatement :: Expression}
-  deriving (Eq, Ord, Read, Show)
-
-_Statement = (Core.Name "hydra.ext.haskell.ast.Statement")
-
--- | A type expression
-data Type = 
-  -- | An application type
-  TypeApplication ApplicationType |
-  -- | A context type
-  TypeCtx ContextType |
-  -- | A function type
-  TypeFunction FunctionType |
-  -- | An infix type
-  TypeInfix InfixType |
-  -- | A list type
-  TypeList Type |
-  -- | A parenthesized type
-  TypeParens Type |
-  -- | A tuple type
-  TypeTuple [Type] |
-  -- | A type variable or type name
-  TypeVariable Name
-  deriving (Eq, Ord, Read, Show)
-
-_Type = (Core.Name "hydra.ext.haskell.ast.Type")
-
-_Type_application = (Core.Name "application")
-
-_Type_ctx = (Core.Name "ctx")
-
-_Type_function = (Core.Name "function")
-
-_Type_infix = (Core.Name "infix")
-
-_Type_list = (Core.Name "list")
-
-_Type_parens = (Core.Name "parens")
-
-_Type_tuple = (Core.Name "tuple")
-
-_Type_variable = (Core.Name "variable")
-
--- | An application type
-data ApplicationType = 
-  ApplicationType {
-    -- | The type being applied
-    applicationTypeContext :: Type,
-    -- | The type argument
-    applicationTypeArgument :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_ApplicationType = (Core.Name "hydra.ext.haskell.ast.ApplicationType")
-
-_ApplicationType_context = (Core.Name "context")
-
-_ApplicationType_argument = (Core.Name "argument")
-
--- | A type with a context (type class constraints)
-data ContextType = 
-  ContextType {
-    -- | The type class context
-    contextTypeCtx :: Assertion,
-    -- | The constrained type
-    contextTypeType :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_ContextType = (Core.Name "hydra.ext.haskell.ast.ContextType")
-
-_ContextType_ctx = (Core.Name "ctx")
-
-_ContextType_type = (Core.Name "type")
-
--- | A function type
-data FunctionType = 
-  FunctionType {
-    -- | The domain type
-    functionTypeDomain :: Type,
-    -- | The codomain type
-    functionTypeCodomain :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_FunctionType = (Core.Name "hydra.ext.haskell.ast.FunctionType")
-
-_FunctionType_domain = (Core.Name "domain")
-
-_FunctionType_codomain = (Core.Name "codomain")
-
--- | An infix type application
-data InfixType = 
-  InfixType {
-    -- | The left-hand type
-    infixTypeLhs :: Type,
-    -- | The type operator
-    infixTypeOperator :: Operator,
-    -- | The right-hand operator
-    infixTypeRhs :: Operator}
-  deriving (Eq, Ord, Read, Show)
-
-_InfixType = (Core.Name "hydra.ext.haskell.ast.InfixType")
-
-_InfixType_lhs = (Core.Name "lhs")
-
-_InfixType_operator = (Core.Name "operator")
-
-_InfixType_rhs = (Core.Name "rhs")
-
--- | A type synonym declaration
-data TypeDeclaration = 
-  TypeDeclaration {
-    -- | The declaration head
-    typeDeclarationName :: DeclarationHead,
-    -- | The type being defined
-    typeDeclarationType :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_TypeDeclaration = (Core.Name "hydra.ext.haskell.ast.TypeDeclaration")
-
-_TypeDeclaration_name = (Core.Name "name")
-
-_TypeDeclaration_type = (Core.Name "type")
-
--- | A type signature
-data TypeSignature = 
-  TypeSignature {
-    -- | The name being typed
-    typeSignatureName :: Name,
-    -- | The type
-    typeSignatureType :: Type}
-  deriving (Eq, Ord, Read, Show)
-
-_TypeSignature = (Core.Name "hydra.ext.haskell.ast.TypeSignature")
-
-_TypeSignature_name = (Core.Name "name")
-
-_TypeSignature_type = (Core.Name "type")
-
--- | A binding with its type signature
-data TypedBinding = 
-  TypedBinding {
-    -- | The type signature
-    typedBindingTypeSignature :: TypeSignature,
-    -- | The value binding
-    typedBindingValueBinding :: ValueBinding}
-  deriving (Eq, Ord, Read, Show)
-
-_TypedBinding = (Core.Name "hydra.ext.haskell.ast.TypedBinding")
-
-_TypedBinding_typeSignature = (Core.Name "typeSignature")
-
-_TypedBinding_valueBinding = (Core.Name "valueBinding")
-
--- | A value binding
-data ValueBinding = 
-  -- | A simple value binding
-  ValueBindingSimple SimpleValueBinding
-  deriving (Eq, Ord, Read, Show)
-
-_ValueBinding = (Core.Name "hydra.ext.haskell.ast.ValueBinding")
-
-_ValueBinding_simple = (Core.Name "simple")
-
--- | A simple value binding
-data SimpleValueBinding = 
-  SimpleValueBinding {
-    -- | The pattern being bound
-    simpleValueBindingPattern :: Pattern,
-    -- | The right-hand side
-    simpleValueBindingRhs :: RightHandSide,
-    -- | Optional local bindings (where clause)
-    simpleValueBindingLocalBindings :: (Maybe LocalBindings)}
-  deriving (Eq, Ord, Read, Show)
-
-_SimpleValueBinding = (Core.Name "hydra.ext.haskell.ast.SimpleValueBinding")
-
-_SimpleValueBinding_pattern = (Core.Name "pattern")
-
-_SimpleValueBinding_rhs = (Core.Name "rhs")
-
-_SimpleValueBinding_localBindings = (Core.Name "localBindings")
-
--- | A type variable
-newtype Variable = 
-  Variable {
-    unVariable :: Name}
-  deriving (Eq, Ord, Read, Show)
-
-_Variable = (Core.Name "hydra.ext.haskell.ast.Variable")
diff --git a/src/gen-main/haskell/Hydra/Ext/Haskell/Coder.hs b/src/gen-main/haskell/Hydra/Ext/Haskell/Coder.hs
--- a/src/gen-main/haskell/Hydra/Ext/Haskell/Coder.hs
+++ b/src/gen-main/haskell/Hydra/Ext/Haskell/Coder.hs
@@ -4,692 +4,780 @@
 
 module Hydra.Ext.Haskell.Coder where
 
-import qualified Hydra.Adapt.Modules as Modules
-import qualified Hydra.Annotations as Annotations
-import qualified Hydra.Classes as Classes
-import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Constants as Constants
-import qualified Hydra.Core as Core
-import qualified Hydra.Encode.Core as Core_
-import qualified Hydra.Ext.Haskell.Ast as Ast
-import qualified Hydra.Ext.Haskell.Language as Language
-import qualified Hydra.Ext.Haskell.Serde as Serde
-import qualified Hydra.Ext.Haskell.Utils as Utils
-import qualified Hydra.Formatting as Formatting
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Module as Module
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Names as Names
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Serialization as Serialization
-import qualified Hydra.Show.Core as Core__
-import qualified Hydra.Util as Util
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Whether to include type definitions in generated Haskell modules
-includeTypeDefinitions :: Bool
-includeTypeDefinitions = False
-
--- | Whether to use the Hydra core import in generated modules
-useCoreImport :: Bool
-useCoreImport = True
-
--- | The key used to track Haskell variable depth in annotations
-keyHaskellVar :: Core.Name
-keyHaskellVar = (Core.Name "haskellVar")
-
--- | Adapt a Hydra type to Haskell's type system and encode it
-adaptTypeToHaskellAndEncode :: (Module.Namespaces Ast.ModuleName -> Core.Type -> Compute.Flow Graph.Graph Ast.Type)
-adaptTypeToHaskellAndEncode namespaces = (Modules.adaptTypeToLanguageAndEncode Language.haskellLanguage (encodeType namespaces))
-
--- | Generate a constant name for a field (e.g., '_TypeName_fieldName')
-constantForFieldName :: (Core.Name -> Core.Name -> String)
-constantForFieldName tname fname = (Strings.cat [
-  "_",
-  (Names.localNameOf tname),
-  "_",
-  (Core.unName fname)])
-
--- | Generate a constant name for a type (e.g., '_TypeName')
-constantForTypeName :: (Core.Name -> String)
-constantForTypeName tname = (Strings.cat2 "_" (Names.localNameOf tname))
-
--- | Construct a Haskell module from a Hydra module and its definitions
-constructModule :: (Module.Namespaces Ast.ModuleName -> Module.Module -> [Module.Definition] -> Compute.Flow Graph.Graph Ast.Module)
-constructModule namespaces mod defs =  
-  let h = (\namespace -> Module.unNamespace namespace) 
-      createDeclarations = (\g -> \def -> (\x -> case x of
-              Module.DefinitionType v1 ->  
-                let name = (Module.typeDefinitionName v1) 
-                    typ = (Module.typeDefinitionType v1)
-                in (toTypeDeclarationsFrom namespaces name typ)
-              Module.DefinitionTerm v1 -> (Flows.bind (toDataDeclaration namespaces v1) (\d -> Flows.pure [
-                d]))) def)
-      importName = (\name -> Ast.ModuleName (Strings.intercalate "." (Lists.map Formatting.capitalize (Strings.splitOn "." name))))
-      imports = (Lists.concat2 domainImports standardImports)
-      domainImports =  
-              let toImport = (\pair ->  
-                      let namespace = (Pairs.first pair) 
-                          alias = (Pairs.second pair)
-                          name = (h namespace)
-                      in Ast.Import {
-                        Ast.importQualified = True,
-                        Ast.importModule = (importName name),
-                        Ast.importAs = (Just alias),
-                        Ast.importSpec = Nothing})
-              in (Lists.map toImport (Maps.toList (Module.namespacesMapping namespaces)))
-      standardImports =  
-              let toImport = (\triple ->  
-                      let name = (Pairs.first (Pairs.first triple)) 
-                          malias = (Pairs.second (Pairs.first triple))
-                          hidden = (Pairs.second triple)
-                          spec = (Logic.ifElse (Lists.null hidden) Nothing (Just (Ast.SpecImportHiding (Lists.map (\n -> Ast.ImportExportSpec {
-                                  Ast.importExportSpecModifier = Nothing,
-                                  Ast.importExportSpecName = (Utils.simpleName n),
-                                  Ast.importExportSpecSubspec = Nothing}) hidden))))
-                      in Ast.Import {
-                        Ast.importQualified = (Maybes.isJust malias),
-                        Ast.importModule = (Ast.ModuleName name),
-                        Ast.importAs = (Maybes.map (\x -> Ast.ModuleName x) malias),
-                        Ast.importSpec = spec})
-              in (Lists.map toImport (Lists.concat2 [
-                (("Prelude", Nothing), [
-                  "Enum",
-                  "Ordering",
-                  "decodeFloat",
-                  "encodeFloat",
-                  "fail",
-                  "map",
-                  "pure",
-                  "sum"]),
-                (("Data.ByteString", (Just "B")), []),
-                (("Data.Int", (Just "I")), []),
-                (("Data.List", (Just "L")), []),
-                (("Data.Map", (Just "M")), []),
-                (("Data.Set", (Just "S")), [])] (Logic.ifElse (Schemas.moduleContainsBinaryLiterals mod) [
-                (("Hydra.Lib.Literals", (Just "Literals")), [])] [])))
-  in (Flows.bind Monads.getState (\g -> Flows.bind (Flows.mapList (createDeclarations g) defs) (\declLists ->  
-    let decls = (Lists.concat declLists) 
-        mc = (Module.moduleDescription mod)
-    in (Flows.pure (Ast.Module {
-      Ast.moduleHead = (Just (Ast.ModuleHead {
-        Ast.moduleHeadComments = mc,
-        Ast.moduleHeadName = (importName (h (Module.moduleNamespace mod))),
-        Ast.moduleHeadExports = []})),
-      Ast.moduleImports = imports,
-      Ast.moduleDeclarations = decls})))))
-
--- | Encode a Hydra function as a Haskell expression
-encodeFunction :: (Module.Namespaces Ast.ModuleName -> Core.Function -> Compute.Flow Graph.Graph Ast.Expression)
-encodeFunction namespaces fun = ((\x -> case x of
-  Core.FunctionElimination v1 -> ((\x -> case x of
-    Core.EliminationWrap v2 -> (Flows.pure (Ast.ExpressionVariable (Utils.elementReference namespaces (Names.qname (Maybes.fromJust (Names.namespaceOf v2)) (Utils.newtypeAccessorName v2)))))
-    Core.EliminationRecord v2 ->  
-      let dn = (Core.projectionTypeName v2) 
-          fname = (Core.projectionField v2)
-      in (Flows.pure (Ast.ExpressionVariable (Utils.recordFieldReference namespaces dn fname)))
-    Core.EliminationUnion v2 ->  
-      let dn = (Core.caseStatementTypeName v2) 
-          def = (Core.caseStatementDefault v2)
-          fields = (Core.caseStatementCases v2)
-          caseExpr = (Flows.bind (Lexical.withSchemaContext (Schemas.requireUnionType dn)) (\rt ->  
-                  let toFieldMapEntry = (\f -> (Core.fieldTypeName f, f)) 
-                      fieldMap = (Maps.fromList (Lists.map toFieldMapEntry (Core.rowTypeFields rt)))
-                  in (Flows.bind (Flows.mapList (toAlt fieldMap) fields) (\ecases -> Flows.bind (Maybes.cases def (Flows.pure []) (\d -> Flows.bind (Flows.map (\x -> Ast.CaseRhs x) (encodeTerm namespaces d)) (\cs ->  
-                    let lhs = (Ast.PatternName (Utils.rawName Constants.ignoredVariable)) 
-                        alt = Ast.Alternative {
-                                Ast.alternativePattern = lhs,
-                                Ast.alternativeRhs = cs,
-                                Ast.alternativeBinds = Nothing}
-                    in (Flows.pure [
-                      alt])))) (\dcases -> Flows.pure (Ast.ExpressionCase (Ast.CaseExpression {
-                    Ast.caseExpressionCase = (Utils.hsvar "x"),
-                    Ast.caseExpressionAlternatives = (Lists.concat2 ecases dcases)})))))))
-          toAlt = (\fieldMap -> \field ->  
-                  let fn = (Core.fieldName field) 
-                      fun_ = (Core.fieldTerm field)
-                  in (Annotations.withDepth keyHaskellVar (\depth ->  
-                    let v0 = (Strings.cat2 "v" (Literals.showInt32 depth)) 
-                        raw = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = fun_,
-                                Core.applicationArgument = (Core.TermVariable (Core.Name v0))}))
-                        rhsTerm = (Rewriting.simplifyTerm raw)
-                        v1 = (Logic.ifElse (Rewriting.isFreeVariableInTerm (Core.Name v0) rhsTerm) Constants.ignoredVariable v0)
-                    in (Flows.bind Monads.getState (\g_ufr ->  
-                      let hname = (Utils.unionFieldReference g_ufr namespaces dn fn)
-                      in (Flows.bind (Maybes.cases (Maps.lookup fn fieldMap) (Flows.fail (Strings.cat [
-                        "field ",
-                        (Literals.showString (Core.unName fn)),
-                        " not found in ",
-                        (Literals.showString (Core.unName dn))])) (\fieldType ->  
-                        let ft = (Core.fieldTypeType fieldType) 
-                            noArgs = (Flows.pure [])
-                            singleArg = (Flows.pure [
-                                    Ast.PatternName (Utils.rawName v1)])
-                        in ((\x -> case x of
-                          Core.TypeUnit -> noArgs
-                          _ -> singleArg) (Rewriting.deannotateType ft)))) (\args ->  
-                        let lhs = (Utils.applicationPattern hname args)
-                        in (Flows.bind (Flows.map (\x -> Ast.CaseRhs x) (encodeTerm namespaces rhsTerm)) (\rhs -> Flows.pure (Ast.Alternative {
-                          Ast.alternativePattern = lhs,
-                          Ast.alternativeRhs = rhs,
-                          Ast.alternativeBinds = Nothing}))))))))))
-      in (Flows.map (Utils.hslambda (Utils.rawName "x")) caseExpr)) v1)
-  Core.FunctionLambda v1 ->  
-    let v = (Core.lambdaParameter v1) 
-        body = (Core.lambdaBody v1)
-    in (Flows.bind (encodeTerm namespaces body) (\hbody -> Flows.pure (Utils.hslambda (Utils.elementReference namespaces v) hbody)))
-  Core.FunctionPrimitive v1 -> (Flows.pure (Ast.ExpressionVariable (Utils.elementReference namespaces v1)))) fun)
-
--- | Encode a Hydra literal as a Haskell expression
-encodeLiteral :: (Core.Literal -> Compute.Flow t0 Ast.Expression)
-encodeLiteral l = ((\x -> case x of
-  Core.LiteralBinary v1 -> (Flows.pure (Utils.hsapp (Utils.hsvar "Literals.stringToBinary") (Utils.hslit (Ast.LiteralString (Literals.binaryToString v1)))))
-  Core.LiteralBoolean v1 -> (Flows.pure (Utils.hsvar (Logic.ifElse v1 "True" "False")))
-  Core.LiteralFloat v1 -> ((\x -> case x of
-    Core.FloatValueFloat32 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralFloat v2)))
-    Core.FloatValueFloat64 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralDouble v2)))
-    Core.FloatValueBigfloat v2 -> (Flows.pure (Utils.hslit (Ast.LiteralDouble (Literals.bigfloatToFloat64 v2))))) v1)
-  Core.LiteralInteger v1 -> ((\x -> case x of
-    Core.IntegerValueBigint v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInteger v2)))
-    Core.IntegerValueInt8 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInteger (Literals.int8ToBigint v2))))
-    Core.IntegerValueInt16 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInteger (Literals.int16ToBigint v2))))
-    Core.IntegerValueInt32 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInt v2)))
-    Core.IntegerValueInt64 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInteger (Literals.int64ToBigint v2))))
-    Core.IntegerValueUint8 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInteger (Literals.uint8ToBigint v2))))
-    Core.IntegerValueUint16 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInteger (Literals.uint16ToBigint v2))))
-    Core.IntegerValueUint32 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInteger (Literals.uint32ToBigint v2))))
-    Core.IntegerValueUint64 v2 -> (Flows.pure (Utils.hslit (Ast.LiteralInteger (Literals.uint64ToBigint v2))))) v1)
-  Core.LiteralString v1 -> (Flows.pure (Utils.hslit (Ast.LiteralString v1)))
-  _ -> (Flows.fail (Strings.cat2 "literal value " (Core__.literal l)))) l)
-
--- | Encode a Hydra term as a Haskell expression
-encodeTerm :: (Module.Namespaces Ast.ModuleName -> Core.Term -> Compute.Flow Graph.Graph Ast.Expression)
-encodeTerm namespaces term =  
-  let encode = (encodeTerm namespaces)
-  in  
-    let nonemptyMap = (\m ->  
-            let lhs = (Utils.hsvar "M.fromList") 
-                encodePair = (\pair ->  
-                        let k = (Pairs.first pair) 
-                            v = (Pairs.second pair)
-                            hk = (encode k)
-                            hv = (encode v)
-                        in (Flows.map (\x -> Ast.ExpressionTuple x) (Flows.sequence [
-                          hk,
-                          hv])))
-            in (Flows.bind (Flows.map (\x -> Ast.ExpressionList x) (Flows.mapList encodePair (Maps.toList m))) (\rhs -> Flows.pure (Utils.hsapp lhs rhs))))
-    in  
-      let nonemptySet = (\s ->  
-              let lhs = (Utils.hsvar "S.fromList")
-              in (Flows.bind (encodeTerm namespaces (Core.TermList (Sets.toList s))) (\rhs -> Flows.pure (Utils.hsapp lhs rhs))))
-      in ((\x -> case x of
-        Core.TermApplication v1 ->  
-          let fun = (Core.applicationFunction v1) 
-              arg = (Core.applicationArgument v1)
-          in (Flows.bind (encode fun) (\hfun -> Flows.bind (encode arg) (\harg -> Flows.pure (Utils.hsapp hfun harg))))
-        Core.TermEither v1 -> (Eithers.either (\l -> Flows.bind (encode l) (\hl -> Flows.pure (Utils.hsapp (Utils.hsvar "Left") hl))) (\r -> Flows.bind (encode r) (\hr -> Flows.pure (Utils.hsapp (Utils.hsvar "Right") hr))) v1)
-        Core.TermFunction v1 -> (encodeFunction namespaces v1)
-        Core.TermLet v1 ->  
-          let bindings = (Core.letBindings v1) 
-              env = (Core.letBody v1)
-              encodeBinding = (\binding ->  
-                      let name = (Core.bindingName binding) 
-                          term_ = (Core.bindingTerm binding)
-                          hname = (Utils.simpleName (Core.unName name))
-                      in (Flows.bind (encode term_) (\hexpr -> Flows.pure (Ast.LocalBindingValue (Utils.simpleValueBinding hname hexpr Nothing)))))
-          in (Flows.bind (Flows.mapList encodeBinding bindings) (\hbindings -> Flows.bind (encode env) (\hinner -> Flows.pure (Ast.ExpressionLet (Ast.LetExpression {
-            Ast.letExpressionBindings = hbindings,
-            Ast.letExpressionInner = hinner})))))
-        Core.TermList v1 -> (Flows.bind (Flows.mapList encode v1) (\helems -> Flows.pure (Ast.ExpressionList helems)))
-        Core.TermLiteral v1 -> (encodeLiteral v1)
-        Core.TermMap v1 -> (Logic.ifElse (Maps.null v1) (Flows.pure (Utils.hsvar "M.empty")) (nonemptyMap v1))
-        Core.TermMaybe v1 -> (Maybes.cases v1 (Flows.pure (Utils.hsvar "Nothing")) (\t -> Flows.bind (encode t) (\ht -> Flows.pure (Utils.hsapp (Utils.hsvar "Just") ht))))
-        Core.TermPair v1 -> (Flows.bind (encode (Pairs.first v1)) (\f -> Flows.bind (encode (Pairs.second v1)) (\s -> Flows.pure (Ast.ExpressionTuple [
-          f,
-          s]))))
-        Core.TermRecord v1 ->  
-          let sname = (Core.recordTypeName v1) 
-              fields = (Core.recordFields v1)
-              toFieldUpdate = (\field ->  
-                      let fn = (Core.fieldName field) 
-                          ft = (Core.fieldTerm field)
-                          fieldRef = (Utils.recordFieldReference namespaces sname fn)
-                      in (Flows.bind (encode ft) (\hft -> Flows.pure (Ast.FieldUpdate {
-                        Ast.fieldUpdateName = fieldRef,
-                        Ast.fieldUpdateValue = hft}))))
-              typeName = (Utils.elementReference namespaces sname)
-          in (Flows.bind (Flows.mapList toFieldUpdate fields) (\updates -> Flows.pure (Ast.ExpressionConstructRecord (Ast.ConstructRecordExpression {
-            Ast.constructRecordExpressionName = typeName,
-            Ast.constructRecordExpressionFields = updates}))))
-        Core.TermSet v1 -> (Logic.ifElse (Sets.null v1) (Flows.pure (Utils.hsvar "S.empty")) (nonemptySet v1))
-        Core.TermTypeLambda v1 ->  
-          let term1 = (Core.typeLambdaBody v1)
-          in (encode term1)
-        Core.TermTypeApplication v1 ->  
-          let term1 = (Core.typeApplicationTermBody v1)
-          in (encode term1)
-        Core.TermUnion v1 ->  
-          let sname = (Core.injectionTypeName v1) 
-              field = (Core.injectionField v1)
-              fn = (Core.fieldName field)
-              ft = (Core.fieldTerm field)
-          in (Flows.bind Monads.getState (\g_ufr2 ->  
-            let lhs = (Ast.ExpressionVariable (Utils.unionFieldReference g_ufr2 namespaces sname fn)) 
-                dflt = (Flows.map (Utils.hsapp lhs) (encode ft))
-            in (Flows.bind (Schemas.requireUnionField sname fn) (\ftyp -> (\x -> case x of
-              Core.TypeUnit -> (Flows.pure lhs)
-              _ -> dflt) (Rewriting.deannotateType ftyp)))))
-        Core.TermUnit -> (Flows.pure (Ast.ExpressionTuple []))
-        Core.TermVariable v1 -> (Flows.pure (Ast.ExpressionVariable (Utils.elementReference namespaces v1)))
-        Core.TermWrap v1 ->  
-          let tname = (Core.wrappedTermTypeName v1) 
-              term_ = (Core.wrappedTermBody v1)
-              lhs = (Ast.ExpressionVariable (Utils.elementReference namespaces tname))
-          in (Flows.bind (encode term_) (\rhs -> Flows.pure (Utils.hsapp lhs rhs)))
-        _ -> (Flows.fail (Strings.cat2 "unexpected term: " (Core__.term term)))) (Rewriting.deannotateTerm term))
-
--- | Encode a Hydra type as a Haskell type
-encodeType :: (Module.Namespaces Ast.ModuleName -> Core.Type -> Compute.Flow t0 Ast.Type)
-encodeType namespaces typ =  
-  let encode = (encodeType namespaces) 
-      ref = (\name -> Flows.pure (Ast.TypeVariable (Utils.elementReference namespaces name)))
-      unitTuple = (Ast.TypeTuple [])
-  in (Monads.withTrace "encode type" ((\x -> case x of
-    Core.TypeApplication v1 ->  
-      let lhs = (Core.applicationTypeFunction v1) 
-          rhs = (Core.applicationTypeArgument v1)
-      in (Flows.bind (encode lhs) (\hlhs -> Flows.bind (encode rhs) (\hrhs -> Flows.pure (Utils.toTypeApplication [
-        hlhs,
-        hrhs]))))
-    Core.TypeEither v1 ->  
-      let left = (Core.eitherTypeLeft v1) 
-          right = (Core.eitherTypeRight v1)
-      in (Flows.map Utils.toTypeApplication (Flows.sequence [
-        Flows.pure (Ast.TypeVariable (Utils.rawName "Either")),
-        (encode left),
-        (encode right)]))
-    Core.TypeFunction v1 ->  
-      let dom = (Core.functionTypeDomain v1) 
-          cod = (Core.functionTypeCodomain v1)
-      in (Flows.bind (encode dom) (\hdom -> Flows.bind (encode cod) (\hcod -> Flows.pure (Ast.TypeFunction (Ast.FunctionType {
-        Ast.functionTypeDomain = hdom,
-        Ast.functionTypeCodomain = hcod})))))
-    Core.TypeForall v1 ->  
-      let v = (Core.forallTypeParameter v1) 
-          body = (Core.forallTypeBody v1)
-      in (encode body)
-    Core.TypeList v1 -> (Flows.bind (encode v1) (\hlt -> Flows.pure (Ast.TypeList hlt)))
-    Core.TypeLiteral v1 -> ((\x -> case x of
-      Core.LiteralTypeBinary -> (Flows.pure (Ast.TypeVariable (Utils.rawName "B.ByteString")))
-      Core.LiteralTypeBoolean -> (Flows.pure (Ast.TypeVariable (Utils.rawName "Bool")))
-      Core.LiteralTypeFloat v2 -> ((\x -> case x of
-        Core.FloatTypeFloat32 -> (Flows.pure (Ast.TypeVariable (Utils.rawName "Float")))
-        Core.FloatTypeFloat64 -> (Flows.pure (Ast.TypeVariable (Utils.rawName "Double")))
-        Core.FloatTypeBigfloat -> (Flows.pure (Ast.TypeVariable (Utils.rawName "Double")))) v2)
-      Core.LiteralTypeInteger v2 -> ((\x -> case x of
-        Core.IntegerTypeBigint -> (Flows.pure (Ast.TypeVariable (Utils.rawName "Integer")))
-        Core.IntegerTypeInt8 -> (Flows.pure (Ast.TypeVariable (Utils.rawName "I.Int8")))
-        Core.IntegerTypeInt16 -> (Flows.pure (Ast.TypeVariable (Utils.rawName "I.Int16")))
-        Core.IntegerTypeInt32 -> (Flows.pure (Ast.TypeVariable (Utils.rawName "Int")))
-        Core.IntegerTypeInt64 -> (Flows.pure (Ast.TypeVariable (Utils.rawName "I.Int64")))
-        _ -> (Flows.fail (Strings.cat2 "unexpected integer type: " (Core__.integerType v2)))) v2)
-      Core.LiteralTypeString -> (Flows.pure (Ast.TypeVariable (Utils.rawName "String")))
-      _ -> (Flows.fail (Strings.cat2 "unexpected literal type: " (Core__.literalType v1)))) v1)
-    Core.TypeMap v1 ->  
-      let kt = (Core.mapTypeKeys v1) 
-          vt = (Core.mapTypeValues v1)
-      in (Flows.map Utils.toTypeApplication (Flows.sequence [
-        Flows.pure (Ast.TypeVariable (Utils.rawName "M.Map")),
-        (encode kt),
-        (encode vt)]))
-    Core.TypeMaybe v1 -> (Flows.map Utils.toTypeApplication (Flows.sequence [
-      Flows.pure (Ast.TypeVariable (Utils.rawName "Maybe")),
-      (encode v1)]))
-    Core.TypePair v1 -> (Flows.bind (encode (Core.pairTypeFirst v1)) (\f -> Flows.bind (encode (Core.pairTypeSecond v1)) (\s -> Flows.pure (Ast.TypeTuple [
-      f,
-      s]))))
-    Core.TypeRecord v1 -> (ref (Core.rowTypeTypeName v1))
-    Core.TypeSet v1 -> (Flows.map Utils.toTypeApplication (Flows.sequence [
-      Flows.pure (Ast.TypeVariable (Utils.rawName "S.Set")),
-      (encode v1)]))
-    Core.TypeUnion v1 ->  
-      let typeName = (Core.rowTypeTypeName v1)
-      in (ref typeName)
-    Core.TypeUnit -> (Flows.pure unitTuple)
-    Core.TypeVariable v1 -> (ref v1)
-    Core.TypeWrap v1 ->  
-      let name = (Core.wrappedTypeTypeName v1)
-      in (ref name)
-    _ -> (Flows.fail (Strings.cat2 "unexpected type: " (Core__.type_ typ)))) (Rewriting.deannotateType typ)))
-
--- | Encode a Hydra type as a Haskell type with typeclass assertions
-encodeTypeWithClassAssertions :: (Module.Namespaces Ast.ModuleName -> M.Map Core.Name (S.Set Classes.TypeClass) -> Core.Type -> Compute.Flow Graph.Graph Ast.Type)
-encodeTypeWithClassAssertions namespaces explicitClasses typ =  
-  let classes = (Maps.union explicitClasses (getImplicitTypeClasses typ)) 
-      implicitClasses = (getImplicitTypeClasses typ)
-      encodeAssertion = (\pair ->  
-              let name = (Pairs.first pair) 
-                  cls = (Pairs.second pair)
-                  hname = (Utils.rawName ((\x -> case x of
-                          Classes.TypeClassEquality -> "Eq"
-                          Classes.TypeClassOrdering -> "Ord") cls))
-                  htype = (Ast.TypeVariable (Utils.rawName (Core.unName name)))
-              in (Ast.AssertionClass (Ast.ClassAssertion {
-                Ast.classAssertionName = hname,
-                Ast.classAssertionTypes = [
-                  htype]})))
-      assertPairs = (Lists.concat (Lists.map toPairs (Maps.toList classes)))
-      toPairs = (\mapEntry ->  
-              let name = (Pairs.first mapEntry) 
-                  clsSet = (Pairs.second mapEntry)
-                  toPair = (\c -> (name, c))
-              in (Lists.map toPair (Sets.toList clsSet)))
-  in (Monads.withTrace "encode with assertions" (Flows.bind (adaptTypeToHaskellAndEncode namespaces typ) (\htyp -> Logic.ifElse (Lists.null assertPairs) (Flows.pure htyp) ( 
-    let encoded = (Lists.map encodeAssertion assertPairs) 
-        hassert = (Logic.ifElse (Equality.equal (Lists.length encoded) 1) (Lists.head encoded) (Ast.AssertionTuple encoded))
-    in (Flows.pure (Ast.TypeCtx (Ast.ContextType {
-      Ast.contextTypeCtx = hassert,
-      Ast.contextTypeType = htyp})))))))
-
--- | Find type variables that require an Ord constraint (used in maps or sets)
-findOrdVariables :: (Core.Type -> S.Set Core.Name)
-findOrdVariables typ =  
-  let fold = (\names -> \typ_ -> (\x -> case x of
-          Core.TypeMap v1 ->  
-            let kt = (Core.mapTypeKeys v1)
-            in (tryType names kt)
-          Core.TypeSet v1 -> (tryType names v1)
-          _ -> names) typ_) 
-      isTypeVariable = (\v ->  
-              let nameStr = (Core.unName v) 
-                  hasNoNamespace = (Maybes.isNothing (Names.namespaceOf v))
-                  startsWithT = (Equality.equal (Strings.charAt 0 nameStr) 116)
-              in (Logic.and hasNoNamespace startsWithT))
-      tryType = (\names -> \t -> (\x -> case x of
-              Core.TypeVariable v1 -> (Logic.ifElse (isTypeVariable v1) (Sets.insert v1 names) names)
-              _ -> names) (Rewriting.deannotateType t))
-  in (Rewriting.foldOverType Coders.TraversalOrderPre fold Sets.empty typ)
-
--- | Get implicit typeclass constraints for type variables that need Ord
-getImplicitTypeClasses :: (Core.Type -> M.Map Core.Name (S.Set Classes.TypeClass))
-getImplicitTypeClasses typ =  
-  let toPair = (\name -> (name, (Sets.fromList [
-          Classes.TypeClassOrdering])))
-  in (Maps.fromList (Lists.map toPair (Sets.toList (findOrdVariables typ))))
-
--- | Convert a Hydra module and definitions to a Haskell module AST
-moduleToHaskellModule :: (Module.Module -> [Module.Definition] -> Compute.Flow Graph.Graph Ast.Module)
-moduleToHaskellModule mod defs = (Flows.bind (Utils.namespacesForModule mod) (\namespaces -> constructModule namespaces mod defs))
-
--- | Convert a Hydra module to Haskell source code as a filepath-to-content map
-moduleToHaskell :: (Module.Module -> [Module.Definition] -> Compute.Flow Graph.Graph (M.Map String String))
-moduleToHaskell mod defs = (Flows.bind (moduleToHaskellModule mod defs) (\hsmod ->  
-  let s = (Serialization.printExpr (Serialization.parenthesize (Serde.moduleToExpr hsmod))) 
-      filepath = (Names.namespaceToFilePath Util.CaseConventionPascal (Module.FileExtension "hs") (Module.moduleNamespace mod))
-  in (Flows.pure (Maps.singleton filepath s))))
-
--- | Generate Haskell declarations for type and field name constants
-nameDecls :: (t0 -> Module.Namespaces Ast.ModuleName -> Core.Name -> Core.Type -> [Ast.DeclarationWithComments])
-nameDecls g namespaces name typ =  
-  let nm = (Core.unName name) 
-      toDecl = (\n -> \pair ->  
-              let k = (Pairs.first pair) 
-                  v = (Pairs.second pair)
-                  decl = (Ast.DeclarationValueBinding (Ast.ValueBindingSimple (Ast.SimpleValueBinding {
-                          Ast.simpleValueBindingPattern = (Utils.applicationPattern (Utils.simpleName k) []),
-                          Ast.simpleValueBindingRhs = (Ast.RightHandSide (Ast.ExpressionApplication (Ast.ApplicationExpression {
-                            Ast.applicationExpressionFunction = (Ast.ExpressionVariable (Utils.elementReference namespaces n)),
-                            Ast.applicationExpressionArgument = (Ast.ExpressionLiteral (Ast.LiteralString v))}))),
-                          Ast.simpleValueBindingLocalBindings = Nothing})))
-              in Ast.DeclarationWithComments {
-                Ast.declarationWithCommentsBody = decl,
-                Ast.declarationWithCommentsComments = Nothing})
-      nameDecl = (constantForTypeName name, nm)
-      fieldDecls = (Lists.map toConstant (Lexical.fieldsOf typ))
-      toConstant = (\fieldType ->  
-              let fname = (Core.fieldTypeName fieldType)
-              in (constantForFieldName name fname, (Core.unName fname)))
-  in (Logic.ifElse useCoreImport (Lists.cons (toDecl (Core.Name "hydra.core.Name") nameDecl) (Lists.map (toDecl (Core.Name "hydra.core.Name")) fieldDecls)) [])
-
--- | Convert a Hydra term definition to a Haskell declaration with comments
-toDataDeclaration :: (Module.Namespaces Ast.ModuleName -> Module.TermDefinition -> Compute.Flow Graph.Graph Ast.DeclarationWithComments)
-toDataDeclaration namespaces def =  
-  let name = (Module.termDefinitionName def) 
-      term = (Module.termDefinitionTerm def)
-      typ = (Module.termDefinitionType def)
-      hname = (Utils.simpleName (Names.localNameOf name))
-      rewriteValueBinding = (\vb -> (\x -> case x of
-              Ast.ValueBindingSimple v1 ->  
-                let pattern_ = (Ast.simpleValueBindingPattern v1) 
-                    rhs = (Ast.simpleValueBindingRhs v1)
-                    bindings = (Ast.simpleValueBindingLocalBindings v1)
-                in ((\x -> case x of
-                  Ast.PatternApplication v2 ->  
-                    let name_ = (Ast.applicationPatternName v2) 
-                        args = (Ast.applicationPatternArgs v2)
-                        rhsExpr = (Ast.unRightHandSide rhs)
-                    in ((\x -> case x of
-                      Ast.ExpressionLambda v3 ->  
-                        let vars = (Ast.lambdaExpressionBindings v3) 
-                            body = (Ast.lambdaExpressionInner v3)
-                            newPattern = (Utils.applicationPattern name_ (Lists.concat2 args vars))
-                            newRhs = (Ast.RightHandSide body)
-                        in (rewriteValueBinding (Ast.ValueBindingSimple (Ast.SimpleValueBinding {
-                          Ast.simpleValueBindingPattern = newPattern,
-                          Ast.simpleValueBindingRhs = newRhs,
-                          Ast.simpleValueBindingLocalBindings = bindings})))
-                      _ -> vb) rhsExpr)
-                  _ -> vb) pattern_)) vb)
-      toDecl = (\comments -> \hname_ -> \term_ -> \bindings -> (\x -> case x of
-              Core.TermLet v1 ->  
-                let lbindings = (Core.letBindings v1) 
-                    env = (Core.letBody v1)
-                    toBinding = (\hname_ -> \hterm_ -> Ast.LocalBindingValue (Utils.simpleValueBinding hname_ hterm_ Nothing))
-                    hnames = (Lists.map (\binding -> Utils.simpleName (Core.unName (Core.bindingName binding))) lbindings)
-                    terms = (Lists.map Core.bindingTerm lbindings)
-                in (Flows.bind (Flows.mapList (encodeTerm namespaces) terms) (\hterms ->  
-                  let hbindings = (Lists.zipWith toBinding hnames hterms) 
-                      prevBindings = (Maybes.maybe [] (\lb -> Ast.unLocalBindings lb) bindings)
-                      allBindings = (Lists.concat2 prevBindings hbindings)
-                  in (toDecl comments hname_ env (Just (Ast.LocalBindings allBindings)))))
-              _ -> (Flows.bind (encodeTerm namespaces term_) (\hterm ->  
-                let vb = (Utils.simpleValueBinding hname_ hterm bindings) 
-                    schemeConstraints = (Core.typeSchemeConstraints typ)
-                    schemeClasses = (typeSchemeConstraintsToClassMap schemeConstraints)
-                in (Flows.bind (Annotations.getTypeClasses (Rewriting.removeTypesFromTerm term)) (\explicitClasses ->  
-                  let combinedClasses = (Maps.union schemeClasses explicitClasses)
-                  in (Flows.bind (encodeTypeWithClassAssertions namespaces combinedClasses (Core.typeSchemeType typ)) (\htype ->  
-                    let decl = (Ast.DeclarationTypedBinding (Ast.TypedBinding {
-                            Ast.typedBindingTypeSignature = Ast.TypeSignature {
-                              Ast.typeSignatureName = hname_,
-                              Ast.typeSignatureType = htype},
-                            Ast.typedBindingValueBinding = (rewriteValueBinding vb)}))
-                    in (Flows.pure (Ast.DeclarationWithComments {
-                      Ast.declarationWithCommentsBody = decl,
-                      Ast.declarationWithCommentsComments = comments}))))))))) (Rewriting.deannotateTerm term_))
-  in (Flows.bind (Annotations.getTermDescription term) (\comments -> toDecl comments hname term Nothing))
-
--- | Convert a Hydra type definition to Haskell declarations
-toTypeDeclarationsFrom :: (Module.Namespaces Ast.ModuleName -> Core.Name -> Core.Type -> Compute.Flow Graph.Graph [Ast.DeclarationWithComments])
-toTypeDeclarationsFrom namespaces elementName typ =  
-  let lname = (Names.localNameOf elementName) 
-      hname = (Utils.simpleName lname)
-      declHead = (\name -> \vars_ -> Logic.ifElse (Lists.null vars_) (Ast.DeclarationHeadSimple name) ( 
-              let h = (Lists.head vars_) 
-                  rest = (Lists.tail vars_)
-                  hvar = (Ast.Variable (Utils.simpleName (Core.unName h)))
-              in (Ast.DeclarationHeadApplication (Ast.ApplicationDeclarationHead {
-                Ast.applicationDeclarationHeadFunction = (declHead name rest),
-                Ast.applicationDeclarationHeadOperand = hvar}))))
-      newtypeCons = (\tname -> \typ_ ->  
-              let hname = (Utils.simpleName (Utils.newtypeAccessorName tname))
-              in (Flows.bind (adaptTypeToHaskellAndEncode namespaces typ_) (\htype ->  
-                let hfield = Ast.FieldWithComments {
-                        Ast.fieldWithCommentsField = Ast.Field {
-                          Ast.fieldName = hname,
-                          Ast.fieldType = htype},
-                        Ast.fieldWithCommentsComments = Nothing} 
-                    constructorName = (Utils.simpleName (Names.localNameOf tname))
-                in (Flows.pure (Ast.ConstructorWithComments {
-                  Ast.constructorWithCommentsBody = (Ast.ConstructorRecord (Ast.RecordConstructor {
-                    Ast.recordConstructorName = constructorName,
-                    Ast.recordConstructorFields = [
-                      hfield]})),
-                  Ast.constructorWithCommentsComments = Nothing})))))
-      recordCons = (\lname_ -> \fields ->  
-              let toField = (\fieldType ->  
-                      let fname = (Core.fieldTypeName fieldType) 
-                          ftype = (Core.fieldTypeType fieldType)
-                          hname_ = (Utils.simpleName (Strings.cat2 (Formatting.decapitalize lname_) (Formatting.capitalize (Core.unName fname))))
-                      in (Flows.bind (adaptTypeToHaskellAndEncode namespaces ftype) (\htype -> Flows.bind (Annotations.getTypeDescription ftype) (\comments -> Flows.pure (Ast.FieldWithComments {
-                        Ast.fieldWithCommentsField = Ast.Field {
-                          Ast.fieldName = hname_,
-                          Ast.fieldType = htype},
-                        Ast.fieldWithCommentsComments = comments})))))
-              in (Flows.bind (Flows.mapList toField fields) (\hFields -> Flows.pure (Ast.ConstructorWithComments {
-                Ast.constructorWithCommentsBody = (Ast.ConstructorRecord (Ast.RecordConstructor {
-                  Ast.recordConstructorName = (Utils.simpleName lname_),
-                  Ast.recordConstructorFields = hFields})),
-                Ast.constructorWithCommentsComments = Nothing}))))
-      unionCons = (\g_ -> \lname_ -> \fieldType ->  
-              let fname = (Core.fieldTypeName fieldType) 
-                  ftype = (Core.fieldTypeType fieldType)
-                  deconflict = (\name ->  
-                          let tname = (Names.unqualifyName (Module.QualifiedName {
-                                  Module.qualifiedNameNamespace = (Just (Pairs.first (Module.namespacesFocus namespaces))),
-                                  Module.qualifiedNameLocal = name}))
-                          in (Logic.ifElse (Maybes.isJust (Lists.find (\b -> Equality.equal (Core.bindingName b) tname) (Graph.graphElements g_))) (deconflict (Strings.cat2 name "_")) name))
-              in (Flows.bind (Annotations.getTypeDescription ftype) (\comments ->  
-                let nm = (deconflict (Strings.cat2 (Formatting.capitalize lname_) (Formatting.capitalize (Core.unName fname))))
-                in (Flows.bind (Logic.ifElse (Equality.equal (Rewriting.deannotateType ftype) Core.TypeUnit) (Flows.pure []) (Flows.bind (adaptTypeToHaskellAndEncode namespaces ftype) (\htype -> Flows.pure [
-                  htype]))) (\typeList -> Flows.pure (Ast.ConstructorWithComments {
-                  Ast.constructorWithCommentsBody = (Ast.ConstructorOrdinary (Ast.OrdinaryConstructor {
-                    Ast.ordinaryConstructorName = (Utils.simpleName nm),
-                    Ast.ordinaryConstructorFields = typeList})),
-                  Ast.constructorWithCommentsComments = comments}))))))
-  in (Monads.withTrace (Strings.cat2 "type definition " (Core.unName elementName)) (Flows.bind Monads.getState (\g -> Flows.bind (Schemas.isSerializableByName elementName) (\isSer ->  
-    let deriv = (Ast.Deriving (Logic.ifElse isSer (Lists.map Utils.rawName [
-            "Eq",
-            "Ord",
-            "Read",
-            "Show"]) [])) 
-        unpackResult = (Utils.unpackForallType g typ)
-        vars = (Pairs.first unpackResult)
-        t_ = (Pairs.second unpackResult)
-        hd = (declHead hname (Lists.reverse vars))
-    in (Flows.bind ((\x -> case x of
-      Core.TypeRecord v1 -> (Flows.bind (recordCons lname (Core.rowTypeFields v1)) (\cons -> Flows.pure (Ast.DeclarationData (Ast.DataDeclaration {
-        Ast.dataDeclarationKeyword = Ast.DataOrNewtypeData,
-        Ast.dataDeclarationContext = [],
-        Ast.dataDeclarationHead = hd,
-        Ast.dataDeclarationConstructors = [
-          cons],
-        Ast.dataDeclarationDeriving = [
-          deriv]}))))
-      Core.TypeUnion v1 -> (Flows.bind (Flows.mapList (unionCons g lname) (Core.rowTypeFields v1)) (\cons -> Flows.pure (Ast.DeclarationData (Ast.DataDeclaration {
-        Ast.dataDeclarationKeyword = Ast.DataOrNewtypeData,
-        Ast.dataDeclarationContext = [],
-        Ast.dataDeclarationHead = hd,
-        Ast.dataDeclarationConstructors = cons,
-        Ast.dataDeclarationDeriving = [
-          deriv]}))))
-      Core.TypeWrap v1 ->  
-        let wt = (Core.wrappedTypeBody v1)
-        in (Flows.bind (newtypeCons elementName wt) (\cons -> Flows.pure (Ast.DeclarationData (Ast.DataDeclaration {
-          Ast.dataDeclarationKeyword = Ast.DataOrNewtypeNewtype,
-          Ast.dataDeclarationContext = [],
-          Ast.dataDeclarationHead = hd,
-          Ast.dataDeclarationConstructors = [
-            cons],
-          Ast.dataDeclarationDeriving = [
-            deriv]}))))
-      _ -> (Flows.bind (adaptTypeToHaskellAndEncode namespaces typ) (\htype -> Flows.pure (Ast.DeclarationType (Ast.TypeDeclaration {
-        Ast.typeDeclarationName = hd,
-        Ast.typeDeclarationType = htype}))))) (Rewriting.deannotateType t_)) (\decl -> Flows.bind (Annotations.getTypeDescription typ) (\comments -> Flows.bind (Logic.ifElse includeTypeDefinitions (Flows.bind (typeDecl namespaces elementName typ) (\decl_ -> Flows.pure [
-      decl_])) (Flows.pure [])) (\tdecls ->  
-      let mainDecl = Ast.DeclarationWithComments {
-              Ast.declarationWithCommentsBody = decl,
-              Ast.declarationWithCommentsComments = comments} 
-          nameDecls_ = (nameDecls g namespaces elementName typ)
-      in (Flows.pure (Lists.concat [
-        [
-          mainDecl],
-        nameDecls_,
-        tdecls]))))))))))
-
--- | Generate a Haskell declaration for a type definition constant
-typeDecl :: (Module.Namespaces Ast.ModuleName -> Core.Name -> Core.Type -> Compute.Flow Graph.Graph Ast.DeclarationWithComments)
-typeDecl namespaces name typ =  
-  let typeName = (\ns -> \name_ -> Names.qname ns (typeNameLocal name_)) 
-      typeNameLocal = (\name_ -> Strings.cat [
-              "_",
-              (Names.localNameOf name_),
-              "_type_"])
-      rawTerm = (Core_.type_ typ)
-      rewrite = (\recurse -> \term ->  
-              let variantResult = ((\x -> case x of
-                      Core.TermUnion v1 -> (Logic.ifElse (Equality.equal (Core.injectionTypeName v1) (Core.Name "hydra.core.Type")) (Just (Core.injectionField v1)) Nothing)
-                      _ -> Nothing) (Rewriting.deannotateTerm term)) 
-                  decodeString = (\term -> (\x -> case x of
-                          Core.TermLiteral v1 -> ((\x -> case x of
-                            Core.LiteralString v2 -> (Just v2)
-                            _ -> Nothing) v1)
-                          _ -> Nothing) (Rewriting.deannotateTerm term))
-                  decodeName = (\term -> (\x -> case x of
-                          Core.TermWrap v1 -> (Logic.ifElse (Equality.equal (Core.wrappedTermTypeName v1) (Core.Name "hydra.core.Name")) (Maybes.map (\x -> Core.Name x) (decodeString (Core.wrappedTermBody v1))) Nothing)
-                          _ -> Nothing) (Rewriting.deannotateTerm term))
-                  forType = (\field ->  
-                          let fname = (Core.fieldName field) 
-                              fterm = (Core.fieldTerm field)
-                          in (Logic.ifElse (Equality.equal fname (Core.Name "record")) Nothing (Logic.ifElse (Equality.equal fname (Core.Name "variable")) (Maybes.bind (decodeName fterm) forVariableType) Nothing)))
-                  forVariableType = (\vname ->  
-                          let qname = (Names.qualifyName vname) 
-                              mns = (Module.qualifiedNameNamespace qname)
-                              local = (Module.qualifiedNameLocal qname)
-                          in (Maybes.map (\ns -> Core.TermVariable (Names.qname ns (Strings.cat [
-                            "_",
-                            local,
-                            "_type_"]))) mns))
-              in (Maybes.fromMaybe (recurse term) (Maybes.bind variantResult forType)))
-      finalTerm = (Rewriting.rewriteTerm rewrite rawTerm)
-  in (Flows.bind (Modules.constructCoder Language.haskellLanguage (encodeTerm namespaces) (Core.TypeVariable (Core.Name "hydra.core.Type"))) (\coder -> Flows.bind (Compute.coderEncode coder finalTerm) (\expr ->  
-    let rhs = (Ast.RightHandSide expr) 
-        hname = (Utils.simpleName (typeNameLocal name))
-        pat = (Utils.applicationPattern hname [])
-        decl = (Ast.DeclarationValueBinding (Ast.ValueBindingSimple (Ast.SimpleValueBinding {
-                Ast.simpleValueBindingPattern = pat,
-                Ast.simpleValueBindingRhs = rhs,
-                Ast.simpleValueBindingLocalBindings = Nothing})))
-    in (Flows.pure (Ast.DeclarationWithComments {
-      Ast.declarationWithCommentsBody = decl,
-      Ast.declarationWithCommentsComments = Nothing})))))
-
--- | Convert type scheme constraints to a map of type variables to typeclasses
-typeSchemeConstraintsToClassMap :: Ord t0 => (Maybe (M.Map t0 Core.TypeVariableMetadata) -> M.Map t0 (S.Set Classes.TypeClass))
-typeSchemeConstraintsToClassMap maybeConstraints =  
-  let nameToTypeClass = (\className ->  
-          let classNameStr = (Core.unName className) 
-              isEq = (Equality.equal classNameStr (Core.unName (Core.Name "equality")))
-              isOrd = (Equality.equal classNameStr (Core.unName (Core.Name "ordering")))
-          in (Logic.ifElse isEq (Just Classes.TypeClassEquality) (Logic.ifElse isOrd (Just Classes.TypeClassOrdering) Nothing)))
-  in (Maybes.maybe Maps.empty (\constraints -> Maps.map (\meta -> Sets.fromList (Maybes.cat (Lists.map nameToTypeClass (Sets.toList (Core.typeVariableMetadataClasses meta))))) constraints) maybeConstraints)
+import qualified Hydra.Adapt as Adapt
+import qualified Hydra.Annotations as Annotations
+import qualified Hydra.Classes as Classes
+import qualified Hydra.Coders as Coders
+import qualified Hydra.Constants as Constants
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Encode.Core as Core_
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Ext.Haskell.Language as Language
+import qualified Hydra.Ext.Haskell.Serde as Serde
+import qualified Hydra.Ext.Haskell.Syntax as Syntax
+import qualified Hydra.Ext.Haskell.Utils as Utils
+import qualified Hydra.Formatting as Formatting
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Math as Math
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Module as Module
+import qualified Hydra.Names as Names
+import qualified Hydra.Rewriting as Rewriting
+import qualified Hydra.Schemas as Schemas
+import qualified Hydra.Serialization as Serialization
+import qualified Hydra.Show.Core as Core__
+import qualified Hydra.Util as Util
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Adapt a Hydra type to Haskell's type system and encode it
+adaptTypeToHaskellAndEncode :: Module.Namespaces Syntax.ModuleName -> Core.Type -> Context.Context -> t0 -> Either (Context.InContext Errors.Error) Syntax.Type
+adaptTypeToHaskellAndEncode namespaces typ cx g =
+
+      let enc = \t -> encodeType namespaces t cx g
+      in case (Rewriting.deannotateType typ) of
+        Core.TypeVariable _ -> enc typ
+        _ -> Eithers.bind (Eithers.bimap (\_s -> Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError _s)),
+          Context.inContextContext = cx}) (\_x -> _x) (Adapt.adaptTypeForLanguage Language.haskellLanguage typ)) (\adaptedType -> enc adaptedType)
+
+-- | Generate a constant name for a field (e.g., '_TypeName_fieldName')
+constantForFieldName :: Core.Name -> Core.Name -> String
+constantForFieldName tname fname =
+    Strings.cat [
+      "_",
+      (Names.localNameOf tname),
+      "_",
+      (Core.unName fname)]
+
+-- | Generate a constant name for a type (e.g., '_TypeName')
+constantForTypeName :: Core.Name -> String
+constantForTypeName tname = Strings.cat2 "_" (Names.localNameOf tname)
+
+-- | Construct a Haskell module from a Hydra module and its definitions
+constructModule :: Module.Namespaces Syntax.ModuleName -> Module.Module -> [Module.Definition] -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) Syntax.Module
+constructModule namespaces mod defs cx g =
+
+      let h = \namespace -> Module.unNamespace namespace
+          createDeclarations =
+                  \def -> case def of
+                    Module.DefinitionType v0 ->
+                      let name = Module.typeDefinitionName v0
+                          typ = Module.typeDefinitionType v0
+                      in (toTypeDeclarationsFrom namespaces name typ cx g)
+                    Module.DefinitionTerm v0 -> Eithers.bind (toDataDeclaration namespaces v0 cx g) (\d -> Right [
+                      d])
+          importName =
+                  \name -> Syntax.ModuleName (Strings.intercalate "." (Lists.map Formatting.capitalize (Strings.splitOn "." name)))
+          imports = Lists.concat2 domainImports standardImports
+          domainImports =
+
+                    let toImport =
+                            \pair ->
+                              let namespace = Pairs.first pair
+                                  alias = Pairs.second pair
+                                  name = h namespace
+                              in Syntax.Import {
+                                Syntax.importQualified = True,
+                                Syntax.importModule = (importName name),
+                                Syntax.importAs = (Just alias),
+                                Syntax.importSpec = Nothing}
+                    in (Lists.map toImport (Maps.toList (Module.namespacesMapping namespaces)))
+          standardImports =
+
+                    let toImport =
+                            \triple ->
+                              let name = Pairs.first (Pairs.first triple)
+                                  malias = Pairs.second (Pairs.first triple)
+                                  hidden = Pairs.second triple
+                                  spec =
+                                          Logic.ifElse (Lists.null hidden) Nothing (Just (Syntax.SpecImportHiding (Lists.map (\n -> Syntax.ImportExportSpec {
+                                            Syntax.importExportSpecModifier = Nothing,
+                                            Syntax.importExportSpecName = (Utils.simpleName n),
+                                            Syntax.importExportSpecSubspec = Nothing}) hidden)))
+                              in Syntax.Import {
+                                Syntax.importQualified = (Maybes.isJust malias),
+                                Syntax.importModule = (Syntax.ModuleName name),
+                                Syntax.importAs = (Maybes.map (\x -> Syntax.ModuleName x) malias),
+                                Syntax.importSpec = spec}
+                    in (Lists.map toImport (Lists.concat2 [
+                      (("Prelude", Nothing), [
+                        "Enum",
+                        "Ordering",
+                        "decodeFloat",
+                        "encodeFloat",
+                        "fail",
+                        "map",
+                        "pure",
+                        "sum"]),
+                      (("Data.ByteString", (Just "B")), []),
+                      (("Data.Int", (Just "I")), []),
+                      (("Data.List", (Just "L")), []),
+                      (("Data.Map", (Just "M")), []),
+                      (("Data.Set", (Just "S")), [])] (Logic.ifElse (Schemas.moduleContainsBinaryLiterals mod) [
+                      (("Hydra.Lib.Literals", (Just "Literals")), [])] [])))
+      in (Eithers.bind (Eithers.mapList createDeclarations defs) (\declLists ->
+        let decls = Lists.concat declLists
+            mc = Module.moduleDescription mod
+        in (Right (Syntax.Module {
+          Syntax.moduleHead = (Just (Syntax.ModuleHead {
+            Syntax.moduleHeadComments = mc,
+            Syntax.moduleHeadName = (importName (h (Module.moduleNamespace mod))),
+            Syntax.moduleHeadExports = []})),
+          Syntax.moduleImports = imports,
+          Syntax.moduleDeclarations = decls}))))
+
+-- | Encode a Hydra case statement as a Haskell case expression with a given scrutinee
+encodeCaseExpression :: Int -> Module.Namespaces Syntax.ModuleName -> Core.CaseStatement -> Syntax.Expression -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) Syntax.Expression
+encodeCaseExpression depth namespaces stmt scrutinee cx g =
+
+      let dn = Core.caseStatementTypeName stmt
+          def = Core.caseStatementDefault stmt
+          fields = Core.caseStatementCases stmt
+          toAlt =
+                  \fieldMap -> \field ->
+                    let fn = Core.fieldName field
+                        fun_ = Core.fieldTerm field
+                        v0 = Strings.cat2 "v" (Literals.showInt32 depth)
+                        raw =
+                                Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = fun_,
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name v0))})
+                        rhsTerm = Rewriting.simplifyTerm raw
+                        v1 = Logic.ifElse (Rewriting.isFreeVariableInTerm (Core.Name v0) rhsTerm) Constants.ignoredVariable v0
+                        hname =
+                                Utils.unionFieldReference (Sets.union (Sets.fromList (Maps.keys (Graph.graphBoundTerms g))) (Sets.fromList (Maps.keys (Graph.graphSchemaTypes g)))) namespaces dn fn
+                    in (Eithers.bind (Maybes.cases (Maps.lookup fn fieldMap) (Left (Context.InContext {
+                      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+                        "field ",
+                        (Literals.showString (Core.unName fn)),
+                        " not found in ",
+                        (Literals.showString (Core.unName dn))]))),
+                      Context.inContextContext = cx})) (\fieldType ->
+                      let ft = Core.fieldTypeType fieldType
+                          noArgs = []
+                          singleArg = [
+                                Syntax.PatternName (Utils.rawName v1)]
+                      in case (Rewriting.deannotateType ft) of
+                        Core.TypeUnit -> Right noArgs
+                        _ -> Right singleArg)) (\args ->
+                      let lhs = Utils.applicationPattern hname args
+                      in (Eithers.bind (Eithers.map (\x -> Syntax.CaseRhs x) (encodeTerm (Math.add depth 1) namespaces rhsTerm cx g)) (\rhs -> Right (Syntax.Alternative {
+                        Syntax.alternativePattern = lhs,
+                        Syntax.alternativeRhs = rhs,
+                        Syntax.alternativeBinds = Nothing})))))
+      in (Eithers.bind (Schemas.requireUnionType cx g dn) (\rt ->
+        let toFieldMapEntry = \f -> (Core.fieldTypeName f, f)
+            fieldMap = Maps.fromList (Lists.map toFieldMapEntry rt)
+        in (Eithers.bind (Eithers.mapList (toAlt fieldMap) fields) (\ecases -> Eithers.bind (Maybes.cases def (Right []) (\d -> Eithers.bind (Eithers.map (\x -> Syntax.CaseRhs x) (encodeTerm depth namespaces d cx g)) (\cs ->
+          let lhs = Syntax.PatternName (Utils.rawName Constants.ignoredVariable)
+              alt =
+                      Syntax.Alternative {
+                        Syntax.alternativePattern = lhs,
+                        Syntax.alternativeRhs = cs,
+                        Syntax.alternativeBinds = Nothing}
+          in (Right [
+            alt])))) (\dcases -> Right (Syntax.ExpressionCase (Syntax.CaseExpression {
+          Syntax.caseExpressionCase = scrutinee,
+          Syntax.caseExpressionAlternatives = (Lists.concat2 ecases dcases)})))))))
+
+-- | Encode a Hydra function as a Haskell expression
+encodeFunction :: Int -> Module.Namespaces Syntax.ModuleName -> Core.Function -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) Syntax.Expression
+encodeFunction depth namespaces fun cx g =
+    case fun of
+      Core.FunctionElimination v0 -> case v0 of
+        Core.EliminationWrap v1 -> Right (Syntax.ExpressionVariable (Utils.elementReference namespaces (Names.qname (Maybes.fromJust (Names.namespaceOf v1)) (Utils.newtypeAccessorName v1))))
+        Core.EliminationRecord v1 ->
+          let dn = Core.projectionTypeName v1
+              fname = Core.projectionField v1
+          in (Right (Syntax.ExpressionVariable (Utils.recordFieldReference namespaces dn fname)))
+        Core.EliminationUnion v1 -> Eithers.map (Utils.hslambda (Utils.rawName "x")) (encodeCaseExpression depth namespaces v1 (Utils.hsvar "x") cx g)
+      Core.FunctionLambda v0 ->
+        let v = Core.lambdaParameter v0
+            body = Core.lambdaBody v0
+        in (Eithers.bind (encodeTerm depth namespaces body cx g) (\hbody -> Right (Utils.hslambda (Utils.elementReference namespaces v) hbody)))
+      Core.FunctionPrimitive v0 -> Right (Syntax.ExpressionVariable (Utils.elementReference namespaces v0))
+
+-- | Encode a Hydra literal as a Haskell expression
+encodeLiteral :: Core.Literal -> Context.Context -> Either (Context.InContext Errors.Error) Syntax.Expression
+encodeLiteral l cx =
+    case l of
+      Core.LiteralBinary v0 -> Right (Utils.hsapp (Utils.hsvar "Literals.stringToBinary") (Utils.hslit (Syntax.LiteralString (Literals.binaryToString v0))))
+      Core.LiteralBoolean v0 -> Right (Utils.hsvar (Logic.ifElse v0 "True" "False"))
+      Core.LiteralFloat v0 -> case v0 of
+        Core.FloatValueFloat32 v1 -> Right (Utils.hslit (Syntax.LiteralFloat v1))
+        Core.FloatValueFloat64 v1 -> Right (Utils.hslit (Syntax.LiteralDouble v1))
+        Core.FloatValueBigfloat v1 -> Right (Utils.hslit (Syntax.LiteralDouble (Literals.bigfloatToFloat64 v1)))
+      Core.LiteralInteger v0 -> case v0 of
+        Core.IntegerValueBigint v1 -> Right (Utils.hslit (Syntax.LiteralInteger v1))
+        Core.IntegerValueInt8 v1 -> Right (Utils.hslit (Syntax.LiteralInteger (Literals.int8ToBigint v1)))
+        Core.IntegerValueInt16 v1 -> Right (Utils.hslit (Syntax.LiteralInteger (Literals.int16ToBigint v1)))
+        Core.IntegerValueInt32 v1 -> Right (Utils.hslit (Syntax.LiteralInt v1))
+        Core.IntegerValueInt64 v1 -> Right (Utils.hslit (Syntax.LiteralInteger (Literals.int64ToBigint v1)))
+        Core.IntegerValueUint8 v1 -> Right (Utils.hslit (Syntax.LiteralInteger (Literals.uint8ToBigint v1)))
+        Core.IntegerValueUint16 v1 -> Right (Utils.hslit (Syntax.LiteralInteger (Literals.uint16ToBigint v1)))
+        Core.IntegerValueUint32 v1 -> Right (Utils.hslit (Syntax.LiteralInteger (Literals.uint32ToBigint v1)))
+        Core.IntegerValueUint64 v1 -> Right (Utils.hslit (Syntax.LiteralInteger (Literals.uint64ToBigint v1)))
+      Core.LiteralString v0 -> Right (Utils.hslit (Syntax.LiteralString v0))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "literal value " (Core__.literal l)))),
+        Context.inContextContext = cx})
+
+-- | Encode a Hydra term as a Haskell expression
+encodeTerm :: Int -> Module.Namespaces Syntax.ModuleName -> Core.Term -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) Syntax.Expression
+encodeTerm depth namespaces term cx g =
+
+      let encode = \t -> encodeTerm depth namespaces t cx g
+          nonemptyMap =
+                  \m ->
+                    let lhs = Utils.hsvar "M.fromList"
+                        encodePair =
+                                \pair ->
+                                  let k = Pairs.first pair
+                                      v = Pairs.second pair
+                                  in (Eithers.bind (encode k) (\hk -> Eithers.bind (encode v) (\hv -> Right (Syntax.ExpressionTuple [
+                                    hk,
+                                    hv]))))
+                    in (Eithers.bind (Eithers.map (\x -> Syntax.ExpressionList x) (Eithers.mapList encodePair (Maps.toList m))) (\rhs -> Right (Utils.hsapp lhs rhs)))
+          nonemptySet =
+                  \s ->
+                    let lhs = Utils.hsvar "S.fromList"
+                    in (Eithers.bind (encodeTerm depth namespaces (Core.TermList (Sets.toList s)) cx g) (\rhs -> Right (Utils.hsapp lhs rhs)))
+      in case (Rewriting.deannotateTerm term) of
+        Core.TermApplication v0 ->
+          let fun = Core.applicationFunction v0
+              arg = Core.applicationArgument v0
+              deannotatedFun = Rewriting.deannotateTerm fun
+          in case deannotatedFun of
+            Core.TermFunction v1 -> case v1 of
+              Core.FunctionElimination v2 -> case v2 of
+                Core.EliminationUnion v3 -> Eithers.bind (encode arg) (\harg -> encodeCaseExpression depth namespaces v3 harg cx g)
+                _ -> Eithers.bind (encode fun) (\hfun -> Eithers.bind (encode arg) (\harg -> Right (Utils.hsapp hfun harg)))
+              _ -> Eithers.bind (encode fun) (\hfun -> Eithers.bind (encode arg) (\harg -> Right (Utils.hsapp hfun harg)))
+            _ -> Eithers.bind (encode fun) (\hfun -> Eithers.bind (encode arg) (\harg -> Right (Utils.hsapp hfun harg)))
+        Core.TermEither v0 -> Eithers.either (\l -> Eithers.bind (encode l) (\hl -> Right (Utils.hsapp (Utils.hsvar "Left") hl))) (\r -> Eithers.bind (encode r) (\hr -> Right (Utils.hsapp (Utils.hsvar "Right") hr))) v0
+        Core.TermFunction v0 -> encodeFunction depth namespaces v0 cx g
+        Core.TermLet v0 ->
+          let collectBindings =
+                  \lt ->
+                    let bs = Core.letBindings lt
+                        body = Core.letBody lt
+                    in case (Rewriting.deannotateTerm body) of
+                      Core.TermLet v1 ->
+                        let innerResult = collectBindings v1
+                        in (Lists.concat2 bs (Pairs.first innerResult), (Pairs.second innerResult))
+                      _ -> (bs, body)
+              collected = collectBindings v0
+              allBindings = Pairs.first collected
+              finalBody = Pairs.second collected
+              encodeBinding =
+                      \binding ->
+                        let name = Core.bindingName binding
+                            term_ = Core.bindingTerm binding
+                            hname = Utils.simpleName (Core.unName name)
+                        in (Eithers.bind (encode term_) (\hexpr -> Right (Syntax.LocalBindingValue (Utils.simpleValueBinding hname hexpr Nothing))))
+          in (Eithers.bind (Eithers.mapList encodeBinding allBindings) (\hbindings -> Eithers.bind (encode finalBody) (\hinner -> Right (Syntax.ExpressionLet (Syntax.LetExpression {
+            Syntax.letExpressionBindings = hbindings,
+            Syntax.letExpressionInner = hinner})))))
+        Core.TermList v0 -> Eithers.bind (Eithers.mapList encode v0) (\helems -> Right (Syntax.ExpressionList helems))
+        Core.TermLiteral v0 -> encodeLiteral v0 cx
+        Core.TermMap v0 -> Logic.ifElse (Maps.null v0) (Right (Utils.hsvar "M.empty")) (nonemptyMap v0)
+        Core.TermMaybe v0 -> Maybes.cases v0 (Right (Utils.hsvar "Nothing")) (\t -> Eithers.bind (encode t) (\ht -> Right (Utils.hsapp (Utils.hsvar "Just") ht)))
+        Core.TermPair v0 -> Eithers.bind (encode (Pairs.first v0)) (\f -> Eithers.bind (encode (Pairs.second v0)) (\s -> Right (Syntax.ExpressionTuple [
+          f,
+          s])))
+        Core.TermRecord v0 ->
+          let sname = Core.recordTypeName v0
+              fields = Core.recordFields v0
+              toFieldUpdate =
+                      \field ->
+                        let fn = Core.fieldName field
+                            ft = Core.fieldTerm field
+                            fieldRef = Utils.recordFieldReference namespaces sname fn
+                        in (Eithers.bind (encode ft) (\hft -> Right (Syntax.FieldUpdate {
+                          Syntax.fieldUpdateName = fieldRef,
+                          Syntax.fieldUpdateValue = hft})))
+              typeName = Utils.elementReference namespaces sname
+          in (Eithers.bind (Eithers.mapList toFieldUpdate fields) (\updates -> Right (Syntax.ExpressionConstructRecord (Syntax.ConstructRecordExpression {
+            Syntax.constructRecordExpressionName = typeName,
+            Syntax.constructRecordExpressionFields = updates}))))
+        Core.TermSet v0 -> Logic.ifElse (Sets.null v0) (Right (Utils.hsvar "S.empty")) (nonemptySet v0)
+        Core.TermTypeLambda v0 ->
+          let term1 = Core.typeLambdaBody v0
+          in (encode term1)
+        Core.TermTypeApplication v0 ->
+          let term1 = Core.typeApplicationTermBody v0
+          in (encode term1)
+        Core.TermUnion v0 ->
+          let sname = Core.injectionTypeName v0
+              field = Core.injectionField v0
+              fn = Core.fieldName field
+              ft = Core.fieldTerm field
+              lhs =
+                      Syntax.ExpressionVariable (Utils.unionFieldReference (Sets.union (Sets.fromList (Maps.keys (Graph.graphBoundTerms g))) (Sets.fromList (Maps.keys (Graph.graphSchemaTypes g)))) namespaces sname fn)
+              dflt = Eithers.map (Utils.hsapp lhs) (encode ft)
+          in (Eithers.bind (Schemas.requireUnionField cx g sname fn) (\ftyp -> case (Rewriting.deannotateType ftyp) of
+            Core.TypeUnit -> Right lhs
+            _ -> dflt))
+        Core.TermUnit -> Right (Syntax.ExpressionTuple [])
+        Core.TermVariable v0 -> Right (Syntax.ExpressionVariable (Utils.elementReference namespaces v0))
+        Core.TermWrap v0 ->
+          let tname = Core.wrappedTermTypeName v0
+              term_ = Core.wrappedTermBody v0
+              lhs = Syntax.ExpressionVariable (Utils.elementReference namespaces tname)
+          in (Eithers.bind (encode term_) (\rhs -> Right (Utils.hsapp lhs rhs)))
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "unexpected term: " (Core__.term term)))),
+          Context.inContextContext = cx})
+
+-- | Encode a Hydra type as a Haskell type
+encodeType :: Module.Namespaces Syntax.ModuleName -> Core.Type -> Context.Context -> t0 -> Either (Context.InContext Errors.Error) Syntax.Type
+encodeType namespaces typ cx g =
+
+      let encode = \t -> encodeType namespaces t cx g
+          ref = \name -> Right (Syntax.TypeVariable (Utils.elementReference namespaces name))
+          unitTuple = Syntax.TypeTuple []
+      in case (Rewriting.deannotateType typ) of
+        Core.TypeApplication v0 ->
+          let lhs = Core.applicationTypeFunction v0
+              rhs = Core.applicationTypeArgument v0
+          in (Eithers.bind (encode lhs) (\hlhs -> Eithers.bind (encode rhs) (\hrhs -> Right (Utils.toTypeApplication [
+            hlhs,
+            hrhs]))))
+        Core.TypeEither v0 ->
+          let left_ = Core.eitherTypeLeft v0
+              right_ = Core.eitherTypeRight v0
+          in (Eithers.bind (encode left_) (\hleft -> Eithers.bind (encode right_) (\hright -> Right (Utils.toTypeApplication [
+            Syntax.TypeVariable (Utils.rawName "Either"),
+            hleft,
+            hright]))))
+        Core.TypeFunction v0 ->
+          let dom = Core.functionTypeDomain v0
+              cod = Core.functionTypeCodomain v0
+          in (Eithers.bind (encode dom) (\hdom -> Eithers.bind (encode cod) (\hcod -> Right (Syntax.TypeFunction (Syntax.FunctionType {
+            Syntax.functionTypeDomain = hdom,
+            Syntax.functionTypeCodomain = hcod})))))
+        Core.TypeForall v0 ->
+          let v = Core.forallTypeParameter v0
+              body = Core.forallTypeBody v0
+          in (encode body)
+        Core.TypeList v0 -> Eithers.bind (encode v0) (\hlt -> Right (Syntax.TypeList hlt))
+        Core.TypeLiteral v0 -> case v0 of
+          Core.LiteralTypeBinary -> Right (Syntax.TypeVariable (Utils.rawName "B.ByteString"))
+          Core.LiteralTypeBoolean -> Right (Syntax.TypeVariable (Utils.rawName "Bool"))
+          Core.LiteralTypeFloat v1 -> case v1 of
+            Core.FloatTypeFloat32 -> Right (Syntax.TypeVariable (Utils.rawName "Float"))
+            Core.FloatTypeFloat64 -> Right (Syntax.TypeVariable (Utils.rawName "Double"))
+            Core.FloatTypeBigfloat -> Right (Syntax.TypeVariable (Utils.rawName "Double"))
+          Core.LiteralTypeInteger v1 -> case v1 of
+            Core.IntegerTypeBigint -> Right (Syntax.TypeVariable (Utils.rawName "Integer"))
+            Core.IntegerTypeInt8 -> Right (Syntax.TypeVariable (Utils.rawName "I.Int8"))
+            Core.IntegerTypeInt16 -> Right (Syntax.TypeVariable (Utils.rawName "I.Int16"))
+            Core.IntegerTypeInt32 -> Right (Syntax.TypeVariable (Utils.rawName "Int"))
+            Core.IntegerTypeInt64 -> Right (Syntax.TypeVariable (Utils.rawName "I.Int64"))
+            _ -> Left (Context.InContext {
+              Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "unexpected integer type: " (Core__.integerType v1)))),
+              Context.inContextContext = cx})
+          Core.LiteralTypeString -> Right (Syntax.TypeVariable (Utils.rawName "String"))
+          _ -> Left (Context.InContext {
+            Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "unexpected literal type: " (Core__.literalType v0)))),
+            Context.inContextContext = cx})
+        Core.TypeMap v0 ->
+          let kt = Core.mapTypeKeys v0
+              vt = Core.mapTypeValues v0
+          in (Eithers.bind (encode kt) (\hkt -> Eithers.bind (encode vt) (\hvt -> Right (Utils.toTypeApplication [
+            Syntax.TypeVariable (Utils.rawName "M.Map"),
+            hkt,
+            hvt]))))
+        Core.TypeMaybe v0 -> Eithers.bind (encode v0) (\hot -> Right (Utils.toTypeApplication [
+          Syntax.TypeVariable (Utils.rawName "Maybe"),
+          hot]))
+        Core.TypePair v0 -> Eithers.bind (encode (Core.pairTypeFirst v0)) (\f -> Eithers.bind (encode (Core.pairTypeSecond v0)) (\s -> Right (Syntax.TypeTuple [
+          f,
+          s])))
+        Core.TypeRecord _ -> ref (Core.Name "placeholder")
+        Core.TypeSet v0 -> Eithers.bind (encode v0) (\hst -> Right (Utils.toTypeApplication [
+          Syntax.TypeVariable (Utils.rawName "S.Set"),
+          hst]))
+        Core.TypeUnion _ -> ref (Core.Name "placeholder")
+        Core.TypeUnit -> Right unitTuple
+        Core.TypeVariable v0 -> ref v0
+        Core.TypeVoid -> Right (Syntax.TypeVariable (Utils.rawName "Void"))
+        Core.TypeWrap _ -> ref (Core.Name "placeholder")
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "unexpected type: " (Core__.type_ typ)))),
+          Context.inContextContext = cx})
+
+-- | Encode a Hydra type as a Haskell type with typeclass assertions
+encodeTypeWithClassAssertions :: Module.Namespaces Syntax.ModuleName -> M.Map Core.Name (S.Set Classes.TypeClass) -> Core.Type -> Context.Context -> t0 -> Either (Context.InContext Errors.Error) Syntax.Type
+encodeTypeWithClassAssertions namespaces explicitClasses typ cx g =
+
+      let classes = Maps.union explicitClasses (getImplicitTypeClasses typ)
+          implicitClasses = getImplicitTypeClasses typ
+          encodeAssertion =
+                  \pair ->
+                    let name = Pairs.first pair
+                        cls = Pairs.second pair
+                        hname =
+                                Utils.rawName (case cls of
+                                  Classes.TypeClassEquality -> "Eq"
+                                  Classes.TypeClassOrdering -> "Ord")
+                        htype = Syntax.TypeVariable (Utils.rawName (Core.unName name))
+                    in (Syntax.AssertionClass (Syntax.ClassAssertion {
+                      Syntax.classAssertionName = hname,
+                      Syntax.classAssertionTypes = [
+                        htype]}))
+          assertPairs = Lists.concat (Lists.map toPairs (Maps.toList classes))
+          toPairs =
+                  \mapEntry ->
+                    let name = Pairs.first mapEntry
+                        clsSet = Pairs.second mapEntry
+                        toPair = \c -> (name, c)
+                    in (Lists.map toPair (Sets.toList clsSet))
+      in (Eithers.bind (adaptTypeToHaskellAndEncode namespaces typ cx g) (\htyp -> Logic.ifElse (Lists.null assertPairs) (Right htyp) (
+        let encoded = Lists.map encodeAssertion assertPairs
+            hassert = Logic.ifElse (Equality.equal (Lists.length encoded) 1) (Lists.head encoded) (Syntax.AssertionTuple encoded)
+        in (Right (Syntax.TypeCtx (Syntax.ContextType {
+          Syntax.contextTypeCtx = hassert,
+          Syntax.contextTypeType = htyp}))))))
+
+-- | Find type variables that require an Ord constraint (used in maps or sets)
+findOrdVariables :: Core.Type -> S.Set Core.Name
+findOrdVariables typ =
+
+      let fold =
+              \names -> \typ_ -> case typ_ of
+                Core.TypeMap v0 ->
+                  let kt = Core.mapTypeKeys v0
+                  in (tryType names kt)
+                Core.TypeSet v0 -> tryType names v0
+                _ -> names
+          isTypeVariable = \v -> Maybes.isNothing (Names.namespaceOf v)
+          tryType =
+                  \names -> \t -> case (Rewriting.deannotateType t) of
+                    Core.TypeVariable v0 -> Logic.ifElse (isTypeVariable v0) (Sets.insert v0 names) names
+                    _ -> names
+      in (Rewriting.foldOverType Coders.TraversalOrderPre fold Sets.empty typ)
+
+-- | Get implicit typeclass constraints for type variables that need Ord
+getImplicitTypeClasses :: Core.Type -> M.Map Core.Name (S.Set Classes.TypeClass)
+getImplicitTypeClasses typ =
+
+      let toPair = \name -> (name, (Sets.fromList [
+            Classes.TypeClassOrdering]))
+      in (Maps.fromList (Lists.map toPair (Sets.toList (findOrdVariables typ))))
+
+-- | Whether to include type definitions in generated Haskell modules
+includeTypeDefinitions :: Bool
+includeTypeDefinitions = False
+
+-- | The key used to track Haskell variable depth in annotations
+keyHaskellVar :: Core.Name
+keyHaskellVar = Core.Name "haskellVar"
+
+-- | Convert a Hydra module to Haskell source code as a filepath-to-content map
+moduleToHaskell :: Module.Module -> [Module.Definition] -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) (M.Map String String)
+moduleToHaskell mod defs cx g =
+    Eithers.bind (moduleToHaskellModule mod defs cx g) (\hsmod ->
+      let s = Serialization.printExpr (Serialization.parenthesize (Serde.moduleToExpr hsmod))
+          filepath = Names.namespaceToFilePath Util.CaseConventionPascal (Module.FileExtension "hs") (Module.moduleNamespace mod)
+      in (Right (Maps.singleton filepath s)))
+
+-- | Convert a Hydra module and definitions to a Haskell module AST
+moduleToHaskellModule :: Module.Module -> [Module.Definition] -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) Syntax.Module
+moduleToHaskellModule mod defs cx g =
+    Eithers.bind (Utils.namespacesForModule mod cx g) (\namespaces -> constructModule namespaces mod defs cx g)
+
+-- | Generate Haskell declarations for type and field name constants
+nameDecls :: Module.Namespaces Syntax.ModuleName -> Core.Name -> Core.Type -> [Syntax.DeclarationWithComments]
+nameDecls namespaces name typ =
+
+      let nm = Core.unName name
+          toDecl =
+                  \n -> \pair ->
+                    let k = Pairs.first pair
+                        v = Pairs.second pair
+                        decl =
+                                Syntax.DeclarationValueBinding (Syntax.ValueBindingSimple (Syntax.SimpleValueBinding {
+                                  Syntax.simpleValueBindingPattern = (Utils.applicationPattern (Utils.simpleName k) []),
+                                  Syntax.simpleValueBindingRhs = (Syntax.RightHandSide (Syntax.ExpressionApplication (Syntax.ApplicationExpression {
+                                    Syntax.applicationExpressionFunction = (Syntax.ExpressionVariable (Utils.elementReference namespaces n)),
+                                    Syntax.applicationExpressionArgument = (Syntax.ExpressionLiteral (Syntax.LiteralString v))}))),
+                                  Syntax.simpleValueBindingLocalBindings = Nothing}))
+                    in Syntax.DeclarationWithComments {
+                      Syntax.declarationWithCommentsBody = decl,
+                      Syntax.declarationWithCommentsComments = Nothing}
+          nameDecl = (constantForTypeName name, nm)
+          fieldDecls = Lists.map toConstant (Lexical.fieldsOf typ)
+          toConstant =
+                  \fieldType ->
+                    let fname = Core.fieldTypeName fieldType
+                    in (constantForFieldName name fname, (Core.unName fname))
+      in (Logic.ifElse useCoreImport (Lists.cons (toDecl (Core.Name "hydra.core.Name") nameDecl) (Lists.map (toDecl (Core.Name "hydra.core.Name")) fieldDecls)) [])
+
+-- | Convert a Hydra term definition to a Haskell declaration with comments
+toDataDeclaration :: Module.Namespaces Syntax.ModuleName -> Module.TermDefinition -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) Syntax.DeclarationWithComments
+toDataDeclaration namespaces def cx g =
+
+      let name = Module.termDefinitionName def
+          term = Module.termDefinitionTerm def
+          typ = Module.termDefinitionType def
+          hname = Utils.simpleName (Names.localNameOf name)
+          rewriteValueBinding =
+                  \vb -> case vb of
+                    Syntax.ValueBindingSimple v0 ->
+                      let pattern_ = Syntax.simpleValueBindingPattern v0
+                          rhs = Syntax.simpleValueBindingRhs v0
+                          bindings = Syntax.simpleValueBindingLocalBindings v0
+                      in case pattern_ of
+                        Syntax.PatternApplication v1 ->
+                          let name_ = Syntax.applicationPatternName v1
+                              args = Syntax.applicationPatternArgs v1
+                              rhsExpr = Syntax.unRightHandSide rhs
+                          in case rhsExpr of
+                            Syntax.ExpressionLambda v2 ->
+                              let vars = Syntax.lambdaExpressionBindings v2
+                                  body = Syntax.lambdaExpressionInner v2
+                                  newPattern = Utils.applicationPattern name_ (Lists.concat2 args vars)
+                                  newRhs = Syntax.RightHandSide body
+                              in (rewriteValueBinding (Syntax.ValueBindingSimple (Syntax.SimpleValueBinding {
+                                Syntax.simpleValueBindingPattern = newPattern,
+                                Syntax.simpleValueBindingRhs = newRhs,
+                                Syntax.simpleValueBindingLocalBindings = bindings})))
+                            _ -> vb
+                        _ -> vb
+          toDecl =
+                  \comments -> \hname_ -> \term_ -> \bindings -> case (Rewriting.deannotateTerm term_) of
+                    Core.TermLet v0 ->
+                      let lbindings = Core.letBindings v0
+                          env = Core.letBody v0
+                          toTermDefinition = \hname_ -> \hterm_ -> Syntax.LocalBindingValue (Utils.simpleValueBinding hname_ hterm_ Nothing)
+                          hnames = Lists.map (\binding -> Utils.simpleName (Core.unName (Core.bindingName binding))) lbindings
+                          terms = Lists.map Core.bindingTerm lbindings
+                      in (Eithers.bind (Eithers.mapList (\t -> encodeTerm 0 namespaces t cx g) terms) (\hterms ->
+                        let hbindings = Lists.zipWith toTermDefinition hnames hterms
+                            prevBindings = Maybes.maybe [] (\lb -> Syntax.unLocalBindings lb) bindings
+                            allBindings = Lists.concat2 prevBindings hbindings
+                        in (toDecl comments hname_ env (Just (Syntax.LocalBindings allBindings)))))
+                    _ -> Eithers.bind (encodeTerm 0 namespaces term_ cx g) (\hterm ->
+                      let vb = Utils.simpleValueBinding hname_ hterm bindings
+                          schemeConstraints = Maybes.maybe Nothing (\ts -> Core.typeSchemeConstraints ts) typ
+                          schemeClasses = typeSchemeConstraintsToClassMap schemeConstraints
+                      in (Eithers.bind (Annotations.getTypeClasses cx g (Rewriting.removeTypesFromTerm term)) (\explicitClasses ->
+                        let combinedClasses = Maps.union schemeClasses explicitClasses
+                            schemeType = Maybes.maybe Core.TypeUnit (\ts -> Core.typeSchemeType ts) typ
+                        in (Eithers.bind (encodeTypeWithClassAssertions namespaces combinedClasses schemeType cx g) (\htype ->
+                          let decl =
+                                  Syntax.DeclarationTypedBinding (Syntax.TypedBinding {
+                                    Syntax.typedBindingTypeSignature = Syntax.TypeSignature {
+                                      Syntax.typeSignatureName = hname_,
+                                      Syntax.typeSignatureType = htype},
+                                    Syntax.typedBindingValueBinding = (rewriteValueBinding vb)})
+                          in (Right (Syntax.DeclarationWithComments {
+                            Syntax.declarationWithCommentsBody = decl,
+                            Syntax.declarationWithCommentsComments = comments})))))))
+      in (Eithers.bind (Annotations.getTermDescription cx g term) (\comments -> toDecl comments hname term Nothing))
+
+-- | Convert a Hydra type definition to Haskell declarations
+toTypeDeclarationsFrom :: Module.Namespaces Syntax.ModuleName -> Core.Name -> Core.Type -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) [Syntax.DeclarationWithComments]
+toTypeDeclarationsFrom namespaces elementName typ cx g =
+
+      let lname = Names.localNameOf elementName
+          hname = Utils.simpleName lname
+          declHead =
+                  \name -> \vars_ -> Logic.ifElse (Lists.null vars_) (Syntax.DeclarationHeadSimple name) (
+                    let h = Lists.head vars_
+                        rest = Lists.tail vars_
+                        hvar = Syntax.Variable (Utils.simpleName (Core.unName h))
+                    in (Syntax.DeclarationHeadApplication (Syntax.ApplicationDeclarationHead {
+                      Syntax.applicationDeclarationHeadFunction = (declHead name rest),
+                      Syntax.applicationDeclarationHeadOperand = hvar})))
+          newtypeCons =
+                  \tname -> \typ_ ->
+                    let hname0 = Utils.simpleName (Utils.newtypeAccessorName tname)
+                    in (Eithers.bind (adaptTypeToHaskellAndEncode namespaces typ_ cx g) (\htype ->
+                      let hfield =
+                              Syntax.FieldWithComments {
+                                Syntax.fieldWithCommentsField = Syntax.Field {
+                                  Syntax.fieldName = hname0,
+                                  Syntax.fieldType = htype},
+                                Syntax.fieldWithCommentsComments = Nothing}
+                          constructorName = Utils.simpleName (Names.localNameOf tname)
+                      in (Right (Syntax.ConstructorWithComments {
+                        Syntax.constructorWithCommentsBody = (Syntax.ConstructorRecord (Syntax.RecordConstructor {
+                          Syntax.recordConstructorName = constructorName,
+                          Syntax.recordConstructorFields = [
+                            hfield]})),
+                        Syntax.constructorWithCommentsComments = Nothing}))))
+          recordCons =
+                  \lname_ -> \fields ->
+                    let toField =
+                            \fieldType ->
+                              let fname = Core.fieldTypeName fieldType
+                                  ftype = Core.fieldTypeType fieldType
+                                  hname_ = Utils.simpleName (Strings.cat2 (Formatting.decapitalize lname_) (Formatting.capitalize (Core.unName fname)))
+                              in (Eithers.bind (adaptTypeToHaskellAndEncode namespaces ftype cx g) (\htype -> Eithers.bind (Annotations.getTypeDescription cx g ftype) (\comments -> Right (Syntax.FieldWithComments {
+                                Syntax.fieldWithCommentsField = Syntax.Field {
+                                  Syntax.fieldName = hname_,
+                                  Syntax.fieldType = htype},
+                                Syntax.fieldWithCommentsComments = comments}))))
+                    in (Eithers.bind (Eithers.mapList toField fields) (\hFields -> Right (Syntax.ConstructorWithComments {
+                      Syntax.constructorWithCommentsBody = (Syntax.ConstructorRecord (Syntax.RecordConstructor {
+                        Syntax.recordConstructorName = (Utils.simpleName lname_),
+                        Syntax.recordConstructorFields = hFields})),
+                      Syntax.constructorWithCommentsComments = Nothing})))
+          unionCons =
+                  \boundNames_ -> \lname_ -> \fieldType ->
+                    let fname = Core.fieldTypeName fieldType
+                        ftype = Core.fieldTypeType fieldType
+                        deconflict =
+                                \name ->
+                                  let tname =
+                                          Names.unqualifyName (Module.QualifiedName {
+                                            Module.qualifiedNameNamespace = (Just (Pairs.first (Module.namespacesFocus namespaces))),
+                                            Module.qualifiedNameLocal = name})
+                                  in (Logic.ifElse (Sets.member tname boundNames_) (deconflict (Strings.cat2 name "_")) name)
+                    in (Eithers.bind (Annotations.getTypeDescription cx g ftype) (\comments ->
+                      let nm = deconflict (Strings.cat2 (Formatting.capitalize lname_) (Formatting.capitalize (Core.unName fname)))
+                      in (Eithers.bind (Logic.ifElse (Equality.equal (Rewriting.deannotateType ftype) Core.TypeUnit) (Right []) (Eithers.bind (adaptTypeToHaskellAndEncode namespaces ftype cx g) (\htype -> Right [
+                        htype]))) (\typeList -> Right (Syntax.ConstructorWithComments {
+                        Syntax.constructorWithCommentsBody = (Syntax.ConstructorOrdinary (Syntax.OrdinaryConstructor {
+                          Syntax.ordinaryConstructorName = (Utils.simpleName nm),
+                          Syntax.ordinaryConstructorFields = typeList})),
+                        Syntax.constructorWithCommentsComments = comments})))))
+      in (Eithers.bind (Schemas.isSerializableByName cx g elementName) (\isSer ->
+        let deriv =
+                Syntax.Deriving (Logic.ifElse isSer (Lists.map Utils.rawName [
+                  "Eq",
+                  "Ord",
+                  "Read",
+                  "Show"]) [])
+            unpackResult = Utils.unpackForallType typ
+            vars = Pairs.first unpackResult
+            t_ = Pairs.second unpackResult
+            hd = declHead hname (Lists.reverse vars)
+        in (Eithers.bind (case (Rewriting.deannotateType t_) of
+          Core.TypeRecord v0 -> Eithers.bind (recordCons lname v0) (\cons -> Right (Syntax.DeclarationData (Syntax.DataDeclaration {
+            Syntax.dataDeclarationKeyword = Syntax.DataOrNewtypeData,
+            Syntax.dataDeclarationContext = [],
+            Syntax.dataDeclarationHead = hd,
+            Syntax.dataDeclarationConstructors = [
+              cons],
+            Syntax.dataDeclarationDeriving = [
+              deriv]})))
+          Core.TypeUnion v0 -> Eithers.bind (Eithers.mapList (unionCons (Sets.fromList (Maps.keys (Graph.graphBoundTerms g))) lname) v0) (\cons -> Right (Syntax.DeclarationData (Syntax.DataDeclaration {
+            Syntax.dataDeclarationKeyword = Syntax.DataOrNewtypeData,
+            Syntax.dataDeclarationContext = [],
+            Syntax.dataDeclarationHead = hd,
+            Syntax.dataDeclarationConstructors = cons,
+            Syntax.dataDeclarationDeriving = [
+              deriv]})))
+          Core.TypeWrap v0 -> Eithers.bind (newtypeCons elementName v0) (\cons -> Right (Syntax.DeclarationData (Syntax.DataDeclaration {
+            Syntax.dataDeclarationKeyword = Syntax.DataOrNewtypeNewtype,
+            Syntax.dataDeclarationContext = [],
+            Syntax.dataDeclarationHead = hd,
+            Syntax.dataDeclarationConstructors = [
+              cons],
+            Syntax.dataDeclarationDeriving = [
+              deriv]})))
+          _ -> Eithers.bind (adaptTypeToHaskellAndEncode namespaces typ cx g) (\htype -> Right (Syntax.DeclarationType (Syntax.TypeDeclaration {
+            Syntax.typeDeclarationName = hd,
+            Syntax.typeDeclarationType = htype})))) (\decl -> Eithers.bind (Annotations.getTypeDescription cx g typ) (\comments -> Eithers.bind (Logic.ifElse includeTypeDefinitions (Eithers.bind (typeDecl namespaces elementName typ cx g) (\decl_ -> Right [
+          decl_])) (Right [])) (\tdecls ->
+          let mainDecl =
+                  Syntax.DeclarationWithComments {
+                    Syntax.declarationWithCommentsBody = decl,
+                    Syntax.declarationWithCommentsComments = comments}
+              nameDecls_ = nameDecls namespaces elementName typ
+          in (Right (Lists.concat [
+            [
+              mainDecl],
+            nameDecls_,
+            tdecls]))))))))
+
+-- | Generate a Haskell declaration for a type definition constant
+typeDecl :: Module.Namespaces Syntax.ModuleName -> Core.Name -> Core.Type -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) Syntax.DeclarationWithComments
+typeDecl namespaces name typ cx g =
+
+      let typeName = \ns -> \name_ -> Names.qname ns (typeNameLocal name_)
+          typeNameLocal =
+                  \name_ -> Strings.cat [
+                    "_",
+                    (Names.localNameOf name_),
+                    "_type_"]
+          rawTerm = Core_.type_ typ
+          rewrite =
+                  \recurse -> \term ->
+                    let variantResult =
+                            case (Rewriting.deannotateTerm term) of
+                              Core.TermUnion v0 -> Logic.ifElse (Equality.equal (Core.injectionTypeName v0) (Core.Name "hydra.core.Type")) (Just (Core.injectionField v0)) Nothing
+                              _ -> Nothing
+                        decodeString =
+                                \term -> case (Rewriting.deannotateTerm term) of
+                                  Core.TermLiteral v0 -> case v0 of
+                                    Core.LiteralString v1 -> Just v1
+                                    _ -> Nothing
+                                  _ -> Nothing
+                        decodeName =
+                                \term -> case (Rewriting.deannotateTerm term) of
+                                  Core.TermWrap v0 -> Logic.ifElse (Equality.equal (Core.wrappedTermTypeName v0) (Core.Name "hydra.core.Name")) (Maybes.map (\x -> Core.Name x) (decodeString (Core.wrappedTermBody v0))) Nothing
+                                  _ -> Nothing
+                        forType =
+                                \field ->
+                                  let fname = Core.fieldName field
+                                      fterm = Core.fieldTerm field
+                                  in (Logic.ifElse (Equality.equal fname (Core.Name "record")) Nothing (Logic.ifElse (Equality.equal fname (Core.Name "variable")) (Maybes.bind (decodeName fterm) forVariableType) Nothing))
+                        forVariableType =
+                                \vname ->
+                                  let qname = Names.qualifyName vname
+                                      mns = Module.qualifiedNameNamespace qname
+                                      local = Module.qualifiedNameLocal qname
+                                  in (Maybes.map (\ns -> Core.TermVariable (Names.qname ns (Strings.cat [
+                                    "_",
+                                    local,
+                                    "_type_"]))) mns)
+                    in (Maybes.fromMaybe (recurse term) (Maybes.bind variantResult forType))
+          finalTerm = Rewriting.rewriteTerm rewrite rawTerm
+      in (Eithers.bind (encodeTerm 0 namespaces finalTerm cx g) (\expr ->
+        let rhs = Syntax.RightHandSide expr
+            hname = Utils.simpleName (typeNameLocal name)
+            pat = Utils.applicationPattern hname []
+            decl =
+                    Syntax.DeclarationValueBinding (Syntax.ValueBindingSimple (Syntax.SimpleValueBinding {
+                      Syntax.simpleValueBindingPattern = pat,
+                      Syntax.simpleValueBindingRhs = rhs,
+                      Syntax.simpleValueBindingLocalBindings = Nothing}))
+        in (Right (Syntax.DeclarationWithComments {
+          Syntax.declarationWithCommentsBody = decl,
+          Syntax.declarationWithCommentsComments = Nothing}))))
+
+-- | Convert type scheme constraints to a map of type variables to typeclasses
+typeSchemeConstraintsToClassMap :: Ord t0 => (Maybe (M.Map t0 Core.TypeVariableMetadata) -> M.Map t0 (S.Set Classes.TypeClass))
+typeSchemeConstraintsToClassMap maybeConstraints =
+
+      let nameToTypeClass =
+              \className ->
+                let classNameStr = Core.unName className
+                    isEq = Equality.equal classNameStr (Core.unName (Core.Name "equality"))
+                    isOrd = Equality.equal classNameStr (Core.unName (Core.Name "ordering"))
+                in (Logic.ifElse isEq (Just Classes.TypeClassEquality) (Logic.ifElse isOrd (Just Classes.TypeClassOrdering) Nothing))
+      in (Maybes.maybe Maps.empty (\constraints -> Maps.map (\meta -> Sets.fromList (Maybes.cat (Lists.map nameToTypeClass (Sets.toList (Core.typeVariableMetadataClasses meta))))) constraints) maybeConstraints)
+
+-- | Whether to use the Hydra core import in generated modules
+useCoreImport :: Bool
+useCoreImport = True
diff --git a/src/gen-main/haskell/Hydra/Ext/Haskell/Language.hs b/src/gen-main/haskell/Hydra/Ext/Haskell/Language.hs
--- a/src/gen-main/haskell/Hydra/Ext/Haskell/Language.hs
+++ b/src/gen-main/haskell/Hydra/Ext/Haskell/Language.hs
@@ -18,121 +18,132 @@
 
 -- | Language constraints for Haskell
 haskellLanguage :: Coders.Language
-haskellLanguage = Coders.Language {
-  Coders.languageName = (Coders.LanguageName "hydra.ext.haskell"),
-  Coders.languageConstraints = Coders.LanguageConstraints {
-    Coders.languageConstraintsEliminationVariants = eliminationVariants,
-    Coders.languageConstraintsLiteralVariants = literalVariants,
-    Coders.languageConstraintsFloatTypes = floatTypes,
-    Coders.languageConstraintsFunctionVariants = functionVariants,
-    Coders.languageConstraintsIntegerTypes = integerTypes,
-    Coders.languageConstraintsTermVariants = termVariants,
-    Coders.languageConstraintsTypeVariants = typeVariants,
-    Coders.languageConstraintsTypes = typePredicate}} 
-  where 
-    eliminationVariants = (Sets.fromList [
-      Variants.EliminationVariantRecord,
-      Variants.EliminationVariantUnion,
-      Variants.EliminationVariantWrap])
-    literalVariants = (Sets.fromList [
-      Variants.LiteralVariantBinary,
-      Variants.LiteralVariantBoolean,
-      Variants.LiteralVariantFloat,
-      Variants.LiteralVariantInteger,
-      Variants.LiteralVariantString])
-    floatTypes = (Sets.fromList [
-      Core.FloatTypeFloat32,
-      Core.FloatTypeFloat64])
-    functionVariants = (Sets.fromList [
-      Variants.FunctionVariantElimination,
-      Variants.FunctionVariantLambda,
-      Variants.FunctionVariantPrimitive])
-    integerTypes = (Sets.fromList [
-      Core.IntegerTypeBigint,
-      Core.IntegerTypeInt8,
-      Core.IntegerTypeInt16,
-      Core.IntegerTypeInt32,
-      Core.IntegerTypeInt64])
-    termVariants = (Sets.fromList [
-      Variants.TermVariantAnnotated,
-      Variants.TermVariantApplication,
-      Variants.TermVariantEither,
-      Variants.TermVariantFunction,
-      Variants.TermVariantLet,
-      Variants.TermVariantList,
-      Variants.TermVariantLiteral,
-      Variants.TermVariantMap,
-      Variants.TermVariantMaybe,
-      Variants.TermVariantPair,
-      Variants.TermVariantRecord,
-      Variants.TermVariantSet,
-      Variants.TermVariantUnion,
-      Variants.TermVariantUnit,
-      Variants.TermVariantVariable,
-      Variants.TermVariantWrap])
-    typeVariants = (Sets.fromList [
-      Variants.TypeVariantAnnotated,
-      Variants.TypeVariantApplication,
-      Variants.TypeVariantEither,
-      Variants.TypeVariantFunction,
-      Variants.TypeVariantForall,
-      Variants.TypeVariantList,
-      Variants.TypeVariantLiteral,
-      Variants.TypeVariantMap,
-      Variants.TypeVariantMaybe,
-      Variants.TypeVariantPair,
-      Variants.TypeVariantRecord,
-      Variants.TypeVariantSet,
-      Variants.TypeVariantUnion,
-      Variants.TypeVariantUnit,
-      Variants.TypeVariantVariable,
-      Variants.TypeVariantWrap])
-    typePredicate = (\_ -> True)
+haskellLanguage =
+    Coders.Language {
+      Coders.languageName = (Coders.LanguageName "hydra.ext.haskell"),
+      Coders.languageConstraints = Coders.LanguageConstraints {
+        Coders.languageConstraintsEliminationVariants = eliminationVariants,
+        Coders.languageConstraintsLiteralVariants = literalVariants,
+        Coders.languageConstraintsFloatTypes = floatTypes,
+        Coders.languageConstraintsFunctionVariants = functionVariants,
+        Coders.languageConstraintsIntegerTypes = integerTypes,
+        Coders.languageConstraintsTermVariants = termVariants,
+        Coders.languageConstraintsTypeVariants = typeVariants,
+        Coders.languageConstraintsTypes = typePredicate}}
+  where
+    eliminationVariants =
+        Sets.fromList [
+          Variants.EliminationVariantRecord,
+          Variants.EliminationVariantUnion,
+          Variants.EliminationVariantWrap]
+    literalVariants =
+        Sets.fromList [
+          Variants.LiteralVariantBinary,
+          Variants.LiteralVariantBoolean,
+          Variants.LiteralVariantFloat,
+          Variants.LiteralVariantInteger,
+          Variants.LiteralVariantString]
+    floatTypes =
+        Sets.fromList [
+          Core.FloatTypeFloat32,
+          Core.FloatTypeFloat64]
+    functionVariants =
+        Sets.fromList [
+          Variants.FunctionVariantElimination,
+          Variants.FunctionVariantLambda,
+          Variants.FunctionVariantPrimitive]
+    integerTypes =
+        Sets.fromList [
+          Core.IntegerTypeBigint,
+          Core.IntegerTypeInt8,
+          Core.IntegerTypeInt16,
+          Core.IntegerTypeInt32,
+          Core.IntegerTypeInt64]
+    termVariants =
+        Sets.fromList [
+          Variants.TermVariantAnnotated,
+          Variants.TermVariantApplication,
+          Variants.TermVariantEither,
+          Variants.TermVariantFunction,
+          Variants.TermVariantLet,
+          Variants.TermVariantList,
+          Variants.TermVariantLiteral,
+          Variants.TermVariantMap,
+          Variants.TermVariantMaybe,
+          Variants.TermVariantPair,
+          Variants.TermVariantRecord,
+          Variants.TermVariantSet,
+          Variants.TermVariantUnion,
+          Variants.TermVariantUnit,
+          Variants.TermVariantVariable,
+          Variants.TermVariantWrap]
+    typeVariants =
+        Sets.fromList [
+          Variants.TypeVariantAnnotated,
+          Variants.TypeVariantApplication,
+          Variants.TypeVariantEither,
+          Variants.TypeVariantFunction,
+          Variants.TypeVariantForall,
+          Variants.TypeVariantList,
+          Variants.TypeVariantLiteral,
+          Variants.TypeVariantMap,
+          Variants.TypeVariantMaybe,
+          Variants.TypeVariantPair,
+          Variants.TypeVariantRecord,
+          Variants.TypeVariantSet,
+          Variants.TypeVariantUnion,
+          Variants.TypeVariantUnit,
+          Variants.TypeVariantVariable,
+          Variants.TypeVariantVoid,
+          Variants.TypeVariantWrap]
+    typePredicate = \_ -> True
 
 -- | Created on 2025-02-28 using GHCi 9.6.6
--- | 
+-- |
 -- | You can reproduce these lists of symbols by issuing the command `:browse Prelude` in GHCi, pasting the results into
 -- | /tmp/browse_Prelude.txt, and then running the Bash command provided with each list.
--- | 
+-- |
 -- | See also https://www.haskell.org/onlinereport/standard-prelude.html
-reservedWords :: (S.Set String)
-reservedWords = (Sets.fromList (Lists.concat2 keywordSymbols reservedSymbols)) 
-  where 
-    keywordSymbols = [
-      "case",
-      "class",
-      "data",
-      "default",
-      "deriving",
-      "do",
-      "else",
-      "forall",
-      "foreign",
-      "if",
-      "import",
-      "in",
-      "infix",
-      "infixl",
-      "infixr",
-      "instance",
-      "let",
-      "module",
-      "newtype",
-      "of",
-      "then",
-      "type",
-      "where"]
-    reservedSymbols = [
-      "Bool",
-      "Double",
-      "False",
-      "Float",
-      "Int",
-      "Integer",
-      "Just",
-      "Maybe",
-      "Nothing",
-      "Ord",
-      "Show",
-      "String",
-      "True"]
+reservedWords :: S.Set String
+reservedWords = Sets.fromList (Lists.concat2 keywordSymbols reservedSymbols)
+  where
+    keywordSymbols =
+        [
+          "case",
+          "class",
+          "data",
+          "default",
+          "deriving",
+          "do",
+          "else",
+          "forall",
+          "foreign",
+          "if",
+          "import",
+          "in",
+          "infix",
+          "infixl",
+          "infixr",
+          "instance",
+          "let",
+          "module",
+          "newtype",
+          "of",
+          "then",
+          "type",
+          "where"]
+    reservedSymbols =
+        [
+          "Bool",
+          "Double",
+          "False",
+          "Float",
+          "Int",
+          "Integer",
+          "Just",
+          "Maybe",
+          "Nothing",
+          "Ord",
+          "Show",
+          "String",
+          "True"]
diff --git a/src/gen-main/haskell/Hydra/Ext/Haskell/Operators.hs b/src/gen-main/haskell/Hydra/Ext/Haskell/Operators.hs
--- a/src/gen-main/haskell/Hydra/Ext/Haskell/Operators.hs
+++ b/src/gen-main/haskell/Hydra/Ext/Haskell/Operators.hs
@@ -16,142 +16,143 @@
 
 -- | Logical AND operator (&&)
 andOp :: Ast.Op
-andOp = (Serialization.op "&&" 3 Ast.AssociativityRight)
+andOp = Serialization.op "&&" 3 Ast.AssociativityRight
 
 -- | Applicative apply operator (<*>)
 apOp :: Ast.Op
-apOp = (Serialization.op "<*>" 4 Ast.AssociativityLeft)
+apOp = Serialization.op "<*>" 4 Ast.AssociativityLeft
 
 -- | Function application operator (whitespace)
 appOp :: Ast.Op
-appOp = Ast.Op {
-  Ast.opSymbol = (Ast.Symbol ""),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsNone,
-    Ast.paddingRight = Ast.WsSpace},
-  Ast.opPrecedence = (Ast.Precedence 0),
-  Ast.opAssociativity = Ast.AssociativityLeft}
+appOp =
+    Ast.Op {
+      Ast.opSymbol = (Ast.Symbol ""),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsNone,
+        Ast.paddingRight = Ast.WsSpace},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityLeft}
 
 -- | Low-precedence function application ($)
 applyOp :: Ast.Op
-applyOp = (Serialization.op "$" 0 Ast.AssociativityRight)
+applyOp = Serialization.op "$" 0 Ast.AssociativityRight
 
 -- | Function type arrow (->)
 arrowOp :: Ast.Op
-arrowOp = (Serialization.op "->" (Math.negate 1) Ast.AssociativityRight)
+arrowOp = Serialization.op "->" (Math.negate 1) Ast.AssociativityRight
 
 -- | Type class constraint arrow (=>)
 assertOp :: Ast.Op
-assertOp = (Serialization.op "=>" 0 Ast.AssociativityNone)
+assertOp = Serialization.op "=>" 0 Ast.AssociativityNone
 
 -- | Monadic bind operator (>>=)
 bindOp :: Ast.Op
-bindOp = (Serialization.op ">>=" 1 Ast.AssociativityLeft)
+bindOp = Serialization.op ">>=" 1 Ast.AssociativityLeft
 
 -- | Case alternative arrow (->)
 caseOp :: Ast.Op
-caseOp = (Serialization.op "->" 0 Ast.AssociativityNone)
+caseOp = Serialization.op "->" 0 Ast.AssociativityNone
 
 -- | Function composition (.)
 composeOp :: Ast.Op
-composeOp = (Serialization.op "." 9 Ast.AssociativityLeft)
+composeOp = Serialization.op "." 9 Ast.AssociativityLeft
 
 -- | List concatenation (++)
 concatOp :: Ast.Op
-concatOp = (Serialization.op "++" 5 Ast.AssociativityRight)
+concatOp = Serialization.op "++" 5 Ast.AssociativityRight
 
 -- | List cons (:)
 consOp :: Ast.Op
-consOp = (Serialization.op ":" 5 Ast.AssociativityRight)
+consOp = Serialization.op ":" 5 Ast.AssociativityRight
 
 -- | Definition operator (=)
 defineOp :: Ast.Op
-defineOp = (Serialization.op "=" 0 Ast.AssociativityNone)
+defineOp = Serialization.op "=" 0 Ast.AssociativityNone
 
 -- | Semigroup append (<>)
 diamondOp :: Ast.Op
-diamondOp = (Serialization.op "<>" 6 Ast.AssociativityRight)
+diamondOp = Serialization.op "<>" 6 Ast.AssociativityRight
 
 -- | Integer division (`div`)
 divOp :: Ast.Op
-divOp = (Serialization.op "`div`" 7 Ast.AssociativityLeft)
+divOp = Serialization.op "`div`" 7 Ast.AssociativityLeft
 
 -- | Fractional division (/)
 divideOp :: Ast.Op
-divideOp = (Serialization.op "/" 7 Ast.AssociativityLeft)
+divideOp = Serialization.op "/" 7 Ast.AssociativityLeft
 
 -- | List membership (`elem`)
 elemOp :: Ast.Op
-elemOp = (Serialization.op "`elem`" 4 Ast.AssociativityNone)
+elemOp = Serialization.op "`elem`" 4 Ast.AssociativityNone
 
 -- | Equality comparison (==)
 equalOp :: Ast.Op
-equalOp = (Serialization.op "==" 4 Ast.AssociativityNone)
+equalOp = Serialization.op "==" 4 Ast.AssociativityNone
 
 -- | Functor map (<$>)
 fmapOp :: Ast.Op
-fmapOp = (Serialization.op "<$>" 4 Ast.AssociativityLeft)
+fmapOp = Serialization.op "<$>" 4 Ast.AssociativityLeft
 
 -- | Greater than (>)
 gtOp :: Ast.Op
-gtOp = (Serialization.op ">" 4 Ast.AssociativityNone)
+gtOp = Serialization.op ">" 4 Ast.AssociativityNone
 
 -- | Greater than or equal (>=)
 gteOp :: Ast.Op
-gteOp = (Serialization.op ">=" 4 Ast.AssociativityNone)
+gteOp = Serialization.op ">=" 4 Ast.AssociativityNone
 
 -- | List indexing (!!)
 indexOp :: Ast.Op
-indexOp = (Serialization.op "!!" 9 Ast.AssociativityLeft)
+indexOp = Serialization.op "!!" 9 Ast.AssociativityLeft
 
 -- | Lambda body arrow (->)
 lambdaOp :: Ast.Op
-lambdaOp = (Serialization.op "->" (Math.negate 1) Ast.AssociativityRight)
+lambdaOp = Serialization.op "->" (Math.negate 1) Ast.AssociativityRight
 
 -- | Less than (<)
 ltOp :: Ast.Op
-ltOp = (Serialization.op "<" 4 Ast.AssociativityNone)
+ltOp = Serialization.op "<" 4 Ast.AssociativityNone
 
 -- | Less than or equal (<=)
 lteOp :: Ast.Op
-lteOp = (Serialization.op ">=" 4 Ast.AssociativityNone)
+lteOp = Serialization.op ">=" 4 Ast.AssociativityNone
 
 -- | Subtraction (-). Originally: associativityLeft
 minusOp :: Ast.Op
-minusOp = (Serialization.op "-" 6 Ast.AssociativityBoth)
+minusOp = Serialization.op "-" 6 Ast.AssociativityBoth
 
 -- | Modulo (`mod`)
 modOp :: Ast.Op
-modOp = (Serialization.op "`mod`" 7 Ast.AssociativityLeft)
+modOp = Serialization.op "`mod`" 7 Ast.AssociativityLeft
 
 -- | Multiplication (*). Originally: associativityLeft
 multOp :: Ast.Op
-multOp = (Serialization.op "*" 7 Ast.AssociativityBoth)
+multOp = Serialization.op "*" 7 Ast.AssociativityBoth
 
 -- | Not equal (/=)
 neqOp :: Ast.Op
-neqOp = (Serialization.op "/=" 4 Ast.AssociativityNone)
+neqOp = Serialization.op "/=" 4 Ast.AssociativityNone
 
 -- | List non-membership (`notElem`)
 notElemOp :: Ast.Op
-notElemOp = (Serialization.op "`notElem`" 4 Ast.AssociativityNone)
+notElemOp = Serialization.op "`notElem`" 4 Ast.AssociativityNone
 
 -- | Logical OR (||)
 orOp :: Ast.Op
-orOp = (Serialization.op "||" 2 Ast.AssociativityRight)
+orOp = Serialization.op "||" 2 Ast.AssociativityRight
 
 -- | Addition (+). Originally: associativityLeft
 plusOp :: Ast.Op
-plusOp = (Serialization.op "+" 6 Ast.AssociativityBoth)
+plusOp = Serialization.op "+" 6 Ast.AssociativityBoth
 
 -- | Integer quotient (`quot`)
 quotOp :: Ast.Op
-quotOp = (Serialization.op "`quot`" 7 Ast.AssociativityLeft)
+quotOp = Serialization.op "`quot`" 7 Ast.AssociativityLeft
 
 -- | Integer remainder (`rem`)
 remOp :: Ast.Op
-remOp = (Serialization.op "`rem`" 7 Ast.AssociativityLeft)
+remOp = Serialization.op "`rem`" 7 Ast.AssociativityLeft
 
 -- | Type annotation (::)
 typeOp :: Ast.Op
-typeOp = (Serialization.op "::" 0 Ast.AssociativityNone)
+typeOp = Serialization.op "::" 0 Ast.AssociativityNone
diff --git a/src/gen-main/haskell/Hydra/Ext/Haskell/Serde.hs b/src/gen-main/haskell/Hydra/Ext/Haskell/Serde.hs
--- a/src/gen-main/haskell/Hydra/Ext/Haskell/Serde.hs
+++ b/src/gen-main/haskell/Hydra/Ext/Haskell/Serde.hs
@@ -10,8 +10,8 @@
 
 import qualified Hydra.Ast as Ast
 import qualified Hydra.Constants as Constants
-import qualified Hydra.Ext.Haskell.Ast as Ast_
 import qualified Hydra.Ext.Haskell.Operators as Operators
+import qualified Hydra.Ext.Haskell.Syntax as Syntax
 import qualified Hydra.Lib.Equality as Equality
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Literals as Literals
@@ -27,377 +27,445 @@
 import qualified Data.Set as S
 
 -- | Convert a pattern-matching alternative to an AST expression
-alternativeToExpr :: (Ast_.Alternative -> Ast.Expr)
-alternativeToExpr alt = (Serialization.ifx Operators.caseOp (patternToExpr (Ast_.alternativePattern alt)) (caseRhsToExpr (Ast_.alternativeRhs alt)))
+alternativeToExpr :: Syntax.Alternative -> Ast.Expr
+alternativeToExpr alt =
+    Serialization.structuralSpaceSep [
+      patternToExpr (Syntax.alternativePattern alt),
+      (Serialization.cst "->"),
+      (caseRhsToExpr (Syntax.alternativeRhs alt))]
 
 -- | Convert a function application expression to an AST expression
-applicationExpressionToExpr :: (Ast_.ApplicationExpression -> Ast.Expr)
-applicationExpressionToExpr app = (Serialization.ifx Operators.appOp (expressionToExpr (Ast_.applicationExpressionFunction app)) (expressionToExpr (Ast_.applicationExpressionArgument app)))
+applicationExpressionToExpr :: Syntax.ApplicationExpression -> Ast.Expr
+applicationExpressionToExpr app =
+    Serialization.ifx Operators.appOp (expressionToExpr (Syntax.applicationExpressionFunction app)) (expressionToExpr (Syntax.applicationExpressionArgument app))
 
 -- | Convert an application pattern to an AST expression
-applicationPatternToExpr :: (Ast_.ApplicationPattern -> Ast.Expr)
-applicationPatternToExpr appPat =  
-  let name = (Ast_.applicationPatternName appPat) 
-      pats = (Ast_.applicationPatternArgs appPat)
-  in (Serialization.spaceSep (Lists.cons (nameToExpr name) (Lists.map patternToExpr pats)))
+applicationPatternToExpr :: Syntax.ApplicationPattern -> Ast.Expr
+applicationPatternToExpr appPat =
 
+      let name = Syntax.applicationPatternName appPat
+          pats = Syntax.applicationPatternArgs appPat
+      in (Serialization.spaceSep (Lists.cons (nameToExpr name) (Lists.map patternToExpr pats)))
+
 -- | Convert a type class assertion to an AST expression
-assertionToExpr :: (Ast_.Assertion -> Ast.Expr)
-assertionToExpr sert = ((\x -> case x of
-  Ast_.AssertionClass v1 -> (classAssertionToExpr v1)
-  Ast_.AssertionTuple v1 -> (Serialization.parenList False (Lists.map assertionToExpr v1))) sert)
+assertionToExpr :: Syntax.Assertion -> Ast.Expr
+assertionToExpr sert =
+    case sert of
+      Syntax.AssertionClass v0 -> classAssertionToExpr v0
+      Syntax.AssertionTuple v0 -> Serialization.parenList False (Lists.map assertionToExpr v0)
 
 -- | Convert a case expression to an AST expression
-caseExpressionToExpr :: (Ast_.CaseExpression -> Ast.Expr)
-caseExpressionToExpr caseExpr =  
-  let cs = (Ast_.caseExpressionCase caseExpr) 
-      alts = (Ast_.caseExpressionAlternatives caseExpr)
-      ofOp = Ast.Op {
-              Ast.opSymbol = (Ast.Symbol "of"),
-              Ast.opPadding = Ast.Padding {
-                Ast.paddingLeft = Ast.WsSpace,
-                Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
-              Ast.opPrecedence = (Ast.Precedence 0),
-              Ast.opAssociativity = Ast.AssociativityNone}
-      lhs = (Serialization.spaceSep [
-              Serialization.cst "case",
-              (expressionToExpr cs)])
-      rhs = (Serialization.newlineSep (Lists.map alternativeToExpr alts))
-  in (Serialization.ifx ofOp lhs rhs)
+caseExpressionToExpr :: Syntax.CaseExpression -> Ast.Expr
+caseExpressionToExpr caseExpr =
 
+      let cs = Syntax.caseExpressionCase caseExpr
+          alts = Syntax.caseExpressionAlternatives caseExpr
+          ofOp =
+                  Ast.Op {
+                    Ast.opSymbol = (Ast.Symbol "of"),
+                    Ast.opPadding = Ast.Padding {
+                      Ast.paddingLeft = Ast.WsSpace,
+                      Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
+                    Ast.opPrecedence = (Ast.Precedence 0),
+                    Ast.opAssociativity = Ast.AssociativityNone}
+          lhs =
+                  Serialization.spaceSep [
+                    Serialization.cst "case",
+                    (expressionToExpr cs)]
+          rhs = Serialization.newlineSep (Lists.map alternativeToExpr alts)
+      in (Serialization.ifx ofOp lhs rhs)
+
 -- | Convert a case right-hand side to an AST expression
-caseRhsToExpr :: (Ast_.CaseRhs -> Ast.Expr)
-caseRhsToExpr rhs = (expressionToExpr (Ast_.unCaseRhs rhs))
+caseRhsToExpr :: Syntax.CaseRhs -> Ast.Expr
+caseRhsToExpr rhs = expressionToExpr (Syntax.unCaseRhs rhs)
 
 -- | Convert a class assertion to an AST expression
-classAssertionToExpr :: (Ast_.ClassAssertion -> Ast.Expr)
-classAssertionToExpr clsAsrt =  
-  let name = (Ast_.classAssertionName clsAsrt) 
-      types = (Ast_.classAssertionTypes clsAsrt)
-  in (Serialization.spaceSep (Lists.cons (nameToExpr name) [
-    Serialization.commaSep Serialization.halfBlockStyle (Lists.map typeToExpr types)]))
+classAssertionToExpr :: Syntax.ClassAssertion -> Ast.Expr
+classAssertionToExpr clsAsrt =
 
+      let name = Syntax.classAssertionName clsAsrt
+          types = Syntax.classAssertionTypes clsAsrt
+      in (Serialization.spaceSep (Lists.cons (nameToExpr name) [
+        Serialization.commaSep Serialization.halfBlockStyle (Lists.map typeToExpr types)]))
+
+-- | Convert a record construction expression to an AST expression
+constructRecordExpressionToExpr :: Syntax.ConstructRecordExpression -> Ast.Expr
+constructRecordExpressionToExpr constructRecord =
+
+      let name = Syntax.constructRecordExpressionName constructRecord
+          updates = Syntax.constructRecordExpressionFields constructRecord
+          fromUpdate =
+                  \update ->
+                    let fn = Syntax.fieldUpdateName update
+                        val = Syntax.fieldUpdateValue update
+                    in (Serialization.ifx Operators.defineOp (nameToExpr fn) (expressionToExpr val))
+          body = Serialization.commaSep Serialization.halfBlockStyle (Lists.map fromUpdate updates)
+      in (Serialization.spaceSep (Lists.cons (nameToExpr name) [
+        Serialization.brackets Serialization.curlyBraces Serialization.halfBlockStyle body]))
+
 -- | Convert a data constructor to an AST expression
-constructorToExpr :: (Ast_.Constructor -> Ast.Expr)
-constructorToExpr cons = ((\x -> case x of
-  Ast_.ConstructorOrdinary v1 ->  
-    let name = (Ast_.ordinaryConstructorName v1) 
-        types = (Ast_.ordinaryConstructorFields v1)
-    in (Serialization.spaceSep (Lists.cons (nameToExpr name) [
-      Serialization.spaceSep (Lists.map typeToExpr types)]))
-  Ast_.ConstructorRecord v1 ->  
-    let name = (Ast_.recordConstructorName v1) 
-        fields = (Ast_.recordConstructorFields v1)
-    in (Serialization.spaceSep (Lists.cons (nameToExpr name) [
-      Serialization.curlyBracesList Nothing Serialization.halfBlockStyle (Lists.map fieldWithCommentsToExpr fields)]))) cons)
+constructorToExpr :: Syntax.Constructor -> Ast.Expr
+constructorToExpr cons =
+    case cons of
+      Syntax.ConstructorOrdinary v0 ->
+        let name = Syntax.ordinaryConstructorName v0
+            types = Syntax.ordinaryConstructorFields v0
+        in (Serialization.spaceSep (Lists.cons (nameToExpr name) [
+          Serialization.spaceSep (Lists.map typeToExpr types)]))
+      Syntax.ConstructorRecord v0 ->
+        let name = Syntax.recordConstructorName v0
+            fields = Syntax.recordConstructorFields v0
+        in (Serialization.spaceSep (Lists.cons (nameToExpr name) [
+          Serialization.curlyBracesList Nothing Serialization.halfBlockStyle (Lists.map fieldWithCommentsToExpr fields)]))
 
 -- | Convert a data constructor with comments to an AST expression
-constructorWithCommentsToExpr :: (Ast_.ConstructorWithComments -> Ast.Expr)
-constructorWithCommentsToExpr consWithComments =  
-  let body = (Ast_.constructorWithCommentsBody consWithComments) 
-      mc = (Ast_.constructorWithCommentsComments consWithComments)
-  in (Maybes.maybe (constructorToExpr body) (\c -> Serialization.newlineSep (Lists.cons (Serialization.cst (toHaskellComments c)) [
-    constructorToExpr body])) mc)
+constructorWithCommentsToExpr :: Syntax.ConstructorWithComments -> Ast.Expr
+constructorWithCommentsToExpr consWithComments =
 
+      let body = Syntax.constructorWithCommentsBody consWithComments
+          mc = Syntax.constructorWithCommentsComments consWithComments
+      in (Maybes.maybe (constructorToExpr body) (\c -> Serialization.newlineSep (Lists.cons (Serialization.cst (toHaskellComments c)) [
+        constructorToExpr body])) mc)
+
 -- | Convert a data/newtype keyword to an AST expression
-dataOrNewtypeToExpr :: (Ast_.DataOrNewtype -> Ast.Expr)
-dataOrNewtypeToExpr kw = ((\x -> case x of
-  Ast_.DataOrNewtypeData -> (Serialization.cst "data")
-  Ast_.DataOrNewtypeNewtype -> (Serialization.cst "newtype")) kw)
+dataOrNewtypeToExpr :: Syntax.DataOrNewtype -> Ast.Expr
+dataOrNewtypeToExpr kw =
+    case kw of
+      Syntax.DataOrNewtypeData -> Serialization.cst "data"
+      Syntax.DataOrNewtypeNewtype -> Serialization.cst "newtype"
 
 -- | Convert a declaration head to an AST expression
-declarationHeadToExpr :: (Ast_.DeclarationHead -> Ast.Expr)
-declarationHeadToExpr hd = ((\x -> case x of
-  Ast_.DeclarationHeadApplication v1 ->  
-    let fun = (Ast_.applicationDeclarationHeadFunction v1) 
-        op = (Ast_.applicationDeclarationHeadOperand v1)
-    in (Serialization.spaceSep (Lists.cons (declarationHeadToExpr fun) [
-      variableToExpr op]))
-  Ast_.DeclarationHeadSimple v1 -> (nameToExpr v1)) hd)
+declarationHeadToExpr :: Syntax.DeclarationHead -> Ast.Expr
+declarationHeadToExpr hd =
+    case hd of
+      Syntax.DeclarationHeadApplication v0 ->
+        let fun = Syntax.applicationDeclarationHeadFunction v0
+            op = Syntax.applicationDeclarationHeadOperand v0
+        in (Serialization.spaceSep (Lists.cons (declarationHeadToExpr fun) [
+          variableToExpr op]))
+      Syntax.DeclarationHeadSimple v0 -> nameToExpr v0
 
 -- | Convert a declaration to an AST expression
-declarationToExpr :: (Ast_.Declaration -> Ast.Expr)
-declarationToExpr decl = ((\x -> case x of
-  Ast_.DeclarationData v1 ->  
-    let kw = (Ast_.dataDeclarationKeyword v1) 
-        hd = (Ast_.dataDeclarationHead v1)
-        cons = (Ast_.dataDeclarationConstructors v1)
-        deriv = (Ast_.dataDeclarationDeriving v1)
-        derivCat = (Lists.concat (Lists.map Ast_.unDeriving deriv))
-        constructors = (Serialization.orSep Serialization.halfBlockStyle (Lists.map constructorWithCommentsToExpr cons))
-        derivingClause = (Logic.ifElse (Lists.null derivCat) [] [
-                Serialization.spaceSep (Lists.cons (Serialization.cst "deriving") [
-                  Serialization.parenList False (Lists.map nameToExpr derivCat)])])
-        mainParts = [
-                Serialization.spaceSep (Lists.cons (dataOrNewtypeToExpr kw) (Lists.cons (declarationHeadToExpr hd) [
-                  Serialization.cst "="])),
-                constructors]
-    in (Serialization.indentBlock (Lists.concat2 mainParts derivingClause))
-  Ast_.DeclarationType v1 ->  
-    let hd = (Ast_.typeDeclarationName v1) 
-        typ = (Ast_.typeDeclarationType v1)
-    in (Serialization.spaceSep (Lists.cons (Serialization.cst "type") (Lists.cons (declarationHeadToExpr hd) (Lists.cons (Serialization.cst "=") [
-      typeToExpr typ]))))
-  Ast_.DeclarationValueBinding v1 -> (valueBindingToExpr v1)
-  Ast_.DeclarationTypedBinding v1 ->  
-    let typeSig = (Ast_.typedBindingTypeSignature v1) 
-        vb = (Ast_.typedBindingValueBinding v1)
-        name = (Ast_.typeSignatureName typeSig)
-        htype = (Ast_.typeSignatureType typeSig)
-    in (Serialization.newlineSep (Lists.cons (Serialization.ifx Operators.typeOp (nameToExpr name) (typeToExpr htype)) [
-      valueBindingToExpr vb]))) decl)
+declarationToExpr :: Syntax.Declaration -> Ast.Expr
+declarationToExpr decl =
+    case decl of
+      Syntax.DeclarationData v0 ->
+        let kw = Syntax.dataDeclarationKeyword v0
+            hd = Syntax.dataDeclarationHead v0
+            cons = Syntax.dataDeclarationConstructors v0
+            deriv = Syntax.dataDeclarationDeriving v0
+            derivCat = Lists.concat (Lists.map Syntax.unDeriving deriv)
+            constructors = Serialization.orSep Serialization.halfBlockStyle (Lists.map constructorWithCommentsToExpr cons)
+            derivingClause =
+                    Logic.ifElse (Lists.null derivCat) [] [
+                      Serialization.spaceSep (Lists.cons (Serialization.cst "deriving") [
+                        Serialization.parenList False (Lists.map nameToExpr derivCat)])]
+            mainParts =
+                    [
+                      Serialization.spaceSep (Lists.cons (dataOrNewtypeToExpr kw) (Lists.cons (declarationHeadToExpr hd) [
+                        Serialization.cst "="])),
+                      constructors]
+        in (Serialization.indentBlock (Lists.concat2 mainParts derivingClause))
+      Syntax.DeclarationType v0 ->
+        let hd = Syntax.typeDeclarationName v0
+            typ = Syntax.typeDeclarationType v0
+        in (Serialization.spaceSep (Lists.cons (Serialization.cst "type") (Lists.cons (declarationHeadToExpr hd) (Lists.cons (Serialization.cst "=") [
+          typeToExpr typ]))))
+      Syntax.DeclarationValueBinding v0 -> valueBindingToExpr v0
+      Syntax.DeclarationTypedBinding v0 ->
+        let typeSig = Syntax.typedBindingTypeSignature v0
+            vb = Syntax.typedBindingValueBinding v0
+            name = Syntax.typeSignatureName typeSig
+            htype = Syntax.typeSignatureType typeSig
+        in (Serialization.newlineSep (Lists.cons (Serialization.structuralSpaceSep [
+          nameToExpr name,
+          (Serialization.cst "::"),
+          (typeToExpr htype)]) [
+          valueBindingToExpr vb]))
 
 -- | Convert a declaration with comments to an AST expression
-declarationWithCommentsToExpr :: (Ast_.DeclarationWithComments -> Ast.Expr)
-declarationWithCommentsToExpr declWithComments =  
-  let body = (Ast_.declarationWithCommentsBody declWithComments) 
-      mc = (Ast_.declarationWithCommentsComments declWithComments)
-  in (Maybes.maybe (declarationToExpr body) (\c -> Serialization.newlineSep (Lists.cons (Serialization.cst (toHaskellComments c)) [
-    declarationToExpr body])) mc)
+declarationWithCommentsToExpr :: Syntax.DeclarationWithComments -> Ast.Expr
+declarationWithCommentsToExpr declWithComments =
 
--- | Convert a Haskell expression to an AST expression
-expressionToExpr :: (Ast_.Expression -> Ast.Expr)
-expressionToExpr expr = ((\x -> case x of
-  Ast_.ExpressionApplication v1 -> (applicationExpressionToExpr v1)
-  Ast_.ExpressionCase v1 -> (caseExpressionToExpr v1)
-  Ast_.ExpressionConstructRecord v1 -> (constructRecordExpressionToExpr v1)
-  Ast_.ExpressionDo v1 -> (Serialization.indentBlock (Lists.cons (Serialization.cst "do") (Lists.map statementToExpr v1)))
-  Ast_.ExpressionIf v1 -> (ifExpressionToExpr v1)
-  Ast_.ExpressionLiteral v1 -> (literalToExpr v1)
-  Ast_.ExpressionLambda v1 -> (Serialization.parenthesize (lambdaExpressionToExpr v1))
-  Ast_.ExpressionLet v1 ->  
-    let bindings = (Ast_.letExpressionBindings v1) 
-        inner = (Ast_.letExpressionInner v1)
-        encodeBinding = (\binding -> Serialization.indentSubsequentLines "      " (localBindingToExpr binding))
-    in (Serialization.indentBlock (Lists.cons (Serialization.cst "") (Lists.cons (Serialization.spaceSep (Lists.cons (Serialization.cst "let") [
-      Serialization.customIndentBlock "    " (Lists.map encodeBinding bindings)])) [
-      Serialization.spaceSep (Lists.cons (Serialization.cst "in") [
-        expressionToExpr inner])])))
-  Ast_.ExpressionList v1 -> (Serialization.bracketList Serialization.halfBlockStyle (Lists.map expressionToExpr v1))
-  Ast_.ExpressionParens v1 -> (Serialization.parenthesize (expressionToExpr v1))
-  Ast_.ExpressionTuple v1 -> (Serialization.parenList False (Lists.map expressionToExpr v1))
-  Ast_.ExpressionVariable v1 -> (nameToExpr v1)) expr)
+      let body = Syntax.declarationWithCommentsBody declWithComments
+          mc = Syntax.declarationWithCommentsComments declWithComments
+      in (Maybes.maybe (declarationToExpr body) (\c -> Serialization.newlineSep (Lists.cons (Serialization.cst (toHaskellComments c)) [
+        declarationToExpr body])) mc)
 
--- | Convert a record construction expression to an AST expression
-constructRecordExpressionToExpr :: (Ast_.ConstructRecordExpression -> Ast.Expr)
-constructRecordExpressionToExpr constructRecord =  
-  let name = (Ast_.constructRecordExpressionName constructRecord) 
-      updates = (Ast_.constructRecordExpressionFields constructRecord)
-      fromUpdate = (\update ->  
-              let fn = (Ast_.fieldUpdateName update) 
-                  val = (Ast_.fieldUpdateValue update)
-              in (Serialization.ifx Operators.defineOp (nameToExpr fn) (expressionToExpr val)))
-      body = (Serialization.commaSep Serialization.halfBlockStyle (Lists.map fromUpdate updates))
-  in (Serialization.spaceSep (Lists.cons (nameToExpr name) [
-    Serialization.brackets Serialization.curlyBraces Serialization.halfBlockStyle body]))
+-- | Convert a Haskell expression to an AST expression
+expressionToExpr :: Syntax.Expression -> Ast.Expr
+expressionToExpr expr =
+    case expr of
+      Syntax.ExpressionApplication v0 -> applicationExpressionToExpr v0
+      Syntax.ExpressionCase v0 -> caseExpressionToExpr v0
+      Syntax.ExpressionConstructRecord v0 -> constructRecordExpressionToExpr v0
+      Syntax.ExpressionDo v0 -> Serialization.indentBlock (Lists.cons (Serialization.cst "do") (Lists.map statementToExpr v0))
+      Syntax.ExpressionIf v0 -> ifExpressionToExpr v0
+      Syntax.ExpressionLiteral v0 -> literalToExpr v0
+      Syntax.ExpressionLambda v0 -> Serialization.parenthesize (lambdaExpressionToExpr v0)
+      Syntax.ExpressionLet v0 ->
+        let bindings = Syntax.letExpressionBindings v0
+            inner = Syntax.letExpressionInner v0
+            encodeBinding = \binding -> Serialization.indentSubsequentLines "    " (localBindingToExpr binding)
+        in (Serialization.indentBlock (Lists.cons (Serialization.cst "") (Lists.cons (Serialization.spaceSep (Lists.cons (Serialization.cst "let") [
+          Serialization.customIndentBlock "    " (Lists.map encodeBinding bindings)])) [
+          Serialization.spaceSep (Lists.cons (Serialization.cst "in") [
+            expressionToExpr inner])])))
+      Syntax.ExpressionList v0 -> Serialization.bracketList Serialization.halfBlockStyle (Lists.map expressionToExpr v0)
+      Syntax.ExpressionParens v0 -> Serialization.parenthesize (expressionToExpr v0)
+      Syntax.ExpressionTuple v0 -> Serialization.parenList False (Lists.map expressionToExpr v0)
+      Syntax.ExpressionVariable v0 -> nameToExpr v0
 
 -- | Convert a field declaration to an AST expression
-fieldToExpr :: (Ast_.Field -> Ast.Expr)
-fieldToExpr field =  
-  let name = (Ast_.fieldName field) 
-      typ = (Ast_.fieldType field)
-  in (Serialization.spaceSep (Lists.cons (nameToExpr name) (Lists.cons (Serialization.cst "::") [
-    typeToExpr typ])))
+fieldToExpr :: Syntax.Field -> Ast.Expr
+fieldToExpr field =
 
+      let name = Syntax.fieldName field
+          typ = Syntax.fieldType field
+      in (Serialization.spaceSep (Lists.cons (nameToExpr name) (Lists.cons (Serialization.cst "::") [
+        typeToExpr typ])))
+
 -- | Convert a field with comments to an AST expression
-fieldWithCommentsToExpr :: (Ast_.FieldWithComments -> Ast.Expr)
-fieldWithCommentsToExpr fieldWithComments =  
-  let field = (Ast_.fieldWithCommentsField fieldWithComments) 
-      mc = (Ast_.fieldWithCommentsComments fieldWithComments)
-  in (Maybes.maybe (fieldToExpr field) (\c -> Serialization.newlineSep (Lists.cons (Serialization.cst (toHaskellComments c)) [
-    fieldToExpr field])) mc)
+fieldWithCommentsToExpr :: Syntax.FieldWithComments -> Ast.Expr
+fieldWithCommentsToExpr fieldWithComments =
 
+      let field = Syntax.fieldWithCommentsField fieldWithComments
+          mc = Syntax.fieldWithCommentsComments fieldWithComments
+      in (Maybes.maybe (fieldToExpr field) (\c -> Serialization.newlineSep (Lists.cons (Serialization.cst (toHaskellComments c)) [
+        fieldToExpr field])) mc)
+
 -- | Convert an if-then-else expression to an AST expression
-ifExpressionToExpr :: (Ast_.IfExpression -> Ast.Expr)
-ifExpressionToExpr ifExpr =  
-  let eif = (Ast_.ifExpressionCondition ifExpr) 
-      ethen = (Ast_.ifExpressionThen ifExpr)
-      eelse = (Ast_.ifExpressionElse ifExpr)
-      ifOp = Ast.Op {
-              Ast.opSymbol = (Ast.Symbol ""),
-              Ast.opPadding = Ast.Padding {
-                Ast.paddingLeft = Ast.WsNone,
-                Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
-              Ast.opPrecedence = (Ast.Precedence 0),
-              Ast.opAssociativity = Ast.AssociativityNone}
-      body = (Serialization.newlineSep (Lists.cons (Serialization.spaceSep (Lists.cons (Serialization.cst "then") [
-              expressionToExpr ethen])) [
-              Serialization.spaceSep (Lists.cons (Serialization.cst "else") [
-                expressionToExpr eelse])]))
-  in (Serialization.ifx ifOp (Serialization.spaceSep (Lists.cons (Serialization.cst "if") [
-    expressionToExpr eif])) body)
+ifExpressionToExpr :: Syntax.IfExpression -> Ast.Expr
+ifExpressionToExpr ifExpr =
 
+      let eif = Syntax.ifExpressionCondition ifExpr
+          ethen = Syntax.ifExpressionThen ifExpr
+          eelse = Syntax.ifExpressionElse ifExpr
+          ifOp =
+                  Ast.Op {
+                    Ast.opSymbol = (Ast.Symbol ""),
+                    Ast.opPadding = Ast.Padding {
+                      Ast.paddingLeft = Ast.WsNone,
+                      Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
+                    Ast.opPrecedence = (Ast.Precedence 0),
+                    Ast.opAssociativity = Ast.AssociativityNone}
+          body =
+                  Serialization.newlineSep (Lists.cons (Serialization.spaceSep (Lists.cons (Serialization.cst "then") [
+                    expressionToExpr ethen])) [
+                    Serialization.spaceSep (Lists.cons (Serialization.cst "else") [
+                      expressionToExpr eelse])])
+      in (Serialization.ifx ifOp (Serialization.spaceSep (Lists.cons (Serialization.cst "if") [
+        expressionToExpr eif])) body)
+
 -- | Convert an import/export specification to an AST expression
-importExportSpecToExpr :: (Ast_.ImportExportSpec -> Ast.Expr)
-importExportSpecToExpr spec = (nameToExpr (Ast_.importExportSpecName spec))
+importExportSpecToExpr :: Syntax.ImportExportSpec -> Ast.Expr
+importExportSpecToExpr spec = nameToExpr (Syntax.importExportSpecName spec)
 
 -- | Convert an import statement to an AST expression
-importToExpr :: (Ast_.Import -> Ast.Expr)
-importToExpr import_ =  
-  let qual = (Ast_.importQualified import_) 
-      modName = (Ast_.importModule import_)
-      mod = (Ast_.importAs import_)
-      mspec = (Ast_.importSpec import_)
-      name = (Ast_.unModuleName modName)
-      hidingSec = (\spec -> (\x -> case x of
-              Ast_.SpecImportHiding v1 -> (Serialization.spaceSep (Lists.cons (Serialization.cst "hiding ") [
-                Serialization.parens (Serialization.commaSep Serialization.inlineStyle (Lists.map importExportSpecToExpr v1))]))) spec)
-      parts = (Maybes.cat [
-              Just (Serialization.cst "import"),
-              (Logic.ifElse qual (Just (Serialization.cst "qualified")) Nothing),
-              (Just (Serialization.cst name)),
-              (Maybes.map (\m -> Serialization.cst (Strings.cat2 "as " (Ast_.unModuleName m))) mod),
-              (Maybes.map hidingSec mspec)])
-  in (Serialization.spaceSep parts)
+importToExpr :: Syntax.Import -> Ast.Expr
+importToExpr import_ =
 
+      let qual = Syntax.importQualified import_
+          modName = Syntax.importModule import_
+          mod = Syntax.importAs import_
+          mspec = Syntax.importSpec import_
+          name = Syntax.unModuleName modName
+          hidingSec =
+                  \spec -> case spec of
+                    Syntax.SpecImportHiding v0 -> Serialization.spaceSep (Lists.cons (Serialization.cst "hiding ") [
+                      Serialization.parens (Serialization.commaSep Serialization.inlineStyle (Lists.map importExportSpecToExpr v0))])
+          parts =
+                  Maybes.cat [
+                    Just (Serialization.cst "import"),
+                    (Logic.ifElse qual (Just (Serialization.cst "qualified")) Nothing),
+                    (Just (Serialization.cst name)),
+                    (Maybes.map (\m -> Serialization.cst (Strings.cat2 "as " (Syntax.unModuleName m))) mod),
+                    (Maybes.map hidingSec mspec)]
+      in (Serialization.spaceSep parts)
+
 -- | Convert a lambda expression to an AST expression
-lambdaExpressionToExpr :: (Ast_.LambdaExpression -> Ast.Expr)
-lambdaExpressionToExpr lambdaExpr =  
-  let bindings = (Ast_.lambdaExpressionBindings lambdaExpr) 
-      inner = (Ast_.lambdaExpressionInner lambdaExpr)
-      head = (Serialization.spaceSep (Lists.map patternToExpr bindings))
-      body = (expressionToExpr inner)
-  in (Serialization.ifx Operators.lambdaOp (Serialization.prefix "\\" head) body)
+lambdaExpressionToExpr :: Syntax.LambdaExpression -> Ast.Expr
+lambdaExpressionToExpr lambdaExpr =
 
+      let bindings = Syntax.lambdaExpressionBindings lambdaExpr
+          inner = Syntax.lambdaExpressionInner lambdaExpr
+          head = Serialization.spaceSep (Lists.map patternToExpr bindings)
+          body = expressionToExpr inner
+      in (Serialization.ifx Operators.lambdaOp (Serialization.prefix "\\" head) body)
+
 -- | Convert a literal value to an AST expression
-literalToExpr :: (Ast_.Literal -> Ast.Expr)
-literalToExpr lit =  
-  let parensIfNeg = (\b -> \e -> Logic.ifElse b (Strings.cat [
-          "(",
-          e,
-          ")"]) e)
-  in (Serialization.cst ((\x -> case x of
-    Ast_.LiteralChar v1 -> (Literals.showString (Literals.showUint16 v1))
-    Ast_.LiteralDouble v1 -> (parensIfNeg (Equality.lt v1 0.0) (Literals.showFloat64 v1))
-    Ast_.LiteralFloat v1 -> (parensIfNeg (Equality.lt v1 0.0) (Literals.showFloat32 v1))
-    Ast_.LiteralInt v1 -> (parensIfNeg (Equality.lt v1 0) (Literals.showInt32 v1))
-    Ast_.LiteralInteger v1 -> (parensIfNeg (Equality.lt v1 0) (Literals.showBigint v1))
-    Ast_.LiteralString v1 -> (Literals.showString v1)) lit))
+literalToExpr :: Syntax.Literal -> Ast.Expr
+literalToExpr lit =
 
+      let parensIfNeg =
+              \b -> \e -> Logic.ifElse b (Strings.cat [
+                "(",
+                e,
+                ")"]) e
+      in (Serialization.cst (case lit of
+        Syntax.LiteralChar v0 -> Literals.showString (Literals.showUint16 v0)
+        Syntax.LiteralDouble v0 -> parensIfNeg (Equality.lt v0 0.0) (Literals.showFloat64 v0)
+        Syntax.LiteralFloat v0 -> parensIfNeg (Equality.lt v0 0.0) (Literals.showFloat32 v0)
+        Syntax.LiteralInt v0 -> parensIfNeg (Equality.lt v0 0) (Literals.showInt32 v0)
+        Syntax.LiteralInteger v0 -> parensIfNeg (Equality.lt v0 0) (Literals.showBigint v0)
+        Syntax.LiteralString v0 -> Literals.showString v0))
+
 -- | Convert a local binding to an AST expression
-localBindingToExpr :: (Ast_.LocalBinding -> Ast.Expr)
-localBindingToExpr binding = ((\x -> case x of
-  Ast_.LocalBindingSignature v1 -> (typeSignatureToExpr v1)
-  Ast_.LocalBindingValue v1 -> (valueBindingToExpr v1)) binding)
+localBindingToExpr :: Syntax.LocalBinding -> Ast.Expr
+localBindingToExpr binding =
+    case binding of
+      Syntax.LocalBindingSignature v0 -> typeSignatureToExpr v0
+      Syntax.LocalBindingValue v0 -> valueBindingToExpr v0
 
 -- | Convert a module head to an AST expression
-moduleHeadToExpr :: (Ast_.ModuleHead -> Ast.Expr)
-moduleHeadToExpr moduleHead =  
-  let mc = (Ast_.moduleHeadComments moduleHead) 
-      modName = (Ast_.moduleHeadName moduleHead)
-      mname = (Ast_.unModuleName modName)
-      head = (Serialization.spaceSep (Lists.cons (Serialization.cst "module") (Lists.cons (Serialization.cst mname) [
-              Serialization.cst "where"])))
-  in (Maybes.maybe head (\c -> Serialization.newlineSep (Lists.cons (Serialization.cst (toHaskellComments c)) (Lists.cons (Serialization.cst "") [
-    head]))) mc)
+moduleHeadToExpr :: Syntax.ModuleHead -> Ast.Expr
+moduleHeadToExpr moduleHead =
 
+      let mc = Syntax.moduleHeadComments moduleHead
+          modName = Syntax.moduleHeadName moduleHead
+          mname = Syntax.unModuleName modName
+          head =
+                  Serialization.spaceSep (Lists.cons (Serialization.cst "module") (Lists.cons (Serialization.cst mname) [
+                    Serialization.cst "where"]))
+      in (Maybes.maybe head (\c -> Serialization.newlineSep (Lists.cons (Serialization.cst (toHaskellComments c)) (Lists.cons (Serialization.cst "") [
+        head]))) mc)
+
 -- | Convert a Haskell module to an AST expression
-moduleToExpr :: (Ast_.Module -> Ast.Expr)
-moduleToExpr module_ =  
-  let mh = (Ast_.moduleHead module_) 
-      imports = (Ast_.moduleImports module_)
-      decls = (Ast_.moduleDeclarations module_)
-      warning = [
-              Serialization.cst (toSimpleComments Constants.warningAutoGeneratedFile)]
-      headerLine = (Maybes.maybe [] (\h -> [
-              moduleHeadToExpr h]) mh)
-      declLines = (Lists.map declarationWithCommentsToExpr decls)
-      importLines = (Logic.ifElse (Lists.null imports) [] [
-              Serialization.newlineSep (Lists.map importToExpr imports)])
-  in (Serialization.doubleNewlineSep (Lists.concat [
-    warning,
-    headerLine,
-    importLines,
-    declLines]))
+moduleToExpr :: Syntax.Module -> Ast.Expr
+moduleToExpr module_ =
 
+      let mh = Syntax.moduleHead module_
+          imports = Syntax.moduleImports module_
+          decls = Syntax.moduleDeclarations module_
+          warning = [
+                Serialization.cst (toSimpleComments Constants.warningAutoGeneratedFile)]
+          headerLine = Maybes.maybe [] (\h -> [
+                moduleHeadToExpr h]) mh
+          declLines = Lists.map declarationWithCommentsToExpr decls
+          importLines = Logic.ifElse (Lists.null imports) [] [
+                Serialization.newlineSep (Lists.map importToExpr imports)]
+      in (Serialization.doubleNewlineSep (Lists.concat [
+        warning,
+        headerLine,
+        importLines,
+        declLines]))
+
 -- | Convert a Haskell name to an AST expression
-nameToExpr :: (Ast_.Name -> Ast.Expr)
-nameToExpr name = (Serialization.cst ((\x -> case x of
-  Ast_.NameImplicit v1 -> (Strings.cat2 "?" (writeQualifiedName v1))
-  Ast_.NameNormal v1 -> (writeQualifiedName v1)
-  Ast_.NameParens v1 -> (Strings.cat [
-    "(",
-    (writeQualifiedName v1),
-    ")"])) name))
+nameToExpr :: Syntax.Name -> Ast.Expr
+nameToExpr name =
+    Serialization.cst (case name of
+      Syntax.NameImplicit v0 -> Strings.cat2 "?" (writeQualifiedName v0)
+      Syntax.NameNormal v0 -> writeQualifiedName v0
+      Syntax.NameParens v0 -> Strings.cat [
+        "(",
+        (writeQualifiedName v0),
+        ")"])
 
 -- | Convert a pattern to an AST expression
-patternToExpr :: (Ast_.Pattern -> Ast.Expr)
-patternToExpr pat = ((\x -> case x of
-  Ast_.PatternApplication v1 -> (applicationPatternToExpr v1)
-  Ast_.PatternList v1 -> (Serialization.bracketList Serialization.halfBlockStyle (Lists.map patternToExpr v1))
-  Ast_.PatternLiteral v1 -> (literalToExpr v1)
-  Ast_.PatternName v1 -> (nameToExpr v1)
-  Ast_.PatternParens v1 -> (Serialization.parenthesize (patternToExpr v1))
-  Ast_.PatternTuple v1 -> (Serialization.parenList False (Lists.map patternToExpr v1))
-  Ast_.PatternWildcard -> (Serialization.cst "_")) pat)
+patternToExpr :: Syntax.Pattern -> Ast.Expr
+patternToExpr pat =
+    case pat of
+      Syntax.PatternApplication v0 -> applicationPatternToExpr v0
+      Syntax.PatternList v0 -> Serialization.bracketList Serialization.halfBlockStyle (Lists.map patternToExpr v0)
+      Syntax.PatternLiteral v0 -> literalToExpr v0
+      Syntax.PatternName v0 -> nameToExpr v0
+      Syntax.PatternParens v0 -> Serialization.parenthesize (patternToExpr v0)
+      Syntax.PatternTuple v0 -> Serialization.parenList False (Lists.map patternToExpr v0)
+      Syntax.PatternWildcard -> Serialization.cst "_"
 
 -- | Convert a right-hand side to an AST expression
-rightHandSideToExpr :: (Ast_.RightHandSide -> Ast.Expr)
-rightHandSideToExpr rhs = (expressionToExpr (Ast_.unRightHandSide rhs))
+rightHandSideToExpr :: Syntax.RightHandSide -> Ast.Expr
+rightHandSideToExpr rhs = expressionToExpr (Syntax.unRightHandSide rhs)
 
 -- | Convert a statement to an AST expression
-statementToExpr :: (Ast_.Statement -> Ast.Expr)
-statementToExpr stmt = (expressionToExpr (Ast_.unStatement stmt))
+statementToExpr :: Syntax.Statement -> Ast.Expr
+statementToExpr stmt = expressionToExpr (Syntax.unStatement stmt)
 
+-- | Convert a string to Haddock documentation comments
+toHaskellComments :: String -> String
+toHaskellComments c = Strings.intercalate "\n" (Lists.map (\s -> Strings.cat2 "-- | " s) (Strings.lines c))
+
+-- | Convert a string to simple line comments
+toSimpleComments :: String -> String
+toSimpleComments c = Strings.intercalate "\n" (Lists.map (\s -> Strings.cat2 "-- " s) (Strings.lines c))
+
 -- | Convert a type signature to an AST expression
-typeSignatureToExpr :: (Ast_.TypeSignature -> Ast.Expr)
-typeSignatureToExpr typeSig =  
-  let name = (Ast_.typeSignatureName typeSig) 
-      typ = (Ast_.typeSignatureType typeSig)
-  in (Serialization.spaceSep (Lists.cons (nameToExpr name) (Lists.cons (Serialization.cst "::") [
-    typeToExpr typ])))
+typeSignatureToExpr :: Syntax.TypeSignature -> Ast.Expr
+typeSignatureToExpr typeSig =
 
+      let name = Syntax.typeSignatureName typeSig
+          typ = Syntax.typeSignatureType typeSig
+          nameExpr = nameToExpr name
+          typeExpr = typeToExpr typ
+          inlineSig =
+                  Serialization.structuralSpaceSep [
+                    nameExpr,
+                    (Serialization.cst "::"),
+                    typeExpr]
+      in (Logic.ifElse (Equality.gt (Serialization.expressionLength inlineSig) 120) (Serialization.newlineSep [
+        Serialization.spaceSep [
+          nameExpr,
+          (Serialization.cst "::")],
+        (Serialization.tabIndent typeExpr)]) inlineSig)
+
 -- | Convert a Haskell type to an AST expression
-typeToExpr :: (Ast_.Type -> Ast.Expr)
-typeToExpr htype = ((\x -> case x of
-  Ast_.TypeApplication v1 ->  
-    let lhs = (Ast_.applicationTypeContext v1) 
-        rhs = (Ast_.applicationTypeArgument v1)
-    in (Serialization.ifx Operators.appOp (typeToExpr lhs) (typeToExpr rhs))
-  Ast_.TypeCtx v1 ->  
-    let ctx = (Ast_.contextTypeCtx v1) 
-        typ = (Ast_.contextTypeType v1)
-    in (Serialization.ifx Operators.assertOp (assertionToExpr ctx) (typeToExpr typ))
-  Ast_.TypeFunction v1 ->  
-    let dom = (Ast_.functionTypeDomain v1) 
-        cod = (Ast_.functionTypeCodomain v1)
-    in (Serialization.ifx Operators.arrowOp (typeToExpr dom) (typeToExpr cod))
-  Ast_.TypeList v1 -> (Serialization.bracketList Serialization.inlineStyle [
-    typeToExpr v1])
-  Ast_.TypeTuple v1 -> (Serialization.parenList False (Lists.map typeToExpr v1))
-  Ast_.TypeVariable v1 -> (nameToExpr v1)) htype)
+typeToExpr :: Syntax.Type -> Ast.Expr
+typeToExpr htype =
+    case htype of
+      Syntax.TypeApplication v0 ->
+        let lhs = Syntax.applicationTypeContext v0
+            rhs = Syntax.applicationTypeArgument v0
+        in (Serialization.ifx Operators.appOp (typeToExpr lhs) (typeToExpr rhs))
+      Syntax.TypeCtx v0 ->
+        let ctx = Syntax.contextTypeCtx v0
+            typ = Syntax.contextTypeType v0
+        in (Serialization.ifx Operators.assertOp (assertionToExpr ctx) (typeToExpr typ))
+      Syntax.TypeFunction v0 ->
+        let dom = Syntax.functionTypeDomain v0
+            cod = Syntax.functionTypeCodomain v0
+        in (Serialization.ifx Operators.arrowOp (typeToExpr dom) (typeToExpr cod))
+      Syntax.TypeList v0 -> Serialization.bracketList Serialization.inlineStyle [
+        typeToExpr v0]
+      Syntax.TypeTuple v0 -> Serialization.parenList False (Lists.map typeToExpr v0)
+      Syntax.TypeVariable v0 -> nameToExpr v0
 
 -- | Convert a value binding to an AST expression
-valueBindingToExpr :: (Ast_.ValueBinding -> Ast.Expr)
-valueBindingToExpr vb = ((\x -> case x of
-  Ast_.ValueBindingSimple v1 ->  
-    let pat = (Ast_.simpleValueBindingPattern v1) 
-        rhs = (Ast_.simpleValueBindingRhs v1)
-        local = (Ast_.simpleValueBindingLocalBindings v1)
-        body = (Serialization.ifx Operators.defineOp (patternToExpr pat) (rightHandSideToExpr rhs))
-    in (Maybes.maybe body (\localBindings ->  
-      let bindings = (Ast_.unLocalBindings localBindings)
-      in (Serialization.indentBlock (Lists.cons body [
-        Serialization.indentBlock (Lists.cons (Serialization.cst "where") (Lists.map localBindingToExpr bindings))]))) local)) vb)
+valueBindingToExpr :: Syntax.ValueBinding -> Ast.Expr
+valueBindingToExpr vb =
+    case vb of
+      Syntax.ValueBindingSimple v0 ->
+        let pat = Syntax.simpleValueBindingPattern v0
+            rhs = Syntax.simpleValueBindingRhs v0
+            local = Syntax.simpleValueBindingLocalBindings v0
+            lhsExpr = patternToExpr pat
+            rhsExpr = rightHandSideToExpr rhs
+            inlineBody =
+                    Serialization.structuralSpaceSep [
+                      lhsExpr,
+                      (Serialization.cst "="),
+                      rhsExpr]
+            body =
+                    Logic.ifElse (Equality.gt (Serialization.expressionLength inlineBody) 120) (Serialization.newlineSep [
+                      Serialization.spaceSep [
+                        lhsExpr,
+                        (Serialization.cst "=")],
+                      (Serialization.tabIndent rhsExpr)]) inlineBody
+        in (Maybes.maybe body (\localBindings ->
+          let bindings = Syntax.unLocalBindings localBindings
+          in (Serialization.indentBlock (Lists.cons body [
+            Serialization.indentBlock (Lists.cons (Serialization.cst "where") (Lists.map localBindingToExpr bindings))]))) local)
 
 -- | Convert a type variable to an AST expression
-variableToExpr :: (Ast_.Variable -> Ast.Expr)
-variableToExpr variable = (nameToExpr (Ast_.unVariable variable))
-
--- | Convert a string to Haddock documentation comments
-toHaskellComments :: (String -> String)
-toHaskellComments c = (Strings.intercalate "\n" (Lists.map (\s -> Strings.cat2 "-- | " s) (Strings.lines c)))
-
--- | Convert a string to simple line comments
-toSimpleComments :: (String -> String)
-toSimpleComments c = (Strings.intercalate "\n" (Lists.map (\s -> Strings.cat2 "-- " s) (Strings.lines c)))
+variableToExpr :: Syntax.Variable -> Ast.Expr
+variableToExpr variable = nameToExpr (Syntax.unVariable variable)
 
 -- | Write a qualified name as a string
-writeQualifiedName :: (Ast_.QualifiedName -> String)
-writeQualifiedName qname =  
-  let qualifiers = (Ast_.qualifiedNameQualifiers qname) 
-      unqual = (Ast_.qualifiedNameUnqualified qname)
-      h = (\namePart -> Ast_.unNamePart namePart)
-      allParts = (Lists.concat2 (Lists.map h qualifiers) [
-              h unqual])
-  in (Strings.intercalate "." allParts)
+writeQualifiedName :: Syntax.QualifiedName -> String
+writeQualifiedName qname =
+
+      let qualifiers = Syntax.qualifiedNameQualifiers qname
+          unqual = Syntax.qualifiedNameUnqualified qname
+          h = \namePart -> Syntax.unNamePart namePart
+          allParts = Lists.concat2 (Lists.map h qualifiers) [
+                h unqual]
+      in (Strings.intercalate "." allParts)
diff --git a/src/gen-main/haskell/Hydra/Ext/Haskell/Syntax.hs b/src/gen-main/haskell/Hydra/Ext/Haskell/Syntax.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Ext/Haskell/Syntax.hs
@@ -0,0 +1,1111 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | A Haskell syntax model, loosely based on Language.Haskell.Tools.AST
+
+module Hydra.Ext.Haskell.Syntax where
+
+import qualified Hydra.Core as Core
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | A pattern-matching alternative
+data Alternative =
+  Alternative {
+    -- | The pattern to match
+    alternativePattern :: Pattern,
+    -- | The right-hand side of the alternative
+    alternativeRhs :: CaseRhs,
+    -- | Optional local bindings
+    alternativeBinds :: (Maybe LocalBindings)}
+  deriving (Eq, Ord, Read, Show)
+
+_Alternative = Core.Name "hydra.ext.haskell.syntax.Alternative"
+
+_Alternative_pattern = Core.Name "pattern"
+
+_Alternative_rhs = Core.Name "rhs"
+
+_Alternative_binds = Core.Name "binds"
+
+-- | A type assertion
+data Assertion =
+  -- | A class assertion
+  AssertionClass ClassAssertion |
+  -- | A tuple of assertions
+  AssertionTuple [Assertion]
+  deriving (Eq, Ord, Read, Show)
+
+_Assertion = Core.Name "hydra.ext.haskell.syntax.Assertion"
+
+_Assertion_class = Core.Name "class"
+
+_Assertion_tuple = Core.Name "tuple"
+
+-- | A class assertion
+data ClassAssertion =
+  ClassAssertion {
+    -- | The name of the class
+    classAssertionName :: Name,
+    -- | The types to which the class is applied
+    classAssertionTypes :: [Type]}
+  deriving (Eq, Ord, Read, Show)
+
+_ClassAssertion = Core.Name "hydra.ext.haskell.syntax.ClassAssertion"
+
+_ClassAssertion_name = Core.Name "name"
+
+_ClassAssertion_types = Core.Name "types"
+
+-- | The right-hand side of a pattern-matching alternative
+newtype CaseRhs =
+  CaseRhs {
+    unCaseRhs :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_CaseRhs = Core.Name "hydra.ext.haskell.syntax.CaseRhs"
+
+-- | A data constructor
+data Constructor =
+  -- | An ordinary (positional) constructor
+  ConstructorOrdinary OrdinaryConstructor |
+  -- | A record constructor
+  ConstructorRecord RecordConstructor
+  deriving (Eq, Ord, Read, Show)
+
+_Constructor = Core.Name "hydra.ext.haskell.syntax.Constructor"
+
+_Constructor_ordinary = Core.Name "ordinary"
+
+_Constructor_record = Core.Name "record"
+
+-- | An ordinary (positional) data constructor
+data OrdinaryConstructor =
+  OrdinaryConstructor {
+    -- | The name of the constructor
+    ordinaryConstructorName :: Name,
+    -- | The types of the positional fields
+    ordinaryConstructorFields :: [Type]}
+  deriving (Eq, Ord, Read, Show)
+
+_OrdinaryConstructor = Core.Name "hydra.ext.haskell.syntax.OrdinaryConstructor"
+
+_OrdinaryConstructor_name = Core.Name "name"
+
+_OrdinaryConstructor_fields = Core.Name "fields"
+
+-- | A record-style data constructor
+data RecordConstructor =
+  RecordConstructor {
+    -- | The name of the constructor
+    recordConstructorName :: Name,
+    -- | The named fields of the record
+    recordConstructorFields :: [FieldWithComments]}
+  deriving (Eq, Ord, Read, Show)
+
+_RecordConstructor = Core.Name "hydra.ext.haskell.syntax.RecordConstructor"
+
+_RecordConstructor_name = Core.Name "name"
+
+_RecordConstructor_fields = Core.Name "fields"
+
+-- | A data constructor together with any comments
+data ConstructorWithComments =
+  ConstructorWithComments {
+    -- | The constructor
+    constructorWithCommentsBody :: Constructor,
+    -- | Optional comments
+    constructorWithCommentsComments :: (Maybe String)}
+  deriving (Eq, Ord, Read, Show)
+
+_ConstructorWithComments = Core.Name "hydra.ext.haskell.syntax.ConstructorWithComments"
+
+_ConstructorWithComments_body = Core.Name "body"
+
+_ConstructorWithComments_comments = Core.Name "comments"
+
+-- | A data type declaration
+data DataDeclaration =
+  DataDeclaration {
+    -- | The 'data' or 'newtype' keyword
+    dataDeclarationKeyword :: DataOrNewtype,
+    -- | Type class constraints
+    dataDeclarationContext :: [Assertion],
+    -- | The declaration head
+    dataDeclarationHead :: DeclarationHead,
+    -- | The data constructors
+    dataDeclarationConstructors :: [ConstructorWithComments],
+    -- | Derived type class instances
+    dataDeclarationDeriving :: [Deriving]}
+  deriving (Eq, Ord, Read, Show)
+
+_DataDeclaration = Core.Name "hydra.ext.haskell.syntax.DataDeclaration"
+
+_DataDeclaration_keyword = Core.Name "keyword"
+
+_DataDeclaration_context = Core.Name "context"
+
+_DataDeclaration_head = Core.Name "head"
+
+_DataDeclaration_constructors = Core.Name "constructors"
+
+_DataDeclaration_deriving = Core.Name "deriving"
+
+-- | The 'data' versus 'newtype keyword
+data DataOrNewtype =
+  DataOrNewtypeData  |
+  DataOrNewtypeNewtype
+  deriving (Eq, Ord, Read, Show)
+
+_DataOrNewtype = Core.Name "hydra.ext.haskell.syntax.DataOrNewtype"
+
+_DataOrNewtype_data = Core.Name "data"
+
+_DataOrNewtype_newtype = Core.Name "newtype"
+
+-- | A data declaration together with any comments
+data DeclarationWithComments =
+  DeclarationWithComments {
+    -- | The declaration
+    declarationWithCommentsBody :: Declaration,
+    -- | Optional comments
+    declarationWithCommentsComments :: (Maybe String)}
+  deriving (Eq, Ord, Read, Show)
+
+_DeclarationWithComments = Core.Name "hydra.ext.haskell.syntax.DeclarationWithComments"
+
+_DeclarationWithComments_body = Core.Name "body"
+
+_DeclarationWithComments_comments = Core.Name "comments"
+
+-- | A data or value declaration
+data Declaration =
+  -- | A data type declaration
+  DeclarationData DataDeclaration |
+  -- | A type synonym declaration
+  DeclarationType TypeDeclaration |
+  -- | A value binding
+  DeclarationValueBinding ValueBinding |
+  -- | A typed binding
+  DeclarationTypedBinding TypedBinding
+  deriving (Eq, Ord, Read, Show)
+
+_Declaration = Core.Name "hydra.ext.haskell.syntax.Declaration"
+
+_Declaration_data = Core.Name "data"
+
+_Declaration_type = Core.Name "type"
+
+_Declaration_valueBinding = Core.Name "valueBinding"
+
+_Declaration_typedBinding = Core.Name "typedBinding"
+
+-- | The left-hand side of a declaration
+data DeclarationHead =
+  -- | An application-style declaration head
+  DeclarationHeadApplication ApplicationDeclarationHead |
+  -- | A parenthesized declaration head
+  DeclarationHeadParens DeclarationHead |
+  -- | A simple name
+  DeclarationHeadSimple Name
+  deriving (Eq, Ord, Read, Show)
+
+_DeclarationHead = Core.Name "hydra.ext.haskell.syntax.DeclarationHead"
+
+_DeclarationHead_application = Core.Name "application"
+
+_DeclarationHead_parens = Core.Name "parens"
+
+_DeclarationHead_simple = Core.Name "simple"
+
+-- | An application-style declaration head
+data ApplicationDeclarationHead =
+  ApplicationDeclarationHead {
+    -- | The function being applied
+    applicationDeclarationHeadFunction :: DeclarationHead,
+    -- | The type variable operand
+    applicationDeclarationHeadOperand :: Variable}
+  deriving (Eq, Ord, Read, Show)
+
+_ApplicationDeclarationHead = Core.Name "hydra.ext.haskell.syntax.ApplicationDeclarationHead"
+
+_ApplicationDeclarationHead_function = Core.Name "function"
+
+_ApplicationDeclarationHead_operand = Core.Name "operand"
+
+-- | A 'deriving' statement
+newtype Deriving =
+  Deriving {
+    unDeriving :: [Name]}
+  deriving (Eq, Ord, Read, Show)
+
+_Deriving = Core.Name "hydra.ext.haskell.syntax.Deriving"
+
+-- | An export statement
+data Export =
+  -- | An exported declaration
+  ExportDeclaration ImportExportSpec |
+  -- | An exported module
+  ExportModule ModuleName
+  deriving (Eq, Ord, Read, Show)
+
+_Export = Core.Name "hydra.ext.haskell.syntax.Export"
+
+_Export_declaration = Core.Name "declaration"
+
+_Export_module = Core.Name "module"
+
+-- | A data expression
+data Expression =
+  -- | A function application
+  ExpressionApplication ApplicationExpression |
+  -- | A case expression
+  ExpressionCase CaseExpression |
+  -- | A record constructor expression
+  ExpressionConstructRecord ConstructRecordExpression |
+  -- | A 'do' expression
+  ExpressionDo [Statement] |
+  -- | An 'if' expression
+  ExpressionIf IfExpression |
+  -- | An infix application
+  ExpressionInfixApplication InfixApplicationExpression |
+  -- | A literal value
+  ExpressionLiteral Literal |
+  -- | A lambda expression
+  ExpressionLambda LambdaExpression |
+  -- | A left section expression
+  ExpressionLeftSection SectionExpression |
+  -- | A 'let' expression
+  ExpressionLet LetExpression |
+  -- | A list expression
+  ExpressionList [Expression] |
+  -- | A parenthesized expression
+  ExpressionParens Expression |
+  -- | A prefix application
+  ExpressionPrefixApplication PrefixApplicationExpression |
+  -- | A right section expression
+  ExpressionRightSection SectionExpression |
+  -- | A tuple expression
+  ExpressionTuple [Expression] |
+  -- | A type signature expression
+  ExpressionTypeSignature TypeSignatureExpression |
+  -- | A record update expression
+  ExpressionUpdateRecord UpdateRecordExpression |
+  -- | A variable reference
+  ExpressionVariable Name
+  deriving (Eq, Ord, Read, Show)
+
+_Expression = Core.Name "hydra.ext.haskell.syntax.Expression"
+
+_Expression_application = Core.Name "application"
+
+_Expression_case = Core.Name "case"
+
+_Expression_constructRecord = Core.Name "constructRecord"
+
+_Expression_do = Core.Name "do"
+
+_Expression_if = Core.Name "if"
+
+_Expression_infixApplication = Core.Name "infixApplication"
+
+_Expression_literal = Core.Name "literal"
+
+_Expression_lambda = Core.Name "lambda"
+
+_Expression_leftSection = Core.Name "leftSection"
+
+_Expression_let = Core.Name "let"
+
+_Expression_list = Core.Name "list"
+
+_Expression_parens = Core.Name "parens"
+
+_Expression_prefixApplication = Core.Name "prefixApplication"
+
+_Expression_rightSection = Core.Name "rightSection"
+
+_Expression_tuple = Core.Name "tuple"
+
+_Expression_typeSignature = Core.Name "typeSignature"
+
+_Expression_updateRecord = Core.Name "updateRecord"
+
+_Expression_variable = Core.Name "variable"
+
+-- | An application expression
+data ApplicationExpression =
+  ApplicationExpression {
+    -- | The function being applied
+    applicationExpressionFunction :: Expression,
+    -- | The argument
+    applicationExpressionArgument :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_ApplicationExpression = Core.Name "hydra.ext.haskell.syntax.ApplicationExpression"
+
+_ApplicationExpression_function = Core.Name "function"
+
+_ApplicationExpression_argument = Core.Name "argument"
+
+-- | A case expression
+data CaseExpression =
+  CaseExpression {
+    -- | The expression being matched
+    caseExpressionCase :: Expression,
+    -- | The pattern-matching alternatives
+    caseExpressionAlternatives :: [Alternative]}
+  deriving (Eq, Ord, Read, Show)
+
+_CaseExpression = Core.Name "hydra.ext.haskell.syntax.CaseExpression"
+
+_CaseExpression_case = Core.Name "case"
+
+_CaseExpression_alternatives = Core.Name "alternatives"
+
+-- | A record constructor expression
+data ConstructRecordExpression =
+  ConstructRecordExpression {
+    -- | The constructor name
+    constructRecordExpressionName :: Name,
+    -- | The field assignments
+    constructRecordExpressionFields :: [FieldUpdate]}
+  deriving (Eq, Ord, Read, Show)
+
+_ConstructRecordExpression = Core.Name "hydra.ext.haskell.syntax.ConstructRecordExpression"
+
+_ConstructRecordExpression_name = Core.Name "name"
+
+_ConstructRecordExpression_fields = Core.Name "fields"
+
+-- | An 'if' expression
+data IfExpression =
+  IfExpression {
+    -- | The condition expression
+    ifExpressionCondition :: Expression,
+    -- | The 'then' branch
+    ifExpressionThen :: Expression,
+    -- | The 'else' branch
+    ifExpressionElse :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_IfExpression = Core.Name "hydra.ext.haskell.syntax.IfExpression"
+
+_IfExpression_condition = Core.Name "condition"
+
+_IfExpression_then = Core.Name "then"
+
+_IfExpression_else = Core.Name "else"
+
+-- | An infix application expression
+data InfixApplicationExpression =
+  InfixApplicationExpression {
+    -- | The left-hand operand
+    infixApplicationExpressionLhs :: Expression,
+    -- | The infix operator
+    infixApplicationExpressionOperator :: Operator,
+    -- | The right-hand operand
+    infixApplicationExpressionRhs :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_InfixApplicationExpression = Core.Name "hydra.ext.haskell.syntax.InfixApplicationExpression"
+
+_InfixApplicationExpression_lhs = Core.Name "lhs"
+
+_InfixApplicationExpression_operator = Core.Name "operator"
+
+_InfixApplicationExpression_rhs = Core.Name "rhs"
+
+-- | A lambda expression
+data LambdaExpression =
+  LambdaExpression {
+    -- | The patterns binding parameters
+    lambdaExpressionBindings :: [Pattern],
+    -- | The body of the lambda
+    lambdaExpressionInner :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_LambdaExpression = Core.Name "hydra.ext.haskell.syntax.LambdaExpression"
+
+_LambdaExpression_bindings = Core.Name "bindings"
+
+_LambdaExpression_inner = Core.Name "inner"
+
+-- | A 'let' expression
+data LetExpression =
+  LetExpression {
+    -- | The local bindings
+    letExpressionBindings :: [LocalBinding],
+    -- | The body of the let expression
+    letExpressionInner :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_LetExpression = Core.Name "hydra.ext.haskell.syntax.LetExpression"
+
+_LetExpression_bindings = Core.Name "bindings"
+
+_LetExpression_inner = Core.Name "inner"
+
+-- | A prefix expression
+data PrefixApplicationExpression =
+  PrefixApplicationExpression {
+    -- | The prefix operator
+    prefixApplicationExpressionOperator :: Operator,
+    -- | The operand
+    prefixApplicationExpressionRhs :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_PrefixApplicationExpression = Core.Name "hydra.ext.haskell.syntax.PrefixApplicationExpression"
+
+_PrefixApplicationExpression_operator = Core.Name "operator"
+
+_PrefixApplicationExpression_rhs = Core.Name "rhs"
+
+-- | A section expression
+data SectionExpression =
+  SectionExpression {
+    -- | The operator
+    sectionExpressionOperator :: Operator,
+    -- | The operand
+    sectionExpressionExpression :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_SectionExpression = Core.Name "hydra.ext.haskell.syntax.SectionExpression"
+
+_SectionExpression_operator = Core.Name "operator"
+
+_SectionExpression_expression = Core.Name "expression"
+
+-- | A type signature expression
+data TypeSignatureExpression =
+  TypeSignatureExpression {
+    -- | The expression being typed
+    typeSignatureExpressionInner :: Expression,
+    -- | The type signature
+    typeSignatureExpressionType :: Type}
+  deriving (Eq, Ord, Read, Show)
+
+_TypeSignatureExpression = Core.Name "hydra.ext.haskell.syntax.TypeSignatureExpression"
+
+_TypeSignatureExpression_inner = Core.Name "inner"
+
+_TypeSignatureExpression_type = Core.Name "type"
+
+-- | An update record expression
+data UpdateRecordExpression =
+  UpdateRecordExpression {
+    -- | The record being updated
+    updateRecordExpressionInner :: Expression,
+    -- | The field updates
+    updateRecordExpressionFields :: [FieldUpdate]}
+  deriving (Eq, Ord, Read, Show)
+
+_UpdateRecordExpression = Core.Name "hydra.ext.haskell.syntax.UpdateRecordExpression"
+
+_UpdateRecordExpression_inner = Core.Name "inner"
+
+_UpdateRecordExpression_fields = Core.Name "fields"
+
+-- | A field (name/type pair)
+data Field =
+  Field {
+    -- | The field name
+    fieldName :: Name,
+    -- | The field type
+    fieldType :: Type}
+  deriving (Eq, Ord, Read, Show)
+
+_Field = Core.Name "hydra.ext.haskell.syntax.Field"
+
+_Field_name = Core.Name "name"
+
+_Field_type = Core.Name "type"
+
+-- | A field together with any comments
+data FieldWithComments =
+  FieldWithComments {
+    -- | The field
+    fieldWithCommentsField :: Field,
+    -- | Optional comments
+    fieldWithCommentsComments :: (Maybe String)}
+  deriving (Eq, Ord, Read, Show)
+
+_FieldWithComments = Core.Name "hydra.ext.haskell.syntax.FieldWithComments"
+
+_FieldWithComments_field = Core.Name "field"
+
+_FieldWithComments_comments = Core.Name "comments"
+
+-- | A field name and value
+data FieldUpdate =
+  FieldUpdate {
+    -- | The field name
+    fieldUpdateName :: Name,
+    -- | The field value
+    fieldUpdateValue :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_FieldUpdate = Core.Name "hydra.ext.haskell.syntax.FieldUpdate"
+
+_FieldUpdate_name = Core.Name "name"
+
+_FieldUpdate_value = Core.Name "value"
+
+-- | An import statement
+data Import =
+  Import {
+    -- | Whether the import is qualified
+    importQualified :: Bool,
+    -- | The module being imported
+    importModule :: ModuleName,
+    -- | Optional alias for the module
+    importAs :: (Maybe ModuleName),
+    -- | Optional import specification
+    importSpec :: (Maybe SpecImport)}
+  deriving (Eq, Ord, Read, Show)
+
+_Import = Core.Name "hydra.ext.haskell.syntax.Import"
+
+_Import_qualified = Core.Name "qualified"
+
+_Import_module = Core.Name "module"
+
+_Import_as = Core.Name "as"
+
+_Import_spec = Core.Name "spec"
+
+-- | An import specification
+data SpecImport =
+  -- | A list of imports to include
+  SpecImportList [ImportExportSpec] |
+  -- | A list of imports to exclude
+  SpecImportHiding [ImportExportSpec]
+  deriving (Eq, Ord, Read, Show)
+
+_SpecImport = Core.Name "hydra.ext.haskell.syntax.SpecImport"
+
+_SpecImport_list = Core.Name "list"
+
+_SpecImport_hiding = Core.Name "hiding"
+
+-- | An import modifier ('pattern' or 'type')
+data ImportModifier =
+  ImportModifierPattern  |
+  ImportModifierType
+  deriving (Eq, Ord, Read, Show)
+
+_ImportModifier = Core.Name "hydra.ext.haskell.syntax.ImportModifier"
+
+_ImportModifier_pattern = Core.Name "pattern"
+
+_ImportModifier_type = Core.Name "type"
+
+-- | An import or export specification
+data ImportExportSpec =
+  ImportExportSpec {
+    -- | Optional import modifier
+    importExportSpecModifier :: (Maybe ImportModifier),
+    -- | The name being imported or exported
+    importExportSpecName :: Name,
+    -- | Optional subspecification
+    importExportSpecSubspec :: (Maybe SubspecImportExportSpec)}
+  deriving (Eq, Ord, Read, Show)
+
+_ImportExportSpec = Core.Name "hydra.ext.haskell.syntax.ImportExportSpec"
+
+_ImportExportSpec_modifier = Core.Name "modifier"
+
+_ImportExportSpec_name = Core.Name "name"
+
+_ImportExportSpec_subspec = Core.Name "subspec"
+
+-- | A subspecification within an import/export
+data SubspecImportExportSpec =
+  -- | Import/export all
+  SubspecImportExportSpecAll  |
+  -- | Import/export specific names
+  SubspecImportExportSpecList [Name]
+  deriving (Eq, Ord, Read, Show)
+
+_SubspecImportExportSpec = Core.Name "hydra.ext.haskell.syntax.SubspecImportExportSpec"
+
+_SubspecImportExportSpec_all = Core.Name "all"
+
+_SubspecImportExportSpec_list = Core.Name "list"
+
+-- | A literal value
+data Literal =
+  -- | A character literal
+  LiteralChar Int |
+  -- | A double-precision floating point literal
+  LiteralDouble Double |
+  -- | A single-precision floating point literal
+  LiteralFloat Float |
+  -- | A 32-bit integer literal
+  LiteralInt Int |
+  -- | An arbitrary-precision integer literal
+  LiteralInteger Integer |
+  -- | A string literal
+  LiteralString String
+  deriving (Eq, Ord, Read, Show)
+
+_Literal = Core.Name "hydra.ext.haskell.syntax.Literal"
+
+_Literal_char = Core.Name "char"
+
+_Literal_double = Core.Name "double"
+
+_Literal_float = Core.Name "float"
+
+_Literal_int = Core.Name "int"
+
+_Literal_integer = Core.Name "integer"
+
+_Literal_string = Core.Name "string"
+
+-- | A local binding
+data LocalBinding =
+  -- | A type signature
+  LocalBindingSignature TypeSignature |
+  -- | A value binding
+  LocalBindingValue ValueBinding
+  deriving (Eq, Ord, Read, Show)
+
+_LocalBinding = Core.Name "hydra.ext.haskell.syntax.LocalBinding"
+
+_LocalBinding_signature = Core.Name "signature"
+
+_LocalBinding_value = Core.Name "value"
+
+-- | A collection of local bindings
+newtype LocalBindings =
+  LocalBindings {
+    unLocalBindings :: [LocalBinding]}
+  deriving (Eq, Ord, Read, Show)
+
+_LocalBindings = Core.Name "hydra.ext.haskell.syntax.LocalBindings"
+
+-- | A Haskell module
+data Module =
+  Module {
+    -- | Optional module head
+    moduleHead :: (Maybe ModuleHead),
+    -- | Import statements
+    moduleImports :: [Import],
+    -- | Module declarations
+    moduleDeclarations :: [DeclarationWithComments]}
+  deriving (Eq, Ord, Read, Show)
+
+_Module = Core.Name "hydra.ext.haskell.syntax.Module"
+
+_Module_head = Core.Name "head"
+
+_Module_imports = Core.Name "imports"
+
+_Module_declarations = Core.Name "declarations"
+
+-- | A module head
+data ModuleHead =
+  ModuleHead {
+    -- | Optional module-level comments
+    moduleHeadComments :: (Maybe String),
+    -- | The module name
+    moduleHeadName :: ModuleName,
+    -- | Export list
+    moduleHeadExports :: [Export]}
+  deriving (Eq, Ord, Read, Show)
+
+_ModuleHead = Core.Name "hydra.ext.haskell.syntax.ModuleHead"
+
+_ModuleHead_comments = Core.Name "comments"
+
+_ModuleHead_name = Core.Name "name"
+
+_ModuleHead_exports = Core.Name "exports"
+
+-- | A module name
+newtype ModuleName =
+  ModuleName {
+    unModuleName :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_ModuleName = Core.Name "hydra.ext.haskell.syntax.ModuleName"
+
+-- | A name
+data Name =
+  -- | An implicit name
+  NameImplicit QualifiedName |
+  -- | A normal name
+  NameNormal QualifiedName |
+  -- | A parenthesized name
+  NameParens QualifiedName
+  deriving (Eq, Ord, Read, Show)
+
+_Name = Core.Name "hydra.ext.haskell.syntax.Name"
+
+_Name_implicit = Core.Name "implicit"
+
+_Name_normal = Core.Name "normal"
+
+_Name_parens = Core.Name "parens"
+
+-- | A component of a qualified name
+newtype NamePart =
+  NamePart {
+    unNamePart :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_NamePart = Core.Name "hydra.ext.haskell.syntax.NamePart"
+
+-- | An operator
+data Operator =
+  -- | A function used as an infix operator
+  OperatorBacktick QualifiedName |
+  -- | A normal infix operator
+  OperatorNormal QualifiedName
+  deriving (Eq, Ord, Read, Show)
+
+_Operator = Core.Name "hydra.ext.haskell.syntax.Operator"
+
+_Operator_backtick = Core.Name "backtick"
+
+_Operator_normal = Core.Name "normal"
+
+-- | A pattern
+data Pattern =
+  -- | An application pattern
+  PatternApplication ApplicationPattern |
+  -- | An 'as' pattern
+  PatternAs AsPattern |
+  -- | A list pattern
+  PatternList [Pattern] |
+  -- | A literal pattern
+  PatternLiteral Literal |
+  -- | A name pattern
+  PatternName Name |
+  -- | A parenthesized pattern
+  PatternParens Pattern |
+  -- | A record pattern
+  PatternRecord RecordPattern |
+  -- | A tuple pattern
+  PatternTuple [Pattern] |
+  -- | A typed pattern
+  PatternTyped TypedPattern |
+  -- | A wildcard pattern
+  PatternWildcard
+  deriving (Eq, Ord, Read, Show)
+
+_Pattern = Core.Name "hydra.ext.haskell.syntax.Pattern"
+
+_Pattern_application = Core.Name "application"
+
+_Pattern_as = Core.Name "as"
+
+_Pattern_list = Core.Name "list"
+
+_Pattern_literal = Core.Name "literal"
+
+_Pattern_name = Core.Name "name"
+
+_Pattern_parens = Core.Name "parens"
+
+_Pattern_record = Core.Name "record"
+
+_Pattern_tuple = Core.Name "tuple"
+
+_Pattern_typed = Core.Name "typed"
+
+_Pattern_wildcard = Core.Name "wildcard"
+
+-- | An application pattern
+data ApplicationPattern =
+  ApplicationPattern {
+    -- | The constructor name
+    applicationPatternName :: Name,
+    -- | The pattern arguments
+    applicationPatternArgs :: [Pattern]}
+  deriving (Eq, Ord, Read, Show)
+
+_ApplicationPattern = Core.Name "hydra.ext.haskell.syntax.ApplicationPattern"
+
+_ApplicationPattern_name = Core.Name "name"
+
+_ApplicationPattern_args = Core.Name "args"
+
+-- | An 'as' pattern
+data AsPattern =
+  AsPattern {
+    -- | The bound name
+    asPatternName :: Name,
+    -- | The inner pattern
+    asPatternInner :: Pattern}
+  deriving (Eq, Ord, Read, Show)
+
+_AsPattern = Core.Name "hydra.ext.haskell.syntax.AsPattern"
+
+_AsPattern_name = Core.Name "name"
+
+_AsPattern_inner = Core.Name "inner"
+
+-- | A record pattern
+data RecordPattern =
+  RecordPattern {
+    -- | The constructor name
+    recordPatternName :: Name,
+    -- | The field patterns
+    recordPatternFields :: [PatternField]}
+  deriving (Eq, Ord, Read, Show)
+
+_RecordPattern = Core.Name "hydra.ext.haskell.syntax.RecordPattern"
+
+_RecordPattern_name = Core.Name "name"
+
+_RecordPattern_fields = Core.Name "fields"
+
+-- | A typed pattern
+data TypedPattern =
+  TypedPattern {
+    -- | The inner pattern
+    typedPatternInner :: Pattern,
+    -- | The type annotation
+    typedPatternType :: Type}
+  deriving (Eq, Ord, Read, Show)
+
+_TypedPattern = Core.Name "hydra.ext.haskell.syntax.TypedPattern"
+
+_TypedPattern_inner = Core.Name "inner"
+
+_TypedPattern_type = Core.Name "type"
+
+-- | A pattern field
+data PatternField =
+  PatternField {
+    -- | The field name
+    patternFieldName :: Name,
+    -- | The field pattern
+    patternFieldPattern :: Pattern}
+  deriving (Eq, Ord, Read, Show)
+
+_PatternField = Core.Name "hydra.ext.haskell.syntax.PatternField"
+
+_PatternField_name = Core.Name "name"
+
+_PatternField_pattern = Core.Name "pattern"
+
+-- | A qualified name
+data QualifiedName =
+  QualifiedName {
+    -- | The qualifier parts
+    qualifiedNameQualifiers :: [NamePart],
+    -- | The unqualified name part
+    qualifiedNameUnqualified :: NamePart}
+  deriving (Eq, Ord, Read, Show)
+
+_QualifiedName = Core.Name "hydra.ext.haskell.syntax.QualifiedName"
+
+_QualifiedName_qualifiers = Core.Name "qualifiers"
+
+_QualifiedName_unqualified = Core.Name "unqualified"
+
+-- | A right-hand side of a binding
+newtype RightHandSide =
+  RightHandSide {
+    unRightHandSide :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_RightHandSide = Core.Name "hydra.ext.haskell.syntax.RightHandSide"
+
+-- | A do-notation statement
+newtype Statement =
+  Statement {
+    unStatement :: Expression}
+  deriving (Eq, Ord, Read, Show)
+
+_Statement = Core.Name "hydra.ext.haskell.syntax.Statement"
+
+-- | A type expression
+data Type =
+  -- | An application type
+  TypeApplication ApplicationType |
+  -- | A context type
+  TypeCtx ContextType |
+  -- | A function type
+  TypeFunction FunctionType |
+  -- | An infix type
+  TypeInfix InfixType |
+  -- | A list type
+  TypeList Type |
+  -- | A parenthesized type
+  TypeParens Type |
+  -- | A tuple type
+  TypeTuple [Type] |
+  -- | A type variable or type name
+  TypeVariable Name
+  deriving (Eq, Ord, Read, Show)
+
+_Type = Core.Name "hydra.ext.haskell.syntax.Type"
+
+_Type_application = Core.Name "application"
+
+_Type_ctx = Core.Name "ctx"
+
+_Type_function = Core.Name "function"
+
+_Type_infix = Core.Name "infix"
+
+_Type_list = Core.Name "list"
+
+_Type_parens = Core.Name "parens"
+
+_Type_tuple = Core.Name "tuple"
+
+_Type_variable = Core.Name "variable"
+
+-- | An application type
+data ApplicationType =
+  ApplicationType {
+    -- | The type being applied
+    applicationTypeContext :: Type,
+    -- | The type argument
+    applicationTypeArgument :: Type}
+  deriving (Eq, Ord, Read, Show)
+
+_ApplicationType = Core.Name "hydra.ext.haskell.syntax.ApplicationType"
+
+_ApplicationType_context = Core.Name "context"
+
+_ApplicationType_argument = Core.Name "argument"
+
+-- | A type with a context (type class constraints)
+data ContextType =
+  ContextType {
+    -- | The type class context
+    contextTypeCtx :: Assertion,
+    -- | The constrained type
+    contextTypeType :: Type}
+  deriving (Eq, Ord, Read, Show)
+
+_ContextType = Core.Name "hydra.ext.haskell.syntax.ContextType"
+
+_ContextType_ctx = Core.Name "ctx"
+
+_ContextType_type = Core.Name "type"
+
+-- | A function type
+data FunctionType =
+  FunctionType {
+    -- | The domain type
+    functionTypeDomain :: Type,
+    -- | The codomain type
+    functionTypeCodomain :: Type}
+  deriving (Eq, Ord, Read, Show)
+
+_FunctionType = Core.Name "hydra.ext.haskell.syntax.FunctionType"
+
+_FunctionType_domain = Core.Name "domain"
+
+_FunctionType_codomain = Core.Name "codomain"
+
+-- | An infix type application
+data InfixType =
+  InfixType {
+    -- | The left-hand type
+    infixTypeLhs :: Type,
+    -- | The type operator
+    infixTypeOperator :: Operator,
+    -- | The right-hand operator
+    infixTypeRhs :: Operator}
+  deriving (Eq, Ord, Read, Show)
+
+_InfixType = Core.Name "hydra.ext.haskell.syntax.InfixType"
+
+_InfixType_lhs = Core.Name "lhs"
+
+_InfixType_operator = Core.Name "operator"
+
+_InfixType_rhs = Core.Name "rhs"
+
+-- | A type synonym declaration
+data TypeDeclaration =
+  TypeDeclaration {
+    -- | The declaration head
+    typeDeclarationName :: DeclarationHead,
+    -- | The type being defined
+    typeDeclarationType :: Type}
+  deriving (Eq, Ord, Read, Show)
+
+_TypeDeclaration = Core.Name "hydra.ext.haskell.syntax.TypeDeclaration"
+
+_TypeDeclaration_name = Core.Name "name"
+
+_TypeDeclaration_type = Core.Name "type"
+
+-- | A type signature
+data TypeSignature =
+  TypeSignature {
+    -- | The name being typed
+    typeSignatureName :: Name,
+    -- | The type
+    typeSignatureType :: Type}
+  deriving (Eq, Ord, Read, Show)
+
+_TypeSignature = Core.Name "hydra.ext.haskell.syntax.TypeSignature"
+
+_TypeSignature_name = Core.Name "name"
+
+_TypeSignature_type = Core.Name "type"
+
+-- | A binding with its type signature
+data TypedBinding =
+  TypedBinding {
+    -- | The type signature
+    typedBindingTypeSignature :: TypeSignature,
+    -- | The value binding
+    typedBindingValueBinding :: ValueBinding}
+  deriving (Eq, Ord, Read, Show)
+
+_TypedBinding = Core.Name "hydra.ext.haskell.syntax.TypedBinding"
+
+_TypedBinding_typeSignature = Core.Name "typeSignature"
+
+_TypedBinding_valueBinding = Core.Name "valueBinding"
+
+-- | A value binding
+data ValueBinding =
+  -- | A simple value binding
+  ValueBindingSimple SimpleValueBinding
+  deriving (Eq, Ord, Read, Show)
+
+_ValueBinding = Core.Name "hydra.ext.haskell.syntax.ValueBinding"
+
+_ValueBinding_simple = Core.Name "simple"
+
+-- | A simple value binding
+data SimpleValueBinding =
+  SimpleValueBinding {
+    -- | The pattern being bound
+    simpleValueBindingPattern :: Pattern,
+    -- | The right-hand side
+    simpleValueBindingRhs :: RightHandSide,
+    -- | Optional local bindings (where clause)
+    simpleValueBindingLocalBindings :: (Maybe LocalBindings)}
+  deriving (Eq, Ord, Read, Show)
+
+_SimpleValueBinding = Core.Name "hydra.ext.haskell.syntax.SimpleValueBinding"
+
+_SimpleValueBinding_pattern = Core.Name "pattern"
+
+_SimpleValueBinding_rhs = Core.Name "rhs"
+
+_SimpleValueBinding_localBindings = Core.Name "localBindings"
+
+-- | A type variable
+newtype Variable =
+  Variable {
+    unVariable :: Name}
+  deriving (Eq, Ord, Read, Show)
+
+_Variable = Core.Name "hydra.ext.haskell.syntax.Variable"
diff --git a/src/gen-main/haskell/Hydra/Ext/Haskell/Testing.hs b/src/gen-main/haskell/Hydra/Ext/Haskell/Testing.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Ext/Haskell/Testing.hs
@@ -0,0 +1,344 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Haskell test code generation codec for HSpec-based generation tests
+
+module Hydra.Ext.Haskell.Testing where
+
+import qualified Hydra.Coders as Coders
+import qualified Hydra.Constants as Constants
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Ext.Haskell.Coder as Coder
+import qualified Hydra.Ext.Haskell.Serde as Serde
+import qualified Hydra.Ext.Haskell.Syntax as Syntax
+import qualified Hydra.Ext.Haskell.Utils as Utils
+import qualified Hydra.Formatting as Formatting
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Inference as Inference
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Math as Math
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Module as Module
+import qualified Hydra.Names as Names
+import qualified Hydra.Rewriting as Rewriting
+import qualified Hydra.Schemas as Schemas
+import qualified Hydra.Serialization as Serialization
+import qualified Hydra.Show.Errors as Errors
+import qualified Hydra.Substitution as Substitution
+import qualified Hydra.Testing as Testing
+import qualified Hydra.Typing as Typing
+import qualified Hydra.Util as Util
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Add namespaces from a set of names to existing namespaces
+addNamespacesToNamespaces :: Module.Namespaces Syntax.ModuleName -> S.Set Core.Name -> Module.Namespaces Syntax.ModuleName
+addNamespacesToNamespaces ns0 names =
+
+      let newNamespaces = Sets.fromList (Maybes.cat (Lists.map Names.namespaceOf (Sets.toList names)))
+          toModuleName =
+                  \namespace -> Syntax.ModuleName (Formatting.capitalize (Lists.last (Strings.splitOn "." (Module.unNamespace namespace))))
+          newMappings = Maps.fromList (Lists.map (\ns_ -> (ns_, (toModuleName ns_))) (Sets.toList newNamespaces))
+      in Module.Namespaces {
+        Module.namespacesFocus = (Module.namespacesFocus ns0),
+        Module.namespacesMapping = (Maps.union (Module.namespacesMapping ns0) newMappings)}
+
+-- | Build namespaces for a test group including encoded term references
+buildNamespacesForTestGroup :: Module.Module -> Testing.TestGroup -> Graph.Graph -> Either String (Module.Namespaces Syntax.ModuleName)
+buildNamespacesForTestGroup mod tgroup graph_ =
+
+      let testCases_ = collectTestCases tgroup
+          testTerms = Lists.concat (Lists.map extractTestTerms testCases_)
+          testBindings =
+                  Lists.map (\term -> Core.Binding {
+                    Core.bindingName = (Core.Name "_test_"),
+                    Core.bindingTerm = term,
+                    Core.bindingType = Nothing}) testTerms
+          tempModule =
+                  Module.Module {
+                    Module.moduleNamespace = (Module.moduleNamespace mod),
+                    Module.moduleDefinitions = (Lists.map (\b -> Module.DefinitionTerm (Module.TermDefinition {
+                      Module.termDefinitionName = (Core.bindingName b),
+                      Module.termDefinitionTerm = (Core.bindingTerm b),
+                      Module.termDefinitionType = (Core.bindingType b)})) testBindings),
+                    Module.moduleTermDependencies = (Module.moduleTermDependencies mod),
+                    Module.moduleTypeDependencies = (Module.moduleTypeDependencies mod),
+                    Module.moduleDescription = (Module.moduleDescription mod)}
+      in (Eithers.bind (Eithers.bimap (\ic -> Errors.error (Context.inContextObject ic)) (\a -> a) (Utils.namespacesForModule tempModule Lexical.emptyContext graph_)) (\baseNamespaces ->
+        let encodedNames = Sets.unions (Lists.map (\t -> extractEncodedTermVariableNames graph_ t) testTerms)
+        in (Right (addNamespacesToNamespaces baseNamespaces encodedNames))))
+
+-- | Build the complete test module using a TestCodec
+buildTestModuleWithCodec :: Testing.TestCodec -> Module.Module -> Testing.TestGroup -> String -> t0 -> String
+buildTestModuleWithCodec codec testModule testGroup testBody namespaces =
+
+      let ns_ = Module.moduleNamespace testModule
+          specNs = Module.Namespace (Strings.cat2 (Module.unNamespace ns_) "Spec")
+          moduleNameString = Testing.testCodecFormatModuleName codec specNs
+          groupName_ = Testing.testGroupName testGroup
+          domainImports = Testing.testCodecFindImports codec Sets.empty
+          standardImports =
+                  [
+                    "import Hydra.Kernel",
+                    "import qualified Test.Hspec as H",
+                    "import qualified Data.List as L",
+                    "import qualified Data.Map as M",
+                    "import qualified Data.Set as S",
+                    "import qualified Data.Maybe as Y"]
+          allImports = Lists.concat2 standardImports domainImports
+          debugComments =
+                  [
+                    "-- DEBUG: Focus namespace = (see generated module)",
+                    "-- DEBUG: Namespace mappings: (see generated module)"]
+          header =
+                  Strings.intercalate "\n" (Lists.concat [
+                    [
+                      Strings.cat2 "-- " Constants.warningAutoGeneratedFile,
+                      ""],
+                    debugComments,
+                    [
+                      "",
+                      (Strings.cat [
+                        "module ",
+                        moduleNameString,
+                        " where"]),
+                      ""],
+                    allImports,
+                    [
+                      "",
+                      "spec :: H.Spec",
+                      (Strings.cat [
+                        "spec = H.describe ",
+                        (Literals.showString groupName_),
+                        " $ do"])]])
+      in (Strings.cat [
+        header,
+        "\n",
+        testBody,
+        "\n"])
+
+-- | Collect variable names from encoded terms within a single term node
+collectNames :: Graph.Graph -> S.Set Core.Name -> Core.Term -> S.Set Core.Name
+collectNames graf names t =
+    Logic.ifElse (Schemas.isEncodedTerm (Rewriting.deannotateTerm t)) (Eithers.either (\_ -> names) (\decodedTerm -> Sets.union names (Rewriting.termDependencyNames True True True decodedTerm)) (Eithers.bimap (\_e -> _e) (\_a -> _a) (Core_.term graf t))) names
+
+-- | Collect all test cases from a test group recursively
+collectTestCases :: Testing.TestGroup -> [Testing.TestCaseWithMetadata]
+collectTestCases tg =
+    Lists.concat2 (Testing.testGroupCases tg) (Lists.concat (Lists.map collectTestCases (Testing.testGroupSubgroups tg)))
+
+-- | Check if a term contains any trivially polymorphic sub-terms
+containsTriviallyPolymorphic :: Core.Term -> Bool
+containsTriviallyPolymorphic term =
+    case term of
+      Core.TermList v0 -> Logic.or (Lists.null v0) (Lists.foldl Logic.or False (Lists.map containsTriviallyPolymorphic v0))
+      Core.TermSet v0 -> Logic.or (Sets.null v0) (Lists.foldl Logic.or False (Lists.map containsTriviallyPolymorphic (Sets.toList v0)))
+      Core.TermMap v0 -> Logic.or (Maps.null v0) (Logic.or (Lists.foldl Logic.or False (Lists.map containsTriviallyPolymorphic (Maps.keys v0))) (Lists.foldl Logic.or False (Lists.map containsTriviallyPolymorphic (Lists.map (\p -> Pairs.second p) (Maps.toList v0)))))
+      Core.TermMaybe v0 -> Maybes.maybe True containsTriviallyPolymorphic v0
+      Core.TermEither _ -> True
+      Core.TermUnion v0 -> containsTriviallyPolymorphic (Core.fieldTerm (Core.injectionField v0))
+      Core.TermPair v0 -> Logic.or (containsTriviallyPolymorphic (Pairs.first v0)) (containsTriviallyPolymorphic (Pairs.second v0))
+      Core.TermRecord v0 -> Lists.foldl Logic.or False (Lists.map (\f -> containsTriviallyPolymorphic (Core.fieldTerm f)) (Core.recordFields v0))
+      Core.TermApplication v0 -> Logic.or (containsTriviallyPolymorphic (Core.applicationFunction v0)) (containsTriviallyPolymorphic (Core.applicationArgument v0))
+      _ -> False
+
+-- | Extract all variable names from term-encoded terms in a given term
+extractEncodedTermVariableNames :: Graph.Graph -> Core.Term -> S.Set Core.Name
+extractEncodedTermVariableNames graf term =
+    Rewriting.foldOverTerm Coders.TraversalOrderPre (collectNames graf) Sets.empty term
+
+-- | Extract input and output terms from a test case
+extractTestTerms :: Testing.TestCaseWithMetadata -> [Core.Term]
+extractTestTerms tcm =
+    case (Testing.testCaseWithMetadataCase tcm) of
+      Testing.TestCaseDelegatedEvaluation v0 -> [
+        Testing.delegatedEvaluationTestCaseInput v0,
+        (Testing.delegatedEvaluationTestCaseOutput v0)]
+      _ -> []
+
+-- | Find necessary imports for Haskell based on referenced names
+findHaskellImports :: Module.Namespaces Syntax.ModuleName -> t0 -> [String]
+findHaskellImports namespaces names_ =
+
+      let mapping_ = Module.namespacesMapping namespaces
+          filtered =
+                  Maps.filterWithKey (\ns_ -> \_v -> Logic.not (Equality.equal (Lists.head (Strings.splitOn "hydra.test." (Module.unNamespace ns_))) "")) mapping_
+      in (Lists.map (\entry -> Strings.cat [
+        "import qualified ",
+        (Strings.intercalate "." (Lists.map Formatting.capitalize (Strings.splitOn "." (Module.unNamespace (Pairs.first entry))))),
+        " as ",
+        (Syntax.unModuleName (Pairs.second entry))]) (Maps.toList filtered))
+
+-- | Generate a Haskell test file for a test group, with type inference and namespace building
+generateHaskellTestFile :: Module.Module -> Testing.TestGroup -> Graph.Graph -> Either String (String, String)
+generateHaskellTestFile testModule testGroup g =
+    Eithers.bind (buildNamespacesForTestGroup testModule testGroup g) (\namespaces -> generateTestFileWithCodec (haskellTestCodec namespaces) testModule testGroup namespaces g)
+
+-- | Generate a single test case using a TestCodec
+generateTestCaseWithCodec :: Graph.Graph -> Module.Namespaces Syntax.ModuleName -> Testing.TestCodec -> Int -> Testing.TestCaseWithMetadata -> Either String [String]
+generateTestCaseWithCodec g namespaces codec depth tcm =
+
+      let name_ = Testing.testCaseWithMetadataName tcm
+          tcase = Testing.testCaseWithMetadataCase tcm
+      in case tcase of
+        Testing.TestCaseDelegatedEvaluation v0 ->
+          let input_ = Testing.delegatedEvaluationTestCaseInput v0
+              output_ = Testing.delegatedEvaluationTestCaseOutput v0
+              formattedName = Testing.testCodecFormatTestName codec name_
+              continuationIndent = Math.add (Math.mul depth 2) 4
+          in (Eithers.bind (Testing.testCodecEncodeTerm codec input_ g) (\inputCode -> Eithers.bind (Testing.testCodecEncodeTerm codec output_ g) (\outputCode -> Eithers.bind (generateTypeAnnotationFor g namespaces input_ output_) (\typeAnnotation ->
+            let indentedInputCode = indentContinuationLines continuationIndent inputCode
+                indentedOutputCode = indentContinuationLines continuationIndent outputCode
+                finalOutputCode = Maybes.maybe indentedOutputCode (\anno -> Strings.cat2 indentedOutputCode anno) typeAnnotation
+            in (Right [
+              Strings.cat [
+                "H.it ",
+                (Literals.showString formattedName),
+                " $ H.shouldBe"],
+              (Strings.cat [
+                "  (",
+                indentedInputCode,
+                ")"]),
+              (Strings.cat [
+                "  (",
+                finalOutputCode,
+                ")"])])))))
+        _ -> Right []
+
+-- | Generate a complete test file using a TestCodec
+generateTestFileWithCodec :: Testing.TestCodec -> Module.Module -> Testing.TestGroup -> Module.Namespaces Syntax.ModuleName -> Graph.Graph -> Either String (String, String)
+generateTestFileWithCodec codec testModule testGroup namespaces g =
+    Eithers.map (\testBody ->
+      let testModuleContent = buildTestModuleWithCodec codec testModule testGroup testBody namespaces
+          ext = Module.unFileExtension (Testing.testCodecFileExtension codec)
+          ns_ = Module.moduleNamespace testModule
+          specNs = Module.Namespace (Strings.cat2 (Module.unNamespace ns_) "Spec")
+          filePath = Names.namespaceToFilePath Util.CaseConventionPascal (Module.FileExtension ext) specNs
+      in (filePath, testModuleContent)) (generateTestGroupHierarchy g namespaces codec 1 testGroup)
+
+-- | Generate test hierarchy preserving the structure with H.describe blocks for subgroups
+generateTestGroupHierarchy :: Graph.Graph -> Module.Namespaces Syntax.ModuleName -> Testing.TestCodec -> Int -> Testing.TestGroup -> Either String String
+generateTestGroupHierarchy g namespaces codec depth testGroup =
+
+      let cases_ = Testing.testGroupCases testGroup
+          subgroups = Testing.testGroupSubgroups testGroup
+          indent = Strings.fromList (Lists.replicate (Math.mul depth 2) 32)
+      in (Eithers.bind (Eithers.mapList (\tc -> generateTestCaseWithCodec g namespaces codec depth tc) cases_) (\testCaseLinesRaw ->
+        let testCaseLines = Lists.map (\lines_ -> Lists.map (\line -> Strings.cat2 indent line) lines_) testCaseLinesRaw
+            testCasesStr = Strings.intercalate "\n" (Lists.concat testCaseLines)
+        in (Eithers.map (\subgroupsStr -> Strings.cat [
+          testCasesStr,
+          (Logic.ifElse (Logic.or (Equality.equal testCasesStr "") (Equality.equal subgroupsStr "")) "" "\n"),
+          subgroupsStr]) (Eithers.map (\blocks -> Strings.intercalate "\n" blocks) (Eithers.mapList (\subgroup ->
+          let groupName_ = Testing.testGroupName subgroup
+          in (Eithers.map (\content -> Strings.cat [
+            indent,
+            "H.describe ",
+            (Literals.showString groupName_),
+            " $ do\n",
+            content]) (generateTestGroupHierarchy g namespaces codec (Math.add depth 1) subgroup))) subgroups)))))
+
+-- | Generate a type annotation for polymorphic output values
+generateTypeAnnotationFor :: Graph.Graph -> Module.Namespaces Syntax.ModuleName -> Core.Term -> Core.Term -> Either String (Maybe String)
+generateTypeAnnotationFor g namespaces inputTerm outputTerm =
+    Logic.ifElse (Logic.not (containsTriviallyPolymorphic outputTerm)) (Right Nothing) (Maybes.maybe (Right Nothing) (\result ->
+      let typeScheme = Pairs.second result
+          typ = Core.typeSchemeType typeScheme
+          schemaVars = Sets.fromList (Maps.keys (Graph.graphSchemaTypes g))
+          freeVars = Sets.toList (Sets.difference (Rewriting.freeVariablesInType typ) schemaVars)
+          isEither =
+                  case (Rewriting.deannotateTerm outputTerm) of
+                    Core.TermEither _ -> True
+                    _ -> False
+      in (Logic.ifElse (Logic.or isEither (Logic.not (Lists.null freeVars))) (
+        let int32Type = Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)
+            subst = Typing.TypeSubst (Maps.fromList (Lists.map (\v -> (v, int32Type)) freeVars))
+            groundedType = Substitution.substInType subst typ
+        in (Eithers.map (\typeStr -> Just (Strings.cat2 " :: " typeStr)) (typeToHaskell namespaces groundedType g))) (Right Nothing))) (tryInferTypeOf g inputTerm))
+
+-- | Template for Haskell import statements
+haskellImportTemplate :: String
+haskellImportTemplate = "import qualified {namespace} as {alias}"
+
+-- | Template for Haskell test module structure
+haskellModuleTemplate :: String
+haskellModuleTemplate =
+    Strings.intercalate "\n" [
+      Strings.cat2 "-- " Constants.warningAutoGeneratedFile,
+      "",
+      "module {moduleName} where",
+      "",
+      "{imports}",
+      "",
+      "spec :: H.Spec",
+      "{testGroup}",
+      "{testCases}",
+      ""]
+
+-- | Template for HSpec test case assertions
+haskellTestCaseTemplate :: String
+haskellTestCaseTemplate =
+    Strings.intercalate "\n" [
+      "  H.it {name} $ H.shouldBe",
+      "    ({input})",
+      "    ({output})",
+      ""]
+
+-- | Create a Haskell TestCodec that uses the real Haskell coder
+haskellTestCodec :: Module.Namespaces Syntax.ModuleName -> Testing.TestCodec
+haskellTestCodec namespaces =
+    Testing.TestCodec {
+      Testing.testCodecLanguage = (Coders.LanguageName "haskell"),
+      Testing.testCodecFileExtension = (Module.FileExtension "hs"),
+      Testing.testCodecEncodeTerm = (termToHaskell namespaces),
+      Testing.testCodecEncodeType = (typeToHaskell namespaces),
+      Testing.testCodecFormatTestName = (\n -> n),
+      Testing.testCodecFormatModuleName = namespaceToModuleName,
+      Testing.testCodecTestCaseTemplate = haskellTestCaseTemplate,
+      Testing.testCodecTestGroupTemplate = haskellTestGroupTemplate,
+      Testing.testCodecModuleTemplate = haskellModuleTemplate,
+      Testing.testCodecImportTemplate = haskellImportTemplate,
+      Testing.testCodecFindImports = (findHaskellImports namespaces)}
+
+-- | Template for HSpec test group description
+haskellTestGroupTemplate :: String
+haskellTestGroupTemplate = "spec = H.describe {groupName} $ do"
+
+-- | Indent continuation lines of a multi-line string
+indentContinuationLines :: Int -> String -> String
+indentContinuationLines n s =
+    Strings.intercalate (Strings.cat2 "\n" (Strings.fromList (Lists.replicate n 32))) (Strings.splitOn "\n" s)
+
+-- | Convert namespace to Haskell module name
+namespaceToModuleName :: Module.Namespace -> String
+namespaceToModuleName ns_ =
+    Strings.intercalate "." (Lists.map Formatting.capitalize (Strings.splitOn "." (Module.unNamespace ns_)))
+
+-- | Convert a Hydra term to a Haskell expression string
+termToHaskell :: Module.Namespaces Syntax.ModuleName -> Core.Term -> Graph.Graph -> Either String String
+termToHaskell namespaces term g =
+    Eithers.bimap (\ic -> Errors.error (Context.inContextObject ic)) (\arg_ -> (\arg_ -> Serialization.printExpr (Serialization.parenthesize arg_)) (Serde.expressionToExpr arg_)) (Coder.encodeTerm 0 namespaces term Lexical.emptyContext g)
+
+-- | Try to infer the type of a term, returning Nothing if inference fails
+tryInferTypeOf :: Graph.Graph -> Core.Term -> Maybe (Core.Term, Core.TypeScheme)
+tryInferTypeOf g term =
+    Eithers.either (\_ -> Nothing) (\result -> Just (Pairs.first result)) (Inference.inferTypeOf Lexical.emptyContext g term)
+
+-- | Convert a Hydra type to a Haskell type expression string
+typeToHaskell :: Module.Namespaces Syntax.ModuleName -> Core.Type -> t0 -> Either String String
+typeToHaskell namespaces typ g =
+    Eithers.bimap (\ic -> Errors.error (Context.inContextObject ic)) (\arg_ -> (\arg_ -> Serialization.printExpr (Serialization.parenthesize arg_)) (Serde.typeToExpr arg_)) (Coder.encodeType namespaces typ Lexical.emptyContext g)
diff --git a/src/gen-main/haskell/Hydra/Ext/Haskell/Utils.hs b/src/gen-main/haskell/Hydra/Ext/Haskell/Utils.hs
--- a/src/gen-main/haskell/Hydra/Ext/Haskell/Utils.hs
+++ b/src/gen-main/haskell/Hydra/Ext/Haskell/Utils.hs
@@ -4,14 +4,15 @@
 
 module Hydra.Ext.Haskell.Utils where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
-import qualified Hydra.Ext.Haskell.Ast as Ast
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Ext.Haskell.Language as Language
+import qualified Hydra.Ext.Haskell.Syntax as Syntax
 import qualified Hydra.Formatting as Formatting
 import qualified Hydra.Graph as Graph
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Maps as Maps
@@ -31,177 +32,188 @@
 import qualified Data.Set as S
 
 -- | Create an application pattern from a name and argument patterns
-applicationPattern :: (Ast.Name -> [Ast.Pattern] -> Ast.Pattern)
-applicationPattern name args = (Ast.PatternApplication (Ast.ApplicationPattern {
-  Ast.applicationPatternName = name,
-  Ast.applicationPatternArgs = args}))
+applicationPattern :: Syntax.Name -> [Syntax.Pattern] -> Syntax.Pattern
+applicationPattern name args =
+    Syntax.PatternApplication (Syntax.ApplicationPattern {
+      Syntax.applicationPatternName = name,
+      Syntax.applicationPatternArgs = args})
 
 -- | Generate a Haskell name reference for a Hydra element
-elementReference :: (Module.Namespaces Ast.ModuleName -> Core.Name -> Ast.Name)
-elementReference namespaces name =  
-  let namespacePair = (Module.namespacesFocus namespaces) 
-      gname = (Pairs.first namespacePair)
-      gmod = (Ast.unModuleName (Pairs.second namespacePair))
-      namespacesMap = (Module.namespacesMapping namespaces)
-      qname = (Names.qualifyName name)
-      local = (Module.qualifiedNameLocal qname)
-      escLocal = (sanitizeHaskellName local)
-      mns = (Module.qualifiedNameNamespace qname)
-  in (Maybes.cases (Module.qualifiedNameNamespace qname) (simpleName local) (\ns -> Maybes.cases (Maps.lookup ns namespacesMap) (simpleName local) (\mn ->  
-    let aliasStr = (Ast.unModuleName mn)
-    in (Logic.ifElse (Equality.equal ns gname) (simpleName escLocal) (rawName (Strings.cat [
-      aliasStr,
-      ".",
-      (sanitizeHaskellName local)]))))))
+elementReference :: Module.Namespaces Syntax.ModuleName -> Core.Name -> Syntax.Name
+elementReference namespaces name =
 
+      let namespacePair = Module.namespacesFocus namespaces
+          gname = Pairs.first namespacePair
+          gmod = Syntax.unModuleName (Pairs.second namespacePair)
+          namespacesMap = Module.namespacesMapping namespaces
+          qname = Names.qualifyName name
+          local = Module.qualifiedNameLocal qname
+          escLocal = sanitizeHaskellName local
+          mns = Module.qualifiedNameNamespace qname
+      in (Maybes.cases (Module.qualifiedNameNamespace qname) (simpleName local) (\ns -> Maybes.cases (Maps.lookup ns namespacesMap) (simpleName local) (\mn ->
+        let aliasStr = Syntax.unModuleName mn
+        in (Logic.ifElse (Equality.equal ns gname) (simpleName escLocal) (rawName (Strings.cat [
+          aliasStr,
+          ".",
+          (sanitizeHaskellName local)]))))))
+
 -- | Create a Haskell function application expression
-hsapp :: (Ast.Expression -> Ast.Expression -> Ast.Expression)
-hsapp l r = (Ast.ExpressionApplication (Ast.ApplicationExpression {
-  Ast.applicationExpressionFunction = l,
-  Ast.applicationExpressionArgument = r}))
+hsapp :: Syntax.Expression -> Syntax.Expression -> Syntax.Expression
+hsapp l r =
+    Syntax.ExpressionApplication (Syntax.ApplicationExpression {
+      Syntax.applicationExpressionFunction = l,
+      Syntax.applicationExpressionArgument = r})
 
 -- | Create a Haskell lambda expression
-hslambda :: (Ast.Name -> Ast.Expression -> Ast.Expression)
-hslambda name rhs = (Ast.ExpressionLambda (Ast.LambdaExpression {
-  Ast.lambdaExpressionBindings = [
-    Ast.PatternName name],
-  Ast.lambdaExpressionInner = rhs}))
+hslambda :: Syntax.Name -> Syntax.Expression -> Syntax.Expression
+hslambda name rhs =
+    Syntax.ExpressionLambda (Syntax.LambdaExpression {
+      Syntax.lambdaExpressionBindings = [
+        Syntax.PatternName name],
+      Syntax.lambdaExpressionInner = rhs})
 
 -- | Create a Haskell literal expression
-hslit :: (Ast.Literal -> Ast.Expression)
-hslit lit = (Ast.ExpressionLiteral lit)
+hslit :: Syntax.Literal -> Syntax.Expression
+hslit lit = Syntax.ExpressionLiteral lit
 
 -- | Create a Haskell variable expression from a string
-hsvar :: (String -> Ast.Expression)
-hsvar s = (Ast.ExpressionVariable (rawName s))
+hsvar :: String -> Syntax.Expression
+hsvar s = Syntax.ExpressionVariable (rawName s)
 
 -- | Compute the Haskell module namespaces for a Hydra module
-namespacesForModule :: (Module.Module -> Compute.Flow Graph.Graph (Module.Namespaces Ast.ModuleName))
-namespacesForModule mod = (Flows.bind (Schemas.moduleDependencyNamespaces True True True True mod) (\nss ->  
-  let ns = (Module.moduleNamespace mod)
-  in  
-    let toModuleName = (\namespace ->  
-            let namespaceStr = (Module.unNamespace namespace) 
-                parts = (Strings.splitOn "." namespaceStr)
-                lastPart = (Lists.last parts)
-                capitalized = (Formatting.capitalize lastPart)
-            in (Ast.ModuleName capitalized))
-    in  
-      let toPair = (\name -> (name, (toModuleName name)))
-      in  
-        let addPair = (\state -> \namePair ->  
-                let currentMap = (Pairs.first state) 
-                    currentSet = (Pairs.second state)
-                    name = (Pairs.first namePair)
-                    alias = (Pairs.second namePair)
-                    aliasStr = (Ast.unModuleName alias)
-                in (Logic.ifElse (Sets.member alias currentSet) (addPair state (name, (Ast.ModuleName (Strings.cat2 aliasStr "_")))) (Maps.insert name alias currentMap, (Sets.insert alias currentSet))))
-        in  
-          let focusPair = (toPair ns)
-          in  
-            let nssAsList = (Sets.toList nss)
-            in  
-              let nssPairs = (Lists.map toPair nssAsList)
-              in  
-                let emptyState = (Maps.empty, Sets.empty)
-                in  
-                  let finalState = (Lists.foldl addPair emptyState nssPairs)
-                  in  
-                    let resultMap = (Pairs.first finalState)
-                    in (Flows.pure (Module.Namespaces {
-                      Module.namespacesFocus = focusPair,
-                      Module.namespacesMapping = resultMap}))))
+namespacesForModule :: Module.Module -> Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) (Module.Namespaces Syntax.ModuleName)
+namespacesForModule mod cx g =
+    Eithers.bind (Schemas.moduleDependencyNamespaces cx g True True True True mod) (\nss ->
+      let ns = Module.moduleNamespace mod
+          toModuleName =
+                  \namespace ->
+                    let namespaceStr = Module.unNamespace namespace
+                        parts = Strings.splitOn "." namespaceStr
+                        lastPart = Lists.last parts
+                        capitalized = Formatting.capitalize lastPart
+                    in (Syntax.ModuleName capitalized)
+          toPair = \name -> (name, (toModuleName name))
+          addPair =
+                  \state -> \namePair ->
+                    let currentMap = Pairs.first state
+                        currentSet = Pairs.second state
+                        name = Pairs.first namePair
+                        alias = Pairs.second namePair
+                        aliasStr = Syntax.unModuleName alias
+                    in (Logic.ifElse (Sets.member alias currentSet) (addPair state (name, (Syntax.ModuleName (Strings.cat2 aliasStr "_")))) (Maps.insert name alias currentMap, (Sets.insert alias currentSet)))
+          focusPair = toPair ns
+          nssAsList = Sets.toList nss
+          nssPairs = Lists.map toPair nssAsList
+          emptyState = (Maps.empty, Sets.empty)
+          finalState = Lists.foldl addPair emptyState nssPairs
+          resultMap = Pairs.first finalState
+      in (Right (Module.Namespaces {
+        Module.namespacesFocus = focusPair,
+        Module.namespacesMapping = resultMap})))
 
 -- | Generate an accessor name for a newtype wrapper (e.g., 'unFoo' for Foo)
-newtypeAccessorName :: (Core.Name -> String)
-newtypeAccessorName name = (Strings.cat2 "un" (Names.localNameOf name))
+newtypeAccessorName :: Core.Name -> String
+newtypeAccessorName name = Strings.cat2 "un" (Names.localNameOf name)
 
 -- | Create a raw Haskell name from a string without sanitization
-rawName :: (String -> Ast.Name)
-rawName n = (Ast.NameNormal (Ast.QualifiedName {
-  Ast.qualifiedNameQualifiers = [],
-  Ast.qualifiedNameUnqualified = (Ast.NamePart n)}))
+rawName :: String -> Syntax.Name
+rawName n =
+    Syntax.NameNormal (Syntax.QualifiedName {
+      Syntax.qualifiedNameQualifiers = [],
+      Syntax.qualifiedNameUnqualified = (Syntax.NamePart n)})
 
 -- | Generate a Haskell name for a record field accessor
-recordFieldReference :: (Module.Namespaces Ast.ModuleName -> Core.Name -> Core.Name -> Ast.Name)
-recordFieldReference namespaces sname fname =  
-  let fnameStr = (Core.unName fname) 
-      qname = (Names.qualifyName sname)
-      ns = (Module.qualifiedNameNamespace qname)
-      typeNameStr = (typeNameForRecord sname)
-      decapitalized = (Formatting.decapitalize typeNameStr)
-      capitalized = (Formatting.capitalize fnameStr)
-      nm = (Strings.cat2 decapitalized capitalized)
-      qualName = Module.QualifiedName {
-              Module.qualifiedNameNamespace = ns,
-              Module.qualifiedNameLocal = nm}
-      unqualName = (Names.unqualifyName qualName)
-  in (elementReference namespaces unqualName)
+recordFieldReference :: Module.Namespaces Syntax.ModuleName -> Core.Name -> Core.Name -> Syntax.Name
+recordFieldReference namespaces sname fname =
 
+      let fnameStr = Core.unName fname
+          qname = Names.qualifyName sname
+          ns = Module.qualifiedNameNamespace qname
+          typeNameStr = typeNameForRecord sname
+          decapitalized = Formatting.decapitalize typeNameStr
+          capitalized = Formatting.capitalize fnameStr
+          nm = Strings.cat2 decapitalized capitalized
+          qualName =
+                  Module.QualifiedName {
+                    Module.qualifiedNameNamespace = ns,
+                    Module.qualifiedNameLocal = nm}
+          unqualName = Names.unqualifyName qualName
+      in (elementReference namespaces unqualName)
+
 -- | Sanitize a string to be a valid Haskell identifier, escaping reserved words
-sanitizeHaskellName :: (String -> String)
-sanitizeHaskellName = (Formatting.sanitizeWithUnderscores Language.reservedWords)
+sanitizeHaskellName :: String -> String
+sanitizeHaskellName = Formatting.sanitizeWithUnderscores Language.reservedWords
 
 -- | Create a sanitized Haskell name from a string
-simpleName :: (String -> Ast.Name)
-simpleName arg_ = (rawName (sanitizeHaskellName arg_))
+simpleName :: String -> Syntax.Name
+simpleName arg_ = rawName (sanitizeHaskellName arg_)
 
 -- | Create a simple value binding (e.g., 'foo = expr' or 'foo = expr where ...')
-simpleValueBinding :: (Ast.Name -> Ast.Expression -> Maybe Ast.LocalBindings -> Ast.ValueBinding)
-simpleValueBinding hname rhs bindings =  
-  let pat = (Ast.PatternApplication (Ast.ApplicationPattern {
-          Ast.applicationPatternName = hname,
-          Ast.applicationPatternArgs = []})) 
-      rightHandSide = (Ast.RightHandSide rhs)
-  in (Ast.ValueBindingSimple (Ast.SimpleValueBinding {
-    Ast.simpleValueBindingPattern = pat,
-    Ast.simpleValueBindingRhs = rightHandSide,
-    Ast.simpleValueBindingLocalBindings = bindings}))
+simpleValueBinding :: Syntax.Name -> Syntax.Expression -> Maybe Syntax.LocalBindings -> Syntax.ValueBinding
+simpleValueBinding hname rhs bindings =
 
+      let pat =
+              Syntax.PatternApplication (Syntax.ApplicationPattern {
+                Syntax.applicationPatternName = hname,
+                Syntax.applicationPatternArgs = []})
+          rightHandSide = Syntax.RightHandSide rhs
+      in (Syntax.ValueBindingSimple (Syntax.SimpleValueBinding {
+        Syntax.simpleValueBindingPattern = pat,
+        Syntax.simpleValueBindingRhs = rightHandSide,
+        Syntax.simpleValueBindingLocalBindings = bindings}))
+
 -- | Convert a list of types into a nested type application
-toTypeApplication :: ([Ast.Type] -> Ast.Type)
-toTypeApplication types =  
-  let app = (\l -> Logic.ifElse (Equality.gt (Lists.length l) 1) (Ast.TypeApplication (Ast.ApplicationType {
-          Ast.applicationTypeContext = (app (Lists.tail l)),
-          Ast.applicationTypeArgument = (Lists.head l)})) (Lists.head l))
-  in (app (Lists.reverse types))
+toTypeApplication :: [Syntax.Type] -> Syntax.Type
+toTypeApplication types =
 
+      let app =
+              \l -> Logic.ifElse (Equality.gt (Lists.length l) 1) (Syntax.TypeApplication (Syntax.ApplicationType {
+                Syntax.applicationTypeContext = (app (Lists.tail l)),
+                Syntax.applicationTypeArgument = (Lists.head l)})) (Lists.head l)
+      in (app (Lists.reverse types))
+
 -- | Extract the local type name from a fully qualified record type name
-typeNameForRecord :: (Core.Name -> String)
-typeNameForRecord sname =  
-  let snameStr = (Core.unName sname) 
-      parts = (Strings.splitOn "." snameStr)
-  in (Lists.last parts)
+typeNameForRecord :: Core.Name -> String
+typeNameForRecord sname =
 
+      let snameStr = Core.unName sname
+          parts = Strings.splitOn "." snameStr
+      in (Lists.last parts)
+
 -- | Generate a Haskell name for a union variant constructor, with disambiguation
-unionFieldReference :: (Graph.Graph -> Module.Namespaces Ast.ModuleName -> Core.Name -> Core.Name -> Ast.Name)
-unionFieldReference g namespaces sname fname =  
-  let fnameStr = (Core.unName fname) 
-      qname = (Names.qualifyName sname)
-      ns = (Module.qualifiedNameNamespace qname)
-      typeNameStr = (typeNameForRecord sname)
-      capitalizedTypeName = (Formatting.capitalize typeNameStr)
-      capitalizedFieldName = (Formatting.capitalize fnameStr)
-      deconflict = (\name ->  
-              let tname = (Names.unqualifyName (Module.QualifiedName {
-                      Module.qualifiedNameNamespace = ns,
-                      Module.qualifiedNameLocal = name}))
-              in (Logic.ifElse (Maybes.isJust (Lists.find (\b -> Equality.equal (Core.bindingName b) tname) (Graph.graphElements g))) (deconflict (Strings.cat2 name "_")) name))
-      nm = (deconflict (Strings.cat2 capitalizedTypeName capitalizedFieldName))
-      qualName = Module.QualifiedName {
-              Module.qualifiedNameNamespace = ns,
-              Module.qualifiedNameLocal = nm}
-      unqualName = (Names.unqualifyName qualName)
-  in (elementReference namespaces unqualName)
+unionFieldReference :: S.Set Core.Name -> Module.Namespaces Syntax.ModuleName -> Core.Name -> Core.Name -> Syntax.Name
+unionFieldReference boundNames namespaces sname fname =
 
+      let fnameStr = Core.unName fname
+          qname = Names.qualifyName sname
+          ns = Module.qualifiedNameNamespace qname
+          typeNameStr = typeNameForRecord sname
+          capitalizedTypeName = Formatting.capitalize typeNameStr
+          capitalizedFieldName = Formatting.capitalize fnameStr
+          deconflict =
+                  \name ->
+                    let tname =
+                            Names.unqualifyName (Module.QualifiedName {
+                              Module.qualifiedNameNamespace = ns,
+                              Module.qualifiedNameLocal = name})
+                    in (Logic.ifElse (Sets.member tname boundNames) (deconflict (Strings.cat2 name "_")) name)
+          nm = deconflict (Strings.cat2 capitalizedTypeName capitalizedFieldName)
+          qualName =
+                  Module.QualifiedName {
+                    Module.qualifiedNameNamespace = ns,
+                    Module.qualifiedNameLocal = nm}
+          unqualName = Names.unqualifyName qualName
+      in (elementReference namespaces unqualName)
+
 -- | Unpack nested forall types into a list of type variables and the inner type
-unpackForallType :: (t0 -> Core.Type -> ([Core.Name], Core.Type))
-unpackForallType cx t = ((\x -> case x of
-  Core.TypeForall v1 ->  
-    let v = (Core.forallTypeParameter v1) 
-        tbody = (Core.forallTypeBody v1)
-        recursiveResult = (unpackForallType cx tbody)
-        vars = (Pairs.first recursiveResult)
-        finalType = (Pairs.second recursiveResult)
-    in (Lists.cons v vars, finalType)
-  _ -> ([], t)) (Rewriting.deannotateType t))
+unpackForallType :: Core.Type -> ([Core.Name], Core.Type)
+unpackForallType t =
+    case (Rewriting.deannotateType t) of
+      Core.TypeForall v0 ->
+        let v = Core.forallTypeParameter v0
+            tbody = Core.forallTypeBody v0
+            recursiveResult = unpackForallType tbody
+            vars = Pairs.first recursiveResult
+            finalType = Pairs.second recursiveResult
+        in (Lists.cons v vars, finalType)
+      _ -> ([], t)
diff --git a/src/gen-main/haskell/Hydra/Ext/Org/Json/Coder.hs b/src/gen-main/haskell/Hydra/Ext/Org/Json/Coder.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Ext/Org/Json/Coder.hs
+++ /dev/null
@@ -1,389 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | JSON encoding and decoding for Hydra terms
-
-module Hydra.Ext.Org.Json.Coder where
-
-import qualified Hydra.Adapt.Modules as Modules
-import qualified Hydra.Adapt.Utils as Utils
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Encode.Core as Core_
-import qualified Hydra.Ext.Org.Json.Language as Language
-import qualified Hydra.Extract.Core as Core__
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Json.Model as Model
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Literals as Literals_
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Show.Core as Core___
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Create a JSON coder for a given type
-jsonCoder :: (Core.Type -> Compute.Flow Graph.Graph (Compute.Coder Graph.Graph t0 Core.Term Model.Value))
-jsonCoder typ = (Flows.bind (Modules.languageAdapter Language.jsonLanguage typ) (\adapter -> Flows.bind (termCoder (Compute.adapterTarget adapter)) (\coder -> Flows.pure (Utils.composeCoders (Compute.adapterCoder adapter) coder))))
-
--- | Create a JSON coder for literal types
-literalJsonCoder :: (Core.LiteralType -> Compute.Flow t0 (Compute.Coder t1 t2 Core.Literal Model.Value))
-literalJsonCoder lt =  
-  let decodeBool = (\s -> (\x -> case x of
-          Model.ValueBoolean v1 -> (Flows.pure (Core.LiteralBoolean v1))
-          _ -> (Monads.unexpected "boolean" (showValue s))) s)
-  in  
-    let decodeFloat = (\s -> (\x -> case x of
-            Model.ValueNumber v1 -> (Flows.pure (Core.LiteralFloat (Core.FloatValueBigfloat v1)))
-            _ -> (Monads.unexpected "number" (showValue s))) s)
-    in  
-      let decodeInteger = (\s -> (\x -> case x of
-              Model.ValueNumber v1 ->  
-                let bi = (Literals.bigfloatToBigint v1)
-                in (Flows.pure (Core.LiteralInteger (Core.IntegerValueBigint bi)))
-              _ -> (Monads.unexpected "number" (showValue s))) s)
-      in  
-        let decodeString = (\s -> (\x -> case x of
-                Model.ValueString v1 -> (Flows.pure (Core.LiteralString v1))
-                _ -> (Monads.unexpected "string" (showValue s))) s)
-        in  
-          let encoded = ((\x -> case x of
-                  Core.LiteralTypeBoolean -> Compute.Coder {
-                    Compute.coderEncode = (\lit -> Flows.bind (Core__.booleanLiteral lit) (\b -> Flows.pure (Model.ValueBoolean b))),
-                    Compute.coderDecode = decodeBool}
-                  Core.LiteralTypeFloat _ -> Compute.Coder {
-                    Compute.coderEncode = (\lit -> Flows.bind (Core__.floatLiteral lit) (\f -> Flows.bind (Core__.bigfloatValue f) (\bf -> Flows.pure (Model.ValueNumber bf)))),
-                    Compute.coderDecode = decodeFloat}
-                  Core.LiteralTypeInteger _ -> Compute.Coder {
-                    Compute.coderEncode = (\lit -> Flows.bind (Core__.integerLiteral lit) (\i -> Flows.bind (Core__.bigintValue i) (\bi -> Flows.pure (Model.ValueNumber (Literals.bigintToBigfloat bi))))),
-                    Compute.coderDecode = decodeInteger}
-                  Core.LiteralTypeString -> Compute.Coder {
-                    Compute.coderEncode = (\lit -> Flows.bind (Core__.stringLiteral lit) (\s -> Flows.pure (Model.ValueString s))),
-                    Compute.coderDecode = decodeString}) lt)
-          in (Flows.pure encoded)
-
--- | Create a JSON coder for record types
-recordCoder :: (Core.RowType -> Compute.Flow t0 (Compute.Coder Graph.Graph t1 Core.Term Model.Value))
-recordCoder rt =  
-  let fields = (Core.rowTypeFields rt)
-  in  
-    let getCoder = (\f -> Flows.bind (termCoder (Core.fieldTypeType f)) (\coder -> Flows.pure (f, coder)))
-    in (Flows.bind (Flows.mapList getCoder fields) (\coders -> Flows.pure (Compute.Coder {
-      Compute.coderEncode = (encodeRecord coders),
-      Compute.coderDecode = (decodeRecord rt coders)})))
-
--- | Encode a record term to JSON
-encodeRecord :: ([(Core.FieldType, (Compute.Coder Graph.Graph t0 Core.Term Model.Value))] -> Core.Term -> Compute.Flow Graph.Graph Model.Value)
-encodeRecord coders term =  
-  let stripped = (Rewriting.deannotateTerm term)
-  in  
-    let matchMaybeTerm = (\fvalue -> \coder_ -> \fname -> \dflt -> (\x -> case x of
-            Core.TermMaybe v1 -> (Maybes.maybe (Flows.pure Nothing) (\v -> Flows.bind (Compute.coderEncode coder_ v) (\encoded -> Flows.pure (Just (Core.unName fname, encoded)))) v1)
-            _ -> dflt) fvalue)
-    in  
-      let matchTypeForMaybe = (\ft -> \forMaybe -> \dflt -> (\x -> case x of
-              Core.TypeMaybe v1 -> (forMaybe v1)
-              _ -> dflt) (Core.fieldTypeType ft))
-      in  
-        let encodeField = (\coderAndField ->  
-                let coder = (Pairs.first coderAndField)
-                in  
-                  let field = (Pairs.second coderAndField)
-                  in  
-                    let ft = (Pairs.first coder)
-                    in  
-                      let coder_ = (Pairs.second coder)
-                      in  
-                        let fname = (Core.fieldName field)
-                        in  
-                          let fvalue = (Core.fieldTerm field)
-                          in  
-                            let forMaybe = (\ot ->  
-                                    let dflt = (Flows.bind (Compute.coderEncode coder_ fvalue) (\encoded -> Flows.pure (Just (Core.unName fname, encoded))))
-                                    in (matchMaybeTerm fvalue coder_ fname dflt))
-                            in  
-                              let dflt = (Flows.bind (Compute.coderEncode coder_ fvalue) (\encoded -> Flows.pure (Just (Core.unName fname, encoded))))
-                              in (matchTypeForMaybe ft forMaybe dflt))
-        in (Flows.bind (Core__.termRecord stripped) (\record ->  
-          let fields = (Core.recordFields record)
-          in (Flows.bind (Flows.mapList encodeField (Lists.zip coders fields)) (\maybeFields -> Flows.pure (Model.ValueObject (Maps.fromList (Maybes.cat maybeFields)))))))
-
--- | Decode a JSON value to a record term
-decodeRecord :: (Core.RowType -> [(Core.FieldType, (Compute.Coder t0 t1 Core.Term Model.Value))] -> Model.Value -> Compute.Flow t1 Core.Term)
-decodeRecord rt coders n =  
-  let decodeObjectBody = (\m ->  
-          let decodeField = (\coder ->  
-                  let ft = (Pairs.first coder)
-                  in  
-                    let coder_ = (Pairs.second coder)
-                    in  
-                      let fname = (Core.fieldTypeName ft)
-                      in  
-                        let defaultValue = Model.ValueNull
-                        in  
-                          let jsonValue = (Maybes.fromMaybe defaultValue (Maps.lookup (Core.unName fname) m))
-                          in (Flows.bind (Compute.coderDecode coder_ jsonValue) (\v -> Flows.pure (Core.Field {
-                            Core.fieldName = fname,
-                            Core.fieldTerm = v}))))
-          in (Flows.bind (Flows.mapList decodeField coders) (\fields -> Flows.pure (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.rowTypeTypeName rt),
-            Core.recordFields = fields})))))
-  in  
-    let result = ((\x -> case x of
-            Model.ValueObject v1 -> (decodeObjectBody v1)
-            _ -> (Monads.unexpected "object" (showValue n))) n)
-    in result
-
--- | Create a JSON coder for term types
-termCoder :: (Core.Type -> Compute.Flow t0 (Compute.Coder Graph.Graph t1 Core.Term Model.Value))
-termCoder typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in  
-    let encodeLiteral = (\ac -> \term -> (\x -> case x of
-            Core.TermLiteral v1 -> (Compute.coderEncode ac v1)
-            _ -> (Monads.unexpected "literal term" (Core___.term term))) term)
-    in  
-      let encodeList = (\lc -> \term -> (\x -> case x of
-              Core.TermList v1 -> (Flows.bind (Flows.mapList (Compute.coderEncode lc) v1) (\encodedEls -> Flows.pure (Model.ValueArray encodedEls)))
-              _ -> (Monads.unexpected "list term" (Core___.term term))) term)
-      in  
-        let decodeList = (\lc -> \n -> (\x -> case x of
-                Model.ValueArray v1 -> (Flows.bind (Flows.mapList (Compute.coderDecode lc) v1) (\decodedNodes -> Flows.pure (Core.TermList decodedNodes)))
-                _ -> (Monads.unexpected "sequence" (showValue n))) n)
-        in  
-          let matchLiteralString = (\v -> \lit -> (\x -> case x of
-                  Core.LiteralString v1 -> v1
-                  _ -> (Core___.term v)) lit)
-          in  
-            let matchTermLiteral = (\v -> (\x -> case x of
-                    Core.TermLiteral v1 -> (matchLiteralString v v1)
-                    _ -> (Core___.term v)) (Rewriting.deannotateTerm v))
-            in  
-              let encodeMap = (\encodeEntry -> \term -> (\x -> case x of
-                      Core.TermMap v1 -> (Flows.bind (Flows.mapList encodeEntry (Maps.toList v1)) (\entries -> Flows.pure (Model.ValueObject (Maps.fromList entries))))
-                      _ -> (Monads.unexpected "map term" (Core___.term term))) term)
-              in  
-                let decodeMap = (\decodeEntry -> \n -> (\x -> case x of
-                        Model.ValueObject v1 -> (Flows.bind (Flows.mapList decodeEntry (Maps.toList v1)) (\entries -> Flows.pure (Core.TermMap (Maps.fromList entries))))
-                        _ -> (Monads.unexpected "mapping" (showValue n))) n)
-                in  
-                  let encodeMaybe = (\maybeElementCoder -> \maybeTerm ->  
-                          let strippedMaybeTerm = (Rewriting.deannotateTerm maybeTerm)
-                          in ((\x -> case x of
-                            Core.TermMaybe v1 -> (Logic.ifElse (Maybes.isNothing v1) (Flows.pure Model.ValueNull) (Flows.bind (Compute.coderEncode maybeElementCoder (Maybes.fromJust v1)) (\encodedInner -> Flows.pure encodedInner)))
-                            _ -> (Monads.unexpected "optional term" (Core___.term maybeTerm))) strippedMaybeTerm))
-                  in  
-                    let decodeMaybe = (\maybeElementCoder -> \jsonVal -> (\x -> case x of
-                            Model.ValueNull -> (Flows.pure (Core.TermMaybe Nothing))
-                            _ -> (Flows.bind (Compute.coderDecode maybeElementCoder jsonVal) (\decodedInner -> Flows.pure (Core.TermMaybe (Just decodedInner))))) jsonVal)
-                    in  
-                      let result = ((\x -> case x of
-                              Core.TypeLiteral v1 -> (Flows.bind (literalJsonCoder v1) (\ac -> Flows.pure (Compute.Coder {
-                                Compute.coderEncode = (encodeLiteral ac),
-                                Compute.coderDecode = (\n -> Flows.bind (Compute.coderDecode ac n) (\lit -> Flows.pure (Core.TermLiteral lit)))})))
-                              Core.TypeList v1 -> (Flows.bind (termCoder v1) (\lc -> Flows.pure (Compute.Coder {
-                                Compute.coderEncode = (encodeList lc),
-                                Compute.coderDecode = (decodeList lc)})))
-                              Core.TypeMap v1 ->  
-                                let kt = (Core.mapTypeKeys v1)
-                                in  
-                                  let vt = (Core.mapTypeValues v1)
-                                  in (Flows.bind (termCoder kt) (\kc -> Flows.bind (termCoder vt) (\vc -> Flows.bind Monads.getState (\cx ->  
-                                    let isStringKey = (Equality.equal (Rewriting.deannotateType kt) (Core.TypeLiteral Core.LiteralTypeString))
-                                    in  
-                                      let toString = (\v -> Logic.ifElse isStringKey (matchTermLiteral v) (Core___.term v))
-                                      in  
-                                        let fromString = (\s -> Logic.ifElse isStringKey (Core.TermLiteral (Core.LiteralString s)) (readStringStub s))
-                                        in  
-                                          let encodeEntry = (\kv ->  
-                                                  let k = (Pairs.first kv)
-                                                  in  
-                                                    let v = (Pairs.second kv)
-                                                    in (Flows.bind (Compute.coderEncode vc v) (\encodedV -> Flows.pure (toString k, encodedV))))
-                                          in  
-                                            let decodeEntry = (\kv ->  
-                                                    let k = (Pairs.first kv)
-                                                    in  
-                                                      let v = (Pairs.second kv)
-                                                      in (Flows.bind (Compute.coderDecode vc v) (\decodedV -> Flows.pure (fromString k, decodedV))))
-                                            in (Flows.pure (Compute.Coder {
-                                              Compute.coderEncode = (encodeMap encodeEntry),
-                                              Compute.coderDecode = (decodeMap decodeEntry)}))))))
-                              Core.TypeMaybe v1 -> (Flows.bind (termCoder v1) (\maybeElementCoder -> Flows.pure (Compute.Coder {
-                                Compute.coderEncode = (encodeMaybe maybeElementCoder),
-                                Compute.coderDecode = (decodeMaybe maybeElementCoder)})))
-                              Core.TypeRecord v1 -> (recordCoder v1)
-                              Core.TypeUnit -> (Flows.pure unitCoder)
-                              Core.TypeVariable v1 -> (Flows.pure (Compute.Coder {
-                                Compute.coderEncode = (\term -> Flows.pure (Model.ValueString (Strings.cat [
-                                  "variable '",
-                                  (Core.unName v1),
-                                  "' for: ",
-                                  (Core___.term term)]))),
-                                Compute.coderDecode = (\term -> Flows.fail (Strings.cat [
-                                  "type variable ",
-                                  (Core.unName v1),
-                                  " does not support decoding"]))}))
-                              _ -> (Flows.fail (Strings.cat [
-                                "unsupported type in JSON: ",
-                                (Core___.type_ typ)]))) stripped)
-                      in result
-
--- | JSON coder for unit values
-unitCoder :: (Compute.Coder t0 t1 Core.Term Model.Value)
-unitCoder =  
-  let encodeUnit = (\term -> (\x -> case x of
-          Core.TermUnit -> (Flows.pure Model.ValueNull)
-          _ -> (Monads.unexpected "unit" (Core___.term term))) (Rewriting.deannotateTerm term))
-  in  
-    let decodeUnit = (\n -> (\x -> case x of
-            Model.ValueNull -> (Flows.pure Core.TermUnit)
-            _ -> (Monads.unexpected "null" (showValue n))) n)
-    in Compute.Coder {
-      Compute.coderEncode = encodeUnit,
-      Compute.coderDecode = decodeUnit}
-
--- | A simplistic, unidirectional encoding for terms as JSON values. Not type-aware; best used for human consumption.
-untypedTermToJson :: (Core.Term -> Compute.Flow t0 Model.Value)
-untypedTermToJson term =  
-  let unexp = (\msg -> Flows.pure (Model.ValueString (Strings.cat2 "FAIL: " msg)))
-  in  
-    let asRecord = (\fields -> untypedTermToJson (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name ""),
-            Core.recordFields = fields})))
-    in  
-      let asVariant = (\name -> \term -> untypedTermToJson (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name ""),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name name),
-                Core.fieldTerm = term}})))
-      in  
-        let matchTermMaybe = (\forTerm -> \t -> (\x -> case x of
-                Core.TermMaybe v1 -> (Maybes.maybe (Flows.pure Nothing) forTerm v1)
-                _ -> (Flows.map Maybes.pure (untypedTermToJson t))) t)
-        in  
-          let matchElimination = (\unexp -> \asVariant -> \elm -> (\x -> case x of
-                  Core.EliminationRecord v1 -> (asVariant "project" (Core.TermVariable (Core.projectionField v1)))
-                  _ -> (unexp (Strings.cat [
-                    "unexpected elimination variant: ",
-                    (Core___.elimination elm)]))) elm)
-          in  
-            let matchFunction = (\unexp -> \asRecord -> \asVariant -> \f -> (\x -> case x of
-                    Core.FunctionElimination v1 -> (matchElimination unexp asVariant v1)
-                    Core.FunctionLambda v1 -> (asRecord [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "parameter"),
-                        Core.fieldTerm = (Core.TermVariable (Core.lambdaParameter v1))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "domain"),
-                        Core.fieldTerm = (Core.TermMaybe (Maybes.map Core_.type_ (Core.lambdaDomain v1)))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "body"),
-                        Core.fieldTerm = (Core.lambdaBody v1)}])
-                    Core.FunctionPrimitive v1 -> (Flows.pure (Model.ValueString (Core.unName v1)))) f)
-            in  
-              let matchLiteral = (\lit -> (\x -> case x of
-                      Core.LiteralBinary v1 -> (Model.ValueString (Literals.binaryToString v1))
-                      Core.LiteralBoolean v1 -> (Model.ValueBoolean v1)
-                      Core.LiteralFloat v1 -> (Model.ValueNumber (Literals_.floatValueToBigfloat v1))
-                      Core.LiteralInteger v1 ->  
-                        let bf = (Literals_.integerValueToBigint v1)
-                        in  
-                          let f = (Literals.bigintToBigfloat bf)
-                          in (Model.ValueNumber f)
-                      Core.LiteralString v1 -> (Model.ValueString v1)) lit)
-              in  
-                let fieldToKeyval = (\f ->  
-                        let forTerm = (\t -> matchTermMaybe forTerm t)
-                        in (Flows.bind (forTerm (Core.fieldTerm f)) (\mjson -> Flows.pure (Maybes.map (\j -> (Core.unName (Core.fieldName f), j)) mjson))))
-                in  
-                  let result = ((\x -> case x of
-                          Core.TermAnnotated v1 ->  
-                            let term1 = (Core.annotatedTermBody v1)
-                            in  
-                              let ann = (Core.annotatedTermAnnotation v1)
-                              in  
-                                let encodePair = (\kv ->  
-                                        let k = (Core.unName (Pairs.first kv))
-                                        in  
-                                          let v = (Pairs.second kv)
-                                          in (Flows.bind (untypedTermToJson v) (\json -> Flows.pure (k, json))))
-                                in (Flows.bind (untypedTermToJson term1) (\json -> Flows.bind (Flows.mapList encodePair (Maps.toList ann)) (\pairs -> Flows.pure (Model.ValueObject (Maps.fromList [
-                                  ("term", json),
-                                  ("annotations", (Model.ValueObject (Maps.fromList pairs)))])))))
-                          Core.TermApplication v1 -> (asRecord [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "function"),
-                              Core.fieldTerm = (Core.applicationFunction v1)},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "argument"),
-                              Core.fieldTerm = (Core.applicationArgument v1)}])
-                          Core.TermFunction v1 -> (matchFunction unexp asRecord asVariant v1)
-                          Core.TermLet v1 ->  
-                            let bindings = (Core.letBindings v1)
-                            in  
-                              let env = (Core.letBody v1)
-                              in  
-                                let fromBinding = (\b -> Core.Field {
-                                        Core.fieldName = (Core.bindingName b),
-                                        Core.fieldTerm = (Core.bindingTerm b)})
-                                in (asRecord [
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "bindings"),
-                                    Core.fieldTerm = (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name ""),
-                                      Core.recordFields = (Lists.map fromBinding bindings)}))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "environment"),
-                                    Core.fieldTerm = env}])
-                          Core.TermList v1 -> (Flows.bind (Flows.mapList untypedTermToJson v1) (\jsonTerms -> Flows.pure (Model.ValueArray jsonTerms)))
-                          Core.TermLiteral v1 -> (Flows.pure (matchLiteral v1))
-                          Core.TermMaybe v1 -> (Maybes.maybe (Flows.pure Model.ValueNull) untypedTermToJson v1)
-                          Core.TermRecord v1 ->  
-                            let fields = (Core.recordFields v1)
-                            in (Flows.bind (Flows.mapList fieldToKeyval fields) (\keyvals -> Flows.pure (Model.ValueObject (Maps.fromList (Maybes.cat keyvals)))))
-                          Core.TermSet v1 -> (untypedTermToJson (Core.TermList (Sets.toList v1)))
-                          Core.TermTypeLambda v1 -> (asRecord [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "parameter"),
-                              Core.fieldTerm = (Core.TermVariable (Core.typeLambdaParameter v1))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "body"),
-                              Core.fieldTerm = (Core.typeLambdaBody v1)}])
-                          Core.TermTypeApplication v1 -> (asRecord [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.typeApplicationTermBody v1)},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "type"),
-                              Core.fieldTerm = (Core_.type_ (Core.typeApplicationTermType v1))}])
-                          Core.TermUnion v1 ->  
-                            let field = (Core.injectionField v1)
-                            in (Logic.ifElse (Equality.equal (Core.fieldTerm field) Core.TermUnit) (Flows.pure (Model.ValueString (Core.unName (Core.fieldName field)))) (Flows.bind (fieldToKeyval field) (\mkeyval -> Flows.pure (Model.ValueObject (Maps.fromList (Maybes.maybe [] (\keyval -> [
-                              keyval]) mkeyval))))))
-                          Core.TermVariable v1 -> (Flows.pure (Model.ValueString (Core.unName v1)))
-                          Core.TermWrap v1 -> (untypedTermToJson (Core.wrappedTermBody v1))
-                          _ -> (unexp (Strings.cat [
-                            "unsupported term variant: ",
-                            (Core___.term term)]))) term)
-                  in result
-
--- | Placeholder for reading a string into a term (to be implemented)
-readStringStub :: (String -> Core.Term)
-readStringStub s = (Core.TermLiteral (Core.LiteralString (Strings.cat2 "TODO: read " s)))
-
--- | Show a JSON value as a string (placeholder implementation)
-showValue :: (t0 -> String)
-showValue value = "TODO: implement showValue"
diff --git a/src/gen-main/haskell/Hydra/Ext/Org/Json/Decoding.hs b/src/gen-main/haskell/Hydra/Ext/Org/Json/Decoding.hs
--- a/src/gen-main/haskell/Hydra/Ext/Org/Json/Decoding.hs
+++ b/src/gen-main/haskell/Hydra/Ext/Org/Json/Decoding.hs
@@ -4,9 +4,8 @@
 
 module Hydra.Ext.Org.Json.Decoding where
 
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Json.Model as Model
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
@@ -18,33 +17,39 @@
 import qualified Data.Set as S
 
 -- | Decode a JSON array using a decoder for elements
-decodeArray :: ((Model.Value -> Compute.Flow t0 t1) -> Model.Value -> Compute.Flow t0 [t1])
-decodeArray decodeElem x = case x of
-  Model.ValueArray v1 -> (Flows.mapList decodeElem v1)
-  _ -> (Flows.fail "expected an array")
+decodeArray :: (Model.Value -> Either String t0) -> Model.Value -> Either String [t0]
+decodeArray decodeElem x =
+    case x of
+      Model.ValueArray v0 -> Eithers.mapList decodeElem v0
+      _ -> Left "expected an array"
 
 -- | Decode a JSON boolean value
-decodeBoolean :: (Model.Value -> Compute.Flow t0 Bool)
-decodeBoolean x = case x of
-  Model.ValueBoolean v1 -> (Flows.pure v1)
-  _ -> (Flows.fail "expected a boolean")
+decodeBoolean :: Model.Value -> Either String Bool
+decodeBoolean x =
+    case x of
+      Model.ValueBoolean v0 -> Right v0
+      _ -> Left "expected a boolean"
 
 -- | Decode a required field from a JSON object
-decodeField :: ((t0 -> Compute.Flow t1 t2) -> String -> M.Map String t0 -> Compute.Flow t1 t2)
-decodeField decodeValue name m = (Flows.bind (decodeOptionalField decodeValue name m) (Maybes.maybe (Flows.fail (Strings.cat2 "missing field: " name)) (\f -> Flows.pure f)))
+decodeField :: (t0 -> Either String t1) -> String -> M.Map String t0 -> Either String t1
+decodeField decodeValue name m =
+    Eithers.bind (decodeOptionalField decodeValue name m) (Maybes.maybe (Left (Strings.cat2 "missing field: " name)) (\f -> Right f))
 
 -- | Decode a JSON object value
-decodeObject :: (Model.Value -> Compute.Flow t0 (M.Map String Model.Value))
-decodeObject x = case x of
-  Model.ValueObject v1 -> (Flows.pure v1)
-  _ -> (Flows.fail "expected an object")
+decodeObject :: Model.Value -> Either String (M.Map String Model.Value)
+decodeObject x =
+    case x of
+      Model.ValueObject v0 -> Right v0
+      _ -> Left "expected an object"
 
 -- | Decode an optional field from a JSON object
-decodeOptionalField :: Ord t3 => ((t0 -> Compute.Flow t1 t2) -> t3 -> M.Map t3 t0 -> Compute.Flow t1 (Maybe t2))
-decodeOptionalField decodeValue name m = (Maybes.maybe (Flows.pure Nothing) (\v -> Flows.map (\x -> Just x) (decodeValue v)) (Maps.lookup name m))
+decodeOptionalField :: Ord t3 => ((t0 -> Either t1 t2) -> t3 -> M.Map t3 t0 -> Either t1 (Maybe t2))
+decodeOptionalField decodeValue name m =
+    Maybes.maybe (Right Nothing) (\v -> Eithers.map (\x -> Just x) (decodeValue v)) (Maps.lookup name m)
 
 -- | Decode a JSON string value
-decodeString :: (Model.Value -> Compute.Flow t0 String)
-decodeString x = case x of
-  Model.ValueString v1 -> (Flows.pure v1)
-  _ -> (Flows.fail "expected a string")
+decodeString :: Model.Value -> Either String String
+decodeString x =
+    case x of
+      Model.ValueString v0 -> Right v0
+      _ -> Left "expected a string"
diff --git a/src/gen-main/haskell/Hydra/Ext/Org/Json/Language.hs b/src/gen-main/haskell/Hydra/Ext/Org/Json/Language.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Ext/Org/Json/Language.hs
+++ /dev/null
@@ -1,60 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Language constraints for JSON
-
-module Hydra.Ext.Org.Json.Language where
-
-import qualified Hydra.Coders as Coders
-import qualified Hydra.Core as Core
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Variants as Variants
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Language constraints for JSON
-jsonLanguage :: Coders.Language
-jsonLanguage = Coders.Language {
-  Coders.languageName = (Coders.LanguageName "hydra.ext.org.json"),
-  Coders.languageConstraints = Coders.LanguageConstraints {
-    Coders.languageConstraintsEliminationVariants = eliminationVariants,
-    Coders.languageConstraintsLiteralVariants = literalVariants,
-    Coders.languageConstraintsFloatTypes = floatTypes,
-    Coders.languageConstraintsFunctionVariants = functionVariants,
-    Coders.languageConstraintsIntegerTypes = integerTypes,
-    Coders.languageConstraintsTermVariants = termVariants,
-    Coders.languageConstraintsTypeVariants = typeVariants,
-    Coders.languageConstraintsTypes = typePredicate}} 
-  where 
-    eliminationVariants = Sets.empty
-    literalVariants = (Sets.fromList [
-      Variants.LiteralVariantBoolean,
-      Variants.LiteralVariantFloat,
-      Variants.LiteralVariantInteger,
-      Variants.LiteralVariantString])
-    floatTypes = (Sets.fromList [
-      Core.FloatTypeBigfloat])
-    functionVariants = Sets.empty
-    integerTypes = (Sets.fromList [
-      Core.IntegerTypeBigint])
-    termVariants = (Sets.fromList [
-      Variants.TermVariantList,
-      Variants.TermVariantLiteral,
-      Variants.TermVariantMap,
-      Variants.TermVariantMaybe,
-      Variants.TermVariantRecord])
-    typeVariants = (Sets.fromList [
-      Variants.TypeVariantList,
-      Variants.TypeVariantLiteral,
-      Variants.TypeVariantMap,
-      Variants.TypeVariantMaybe,
-      Variants.TypeVariantRecord])
-    typePredicate = (\typ -> (\x -> case x of
-      Core.TypeMaybe v1 -> ((\x -> case x of
-        Core.TypeMaybe _ -> False
-        _ -> True) v1)
-      _ -> True) (Rewriting.deannotateType typ))
diff --git a/src/gen-main/haskell/Hydra/Ext/Org/Yaml/Model.hs b/src/gen-main/haskell/Hydra/Ext/Org/Yaml/Model.hs
--- a/src/gen-main/haskell/Hydra/Ext/Org/Yaml/Model.hs
+++ b/src/gen-main/haskell/Hydra/Ext/Org/Yaml/Model.hs
@@ -17,7 +17,7 @@
 import qualified Data.Set as S
 
 -- | A YAML node (value)
-data Node = 
+data Node =
   -- | A mapping from nodes to nodes
   NodeMapping (M.Map Node Node) |
   -- | A scalar value
@@ -26,16 +26,16 @@
   NodeSequence [Node]
   deriving (Eq, Ord, Read, Show)
 
-_Node = (Core.Name "hydra.ext.org.yaml.model.Node")
+_Node = Core.Name "hydra.ext.org.yaml.model.Node"
 
-_Node_mapping = (Core.Name "mapping")
+_Node_mapping = Core.Name "mapping"
 
-_Node_scalar = (Core.Name "scalar")
+_Node_scalar = Core.Name "scalar"
 
-_Node_sequence = (Core.Name "sequence")
+_Node_sequence = Core.Name "sequence"
 
 -- | A union of scalars supported in the YAML failsafe and JSON schemas. Other scalars are not supported here
-data Scalar = 
+data Scalar =
   -- | Represents a true/false value
   ScalarBool Bool |
   -- | Represents an approximation to real numbers
@@ -48,14 +48,14 @@
   ScalarStr String
   deriving (Eq, Ord, Read, Show)
 
-_Scalar = (Core.Name "hydra.ext.org.yaml.model.Scalar")
+_Scalar = Core.Name "hydra.ext.org.yaml.model.Scalar"
 
-_Scalar_bool = (Core.Name "bool")
+_Scalar_bool = Core.Name "bool"
 
-_Scalar_float = (Core.Name "float")
+_Scalar_float = Core.Name "float"
 
-_Scalar_int = (Core.Name "int")
+_Scalar_int = Core.Name "int"
 
-_Scalar_null = (Core.Name "null")
+_Scalar_null = Core.Name "null"
 
-_Scalar_str = (Core.Name "str")
+_Scalar_str = Core.Name "str"
diff --git a/src/gen-main/haskell/Hydra/Extract/Core.hs b/src/gen-main/haskell/Hydra/Extract/Core.hs
--- a/src/gen-main/haskell/Hydra/Extract/Core.hs
+++ b/src/gen-main/haskell/Hydra/Extract/Core.hs
@@ -4,13 +4,13 @@
 
 module Hydra.Extract.Core where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Literals as Literals
 import qualified Hydra.Lib.Logic as Logic
@@ -18,7 +18,6 @@
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Pairs as Pairs
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
 import qualified Hydra.Rewriting as Rewriting
 import qualified Hydra.Show.Core as Core_
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
@@ -29,418 +28,549 @@
 import qualified Data.Set as S
 
 -- | Extract an arbitrary-precision floating-point value from a term
-bigfloat :: (Core.Term -> Compute.Flow Graph.Graph Double)
-bigfloat t = (Flows.bind (literal t) (\l -> Flows.bind (floatLiteral l) (\f -> bigfloatValue f)))
+bigfloat :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Double
+bigfloat cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (floatLiteral cx l) (\f -> bigfloatValue cx f))
 
 -- | Extract a bigfloat value from a FloatValue
-bigfloatValue :: (Core.FloatValue -> Compute.Flow t0 Double)
-bigfloatValue v = ((\x -> case x of
-  Core.FloatValueBigfloat v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "bigfloat" (Core_.float v))) v)
+bigfloatValue :: Context.Context -> Core.FloatValue -> Either (Context.InContext Errors.Error) Double
+bigfloatValue cx v =
+    case v of
+      Core.FloatValueBigfloat v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "bigfloat") " but found ") (Core_.float v)))),
+        Context.inContextContext = cx})
 
 -- | Extract an arbitrary-precision integer value from a term
-bigint :: (Core.Term -> Compute.Flow Graph.Graph Integer)
-bigint t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> bigintValue i)))
+bigint :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Integer
+bigint cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> bigintValue cx i))
 
 -- | Extract a bigint value from an IntegerValue
-bigintValue :: (Core.IntegerValue -> Compute.Flow t0 Integer)
-bigintValue v = ((\x -> case x of
-  Core.IntegerValueBigint v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "bigint" (Core_.integer v))) v)
+bigintValue :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) Integer
+bigintValue cx v =
+    case v of
+      Core.IntegerValueBigint v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "bigint") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a binary data value from a term
-binary :: (Core.Term -> Compute.Flow Graph.Graph B.ByteString)
-binary t = (Flows.bind (literal t) (\l -> binaryLiteral l))
+binary :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) B.ByteString
+binary cx graph t = Eithers.bind (literal cx graph t) (\l -> binaryLiteral cx l)
 
 -- | Extract a binary literal from a Literal value
-binaryLiteral :: (Core.Literal -> Compute.Flow t0 B.ByteString)
-binaryLiteral v = ((\x -> case x of
-  Core.LiteralBinary v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "binary" (Core_.literal v))) v)
+binaryLiteral :: Context.Context -> Core.Literal -> Either (Context.InContext Errors.Error) B.ByteString
+binaryLiteral cx v =
+    case v of
+      Core.LiteralBinary v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "binary") " but found ") (Core_.literal v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a boolean value from a term
-boolean :: (Core.Term -> Compute.Flow Graph.Graph Bool)
-boolean t = (Flows.bind (literal t) (\l -> booleanLiteral l))
+boolean :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Bool
+boolean cx graph t = Eithers.bind (literal cx graph t) (\l -> booleanLiteral cx l)
 
 -- | Extract a boolean literal from a Literal value
-booleanLiteral :: (Core.Literal -> Compute.Flow t0 Bool)
-booleanLiteral v = ((\x -> case x of
-  Core.LiteralBoolean v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "boolean" (Core_.literal v))) v)
+booleanLiteral :: Context.Context -> Core.Literal -> Either (Context.InContext Errors.Error) Bool
+booleanLiteral cx v =
+    case v of
+      Core.LiteralBoolean v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "boolean") " but found ") (Core_.literal v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a specific case handler from a case statement term
-caseField :: (Core.Name -> String -> Core.Term -> Compute.Flow Graph.Graph Core.Field)
-caseField name n term =  
-  let fieldName = (Core.Name n)
-  in (Flows.bind (cases name term) (\cs ->  
-    let matching = (Lists.filter (\f -> Equality.equal (Core.unName (Core.fieldName f)) (Core.unName fieldName)) (Core.caseStatementCases cs))
-    in (Logic.ifElse (Lists.null matching) (Flows.fail "not enough cases") (Flows.pure (Lists.head matching)))))
+caseField :: Context.Context -> Core.Name -> String -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Field
+caseField cx name n graph term =
 
+      let fieldName = Core.Name n
+      in (Eithers.bind (cases cx name graph term) (\cs ->
+        let matching =
+                Lists.filter (\f -> Equality.equal (Core.unName (Core.fieldName f)) (Core.unName fieldName)) (Core.caseStatementCases cs)
+        in (Logic.ifElse (Lists.null matching) (Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError "not enough cases")),
+          Context.inContextContext = cx})) (Right (Lists.head matching)))))
+
 -- | Extract case statement from a term
-cases :: (Core.Name -> Core.Term -> Compute.Flow Graph.Graph Core.CaseStatement)
-cases name term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionElimination v2 -> ((\x -> case x of
-              Core.EliminationUnion v3 -> (Logic.ifElse (Equality.equal (Core.unName (Core.caseStatementTypeName v3)) (Core.unName name)) (Flows.pure v3) (Monads.unexpected (Strings.cat2 "case statement for type " (Core.unName name)) (Core_.term term)))
-              _ -> (Monads.unexpected "case statement" (Core_.term term))) v2)
-            _ -> (Monads.unexpected "case statement" (Core_.term term))) v1)
-          _ -> (Monads.unexpected "case statement" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+cases :: Context.Context -> Core.Name -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.CaseStatement
+cases cx name graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionElimination v1 -> case v1 of
+          Core.EliminationUnion v2 -> Logic.ifElse (Equality.equal (Core.unName (Core.caseStatementTypeName v2)) (Core.unName name)) (Right v2) (Left (Context.InContext {
+            Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " (Strings.cat2 "case statement for type " (Core.unName name))) " but found ") (Core_.term term)))),
+            Context.inContextContext = cx}))
+          _ -> Left (Context.InContext {
+            Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "case statement") " but found ") (Core_.term term)))),
+            Context.inContextContext = cx})
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "case statement") " but found ") (Core_.term term)))),
+          Context.inContextContext = cx})
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "case statement") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
 
+-- | Extract an either value from a term, applying functions to the left and right values
+eitherTerm :: Context.Context -> (Core.Term -> Either (Context.InContext Errors.Error) t0) -> (Core.Term -> Either (Context.InContext Errors.Error) t1) -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) (Either t0 t1)
+eitherTerm cx leftFun rightFun graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermEither v0 -> Eithers.either (\l -> Eithers.map (\x -> Left x) (leftFun l)) (\r -> Eithers.map (\x -> Right x) (rightFun r)) v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either value") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
+
+-- | Extract the left and right types from an either type
+eitherType :: Context.Context -> Core.Type -> Either (Context.InContext Errors.Error) Core.EitherType
+eitherType cx typ =
+
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeEither v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "either type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
+
 -- | Extract a field value from a list of fields
-field :: (Core.Name -> (Core.Term -> Compute.Flow Graph.Graph t0) -> [Core.Field] -> Compute.Flow Graph.Graph t0)
-field fname mapping fields =  
-  let matchingFields = (Lists.filter (\f -> Equality.equal (Core.unName (Core.fieldName f)) (Core.unName fname)) fields)
-  in (Logic.ifElse (Lists.null matchingFields) (Flows.fail (Strings.cat2 (Strings.cat2 "field " (Core.unName fname)) " not found")) (Logic.ifElse (Equality.equal (Lists.length matchingFields) 1) (Flows.bind (Lexical.stripAndDereferenceTerm (Core.fieldTerm (Lists.head matchingFields))) (\stripped -> mapping stripped)) (Flows.fail (Strings.cat2 "multiple fields named " (Core.unName fname)))))
+field :: Context.Context -> Core.Name -> (Core.Term -> Either (Context.InContext Errors.Error) t0) -> Graph.Graph -> [Core.Field] -> Either (Context.InContext Errors.Error) t0
+field cx fname mapping graph fields =
 
+      let matchingFields = Lists.filter (\f -> Equality.equal (Core.unName (Core.fieldName f)) (Core.unName fname)) fields
+      in (Logic.ifElse (Lists.null matchingFields) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " (Strings.cat2 "field " (Core.unName fname))) " but found ") "no matching field"))),
+        Context.inContextContext = cx})) (Logic.ifElse (Equality.equal (Lists.length matchingFields) 1) (Eithers.bind (Lexical.stripAndDereferenceTerm cx graph (Core.fieldTerm (Lists.head matchingFields))) (\stripped -> mapping stripped)) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "single field") " but found ") (Strings.cat2 "multiple fields named " (Core.unName fname))))),
+        Context.inContextContext = cx}))))
+
 -- | Extract a 32-bit floating-point value from a term
-float32 :: (Core.Term -> Compute.Flow Graph.Graph Float)
-float32 t = (Flows.bind (literal t) (\l -> Flows.bind (floatLiteral l) (\f -> float32Value f)))
+float32 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Float
+float32 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (floatLiteral cx l) (\f -> float32Value cx f))
 
 -- | Extract a float32 value from a FloatValue
-float32Value :: (Core.FloatValue -> Compute.Flow t0 Float)
-float32Value v = ((\x -> case x of
-  Core.FloatValueFloat32 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "float32" (Core_.float v))) v)
+float32Value :: Context.Context -> Core.FloatValue -> Either (Context.InContext Errors.Error) Float
+float32Value cx v =
+    case v of
+      Core.FloatValueFloat32 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "float32") " but found ") (Core_.float v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a 64-bit floating-point value from a term
-float64 :: (Core.Term -> Compute.Flow Graph.Graph Double)
-float64 t = (Flows.bind (literal t) (\l -> Flows.bind (floatLiteral l) (\f -> float64Value f)))
+float64 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Double
+float64 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (floatLiteral cx l) (\f -> float64Value cx f))
 
 -- | Extract a float64 value from a FloatValue
-float64Value :: (Core.FloatValue -> Compute.Flow t0 Double)
-float64Value v = ((\x -> case x of
-  Core.FloatValueFloat64 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "float64" (Core_.float v))) v)
+float64Value :: Context.Context -> Core.FloatValue -> Either (Context.InContext Errors.Error) Double
+float64Value cx v =
+    case v of
+      Core.FloatValueFloat64 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "float64") " but found ") (Core_.float v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a floating-point literal from a Literal value
-floatLiteral :: (Core.Literal -> Compute.Flow t0 Core.FloatValue)
-floatLiteral lit = ((\x -> case x of
-  Core.LiteralFloat v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "floating-point value" (Core_.literal lit))) lit)
+floatLiteral :: Context.Context -> Core.Literal -> Either (Context.InContext Errors.Error) Core.FloatValue
+floatLiteral cx lit =
+    case lit of
+      Core.LiteralFloat v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "floating-point value") " but found ") (Core_.literal lit)))),
+        Context.inContextContext = cx})
 
 -- | Extract a float value from a term
-floatValue :: (Core.Term -> Compute.Flow Graph.Graph Core.FloatValue)
-floatValue t = (Flows.bind (literal t) (\l -> floatLiteral l))
-
--- | Extract an either value from a term, applying functions to the left and right values
-eitherTerm :: ((Core.Term -> Compute.Flow Graph.Graph t0) -> (Core.Term -> Compute.Flow Graph.Graph t1) -> Core.Term -> Compute.Flow Graph.Graph (Either t0 t1))
-eitherTerm leftFun rightFun term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermEither v1 -> (Eithers.either (\l -> Flows.map (\x -> Left x) (leftFun l)) (\r -> Flows.map (\x -> Right x) (rightFun r)) v1)
-          _ -> (Monads.unexpected "either value" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
-
--- | Extract the left and right types from an either type
-eitherType :: (Core.Type -> Compute.Flow t0 Core.EitherType)
-eitherType typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeEither v1 -> (Flows.pure v1)
-    _ -> (Monads.unexpected "either type" (Core_.type_ typ))) stripped)
+floatValue :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.FloatValue
+floatValue cx graph t = Eithers.bind (literal cx graph t) (\l -> floatLiteral cx l)
 
 -- | Extract a function type from a type
-functionType :: (Core.Type -> Compute.Flow t0 Core.FunctionType)
-functionType typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeFunction v1 -> (Flows.pure v1)
-    _ -> (Monads.unexpected "function type" (Core_.type_ typ))) stripped)
+functionType :: Context.Context -> Core.Type -> Either (Context.InContext Errors.Error) Core.FunctionType
+functionType cx typ =
 
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeFunction v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "function type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
+
 -- | Extract a field from a union term
-injection :: (Core.Name -> Core.Term -> Compute.Flow Graph.Graph Core.Field)
-injection expected term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermUnion v1 -> (Logic.ifElse (Equality.equal (Core.unName (Core.injectionTypeName v1)) (Core.unName expected)) (Flows.pure (Core.injectionField v1)) (Monads.unexpected (Strings.cat2 "injection of type " (Core.unName expected)) (Core.unName (Core.injectionTypeName v1))))
-          _ -> (Monads.unexpected "injection" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+injection :: Context.Context -> Core.Name -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Field
+injection cx expected graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermUnion v0 -> Logic.ifElse (Equality.equal (Core.unName (Core.injectionTypeName v0)) (Core.unName expected)) (Right (Core.injectionField v0)) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " (Strings.cat2 "injection of type " (Core.unName expected))) " but found ") (Core.unName (Core.injectionTypeName v0))))),
+        Context.inContextContext = cx}))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "injection") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
 
 -- | Extract a 16-bit signed integer value from a term
-int16 :: (Core.Term -> Compute.Flow Graph.Graph I.Int16)
-int16 t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> int16Value i)))
+int16 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) I.Int16
+int16 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> int16Value cx i))
 
 -- | Extract an int16 value from an IntegerValue
-int16Value :: (Core.IntegerValue -> Compute.Flow t0 I.Int16)
-int16Value v = ((\x -> case x of
-  Core.IntegerValueInt16 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "int16" (Core_.integer v))) v)
+int16Value :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) I.Int16
+int16Value cx v =
+    case v of
+      Core.IntegerValueInt16 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "int16") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a 32-bit signed integer value from a term
-int32 :: (Core.Term -> Compute.Flow Graph.Graph Int)
-int32 t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> int32Value i)))
+int32 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Int
+int32 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> int32Value cx i))
 
 -- | Extract an int32 value from an IntegerValue
-int32Value :: (Core.IntegerValue -> Compute.Flow t0 Int)
-int32Value v = ((\x -> case x of
-  Core.IntegerValueInt32 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "int32" (Core_.integer v))) v)
+int32Value :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) Int
+int32Value cx v =
+    case v of
+      Core.IntegerValueInt32 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "int32") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a 64-bit signed integer value from a term
-int64 :: (Core.Term -> Compute.Flow Graph.Graph I.Int64)
-int64 t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> int64Value i)))
+int64 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) I.Int64
+int64 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> int64Value cx i))
 
 -- | Extract an int64 value from an IntegerValue
-int64Value :: (Core.IntegerValue -> Compute.Flow t0 I.Int64)
-int64Value v = ((\x -> case x of
-  Core.IntegerValueInt64 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "int64" (Core_.integer v))) v)
+int64Value :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) I.Int64
+int64Value cx v =
+    case v of
+      Core.IntegerValueInt64 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "int64") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract an 8-bit signed integer value from a term
-int8 :: (Core.Term -> Compute.Flow Graph.Graph I.Int8)
-int8 t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> int8Value i)))
+int8 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) I.Int8
+int8 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> int8Value cx i))
 
 -- | Extract an int8 value from an IntegerValue
-int8Value :: (Core.IntegerValue -> Compute.Flow t0 I.Int8)
-int8Value v = ((\x -> case x of
-  Core.IntegerValueInt8 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "int8" (Core_.integer v))) v)
+int8Value :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) I.Int8
+int8Value cx v =
+    case v of
+      Core.IntegerValueInt8 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "int8") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract an integer literal from a Literal value
-integerLiteral :: (Core.Literal -> Compute.Flow t0 Core.IntegerValue)
-integerLiteral lit = ((\x -> case x of
-  Core.LiteralInteger v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "integer value" (Core_.literal lit))) lit)
+integerLiteral :: Context.Context -> Core.Literal -> Either (Context.InContext Errors.Error) Core.IntegerValue
+integerLiteral cx lit =
+    case lit of
+      Core.LiteralInteger v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "integer value") " but found ") (Core_.literal lit)))),
+        Context.inContextContext = cx})
 
 -- | Extract an integer value from a term
-integerValue :: (Core.Term -> Compute.Flow Graph.Graph Core.IntegerValue)
-integerValue t = (Flows.bind (literal t) (\l -> integerLiteral l))
+integerValue :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.IntegerValue
+integerValue cx graph t = Eithers.bind (literal cx graph t) (\l -> integerLiteral cx l)
 
+-- | Extract a lambda from a term
+lambda :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Lambda
+lambda cx graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionLambda v1 -> Right v1
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "lambda") " but found ") (Core_.term term)))),
+          Context.inContextContext = cx})
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "lambda") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
+
 -- | Extract the body of a lambda term
-lambdaBody :: (Core.Term -> Compute.Flow Graph.Graph Core.Term)
-lambdaBody term = (Flows.map Core.lambdaBody (lambda term))
+lambdaBody :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+lambdaBody cx graph term = Eithers.map Core.lambdaBody (lambda cx graph term)
 
--- | Extract a lambda from a term
-lambda :: (Core.Term -> Compute.Flow Graph.Graph Core.Lambda)
-lambda term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionLambda v2 -> (Flows.pure v2)
-            _ -> (Monads.unexpected "lambda" (Core_.term term))) v1)
-          _ -> (Monads.unexpected "lambda" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+-- | Extract a let expression from a term
+let_ :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Let
+let_ cx graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermLet v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "let term") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
 
 -- | Extract a binding with the given name from a let term
-letBinding :: (String -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-letBinding n term =  
-  let name = (Core.Name n)
-  in (Flows.bind (let_ term) (\letExpr ->  
-    let matchingBindings = (Lists.filter (\b -> Equality.equal (Core.unName (Core.bindingName b)) (Core.unName name)) (Core.letBindings letExpr))
-    in (Logic.ifElse (Lists.null matchingBindings) (Flows.fail (Strings.cat2 "no such binding: " n)) (Logic.ifElse (Equality.equal (Lists.length matchingBindings) 1) (Flows.pure (Core.bindingTerm (Lists.head matchingBindings))) (Flows.fail (Strings.cat2 "multiple bindings named " n))))))
+letBinding :: Context.Context -> String -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+letBinding cx n graph term =
 
--- | Extract a let expression from a term
-let_ :: (Core.Term -> Compute.Flow Graph.Graph Core.Let)
-let_ term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermLet v1 -> (Flows.pure v1)
-          _ -> (Monads.unexpected "let term" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+      let name = Core.Name n
+      in (Eithers.bind (let_ cx graph term) (\letExpr ->
+        let matchingBindings =
+                Lists.filter (\b -> Equality.equal (Core.unName (Core.bindingName b)) (Core.unName name)) (Core.letBindings letExpr)
+        in (Logic.ifElse (Lists.null matchingBindings) (Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "no such binding: " n))),
+          Context.inContextContext = cx})) (Logic.ifElse (Equality.equal (Lists.length matchingBindings) 1) (Right (Core.bindingTerm (Lists.head matchingBindings))) (Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "multiple bindings named " n))),
+          Context.inContextContext = cx}))))))
 
 -- | Extract a list of terms from a term
-list :: (Core.Term -> Compute.Flow Graph.Graph [Core.Term])
-list term =  
-  let extract = (\stripped -> (\x -> case x of
-          Core.TermList v1 -> (Flows.pure v1)
-          _ -> (Monads.unexpected "list" (Core_.term stripped))) stripped)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term) (\stripped -> extract stripped))
+list :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) [Core.Term]
+list cx graph term =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term) (\stripped -> case stripped of
+      Core.TermList v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "list") " but found ") (Core_.term stripped)))),
+        Context.inContextContext = cx}))
 
 -- | Extract the first element of a list term
-listHead :: (Core.Term -> Compute.Flow Graph.Graph Core.Term)
-listHead term = (Flows.bind (list term) (\l -> Logic.ifElse (Lists.null l) (Flows.fail "empty list") (Flows.pure (Lists.head l))))
+listHead :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+listHead cx graph term =
+    Eithers.bind (list cx graph term) (\l -> Logic.ifElse (Lists.null l) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError "empty list")),
+      Context.inContextContext = cx})) (Right (Lists.head l)))
 
 -- | Extract a list of values from a term, mapping a function over each element
-listOf :: ((Core.Term -> Compute.Flow Graph.Graph t0) -> Core.Term -> Compute.Flow Graph.Graph [t0])
-listOf f term = (Flows.bind (list term) (\els -> Flows.mapList f els))
+listOf :: Context.Context -> (Core.Term -> Either (Context.InContext Errors.Error) t0) -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) [t0]
+listOf cx f graph term = Eithers.bind (list cx graph term) (\els -> Eithers.mapList f els)
 
 -- | Extract the element type from a list type
-listType :: (Core.Type -> Compute.Flow t0 Core.Type)
-listType typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeList v1 -> (Flows.pure v1)
-    _ -> (Monads.unexpected "list type" (Core_.type_ typ))) stripped)
+listType :: Context.Context -> Core.Type -> Either (Context.InContext Errors.Error) Core.Type
+listType cx typ =
 
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeList v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "list type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
+
 -- | Extract a literal value from a term
-literal :: (Core.Term -> Compute.Flow Graph.Graph Core.Literal)
-literal term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermLiteral v1 -> (Flows.pure v1)
-          _ -> (Monads.unexpected "literal" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+literal :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Literal
+literal cx graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermLiteral v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "literal") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
 
 -- | Extract a map of key-value pairs from a term, mapping functions over each key and value
-map :: Ord t0 => ((Core.Term -> Compute.Flow Graph.Graph t0) -> (Core.Term -> Compute.Flow Graph.Graph t1) -> Core.Term -> Compute.Flow Graph.Graph (M.Map t0 t1))
-map fk fv term0 =  
-  let pair = (\kvPair ->  
-          let kterm = (Pairs.first kvPair)
-          in  
-            let vterm = (Pairs.second kvPair)
-            in (Flows.bind (fk kterm) (\kval -> Flows.bind (fv vterm) (\vval -> Flows.pure (kval, vval)))))
-  in  
-    let extract = (\term -> (\x -> case x of
-            Core.TermMap v1 -> (Flows.map Maps.fromList (Flows.mapList pair (Maps.toList v1)))
-            _ -> (Monads.unexpected "map" (Core_.term term))) term)
-    in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+map :: Ord t0 => (Context.Context -> (Core.Term -> Either (Context.InContext Errors.Error) t0) -> (Core.Term -> Either (Context.InContext Errors.Error) t1) -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) (M.Map t0 t1))
+map cx fk fv graph term0 =
 
+      let pair =
+              \kvPair ->
+                let kterm = Pairs.first kvPair
+                    vterm = Pairs.second kvPair
+                in (Eithers.bind (fk kterm) (\kval -> Eithers.bind (fv vterm) (\vval -> Right (kval, vval))))
+      in (Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+        Core.TermMap v0 -> Eithers.map Maps.fromList (Eithers.mapList pair (Maps.toList v0))
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "map") " but found ") (Core_.term term)))),
+          Context.inContextContext = cx})))
+
 -- | Extract the key and value types from a map type
-mapType :: (Core.Type -> Compute.Flow t0 Core.MapType)
-mapType typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeMap v1 -> (Flows.pure v1)
-    _ -> (Monads.unexpected "map type" (Core_.type_ typ))) stripped)
+mapType :: Context.Context -> Core.Type -> Either (Context.InContext Errors.Error) Core.MapType
+mapType cx typ =
 
--- | Ensure a function has the expected number of arguments
-nArgs :: (Core.Name -> Int -> [t0] -> Compute.Flow t1 ())
-nArgs name n args = (Logic.ifElse (Equality.equal (Lists.length args) n) (Flows.pure ()) (Monads.unexpected (Strings.cat [
-  Literals.showInt32 n,
-  " arguments to primitive ",
-  (Literals.showString (Core.unName name))]) (Literals.showInt32 (Lists.length args))))
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeMap v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "map type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
 
 -- | Extract an optional value from a term, applying a function to the value if present
-maybeTerm :: ((Core.Term -> Compute.Flow Graph.Graph t0) -> Core.Term -> Compute.Flow Graph.Graph (Maybe t0))
-maybeTerm f term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermMaybe v1 -> (Maybes.maybe (Flows.pure Nothing) (\t -> Flows.map Maybes.pure (f t)) v1)
-          _ -> (Monads.unexpected "maybe value" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+maybeTerm :: Context.Context -> (Core.Term -> Either (Context.InContext Errors.Error) t0) -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) (Maybe t0)
+maybeTerm cx f graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermMaybe v0 -> Maybes.maybe (Right Nothing) (\t -> Eithers.map Maybes.pure (f t)) v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "maybe value") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
 
 -- | Extract the base type from an optional type
-maybeType :: (Core.Type -> Compute.Flow t0 Core.Type)
-maybeType typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeMaybe v1 -> (Flows.pure v1)
-    _ -> (Monads.unexpected "maybe type" (Core_.type_ typ))) stripped)
+maybeType :: Context.Context -> Core.Type -> Either (Context.InContext Errors.Error) Core.Type
+maybeType cx typ =
 
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeMaybe v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "maybe type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
+
+-- | Ensure a function has the expected number of arguments
+nArgs :: Context.Context -> Core.Name -> Int -> [t0] -> Either (Context.InContext Errors.Error) ()
+nArgs cx name n args =
+    Logic.ifElse (Equality.equal (Lists.length args) n) (Right ()) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " (Strings.cat [
+        Literals.showInt32 n,
+        " arguments to primitive ",
+        (Literals.showString (Core.unName name))])) " but found ") (Literals.showInt32 (Lists.length args))))),
+      Context.inContextContext = cx}))
+
 -- | Extract a pair of values from a term, applying functions to each component
-pair :: ((Core.Term -> Compute.Flow Graph.Graph t0) -> (Core.Term -> Compute.Flow Graph.Graph t1) -> Core.Term -> Compute.Flow Graph.Graph (t0, t1))
-pair kf vf term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermPair v1 -> (Flows.bind (kf (Pairs.first v1)) (\kVal -> Flows.bind (vf (Pairs.second v1)) (\vVal -> Flows.pure (kVal, vVal))))
-          _ -> (Monads.unexpected "pair" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+pair :: Context.Context -> (Core.Term -> Either (Context.InContext Errors.Error) t0) -> (Core.Term -> Either (Context.InContext Errors.Error) t1) -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) (t0, t1)
+pair cx kf vf graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermPair v0 -> Eithers.bind (kf (Pairs.first v0)) (\kVal -> Eithers.bind (vf (Pairs.second v0)) (\vVal -> Right (kVal, vVal)))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "pair") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
 
 -- | Extract a record's fields from a term
-record :: (Core.Name -> Core.Term -> Compute.Flow Graph.Graph [Core.Field])
-record expected term0 = (Flows.bind (termRecord term0) (\record -> Logic.ifElse (Equality.equal (Core.recordTypeName record) expected) (Flows.pure (Core.recordFields record)) (Monads.unexpected (Strings.cat2 "record of type " (Core.unName expected)) (Core.unName (Core.recordTypeName record)))))
+record :: Context.Context -> Core.Name -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) [Core.Field]
+record cx expected graph term0 =
+    Eithers.bind (termRecord cx graph term0) (\record -> Logic.ifElse (Equality.equal (Core.recordTypeName record) expected) (Right (Core.recordFields record)) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " (Strings.cat2 "record of type " (Core.unName expected))) " but found ") (Core.unName (Core.recordTypeName record))))),
+      Context.inContextContext = cx})))
 
 -- | Extract the field types from a record type
-recordType :: (Core.Name -> Core.Type -> Compute.Flow t0 [Core.FieldType])
-recordType ename typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeRecord v1 -> (Logic.ifElse (Equality.equal (Core.unName (Core.rowTypeTypeName v1)) (Core.unName ename)) (Flows.pure (Core.rowTypeFields v1)) (Monads.unexpected (Strings.cat2 "record of type " (Core.unName ename)) (Strings.cat2 "record of type " (Core.unName (Core.rowTypeTypeName v1)))))
-    _ -> (Monads.unexpected "record type" (Core_.type_ typ))) stripped)
+recordType :: Context.Context -> t0 -> Core.Type -> Either (Context.InContext Errors.Error) [Core.FieldType]
+recordType cx ename typ =
 
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeRecord v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "record type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
+
 -- | Extract a set of terms from a term
-set :: (Core.Term -> Compute.Flow Graph.Graph (S.Set Core.Term))
-set term =  
-  let extract = (\stripped -> (\x -> case x of
-          Core.TermSet v1 -> (Flows.pure v1)
-          _ -> (Monads.unexpected "set" (Core_.term stripped))) stripped)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term) (\stripped -> extract stripped))
+set :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) (S.Set Core.Term)
+set cx graph term =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term) (\stripped -> case stripped of
+      Core.TermSet v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "set") " but found ") (Core_.term stripped)))),
+        Context.inContextContext = cx}))
 
 -- | Extract a set of values from a term, mapping a function over each element
-setOf :: Ord t0 => ((Core.Term -> Compute.Flow Graph.Graph t0) -> Core.Term -> Compute.Flow Graph.Graph (S.Set t0))
-setOf f term = (Flows.bind (set term) (\els -> Flows.mapSet f els))
+setOf :: Ord t0 => (Context.Context -> (Core.Term -> Either (Context.InContext Errors.Error) t0) -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) (S.Set t0))
+setOf cx f graph term = Eithers.bind (set cx graph term) (\els -> Eithers.mapSet f els)
 
 -- | Extract the element type from a set type
-setType :: (Core.Type -> Compute.Flow t0 Core.Type)
-setType typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeSet v1 -> (Flows.pure v1)
-    _ -> (Monads.unexpected "set type" (Core_.type_ typ))) stripped)
+setType :: Context.Context -> Core.Type -> Either (Context.InContext Errors.Error) Core.Type
+setType cx typ =
 
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeSet v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "set type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
+
 -- | Extract a string value from a term
-string :: (Core.Term -> Compute.Flow Graph.Graph String)
-string t = (Flows.bind (literal t) (\l -> stringLiteral l))
+string :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) String
+string cx graph t = Eithers.bind (literal cx graph t) (\l -> stringLiteral cx l)
 
 -- | Extract a string literal from a Literal value
-stringLiteral :: (Core.Literal -> Compute.Flow t0 String)
-stringLiteral v = ((\x -> case x of
-  Core.LiteralString v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "string" (Core_.literal v))) v)
+stringLiteral :: Context.Context -> Core.Literal -> Either (Context.InContext Errors.Error) String
+stringLiteral cx v =
+    case v of
+      Core.LiteralString v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "string") " but found ") (Core_.literal v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a record from a term
-termRecord :: (Core.Term -> Compute.Flow Graph.Graph Core.Record)
-termRecord term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermRecord v1 -> (Flows.pure v1)
-          _ -> (Monads.unexpected "record" (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+termRecord :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Record
+termRecord cx graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermRecord v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "record") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
 
 -- | Extract a 16-bit unsigned integer value from a term
-uint16 :: (Core.Term -> Compute.Flow Graph.Graph Int)
-uint16 t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> uint16Value i)))
+uint16 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Int
+uint16 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> uint16Value cx i))
 
 -- | Extract a uint16 value from an IntegerValue
-uint16Value :: (Core.IntegerValue -> Compute.Flow t0 Int)
-uint16Value v = ((\x -> case x of
-  Core.IntegerValueUint16 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "uint16" (Core_.integer v))) v)
+uint16Value :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) Int
+uint16Value cx v =
+    case v of
+      Core.IntegerValueUint16 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "uint16") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a 32-bit unsigned integer value from a term
-uint32 :: (Core.Term -> Compute.Flow Graph.Graph I.Int64)
-uint32 t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> uint32Value i)))
+uint32 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) I.Int64
+uint32 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> uint32Value cx i))
 
 -- | Extract a uint32 value from an IntegerValue
-uint32Value :: (Core.IntegerValue -> Compute.Flow t0 I.Int64)
-uint32Value v = ((\x -> case x of
-  Core.IntegerValueUint32 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "uint32" (Core_.integer v))) v)
+uint32Value :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) I.Int64
+uint32Value cx v =
+    case v of
+      Core.IntegerValueUint32 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "uint32") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract a 64-bit unsigned integer value from a term
-uint64 :: (Core.Term -> Compute.Flow Graph.Graph Integer)
-uint64 t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> uint64Value i)))
+uint64 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Integer
+uint64 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> uint64Value cx i))
 
 -- | Extract a uint64 value from an IntegerValue
-uint64Value :: (Core.IntegerValue -> Compute.Flow t0 Integer)
-uint64Value v = ((\x -> case x of
-  Core.IntegerValueUint64 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "uint64" (Core_.integer v))) v)
+uint64Value :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) Integer
+uint64Value cx v =
+    case v of
+      Core.IntegerValueUint64 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "uint64") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract an 8-bit unsigned integer value from a term
-uint8 :: (Core.Term -> Compute.Flow Graph.Graph I.Int16)
-uint8 t = (Flows.bind (literal t) (\l -> Flows.bind (integerLiteral l) (\i -> uint8Value i)))
+uint8 :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) I.Int16
+uint8 cx graph t = Eithers.bind (literal cx graph t) (\l -> Eithers.bind (integerLiteral cx l) (\i -> uint8Value cx i))
 
 -- | Extract a uint8 value from an IntegerValue
-uint8Value :: (Core.IntegerValue -> Compute.Flow t0 I.Int16)
-uint8Value v = ((\x -> case x of
-  Core.IntegerValueUint8 v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "uint8" (Core_.integer v))) v)
+uint8Value :: Context.Context -> Core.IntegerValue -> Either (Context.InContext Errors.Error) I.Int16
+uint8Value cx v =
+    case v of
+      Core.IntegerValueUint8 v0 -> Right v0
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "uint8") " but found ") (Core_.integer v)))),
+        Context.inContextContext = cx})
 
 -- | Extract the field types from a union type
-unionType :: (Core.Name -> Core.Type -> Compute.Flow t0 [Core.FieldType])
-unionType ename typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeUnion v1 -> (Logic.ifElse (Equality.equal (Core.rowTypeTypeName v1) ename) (Flows.pure (Core.rowTypeFields v1)) (Monads.unexpected (Strings.cat2 "union of type " (Core.unName ename)) (Strings.cat2 "union of type " (Core.unName (Core.rowTypeTypeName v1)))))
-    _ -> (Monads.unexpected "union type" (Core_.type_ typ))) stripped)
+unionType :: Context.Context -> t0 -> Core.Type -> Either (Context.InContext Errors.Error) [Core.FieldType]
+unionType cx ename typ =
 
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeUnion v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "union type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
+
 -- | Extract a unit value from a term
-unit :: (Core.Term -> Compute.Flow t0 ())
-unit term = ((\x -> case x of
-  Core.TermUnit -> (Flows.pure ())
-  _ -> (Monads.unexpected "unit" (Core_.term term))) term)
+unit :: Context.Context -> Core.Term -> Either (Context.InContext Errors.Error) ()
+unit cx term =
+    case term of
+      Core.TermUnit -> Right ()
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "unit") " but found ") (Core_.term term)))),
+        Context.inContextContext = cx})
 
 -- | Extract a unit variant (a variant with an empty record value) from a union term
-unitVariant :: (Core.Name -> Core.Term -> Compute.Flow Graph.Graph Core.Name)
-unitVariant tname term = (Flows.bind (injection tname term) (\field -> Flows.bind (unit (Core.fieldTerm field)) (\ignored -> Flows.pure (Core.fieldName field))))
+unitVariant :: Context.Context -> Core.Name -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Name
+unitVariant cx tname graph term =
+    Eithers.bind (injection cx tname graph term) (\field -> Eithers.bind (unit cx (Core.fieldTerm field)) (\ignored -> Right (Core.fieldName field)))
 
 -- | Extract the wrapped value from a wrapped term
-wrap :: (Core.Name -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-wrap expected term0 =  
-  let extract = (\term -> (\x -> case x of
-          Core.TermWrap v1 -> (Logic.ifElse (Equality.equal (Core.unName (Core.wrappedTermTypeName v1)) (Core.unName expected)) (Flows.pure (Core.wrappedTermBody v1)) (Monads.unexpected (Strings.cat2 "wrapper of type " (Core.unName expected)) (Core.unName (Core.wrappedTermTypeName v1))))
-          _ -> (Monads.unexpected (Strings.cat2 (Strings.cat2 "wrap(" (Core.unName expected)) ")") (Core_.term term))) term)
-  in (Flows.bind (Lexical.stripAndDereferenceTerm term0) (\term -> extract term))
+wrap :: Context.Context -> Core.Name -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+wrap cx expected graph term0 =
+    Eithers.bind (Lexical.stripAndDereferenceTerm cx graph term0) (\term -> case term of
+      Core.TermWrap v0 -> Logic.ifElse (Equality.equal (Core.unName (Core.wrappedTermTypeName v0)) (Core.unName expected)) (Right (Core.wrappedTermBody v0)) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " (Strings.cat2 "wrapper of type " (Core.unName expected))) " but found ") (Core.unName (Core.wrappedTermTypeName v0))))),
+        Context.inContextContext = cx}))
+      _ -> Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " (Strings.cat2 (Strings.cat2 "wrap(" (Core.unName expected)) ")")) " but found ") (Core_.term term)))),
+        Context.inContextContext = cx}))
 
 -- | Extract the wrapped type from a wrapper type
-wrappedType :: (Core.Name -> Core.Type -> Compute.Flow t0 Core.Type)
-wrappedType ename typ =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeWrap v1 -> (Logic.ifElse (Equality.equal (Core.unName (Core.wrappedTypeTypeName v1)) (Core.unName ename)) (Flows.pure (Core.wrappedTypeBody v1)) (Monads.unexpected (Strings.cat2 "wrapped type " (Core.unName ename)) (Strings.cat2 "wrapped type " (Core.unName (Core.wrappedTypeTypeName v1)))))
-    _ -> (Monads.unexpected "wrapped type" (Core_.type_ typ))) stripped)
+wrappedType :: Context.Context -> t0 -> Core.Type -> Either (Context.InContext Errors.Error) Core.Type
+wrappedType cx ename typ =
+
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeWrap v0 -> Right v0
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " "wrapped type") " but found ") (Core_.type_ typ)))),
+          Context.inContextContext = cx})
diff --git a/src/gen-main/haskell/Hydra/Extract/Helpers.hs b/src/gen-main/haskell/Hydra/Extract/Helpers.hs
--- a/src/gen-main/haskell/Hydra/Extract/Helpers.hs
+++ b/src/gen-main/haskell/Hydra/Extract/Helpers.hs
@@ -5,6 +5,7 @@
 module Hydra.Extract.Helpers where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
@@ -14,7 +15,6 @@
 import qualified Hydra.Lib.Pairs as Pairs
 import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -23,60 +23,69 @@
 import qualified Data.Set as S
 
 -- | Decode an Either value using the provided left and right decoders
-decodeEither :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> (Graph.Graph -> Core.Term -> Either Util.DecodingError t1) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Either t0 t1))
-decodeEither leftDecoder rightDecoder g term = (Eithers.bind (Eithers.bimap (\x -> Util.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> (\x -> case x of
-  Core.TermEither v1 -> (Eithers.either (\lv -> Eithers.map (\x -> Left x) (leftDecoder g lv)) (\rv -> Eithers.map (\x -> Right x) (rightDecoder g rv)) v1)
-  _ -> (Left (Util.DecodingError "expected either value"))) stripped))
+decodeEither :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> (Graph.Graph -> Core.Term -> Either Errors.DecodingError t1) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Either t0 t1)
+decodeEither leftDecoder rightDecoder g term =
+    Eithers.bind (Eithers.bimap (\x -> Errors.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> case stripped of
+      Core.TermEither v0 -> Eithers.either (\lv -> Eithers.map (\x -> Left x) (leftDecoder g lv)) (\rv -> Eithers.map (\x -> Right x) (rightDecoder g rv)) v0
+      _ -> Left (Errors.DecodingError "expected either value"))
 
 -- | Decode a list of elements using the provided element decoder
-decodeList :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError [t0])
-decodeList elemDecoder g term = (Eithers.bind (Eithers.bimap (\x -> Util.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> (\x -> case x of
-  Core.TermList v1 -> (Eithers.mapList (elemDecoder g) v1)
-  _ -> (Left (Util.DecodingError "expected list"))) stripped))
+decodeList :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError [t0]
+decodeList elemDecoder g term =
+    Eithers.bind (Eithers.bimap (\x -> Errors.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> case stripped of
+      Core.TermList v0 -> Eithers.mapList (elemDecoder g) v0
+      _ -> Left (Errors.DecodingError "expected list"))
 
 -- | Decode a Map using the provided key and value decoders
-decodeMap :: Ord t0 => ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> (Graph.Graph -> Core.Term -> Either Util.DecodingError t1) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (M.Map t0 t1))
-decodeMap keyDecoder valDecoder g term = (Eithers.bind (Eithers.bimap (\x -> Util.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> (\x -> case x of
-  Core.TermMap v1 -> (Eithers.map Maps.fromList (Eithers.mapList (\kv -> Eithers.bind (keyDecoder g (Pairs.first kv)) (\k -> Eithers.map (\v -> (k, v)) (valDecoder g (Pairs.second kv)))) (Maps.toList v1)))
-  _ -> (Left (Util.DecodingError "expected map"))) stripped))
+decodeMap :: Ord t0 => ((Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> (Graph.Graph -> Core.Term -> Either Errors.DecodingError t1) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (M.Map t0 t1))
+decodeMap keyDecoder valDecoder g term =
+    Eithers.bind (Eithers.bimap (\x -> Errors.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> case stripped of
+      Core.TermMap v0 -> Eithers.map Maps.fromList (Eithers.mapList (\kv -> Eithers.bind (keyDecoder g (Pairs.first kv)) (\k -> Eithers.map (\v -> (k, v)) (valDecoder g (Pairs.second kv)))) (Maps.toList v0))
+      _ -> Left (Errors.DecodingError "expected map"))
 
 -- | Decode a Maybe value using the provided element decoder
-decodeMaybe :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (Maybe t0))
-decodeMaybe elemDecoder g term = (Eithers.bind (Eithers.bimap (\x -> Util.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> (\x -> case x of
-  Core.TermMaybe v1 -> (Eithers.mapMaybe (elemDecoder g) v1)
-  _ -> (Left (Util.DecodingError "expected optional value"))) stripped))
+decodeMaybe :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (Maybe t0)
+decodeMaybe elemDecoder g term =
+    Eithers.bind (Eithers.bimap (\x -> Errors.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> case stripped of
+      Core.TermMaybe v0 -> Eithers.mapMaybe (elemDecoder g) v0
+      _ -> Left (Errors.DecodingError "expected optional value"))
 
 -- | Decode a Pair using the provided first and second decoders
-decodePair :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> (Graph.Graph -> Core.Term -> Either Util.DecodingError t1) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (t0, t1))
-decodePair firstDecoder secondDecoder g term = (Eithers.bind (Eithers.bimap (\x -> Util.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> (\x -> case x of
-  Core.TermPair v1 -> (Eithers.bind (firstDecoder g (Pairs.first v1)) (\f -> Eithers.map (\s -> (f, s)) (secondDecoder g (Pairs.second v1))))
-  _ -> (Left (Util.DecodingError "expected pair"))) stripped))
+decodePair :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> (Graph.Graph -> Core.Term -> Either Errors.DecodingError t1) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (t0, t1)
+decodePair firstDecoder secondDecoder g term =
+    Eithers.bind (Eithers.bimap (\x -> Errors.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> case stripped of
+      Core.TermPair v0 -> Eithers.bind (firstDecoder g (Pairs.first v0)) (\f -> Eithers.map (\s -> (f, s)) (secondDecoder g (Pairs.second v0)))
+      _ -> Left (Errors.DecodingError "expected pair"))
 
 -- | Decode a Set using the provided element decoder
-decodeSet :: Ord t0 => ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError (S.Set t0))
-decodeSet elemDecoder g term = (Eithers.bind (Eithers.bimap (\x -> Util.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> (\x -> case x of
-  Core.TermSet v1 -> (Eithers.map Sets.fromList (Eithers.mapList (elemDecoder g) (Sets.toList v1)))
-  _ -> (Left (Util.DecodingError "expected set"))) stripped))
+decodeSet :: Ord t0 => ((Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError (S.Set t0))
+decodeSet elemDecoder g term =
+    Eithers.bind (Eithers.bimap (\x -> Errors.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> case stripped of
+      Core.TermSet v0 -> Eithers.map Sets.fromList (Eithers.mapList (elemDecoder g) (Sets.toList v0))
+      _ -> Left (Errors.DecodingError "expected set"))
 
 -- | Decode a unit value
-decodeUnit :: (Graph.Graph -> Core.Term -> Either Util.DecodingError ())
-decodeUnit g term = (Eithers.bind (Eithers.bimap (\x -> Util.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> (\x -> case x of
-  Core.TermUnit -> (Right ())
-  _ -> (Left (Util.DecodingError "expected a unit value"))) stripped))
+decodeUnit :: Graph.Graph -> Core.Term -> Either Errors.DecodingError ()
+decodeUnit g term =
+    Eithers.bind (Eithers.bimap (\x -> Errors.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> case stripped of
+      Core.TermUnit -> Right ()
+      _ -> Left (Errors.DecodingError "expected a unit value"))
 
 -- | Decode a wrapped value using the provided body decoder
-decodeWrapped :: ((Graph.Graph -> Core.Term -> Either Util.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Util.DecodingError t0)
-decodeWrapped bodyDecoder g term = (Eithers.bind (Eithers.bimap (\x -> Util.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> (\x -> case x of
-  Core.TermWrap v1 -> (bodyDecoder g (Core.wrappedTermBody v1))
-  _ -> (Left (Util.DecodingError "expected wrapped value"))) stripped))
+decodeWrapped :: (Graph.Graph -> Core.Term -> Either Errors.DecodingError t0) -> Graph.Graph -> Core.Term -> Either Errors.DecodingError t0
+decodeWrapped bodyDecoder g term =
+    Eithers.bind (Eithers.bimap (\x -> Errors.DecodingError x) (\x -> x) (Lexical.stripAndDereferenceTermEither g term)) (\stripped -> case stripped of
+      Core.TermWrap v0 -> bodyDecoder g (Core.wrappedTermBody v0)
+      _ -> Left (Errors.DecodingError "expected wrapped value"))
 
 -- | Require a field from a record's field map and decode it
-requireField :: (String -> (t0 -> t1 -> Either Util.DecodingError t2) -> M.Map Core.Name t1 -> t0 -> Either Util.DecodingError t2)
-requireField fieldName decoder fieldMap g = (Maybes.maybe (Left (Util.DecodingError (Strings.cat [
-  "missing field ",
-  fieldName,
-  " in record"]))) (\fieldTerm -> decoder g fieldTerm) (Maps.lookup (Core.Name fieldName) fieldMap))
+requireField :: String -> (t0 -> t1 -> Either Errors.DecodingError t2) -> M.Map Core.Name t1 -> t0 -> Either Errors.DecodingError t2
+requireField fieldName decoder fieldMap g =
+    Maybes.maybe (Left (Errors.DecodingError (Strings.cat [
+      "missing field ",
+      fieldName,
+      " in record"]))) (\fieldTerm -> decoder g fieldTerm) (Maps.lookup (Core.Name fieldName) fieldMap)
 
 -- | Convert a Record's fields to a Map from Name to Term
-toFieldMap :: (Core.Record -> M.Map Core.Name Core.Term)
-toFieldMap record = (Maps.fromList (Lists.map (\f -> (Core.fieldName f, (Core.fieldTerm f))) (Core.recordFields record)))
+toFieldMap :: Core.Record -> M.Map Core.Name Core.Term
+toFieldMap record = Maps.fromList (Lists.map (\f -> (Core.fieldName f, (Core.fieldTerm f))) (Core.recordFields record))
diff --git a/src/gen-main/haskell/Hydra/Extract/Json.hs b/src/gen-main/haskell/Hydra/Extract/Json.hs
--- a/src/gen-main/haskell/Hydra/Extract/Json.hs
+++ b/src/gen-main/haskell/Hydra/Extract/Json.hs
@@ -4,13 +4,11 @@
 
 module Hydra.Extract.Json where
 
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Json.Model as Model
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -19,60 +17,65 @@
 import qualified Data.Set as S
 
 -- | Extract an array from a JSON value, failing if the value is not an array
-expectArray :: (Model.Value -> Compute.Flow t0 [Model.Value])
-expectArray value = ((\x -> case x of
-  Model.ValueArray v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "JSON array" (showValue value))) value)
+expectArray :: Model.Value -> Either String [Model.Value]
+expectArray value =
+    case value of
+      Model.ValueArray v0 -> Right v0
+      _ -> Left (Strings.cat2 (Strings.cat2 "expected " "JSON array") (Strings.cat2 " but found " (showValue value)))
 
 -- | Extract a number from a JSON value, failing if the value is not a number
-expectNumber :: (Model.Value -> Compute.Flow t0 Double)
-expectNumber value = ((\x -> case x of
-  Model.ValueNumber v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "JSON number" (showValue value))) value)
+expectNumber :: Model.Value -> Either String Double
+expectNumber value =
+    case value of
+      Model.ValueNumber v0 -> Right v0
+      _ -> Left (Strings.cat2 (Strings.cat2 "expected " "JSON number") (Strings.cat2 " but found " (showValue value)))
 
 -- | Extract an object from a JSON value, failing if the value is not an object
-expectObject :: (Model.Value -> Compute.Flow t0 (M.Map String Model.Value))
-expectObject value = ((\x -> case x of
-  Model.ValueObject v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "JSON object" (showValue value))) value)
+expectObject :: Model.Value -> Either String (M.Map String Model.Value)
+expectObject value =
+    case value of
+      Model.ValueObject v0 -> Right v0
+      _ -> Left (Strings.cat2 (Strings.cat2 "expected " "JSON object") (Strings.cat2 " but found " (showValue value)))
 
 -- | Extract a string from a JSON value, failing if the value is not a string
-expectString :: (Model.Value -> Compute.Flow t0 String)
-expectString value = ((\x -> case x of
-  Model.ValueString v1 -> (Flows.pure v1)
-  _ -> (Monads.unexpected "JSON string" (showValue value))) value)
+expectString :: Model.Value -> Either String String
+expectString value =
+    case value of
+      Model.ValueString v0 -> Right v0
+      _ -> Left (Strings.cat2 (Strings.cat2 "expected " "JSON string") (Strings.cat2 " but found " (showValue value)))
 
 -- | Look up an optional field in a JSON object
 opt :: Ord t0 => (t0 -> M.Map t0 t1 -> Maybe t1)
-opt fname m = (Maps.lookup fname m)
+opt fname m = Maps.lookup fname m
 
 -- | Look up an optional array field in a JSON object
-optArray :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Compute.Flow t1 (Maybe [Model.Value]))
-optArray fname m = (Maybes.maybe (Flows.pure Nothing) (\a -> Flows.map Maybes.pure (expectArray a)) (opt fname m))
+optArray :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Either String (Maybe [Model.Value]))
+optArray fname m = Maybes.maybe (Right Nothing) (\a -> Eithers.map (\x -> Just x) (expectArray a)) (opt fname m)
 
 -- | Look up an optional string field in a JSON object
-optString :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Compute.Flow t1 (Maybe String))
-optString fname m = (Maybes.maybe (Flows.pure Nothing) (\s -> Flows.map Maybes.pure (expectString s)) (opt fname m))
+optString :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Either String (Maybe String))
+optString fname m = Maybes.maybe (Right Nothing) (\s -> Eithers.map (\x -> Just x) (expectString s)) (opt fname m)
 
 -- | Look up a required field in a JSON object, failing if not found
-require :: Ord t0 => (t0 -> M.Map t0 t1 -> Compute.Flow t2 t1)
-require fname m = (Maybes.maybe (Flows.fail (Strings.cat [
-  "required attribute ",
-  (showValue fname),
-  " not found"])) (\value -> Flows.pure value) (Maps.lookup fname m))
+require :: Ord t0 => (t0 -> M.Map t0 t1 -> Either String t1)
+require fname m =
+    Maybes.maybe (Left (Strings.cat [
+      "required attribute ",
+      (showValue fname),
+      " not found"])) (\value -> Right value) (Maps.lookup fname m)
 
 -- | Look up a required array field in a JSON object
-requireArray :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Compute.Flow t1 [Model.Value])
-requireArray fname m = (Flows.bind (require fname m) expectArray)
+requireArray :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Either String [Model.Value])
+requireArray fname m = Eithers.bind (require fname m) expectArray
 
 -- | Look up a required number field in a JSON object
-requireNumber :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Compute.Flow t1 Double)
-requireNumber fname m = (Flows.bind (require fname m) expectNumber)
+requireNumber :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Either String Double)
+requireNumber fname m = Eithers.bind (require fname m) expectNumber
 
 -- | Look up a required string field in a JSON object
-requireString :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Compute.Flow t1 String)
-requireString fname m = (Flows.bind (require fname m) expectString)
+requireString :: Ord t0 => (t0 -> M.Map t0 Model.Value -> Either String String)
+requireString fname m = Eithers.bind (require fname m) expectString
 
 -- | Show a JSON value as a string (placeholder implementation)
-showValue :: (t0 -> String)
+showValue :: t0 -> String
 showValue value = "TODO: implement showValue"
diff --git a/src/gen-main/haskell/Hydra/Extract/Util.hs b/src/gen-main/haskell/Hydra/Extract/Util.hs
--- a/src/gen-main/haskell/Hydra/Extract/Util.hs
+++ b/src/gen-main/haskell/Hydra/Extract/Util.hs
@@ -4,14 +4,15 @@
 
 module Hydra.Extract.Util where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Extract.Core as Core_
 import qualified Hydra.Graph as Graph
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Monads as Monads
+import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -21,5 +22,8 @@
 import qualified Data.Set as S
 
 -- | Extract a comparison from a term
-comparison :: (Core.Term -> Compute.Flow Graph.Graph Util.Comparison)
-comparison term = (Flows.bind (Core_.unitVariant (Core.Name "hydra.util.Comparison") term) (\fname -> Logic.ifElse (Equality.equal (Core.unName fname) "equalTo") (Flows.pure Util.ComparisonEqualTo) (Logic.ifElse (Equality.equal (Core.unName fname) "lessThan") (Flows.pure Util.ComparisonLessThan) (Logic.ifElse (Equality.equal (Core.unName fname) "greaterThan") (Flows.pure Util.ComparisonGreaterThan) (Monads.unexpected "comparison" (Core.unName fname))))))
+comparison :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Util.Comparison
+comparison cx graph term =
+    Eithers.bind (Core_.unitVariant cx (Core.Name "hydra.util.Comparison") graph term) (\fname -> Logic.ifElse (Equality.equal (Core.unName fname) "equalTo") (Right Util.ComparisonEqualTo) (Logic.ifElse (Equality.equal (Core.unName fname) "lessThan") (Right Util.ComparisonLessThan) (Logic.ifElse (Equality.equal (Core.unName fname) "greaterThan") (Right Util.ComparisonGreaterThan) (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "expected comparison but found " (Core.unName fname)))),
+      Context.inContextContext = cx})))))
diff --git a/src/gen-main/haskell/Hydra/Formatting.hs b/src/gen-main/haskell/Hydra/Formatting.hs
--- a/src/gen-main/haskell/Hydra/Formatting.hs
+++ b/src/gen-main/haskell/Hydra/Formatting.hs
@@ -22,145 +22,165 @@
 import qualified Data.Set as S
 
 -- | Capitalize the first letter of a string
-capitalize :: (String -> String)
-capitalize = (mapFirstLetter Strings.toUpper)
+capitalize :: String -> String
+capitalize = mapFirstLetter Strings.toUpper
 
 -- | Convert a string from one case convention to another
-convertCase :: (Util.CaseConvention -> Util.CaseConvention -> String -> String)
-convertCase from to original =  
-  let parts =  
-          let byCaps =  
-                  let splitOnUppercase = (\acc -> \c -> Lists.concat2 (Logic.ifElse (Chars.isUpper c) [
-                          []] []) (Lists.cons (Lists.cons c (Lists.head acc)) (Lists.tail acc)))
-                  in (Lists.map Strings.fromList (Lists.foldl splitOnUppercase [
-                    []] (Lists.reverse (Strings.toList (decapitalize original))))) 
-              byUnderscores = (Strings.splitOn "_" original)
-          in ((\x -> case x of
-            Util.CaseConventionCamel -> byCaps
-            Util.CaseConventionPascal -> byCaps
-            Util.CaseConventionLowerSnake -> byUnderscores
-            Util.CaseConventionUpperSnake -> byUnderscores) from)
-  in ((\x -> case x of
-    Util.CaseConventionCamel -> (decapitalize (Strings.cat (Lists.map (\arg_ -> capitalize (Strings.toLower arg_)) parts)))
-    Util.CaseConventionPascal -> (Strings.cat (Lists.map (\arg_ -> capitalize (Strings.toLower arg_)) parts))
-    Util.CaseConventionLowerSnake -> (Strings.intercalate "_" (Lists.map Strings.toLower parts))
-    Util.CaseConventionUpperSnake -> (Strings.intercalate "_" (Lists.map Strings.toUpper parts))) to)
+convertCase :: Util.CaseConvention -> Util.CaseConvention -> String -> String
+convertCase from to original =
 
+      let parts =
+
+                let byCaps =
+
+                          let splitOnUppercase =
+                                  \acc -> \c -> Lists.concat2 (Logic.ifElse (Chars.isUpper c) [
+                                    []] []) (Lists.cons (Lists.cons c (Lists.head acc)) (Lists.tail acc))
+                          in (Lists.map Strings.fromList (Lists.foldl splitOnUppercase [
+                            []] (Lists.reverse (Strings.toList (decapitalize original)))))
+                    byUnderscores = Strings.splitOn "_" original
+                in case from of
+                  Util.CaseConventionCamel -> byCaps
+                  Util.CaseConventionPascal -> byCaps
+                  Util.CaseConventionLowerSnake -> byUnderscores
+                  Util.CaseConventionUpperSnake -> byUnderscores
+      in case to of
+        Util.CaseConventionCamel -> decapitalize (Strings.cat (Lists.map (\arg_ -> capitalize (Strings.toLower arg_)) parts))
+        Util.CaseConventionPascal -> Strings.cat (Lists.map (\arg_ -> capitalize (Strings.toLower arg_)) parts)
+        Util.CaseConventionLowerSnake -> Strings.intercalate "_" (Lists.map Strings.toLower parts)
+        Util.CaseConventionUpperSnake -> Strings.intercalate "_" (Lists.map Strings.toUpper parts)
+
+-- | Convert a string from camel case (possibly with underscores) to lower snake case. Splits on underscores first, then converts each part from camel case.
+convertCaseCamelOrUnderscoreToLowerSnake :: String -> String
+convertCaseCamelOrUnderscoreToLowerSnake s =
+
+      let parts = Strings.splitOn "_" s
+          snakeParts = Lists.map (\p -> convertCaseCamelToLowerSnake p) parts
+      in (Strings.intercalate "_" snakeParts)
+
 -- | Convert a string from camel case to lower snake case
-convertCaseCamelToLowerSnake :: (String -> String)
-convertCaseCamelToLowerSnake = (convertCase Util.CaseConventionCamel Util.CaseConventionLowerSnake)
+convertCaseCamelToLowerSnake :: String -> String
+convertCaseCamelToLowerSnake = convertCase Util.CaseConventionCamel Util.CaseConventionLowerSnake
 
 -- | Convert a string from camel case to upper snake case
-convertCaseCamelToUpperSnake :: (String -> String)
-convertCaseCamelToUpperSnake = (convertCase Util.CaseConventionCamel Util.CaseConventionUpperSnake)
+convertCaseCamelToUpperSnake :: String -> String
+convertCaseCamelToUpperSnake = convertCase Util.CaseConventionCamel Util.CaseConventionUpperSnake
 
 -- | Convert a string from pascal case to upper snake case
-convertCasePascalToUpperSnake :: (String -> String)
-convertCasePascalToUpperSnake = (convertCase Util.CaseConventionPascal Util.CaseConventionUpperSnake)
+convertCasePascalToUpperSnake :: String -> String
+convertCasePascalToUpperSnake = convertCase Util.CaseConventionPascal Util.CaseConventionUpperSnake
 
 -- | Decapitalize the first letter of a string
-decapitalize :: (String -> String)
-decapitalize = (mapFirstLetter Strings.toLower)
+decapitalize :: String -> String
+decapitalize = mapFirstLetter Strings.toLower
 
 -- | Escape reserved words by appending an underscore
-escapeWithUnderscore :: (S.Set String -> String -> String)
-escapeWithUnderscore reserved s = (Logic.ifElse (Sets.member s reserved) (Strings.cat2 s "_") s)
+escapeWithUnderscore :: S.Set String -> String -> String
+escapeWithUnderscore reserved s = Logic.ifElse (Sets.member s reserved) (Strings.cat2 s "_") s
 
 -- | Indent each line of a string with four spaces
-indentLines :: (String -> String)
-indentLines s =  
-  let indent = (\l -> Strings.cat2 "    " l)
-  in (Strings.unlines (Lists.map indent (Strings.lines s)))
+indentLines :: String -> String
+indentLines s =
 
+      let indent = \l -> Strings.cat2 "    " l
+      in (Strings.unlines (Lists.map indent (Strings.lines s)))
+
 -- | Format a string as a Java-style block comment
-javaStyleComment :: (String -> String)
-javaStyleComment s = (Strings.cat2 (Strings.cat2 (Strings.cat2 "/**\n" " * ") s) "\n */")
+javaStyleComment :: String -> String
+javaStyleComment s = Strings.cat2 (Strings.cat2 (Strings.cat2 "/**\n" " * ") s) "\n */"
 
 -- | A helper which maps the first letter of a string to another string
-mapFirstLetter :: ((String -> String) -> String -> String)
-mapFirstLetter mapping s =  
-  let list = (Strings.toList s)
-  in  
-    let firstLetter = (mapping (Strings.fromList (Lists.pure (Lists.head list))))
-    in (Logic.ifElse (Strings.null s) s (Strings.cat2 firstLetter (Strings.fromList (Lists.tail list))))
+mapFirstLetter :: (String -> String) -> String -> String
+mapFirstLetter mapping s =
+    Logic.ifElse (Strings.null s) s (
+      let list = Strings.toList s
+          firstLetter = mapping (Strings.fromList (Lists.pure (Lists.head list)))
+      in (Strings.cat2 firstLetter (Strings.fromList (Lists.tail list))))
 
 -- | Replace sequences of non-alphanumeric characters with single underscores
-nonAlnumToUnderscores :: (String -> String)
-nonAlnumToUnderscores input =  
-  let isAlnum = (\c -> Logic.or (Logic.and (Equality.gte c 65) (Equality.lte c 90)) (Logic.or (Logic.and (Equality.gte c 97) (Equality.lte c 122)) (Logic.and (Equality.gte c 48) (Equality.lte c 57))))
-  in  
-    let replace = (\p -> \c ->  
-            let s = (Pairs.first p)
-            in  
-              let b = (Pairs.second p)
-              in (Logic.ifElse (isAlnum c) (Lists.cons c s, False) (Logic.ifElse b (s, True) (Lists.cons 95 s, True))))
-    in  
-      let result = (Lists.foldl replace ([], False) (Strings.toList input))
+nonAlnumToUnderscores :: String -> String
+nonAlnumToUnderscores input =
+
+      let isAlnum =
+              \c -> Logic.or (Logic.and (Equality.gte c 65) (Equality.lte c 90)) (Logic.or (Logic.and (Equality.gte c 97) (Equality.lte c 122)) (Logic.and (Equality.gte c 48) (Equality.lte c 57)))
+          replace =
+                  \p -> \c ->
+                    let s = Pairs.first p
+                        b = Pairs.second p
+                    in (Logic.ifElse (isAlnum c) (Lists.cons c s, False) (Logic.ifElse b (s, True) (Lists.cons 95 s, True)))
+          result = Lists.foldl replace ([], False) (Strings.toList input)
       in (Strings.fromList (Lists.reverse (Pairs.first result)))
 
 -- | Sanitize a string by replacing non-alphanumeric characters and escaping reserved words
-sanitizeWithUnderscores :: (S.Set String -> String -> String)
-sanitizeWithUnderscores reserved s = (escapeWithUnderscore reserved (nonAlnumToUnderscores s))
+sanitizeWithUnderscores :: S.Set String -> String -> String
+sanitizeWithUnderscores reserved s = escapeWithUnderscore reserved (nonAlnumToUnderscores s)
 
 -- | Format a list of elements as a bracketed, comma-separated string
-showList :: ((t0 -> String) -> [t0] -> String)
-showList f els = (Strings.cat [
-  "[",
-  (Strings.intercalate ", " (Lists.map f els)),
-  "]"])
+showList :: (t0 -> String) -> [t0] -> String
+showList f els =
+    Strings.cat [
+      "[",
+      (Strings.intercalate ", " (Lists.map f els)),
+      "]"]
 
 -- | Remove leading and trailing whitespace from a string
-stripLeadingAndTrailingWhitespace :: (String -> String)
-stripLeadingAndTrailingWhitespace s = (Strings.fromList (Lists.dropWhile Chars.isSpace (Lists.reverse (Lists.dropWhile Chars.isSpace (Lists.reverse (Strings.toList s))))))
+stripLeadingAndTrailingWhitespace :: String -> String
+stripLeadingAndTrailingWhitespace s =
+    Strings.fromList (Lists.dropWhile Chars.isSpace (Lists.reverse (Lists.dropWhile Chars.isSpace (Lists.reverse (Strings.toList s)))))
 
 -- | Replace special characters with their alphanumeric aliases
-withCharacterAliases :: (String -> String)
-withCharacterAliases original =  
-  let aliases = (Maps.fromList [
-          (32, "sp"),
-          (33, "excl"),
-          (34, "quot"),
-          (35, "num"),
-          (36, "dollar"),
-          (37, "percnt"),
-          (38, "amp"),
-          (39, "apos"),
-          (40, "lpar"),
-          (41, "rpar"),
-          (42, "ast"),
-          (43, "plus"),
-          (44, "comma"),
-          (45, "minus"),
-          (46, "period"),
-          (47, "sol"),
-          (58, "colon"),
-          (59, "semi"),
-          (60, "lt"),
-          (61, "equals"),
-          (62, "gt"),
-          (63, "quest"),
-          (64, "commat"),
-          (91, "lsqb"),
-          (92, "bsol"),
-          (93, "rsqb"),
-          (94, "circ"),
-          (95, "lowbar"),
-          (96, "grave"),
-          (123, "lcub"),
-          (124, "verbar"),
-          (125, "rcub"),
-          (126, "tilde")]) 
-      alias = (\c -> Maybes.fromMaybe (Lists.pure c) (Maybes.map Strings.toList (Maps.lookup c aliases)))
-  in (Strings.fromList (Lists.filter Chars.isAlphaNum (Lists.concat (Lists.map alias (Strings.toList original)))))
+withCharacterAliases :: String -> String
+withCharacterAliases original =
 
+      let aliases =
+              Maps.fromList [
+                (32, "sp"),
+                (33, "excl"),
+                (34, "quot"),
+                (35, "num"),
+                (36, "dollar"),
+                (37, "percnt"),
+                (38, "amp"),
+                (39, "apos"),
+                (40, "lpar"),
+                (41, "rpar"),
+                (42, "ast"),
+                (43, "plus"),
+                (44, "comma"),
+                (45, "minus"),
+                (46, "period"),
+                (47, "sol"),
+                (58, "colon"),
+                (59, "semi"),
+                (60, "lt"),
+                (61, "equals"),
+                (62, "gt"),
+                (63, "quest"),
+                (64, "commat"),
+                (91, "lsqb"),
+                (92, "bsol"),
+                (93, "rsqb"),
+                (94, "circ"),
+                (95, "lowbar"),
+                (96, "grave"),
+                (123, "lcub"),
+                (124, "verbar"),
+                (125, "rcub"),
+                (126, "tilde")]
+          alias = \c -> Maybes.fromMaybe (Lists.pure c) (Maybes.map Strings.toList (Maps.lookup c aliases))
+      in (Strings.fromList (Lists.filter Chars.isAlphaNum (Lists.concat (Lists.map alias (Strings.toList original)))))
+
 -- | A simple soft line wrap which is suitable for code comments
-wrapLine :: (Int -> String -> String)
-wrapLine maxlen input =  
-  let helper = (\prev -> \rem ->  
-          let trunc = (Lists.take maxlen rem) 
-              spanResult = (Lists.span (\c -> Logic.and (Logic.not (Equality.equal c 32)) (Logic.not (Equality.equal c 9))) (Lists.reverse trunc))
-              prefix = (Lists.reverse (Pairs.second spanResult))
-              suffix = (Lists.reverse (Pairs.first spanResult))
-          in (Logic.ifElse (Equality.lte (Lists.length rem) maxlen) (Lists.reverse (Lists.cons rem prev)) (Logic.ifElse (Lists.null prefix) (helper (Lists.cons trunc prev) (Lists.drop maxlen rem)) (helper (Lists.cons (Lists.init prefix) prev) (Lists.concat2 suffix (Lists.drop maxlen rem))))))
-  in (Strings.fromList (Lists.intercalate [
-    10] (helper [] (Strings.toList input))))
+wrapLine :: Int -> String -> String
+wrapLine maxlen input =
+
+      let helper =
+              \prev -> \rem ->
+                let trunc = Lists.take maxlen rem
+                    spanResult =
+                            Lists.span (\c -> Logic.and (Logic.not (Equality.equal c 32)) (Logic.not (Equality.equal c 9))) (Lists.reverse trunc)
+                    prefix = Lists.reverse (Pairs.second spanResult)
+                    suffix = Lists.reverse (Pairs.first spanResult)
+                in (Logic.ifElse (Equality.lte (Lists.length rem) maxlen) (Lists.reverse (Lists.cons rem prev)) (Logic.ifElse (Lists.null prefix) (helper (Lists.cons trunc prev) (Lists.drop maxlen rem)) (helper (Lists.cons (Lists.init prefix) prev) (Lists.concat2 suffix (Lists.drop maxlen rem)))))
+      in (Strings.fromList (Lists.intercalate [
+        10] (helper [] (Strings.toList input))))
diff --git a/src/gen-main/haskell/Hydra/Grammar.hs b/src/gen-main/haskell/Hydra/Grammar.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Grammar.hs
+++ /dev/null
@@ -1,133 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | A common API for BNF-based grammars, specifying context-free languages
-
-module Hydra.Grammar where
-
-import qualified Hydra.Core as Core
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | A constant pattern
-newtype Constant = 
-  Constant {
-    unConstant :: String}
-  deriving (Eq, Ord, Read, Show)
-
-_Constant = (Core.Name "hydra.grammar.Constant")
-
--- | An enhanced Backus-Naur form (BNF) grammar
-newtype Grammar = 
-  Grammar {
-    unGrammar :: [Production]}
-  deriving (Eq, Ord, Read, Show)
-
-_Grammar = (Core.Name "hydra.grammar.Grammar")
-
--- | A name for a pattern
-newtype Label = 
-  Label {
-    unLabel :: String}
-  deriving (Eq, Ord, Read, Show)
-
-_Label = (Core.Name "hydra.grammar.Label")
-
--- | A pattern together with a name (label)
-data LabeledPattern = 
-  LabeledPattern {
-    -- | The label for the pattern
-    labeledPatternLabel :: Label,
-    -- | The pattern being labeled
-    labeledPatternPattern :: Pattern}
-  deriving (Eq, Ord, Read, Show)
-
-_LabeledPattern = (Core.Name "hydra.grammar.LabeledPattern")
-
-_LabeledPattern_label = (Core.Name "label")
-
-_LabeledPattern_pattern = (Core.Name "pattern")
-
--- | A pattern which matches valid expressions in the language
-data Pattern = 
-  -- | A choice between alternative patterns
-  PatternAlternatives [Pattern] |
-  -- | A constant (terminal) pattern
-  PatternConstant Constant |
-  -- | A pattern to be ignored (not captured)
-  PatternIgnored Pattern |
-  -- | A labeled pattern
-  PatternLabeled LabeledPattern |
-  -- | An empty pattern
-  PatternNil  |
-  -- | A nonterminal symbol reference
-  PatternNonterminal Symbol |
-  -- | An optional pattern (zero or one occurrence)
-  PatternOption Pattern |
-  -- | One or more occurrences of a pattern
-  PatternPlus Pattern |
-  -- | A regular expression pattern
-  PatternRegex Regex |
-  -- | A sequence of patterns
-  PatternSequence [Pattern] |
-  -- | Zero or more occurrences of a pattern
-  PatternStar Pattern
-  deriving (Eq, Ord, Read, Show)
-
-_Pattern = (Core.Name "hydra.grammar.Pattern")
-
-_Pattern_alternatives = (Core.Name "alternatives")
-
-_Pattern_constant = (Core.Name "constant")
-
-_Pattern_ignored = (Core.Name "ignored")
-
-_Pattern_labeled = (Core.Name "labeled")
-
-_Pattern_nil = (Core.Name "nil")
-
-_Pattern_nonterminal = (Core.Name "nonterminal")
-
-_Pattern_option = (Core.Name "option")
-
-_Pattern_plus = (Core.Name "plus")
-
-_Pattern_regex = (Core.Name "regex")
-
-_Pattern_sequence = (Core.Name "sequence")
-
-_Pattern_star = (Core.Name "star")
-
--- | A BNF production
-data Production = 
-  Production {
-    -- | The nonterminal symbol being defined
-    productionSymbol :: Symbol,
-    -- | The pattern which defines the symbol
-    productionPattern :: Pattern}
-  deriving (Eq, Ord, Read, Show)
-
-_Production = (Core.Name "hydra.grammar.Production")
-
-_Production_symbol = (Core.Name "symbol")
-
-_Production_pattern = (Core.Name "pattern")
-
--- | A regular expression
-newtype Regex = 
-  Regex {
-    unRegex :: String}
-  deriving (Eq, Ord, Read, Show)
-
-_Regex = (Core.Name "hydra.grammar.Regex")
-
--- | A nonterminal symbol
-newtype Symbol = 
-  Symbol {
-    unSymbol :: String}
-  deriving (Eq, Ord, Read, Show)
-
-_Symbol = (Core.Name "hydra.grammar.Symbol")
diff --git a/src/gen-main/haskell/Hydra/Grammars.hs b/src/gen-main/haskell/Hydra/Grammars.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Grammars.hs
+++ /dev/null
@@ -1,181 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | A utility for converting a BNF grammar to a Hydra module.
-
-module Hydra.Grammars where
-
-import qualified Hydra.Annotations as Annotations
-import qualified Hydra.Constants as Constants
-import qualified Hydra.Core as Core
-import qualified Hydra.Formatting as Formatting
-import qualified Hydra.Grammar as Grammar
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Math as Math
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Module as Module
-import qualified Hydra.Names as Names
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Generate child name
-childName :: (String -> String -> String)
-childName lname n = (Strings.cat [
-  lname,
-  "_",
-  (Formatting.capitalize n)])
-
--- | Find unique names for patterns
-findNames :: ([Grammar.Pattern] -> [String])
-findNames pats =  
-  let nextName = (\acc -> \pat ->  
-          let names = (Pairs.first acc)
-          in  
-            let nameMap = (Pairs.second acc)
-            in  
-              let rn = (rawName pat)
-              in  
-                let nameAndIndex = (Maybes.maybe (rn, 1) (\i -> (Strings.cat2 rn (Literals.showInt32 (Math.add i 1)), (Math.add i 1))) (Maps.lookup rn nameMap))
-                in  
-                  let nn = (Pairs.first nameAndIndex)
-                  in  
-                    let ni = (Pairs.second nameAndIndex)
-                    in (Lists.cons nn names, (Maps.insert rn ni nameMap)))
-  in (Lists.reverse (Pairs.first (Lists.foldl nextName ([], Maps.empty) pats)))
-
--- | Convert a BNF grammar to a Hydra module
-grammarToModule :: (Module.Namespace -> Grammar.Grammar -> Maybe String -> Module.Module)
-grammarToModule ns grammar desc =  
-  let prodPairs = (Lists.map (\prod -> (Grammar.unSymbol (Grammar.productionSymbol prod), (Grammar.productionPattern prod))) (Grammar.unGrammar grammar))
-  in  
-    let capitalizedNames = (Lists.map (\pair -> Formatting.capitalize (Pairs.first pair)) prodPairs)
-    in  
-      let patterns = (Lists.map (\pair -> Pairs.second pair) prodPairs)
-      in  
-        let elementPairs = (Lists.concat (Lists.zipWith (makeElements False ns) capitalizedNames patterns))
-        in  
-          let elements = (Lists.map (\pair ->  
-                  let lname = (Pairs.first pair)
-                  in  
-                    let typ = (wrapType (Pairs.second pair))
-                    in (Annotations.typeElement (toName ns lname) typ)) elementPairs)
-          in Module.Module {
-            Module.moduleNamespace = ns,
-            Module.moduleElements = elements,
-            Module.moduleTermDependencies = [],
-            Module.moduleTypeDependencies = [],
-            Module.moduleDescription = desc}
-
--- | Check if pattern is complex
-isComplex :: (Grammar.Pattern -> Bool)
-isComplex pat = ((\x -> case x of
-  Grammar.PatternLabeled v1 -> (isComplex (Grammar.labeledPatternPattern v1))
-  Grammar.PatternSequence v1 -> (isNontrivial True v1)
-  Grammar.PatternAlternatives v1 -> (isNontrivial False v1)
-  _ -> False) pat)
-
--- | Check if patterns are nontrivial
-isNontrivial :: (Bool -> [Grammar.Pattern] -> Bool)
-isNontrivial isRecord pats =  
-  let minPats = (simplify isRecord pats)
-  in  
-    let isLabeled = (\p -> (\x -> case x of
-            Grammar.PatternLabeled _ -> True
-            _ -> False) p)
-    in (Logic.ifElse (Equality.equal (Lists.length minPats) 1) (isLabeled (Lists.head minPats)) True)
-
--- | Create elements from pattern
-makeElements :: (Bool -> Module.Namespace -> String -> Grammar.Pattern -> [(String, Core.Type)])
-makeElements omitTrivial ns lname pat =  
-  let trivial = (Logic.ifElse omitTrivial [] [
-          (lname, Core.TypeUnit)])
-  in  
-    let descend = (\n -> \f -> \p ->  
-            let cpairs = (makeElements False ns (childName lname n) p)
-            in (f (Logic.ifElse (isComplex p) (Lists.cons (lname, (Core.TypeVariable (toName ns (Pairs.first (Lists.head cpairs))))) cpairs) (Logic.ifElse (Lists.null cpairs) [
-              (lname, Core.TypeUnit)] (Lists.cons (lname, (Pairs.second (Lists.head cpairs))) (Lists.tail cpairs))))))
-    in  
-      let mod = (\n -> \f -> \p -> descend n (\pairs -> Lists.cons (lname, (f (Pairs.second (Lists.head pairs)))) (Lists.tail pairs)) p)
-      in  
-        let forPat = (\pat -> (\x -> case x of
-                Grammar.PatternAlternatives v1 -> (forRecordOrUnion False (\fields -> Core.TypeUnion (Core.RowType {
-                  Core.rowTypeTypeName = Constants.placeholderName,
-                  Core.rowTypeFields = fields})) v1)
-                Grammar.PatternConstant _ -> trivial
-                Grammar.PatternIgnored _ -> []
-                Grammar.PatternLabeled v1 -> (forPat (Grammar.labeledPatternPattern v1))
-                Grammar.PatternNil -> trivial
-                Grammar.PatternNonterminal v1 -> [
-                  (lname, (Core.TypeVariable (toName ns (Grammar.unSymbol v1))))]
-                Grammar.PatternOption v1 -> (mod "Option" (\x -> Core.TypeMaybe x) v1)
-                Grammar.PatternPlus v1 -> (mod "Elmt" (\x -> Core.TypeList x) v1)
-                Grammar.PatternRegex _ -> [
-                  (lname, (Core.TypeLiteral Core.LiteralTypeString))]
-                Grammar.PatternSequence v1 -> (forRecordOrUnion True (\fields -> Core.TypeRecord (Core.RowType {
-                  Core.rowTypeTypeName = Constants.placeholderName,
-                  Core.rowTypeFields = fields})) v1)
-                Grammar.PatternStar v1 -> (mod "Elmt" (\x -> Core.TypeList x) v1)) pat) 
-            forRecordOrUnion = (\isRecord -> \construct -> \pats ->  
-                    let minPats = (simplify isRecord pats)
-                    in  
-                      let fieldNames = (findNames minPats)
-                      in  
-                        let toField = (\n -> \p -> descend n (\pairs -> (Core.FieldType {
-                                Core.fieldTypeName = (Core.Name n),
-                                Core.fieldTypeType = (Pairs.second (Lists.head pairs))}, (Lists.tail pairs))) p)
-                        in  
-                          let fieldPairs = (Lists.zipWith toField fieldNames minPats)
-                          in  
-                            let fields = (Lists.map Pairs.first fieldPairs)
-                            in  
-                              let els = (Lists.concat (Lists.map Pairs.second fieldPairs))
-                              in (Logic.ifElse (isNontrivial isRecord pats) (Lists.cons (lname, (construct fields)) els) (forPat (Lists.head minPats))))
-        in (forPat pat)
-
--- | Get raw name from pattern
-rawName :: (Grammar.Pattern -> String)
-rawName pat = ((\x -> case x of
-  Grammar.PatternAlternatives _ -> "alts"
-  Grammar.PatternConstant v1 -> (Formatting.capitalize (Formatting.withCharacterAliases (Grammar.unConstant v1)))
-  Grammar.PatternIgnored _ -> "ignored"
-  Grammar.PatternLabeled v1 -> (Grammar.unLabel (Grammar.labeledPatternLabel v1))
-  Grammar.PatternNil -> "none"
-  Grammar.PatternNonterminal v1 -> (Formatting.capitalize (Grammar.unSymbol v1))
-  Grammar.PatternOption v1 -> (Formatting.capitalize (rawName v1))
-  Grammar.PatternPlus v1 -> (Strings.cat2 "listOf" (Formatting.capitalize (rawName v1)))
-  Grammar.PatternRegex _ -> "regex"
-  Grammar.PatternSequence _ -> "sequence"
-  Grammar.PatternStar v1 -> (Strings.cat2 "listOf" (Formatting.capitalize (rawName v1)))) pat)
-
--- | Remove trivial patterns from records
-simplify :: (Bool -> [Grammar.Pattern] -> [Grammar.Pattern])
-simplify isRecord pats =  
-  let isConstant = (\p -> (\x -> case x of
-          Grammar.PatternConstant _ -> True
-          _ -> False) p)
-  in (Logic.ifElse isRecord (Lists.filter (\p -> Logic.not (isConstant p)) pats) pats)
-
--- | Convert local name to qualified name
-toName :: (Module.Namespace -> String -> Core.Name)
-toName ns local = (Names.unqualifyName (Module.QualifiedName {
-  Module.qualifiedNameNamespace = (Just ns),
-  Module.qualifiedNameLocal = local}))
-
--- | Wrap a type in a placeholder name, unless it is already a wrapper, record, or union type
-wrapType :: (Core.Type -> Core.Type)
-wrapType t = ((\x -> case x of
-  Core.TypeRecord _ -> t
-  Core.TypeUnion _ -> t
-  Core.TypeWrap _ -> t
-  _ -> (Core.TypeWrap (Core.WrappedType {
-    Core.wrappedTypeTypeName = (Core.Name "Placeholder"),
-    Core.wrappedTypeBody = t}))) t)
diff --git a/src/gen-main/haskell/Hydra/Graph.hs b/src/gen-main/haskell/Hydra/Graph.hs
--- a/src/gen-main/haskell/Hydra/Graph.hs
+++ b/src/gen-main/haskell/Hydra/Graph.hs
@@ -4,8 +4,9 @@
 
 module Hydra.Graph where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -13,64 +14,76 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | A graph, or set of name/term bindings together with parameters (annotations, primitives) and a schema graph
-data Graph = 
+-- | A graph, or lexical environment which binds names to terms, types, primitives, and metadata
+data Graph =
   Graph {
-    -- | All of the elements in the graph
-    graphElements :: [Core.Binding],
-    -- | The lambda environment of this graph context; it indicates whether a variable is bound by a lambda (Nothing) or a let (Just term)
-    graphEnvironment :: (M.Map Core.Name (Maybe Core.Term)),
-    -- | The typing environment of the graph
-    graphTypes :: (M.Map Core.Name Core.TypeScheme),
-    -- | The body of the term which generated this context
-    graphBody :: Core.Term,
-    -- | All supported primitive constants and functions, by name
+    -- | The terms bound by all term variables in scope
+    graphBoundTerms :: (M.Map Core.Name Core.Term),
+    -- | The type schemes of all term variables in scope
+    graphBoundTypes :: (M.Map Core.Name Core.TypeScheme),
+    -- | A mutable map from type variable names to their accumulated class constraints. This is populated during type inference when operations requiring Eq or Ord are encountered.
+    graphClassConstraints :: (M.Map Core.Name Core.TypeVariableMetadata),
+    -- | The set of term variables introduced by specifically by lambdas
+    graphLambdaVariables :: (S.Set Core.Name),
+    -- | Any additional metadata bound to term variables in scope
+    graphMetadata :: (M.Map Core.Name Core.Term),
+    -- | All primitive functions and constants by name
     graphPrimitives :: (M.Map Core.Name Primitive),
-    -- | The schema of this graph. If this parameter is omitted (nothing), the graph is its own schema graph.
-    graphSchema :: (Maybe Graph)}
+    -- | All schema types (type schemes) in scope
+    graphSchemaTypes :: (M.Map Core.Name Core.TypeScheme),
+    -- | The set of type variables introduced specifically by type lambdas
+    graphTypeVariables :: (S.Set Core.Name)}
 
-_Graph = (Core.Name "hydra.graph.Graph")
+_Graph = Core.Name "hydra.graph.Graph"
 
-_Graph_elements = (Core.Name "elements")
+_Graph_boundTerms = Core.Name "boundTerms"
 
-_Graph_environment = (Core.Name "environment")
+_Graph_boundTypes = Core.Name "boundTypes"
 
-_Graph_types = (Core.Name "types")
+_Graph_classConstraints = Core.Name "classConstraints"
 
-_Graph_body = (Core.Name "body")
+_Graph_lambdaVariables = Core.Name "lambdaVariables"
 
-_Graph_primitives = (Core.Name "primitives")
+_Graph_metadata = Core.Name "metadata"
 
-_Graph_schema = (Core.Name "schema")
+_Graph_primitives = Core.Name "primitives"
 
--- | A built-in function
-data Primitive = 
+_Graph_schemaTypes = Core.Name "schemaTypes"
+
+_Graph_typeVariables = Core.Name "typeVariables"
+
+-- | A built-in function or constant
+data Primitive =
   Primitive {
     -- | The unique name of the primitive function
     primitiveName :: Core.Name,
     -- | The type signature of the primitive function
     primitiveType :: Core.TypeScheme,
-    -- | A concrete implementation of the primitive function
-    primitiveImplementation :: ([Core.Term] -> Compute.Flow Graph Core.Term)}
+    -- | A concrete implementation of the primitive function. The Context and Graph parameters are needed by higher-order primitives (e.g. lists.map, lists.foldl, eithers.bind) which must evaluate function arguments via term reduction; the Graph provides variable and primitive bindings, while the Context supports tracing and error reporting.
+    primitiveImplementation :: (Context.Context -> Graph -> [Core.Term] -> Either (Context.InContext Errors.Error) Core.Term)}
 
-_Primitive = (Core.Name "hydra.graph.Primitive")
+_Primitive = Core.Name "hydra.graph.Primitive"
 
-_Primitive_name = (Core.Name "name")
+_Primitive_name = Core.Name "name"
 
-_Primitive_type = (Core.Name "type")
+_Primitive_type = Core.Name "type"
 
-_Primitive_implementation = (Core.Name "implementation")
+_Primitive_implementation = Core.Name "implementation"
 
--- | A type together with a coder for mapping terms into arguments for primitive functions, and mapping computed results into terms
-data TermCoder a = 
+-- | A type together with a coder for mapping terms into arguments for primitive functions, and mapping computed results into terms.
+data TermCoder a =
   TermCoder {
     -- | The Hydra type of encoded terms
     termCoderType :: Core.Type,
-    -- | A coder between Hydra terms and instances of the given type
-    termCoderCoder :: (Compute.Coder Graph Graph Core.Term a)}
+    -- | An encode function from terms to native values
+    termCoderEncode :: (Context.Context -> Graph -> Core.Term -> Either (Context.InContext Errors.Error) a),
+    -- | A decode function from native values to terms
+    termCoderDecode :: (Context.Context -> a -> Either (Context.InContext Errors.Error) Core.Term)}
 
-_TermCoder = (Core.Name "hydra.graph.TermCoder")
+_TermCoder = Core.Name "hydra.graph.TermCoder"
 
-_TermCoder_type = (Core.Name "type")
+_TermCoder_type = Core.Name "type"
 
-_TermCoder_coder = (Core.Name "coder")
+_TermCoder_encode = Core.Name "encode"
+
+_TermCoder_decode = Core.Name "decode"
diff --git a/src/gen-main/haskell/Hydra/Hoisting.hs b/src/gen-main/haskell/Hydra/Hoisting.hs
--- a/src/gen-main/haskell/Hydra/Hoisting.hs
+++ b/src/gen-main/haskell/Hydra/Hoisting.hs
@@ -4,13 +4,10 @@
 
 module Hydra.Hoisting where
 
-import qualified Hydra.Accessors as Accessors
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Core as Core
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Literals as Literals
 import qualified Hydra.Lib.Logic as Logic
@@ -20,6 +17,7 @@
 import qualified Hydra.Lib.Pairs as Pairs
 import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Paths as Paths
 import qualified Hydra.Rewriting as Rewriting
 import qualified Hydra.Schemas as Schemas
 import qualified Hydra.Sorting as Sorting
@@ -33,607 +31,452 @@
 import qualified Data.Set as S
 
 -- | Augment bindings with new free variables introduced by substitution, wrapping with lambdas after any type lambdas.
-augmentBindingsWithNewFreeVars :: (Typing.TypeContext -> S.Set Core.Name -> [Core.Binding] -> ([Core.Binding], Typing.TermSubst))
-augmentBindingsWithNewFreeVars cx boundVars bindings =  
-  let types = (Typing.typeContextTypes cx)
-  in  
-    let wrapAfterTypeLambdas = (\vars -> \term -> (\x -> case x of
-            Core.TermTypeLambda v1 -> (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-              Core.typeLambdaBody = (wrapAfterTypeLambdas vars (Core.typeLambdaBody v1))}))
-            _ -> (Lists.foldl (\t -> \p -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Pairs.first p),
-              Core.lambdaDomain = (Pairs.second p),
-              Core.lambdaBody = t}))) term (Lists.reverse vars))) term)
-    in  
-      let augment = (\b ->  
-              let freeVars = (Sets.toList (Sets.intersection boundVars (Rewriting.freeVariablesInTerm (Core.bindingTerm b))))
-              in  
-                let varTypePairs = (Lists.map (\v -> (v, (Maps.lookup v types))) freeVars)
-                in  
-                  let varTypes = (Maybes.cat (Lists.map Pairs.second varTypePairs))
-                  in (Logic.ifElse (Logic.or (Lists.null freeVars) (Logic.not (Equality.equal (Lists.length varTypes) (Lists.length varTypePairs)))) (b, Nothing) (Core.Binding {
-                    Core.bindingName = (Core.bindingName b),
-                    Core.bindingTerm = (wrapAfterTypeLambdas varTypePairs (Core.bindingTerm b)),
-                    Core.bindingType = (Maybes.map (\ts -> Core.TypeScheme {
-                      Core.typeSchemeVariables = (Core.typeSchemeVariables ts),
-                      Core.typeSchemeType = (Lists.foldl (\acc -> \t -> Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = t,
-                        Core.functionTypeCodomain = acc})) (Core.typeSchemeType ts) (Lists.reverse varTypes)),
-                      Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}) (Core.bindingType b))}, (Just (Core.bindingName b, (Lists.foldl (\t -> \v -> Core.TermApplication (Core.Application {
-                    Core.applicationFunction = t,
-                    Core.applicationArgument = (Core.TermVariable v)})) (Core.TermVariable (Core.bindingName b)) freeVars))))))
-      in  
-        let results = (Lists.map augment bindings)
-        in (Lists.map Pairs.first results, (Typing.TermSubst (Maps.fromList (Maybes.cat (Lists.map Pairs.second results)))))
+augmentBindingsWithNewFreeVars :: Graph.Graph -> S.Set Core.Name -> [Core.Binding] -> ([Core.Binding], Typing.TermSubst)
+augmentBindingsWithNewFreeVars cx boundVars bindings =
 
+      let types = Maps.map Rewriting.typeSchemeToFType (Graph.graphBoundTypes cx)
+          wrapAfterTypeLambdas =
+                  \vars -> \term -> case term of
+                    Core.TermTypeLambda v0 -> Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.typeLambdaParameter v0),
+                      Core.typeLambdaBody = (wrapAfterTypeLambdas vars (Core.typeLambdaBody v0))})
+                    _ -> Lists.foldl (\t -> \p -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Pairs.first p),
+                      Core.lambdaDomain = (Pairs.second p),
+                      Core.lambdaBody = t}))) term (Lists.reverse vars)
+          augment =
+                  \b ->
+                    let freeVars = Sets.toList (Sets.intersection boundVars (Rewriting.freeVariablesInTerm (Core.bindingTerm b)))
+                        varTypePairs = Lists.map (\v -> (v, (Maps.lookup v types))) freeVars
+                        varTypes = Maybes.cat (Lists.map Pairs.second varTypePairs)
+                    in (Logic.ifElse (Logic.or (Lists.null freeVars) (Logic.not (Equality.equal (Lists.length varTypes) (Lists.length varTypePairs)))) (b, Nothing) (Core.Binding {
+                      Core.bindingName = (Core.bindingName b),
+                      Core.bindingTerm = (wrapAfterTypeLambdas varTypePairs (Core.bindingTerm b)),
+                      Core.bindingType = (Maybes.map (\ts -> Core.TypeScheme {
+                        Core.typeSchemeVariables = (Core.typeSchemeVariables ts),
+                        Core.typeSchemeType = (Lists.foldl (\acc -> \t -> Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = t,
+                          Core.functionTypeCodomain = acc})) (Core.typeSchemeType ts) (Lists.reverse varTypes)),
+                        Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}) (Core.bindingType b))}, (Just (Core.bindingName b, (Lists.foldl (\t -> \v -> Core.TermApplication (Core.Application {
+                      Core.applicationFunction = t,
+                      Core.applicationArgument = (Core.TermVariable v)})) (Core.TermVariable (Core.bindingName b)) freeVars)))))
+          results = Lists.map augment bindings
+      in (Lists.map Pairs.first results, (Typing.TermSubst (Maps.fromList (Maybes.cat (Lists.map Pairs.second results)))))
+
 -- | Check if a binding has a polymorphic type (non-empty list of type scheme variables)
-bindingIsPolymorphic :: (Core.Binding -> Bool)
-bindingIsPolymorphic binding = (Maybes.maybe False (\ts -> Logic.not (Lists.null (Core.typeSchemeVariables ts))) (Core.bindingType binding))
+bindingIsPolymorphic :: Core.Binding -> Bool
+bindingIsPolymorphic binding =
+    Maybes.maybe False (\ts -> Logic.not (Lists.null (Core.typeSchemeVariables ts))) (Core.bindingType binding)
 
--- | Check if a binding's type uses any type variables from the given TypeContext. Returns True if the free type variables in the binding's type intersect with the type variables in scope (typeContextTypeVariables).
-bindingUsesContextTypeVars :: (Typing.TypeContext -> Core.Binding -> Bool)
-bindingUsesContextTypeVars cx binding = (Maybes.maybe False (\ts ->  
-  let freeInType = (Rewriting.freeVariablesInType (Core.typeSchemeType ts))
-  in  
-    let contextTypeVars = (Typing.typeContextTypeVariables cx)
-    in (Logic.not (Sets.null (Sets.intersection freeInType contextTypeVars)))) (Core.bindingType binding))
+-- | Check if a binding's type uses any type variables from the given Graph. Returns True if the free type variables in the binding's type intersect with the type variables in scope (graphTypeVariables).
+bindingUsesContextTypeVars :: Graph.Graph -> Core.Binding -> Bool
+bindingUsesContextTypeVars cx binding =
+    Maybes.maybe False (\ts ->
+      let freeInType = Rewriting.freeVariablesInType (Core.typeSchemeType ts)
+          contextTypeVars = Graph.graphTypeVariables cx
+      in (Logic.not (Sets.null (Sets.intersection freeInType contextTypeVars)))) (Core.bindingType binding)
 
 -- | Count the number of occurrences of a variable name in a term. Assumes no variable shadowing.
-countVarOccurrences :: (Core.Name -> Core.Term -> Int)
-countVarOccurrences name term =  
-  let childCount = (Lists.foldl (\acc -> \t -> Math.add acc (countVarOccurrences name t)) 0 (Rewriting.subterms term))
-  in ((\x -> case x of
-    Core.TermVariable v1 -> (Logic.ifElse (Equality.equal v1 name) (Math.add 1 childCount) childCount)
-    _ -> childCount) term)
+countVarOccurrences :: Core.Name -> Core.Term -> Int
+countVarOccurrences name term =
 
+      let childCount = Lists.foldl (\acc -> \t -> Math.add acc (countVarOccurrences name t)) 0 (Rewriting.subterms term)
+      in case term of
+        Core.TermVariable v0 -> Logic.ifElse (Equality.equal v0 name) (Math.add 1 childCount) childCount
+        _ -> childCount
+
 -- | Transform a let-term by pulling ALL let bindings to the top level. This is useful for targets like Java that don't support nested let expressions at all. If a hoisted binding captures lambda-bound variables from an enclosing scope, the binding is wrapped in lambdas for those variables, and references are replaced with applications. Note: Assumes no variable shadowing; use hydra.rewriting.unshadowVariables first.
-hoistAllLetBindings :: (Core.Let -> Core.Let)
-hoistAllLetBindings let0 =  
-  let emptyIx = Typing.InferenceContext {
-          Typing.inferenceContextSchemaTypes = Maps.empty,
-          Typing.inferenceContextPrimitiveTypes = Maps.empty,
-          Typing.inferenceContextDataTypes = Maps.empty,
-          Typing.inferenceContextClassConstraints = Maps.empty,
-          Typing.inferenceContextDebug = False}
-  in  
-    let emptyCx = Typing.TypeContext {
-            Typing.typeContextTypes = Maps.empty,
-            Typing.typeContextMetadata = Maps.empty,
-            Typing.typeContextTypeVariables = Sets.empty,
-            Typing.typeContextLambdaVariables = Sets.empty,
-            Typing.typeContextLetVariables = Sets.empty,
-            Typing.typeContextInferenceContext = emptyIx}
-    in (hoistLetBindingsWithPredicate (\_ -> True) shouldHoistAll emptyCx let0)
+hoistAllLetBindings :: Core.Let -> Core.Let
+hoistAllLetBindings let0 =
 
+      let emptyCx =
+              Graph.Graph {
+                Graph.graphBoundTerms = Maps.empty,
+                Graph.graphBoundTypes = Maps.empty,
+                Graph.graphClassConstraints = Maps.empty,
+                Graph.graphLambdaVariables = Sets.empty,
+                Graph.graphMetadata = Maps.empty,
+                Graph.graphPrimitives = Maps.empty,
+                Graph.graphSchemaTypes = Maps.empty,
+                Graph.graphTypeVariables = Sets.empty}
+      in (hoistLetBindingsWithPredicate (\_ -> True) shouldHoistAll emptyCx let0)
+
 -- | Hoist case statements into local let bindings. This is useful for targets such as Python which only support case statements (match) at the top level. Case statements are hoisted only when they appear at non-top-level positions. Top level = root, or reachable through annotations, let body/binding, lambda bodies, or ONE application LHS. Once through an application LHS, lambda bodies no longer count as pass-through.
-hoistCaseStatements :: (Typing.TypeContext -> Core.Term -> Core.Term)
-hoistCaseStatements = (hoistSubterms shouldHoistCaseStatement)
+hoistCaseStatements :: Graph.Graph -> Core.Term -> Core.Term
+hoistCaseStatements = hoistSubterms shouldHoistCaseStatement
 
--- | Hoist case statements into local let bindings for all elements in a graph. This version operates prior to inference and uses an empty type context. It hoists case statements and their applied arguments into let bindings.
-hoistCaseStatementsInGraph :: (Graph.Graph -> Compute.Flow t0 Graph.Graph)
-hoistCaseStatementsInGraph graph =  
-  let emptyIx = Typing.InferenceContext {
-          Typing.inferenceContextSchemaTypes = Maps.empty,
-          Typing.inferenceContextPrimitiveTypes = Maps.empty,
-          Typing.inferenceContextDataTypes = Maps.empty,
-          Typing.inferenceContextClassConstraints = Maps.empty,
-          Typing.inferenceContextDebug = False}
-  in  
-    let emptyTx = Typing.TypeContext {
-            Typing.typeContextTypes = Maps.empty,
-            Typing.typeContextMetadata = Maps.empty,
-            Typing.typeContextTypeVariables = Sets.empty,
-            Typing.typeContextLambdaVariables = Sets.empty,
-            Typing.typeContextLetVariables = Sets.empty,
-            Typing.typeContextInferenceContext = emptyIx}
-    in  
-      let gterm0 = (Schemas.graphAsTerm graph)
-      in  
-        let gterm1 = (hoistCaseStatements emptyTx gterm0)
-        in  
-          let newElements = (Schemas.termAsGraph gterm1)
-          in (Flows.pure (Graph.Graph {
-            Graph.graphElements = newElements,
-            Graph.graphEnvironment = (Graph.graphEnvironment graph),
-            Graph.graphTypes = (Graph.graphTypes graph),
-            Graph.graphBody = (Graph.graphBody graph),
-            Graph.graphPrimitives = (Graph.graphPrimitives graph),
-            Graph.graphSchema = (Graph.graphSchema graph)}))
+-- | Hoist case statements into local let bindings for a list of bindings. This version operates prior to inference and uses an empty type context. It hoists case statements and their applied arguments into let bindings.
+hoistCaseStatementsInGraph :: [Core.Binding] -> [Core.Binding]
+hoistCaseStatementsInGraph bindings =
 
--- | Transform a let-term by pulling polymorphic let bindings to the top level, using TypeContext. A binding is hoisted if: (1) It is polymorphic (has non-empty typeSchemeVariables), OR (2) Its type uses type variables from the TypeContext (i.e., from enclosing type lambdas). Bindings which are already at the top level are not hoisted. If a hoisted binding captures lambda-bound or let-bound variables from an enclosing scope, the binding is wrapped in lambdas for those variables, and references are replaced with applications. If a hoisted binding uses type variables from the context, those type variables are added to the binding's type scheme. Note: we assume that there is no variable shadowing; use hydra.rewriting.unshadowVariables first.
-hoistLetBindingsWithContext :: ((Core.Binding -> Bool) -> Typing.TypeContext -> Core.Let -> Core.Let)
-hoistLetBindingsWithContext isParentBinding cx let0 = (hoistLetBindingsWithPredicate isParentBinding shouldHoistPolymorphic cx let0)
+      let emptyTx =
+              Graph.Graph {
+                Graph.graphBoundTerms = Maps.empty,
+                Graph.graphBoundTypes = Maps.empty,
+                Graph.graphClassConstraints = Maps.empty,
+                Graph.graphLambdaVariables = Sets.empty,
+                Graph.graphMetadata = Maps.empty,
+                Graph.graphPrimitives = Maps.empty,
+                Graph.graphSchemaTypes = Maps.empty,
+                Graph.graphTypeVariables = Sets.empty}
+          term0 =
+                  Core.TermLet (Core.Let {
+                    Core.letBindings = bindings,
+                    Core.letBody = Core.TermUnit})
+          term1 = hoistCaseStatements emptyTx term0
+      in (Schemas.termAsBindings term1)
 
--- | Transform a let-term by pulling let bindings to the top level. The isParentBinding predicate applies to top-level bindings and determines whether their subterm bindings are eligible for hoisting. The shouldHoistBinding predicate takes the TypeContext and a subterm binding, and returns True if the binding should be hoisted. This is useful for targets like Java that cannot have polymorphic definitions in arbitrary positions. The TypeContext provides information about type variables and lambda variables in scope. If a hoisted binding captures let-bound or lambda-bound variables from an enclosing scope, the binding is wrapped in lambdas for those variables, and references are replaced with applications. If a hoisted binding captures type variables from an enclosing type lambda scope, those type variables are added to the binding's type scheme, and references are replaced with type applications. Note: we assume that there is no variable shadowing; use hydra.rewriting.unshadowVariables first.
-hoistLetBindingsWithPredicate :: ((Core.Binding -> Bool) -> (Typing.TypeContext -> Core.Binding -> Bool) -> Typing.TypeContext -> Core.Let -> Core.Let)
-hoistLetBindingsWithPredicate isParentBinding shouldHoistBinding cx0 let0 =  
-  let hoistOne = (\prefix -> \cx -> \pair -> \bindingWithCapturedVars ->  
-          let bindingAndReplacementPairs = (Pairs.first pair)
-          in  
-            let alreadyUsedNames = (Pairs.second pair)
-            in  
-              let b = (Pairs.first bindingWithCapturedVars)
-              in  
-                let capturedTermVars = (Pairs.second bindingWithCapturedVars)
-                in  
-                  let types = (Typing.typeContextTypes cx)
-                  in  
-                    let capturedTermVarTypePairs = (Lists.map (\v -> (v, (Maps.lookup v types))) capturedTermVars)
-                    in  
-                      let capturedTermVarTypes = (Lists.map (\typ -> Rewriting.deannotateTypeParameters typ) (Maybes.cat (Lists.map Pairs.second capturedTermVarTypePairs)))
-                      in  
-                        let freeInBindingType = (Maybes.maybe Sets.empty (\ts -> Rewriting.freeVariablesInType (Core.typeSchemeType ts)) (Core.bindingType b))
-                        in  
-                          let freeInCapturedVarTypes = (Sets.unions (Lists.map (\t -> Rewriting.freeVariablesInType t) capturedTermVarTypes))
-                          in  
-                            let capturedTypeVars = (Sets.toList (Sets.intersection (Typing.typeContextTypeVariables cx) (Sets.union freeInBindingType freeInCapturedVarTypes)))
-                            in  
-                              let globalBindingName = (Lexical.chooseUniqueName alreadyUsedNames (Core.Name (Strings.cat2 prefix (Core.unName (Core.bindingName b)))))
-                              in  
-                                let newUsedNames = (Sets.insert globalBindingName alreadyUsedNames)
-                                in  
-                                  let newTypeScheme = (Logic.ifElse (Equality.equal (Lists.length capturedTermVarTypes) (Lists.length capturedTermVarTypePairs)) (Maybes.map (\ts -> Core.TypeScheme {
-                                          Core.typeSchemeVariables = (Lists.nub (Lists.concat2 capturedTypeVars (Core.typeSchemeVariables ts))),
-                                          Core.typeSchemeType = (Lists.foldl (\t -> \a -> Core.TypeFunction (Core.FunctionType {
-                                            Core.functionTypeDomain = a,
-                                            Core.functionTypeCodomain = t})) (Core.typeSchemeType ts) (Lists.reverse capturedTermVarTypes)),
-                                          Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}) (Core.bindingType b)) Nothing)
-                                  in  
-                                    let strippedTerm = (Rewriting.stripTypeLambdas (Core.bindingTerm b))
-                                    in  
-                                      let termWithLambdas = (Lists.foldl (\t -> \p -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Pairs.first p),
-                                              Core.lambdaDomain = (Maybes.map (\dom -> Rewriting.deannotateTypeParameters dom) (Pairs.second p)),
-                                              Core.lambdaBody = t}))) strippedTerm (Lists.reverse capturedTermVarTypePairs))
-                                      in  
-                                        let termWithTypeLambdas = (Lists.foldl (\t -> \v -> Core.TermTypeLambda (Core.TypeLambda {
-                                                Core.typeLambdaParameter = v,
-                                                Core.typeLambdaBody = t})) termWithLambdas (Lists.reverse (Maybes.maybe [] Core.typeSchemeVariables newTypeScheme)))
-                                        in  
-                                          let withTypeApps = (Lists.foldl (\t -> \v -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                                  Core.typeApplicationTermBody = t,
-                                                  Core.typeApplicationTermType = (Core.TypeVariable v)})) (Core.TermVariable globalBindingName) capturedTypeVars)
-                                          in  
-                                            let replacement = (Lists.foldl (\t -> \v -> Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = t,
-                                                    Core.applicationArgument = (Core.TermVariable v)})) withTypeApps capturedTermVars)
-                                            in  
-                                              let newBindingAndReplacement = (Core.Binding {
-                                                      Core.bindingName = globalBindingName,
-                                                      Core.bindingTerm = termWithTypeLambdas,
-                                                      Core.bindingType = newTypeScheme}, replacement)
-                                              in  
-                                                let newPairs = (Lists.cons newBindingAndReplacement bindingAndReplacementPairs)
-                                                in (newPairs, newUsedNames))
-  in  
-    let rewrite = (\prefix -> \recurse -> \cx -> \bindingsAndNames -> \term ->  
-            let previouslyFinishedBindings = (Pairs.first bindingsAndNames)
-            in  
-              let emptyBindingsAndNames = ([], (Pairs.second bindingsAndNames))
-              in  
-                let result = (recurse emptyBindingsAndNames term)
-                in  
-                  let newBindingsAndNames = (Pairs.first result)
-                  in  
-                    let bindingsSoFar = (Pairs.first newBindingsAndNames)
-                    in  
-                      let alreadyUsedNames = (Pairs.second newBindingsAndNames)
-                      in  
-                        let newTerm = (Pairs.second result)
-                        in ((\x -> case x of
-                          Core.TermLet v1 ->  
-                            let body = (Core.letBody v1)
-                            in  
-                              let partitionPair = (Lists.partition (shouldHoistBinding cx) (Core.letBindings v1))
-                              in  
-                                let hoistUs = (Pairs.first partitionPair)
-                                in  
-                                  let keepUs = (Pairs.second partitionPair)
-                                  in  
-                                    let hoistedBindingNames = (Lists.map Core.bindingName hoistUs)
-                                    in  
-                                      let polyLetVariables = (Sets.fromList (Lists.filter (\v -> Maybes.maybe False Schemas.fTypeIsPolymorphic (Maps.lookup v (Typing.typeContextTypes cx))) (Sets.toList (Typing.typeContextLetVariables cx))))
-                                      in  
-                                        let boundTermVariables = (Sets.union (Typing.typeContextLambdaVariables cx) (Typing.typeContextLetVariables cx))
-                                        in  
-                                          let freeVariablesInEachBinding = (Lists.map (\b -> Sets.toList (Sets.intersection boundTermVariables (Rewriting.freeVariablesInTerm (Core.bindingTerm b)))) hoistUs)
-                                          in  
-                                            let bindingDependencies = (Lists.map (\vars -> Lists.partition (\v -> Sets.member v (Sets.fromList hoistedBindingNames)) vars) freeVariablesInEachBinding)
-                                            in  
-                                              let bindingEdges = (Lists.zip hoistedBindingNames (Lists.map Pairs.first bindingDependencies))
-                                              in  
-                                                let bindingImmediateCapturedVars = (Lists.zip hoistedBindingNames (Lists.map Pairs.second bindingDependencies))
-                                                in  
-                                                  let capturedVarsMap = (Maps.fromList (Sorting.propagateTags bindingEdges bindingImmediateCapturedVars))
-                                                  in  
-                                                    let bindingsWithCapturedVars = (Lists.map (\b -> (b, (Maybes.maybe [] (\vars -> Sets.toList (Sets.difference vars polyLetVariables)) (Maps.lookup (Core.bindingName b) capturedVarsMap)))) hoistUs)
-                                                    in  
-                                                      let hoistPairsAndNames = (Lists.foldl (hoistOne prefix cx) ([], alreadyUsedNames) bindingsWithCapturedVars)
-                                                      in  
-                                                        let hoistPairs = (Lists.reverse (Pairs.first hoistPairsAndNames))
-                                                        in  
-                                                          let hoistedBindings = (Lists.map Pairs.first hoistPairs)
-                                                          in  
-                                                            let replacements = (Lists.map Pairs.second hoistPairs)
-                                                            in  
-                                                              let finalUsedNames = (Pairs.second hoistPairsAndNames)
-                                                              in  
-                                                                let hoistNameReplacementPairs = (Lists.zip (Lists.map Core.bindingName hoistUs) replacements)
-                                                                in  
-                                                                  let hoistBindingMap = (Maps.fromList (Lists.map (\b -> (Core.bindingName b, b)) hoistUs))
-                                                                  in  
-                                                                    let isCacheable = (\name ->  
-                                                                            let multiRef = (Equality.gte (countVarOccurrences name body) 2)
-                                                                            in  
-                                                                              let isPoly = (Maybes.maybe False (\b -> bindingIsPolymorphic b) (Maps.lookup name hoistBindingMap))
-                                                                              in (Logic.and multiRef (Logic.not isPoly)))
-                                                                    in  
-                                                                      let singleRefPairs = (Lists.filter (\p -> Logic.not (isCacheable (Pairs.first p))) hoistNameReplacementPairs)
-                                                                      in  
-                                                                        let multiRefPairs = (Lists.filter (\p -> isCacheable (Pairs.first p)) hoistNameReplacementPairs)
-                                                                        in  
-                                                                          let fullSubst = (Typing.TermSubst (Maps.fromList hoistNameReplacementPairs))
-                                                                          in  
-                                                                            let bodyOnlySubst = (Typing.TermSubst (Maps.fromList singleRefPairs))
-                                                                            in  
-                                                                              let bodySubst = (Substitution.substituteInTerm bodyOnlySubst body)
-                                                                              in  
-                                                                                let cacheBindings = (Lists.map (\p ->  
-                                                                                        let origType = (Maybes.maybe Nothing (\b -> Core.bindingType b) (Maps.lookup (Pairs.first p) hoistBindingMap))
-                                                                                        in Core.Binding {
-                                                                                          Core.bindingName = (Pairs.first p),
-                                                                                          Core.bindingTerm = (Pairs.second p),
-                                                                                          Core.bindingType = origType}) multiRefPairs)
-                                                                                in  
-                                                                                  let bodyWithCache = (Logic.ifElse (Lists.null cacheBindings) bodySubst (Core.TermLet (Core.Let {
-                                                                                          Core.letBindings = cacheBindings,
-                                                                                          Core.letBody = bodySubst})))
-                                                                                  in  
-                                                                                    let keepUsSubst = (Lists.map (Substitution.substituteInBinding fullSubst) keepUs)
-                                                                                    in  
-                                                                                      let hoistedBindingsSubst = (Lists.map (Substitution.substituteInBinding fullSubst) hoistedBindings)
-                                                                                      in  
-                                                                                        let bindingsSoFarSubst = (Lists.map (Substitution.substituteInBinding fullSubst) bindingsSoFar)
-                                                                                        in  
-                                                                                          let augmentResult = (augmentBindingsWithNewFreeVars cx (Sets.difference boundTermVariables polyLetVariables) bindingsSoFarSubst)
-                                                                                          in  
-                                                                                            let bindingsSoFarAugmented = (Pairs.first augmentResult)
-                                                                                            in  
-                                                                                              let augmentSubst = (Pairs.second augmentResult)
-                                                                                              in  
-                                                                                                let hoistedBindingsFinal = (Lists.map (Substitution.substituteInBinding augmentSubst) hoistedBindingsSubst)
-                                                                                                in  
-                                                                                                  let bindingsSoFarFinal = (Lists.map (Substitution.substituteInBinding augmentSubst) bindingsSoFarAugmented)
-                                                                                                  in  
-                                                                                                    let bodyFinal = (Substitution.substituteInTerm augmentSubst bodyWithCache)
-                                                                                                    in  
-                                                                                                      let keepUsFinal = (Lists.map (Substitution.substituteInBinding augmentSubst) keepUsSubst)
-                                                                                                      in  
-                                                                                                        let finalTerm = (Logic.ifElse (Lists.null keepUsFinal) bodyFinal (Core.TermLet (Core.Let {
-                                                                                                                Core.letBindings = keepUsFinal,
-                                                                                                                Core.letBody = bodyFinal})))
-                                                                                                        in ((Lists.concat [
-                                                                                                          previouslyFinishedBindings,
-                                                                                                          hoistedBindingsFinal,
-                                                                                                          bindingsSoFarFinal], finalUsedNames), finalTerm)
-                          _ -> ((Lists.concat2 previouslyFinishedBindings bindingsSoFar, alreadyUsedNames), newTerm)) newTerm))
-    in  
-      let cx1 = (Schemas.extendTypeContextForLet (\c -> \b -> Nothing) cx0 let0)
-      in  
-        let forActiveBinding = (\b ->  
-                let prefix = (Strings.cat2 (Core.unName (Core.bindingName b)) "_")
-                in  
-                  let init = ([], (Sets.singleton (Core.bindingName b)))
-                  in  
-                    let resultPair = (rewriteAndFoldTermWithTypeContext (rewrite prefix) cx1 init (Core.bindingTerm b))
-                    in  
-                      let resultBindings = (Pairs.first (Pairs.first resultPair))
-                      in  
-                        let resultTerm = (Pairs.second resultPair)
-                        in (Lists.cons (Core.Binding {
-                          Core.bindingName = (Core.bindingName b),
-                          Core.bindingTerm = resultTerm,
-                          Core.bindingType = (Core.bindingType b)}) resultBindings))
-        in  
-          let forBinding = (\b -> Logic.ifElse (isParentBinding b) (forActiveBinding b) [
-                  b])
-          in Core.Let {
-            Core.letBindings = (Lists.concat (Lists.map forBinding (Core.letBindings let0))),
-            Core.letBody = (Core.letBody let0)}
+-- | Transform a let-term by pulling polymorphic let bindings to the top level, using Graph. A binding is hoisted if: (1) It is polymorphic (has non-empty typeSchemeVariables), OR (2) Its type uses type variables from the Graph (i.e., from enclosing type lambdas). Bindings which are already at the top level are not hoisted. If a hoisted binding captures lambda-bound or let-bound variables from an enclosing scope, the binding is wrapped in lambdas for those variables, and references are replaced with applications. If a hoisted binding uses type variables from the context, those type variables are added to the binding's type scheme. Note: we assume that there is no variable shadowing; use hydra.rewriting.unshadowVariables first.
+hoistLetBindingsWithContext :: (Core.Binding -> Bool) -> Graph.Graph -> Core.Let -> Core.Let
+hoistLetBindingsWithContext isParentBinding cx let0 =
+    hoistLetBindingsWithPredicate isParentBinding shouldHoistPolymorphic cx let0
 
+-- | Transform a let-term by pulling let bindings to the top level. The isParentBinding predicate applies to top-level bindings and determines whether their subterm bindings are eligible for hoisting. The shouldHoistBinding predicate takes the Graph and a subterm binding, and returns True if the binding should be hoisted. This is useful for targets like Java that cannot have polymorphic definitions in arbitrary positions. The Graph provides information about type variables and lambda variables in scope. If a hoisted binding captures let-bound or lambda-bound variables from an enclosing scope, the binding is wrapped in lambdas for those variables, and references are replaced with applications. If a hoisted binding captures type variables from an enclosing type lambda scope, those type variables are added to the binding's type scheme, and references are replaced with type applications. Note: we assume that there is no variable shadowing; use hydra.rewriting.unshadowVariables first.
+hoistLetBindingsWithPredicate :: (Core.Binding -> Bool) -> (Graph.Graph -> Core.Binding -> Bool) -> Graph.Graph -> Core.Let -> Core.Let
+hoistLetBindingsWithPredicate isParentBinding shouldHoistBinding cx0 let0 =
+
+      let hoistOne =
+              \prefix -> \cx -> \pair -> \bindingWithCapturedVars ->
+                let bindingAndReplacementPairs = Pairs.first pair
+                    alreadyUsedNames = Pairs.second pair
+                    b = Pairs.first bindingWithCapturedVars
+                    capturedTermVars = Pairs.second bindingWithCapturedVars
+                    types = Maps.map Rewriting.typeSchemeToFType (Graph.graphBoundTypes cx)
+                    capturedTermVarTypePairs = Lists.map (\v -> (v, (Maps.lookup v types))) capturedTermVars
+                    capturedTermVarTypes =
+                            Lists.map (\typ -> Rewriting.deannotateTypeParameters typ) (Maybes.cat (Lists.map Pairs.second capturedTermVarTypePairs))
+                    freeInBindingType =
+                            Maybes.maybe Sets.empty (\ts -> Rewriting.freeVariablesInType (Core.typeSchemeType ts)) (Core.bindingType b)
+                    freeInCapturedVarTypes = Sets.unions (Lists.map (\t -> Rewriting.freeVariablesInType t) capturedTermVarTypes)
+                    capturedTypeVars =
+                            Sets.toList (Sets.intersection (Graph.graphTypeVariables cx) (Sets.union freeInBindingType freeInCapturedVarTypes))
+                    globalBindingName =
+                            Lexical.chooseUniqueName alreadyUsedNames (Core.Name (Strings.cat2 prefix (Core.unName (Core.bindingName b))))
+                    newUsedNames = Sets.insert globalBindingName alreadyUsedNames
+                    newTypeScheme =
+                            Logic.ifElse (Equality.equal (Lists.length capturedTermVarTypes) (Lists.length capturedTermVarTypePairs)) (Maybes.map (\ts -> Core.TypeScheme {
+                              Core.typeSchemeVariables = (Lists.nub (Lists.concat2 capturedTypeVars (Core.typeSchemeVariables ts))),
+                              Core.typeSchemeType = (Lists.foldl (\t -> \a -> Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = a,
+                                Core.functionTypeCodomain = t})) (Core.typeSchemeType ts) (Lists.reverse capturedTermVarTypes)),
+                              Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}) (Core.bindingType b)) Nothing
+                    strippedTerm = Rewriting.stripTypeLambdas (Core.bindingTerm b)
+                    termWithLambdas =
+                            Lists.foldl (\t -> \p -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Pairs.first p),
+                              Core.lambdaDomain = (Maybes.map (\dom -> Rewriting.deannotateTypeParameters dom) (Pairs.second p)),
+                              Core.lambdaBody = t}))) strippedTerm (Lists.reverse capturedTermVarTypePairs)
+                    termWithTypeLambdas =
+                            Lists.foldl (\t -> \v -> Core.TermTypeLambda (Core.TypeLambda {
+                              Core.typeLambdaParameter = v,
+                              Core.typeLambdaBody = t})) termWithLambdas (Lists.reverse (Maybes.maybe [] Core.typeSchemeVariables newTypeScheme))
+                    withTypeApps =
+                            Lists.foldl (\t -> \v -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = t,
+                              Core.typeApplicationTermType = (Core.TypeVariable v)})) (Core.TermVariable globalBindingName) capturedTypeVars
+                    replacement =
+                            Lists.foldl (\t -> \v -> Core.TermApplication (Core.Application {
+                              Core.applicationFunction = t,
+                              Core.applicationArgument = (Core.TermVariable v)})) withTypeApps capturedTermVars
+                    newBindingAndReplacement =
+                            (Core.Binding {
+                              Core.bindingName = globalBindingName,
+                              Core.bindingTerm = termWithTypeLambdas,
+                              Core.bindingType = newTypeScheme}, replacement)
+                    newPairs = Lists.cons newBindingAndReplacement bindingAndReplacementPairs
+                in (newPairs, newUsedNames)
+          rewrite =
+                  \prefix -> \recurse -> \cx -> \bindingsAndNames -> \term ->
+                    let previouslyFinishedBindings = Pairs.first bindingsAndNames
+                        emptyBindingsAndNames = ([], (Pairs.second bindingsAndNames))
+                        result = recurse emptyBindingsAndNames term
+                        newBindingsAndNames = Pairs.first result
+                        bindingsSoFar = Pairs.first newBindingsAndNames
+                        alreadyUsedNames = Pairs.second newBindingsAndNames
+                        newTerm = Pairs.second result
+                    in case newTerm of
+                      Core.TermLet v0 ->
+                        let body = Core.letBody v0
+                            partitionPair = Lists.partition (shouldHoistBinding cx) (Core.letBindings v0)
+                            hoistUs = Pairs.first partitionPair
+                            keepUs = Pairs.second partitionPair
+                            hoistedBindingNames = Lists.map Core.bindingName hoistUs
+                            polyLetVariables =
+                                    Sets.fromList (Lists.filter (\v -> Maybes.maybe False Schemas.fTypeIsPolymorphic (Maybes.map Rewriting.typeSchemeToFType (Maps.lookup v (Graph.graphBoundTypes cx)))) (Sets.toList (Sets.difference (Sets.fromList (Maps.keys (Graph.graphBoundTerms cx))) (Graph.graphLambdaVariables cx))))
+                            boundTermVariables =
+                                    Sets.union (Graph.graphLambdaVariables cx) (Sets.difference (Sets.fromList (Maps.keys (Graph.graphBoundTerms cx))) (Graph.graphLambdaVariables cx))
+                            freeVariablesInEachBinding =
+                                    Lists.map (\b -> Sets.toList (Sets.intersection boundTermVariables (Rewriting.freeVariablesInTerm (Core.bindingTerm b)))) hoistUs
+                            bindingDependencies =
+                                    Lists.map (\vars -> Lists.partition (\v -> Sets.member v (Sets.fromList hoistedBindingNames)) vars) freeVariablesInEachBinding
+                            bindingEdges = Lists.zip hoistedBindingNames (Lists.map Pairs.first bindingDependencies)
+                            bindingImmediateCapturedVars = Lists.zip hoistedBindingNames (Lists.map Pairs.second bindingDependencies)
+                            capturedVarsMap = Maps.fromList (Sorting.propagateTags bindingEdges bindingImmediateCapturedVars)
+                            bindingsWithCapturedVars =
+                                    Lists.map (\b -> (b, (Maybes.maybe [] (\vars -> Sets.toList (Sets.difference vars polyLetVariables)) (Maps.lookup (Core.bindingName b) capturedVarsMap)))) hoistUs
+                            hoistPairsAndNames = Lists.foldl (hoistOne prefix cx) ([], alreadyUsedNames) bindingsWithCapturedVars
+                            hoistPairs = Lists.reverse (Pairs.first hoistPairsAndNames)
+                            hoistedBindings = Lists.map Pairs.first hoistPairs
+                            replacements = Lists.map Pairs.second hoistPairs
+                            finalUsedNames = Pairs.second hoistPairsAndNames
+                            hoistNameReplacementPairs = Lists.zip (Lists.map Core.bindingName hoistUs) replacements
+                            hoistBindingMap = Maps.fromList (Lists.map (\b -> (Core.bindingName b, b)) hoistUs)
+                            isCacheable =
+                                    \name ->
+                                      let multiRef = Equality.gte (countVarOccurrences name body) 2
+                                          isPoly = Maybes.maybe False (\b -> bindingIsPolymorphic b) (Maps.lookup name hoistBindingMap)
+                                      in (Logic.and multiRef (Logic.not isPoly))
+                            singleRefPairs = Lists.filter (\p -> Logic.not (isCacheable (Pairs.first p))) hoistNameReplacementPairs
+                            multiRefPairs = Lists.filter (\p -> isCacheable (Pairs.first p)) hoistNameReplacementPairs
+                            fullSubst = Typing.TermSubst (Maps.fromList hoistNameReplacementPairs)
+                            bodyOnlySubst = Typing.TermSubst (Maps.fromList singleRefPairs)
+                            bodySubst = Substitution.substituteInTerm bodyOnlySubst body
+                            cacheBindings =
+                                    Lists.map (\p ->
+                                      let origType = Maybes.maybe Nothing (\b -> Core.bindingType b) (Maps.lookup (Pairs.first p) hoistBindingMap)
+                                      in Core.Binding {
+                                        Core.bindingName = (Pairs.first p),
+                                        Core.bindingTerm = (Pairs.second p),
+                                        Core.bindingType = origType}) multiRefPairs
+                            bodyWithCache =
+                                    Logic.ifElse (Lists.null cacheBindings) bodySubst (Core.TermLet (Core.Let {
+                                      Core.letBindings = cacheBindings,
+                                      Core.letBody = bodySubst}))
+                            keepUsSubst = Lists.map (Substitution.substituteInBinding fullSubst) keepUs
+                            hoistedBindingsSubst = Lists.map (Substitution.substituteInBinding fullSubst) hoistedBindings
+                            bindingsSoFarSubst = Lists.map (Substitution.substituteInBinding fullSubst) bindingsSoFar
+                            augmentResult = augmentBindingsWithNewFreeVars cx (Sets.difference boundTermVariables polyLetVariables) bindingsSoFarSubst
+                            bindingsSoFarAugmented = Pairs.first augmentResult
+                            augmentSubst = Pairs.second augmentResult
+                            hoistedBindingsFinal = Lists.map (Substitution.substituteInBinding augmentSubst) hoistedBindingsSubst
+                            bindingsSoFarFinal = Lists.map (Substitution.substituteInBinding augmentSubst) bindingsSoFarAugmented
+                            bodyFinal = Substitution.substituteInTerm augmentSubst bodyWithCache
+                            keepUsFinal = Lists.map (Substitution.substituteInBinding augmentSubst) keepUsSubst
+                            finalTerm =
+                                    Logic.ifElse (Lists.null keepUsFinal) bodyFinal (Core.TermLet (Core.Let {
+                                      Core.letBindings = keepUsFinal,
+                                      Core.letBody = bodyFinal}))
+                        in ((Lists.concat [
+                          previouslyFinishedBindings,
+                          hoistedBindingsFinal,
+                          bindingsSoFarFinal], finalUsedNames), finalTerm)
+                      _ -> ((Lists.concat2 previouslyFinishedBindings bindingsSoFar, alreadyUsedNames), newTerm)
+          cx1 = Rewriting.extendGraphForLet (\c -> \b -> Nothing) cx0 let0
+          forActiveBinding =
+                  \b ->
+                    let prefix = Strings.cat2 (Core.unName (Core.bindingName b)) "_"
+                        init = ([], (Sets.singleton (Core.bindingName b)))
+                        resultPair = Rewriting.rewriteAndFoldTermWithGraph (rewrite prefix) cx1 init (Core.bindingTerm b)
+                        resultBindings = Pairs.first (Pairs.first resultPair)
+                        resultTerm = Pairs.second resultPair
+                    in (Lists.cons (Core.Binding {
+                      Core.bindingName = (Core.bindingName b),
+                      Core.bindingTerm = resultTerm,
+                      Core.bindingType = (Core.bindingType b)}) resultBindings)
+          forBinding = \b -> Logic.ifElse (isParentBinding b) (forActiveBinding b) [
+                b]
+      in Core.Let {
+        Core.letBindings = (Lists.concat (Lists.map forBinding (Core.letBindings let0))),
+        Core.letBody = (Core.letBody let0)}
+
 -- | Transform a let-term by pulling all polymorphic let bindings to the top level. This is useful to ensure that polymorphic bindings are not nested within other terms, which is unsupported by certain targets such as Java. Polymorphic bindings are those with a non-empty list of type scheme variables. If a hoisted binding captures lambda-bound variables from an enclosing scope, the binding is wrapped in lambdas for those variables, and references are replaced with applications. Note: Assumes no variable shadowing; use hydra.rewriting.unshadowVariables first.
-hoistPolymorphicLetBindings :: ((Core.Binding -> Bool) -> Core.Let -> Core.Let)
-hoistPolymorphicLetBindings isParentBinding let0 =  
-  let emptyIx = Typing.InferenceContext {
-          Typing.inferenceContextSchemaTypes = Maps.empty,
-          Typing.inferenceContextPrimitiveTypes = Maps.empty,
-          Typing.inferenceContextDataTypes = Maps.empty,
-          Typing.inferenceContextClassConstraints = Maps.empty,
-          Typing.inferenceContextDebug = False}
-  in  
-    let emptyCx = Typing.TypeContext {
-            Typing.typeContextTypes = Maps.empty,
-            Typing.typeContextMetadata = Maps.empty,
-            Typing.typeContextTypeVariables = Sets.empty,
-            Typing.typeContextLambdaVariables = Sets.empty,
-            Typing.typeContextLetVariables = Sets.empty,
-            Typing.typeContextInferenceContext = emptyIx}
-    in (hoistLetBindingsWithPredicate isParentBinding shouldHoistPolymorphic emptyCx let0)
+hoistPolymorphicLetBindings :: (Core.Binding -> Bool) -> Core.Let -> Core.Let
+hoistPolymorphicLetBindings isParentBinding let0 =
 
--- | Hoist subterms into local let bindings based on a path-aware predicate. The predicate receives a pair of (path, term) where path is the list of TermAccessors from the root to the current term, and returns True if the term should be hoisted. For each let term found, the immediate subterms (binding values and body) are processed: matching subterms within each immediate subterm are collected and hoisted into a local let that wraps that immediate subterm. If a hoisted term contains free variables that are lambda-bound at an enclosing scope, the hoisted binding is wrapped in lambdas for those variables, and the reference is replaced with an application of those variables.
-hoistSubterms :: ((([Accessors.TermAccessor], Core.Term) -> Bool) -> Typing.TypeContext -> Core.Term -> Core.Term)
-hoistSubterms shouldHoist cx0 term0 =  
-  let processImmediateSubterm = (\cx -> \counter -> \namePrefix -> \pathPrefix -> \subterm ->  
-          let baselineLambdaVars = (Typing.typeContextLambdaVariables cx)
-          in  
-            let collectAndReplace = (\recurse -> \path -> \cxInner -> \acc -> \term ->  
-                    let currentCounter = (Pairs.first acc)
-                    in  
-                      let collectedBindings = (Pairs.second acc)
-                      in ((\x -> case x of
-                        Core.TermLet _ -> (acc, term)
-                        Core.TermTypeLambda _ -> (acc, term)
-                        _ ->  
-                          let result = (recurse acc term)
-                          in  
-                            let newAcc = (Pairs.first result)
-                            in  
-                              let processedTerm = (Pairs.second result)
-                              in  
-                                let newCounter = (Pairs.first newAcc)
-                                in  
-                                  let newBindings = (Pairs.second newAcc)
-                                  in  
-                                    let fullPath = (Lists.concat2 pathPrefix path)
-                                    in (Logic.ifElse (shouldHoist (fullPath, processedTerm)) ( 
-                                      let bindingName = (Core.Name (Strings.cat [
+      let emptyCx =
+              Graph.Graph {
+                Graph.graphBoundTerms = Maps.empty,
+                Graph.graphBoundTypes = Maps.empty,
+                Graph.graphClassConstraints = Maps.empty,
+                Graph.graphLambdaVariables = Sets.empty,
+                Graph.graphMetadata = Maps.empty,
+                Graph.graphPrimitives = Maps.empty,
+                Graph.graphSchemaTypes = Maps.empty,
+                Graph.graphTypeVariables = Sets.empty}
+      in (hoistLetBindingsWithPredicate isParentBinding shouldHoistPolymorphic emptyCx let0)
+
+-- | Hoist subterms into local let bindings based on a path-aware predicate. The predicate receives a pair of (path, term) where path is the list of SubtermSteps from the root to the current term, and returns True if the term should be hoisted. For each let term found, the immediate subterms (binding values and body) are processed: matching subterms within each immediate subterm are collected and hoisted into a local let that wraps that immediate subterm. If a hoisted term contains free variables that are lambda-bound at an enclosing scope, the hoisted binding is wrapped in lambdas for those variables, and the reference is replaced with an application of those variables.
+hoistSubterms :: (([Paths.SubtermStep], Core.Term) -> Bool) -> Graph.Graph -> Core.Term -> Core.Term
+hoistSubterms shouldHoist cx0 term0 =
+
+      let processImmediateSubterm =
+              \cx -> \counter -> \namePrefix -> \pathPrefix -> \subterm ->
+                let baselineLambdaVars = Graph.graphLambdaVariables cx
+                    collectAndReplace =
+                            \recurse -> \path -> \cxInner -> \acc -> \term ->
+                              let currentCounter = Pairs.first acc
+                                  collectedBindings = Pairs.second acc
+                              in case term of
+                                Core.TermLet _ -> (acc, term)
+                                Core.TermTypeLambda _ -> (acc, term)
+                                _ ->
+                                  let result = recurse acc term
+                                      newAcc = Pairs.first result
+                                      processedTerm = Pairs.second result
+                                      newCounter = Pairs.first newAcc
+                                      newBindings = Pairs.second newAcc
+                                      fullPath = Lists.concat2 pathPrefix path
+                                  in (Logic.ifElse (shouldHoist (fullPath, processedTerm)) (
+                                    let proposedName =
+                                            Core.Name (Strings.cat [
                                               "_hoist_",
                                               namePrefix,
                                               "_",
-                                              (Literals.showInt32 newCounter)]))
-                                      in  
-                                        let allLambdaVars = (Typing.typeContextLambdaVariables cxInner)
-                                        in  
-                                          let newLambdaVars = (Sets.difference allLambdaVars baselineLambdaVars)
-                                          in  
-                                            let freeVars = (Rewriting.freeVariablesInTerm processedTerm)
-                                            in  
-                                              let capturedVars = (Sets.toList (Sets.intersection newLambdaVars freeVars))
-                                              in  
-                                                let typeMap = (Typing.typeContextTypes cxInner)
-                                                in  
-                                                  let wrappedTerm = (Lists.foldl (\body -> \varName -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = varName,
-                                                          Core.lambdaDomain = (Maps.lookup varName typeMap),
-                                                          Core.lambdaBody = body}))) processedTerm (Lists.reverse capturedVars))
-                                                  in  
-                                                    let reference = (Lists.foldl (\fn -> \varName -> Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = fn,
-                                                            Core.applicationArgument = (Core.TermVariable varName)})) (Core.TermVariable bindingName) capturedVars)
-                                                    in  
-                                                      let newBinding = Core.Binding {
-                                                              Core.bindingName = bindingName,
-                                                              Core.bindingTerm = wrappedTerm,
-                                                              Core.bindingType = Nothing}
-                                                      in ((Math.add newCounter 1, (Lists.cons newBinding newBindings)), reference)) (newAcc, processedTerm))) term))
-            in  
-              let result = (rewriteAndFoldTermWithTypeContextAndPath collectAndReplace cx (counter, []) subterm)
-              in  
-                let finalAcc = (Pairs.first result)
-                in  
-                  let transformedSubterm = (Pairs.second result)
-                  in  
-                    let finalCounter = (Pairs.first finalAcc)
-                    in  
-                      let bindings = (Pairs.second finalAcc)
-                      in (Logic.ifElse (Lists.null bindings) (finalCounter, transformedSubterm) ( 
-                        let localLet = (Core.TermLet (Core.Let {
-                                Core.letBindings = (Lists.reverse bindings),
-                                Core.letBody = transformedSubterm}))
-                        in (finalCounter, localLet))))
-  in  
-    let processLetTerm = (\cx -> \counter -> \path -> \lt ->  
-            let bindings = (Core.letBindings lt)
-            in  
-              let body = (Core.letBody lt)
-              in  
-                let processBinding = (\acc -> \binding ->  
-                        let namePrefix = (Strings.intercalate "_" (Strings.splitOn "." (Core.unName (Core.bindingName binding))))
-                        in  
-                          let bindingPathPrefix = (Lists.concat2 path [
-                                  Accessors.TermAccessorLetBinding (Core.bindingName binding)])
-                          in  
-                            let result = (processImmediateSubterm cx 1 namePrefix bindingPathPrefix (Core.bindingTerm binding))
-                            in  
-                              let newValue = (Pairs.second result)
-                              in  
-                                let newBinding = Core.Binding {
-                                        Core.bindingName = (Core.bindingName binding),
-                                        Core.bindingTerm = newValue,
-                                        Core.bindingType = (Core.bindingType binding)}
-                                in (Lists.cons newBinding acc))
-                in  
-                  let newBindingsReversed = (Lists.foldl processBinding [] bindings)
-                  in  
-                    let newBindings = (Lists.reverse newBindingsReversed)
-                    in  
-                      let bodyPathPrefix = (Lists.concat2 path [
-                              Accessors.TermAccessorLetBody])
-                      in  
-                        let bodyResult = (processImmediateSubterm cx 1 "_body" bodyPathPrefix body)
-                        in  
-                          let newBody = (Pairs.second bodyResult)
-                          in (counter, (Core.TermLet (Core.Let {
-                            Core.letBindings = newBindings,
-                            Core.letBody = newBody}))))
-    in  
-      let rewrite = (\recurse -> \path -> \cx -> \counter -> \term -> (\x -> case x of
-              Core.TermLet _ ->  
-                let recursed = (recurse counter term)
-                in  
-                  let newCounter = (Pairs.first recursed)
-                  in  
-                    let recursedTerm = (Pairs.second recursed)
-                    in ((\x -> case x of
-                      Core.TermLet v2 -> (processLetTerm cx newCounter path v2)
-                      _ -> (newCounter, recursedTerm)) recursedTerm)
-              _ -> (recurse counter term)) term)
-      in (Pairs.second (rewriteAndFoldTermWithTypeContextAndPath rewrite cx0 1 term0))
+                                              (Literals.showInt32 newCounter)])
+                                        existingNames = Sets.fromList (Lists.map (\b -> Core.bindingName b) newBindings)
+                                        freeVarsInSubterm = Rewriting.freeVariablesInTerm subterm
+                                        allReserved = Sets.union existingNames freeVarsInSubterm
+                                        bindingName = Lexical.chooseUniqueName allReserved proposedName
+                                        allLambdaVars = Graph.graphLambdaVariables cxInner
+                                        newLambdaVars = Sets.difference allLambdaVars baselineLambdaVars
+                                        freeVars = Rewriting.freeVariablesInTerm processedTerm
+                                        capturedVars = Sets.toList (Sets.intersection newLambdaVars freeVars)
+                                        typeMap = Maps.map Rewriting.typeSchemeToFType (Graph.graphBoundTypes cxInner)
+                                        wrappedTerm =
+                                                Lists.foldl (\body -> \varName -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = varName,
+                                                  Core.lambdaDomain = (Maps.lookup varName typeMap),
+                                                  Core.lambdaBody = body}))) processedTerm (Lists.reverse capturedVars)
+                                        reference =
+                                                Lists.foldl (\fn -> \varName -> Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = fn,
+                                                  Core.applicationArgument = (Core.TermVariable varName)})) (Core.TermVariable bindingName) capturedVars
+                                        newBinding =
+                                                Core.Binding {
+                                                  Core.bindingName = bindingName,
+                                                  Core.bindingTerm = wrappedTerm,
+                                                  Core.bindingType = Nothing}
+                                    in ((Math.add newCounter 1, (Lists.cons newBinding newBindings)), reference)) (newAcc, processedTerm))
+                    result = Rewriting.rewriteAndFoldTermWithGraphAndPath collectAndReplace cx (counter, []) subterm
+                    finalAcc = Pairs.first result
+                    transformedSubterm = Pairs.second result
+                    finalCounter = Pairs.first finalAcc
+                    bindings = Pairs.second finalAcc
+                in (Logic.ifElse (Lists.null bindings) (finalCounter, transformedSubterm) (
+                  let localLet =
+                          Core.TermLet (Core.Let {
+                            Core.letBindings = (Lists.reverse bindings),
+                            Core.letBody = transformedSubterm})
+                  in (finalCounter, localLet)))
+          processLetTerm =
+                  \cx -> \counter -> \path -> \lt ->
+                    let bindings = Core.letBindings lt
+                        body = Core.letBody lt
+                        processBinding =
+                                \acc -> \binding ->
+                                  let namePrefix = Strings.intercalate "_" (Strings.splitOn "." (Core.unName (Core.bindingName binding)))
+                                      bindingPathPrefix = Lists.concat2 path [
+                                            Paths.SubtermStepLetBinding (Core.bindingName binding)]
+                                      result = processImmediateSubterm cx 1 namePrefix bindingPathPrefix (Core.bindingTerm binding)
+                                      newValue = Pairs.second result
+                                      newBinding =
+                                              Core.Binding {
+                                                Core.bindingName = (Core.bindingName binding),
+                                                Core.bindingTerm = newValue,
+                                                Core.bindingType = (Core.bindingType binding)}
+                                  in (Lists.cons newBinding acc)
+                        newBindingsReversed = Lists.foldl processBinding [] bindings
+                        newBindings = Lists.reverse newBindingsReversed
+                        bodyPathPrefix = Lists.concat2 path [
+                              Paths.SubtermStepLetBody]
+                        firstBindingName =
+                                Maybes.maybe "body" (\b -> Strings.intercalate "_" (Strings.splitOn "." (Core.unName (Core.bindingName b)))) (Lists.safeHead bindings)
+                        bodyPrefix = Strings.cat2 firstBindingName "_body"
+                        bodyResult = processImmediateSubterm cx 1 bodyPrefix bodyPathPrefix body
+                        newBody = Pairs.second bodyResult
+                    in (counter, (Core.TermLet (Core.Let {
+                      Core.letBindings = newBindings,
+                      Core.letBody = newBody})))
+          rewrite =
+                  \recurse -> \path -> \cx -> \counter -> \term -> case term of
+                    Core.TermLet _ ->
+                      let recursed = recurse counter term
+                          newCounter = Pairs.first recursed
+                          recursedTerm = Pairs.second recursed
+                      in case recursedTerm of
+                        Core.TermLet v1 -> processLetTerm cx newCounter path v1
+                        _ -> (newCounter, recursedTerm)
+                    _ -> recurse counter term
+      in (Pairs.second (Rewriting.rewriteAndFoldTermWithGraphAndPath rewrite cx0 1 term0))
 
-isApplicationFunction :: (Accessors.TermAccessor -> Bool)
-isApplicationFunction acc = ((\x -> case x of
-  Accessors.TermAccessorApplicationFunction -> True
-  _ -> False) acc)
+isApplicationFunction :: Paths.SubtermStep -> Bool
+isApplicationFunction acc =
+    case acc of
+      Paths.SubtermStepApplicationFunction -> True
+      _ -> False
 
 -- | Check if a function is a union elimination
-isEliminationUnion :: (Core.Function -> Bool)
-isEliminationUnion f = ((\x -> case x of
-  Core.FunctionElimination v1 -> ((\x -> case x of
-    Core.EliminationUnion _ -> True
-    _ -> False) v1)
-  _ -> False) f)
+isEliminationUnion :: Core.Function -> Bool
+isEliminationUnion f =
+    case f of
+      Core.FunctionElimination v0 -> case v0 of
+        Core.EliminationUnion _ -> True
+        _ -> False
+      _ -> False
 
-isLambdaBody :: (Accessors.TermAccessor -> Bool)
-isLambdaBody acc = ((\x -> case x of
-  Accessors.TermAccessorLambdaBody -> True
-  _ -> False) acc)
+isLambdaBody :: Paths.SubtermStep -> Bool
+isLambdaBody acc =
+    case acc of
+      Paths.SubtermStepLambdaBody -> True
+      _ -> False
 
 -- | Check if a term is a union elimination (case statement)
-isUnionElimination :: (Core.Term -> Bool)
-isUnionElimination term = ((\x -> case x of
-  Core.TermFunction v1 -> (isEliminationUnion v1)
-  _ -> False) term)
+isUnionElimination :: Core.Term -> Bool
+isUnionElimination term =
+    case term of
+      Core.TermFunction v0 -> isEliminationUnion v0
+      _ -> False
 
 -- | Check if a term is an application of a union elimination (case statement applied to an argument)
-isUnionEliminationApplication :: (Core.Term -> Bool)
-isUnionEliminationApplication term = ((\x -> case x of
-  Core.TermApplication v1 -> (isUnionElimination (Rewriting.deannotateAndDetypeTerm (Core.applicationFunction v1)))
-  _ -> False) term)
+isUnionEliminationApplication :: Core.Term -> Bool
+isUnionEliminationApplication term =
+    case term of
+      Core.TermApplication v0 -> isUnionElimination (Rewriting.deannotateAndDetypeTerm (Core.applicationFunction v0))
+      _ -> False
 
 -- | Normalize a path for hoisting by treating immediately-applied lambdas as let bindings. Replaces [applicationFunction, lambdaBody, ...] with [letBody, ...].
-normalizePathForHoisting :: ([Accessors.TermAccessor] -> [Accessors.TermAccessor])
-normalizePathForHoisting path =  
-  let go = (\remaining -> Logic.ifElse (Logic.or (Lists.null remaining) (Lists.null (Lists.tail remaining))) remaining ( 
-          let first = (Lists.head remaining)
-          in  
-            let second = (Lists.head (Lists.tail remaining))
-            in  
-              let rest = (Lists.tail (Lists.tail remaining))
-              in (Logic.ifElse (Logic.and (isApplicationFunction first) (isLambdaBody second)) (Lists.cons Accessors.TermAccessorLetBody (go rest)) (Lists.cons first (go (Lists.tail remaining))))))
-  in (go path)
-
--- | Rewrite a term while folding to produce a value, with TypeContext updated as we descend into subterms. Combines the features of rewriteAndFoldTerm and rewriteTermWithTypeContext. The user function f receives a recurse function that handles subterm traversal and TypeContext management.
-rewriteAndFoldTermWithTypeContext :: (((t0 -> Core.Term -> (t0, Core.Term)) -> Typing.TypeContext -> t0 -> Core.Term -> (t0, Core.Term)) -> Typing.TypeContext -> t0 -> Core.Term -> (t0, Core.Term))
-rewriteAndFoldTermWithTypeContext f cx0 val0 term0 =  
-  let wrapper = (\lowLevelRecurse -> \valAndCx -> \term ->  
-          let val = (Pairs.first valAndCx)
-          in  
-            let cx = (Pairs.second valAndCx)
-            in  
-              let cx1 = ((\x -> case x of
-                      Core.TermFunction v1 -> ((\x -> case x of
-                        Core.FunctionLambda v2 -> (Schemas.extendTypeContextForLambda cx v2)
-                        _ -> cx) v1)
-                      Core.TermLet v1 -> (Schemas.extendTypeContextForLet (\_ -> \_ -> Nothing) cx v1)
-                      Core.TermTypeLambda v1 -> (Schemas.extendTypeContextForTypeLambda cx v1)
-                      _ -> cx) term)
-              in  
-                let recurseForUser = (\newVal -> \subterm ->  
-                        let result = (lowLevelRecurse (newVal, cx1) subterm)
-                        in (Pairs.first (Pairs.first result), (Pairs.second result)))
-                in  
-                  let fResult = (f recurseForUser cx1 val term)
-                  in ((Pairs.first fResult, cx), (Pairs.second fResult)))
-  in  
-    let result = (Rewriting.rewriteAndFoldTerm wrapper (val0, cx0) term0)
-    in (Pairs.first (Pairs.first result), (Pairs.second result))
-
--- | Rewrite a term while folding to produce a value, with both TypeContext and accessor path tracked. The path is a list of TermAccessors representing the position from the root to the current term. Combines the features of rewriteAndFoldTermWithPath and TypeContext tracking. The TypeContext is automatically updated when descending into lambdas, lets, and type lambdas.
-rewriteAndFoldTermWithTypeContextAndPath :: (((t0 -> Core.Term -> (t0, Core.Term)) -> [Accessors.TermAccessor] -> Typing.TypeContext -> t0 -> Core.Term -> (t0, Core.Term)) -> Typing.TypeContext -> t0 -> Core.Term -> (t0, Core.Term))
-rewriteAndFoldTermWithTypeContextAndPath f cx0 val0 term0 =  
-  let wrapper = (\recurse -> \path -> \cxAndVal -> \term ->  
-          let cx = (Pairs.first cxAndVal)
-          in  
-            let val = (Pairs.second cxAndVal)
-            in  
-              let cx1 = ((\x -> case x of
-                      Core.TermFunction v1 -> ((\x -> case x of
-                        Core.FunctionLambda v2 -> (Schemas.extendTypeContextForLambda cx v2)
-                        _ -> cx) v1)
-                      Core.TermLet v1 -> (Schemas.extendTypeContextForLet (\_ -> \_ -> Nothing) cx v1)
-                      Core.TermTypeLambda v1 -> (Schemas.extendTypeContextForTypeLambda cx v1)
-                      _ -> cx) term)
-              in  
-                let recurseForUser = (\valIn -> \termIn ->  
-                        let result = (recurse path (cx1, valIn) termIn)
-                        in (Pairs.second (Pairs.first result), (Pairs.second result)))
-                in  
-                  let fResult = (f recurseForUser path cx1 val term)
-                  in ((cx, (Pairs.first fResult)), (Pairs.second fResult)))
-  in  
-    let result = (Rewriting.rewriteAndFoldTermWithPath wrapper (cx0, val0) term0)
-    in (Pairs.second (Pairs.first result), (Pairs.second result))
+normalizePathForHoisting :: [Paths.SubtermStep] -> [Paths.SubtermStep]
+normalizePathForHoisting path =
 
--- | Rewrite a term with the help of a type context which is updated as we descend into subterms
-rewriteTermWithTypeContext :: (((Core.Term -> t0) -> Typing.TypeContext -> Core.Term -> t0) -> Typing.TypeContext -> Core.Term -> t0)
-rewriteTermWithTypeContext f cx0 term0 =  
-  let f2 = (\recurse -> \cx -> \term ->  
-          let recurse1 = (\term -> recurse cx term)
-          in ((\x -> case x of
-            Core.TermFunction v1 -> ((\x -> case x of
-              Core.FunctionLambda v2 ->  
-                let cx1 = (Schemas.extendTypeContextForLambda cx v2)
-                in  
-                  let recurse2 = (\term -> recurse cx1 term)
-                  in (f recurse2 cx1 term)
-              _ -> (f recurse1 cx term)) v1)
-            Core.TermLet v1 ->  
-              let cx1 = (Schemas.extendTypeContextForLet (\_ -> \_ -> Nothing) cx v1)
-              in  
-                let recurse2 = (\term -> recurse cx1 term)
-                in (f recurse2 cx1 term)
-            Core.TermTypeLambda v1 ->  
-              let cx1 = (Schemas.extendTypeContextForTypeLambda cx v1)
-              in  
-                let recurse2 = (\term -> recurse cx1 term)
-                in (f recurse2 cx1 term)
-            _ -> (f recurse1 cx term)) term))
-  in  
-    let rewrite = (\cx -> \term -> f2 rewrite cx term)
-    in (rewrite cx0 term0)
+      let go =
+              \remaining -> Logic.ifElse (Logic.or (Lists.null remaining) (Lists.null (Lists.tail remaining))) remaining (
+                let first = Lists.head remaining
+                    second = Lists.head (Lists.tail remaining)
+                    rest = Lists.tail (Lists.tail remaining)
+                in (Logic.ifElse (Logic.and (isApplicationFunction first) (isLambdaBody second)) (Lists.cons Paths.SubtermStepLetBody (go rest)) (Lists.cons first (go (Lists.tail remaining)))))
+      in (go path)
 
 -- | Predicate that always returns True, for hoisting all bindings unconditionally.
-shouldHoistAll :: (t0 -> t1 -> Bool)
+shouldHoistAll :: t0 -> t1 -> Bool
 shouldHoistAll _ _ = True
 
 -- | Predicate for case statement hoisting. Returns True if term is a union elimination (bare case function) or a case statement application (union elimination applied to an argument) AND not at top level. Top level = reachable through annotations, let body/binding, lambda bodies, or ONE app LHS. Once through an app LHS, lambda bodies no longer pass through.
-shouldHoistCaseStatement :: (([Accessors.TermAccessor], Core.Term) -> Bool)
-shouldHoistCaseStatement pathAndTerm =  
-  let path = (Pairs.first pathAndTerm)
-  in  
-    let term = (Pairs.second pathAndTerm)
-    in (Logic.ifElse (Logic.not (Logic.or (isUnionElimination term) (isUnionEliminationApplication term))) False ( 
-      let finalState = (Lists.foldl (\st -> \acc -> updateHoistState acc st) (True, False) path)
-      in (Logic.not (Pairs.first finalState))))
+shouldHoistCaseStatement :: ([Paths.SubtermStep], Core.Term) -> Bool
+shouldHoistCaseStatement pathAndTerm =
 
--- | Predicate for hoisting polymorphic bindings. Returns True if the binding is polymorphic (has type scheme variables) or if its type uses any type variables from the TypeContext.
-shouldHoistPolymorphic :: (Typing.TypeContext -> Core.Binding -> Bool)
-shouldHoistPolymorphic cx binding = (Logic.or (bindingIsPolymorphic binding) (bindingUsesContextTypeVars cx binding))
+      let path = Pairs.first pathAndTerm
+          term = Pairs.second pathAndTerm
+      in (Logic.ifElse (Logic.not (Logic.or (isUnionElimination term) (isUnionEliminationApplication term))) False (
+        let finalState = Lists.foldl (\st -> \acc -> updateHoistState acc st) (True, False) path
+        in (Logic.not (Pairs.first finalState))))
 
+-- | Predicate for hoisting polymorphic bindings. Returns True if the binding is polymorphic (has type scheme variables) or if its type uses any type variables from the Graph.
+shouldHoistPolymorphic :: Graph.Graph -> Core.Binding -> Bool
+shouldHoistPolymorphic cx binding = Logic.or (bindingIsPolymorphic binding) (bindingUsesContextTypeVars cx binding)
+
 -- | Update hoisting state when traversing an accessor. State is (atTopLevel, usedAppLHS). Returns updated state.
-updateHoistState :: (Accessors.TermAccessor -> (Bool, Bool) -> (Bool, Bool))
-updateHoistState accessor state =  
-  let atTop = (Pairs.first state)
-  in  
-    let usedApp = (Pairs.second state)
-    in (Logic.ifElse (Logic.not atTop) (False, usedApp) ((\x -> case x of
-      Accessors.TermAccessorAnnotatedBody -> (True, usedApp)
-      Accessors.TermAccessorLetBody -> (True, usedApp)
-      Accessors.TermAccessorLetBinding _ -> (True, usedApp)
-      Accessors.TermAccessorLambdaBody -> (Logic.ifElse usedApp (False, True) (True, False))
-      Accessors.TermAccessorUnionCasesBranch _ -> (Logic.ifElse usedApp (False, True) (True, False))
-      Accessors.TermAccessorUnionCasesDefault -> (Logic.ifElse usedApp (False, True) (True, False))
-      Accessors.TermAccessorApplicationFunction -> (Logic.ifElse usedApp (False, True) (True, True))
-      Accessors.TermAccessorApplicationArgument -> (False, usedApp)
-      _ -> (False, usedApp)) accessor))
+updateHoistState :: Paths.SubtermStep -> (Bool, Bool) -> (Bool, Bool)
+updateHoistState accessor state =
+
+      let atTop = Pairs.first state
+          usedApp = Pairs.second state
+      in (Logic.ifElse (Logic.not atTop) (False, usedApp) (case accessor of
+        Paths.SubtermStepAnnotatedBody -> (True, usedApp)
+        Paths.SubtermStepLetBody -> (True, usedApp)
+        Paths.SubtermStepLetBinding _ -> (True, usedApp)
+        Paths.SubtermStepLambdaBody -> Logic.ifElse usedApp (False, True) (True, False)
+        Paths.SubtermStepUnionCasesBranch _ -> Logic.ifElse usedApp (False, True) (True, False)
+        Paths.SubtermStepUnionCasesDefault -> Logic.ifElse usedApp (False, True) (True, False)
+        Paths.SubtermStepApplicationFunction -> Logic.ifElse usedApp (False, True) (True, True)
+        Paths.SubtermStepApplicationArgument -> (False, usedApp)
+        _ -> (False, usedApp)))
diff --git a/src/gen-main/haskell/Hydra/Inference.hs b/src/gen-main/haskell/Hydra/Inference.hs
--- a/src/gen-main/haskell/Hydra/Inference.hs
+++ b/src/gen-main/haskell/Hydra/Inference.hs
@@ -6,1080 +6,1125 @@
 
 import qualified Hydra.Annotations as Annotations
 import qualified Hydra.Checking as Checking
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Extract.Core as Core_
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Math as Math
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Reflect as Reflect
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Show.Core as Core__
-import qualified Hydra.Show.Typing as Typing
-import qualified Hydra.Sorting as Sorting
-import qualified Hydra.Substitution as Substitution
-import qualified Hydra.Typing as Typing_
-import qualified Hydra.Unification as Unification
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Bind type constraints and continue with substitution
-bindConstraints :: (Typing_.InferenceContext -> (Typing_.TypeSubst -> Compute.Flow t0 t1) -> [Typing_.TypeConstraint] -> Compute.Flow t0 t1)
-bindConstraints cx f constraints = (Flows.bind (Unification.unifyTypeConstraints (Typing_.inferenceContextSchemaTypes cx) constraints) (\s -> Flows.bind (Checking.checkTypeSubst cx s) (\_ -> f s)))
-
--- | Place unbound type variables appearing anywhere under a typed let binding in the type scheme of that binding. These variables may appear in the binding type scheme itself or in that of a subterm, in domain types attached to functions, and in type abstraction and type application terms. This process attempts to capture type variables which have escaped unification, e.g. due to unused code. However, unbound type variables not appearing beneath any typed let binding remain unbound.
-bindUnboundTypeVariables :: (Typing_.InferenceContext -> Core.Term -> Core.Term)
-bindUnboundTypeVariables cx term0 =  
-  let svars = (Sets.fromList (Maps.keys (Typing_.inferenceContextSchemaTypes cx)))
-  in  
-    let rewrite = (\recurse -> \term -> (\x -> case x of
-            Core.TermLet v1 ->  
-              let forBinding = (\b ->  
-                      let bname = (Core.bindingName b)
-                      in  
-                        let bterm = (Core.bindingTerm b)
-                        in (Maybes.maybe (Core.Binding {
-                          Core.bindingName = bname,
-                          Core.bindingTerm = (bindUnboundTypeVariables cx bterm),
-                          Core.bindingType = Nothing}) (\ts ->  
-                          let bvars = (Sets.fromList (Core.typeSchemeVariables ts))
-                          in  
-                            let unboundInType = (Rewriting.freeVariablesInType (Core.typeSchemeType ts))
-                            in  
-                              let unboundInTerm = (Rewriting.freeTypeVariablesInTerm bterm)
-                              in  
-                                let unbound = (Sets.toList (Sets.difference (Sets.union unboundInType unboundInTerm) (Sets.union svars bvars)))
-                                in  
-                                  let ts2 = Core.TypeScheme {
-                                          Core.typeSchemeVariables = (Lists.concat2 (Core.typeSchemeVariables ts) unbound),
-                                          Core.typeSchemeType = (Core.typeSchemeType ts),
-                                          Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}
-                                  in  
-                                    let bterm2 = (Lists.foldl (\t -> \v -> Core.TermTypeLambda (Core.TypeLambda {
-                                            Core.typeLambdaParameter = v,
-                                            Core.typeLambdaBody = t})) bterm unbound)
-                                    in Core.Binding {
-                                      Core.bindingName = bname,
-                                      Core.bindingTerm = bterm2,
-                                      Core.bindingType = (Just ts2)}) (Core.bindingType b)))
-              in (Core.TermLet (Core.Let {
-                Core.letBindings = (Lists.map forBinding (Core.letBindings v1)),
-                Core.letBody = (bindUnboundTypeVariables cx (Core.letBody v1))}))
-            _ -> (recurse term)) term)
-    in (Rewriting.rewriteTerm rewrite term0)
-
--- | Fold a list of type variables over a term to build a type application term
-buildTypeApplicationTerm :: ([Core.Name] -> Core.Term -> Core.Term)
-buildTypeApplicationTerm tvars body = (Lists.foldl (\t -> \v -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-  Core.typeApplicationTermBody = t,
-  Core.typeApplicationTermType = (Core.TypeVariable v)})) body tvars)
-
--- | An empty inference context
-emptyInferenceContext :: Typing_.InferenceContext
-emptyInferenceContext = Typing_.InferenceContext {
-  Typing_.inferenceContextSchemaTypes = Maps.empty,
-  Typing_.inferenceContextPrimitiveTypes = Maps.empty,
-  Typing_.inferenceContextDataTypes = Maps.empty,
-  Typing_.inferenceContextClassConstraints = Maps.empty,
-  Typing_.inferenceContextDebug = False}
-
--- | Add (term variable, type scheme) pairs to the typing environment
-extendContext :: ([(Core.Name, Core.TypeScheme)] -> Typing_.InferenceContext -> Typing_.InferenceContext)
-extendContext pairs cx = Typing_.InferenceContext {
-  Typing_.inferenceContextSchemaTypes = (Typing_.inferenceContextSchemaTypes cx),
-  Typing_.inferenceContextPrimitiveTypes = (Typing_.inferenceContextPrimitiveTypes cx),
-  Typing_.inferenceContextDataTypes = (Maps.union (Maps.fromList pairs) (Typing_.inferenceContextDataTypes cx)),
-  Typing_.inferenceContextClassConstraints = (Typing_.inferenceContextClassConstraints cx),
-  Typing_.inferenceContextDebug = (Typing_.inferenceContextDebug cx)}
-
--- | Finalize an inferred term by checking for unbound type variables, then normalizing type variables
-finalizeInferredTerm :: (Typing_.InferenceContext -> Core.Term -> Compute.Flow t0 Core.Term)
-finalizeInferredTerm cx term =  
-  let term2 = (bindUnboundTypeVariables cx term)
-  in (Flows.bind (Checking.checkForUnboundTypeVariables cx term2) (\_ -> Flows.pure (Rewriting.normalizeTypeVariablesInTerm term2)))
-
--- | Infer a term's type and map over the result
-forInferredTerm :: (Typing_.InferenceContext -> Core.Term -> String -> (Typing_.InferenceResult -> t0) -> Compute.Flow t1 t0)
-forInferredTerm cx term desc f = (Flows.map f (inferTypeOfTerm cx term desc))
-
--- | Get all free variables in an inference context
-freeVariablesInContext :: (Typing_.InferenceContext -> S.Set Core.Name)
-freeVariablesInContext cx = (Lists.foldl Sets.union Sets.empty (Lists.map Rewriting.freeVariablesInTypeSchemeSimple (Maps.elems (Typing_.inferenceContextDataTypes cx))))
-
--- | Generate a fresh type variable
-freshVariableType :: (Compute.Flow t0 Core.Type)
-freshVariableType = (Flows.map (\x -> Core.TypeVariable x) Schemas.freshName)
-
--- | Generalize a type to a type scheme
-generalize :: (Typing_.InferenceContext -> Core.Type -> Core.TypeScheme)
-generalize cx typ =  
-  let isTypeVarName = (\name ->  
-          let parts = (Strings.splitOn "." (Core.unName name))
-          in (Equality.lte (Lists.length parts) 1))
-  in  
-    let vars = (Lists.nub (Lists.filter (\v -> Logic.and (isUnbound cx v) (isTypeVarName v)) (Rewriting.freeVariablesInTypeOrdered typ)))
-    in  
-      let allConstraints = (Typing_.inferenceContextClassConstraints cx)
-      in  
-        let relevantConstraints = (Maps.fromList (Maybes.cat (Lists.map (\v -> Maybes.map (\meta -> (v, meta)) (Maps.lookup v allConstraints)) vars)))
-        in  
-          let constraintsMaybe = (Logic.ifElse (Maps.null relevantConstraints) Nothing (Just relevantConstraints))
-          in Core.TypeScheme {
-            Core.typeSchemeVariables = vars,
-            Core.typeSchemeType = typ,
-            Core.typeSchemeConstraints = constraintsMaybe}
-
--- | Infer types for all elements in a graph
-inferGraphTypes :: (Graph.Graph -> Compute.Flow t0 Graph.Graph)
-inferGraphTypes g0 =  
-  let fromLetTerm = (\l ->  
-          let bindings = (Core.letBindings l)
-          in  
-            let body = (Core.letBody l)
-            in Graph.Graph {
-              Graph.graphElements = bindings,
-              Graph.graphEnvironment = Maps.empty,
-              Graph.graphTypes = Maps.empty,
-              Graph.graphBody = body,
-              Graph.graphPrimitives = (Graph.graphPrimitives g0),
-              Graph.graphSchema = (Graph.graphSchema g0)})
-  in  
-    let toLetTerm = (\g ->  
-            let toBinding = (\el -> Core.Binding {
-                    Core.bindingName = (Core.bindingName el),
-                    Core.bindingTerm = (Core.bindingTerm el),
-                    Core.bindingType = (Core.bindingType el)})
-            in (Core.TermLet (Core.Let {
-              Core.letBindings = (Lists.map toBinding (Graph.graphElements g)),
-              Core.letBody = (Graph.graphBody g)})))
-    in  
-      let forFinal = (\finalized -> (\x -> case x of
-              Core.TermLet v1 -> (Flows.pure (fromLetTerm v1))
-              Core.TermVariable _ -> (Flows.fail "Expected inferred graph as let term")) finalized)
-      in (Monads.withTrace "graph inference" (Flows.bind (Schemas.graphToInferenceContext g0) (\cx -> Flows.bind (inferTypeOfTerm cx (toLetTerm g0) "graph term") (\result ->  
-        let term = (Typing_.inferenceResultTerm result)
-        in  
-          let ts = (Typing_.inferenceResultType result)
-          in (Flows.bind (finalizeInferredTerm cx term) (\finalized -> forFinal finalized))))))
-
--- | Infer the type of a term in graph context
-inferInGraphContext :: (Core.Term -> Compute.Flow Graph.Graph Typing_.InferenceResult)
-inferInGraphContext term = (Flows.bind Monads.getState (\g -> Flows.bind (Schemas.graphToInferenceContext g) (\cx -> inferTypeOfTerm cx term "single term")))
-
--- | Infer types for multiple terms
-inferMany :: (Typing_.InferenceContext -> [(Core.Term, String)] -> Compute.Flow t0 ([Core.Term], ([Core.Type], Typing_.TypeSubst)))
-inferMany cx pairs =  
-  let dflt =  
-          let e = (Pairs.first (Lists.head pairs))
-          in  
-            let desc = (Pairs.second (Lists.head pairs))
-            in  
-              let tl = (Lists.tail pairs)
-              in (Flows.bind (inferTypeOfTerm cx e desc) (\result1 ->  
-                let e1 = (Typing_.inferenceResultTerm result1)
-                in  
-                  let t1 = (Typing_.inferenceResultType result1)
-                  in  
-                    let s1 = (Typing_.inferenceResultSubst result1)
-                    in (Flows.bind (inferMany (Substitution.substInContext s1 cx) tl) (\result2 ->  
-                      let e2 = (Pairs.first result2)
-                      in  
-                        let t2 = (Pairs.first (Pairs.second result2))
-                        in  
-                          let s2 = (Pairs.second (Pairs.second result2))
-                          in (Flows.pure (Lists.cons (Substitution.substTypesInTerm s2 e1) e2, (Lists.cons (Substitution.substInType s2 t1) t2, (Substitution.composeTypeSubst s1 s2))))))))
-  in (Logic.ifElse (Lists.null pairs) (Flows.pure ([], ([], Substitution.idTypeSubst))) dflt)
-
--- | Infer the type of an annotated term
-inferTypeOfAnnotatedTerm :: (Typing_.InferenceContext -> Core.AnnotatedTerm -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfAnnotatedTerm cx at =  
-  let term = (Core.annotatedTermBody at)
-  in  
-    let ann = (Core.annotatedTermAnnotation at)
-    in (Flows.bind (inferTypeOfTerm cx term "annotated term") (\result ->  
-      let iterm = (Typing_.inferenceResultTerm result)
-      in  
-        let itype = (Typing_.inferenceResultType result)
-        in  
-          let isubst = (Typing_.inferenceResultSubst result)
-          in  
-            let iconstraints = (Typing_.inferenceResultClassConstraints result)
-            in (Flows.pure (Typing_.InferenceResult {
-              Typing_.inferenceResultTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = iterm,
-                Core.annotatedTermAnnotation = ann})),
-              Typing_.inferenceResultType = itype,
-              Typing_.inferenceResultSubst = isubst,
-              Typing_.inferenceResultClassConstraints = iconstraints}))))
-
--- | Infer the type of a function application
-inferTypeOfApplication :: (Typing_.InferenceContext -> Core.Application -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfApplication cx app =  
-  let e0 = (Core.applicationFunction app)
-  in  
-    let e1 = (Core.applicationArgument app)
-    in (Flows.bind (inferTypeOfTerm cx e0 "lhs") (\lhsResult ->  
-      let a = (Typing_.inferenceResultTerm lhsResult)
-      in  
-        let t0 = (Typing_.inferenceResultType lhsResult)
-        in  
-          let s0 = (Typing_.inferenceResultSubst lhsResult)
-          in  
-            let c0 = (Typing_.inferenceResultClassConstraints lhsResult)
-            in (Flows.bind (inferTypeOfTerm (Substitution.substInContext s0 cx) e1 "rhs") (\rhsResult ->  
-              let b = (Typing_.inferenceResultTerm rhsResult)
-              in  
-                let t1 = (Typing_.inferenceResultType rhsResult)
-                in  
-                  let s1 = (Typing_.inferenceResultSubst rhsResult)
-                  in  
-                    let c1 = (Typing_.inferenceResultClassConstraints rhsResult)
-                    in (Flows.bind Schemas.freshName (\v -> Flows.bind (Unification.unifyTypes (Typing_.inferenceContextSchemaTypes cx) (Substitution.substInType s1 t0) (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = t1,
-                      Core.functionTypeCodomain = (Core.TypeVariable v)})) "application lhs") (\s2 -> Flows.bind (Checking.checkTypeSubst cx s2) (\_ ->  
-                      let rExpr = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Substitution.substTypesInTerm (Substitution.composeTypeSubst s1 s2) a),
-                              Core.applicationArgument = (Substitution.substTypesInTerm s2 b)}))
-                      in  
-                        let rType = (Substitution.substInType s2 (Core.TypeVariable v))
-                        in  
-                          let rSubst = (Substitution.composeTypeSubstList [
-                                  s0,
-                                  s1,
-                                  s2])
-                          in  
-                            let c0Subst = (Substitution.substInClassConstraints s2 (Substitution.substInClassConstraints s1 c0))
-                            in  
-                              let c1Subst = (Substitution.substInClassConstraints s2 c1)
-                              in  
-                                let rConstraints = (mergeClassConstraints c0Subst c1Subst)
-                                in (Flows.pure (Typing_.InferenceResult {
-                                  Typing_.inferenceResultTerm = rExpr,
-                                  Typing_.inferenceResultType = rType,
-                                  Typing_.inferenceResultSubst = rSubst,
-                                  Typing_.inferenceResultClassConstraints = rConstraints}))))))))))
-
--- | Infer the type of a case statement
-inferTypeOfCaseStatement :: (Typing_.InferenceContext -> Core.CaseStatement -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfCaseStatement cx caseStmt =  
-  let tname = (Core.caseStatementTypeName caseStmt)
-  in  
-    let dflt = (Core.caseStatementDefault caseStmt)
-    in  
-      let cases = (Core.caseStatementCases caseStmt)
-      in  
-        let fnames = (Lists.map Core.fieldName cases)
-        in (Flows.bind (Schemas.requireSchemaType cx tname) (\schemaType ->  
-          let svars = (Core.typeSchemeVariables schemaType)
-          in  
-            let stype = (Core.typeSchemeType schemaType)
-            in (Flows.bind (Core_.unionType tname stype) (\sfields -> Flows.bind (Flows.mapMaybe (\t -> inferTypeOfTerm cx t (Strings.cat [
-              "case ",
-              (Core.unName tname),
-              ".<default>"])) dflt) (\dfltResult -> Flows.bind (inferMany cx (Lists.map (\f -> (Core.fieldTerm f, (Strings.cat [
-              "case ",
-              (Core.unName tname),
-              ".",
-              (Core.unName (Core.fieldName f))]))) cases)) (\caseResults ->  
-              let iterms = (Pairs.first caseResults)
-              in  
-                let itypes = (Pairs.first (Pairs.second caseResults))
-                in  
-                  let isubst = (Pairs.second (Pairs.second caseResults))
-                  in (Flows.bind Schemas.freshName (\codv ->  
-                    let cod = (Core.TypeVariable codv)
-                    in  
-                      let caseMap = (Maps.fromList (Lists.map (\ft -> (Core.fieldTypeName ft, (Core.fieldTypeType ft))) sfields))
-                      in  
-                        let dfltConstraints = (Monads.maybeToList (Maybes.map (\r -> Typing_.TypeConstraint {
-                                Typing_.typeConstraintLeft = cod,
-                                Typing_.typeConstraintRight = (Substitution.substInType isubst (Typing_.inferenceResultType r)),
-                                Typing_.typeConstraintComment = "match default"}) dfltResult))
-                        in  
-                          let caseConstraints = (Maybes.cat (Lists.zipWith (\fname -> \itype -> Maybes.map (\ftype -> Typing_.TypeConstraint {
-                                  Typing_.typeConstraintLeft = itype,
-                                  Typing_.typeConstraintRight = (Core.TypeFunction (Core.FunctionType {
-                                    Core.functionTypeDomain = ftype,
-                                    Core.functionTypeCodomain = cod})),
-                                  Typing_.typeConstraintComment = "case type"}) (Maps.lookup fname caseMap)) fnames itypes))
-                          in (mapConstraints cx (\subst -> yield (buildTypeApplicationTerm svars (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = tname,
-                            Core.caseStatementDefault = (Maybes.map Typing_.inferenceResultTerm dfltResult),
-                            Core.caseStatementCases = (Lists.zipWith (\n -> \t -> Core.Field {
-                              Core.fieldName = n,
-                              Core.fieldTerm = t}) fnames iterms)}))))) (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)),
-                            Core.functionTypeCodomain = cod})) (Substitution.composeTypeSubstList (Lists.concat [
-                            Monads.maybeToList (Maybes.map Typing_.inferenceResultSubst dfltResult),
-                            [
-                              isubst,
-                              subst]]))) (Lists.concat [
-                            dfltConstraints,
-                            caseConstraints]))))))))))
-
--- | Infer the type of a collection
-inferTypeOfCollection :: (Typing_.InferenceContext -> (Core.Type -> Core.Type) -> ([Core.Term] -> Core.Term) -> String -> [Core.Term] -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfCollection cx typCons trmCons desc els = (Flows.bind Schemas.freshName (\var -> Logic.ifElse (Lists.null els) (Flows.pure (yield (buildTypeApplicationTerm [
-  var] (trmCons [])) (typCons (Core.TypeVariable var)) Substitution.idTypeSubst)) (Flows.bind (inferMany cx (Lists.zip els (Lists.map (\i -> Strings.cat [
-  "#",
-  (Literals.showInt32 i)]) (Math.range 1 (Math.add (Lists.length els) 1))))) (\results ->  
-  let terms = (Pairs.first results)
-  in  
-    let types = (Pairs.first (Pairs.second results))
-    in  
-      let subst1 = (Pairs.second (Pairs.second results))
-      in  
-        let constraints = (Lists.map (\t -> Typing_.TypeConstraint {
-                Typing_.typeConstraintLeft = (Core.TypeVariable var),
-                Typing_.typeConstraintRight = t,
-                Typing_.typeConstraintComment = desc}) types)
-        in (mapConstraints cx (\subst2 ->  
-          let iterm = (trmCons terms)
-          in  
-            let itype = (typCons (Core.TypeVariable var))
-            in  
-              let isubst = (Substitution.composeTypeSubst subst1 subst2)
-              in (yield iterm itype isubst)) constraints)))))
-
--- | Infer the type of a term and return a type scheme
-inferTypeOf :: (Typing_.InferenceContext -> Core.Term -> Compute.Flow t0 (Core.Term, Core.TypeScheme))
-inferTypeOf cx term =  
-  let letTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "ignoredVariableName"),
-              Core.bindingTerm = term,
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermLiteral (Core.LiteralString "ignoredBody"))}))
-  in  
-    let forBindings = (\bindings ->  
-            let binding = (Lists.head bindings)
-            in  
-              let term1 = (Core.bindingTerm binding)
-              in  
-                let mts = (Core.bindingType binding)
-                in (Maybes.maybe (Flows.fail "Expected a type scheme") (\ts -> Flows.pure (term1, ts)) mts))
-    in  
-      let unifyAndSubst = (\result ->  
-              let subst = (Typing_.inferenceResultSubst result)
-              in (Flows.bind (finalizeInferredTerm cx (Typing_.inferenceResultTerm result)) (\finalized -> Flows.bind (Lexical.withEmptyGraph (Core_.let_ finalized)) (\letResult ->  
-                let bindings = (Core.letBindings letResult)
-                in (Logic.ifElse (Equality.equal 1 (Lists.length bindings)) (forBindings bindings) (Flows.fail (Strings.cat [
-                  "Expected a single binding with a type scheme, but got: ",
-                  (Literals.showInt32 (Lists.length bindings)),
-                  " bindings"])))))))
-      in (Flows.bind (inferTypeOfTerm cx letTerm "infer type of term") (\result -> unifyAndSubst result))
-
--- | Infer the type of an either value
-inferTypeOfEither :: (Typing_.InferenceContext -> Either Core.Term Core.Term -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfEither cx e = (Eithers.either (\l -> Flows.bind (inferTypeOfTerm cx l "either left value") (\r1 ->  
-  let iterm = (Typing_.inferenceResultTerm r1)
-  in  
-    let leftType = (Typing_.inferenceResultType r1)
-    in  
-      let subst = (Typing_.inferenceResultSubst r1)
-      in (Flows.bind freshVariableType (\rightType ->  
-        let eitherTerm = (Core.TermEither (Left iterm))
-        in  
-          let termWithLeftType = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = eitherTerm,
-                  Core.typeApplicationTermType = leftType}))
-          in  
-            let termWithBothTypes = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = termWithLeftType,
-                    Core.typeApplicationTermType = rightType}))
-            in  
-              let eitherType = (Core.TypeEither (Core.EitherType {
-                      Core.eitherTypeLeft = leftType,
-                      Core.eitherTypeRight = rightType}))
-              in (yieldChecked termWithBothTypes eitherType subst))))) (\r -> Flows.bind (inferTypeOfTerm cx r "either right value") (\r1 ->  
-  let iterm = (Typing_.inferenceResultTerm r1)
-  in  
-    let rightType = (Typing_.inferenceResultType r1)
-    in  
-      let subst = (Typing_.inferenceResultSubst r1)
-      in (Flows.bind freshVariableType (\leftType ->  
-        let eitherTerm = (Core.TermEither (Right iterm))
-        in  
-          let termWithLeftType = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = eitherTerm,
-                  Core.typeApplicationTermType = leftType}))
-          in  
-            let termWithBothTypes = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = termWithLeftType,
-                    Core.typeApplicationTermType = rightType}))
-            in  
-              let eitherType = (Core.TypeEither (Core.EitherType {
-                      Core.eitherTypeLeft = leftType,
-                      Core.eitherTypeRight = rightType}))
-              in (yieldChecked termWithBothTypes eitherType subst))))) e)
-
--- | Infer the type of an elimination
-inferTypeOfElimination :: (Typing_.InferenceContext -> Core.Elimination -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfElimination cx elm = ((\x -> case x of
-  Core.EliminationRecord v1 -> (inferTypeOfProjection cx v1)
-  Core.EliminationUnion v1 -> (inferTypeOfCaseStatement cx v1)
-  Core.EliminationWrap v1 -> (inferTypeOfUnwrap cx v1)) elm)
-
--- | Infer the type of a function
-inferTypeOfFunction :: (Typing_.InferenceContext -> Core.Function -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfFunction cx f = ((\x -> case x of
-  Core.FunctionElimination v1 -> (inferTypeOfElimination cx v1)
-  Core.FunctionLambda v1 -> (inferTypeOfLambda cx v1)
-  Core.FunctionPrimitive v1 -> (inferTypeOfPrimitive cx v1)) f)
-
--- | Infer the type of a union injection
-inferTypeOfInjection :: (Typing_.InferenceContext -> Core.Injection -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfInjection cx injection =  
-  let tname = (Core.injectionTypeName injection)
-  in  
-    let field = (Core.injectionField injection)
-    in  
-      let fname = (Core.fieldName field)
-      in  
-        let term = (Core.fieldTerm field)
-        in (Flows.bind (inferTypeOfTerm cx term "injected term") (\result -> Flows.bind (Schemas.requireSchemaType cx tname) (\schemaType ->  
-          let svars = (Core.typeSchemeVariables schemaType)
-          in  
-            let stype = (Core.typeSchemeType schemaType)
-            in  
-              let iterm = (Typing_.inferenceResultTerm result)
-              in  
-                let ityp = (Typing_.inferenceResultType result)
-                in  
-                  let isubst = (Typing_.inferenceResultSubst result)
-                  in (Flows.bind (Core_.unionType tname stype) (\sfields -> Flows.bind (Schemas.findFieldType fname sfields) (\ftyp -> mapConstraints cx (\subst -> yield (buildTypeApplicationTerm svars (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = tname,
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = fname,
-                      Core.fieldTerm = iterm}}))) (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)) (Substitution.composeTypeSubst isubst subst)) [
-                    Typing_.TypeConstraint {
-                      Typing_.typeConstraintLeft = ftyp,
-                      Typing_.typeConstraintRight = ityp,
-                      Typing_.typeConstraintComment = "schema type of injected field"}]))))))
-
--- | Infer the type of a lambda function
-inferTypeOfLambda :: (Typing_.InferenceContext -> Core.Lambda -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfLambda cx lambda =  
-  let var = (Core.lambdaParameter lambda)
-  in  
-    let body = (Core.lambdaBody lambda)
-    in (Flows.bind Schemas.freshName (\vdom ->  
-      let dom = (Core.TypeVariable vdom)
-      in  
-        let cx2 = (extendContext [
-                (var, Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = dom,
-                  Core.typeSchemeConstraints = Nothing})] cx)
-        in (Flows.bind (inferTypeOfTerm cx2 body "lambda body") (\result ->  
-          let iterm = (Typing_.inferenceResultTerm result)
-          in  
-            let icod = (Typing_.inferenceResultType result)
-            in  
-              let isubst = (Typing_.inferenceResultSubst result)
-              in  
-                let rdom = (Substitution.substInType isubst dom)
-                in  
-                  let rterm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = var,
-                          Core.lambdaDomain = (Just rdom),
-                          Core.lambdaBody = iterm})))
-                  in  
-                    let rtype = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = rdom,
-                            Core.functionTypeCodomain = icod}))
-                    in  
-                      let vars = (Sets.unions [
-                              Rewriting.freeVariablesInType rdom,
-                              (Rewriting.freeVariablesInType icod),
-                              (freeVariablesInContext (Substitution.substInContext isubst cx2))])
-                      in  
-                        let cx3 = (Substitution.substInContext isubst cx)
-                        in  
-                          let iconstraints = (Substitution.substInClassConstraints isubst (Typing_.inferenceResultClassConstraints result))
-                          in (Flows.pure (Typing_.InferenceResult {
-                            Typing_.inferenceResultTerm = rterm,
-                            Typing_.inferenceResultType = rtype,
-                            Typing_.inferenceResultSubst = isubst,
-                            Typing_.inferenceResultClassConstraints = iconstraints}))))))
-
--- | Infer the type of a let (letrec) term which is already in a normal form
-inferTypeOfLetNormalized :: (Typing_.InferenceContext -> Core.Let -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfLetNormalized cx0 letTerm =  
-  let bins0 = (Core.letBindings letTerm)
-  in  
-    let body0 = (Core.letBody letTerm)
-    in  
-      let bnames = (Lists.map Core.bindingName bins0)
-      in (Flows.bind (Schemas.freshNames (Lists.length bins0)) (\bvars ->  
-        let tbins0 = (Lists.map (\x -> Core.TypeVariable x) bvars)
-        in  
-          let cx1 = (extendContext (Lists.zip bnames (Lists.map (\t -> Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = t,
-                  Core.typeSchemeConstraints = Nothing}) tbins0)) cx0)
-          in (Flows.bind (inferTypesOfTemporaryBindings cx1 bins0) (\inferredResult ->  
-            let bterms1 = (Pairs.first inferredResult)
-            in  
-              let tbins1 = (Pairs.first (Pairs.second inferredResult))
-              in  
-                let substAndConstraints = (Pairs.second (Pairs.second inferredResult))
-                in  
-                  let s1 = (Pairs.first substAndConstraints)
-                  in  
-                    let inferredConstraints = (Pairs.second substAndConstraints)
-                    in (Flows.bind (Unification.unifyTypeLists (Typing_.inferenceContextSchemaTypes cx0) (Lists.map (Substitution.substInType s1) tbins0) tbins1 "temporary type bindings") (\s2 -> Flows.bind (Checking.checkTypeSubst cx0 s2) (\_ ->  
-                      let g2base = (Substitution.substInContext (Substitution.composeTypeSubst s1 s2) cx0)
-                      in  
-                        let constraintsWithS2 = (Substitution.substInClassConstraints s2 inferredConstraints)
-                        in  
-                          let composedSubst = (Substitution.composeTypeSubst s1 s2)
-                          in  
-                            let originalBindingConstraints = (Lists.foldl (\acc -> \b -> Maybes.maybe acc (\ts -> Maybes.maybe acc (\c -> mergeClassConstraints acc c) (Core.typeSchemeConstraints ts)) (Core.bindingType b)) Maps.empty bins0)
-                            in  
-                              let originalConstraintsSubst = (Substitution.substInClassConstraints composedSubst originalBindingConstraints)
-                              in  
-                                let allInferredConstraints = (mergeClassConstraints constraintsWithS2 originalConstraintsSubst)
-                                in  
-                                  let mergedConstraints = (mergeClassConstraints (Typing_.inferenceContextClassConstraints g2base) allInferredConstraints)
-                                  in  
-                                    let g2 = Typing_.InferenceContext {
-                                            Typing_.inferenceContextSchemaTypes = (Typing_.inferenceContextSchemaTypes g2base),
-                                            Typing_.inferenceContextPrimitiveTypes = (Typing_.inferenceContextPrimitiveTypes g2base),
-                                            Typing_.inferenceContextDataTypes = (Typing_.inferenceContextDataTypes g2base),
-                                            Typing_.inferenceContextClassConstraints = mergedConstraints,
-                                            Typing_.inferenceContextDebug = (Typing_.inferenceContextDebug g2base)}
-                                    in  
-                                      let bterms1Subst = (Lists.map (Substitution.substTypesInTerm s2) bterms1)
-                                      in  
-                                        let tsbins1 = (Lists.zip bnames (Lists.map (\t -> generalize g2 (Substitution.substInType s2 t)) tbins1))
-                                        in (Flows.bind (inferTypeOfTerm (extendContext tsbins1 g2) body0 "let body") (\bodyResult ->  
-                                          let body1 = (Typing_.inferenceResultTerm bodyResult)
-                                          in  
-                                            let tbody = (Typing_.inferenceResultType bodyResult)
-                                            in  
-                                              let sbody = (Typing_.inferenceResultSubst bodyResult)
-                                              in  
-                                                let st1 = (Typing_.TermSubst (Maps.fromList (Lists.map (\pair ->  
-                                                        let name = (Pairs.first pair)
-                                                        in  
-                                                          let ts = (Pairs.second pair)
-                                                          in (name, (buildTypeApplicationTerm (Core.typeSchemeVariables ts) (Core.TermVariable name)))) tsbins1)))
-                                                in  
-                                                  let createBinding = (\bindingPair ->  
-                                                          let nameTsPair = (Pairs.first bindingPair)
-                                                          in  
-                                                            let term = (Pairs.second bindingPair)
-                                                            in  
-                                                              let name = (Pairs.first nameTsPair)
-                                                              in  
-                                                                let ts = (Pairs.second nameTsPair)
-                                                                in  
-                                                                  let finalTs = (Substitution.substInTypeScheme sbody ts)
-                                                                  in  
-                                                                    let typeLambdaTerm = (Lists.foldl (\b -> \v -> Core.TermTypeLambda (Core.TypeLambda {
-                                                                            Core.typeLambdaParameter = v,
-                                                                            Core.typeLambdaBody = b})) (Substitution.substituteInTerm st1 term) (Lists.reverse (Core.typeSchemeVariables finalTs)))
-                                                                    in Core.Binding {
-                                                                      Core.bindingName = name,
-                                                                      Core.bindingTerm = (Substitution.substTypesInTerm (Substitution.composeTypeSubst sbody s2) typeLambdaTerm),
-                                                                      Core.bindingType = (Just finalTs)})
-                                                  in  
-                                                    let bins1 = (Lists.map createBinding (Lists.zip tsbins1 bterms1Subst))
-                                                    in  
-                                                      let bodyConstraints = (Substitution.substInClassConstraints sbody (Typing_.inferenceResultClassConstraints bodyResult))
-                                                      in  
-                                                        let bindingConstraintsSubst = (Substitution.substInClassConstraints sbody constraintsWithS2)
-                                                        in  
-                                                          let allConstraints = (mergeClassConstraints bindingConstraintsSubst bodyConstraints)
-                                                          in  
-                                                            let ret = Typing_.InferenceResult {
-                                                                    Typing_.inferenceResultTerm = (Core.TermLet (Core.Let {
-                                                                      Core.letBindings = bins1,
-                                                                      Core.letBody = body1})),
-                                                                    Typing_.inferenceResultType = tbody,
-                                                                    Typing_.inferenceResultSubst = (Substitution.composeTypeSubstList [
-                                                                      s1,
-                                                                      s2,
-                                                                      sbody]),
-                                                                    Typing_.inferenceResultClassConstraints = allConstraints}
-                                                            in (Flows.pure ret))))))))))
-
--- | Normalize a let term before inferring its type
-inferTypeOfLet :: (Typing_.InferenceContext -> Core.Let -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfLet cx let0 =  
-  let bindings0 = (Core.letBindings let0)
-  in  
-    let body0 = (Core.letBody let0)
-    in  
-      let names = (Lists.map Core.bindingName bindings0)
-      in  
-        let nameSet = (Sets.fromList names)
-        in  
-          let toPair = (\binding ->  
-                  let name = (Core.bindingName binding)
-                  in  
-                    let term = (Core.bindingTerm binding)
-                    in (name, (Lists.filter (\n -> Sets.member n nameSet) (Sets.toList (Rewriting.freeVariablesInTerm term)))))
-          in  
-            let adjList = (Lists.map toPair bindings0)
-            in  
-              let groups = (Sorting.topologicalSortComponents adjList)
-              in  
-                let bindingMap = (Maps.fromList (Lists.zip names bindings0))
-                in  
-                  let createLet = (\e -> \group -> Core.TermLet (Core.Let {
-                          Core.letBindings = (Maybes.cat (Lists.map (\n -> Maps.lookup n bindingMap) group)),
-                          Core.letBody = e}))
-                  in  
-                    let rewrittenLet = (Lists.foldl createLet body0 (Lists.reverse groups))
-                    in  
-                      let restoreLet = (\iterm ->  
-                              let helper = (\level -> \bins -> \term ->  
-                                      let nonzero = (\term -> (\x -> case x of
-                                              Core.TermLet v1 ->  
-                                                let bs = (Core.letBindings v1)
-                                                in  
-                                                  let letBody = (Core.letBody v1)
-                                                  in (helper (Math.sub level 1) (Lists.concat [
-                                                    bs,
-                                                    bins]) letBody)) term)
-                                      in (Logic.ifElse (Equality.equal level 0) (bins, term) (nonzero term)))
-                              in  
-                                let result = (helper (Lists.length groups) [] iterm)
-                                in  
-                                  let bindingList = (Pairs.first result)
-                                  in  
-                                    let e = (Pairs.second result)
-                                    in  
-                                      let bindingMap2 = (Maps.fromList (Lists.map (\b -> (Core.bindingName b, b)) bindingList))
-                                      in (Core.TermLet (Core.Let {
-                                        Core.letBindings = (Maybes.cat (Lists.map (\n -> Maps.lookup n bindingMap2) names)),
-                                        Core.letBody = e})))
-                      in  
-                        let rewriteResult = (\result ->  
-                                let iterm = (Typing_.inferenceResultTerm result)
-                                in  
-                                  let itype = (Typing_.inferenceResultType result)
-                                  in  
-                                    let isubst = (Typing_.inferenceResultSubst result)
-                                    in  
-                                      let iconstraints = (Typing_.inferenceResultClassConstraints result)
-                                      in Typing_.InferenceResult {
-                                        Typing_.inferenceResultTerm = (restoreLet iterm),
-                                        Typing_.inferenceResultType = itype,
-                                        Typing_.inferenceResultSubst = isubst,
-                                        Typing_.inferenceResultClassConstraints = iconstraints})
-                        in  
-                          let res = ((\x -> case x of
-                                  Core.TermLet v1 -> (inferTypeOfLetNormalized cx v1)
-                                  _ -> (inferTypeOfTerm cx rewrittenLet "empty let term")) rewrittenLet)
-                          in (Flows.map rewriteResult res)
-
--- | Infer the type of a list
-inferTypeOfList :: (Typing_.InferenceContext -> [Core.Term] -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfList cx = (inferTypeOfCollection cx (\x -> Core.TypeList x) (\x -> Core.TermList x) "list element")
-
--- | Infer the type of a literal
-inferTypeOfLiteral :: (t0 -> Core.Literal -> Compute.Flow t1 Typing_.InferenceResult)
-inferTypeOfLiteral _ lit = (Flows.pure (Typing_.InferenceResult {
-  Typing_.inferenceResultTerm = (Core.TermLiteral lit),
-  Typing_.inferenceResultType = (Core.TypeLiteral (Reflect.literalType lit)),
-  Typing_.inferenceResultSubst = Substitution.idTypeSubst,
-  Typing_.inferenceResultClassConstraints = Maps.empty}))
-
--- | Infer the type of a map
-inferTypeOfMap :: (Typing_.InferenceContext -> M.Map Core.Term Core.Term -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfMap cx m = (Flows.bind Schemas.freshName (\kvar -> Flows.bind Schemas.freshName (\vvar -> Logic.ifElse (Maps.null m) (Flows.pure (yield (buildTypeApplicationTerm [
-  kvar,
-  vvar] (Core.TermMap Maps.empty)) (Core.TypeMap (Core.MapType {
-  Core.mapTypeKeys = (Core.TypeVariable kvar),
-  Core.mapTypeValues = (Core.TypeVariable vvar)})) Substitution.idTypeSubst)) (Flows.bind (inferMany cx (Lists.map (\k -> (k, "map key")) (Maps.keys m))) (\kresults ->  
-  let kterms = (Pairs.first kresults)
-  in  
-    let ktypes = (Pairs.first (Pairs.second kresults))
-    in  
-      let ksubst = (Pairs.second (Pairs.second kresults))
-      in (Flows.bind (inferMany cx (Lists.map (\v -> (v, "map value")) (Maps.elems m))) (\vresults ->  
-        let vterms = (Pairs.first vresults)
-        in  
-          let vtypes = (Pairs.first (Pairs.second vresults))
-          in  
-            let vsubst = (Pairs.second (Pairs.second vresults))
-            in  
-              let kcons = (Lists.map (\t -> Typing_.TypeConstraint {
-                      Typing_.typeConstraintLeft = (Core.TypeVariable kvar),
-                      Typing_.typeConstraintRight = t,
-                      Typing_.typeConstraintComment = "map key"}) ktypes)
-              in  
-                let vcons = (Lists.map (\t -> Typing_.TypeConstraint {
-                        Typing_.typeConstraintLeft = (Core.TypeVariable vvar),
-                        Typing_.typeConstraintRight = t,
-                        Typing_.typeConstraintComment = "map value"}) vtypes)
-                in (mapConstraints cx (\subst -> yield (Core.TermMap (Maps.fromList (Lists.zip kterms vterms))) (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable kvar),
-                  Core.mapTypeValues = (Core.TypeVariable vvar)})) (Substitution.composeTypeSubstList [
-                  ksubst,
-                  vsubst,
-                  subst])) (Lists.concat [
-                  kcons,
-                  vcons])))))))))
-
--- | Infer the type of an optional
-inferTypeOfOptional :: (Typing_.InferenceContext -> Maybe Core.Term -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfOptional cx m =  
-  let trmCons = (\terms -> Logic.ifElse (Lists.null terms) (Core.TermMaybe Nothing) (Core.TermMaybe (Just (Lists.head terms))))
-  in (inferTypeOfCollection cx (\x -> Core.TypeMaybe x) trmCons "optional element" (Maybes.maybe [] Lists.singleton m))
-
--- | Infer the type of a pair
-inferTypeOfPair :: (Typing_.InferenceContext -> (Core.Term, Core.Term) -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfPair cx p = (Flows.map (\results ->  
-  let iterms = (Pairs.first results)
-  in  
-    let itypes = (Pairs.first (Pairs.second results))
-    in  
-      let isubst = (Pairs.second (Pairs.second results))
-      in  
-        let ifst = (Lists.head iterms)
-        in  
-          let isnd = (Lists.head (Lists.tail iterms))
-          in  
-            let tyFst = (Lists.head itypes)
-            in  
-              let tySnd = (Lists.head (Lists.tail itypes))
-              in  
-                let pairTerm = (Core.TermPair (ifst, isnd))
-                in  
-                  let termWithTypes = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = pairTerm,
-                            Core.typeApplicationTermType = tyFst})),
-                          Core.typeApplicationTermType = tySnd}))
-                  in (yield termWithTypes (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = tyFst,
-                    Core.pairTypeSecond = tySnd})) isubst)) (inferMany cx [
-  (Pairs.first p, "pair first element"),
-  (Pairs.second p, "pair second element")]))
-
--- | Infer the type of a primitive function. Class constraints from the primitive's type scheme are propagated to the inference result.
-inferTypeOfPrimitive :: (Typing_.InferenceContext -> Core.Name -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfPrimitive cx name = (Maybes.maybe (Flows.fail (Strings.cat2 "No such primitive: " (Core.unName name))) (\scheme -> Flows.bind (Schemas.instantiateTypeScheme scheme) (\ts ->  
-  let constraints = (Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints ts))
-  in (yieldCheckedWithConstraints (buildTypeApplicationTerm (Core.typeSchemeVariables ts) (Core.TermFunction (Core.FunctionPrimitive name))) (Core.typeSchemeType ts) Substitution.idTypeSubst constraints))) (Maps.lookup name (Typing_.inferenceContextPrimitiveTypes cx)))
-
--- | Infer the type of a record projection
-inferTypeOfProjection :: (Typing_.InferenceContext -> Core.Projection -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfProjection cx proj =  
-  let tname = (Core.projectionTypeName proj)
-  in  
-    let fname = (Core.projectionField proj)
-    in (Flows.bind (Schemas.requireSchemaType cx tname) (\schemaType ->  
-      let svars = (Core.typeSchemeVariables schemaType)
-      in  
-        let stype = (Core.typeSchemeType schemaType)
-        in (Flows.bind (Core_.recordType tname stype) (\sfields -> Flows.bind (Schemas.findFieldType fname sfields) (\ftyp -> Flows.pure (yield (buildTypeApplicationTerm svars (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = tname,
-          Core.projectionField = fname}))))) (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)),
-          Core.functionTypeCodomain = ftyp})) Substitution.idTypeSubst))))))
-
--- | Infer the type of a record
-inferTypeOfRecord :: (Typing_.InferenceContext -> Core.Record -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfRecord cx record =  
-  let tname = (Core.recordTypeName record)
-  in  
-    let fields = (Core.recordFields record)
-    in  
-      let fnames = (Lists.map Core.fieldName fields)
-      in (Flows.bind (Schemas.requireSchemaType cx tname) (\schemaType -> Flows.bind (inferMany cx (Lists.map (\f -> (Core.fieldTerm f, (Strings.cat2 "field " (Core.unName (Core.fieldName f))))) fields)) (\results ->  
-        let svars = (Core.typeSchemeVariables schemaType)
-        in  
-          let stype = (Core.typeSchemeType schemaType)
-          in  
-            let iterms = (Pairs.first results)
-            in  
-              let itypes = (Pairs.first (Pairs.second results))
-              in  
-                let isubst = (Pairs.second (Pairs.second results))
-                in  
-                  let ityp = (Core.TypeRecord (Core.RowType {
-                          Core.rowTypeTypeName = tname,
-                          Core.rowTypeFields = (Lists.zipWith (\n -> \t -> Core.FieldType {
-                            Core.fieldTypeName = n,
-                            Core.fieldTypeType = t}) fnames itypes)}))
-                  in (mapConstraints cx (\subst -> yield (buildTypeApplicationTerm svars (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = tname,
-                    Core.recordFields = (Lists.zipWith (\n -> \t -> Core.Field {
-                      Core.fieldName = n,
-                      Core.fieldTerm = t}) fnames iterms)}))) (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)) (Substitution.composeTypeSubst isubst subst)) [
-                    Typing_.TypeConstraint {
-                      Typing_.typeConstraintLeft = stype,
-                      Typing_.typeConstraintRight = ityp,
-                      Typing_.typeConstraintComment = "schema type of record"}]))))
-
--- | Infer the type of a set
-inferTypeOfSet :: (Typing_.InferenceContext -> S.Set Core.Term -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfSet cx s = (inferTypeOfCollection cx (\x -> Core.TypeSet x) (\terms -> Core.TermSet (Sets.fromList terms)) "set element" (Sets.toList s))
-
--- | Infer the type of a given term
-inferTypeOfTerm :: (Typing_.InferenceContext -> Core.Term -> String -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfTerm cx term desc =  
-  let matchTerm = ((\x -> case x of
-          Core.TermAnnotated v1 -> (inferTypeOfAnnotatedTerm cx v1)
-          Core.TermApplication v1 -> (inferTypeOfApplication cx v1)
-          Core.TermEither v1 -> (inferTypeOfEither cx v1)
-          Core.TermFunction v1 -> (inferTypeOfFunction cx v1)
-          Core.TermLet v1 -> (inferTypeOfLet cx v1)
-          Core.TermList v1 -> (inferTypeOfList cx v1)
-          Core.TermLiteral v1 -> (inferTypeOfLiteral cx v1)
-          Core.TermMap v1 -> (inferTypeOfMap cx v1)
-          Core.TermMaybe v1 -> (inferTypeOfOptional cx v1)
-          Core.TermPair v1 -> (inferTypeOfPair cx v1)
-          Core.TermRecord v1 -> (inferTypeOfRecord cx v1)
-          Core.TermSet v1 -> (inferTypeOfSet cx v1)
-          Core.TermTypeApplication v1 -> (inferTypeOfTypeApplication cx v1)
-          Core.TermTypeLambda v1 -> (inferTypeOfTypeLambda cx v1)
-          Core.TermUnion v1 -> (inferTypeOfInjection cx v1)
-          Core.TermUnit -> (Flows.pure inferTypeOfUnit)
-          Core.TermVariable v1 -> (inferTypeOfVariable cx v1)
-          Core.TermWrap v1 -> (inferTypeOfWrappedTerm cx v1)) term)
-  in (Monads.withTrace desc matchTerm)
-
--- | Infer the type of a type abstraction; just pass through to the lambda body.
-inferTypeOfTypeLambda :: (Typing_.InferenceContext -> Core.TypeLambda -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfTypeLambda cx ta = (inferTypeOfTerm cx (Core.typeLambdaBody ta) "type abstraction")
-
--- | Infer the type of a type application; just pass through to the inner term.
-inferTypeOfTypeApplication :: (Typing_.InferenceContext -> Core.TypeApplicationTerm -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfTypeApplication cx tt = (inferTypeOfTerm cx (Core.typeApplicationTermBody tt) "type application term")
-
--- | The trivial inference rule for the unit term
-inferTypeOfUnit :: Typing_.InferenceResult
-inferTypeOfUnit = Typing_.InferenceResult {
-  Typing_.inferenceResultTerm = Core.TermUnit,
-  Typing_.inferenceResultType = Core.TypeUnit,
-  Typing_.inferenceResultSubst = Substitution.idTypeSubst,
-  Typing_.inferenceResultClassConstraints = Maps.empty}
-
--- | Infer the type of an unwrap operation
-inferTypeOfUnwrap :: (Typing_.InferenceContext -> Core.Name -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfUnwrap cx tname = (Flows.bind (Schemas.requireSchemaType cx tname) (\schemaType ->  
-  let svars = (Core.typeSchemeVariables schemaType)
-  in  
-    let stype = (Core.typeSchemeType schemaType)
-    in (Flows.bind (Core_.wrappedType tname stype) (\wtyp -> Flows.pure (yield (buildTypeApplicationTerm svars (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap tname)))) (Core.TypeFunction (Core.FunctionType {
-      Core.functionTypeDomain = (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)),
-      Core.functionTypeCodomain = wtyp})) Substitution.idTypeSubst)))))
-
--- | Infer the type of a variable
-inferTypeOfVariable :: (Typing_.InferenceContext -> Core.Name -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfVariable cx name = (Maybes.maybe (Flows.fail (Strings.cat2 "Variable not bound to type: " (Core.unName name))) (\scheme -> Flows.bind (Schemas.instantiateTypeScheme scheme) (\ts ->  
-  let constraints = (Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints ts))
-  in (Flows.pure (Typing_.InferenceResult {
-    Typing_.inferenceResultTerm = (buildTypeApplicationTerm (Core.typeSchemeVariables ts) (Core.TermVariable name)),
-    Typing_.inferenceResultType = (Core.typeSchemeType ts),
-    Typing_.inferenceResultSubst = Substitution.idTypeSubst,
-    Typing_.inferenceResultClassConstraints = constraints})))) (Maps.lookup name (Typing_.inferenceContextDataTypes cx)))
-
--- | Infer the type of a wrapped term
-inferTypeOfWrappedTerm :: (Typing_.InferenceContext -> Core.WrappedTerm -> Compute.Flow t0 Typing_.InferenceResult)
-inferTypeOfWrappedTerm cx wt =  
-  let tname = (Core.wrappedTermTypeName wt)
-  in  
-    let term = (Core.wrappedTermBody wt)
-    in (Flows.bind (Schemas.requireSchemaType cx tname) (\schemaType -> Flows.bind (inferTypeOfTerm cx term "wrapped term") (\result ->  
-      let svars = (Core.typeSchemeVariables schemaType)
-      in  
-        let stype = (Core.typeSchemeType schemaType)
-        in  
-          let iterm = (Typing_.inferenceResultTerm result)
-          in  
-            let itype = (Typing_.inferenceResultType result)
-            in  
-              let isubst = (Typing_.inferenceResultSubst result)
-              in  
-                let ityp = (Core.TypeWrap (Core.WrappedType {
-                        Core.wrappedTypeTypeName = tname,
-                        Core.wrappedTypeBody = itype}))
-                in (mapConstraints cx (\subst -> yield (buildTypeApplicationTerm svars (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = tname,
-                  Core.wrappedTermBody = iterm}))) (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)) (Substitution.composeTypeSubst isubst subst)) [
-                  Typing_.TypeConstraint {
-                    Typing_.typeConstraintLeft = stype,
-                    Typing_.typeConstraintRight = ityp,
-                    Typing_.typeConstraintComment = "schema type of wrapper"}]))))
-
--- | Infer types for temporary let bindings. Returns a 4-tuple of (terms, types, substitution, accumulated constraints)
-inferTypesOfTemporaryBindings :: (Typing_.InferenceContext -> [Core.Binding] -> Compute.Flow t0 ([Core.Term], ([Core.Type], (Typing_.TypeSubst, (M.Map Core.Name Core.TypeVariableMetadata)))))
-inferTypesOfTemporaryBindings cx bins =  
-  let dflt =  
-          let binding = (Lists.head bins)
-          in  
-            let k = (Core.bindingName binding)
-            in  
-              let v = (Core.bindingTerm binding)
-              in  
-                let tl = (Lists.tail bins)
-                in (Flows.bind (inferTypeOfTerm cx v (Strings.cat [
-                  "temporary let binding '",
-                  (Core.unName k),
-                  "'"])) (\result1 ->  
-                  let j = (Typing_.inferenceResultTerm result1)
-                  in  
-                    let u_prime = (Typing_.inferenceResultType result1)
-                    in  
-                      let u = (Typing_.inferenceResultSubst result1)
-                      in  
-                        let c1Inferred = (Typing_.inferenceResultClassConstraints result1)
-                        in (Flows.bind (Maybes.maybe (Flows.pure Maps.empty) (\ts -> Flows.bind (Schemas.instantiateTypeScheme ts) (\instantiatedTs ->  
-                          let freshConstraints = (Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints instantiatedTs))
-                          in (Flows.bind (Unification.unifyTypes (Typing_.inferenceContextSchemaTypes cx) (Core.typeSchemeType instantiatedTs) u_prime "original binding type") (\unifySubst -> Flows.pure (Substitution.substInClassConstraints unifySubst freshConstraints))))) (Core.bindingType binding)) (\originalBindingConstraints ->  
-                          let c1 = (mergeClassConstraints c1Inferred originalBindingConstraints)
-                          in (Flows.bind (inferTypesOfTemporaryBindings (Substitution.substInContext u cx) tl) (\result2 ->  
-                            let h = (Pairs.first result2)
-                            in  
-                              let r_prime = (Pairs.first (Pairs.second result2))
-                              in  
-                                let restPair = (Pairs.second (Pairs.second result2))
-                                in  
-                                  let r = (Pairs.first restPair)
-                                  in  
-                                    let c2 = (Pairs.second restPair)
-                                    in  
-                                      let c1Subst = (Substitution.substInClassConstraints r c1)
-                                      in  
-                                        let mergedConstraints = (mergeClassConstraints c1Subst c2)
-                                        in (Flows.pure (Lists.cons (Substitution.substTypesInTerm r j) h, (Lists.cons (Substitution.substInType r u_prime) r_prime, (Substitution.composeTypeSubst u r, mergedConstraints))))))))))
-  in (Logic.ifElse (Lists.null bins) (Flows.pure ([], ([], (Substitution.idTypeSubst, Maps.empty)))) dflt)
-
--- | Create an initial type context from a graph
-initialTypeContext :: (Graph.Graph -> Compute.Flow t0 Typing_.TypeContext)
-initialTypeContext g =  
-  let toPair = (\el ->  
-          let name = (Core.bindingName el)
-          in (Maybes.maybe (Flows.fail (Strings.cat2 "untyped element: " (Core.unName name))) (\ts -> Flows.pure (name, (Schemas.typeSchemeToFType ts))) (Core.bindingType el)))
-  in (Flows.bind (Schemas.graphToInferenceContext g) (\ix -> Flows.bind (Flows.map Maps.fromList (Flows.mapList toPair (Graph.graphElements g))) (\types -> Flows.pure (Typing_.TypeContext {
-    Typing_.typeContextTypes = types,
-    Typing_.typeContextMetadata = Maps.empty,
-    Typing_.typeContextTypeVariables = Sets.empty,
-    Typing_.typeContextLambdaVariables = Sets.empty,
-    Typing_.typeContextLetVariables = Sets.empty,
-    Typing_.typeContextInferenceContext = ix}))))
-
--- | Check if a variable is unbound in context
-isUnbound :: (Typing_.InferenceContext -> Core.Name -> Bool)
-isUnbound cx v = (Logic.and (Logic.not (Sets.member v (freeVariablesInContext cx))) (Logic.not (Maps.member v (Typing_.inferenceContextSchemaTypes cx))))
-
--- | Map over type constraints after unification
-mapConstraints :: (Typing_.InferenceContext -> (Typing_.TypeSubst -> t0) -> [Typing_.TypeConstraint] -> Compute.Flow t1 t0)
-mapConstraints cx f constraints = (Flows.bind (Unification.unifyTypeConstraints (Typing_.inferenceContextSchemaTypes cx) constraints) (\s -> Flows.bind (Checking.checkTypeSubst cx s) (\_ -> Flows.pure (f s))))
-
--- | Merge two maps of class constraints. When both maps have constraints for the same variable, union the class sets.
-mergeClassConstraints :: Ord t0 => (M.Map t0 Core.TypeVariableMetadata -> M.Map t0 Core.TypeVariableMetadata -> M.Map t0 Core.TypeVariableMetadata)
-mergeClassConstraints m1 m2 = (Lists.foldl (\acc -> \pair ->  
-  let k = (Pairs.first pair)
-  in  
-    let v = (Pairs.second pair)
-    in (Maybes.maybe (Maps.insert k v acc) (\existing ->  
-      let merged = Core.TypeVariableMetadata {
-              Core.typeVariableMetadataClasses = (Sets.union (Core.typeVariableMetadataClasses existing) (Core.typeVariableMetadataClasses v))}
-      in (Maps.insert k merged acc)) (Maps.lookup k acc))) m1 (Maps.toList m2))
-
--- | Show an inference result for debugging
-showInferenceResult :: (Typing_.InferenceResult -> String)
-showInferenceResult result =  
-  let term = (Typing_.inferenceResultTerm result)
-  in  
-    let typ = (Typing_.inferenceResultType result)
-    in  
-      let subst = (Typing_.inferenceResultSubst result)
-      in (Strings.cat [
-        "{term=",
-        (Core__.term term),
-        ", type=",
-        (Core__.type_ typ),
-        ", subst=",
-        (Typing.typeSubst subst),
-        "}"])
-
--- | Create an inference result with no class constraints
-yield :: (Core.Term -> Core.Type -> Typing_.TypeSubst -> Typing_.InferenceResult)
-yield term typ subst = Typing_.InferenceResult {
-  Typing_.inferenceResultTerm = (Substitution.substTypesInTerm subst term),
-  Typing_.inferenceResultType = (Substitution.substInType subst typ),
-  Typing_.inferenceResultSubst = subst,
-  Typing_.inferenceResultClassConstraints = Maps.empty}
-
--- | Create a checked inference result
-yieldChecked :: (Core.Term -> Core.Type -> Typing_.TypeSubst -> Compute.Flow t0 Typing_.InferenceResult)
-yieldChecked term typ subst =  
-  let iterm = (Substitution.substTypesInTerm subst term)
-  in  
-    let itype = (Substitution.substInType subst typ)
-    in (Flows.pure (Typing_.InferenceResult {
-      Typing_.inferenceResultTerm = iterm,
-      Typing_.inferenceResultType = itype,
-      Typing_.inferenceResultSubst = subst,
-      Typing_.inferenceResultClassConstraints = Maps.empty}))
-
--- | Create a checked inference result with class constraints
-yieldCheckedWithConstraints :: (Core.Term -> Core.Type -> Typing_.TypeSubst -> M.Map Core.Name Core.TypeVariableMetadata -> Compute.Flow t0 Typing_.InferenceResult)
-yieldCheckedWithConstraints term typ subst constraints =  
-  let iterm = (Substitution.substTypesInTerm subst term)
-  in  
-    let itype = (Substitution.substInType subst typ)
-    in  
-      let iconstraints = (Substitution.substInClassConstraints subst constraints)
-      in (Flows.pure (Typing_.InferenceResult {
-        Typing_.inferenceResultTerm = iterm,
-        Typing_.inferenceResultType = itype,
-        Typing_.inferenceResultSubst = subst,
-        Typing_.inferenceResultClassConstraints = iconstraints}))
-
--- | Create an inference result with debug output
-yieldDebug :: (t0 -> t1 -> Core.Term -> Core.Type -> Typing_.TypeSubst -> Compute.Flow t2 Typing_.InferenceResult)
-yieldDebug cx debugId term typ subst =  
-  let rterm = (Substitution.substTypesInTerm subst term)
-  in  
-    let rtyp = (Substitution.substInType subst typ)
-    in (Flows.bind (Annotations.debugIf debugId (Strings.cat [
-      "\n\tterm: ",
-      (Core__.term term),
-      "\n\ttyp: ",
-      (Core__.type_ typ),
-      "\n\tsubst: ",
-      (Typing.typeSubst subst),
-      "\n\trterm: ",
-      (Core__.term rterm),
-      "\n\trtyp: ",
-      (Core__.type_ rtyp)])) (\result -> Flows.pure (Typing_.InferenceResult {
-      Typing_.inferenceResultTerm = rterm,
-      Typing_.inferenceResultType = rtyp,
-      Typing_.inferenceResultSubst = subst,
-      Typing_.inferenceResultClassConstraints = Maps.empty})))
-
--- | Create an inference result with class constraints
-yieldWithConstraints :: (Core.Term -> Core.Type -> Typing_.TypeSubst -> M.Map Core.Name Core.TypeVariableMetadata -> Typing_.InferenceResult)
-yieldWithConstraints term typ subst constraints = Typing_.InferenceResult {
-  Typing_.inferenceResultTerm = (Substitution.substTypesInTerm subst term),
-  Typing_.inferenceResultType = (Substitution.substInType subst typ),
-  Typing_.inferenceResultSubst = subst,
-  Typing_.inferenceResultClassConstraints = constraints}
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Core as Core_
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Math as Math
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Reflect as Reflect
+import qualified Hydra.Rewriting as Rewriting
+import qualified Hydra.Schemas as Schemas
+import qualified Hydra.Show.Core as Core__
+import qualified Hydra.Show.Typing as Typing
+import qualified Hydra.Sorting as Sorting
+import qualified Hydra.Substitution as Substitution
+import qualified Hydra.Typing as Typing_
+import qualified Hydra.Unification as Unification
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Unify type constraints and check the substitution
+bindConstraints :: Context.Context -> Graph.Graph -> [Typing_.TypeConstraint] -> Either (Context.InContext Errors.Error) Typing_.TypeSubst
+bindConstraints flowCx cx constraints =
+    Eithers.bind (Eithers.bimap (\_ic -> Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unificationErrorMessage (Context.inContextObject _ic)))),
+      Context.inContextContext = (Context.inContextContext _ic)}) (\_a -> _a) (Unification.unifyTypeConstraints flowCx (Graph.graphSchemaTypes cx) constraints)) (\s -> Eithers.bind (Checking.checkTypeSubst flowCx cx s) (\_ -> Right s))
+
+-- | Place unbound type variables appearing anywhere under a typed let binding in the type scheme of that binding. These variables may appear in the binding type scheme itself or in that of a subterm, in domain types attached to functions, and in type abstraction and type application terms. This process attempts to capture type variables which have escaped unification, e.g. due to unused code. However, unbound type variables not appearing beneath any typed let binding remain unbound.
+bindUnboundTypeVariables :: Graph.Graph -> Core.Term -> Core.Term
+bindUnboundTypeVariables cx term0 =
+
+      let svars = Sets.fromList (Maps.keys (Graph.graphSchemaTypes cx))
+          rewrite =
+                  \recurse -> \term -> case term of
+                    Core.TermLet v0 ->
+                      let forBinding =
+                              \b ->
+                                let bname = Core.bindingName b
+                                    bterm = Core.bindingTerm b
+                                in (Maybes.maybe (Core.Binding {
+                                  Core.bindingName = bname,
+                                  Core.bindingTerm = (bindUnboundTypeVariables cx bterm),
+                                  Core.bindingType = Nothing}) (\ts ->
+                                  let bvars = Sets.fromList (Core.typeSchemeVariables ts)
+                                      unboundInType = Rewriting.freeVariablesInType (Core.typeSchemeType ts)
+                                      unboundInTerm = Rewriting.freeTypeVariablesInTerm bterm
+                                      unbound = Sets.toList (Sets.difference (Sets.union unboundInType unboundInTerm) (Sets.union svars bvars))
+                                      ts2 =
+                                              Core.TypeScheme {
+                                                Core.typeSchemeVariables = (Lists.concat2 (Core.typeSchemeVariables ts) unbound),
+                                                Core.typeSchemeType = (Core.typeSchemeType ts),
+                                                Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}
+                                      bterm2 =
+                                              Lists.foldl (\t -> \v -> Core.TermTypeLambda (Core.TypeLambda {
+                                                Core.typeLambdaParameter = v,
+                                                Core.typeLambdaBody = t})) bterm unbound
+                                  in Core.Binding {
+                                    Core.bindingName = bname,
+                                    Core.bindingTerm = bterm2,
+                                    Core.bindingType = (Just ts2)}) (Core.bindingType b))
+                      in (Core.TermLet (Core.Let {
+                        Core.letBindings = (Lists.map forBinding (Core.letBindings v0)),
+                        Core.letBody = (bindUnboundTypeVariables cx (Core.letBody v0))}))
+                    _ -> recurse term
+      in (Rewriting.rewriteTerm rewrite term0)
+
+-- | Fold a list of type variables over a term to build a type application term
+buildTypeApplicationTerm :: [Core.Name] -> Core.Term -> Core.Term
+buildTypeApplicationTerm tvars body =
+    Lists.foldl (\t -> \v -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+      Core.typeApplicationTermBody = t,
+      Core.typeApplicationTermType = (Core.TypeVariable v)})) body tvars
+
+-- | Add (term variable, type scheme) pairs to the graph's bound types
+extendContext :: [(Core.Name, Core.TypeScheme)] -> Graph.Graph -> Graph.Graph
+extendContext pairs cx =
+    Graph.Graph {
+      Graph.graphBoundTerms = (Graph.graphBoundTerms cx),
+      Graph.graphBoundTypes = (Maps.union (Maps.fromList pairs) (Graph.graphBoundTypes cx)),
+      Graph.graphClassConstraints = (Graph.graphClassConstraints cx),
+      Graph.graphLambdaVariables = (Graph.graphLambdaVariables cx),
+      Graph.graphMetadata = (Graph.graphMetadata cx),
+      Graph.graphPrimitives = (Graph.graphPrimitives cx),
+      Graph.graphSchemaTypes = (Graph.graphSchemaTypes cx),
+      Graph.graphTypeVariables = (Graph.graphTypeVariables cx)}
+
+-- | Finalize an inferred term by checking for unbound type variables, then normalizing type variables
+finalizeInferredTerm :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+finalizeInferredTerm flowCx cx term =
+
+      let term2 = bindUnboundTypeVariables cx term
+      in (Eithers.bind (Checking.checkForUnboundTypeVariables flowCx cx term2) (\_ -> Right (Rewriting.normalizeTypeVariablesInTerm term2)))
+
+-- | Infer a term's type and map over the result
+forInferredTerm :: Context.Context -> Graph.Graph -> Core.Term -> String -> (Typing_.InferenceResult -> t0) -> Either (Context.InContext Errors.Error) (t0, Context.Context)
+forInferredTerm fcx cx term desc f =
+    Eithers.bind (inferTypeOfTerm fcx cx term desc) (\rp -> Right (f rp, (Typing_.inferenceResultContext rp)))
+
+-- | Get all free variables in a graph's bound types
+freeVariablesInContext :: Graph.Graph -> S.Set Core.Name
+freeVariablesInContext cx =
+    Lists.foldl Sets.union Sets.empty (Lists.map Rewriting.freeVariablesInTypeSchemeSimple (Maps.elems (Graph.graphBoundTypes cx)))
+
+-- | Generate a fresh type variable
+freshVariableType :: Context.Context -> (Core.Type, Context.Context)
+freshVariableType cx =
+
+      let result = Schemas.freshName cx
+          name = Pairs.first result
+          cx2 = Pairs.second result
+      in (Core.TypeVariable name, cx2)
+
+-- | Generalize a type to a type scheme
+generalize :: Graph.Graph -> Core.Type -> Core.TypeScheme
+generalize cx typ =
+
+      let isTypeVarName =
+              \name ->
+                let parts = Strings.splitOn "." (Core.unName name)
+                in (Equality.lte (Lists.length parts) 1)
+          vars =
+                  Lists.nub (Lists.filter (\v -> Logic.and (isUnbound cx v) (isTypeVarName v)) (Rewriting.freeVariablesInTypeOrdered typ))
+          allConstraints = Graph.graphClassConstraints cx
+          relevantConstraints =
+                  Maps.fromList (Maybes.cat (Lists.map (\v -> Maybes.map (\meta -> (v, meta)) (Maps.lookup v allConstraints)) vars))
+          constraintsMaybe = Logic.ifElse (Maps.null relevantConstraints) Nothing (Just relevantConstraints)
+      in Core.TypeScheme {
+        Core.typeSchemeVariables = vars,
+        Core.typeSchemeType = typ,
+        Core.typeSchemeConstraints = constraintsMaybe}
+
+-- | Infer types for all elements in a graph, using the provided ordered bindings. Returns both the inferred graph and the ordered inferred bindings.
+inferGraphTypes :: Context.Context -> [Core.Binding] -> Graph.Graph -> Either (Context.InContext Errors.Error) ((Graph.Graph, [Core.Binding]), Context.Context)
+inferGraphTypes fcx0 bindings0 g0 =
+
+      let fcx =
+              Context.Context {
+                Context.contextTrace = (Lists.cons "graph inference" (Context.contextTrace fcx0)),
+                Context.contextMessages = (Context.contextMessages fcx0),
+                Context.contextOther = (Context.contextOther fcx0)}
+          let0 =
+                  Core.Let {
+                    Core.letBindings = bindings0,
+                    Core.letBody = Core.TermUnit}
+          fromLetTerm =
+                  \l ->
+                    let bindings = Core.letBindings l
+                        prims = Graph.graphPrimitives g0
+                        schemaTypes = Graph.graphSchemaTypes g0
+                        rawG = Lexical.buildGraph bindings Maps.empty prims
+                        g =
+                                Graph.Graph {
+                                  Graph.graphBoundTerms = (Graph.graphBoundTerms rawG),
+                                  Graph.graphBoundTypes = (Graph.graphBoundTypes rawG),
+                                  Graph.graphClassConstraints = (Graph.graphClassConstraints rawG),
+                                  Graph.graphLambdaVariables = (Graph.graphLambdaVariables rawG),
+                                  Graph.graphMetadata = (Graph.graphMetadata rawG),
+                                  Graph.graphPrimitives = (Graph.graphPrimitives rawG),
+                                  Graph.graphSchemaTypes = schemaTypes,
+                                  Graph.graphTypeVariables = (Graph.graphTypeVariables rawG)}
+                    in (g, bindings)
+      in (Eithers.bind (inferTypeOfTerm fcx g0 (Core.TermLet let0) "graph term") (\result ->
+        let fcx2 = Typing_.inferenceResultContext result
+            term = Typing_.inferenceResultTerm result
+        in (Eithers.bind (finalizeInferredTerm fcx2 g0 term) (\finalized -> case finalized of
+          Core.TermLet v0 -> Right (fromLetTerm v0, fcx2)
+          Core.TermVariable _ -> Left (Context.InContext {
+            Context.inContextObject = (Errors.ErrorOther (Errors.OtherError "Expected inferred graph as let term")),
+            Context.inContextContext = fcx2})))))
+
+-- | Infer the type of a term in a given inference context
+inferInGraphContext :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferInGraphContext fcx cx term = inferTypeOfTerm fcx cx term "single term"
+
+-- | Infer types for multiple terms, propagating class constraints from sub-expressions
+inferMany :: Context.Context -> Graph.Graph -> [(Core.Term, String)] -> Either (Context.InContext Errors.Error) (([Core.Term], ([Core.Type], (Typing_.TypeSubst, (M.Map Core.Name Core.TypeVariableMetadata)))), Context.Context)
+inferMany fcx cx pairs =
+    Logic.ifElse (Lists.null pairs) (Right (([], ([], (Substitution.idTypeSubst, Maps.empty))), fcx)) (
+      let dflt =
+
+                let e = Pairs.first (Lists.head pairs)
+                    desc = Pairs.second (Lists.head pairs)
+                    tl = Lists.tail pairs
+                in (Eithers.bind (inferTypeOfTerm fcx cx e desc) (\result1 ->
+                  let fcx2 = Typing_.inferenceResultContext result1
+                      e1 = Typing_.inferenceResultTerm result1
+                      t1 = Typing_.inferenceResultType result1
+                      s1 = Typing_.inferenceResultSubst result1
+                      c1 = Typing_.inferenceResultClassConstraints result1
+                  in (Eithers.bind (inferMany fcx2 (Substitution.substInContext s1 cx) tl) (\rp2 ->
+                    let result2 = Pairs.first rp2
+                        fcx3 = Pairs.second rp2
+                        e2 = Pairs.first result2
+                        t2 = Pairs.first (Pairs.second result2)
+                        s2 = Pairs.first (Pairs.second (Pairs.second result2))
+                        c2 = Pairs.second (Pairs.second (Pairs.second result2))
+                        c1Subst = Substitution.substInClassConstraints s2 c1
+                        mergedConstraints = mergeClassConstraints c1Subst c2
+                    in (Right ((Lists.cons (Substitution.substTypesInTerm s2 e1) e2, (Lists.cons (Substitution.substInType s2 t1) t2, (Substitution.composeTypeSubst s1 s2, mergedConstraints))), fcx3))))))
+      in dflt)
+
+-- | Map a possibly untyped term to a fully typed term and its type
+inferTypeOf :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) ((Core.Term, Core.TypeScheme), Context.Context)
+inferTypeOf fcx cx term =
+
+      let letTerm =
+              Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "ignoredVariableName"),
+                    Core.bindingTerm = term,
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermLiteral (Core.LiteralString "ignoredBody"))})
+      in (Eithers.bind (inferTypeOfTerm fcx cx letTerm "infer type of term") (\result ->
+        let fcx2 = Typing_.inferenceResultContext result
+        in (Eithers.bind (finalizeInferredTerm fcx2 cx (Typing_.inferenceResultTerm result)) (\finalized -> Eithers.bind (Core_.let_ fcx2 cx finalized) (\letResult ->
+          let bindings = Core.letBindings letResult
+          in (Logic.ifElse (Equality.equal 1 (Lists.length bindings)) (
+            let binding = Lists.head bindings
+                term1 = Core.bindingTerm binding
+                mts = Core.bindingType binding
+            in (Maybes.maybe (Left (Context.InContext {
+              Context.inContextObject = (Errors.ErrorOther (Errors.OtherError "Expected a type scheme")),
+              Context.inContextContext = fcx2})) (\ts -> Right ((term1, ts), fcx2)) mts)) (Left (Context.InContext {
+            Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+              "Expected a single binding with a type scheme, but got: ",
+              (Literals.showInt32 (Lists.length bindings)),
+              " bindings"]))),
+            Context.inContextContext = fcx2}))))))))
+
+-- | Infer the type of an annotated term (Either version)
+inferTypeOfAnnotatedTerm :: Context.Context -> Graph.Graph -> Core.AnnotatedTerm -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfAnnotatedTerm fcx cx at =
+
+      let term = Core.annotatedTermBody at
+          ann = Core.annotatedTermAnnotation at
+      in (Eithers.bind (inferTypeOfTerm fcx cx term "annotated term") (\result ->
+        let fcx2 = Typing_.inferenceResultContext result
+            iterm = Typing_.inferenceResultTerm result
+            itype = Typing_.inferenceResultType result
+            isubst = Typing_.inferenceResultSubst result
+            iconstraints = Typing_.inferenceResultClassConstraints result
+        in (Right (Typing_.InferenceResult {
+          Typing_.inferenceResultTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+            Core.annotatedTermBody = iterm,
+            Core.annotatedTermAnnotation = ann})),
+          Typing_.inferenceResultType = itype,
+          Typing_.inferenceResultSubst = isubst,
+          Typing_.inferenceResultClassConstraints = iconstraints,
+          Typing_.inferenceResultContext = fcx2}))))
+
+-- | Infer the type of a function application (Either version)
+inferTypeOfApplication :: Context.Context -> Graph.Graph -> Core.Application -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfApplication fcx0 cx app =
+
+      let fcx =
+              Context.Context {
+                Context.contextTrace = (Lists.cons "application" (Context.contextTrace fcx0)),
+                Context.contextMessages = (Context.contextMessages fcx0),
+                Context.contextOther = (Context.contextOther fcx0)}
+          e0 = Core.applicationFunction app
+          e1 = Core.applicationArgument app
+      in (Eithers.bind (inferTypeOfTerm fcx cx e0 "lhs") (\lhsResult ->
+        let fcx2 = Typing_.inferenceResultContext lhsResult
+            a = Typing_.inferenceResultTerm lhsResult
+            t0 = Typing_.inferenceResultType lhsResult
+            s0 = Typing_.inferenceResultSubst lhsResult
+            c0 = Typing_.inferenceResultClassConstraints lhsResult
+        in (Eithers.bind (inferTypeOfTerm fcx2 (Substitution.substInContext s0 cx) e1 "rhs") (\rhsResult ->
+          let fcx3 = Typing_.inferenceResultContext rhsResult
+              b = Typing_.inferenceResultTerm rhsResult
+              t1 = Typing_.inferenceResultType rhsResult
+              s1 = Typing_.inferenceResultSubst rhsResult
+              c1 = Typing_.inferenceResultClassConstraints rhsResult
+              vResult = Schemas.freshName fcx3
+              v = Pairs.first vResult
+              fcx4 = Pairs.second vResult
+          in (Eithers.bind (Eithers.bimap (\_ic -> Context.InContext {
+            Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unificationErrorMessage (Context.inContextObject _ic)))),
+            Context.inContextContext = (Context.inContextContext _ic)}) (\_a -> _a) (Unification.unifyTypes fcx4 (Graph.graphSchemaTypes cx) (Substitution.substInType s1 t0) (Core.TypeFunction (Core.FunctionType {
+            Core.functionTypeDomain = t1,
+            Core.functionTypeCodomain = (Core.TypeVariable v)})) "application lhs")) (\s2 -> Eithers.bind (Checking.checkTypeSubst fcx4 cx s2) (\_ ->
+            let rExpr =
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Substitution.substTypesInTerm (Substitution.composeTypeSubst s1 s2) a),
+                      Core.applicationArgument = (Substitution.substTypesInTerm s2 b)})
+                rType = Substitution.substInType s2 (Core.TypeVariable v)
+                rSubst =
+                        Substitution.composeTypeSubstList [
+                          s0,
+                          s1,
+                          s2]
+                c0Subst = Substitution.substInClassConstraints s2 (Substitution.substInClassConstraints s1 c0)
+                c1Subst = Substitution.substInClassConstraints s2 c1
+                rConstraints = mergeClassConstraints c0Subst c1Subst
+            in (Right (Typing_.InferenceResult {
+              Typing_.inferenceResultTerm = rExpr,
+              Typing_.inferenceResultType = rType,
+              Typing_.inferenceResultSubst = rSubst,
+              Typing_.inferenceResultClassConstraints = rConstraints,
+              Typing_.inferenceResultContext = fcx4})))))))))
+
+-- | Infer the type of a case statement (Either version)
+inferTypeOfCaseStatement :: Context.Context -> Graph.Graph -> Core.CaseStatement -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfCaseStatement fcx cx caseStmt =
+
+      let tname = Core.caseStatementTypeName caseStmt
+          dflt = Core.caseStatementDefault caseStmt
+          cases = Core.caseStatementCases caseStmt
+          fnames = Lists.map Core.fieldName cases
+      in (Eithers.bind (Schemas.requireSchemaType fcx (Graph.graphSchemaTypes cx) tname) (\stRp ->
+        let schemaType = Pairs.first stRp
+            fcx2 = Pairs.second stRp
+            svars = Core.typeSchemeVariables schemaType
+            stype = Core.typeSchemeType schemaType
+        in (Eithers.bind (Core_.unionType fcx2 tname stype) (\sfields -> Eithers.bind (Eithers.mapMaybe (\t -> inferTypeOfTerm fcx2 cx t (Strings.cat [
+          "case ",
+          (Core.unName tname),
+          ".<default>"])) dflt) (\dfltRp ->
+          let dfltResult = dfltRp
+              fcx3 = Maybes.fromMaybe fcx2 (Maybes.map Typing_.inferenceResultContext dfltRp)
+          in (Eithers.bind (inferMany fcx3 cx (Lists.map (\f -> (Core.fieldTerm f, (Strings.cat [
+            "case ",
+            (Core.unName tname),
+            ".",
+            (Core.unName (Core.fieldName f))]))) cases)) (\caseRp ->
+            let caseResults = Pairs.first caseRp
+                fcx4 = Pairs.second caseRp
+                iterms = Pairs.first caseResults
+                itypes = Pairs.first (Pairs.second caseResults)
+                isubst = Pairs.first (Pairs.second (Pairs.second caseResults))
+                caseElemConstraints = Pairs.second (Pairs.second (Pairs.second caseResults))
+                codvResult = Schemas.freshName fcx4
+                codv = Pairs.first codvResult
+                fcx5 = Pairs.second codvResult
+                cod = Core.TypeVariable codv
+                caseMap = Maps.fromList (Lists.map (\ft -> (Core.fieldTypeName ft, (Core.fieldTypeType ft))) sfields)
+                dfltConstraints =
+                        Maybes.toList (Maybes.map (\r -> Typing_.TypeConstraint {
+                          Typing_.typeConstraintLeft = cod,
+                          Typing_.typeConstraintRight = (Substitution.substInType isubst (Typing_.inferenceResultType r)),
+                          Typing_.typeConstraintComment = "match default"}) dfltResult)
+                caseConstraints =
+                        Maybes.cat (Lists.zipWith (\fname -> \itype -> Maybes.map (\ftype -> Typing_.TypeConstraint {
+                          Typing_.typeConstraintLeft = itype,
+                          Typing_.typeConstraintRight = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = ftype,
+                            Core.functionTypeCodomain = cod})),
+                          Typing_.typeConstraintComment = "case type"}) (Maps.lookup fname caseMap)) fnames itypes)
+                dfltClassConstraints = Maybes.fromMaybe Maps.empty (Maybes.map Typing_.inferenceResultClassConstraints dfltResult)
+                allElemConstraints = mergeClassConstraints caseElemConstraints dfltClassConstraints
+            in (Eithers.bind (mapConstraints fcx5 cx (\subst -> yieldWithConstraints fcx5 (buildTypeApplicationTerm svars (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = tname,
+              Core.caseStatementDefault = (Maybes.map Typing_.inferenceResultTerm dfltResult),
+              Core.caseStatementCases = (Lists.zipWith (\n -> \t -> Core.Field {
+                Core.fieldName = n,
+                Core.fieldTerm = t}) fnames iterms)}))))) (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)),
+              Core.functionTypeCodomain = cod})) (Substitution.composeTypeSubstList (Lists.concat [
+              Maybes.toList (Maybes.map Typing_.inferenceResultSubst dfltResult),
+              [
+                isubst,
+                subst]])) (Substitution.substInClassConstraints subst allElemConstraints)) (Lists.concat [
+              dfltConstraints,
+              caseConstraints])) (\mcResult -> Right mcResult)))))))))
+
+-- | Infer the type of a collection. The classNames parameter specifies type classes (e.g. ordering) that the element type variable must satisfy.
+inferTypeOfCollection :: Context.Context -> Graph.Graph -> (Core.Type -> Core.Type) -> ([Core.Term] -> Core.Term) -> String -> S.Set Core.Name -> [Core.Term] -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfCollection fcx cx typCons trmCons desc classNames els =
+
+      let varResult = Schemas.freshName fcx
+          var = Pairs.first varResult
+          fcx2 = Pairs.second varResult
+          classConstraints =
+                  Logic.ifElse (Sets.null classNames) Maps.empty (Maps.singleton var (Core.TypeVariableMetadata {
+                    Core.typeVariableMetadataClasses = classNames}))
+      in (Logic.ifElse (Lists.null els) (Right (yieldWithConstraints fcx2 (buildTypeApplicationTerm [
+        var] (trmCons [])) (typCons (Core.TypeVariable var)) Substitution.idTypeSubst classConstraints)) (Eithers.bind (inferMany fcx2 cx (Lists.zip els (Lists.map (\i -> Strings.cat [
+        "#",
+        (Literals.showInt32 i)]) (Math.range 1 (Math.add (Lists.length els) 1))))) (\resultsRp ->
+        let results = Pairs.first resultsRp
+            fcx3 = Pairs.second resultsRp
+            terms = Pairs.first results
+            types = Pairs.first (Pairs.second results)
+            subst1 = Pairs.first (Pairs.second (Pairs.second results))
+            elemConstraints = Pairs.second (Pairs.second (Pairs.second results))
+            constraints =
+                    Lists.map (\t -> Typing_.TypeConstraint {
+                      Typing_.typeConstraintLeft = (Core.TypeVariable var),
+                      Typing_.typeConstraintRight = t,
+                      Typing_.typeConstraintComment = desc}) types
+            allConstraints = mergeClassConstraints classConstraints elemConstraints
+        in (Eithers.bind (mapConstraints fcx3 cx (\subst2 ->
+          let iterm = trmCons terms
+              itype = typCons (Core.TypeVariable var)
+              isubst = Substitution.composeTypeSubst subst1 subst2
+          in (yieldWithConstraints fcx3 iterm itype isubst (Substitution.substInClassConstraints subst2 allConstraints))) constraints) (\mcResult -> Right mcResult)))))
+
+-- | Infer the type of an either value (Either version)
+inferTypeOfEither :: Context.Context -> Graph.Graph -> Either Core.Term Core.Term -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfEither fcx cx e =
+    Eithers.either (\l -> Eithers.bind (inferTypeOfTerm fcx cx l "either left value") (\r1 ->
+      let fcx2 = Typing_.inferenceResultContext r1
+          iterm = Typing_.inferenceResultTerm r1
+          leftType = Typing_.inferenceResultType r1
+          subst = Typing_.inferenceResultSubst r1
+          fvResult = freshVariableType fcx2
+          rightType = Pairs.first fvResult
+          fcx3 = Pairs.second fvResult
+          eitherTerm = Core.TermEither (Left iterm)
+          termWithLeftType =
+                  Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = eitherTerm,
+                    Core.typeApplicationTermType = leftType})
+          termWithBothTypes =
+                  Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = termWithLeftType,
+                    Core.typeApplicationTermType = rightType})
+          eitherType =
+                  Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = leftType,
+                    Core.eitherTypeRight = rightType})
+      in (Right (yieldChecked fcx3 termWithBothTypes eitherType subst)))) (\r -> Eithers.bind (inferTypeOfTerm fcx cx r "either right value") (\r1 ->
+      let fcx2 = Typing_.inferenceResultContext r1
+          iterm = Typing_.inferenceResultTerm r1
+          rightType = Typing_.inferenceResultType r1
+          subst = Typing_.inferenceResultSubst r1
+          fvResult = freshVariableType fcx2
+          leftType = Pairs.first fvResult
+          fcx3 = Pairs.second fvResult
+          eitherTerm = Core.TermEither (Right iterm)
+          termWithLeftType =
+                  Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = eitherTerm,
+                    Core.typeApplicationTermType = leftType})
+          termWithBothTypes =
+                  Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = termWithLeftType,
+                    Core.typeApplicationTermType = rightType})
+          eitherType =
+                  Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = leftType,
+                    Core.eitherTypeRight = rightType})
+      in (Right (yieldChecked fcx3 termWithBothTypes eitherType subst)))) e
+
+-- | Infer the type of an elimination (Either version)
+inferTypeOfElimination :: Context.Context -> Graph.Graph -> Core.Elimination -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfElimination fcx cx elm =
+    case elm of
+      Core.EliminationRecord v0 -> inferTypeOfProjection fcx cx v0
+      Core.EliminationUnion v0 -> inferTypeOfCaseStatement fcx cx v0
+      Core.EliminationWrap v0 -> inferTypeOfUnwrap fcx cx v0
+
+-- | Infer the type of a function (Either version)
+inferTypeOfFunction :: Context.Context -> Graph.Graph -> Core.Function -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfFunction fcx cx f =
+    case f of
+      Core.FunctionElimination v0 -> inferTypeOfElimination fcx cx v0
+      Core.FunctionLambda v0 -> inferTypeOfLambda fcx cx v0
+      Core.FunctionPrimitive v0 -> inferTypeOfPrimitive fcx cx v0
+
+-- | Infer the type of a union injection (Either version)
+inferTypeOfInjection :: Context.Context -> Graph.Graph -> Core.Injection -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfInjection fcx cx injection =
+
+      let tname = Core.injectionTypeName injection
+          field = Core.injectionField injection
+          fname = Core.fieldName field
+          term = Core.fieldTerm field
+      in (Eithers.bind (inferTypeOfTerm fcx cx term "injected term") (\result ->
+        let fcx2 = Typing_.inferenceResultContext result
+        in (Eithers.bind (Schemas.requireSchemaType fcx2 (Graph.graphSchemaTypes cx) tname) (\stRp ->
+          let schemaType = Pairs.first stRp
+              fcx3 = Pairs.second stRp
+              svars = Core.typeSchemeVariables schemaType
+              stype = Core.typeSchemeType schemaType
+              iterm = Typing_.inferenceResultTerm result
+              ityp = Typing_.inferenceResultType result
+              isubst = Typing_.inferenceResultSubst result
+          in (Eithers.bind (Core_.unionType fcx3 tname stype) (\sfields -> Eithers.bind (Schemas.findFieldType fcx3 fname sfields) (\ftyp -> Eithers.bind (mapConstraints fcx3 cx (\subst -> yield fcx3 (buildTypeApplicationTerm svars (Core.TermUnion (Core.Injection {
+            Core.injectionTypeName = tname,
+            Core.injectionField = Core.Field {
+              Core.fieldName = fname,
+              Core.fieldTerm = iterm}}))) (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)) (Substitution.composeTypeSubst isubst subst)) [
+            Typing_.TypeConstraint {
+              Typing_.typeConstraintLeft = ftyp,
+              Typing_.typeConstraintRight = ityp,
+              Typing_.typeConstraintComment = "schema type of injected field"}]) (\mcResult -> Right mcResult))))))))
+
+-- | Infer the type of a lambda function (Either version)
+inferTypeOfLambda :: Context.Context -> Graph.Graph -> Core.Lambda -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfLambda fcx cx lambda =
+
+      let var = Core.lambdaParameter lambda
+          body = Core.lambdaBody lambda
+          vdomResult = Schemas.freshName fcx
+          vdom = Pairs.first vdomResult
+          fcx2 = Pairs.second vdomResult
+          dom = Core.TypeVariable vdom
+          cx2 =
+                  extendContext [
+                    (var, Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = dom,
+                      Core.typeSchemeConstraints = Nothing})] cx
+      in (Eithers.bind (inferTypeOfTerm fcx2 cx2 body "lambda body") (\result ->
+        let fcx3 = Typing_.inferenceResultContext result
+            iterm = Typing_.inferenceResultTerm result
+            icod = Typing_.inferenceResultType result
+            isubst = Typing_.inferenceResultSubst result
+            rdom = Substitution.substInType isubst dom
+            rterm =
+                    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = var,
+                      Core.lambdaDomain = (Just rdom),
+                      Core.lambdaBody = iterm}))
+            rtype =
+                    Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = rdom,
+                      Core.functionTypeCodomain = icod})
+            vars =
+                    Sets.unions [
+                      Rewriting.freeVariablesInType rdom,
+                      (Rewriting.freeVariablesInType icod),
+                      (freeVariablesInContext (Substitution.substInContext isubst cx2))]
+            cx3 = Substitution.substInContext isubst cx
+            iconstraints = Substitution.substInClassConstraints isubst (Typing_.inferenceResultClassConstraints result)
+        in (Right (Typing_.InferenceResult {
+          Typing_.inferenceResultTerm = rterm,
+          Typing_.inferenceResultType = rtype,
+          Typing_.inferenceResultSubst = isubst,
+          Typing_.inferenceResultClassConstraints = iconstraints,
+          Typing_.inferenceResultContext = fcx3}))))
+
+-- | Normalize a let term before inferring its type (Either version)
+inferTypeOfLet :: Context.Context -> Graph.Graph -> Core.Let -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfLet fcx0 cx let0 =
+
+      let fcx =
+              Context.Context {
+                Context.contextTrace = (Lists.cons "let" (Context.contextTrace fcx0)),
+                Context.contextMessages = (Context.contextMessages fcx0),
+                Context.contextOther = (Context.contextOther fcx0)}
+          bindings0 = Core.letBindings let0
+          body0 = Core.letBody let0
+          names = Lists.map Core.bindingName bindings0
+          nameSet = Sets.fromList names
+          toPair =
+                  \binding ->
+                    let name = Core.bindingName binding
+                        term = Core.bindingTerm binding
+                    in (name, (Lists.filter (\n -> Sets.member n nameSet) (Sets.toList (Rewriting.freeVariablesInTerm term))))
+          adjList = Lists.map toPair bindings0
+          groups = Sorting.topologicalSortComponents adjList
+          bindingMap = Maps.fromList (Lists.zip names bindings0)
+          createLet =
+                  \e -> \group -> Core.TermLet (Core.Let {
+                    Core.letBindings = (Maybes.cat (Lists.map (\n -> Maps.lookup n bindingMap) group)),
+                    Core.letBody = e})
+          rewrittenLet = Lists.foldl createLet body0 (Lists.reverse groups)
+          restoreLet =
+                  \iterm ->
+                    let helper =
+                            \level -> \bins -> \term ->
+                              let nonzero =
+                                      \term -> case term of
+                                        Core.TermLet v0 ->
+                                          let bs = Core.letBindings v0
+                                              letBody = Core.letBody v0
+                                          in (helper (Math.sub level 1) (Lists.concat [
+                                            bs,
+                                            bins]) letBody)
+                              in (Logic.ifElse (Equality.equal level 0) (bins, term) (nonzero term))
+                        result = helper (Lists.length groups) [] iterm
+                        bindingList = Pairs.first result
+                        e = Pairs.second result
+                        bindingMap2 = Maps.fromList (Lists.map (\b -> (Core.bindingName b, b)) bindingList)
+                    in (Core.TermLet (Core.Let {
+                      Core.letBindings = (Maybes.cat (Lists.map (\n -> Maps.lookup n bindingMap2) names)),
+                      Core.letBody = e}))
+          rewriteResult =
+                  \iresult ->
+                    let fcxR = Typing_.inferenceResultContext iresult
+                        iterm = Typing_.inferenceResultTerm iresult
+                        itype = Typing_.inferenceResultType iresult
+                        isubst = Typing_.inferenceResultSubst iresult
+                        iconstraints = Typing_.inferenceResultClassConstraints iresult
+                    in Typing_.InferenceResult {
+                      Typing_.inferenceResultTerm = (restoreLet iterm),
+                      Typing_.inferenceResultType = itype,
+                      Typing_.inferenceResultSubst = isubst,
+                      Typing_.inferenceResultClassConstraints = iconstraints,
+                      Typing_.inferenceResultContext = fcxR}
+          res =
+                  case rewrittenLet of
+                    Core.TermLet v0 -> inferTypeOfLetNormalized fcx cx v0
+                    _ -> inferTypeOfTerm fcx cx rewrittenLet "empty let term"
+      in (Eithers.map rewriteResult res)
+
+-- | Infer the type of a let (letrec) term which is already in a normal form (Either version)
+inferTypeOfLetNormalized :: Context.Context -> Graph.Graph -> Core.Let -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfLetNormalized fcx0 cx0 letTerm =
+
+      let fcx =
+              Context.Context {
+                Context.contextTrace = (Lists.cons "let-normalized" (Context.contextTrace fcx0)),
+                Context.contextMessages = (Context.contextMessages fcx0),
+                Context.contextOther = (Context.contextOther fcx0)}
+          bins0 = Core.letBindings letTerm
+          body0 = Core.letBody letTerm
+          bnames = Lists.map Core.bindingName bins0
+          bvarsResult = Schemas.freshNames (Lists.length bins0) fcx
+          bvars = Pairs.first bvarsResult
+          fcx2 = Pairs.second bvarsResult
+          tbins0 = Lists.map (\x -> Core.TypeVariable x) bvars
+          cx1 =
+                  extendContext (Lists.zip bnames (Lists.map (\t -> Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = t,
+                    Core.typeSchemeConstraints = Nothing}) tbins0)) cx0
+      in (Eithers.bind (inferTypesOfTemporaryBindings fcx2 cx1 bins0) (\irRp ->
+        let inferredResult = Pairs.first irRp
+            fcx3 = Pairs.second irRp
+            bterms1 = Pairs.first inferredResult
+            tbins1 = Pairs.first (Pairs.second inferredResult)
+            substAndConstraints = Pairs.second (Pairs.second inferredResult)
+            s1 = Pairs.first substAndConstraints
+            inferredConstraints = Pairs.second substAndConstraints
+        in (Eithers.bind (Eithers.bimap (\_ic -> Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unificationErrorMessage (Context.inContextObject _ic)))),
+          Context.inContextContext = (Context.inContextContext _ic)}) (\_a -> _a) (Unification.unifyTypeLists fcx3 (Graph.graphSchemaTypes cx0) (Lists.map (Substitution.substInType s1) tbins0) tbins1 "temporary type bindings")) (\s2 -> Eithers.bind (Checking.checkTypeSubst fcx3 cx0 s2) (\_ ->
+          let g2base = Substitution.substInContext (Substitution.composeTypeSubst s1 s2) cx0
+              constraintsWithS2 = Substitution.substInClassConstraints s2 inferredConstraints
+              composedSubst = Substitution.composeTypeSubst s1 s2
+              originalBindingConstraints =
+                      Lists.foldl (\acc -> \b -> Maybes.maybe acc (\ts -> Maybes.maybe acc (\c -> mergeClassConstraints acc c) (Core.typeSchemeConstraints ts)) (Core.bindingType b)) Maps.empty bins0
+              originalConstraintsSubst = Substitution.substInClassConstraints composedSubst originalBindingConstraints
+              allInferredConstraints = mergeClassConstraints constraintsWithS2 originalConstraintsSubst
+              mergedConstraints = mergeClassConstraints (Graph.graphClassConstraints g2base) allInferredConstraints
+              g2 =
+                      Graph.Graph {
+                        Graph.graphBoundTerms = (Graph.graphBoundTerms g2base),
+                        Graph.graphBoundTypes = (Graph.graphBoundTypes g2base),
+                        Graph.graphClassConstraints = mergedConstraints,
+                        Graph.graphLambdaVariables = (Graph.graphLambdaVariables g2base),
+                        Graph.graphMetadata = (Graph.graphMetadata g2base),
+                        Graph.graphPrimitives = (Graph.graphPrimitives g2base),
+                        Graph.graphSchemaTypes = (Graph.graphSchemaTypes g2base),
+                        Graph.graphTypeVariables = (Graph.graphTypeVariables g2base)}
+              bterms1Subst = Lists.map (Substitution.substTypesInTerm s2) bterms1
+              tsbins1 = Lists.zip bnames (Lists.map (\t -> generalize g2 (Substitution.substInType s2 t)) tbins1)
+          in (Eithers.bind (inferTypeOfTerm fcx3 (extendContext tsbins1 g2) body0 "let body") (\bodyResult ->
+            let fcx4 = Typing_.inferenceResultContext bodyResult
+                body1 = Typing_.inferenceResultTerm bodyResult
+                tbody = Typing_.inferenceResultType bodyResult
+                sbody = Typing_.inferenceResultSubst bodyResult
+                st1 =
+                        Typing_.TermSubst (Maps.fromList (Lists.map (\pair ->
+                          let name = Pairs.first pair
+                              ts = Pairs.second pair
+                          in (name, (buildTypeApplicationTerm (Core.typeSchemeVariables ts) (Core.TermVariable name)))) tsbins1))
+                createBinding =
+                        \bindingPair ->
+                          let nameTsPair = Pairs.first bindingPair
+                              term = Pairs.second bindingPair
+                              name = Pairs.first nameTsPair
+                              ts = Pairs.second nameTsPair
+                              finalTs = Substitution.substInTypeScheme sbody ts
+                              typeLambdaTerm =
+                                      Lists.foldl (\b -> \v -> Core.TermTypeLambda (Core.TypeLambda {
+                                        Core.typeLambdaParameter = v,
+                                        Core.typeLambdaBody = b})) (Substitution.substituteInTerm st1 term) (Lists.reverse (Core.typeSchemeVariables finalTs))
+                          in Core.Binding {
+                            Core.bindingName = name,
+                            Core.bindingTerm = (Substitution.substTypesInTerm (Substitution.composeTypeSubst sbody s2) typeLambdaTerm),
+                            Core.bindingType = (Just finalTs)}
+                bins1 = Lists.map createBinding (Lists.zip tsbins1 bterms1Subst)
+                bodyConstraints = Substitution.substInClassConstraints sbody (Typing_.inferenceResultClassConstraints bodyResult)
+                bindingConstraintsSubst = Substitution.substInClassConstraints sbody constraintsWithS2
+                allConstraints = mergeClassConstraints bindingConstraintsSubst bodyConstraints
+            in (Right (Typing_.InferenceResult {
+              Typing_.inferenceResultTerm = (Core.TermLet (Core.Let {
+                Core.letBindings = bins1,
+                Core.letBody = body1})),
+              Typing_.inferenceResultType = tbody,
+              Typing_.inferenceResultSubst = (Substitution.composeTypeSubstList [
+                s1,
+                s2,
+                sbody]),
+              Typing_.inferenceResultClassConstraints = allConstraints,
+              Typing_.inferenceResultContext = fcx4})))))))))
+
+-- | Infer the type of a list (Either version)
+inferTypeOfList :: Context.Context -> Graph.Graph -> [Core.Term] -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfList fcx cx =
+    inferTypeOfCollection fcx cx (\x -> Core.TypeList x) (\x -> Core.TermList x) "list element" Sets.empty
+
+-- | Infer the type of a literal
+inferTypeOfLiteral :: Context.Context -> Core.Literal -> Typing_.InferenceResult
+inferTypeOfLiteral fcx lit =
+    Typing_.InferenceResult {
+      Typing_.inferenceResultTerm = (Core.TermLiteral lit),
+      Typing_.inferenceResultType = (Core.TypeLiteral (Reflect.literalType lit)),
+      Typing_.inferenceResultSubst = Substitution.idTypeSubst,
+      Typing_.inferenceResultClassConstraints = Maps.empty,
+      Typing_.inferenceResultContext = fcx}
+
+-- | Infer the type of a map (Either version)
+inferTypeOfMap :: Context.Context -> Graph.Graph -> M.Map Core.Term Core.Term -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfMap fcx cx m =
+
+      let kvarResult = Schemas.freshName fcx
+          kvar = Pairs.first kvarResult
+          fcx2 = Pairs.second kvarResult
+          vvarResult = Schemas.freshName fcx2
+          vvar = Pairs.first vvarResult
+          fcx3 = Pairs.second vvarResult
+          keyConstraints =
+                  Maps.singleton kvar (Core.TypeVariableMetadata {
+                    Core.typeVariableMetadataClasses = (Sets.singleton (Core.Name "ordering"))})
+      in (Logic.ifElse (Maps.null m) (Right (yieldWithConstraints fcx3 (buildTypeApplicationTerm [
+        kvar,
+        vvar] (Core.TermMap Maps.empty)) (Core.TypeMap (Core.MapType {
+        Core.mapTypeKeys = (Core.TypeVariable kvar),
+        Core.mapTypeValues = (Core.TypeVariable vvar)})) Substitution.idTypeSubst keyConstraints)) (Eithers.bind (inferMany fcx3 cx (Lists.map (\k -> (k, "map key")) (Maps.keys m))) (\kRp ->
+        let kResults = Pairs.first kRp
+            fcx4 = Pairs.second kRp
+            kterms = Pairs.first kResults
+            ktypes = Pairs.first (Pairs.second kResults)
+            ksubst = Pairs.first (Pairs.second (Pairs.second kResults))
+            kElemConstraints = Pairs.second (Pairs.second (Pairs.second kResults))
+        in (Eithers.bind (inferMany fcx4 (Substitution.substInContext ksubst cx) (Lists.map (\v -> (v, "map value")) (Maps.elems m))) (\vRp ->
+          let vResults = Pairs.first vRp
+              fcx5 = Pairs.second vRp
+              vterms = Pairs.first vResults
+              vtypes = Pairs.first (Pairs.second vResults)
+              vsubst = Pairs.first (Pairs.second (Pairs.second vResults))
+              vElemConstraints = Pairs.second (Pairs.second (Pairs.second vResults))
+              kcons =
+                      Lists.map (\t -> Typing_.TypeConstraint {
+                        Typing_.typeConstraintLeft = (Core.TypeVariable kvar),
+                        Typing_.typeConstraintRight = t,
+                        Typing_.typeConstraintComment = "map key"}) ktypes
+              vcons =
+                      Lists.map (\t -> Typing_.TypeConstraint {
+                        Typing_.typeConstraintLeft = (Core.TypeVariable vvar),
+                        Typing_.typeConstraintRight = t,
+                        Typing_.typeConstraintComment = "map value"}) vtypes
+              allMapConstraints = mergeClassConstraints keyConstraints (mergeClassConstraints kElemConstraints vElemConstraints)
+          in (Eithers.bind (mapConstraints fcx5 cx (\subst -> yieldWithConstraints fcx5 (Core.TermMap (Maps.fromList (Lists.zip kterms vterms))) (Core.TypeMap (Core.MapType {
+            Core.mapTypeKeys = (Core.TypeVariable kvar),
+            Core.mapTypeValues = (Core.TypeVariable vvar)})) (Substitution.composeTypeSubstList [
+            ksubst,
+            vsubst,
+            subst]) (Substitution.substInClassConstraints subst allMapConstraints)) (Lists.concat [
+            kcons,
+            vcons])) (\mcResult -> Right mcResult)))))))
+
+-- | Infer the type of an optional (Either version)
+inferTypeOfOptional :: Context.Context -> Graph.Graph -> Maybe Core.Term -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfOptional fcx cx m =
+
+      let trmCons = \terms -> Logic.ifElse (Lists.null terms) (Core.TermMaybe Nothing) (Core.TermMaybe (Just (Lists.head terms)))
+      in (inferTypeOfCollection fcx cx (\x -> Core.TypeMaybe x) trmCons "optional element" Sets.empty (Maybes.maybe [] Lists.singleton m))
+
+-- | Infer the type of a pair (Either version)
+inferTypeOfPair :: Context.Context -> Graph.Graph -> (Core.Term, Core.Term) -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfPair fcx cx p =
+    Eithers.bind (inferMany fcx cx [
+      (Pairs.first p, "pair first element"),
+      (Pairs.second p, "pair second element")]) (\rp ->
+      let results = Pairs.first rp
+          fcx2 = Pairs.second rp
+          iterms = Pairs.first results
+          itypes = Pairs.first (Pairs.second results)
+          isubst = Pairs.first (Pairs.second (Pairs.second results))
+          pairElemConstraints = Pairs.second (Pairs.second (Pairs.second results))
+          ifst = Lists.head iterms
+          isnd = Lists.head (Lists.tail iterms)
+          tyFst = Lists.head itypes
+          tySnd = Lists.head (Lists.tail itypes)
+          pairTerm = Core.TermPair (ifst, isnd)
+          termWithTypes =
+                  Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = pairTerm,
+                      Core.typeApplicationTermType = tyFst})),
+                    Core.typeApplicationTermType = tySnd})
+      in (Right (yieldWithConstraints fcx2 termWithTypes (Core.TypePair (Core.PairType {
+        Core.pairTypeFirst = tyFst,
+        Core.pairTypeSecond = tySnd})) isubst pairElemConstraints)))
+
+-- | Infer the type of a primitive function (Either version)
+inferTypeOfPrimitive :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfPrimitive fcx cx name =
+    Maybes.maybe (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "No such primitive: " (Core.unName name)))),
+      Context.inContextContext = fcx})) (\scheme ->
+      let tsResult = Schemas.instantiateTypeScheme fcx scheme
+          ts = Pairs.first tsResult
+          fcx2 = Pairs.second tsResult
+          constraints = Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints ts)
+      in (Right (yieldCheckedWithConstraints fcx2 (buildTypeApplicationTerm (Core.typeSchemeVariables ts) (Core.TermFunction (Core.FunctionPrimitive name))) (Core.typeSchemeType ts) Substitution.idTypeSubst constraints))) (Maybes.map Graph.primitiveType (Maps.lookup name (Graph.graphPrimitives cx)))
+
+-- | Infer the type of a record projection (Either version)
+inferTypeOfProjection :: Context.Context -> Graph.Graph -> Core.Projection -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfProjection fcx cx proj =
+
+      let tname = Core.projectionTypeName proj
+          fname = Core.projectionField proj
+      in (Eithers.bind (Schemas.requireSchemaType fcx (Graph.graphSchemaTypes cx) tname) (\stRp ->
+        let schemaType = Pairs.first stRp
+            fcx2 = Pairs.second stRp
+            svars = Core.typeSchemeVariables schemaType
+            stype = Core.typeSchemeType schemaType
+        in (Eithers.bind (Core_.recordType fcx2 tname stype) (\sfields -> Eithers.bind (Schemas.findFieldType fcx2 fname sfields) (\ftyp -> Right (yield fcx2 (buildTypeApplicationTerm svars (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+          Core.projectionTypeName = tname,
+          Core.projectionField = fname}))))) (Core.TypeFunction (Core.FunctionType {
+          Core.functionTypeDomain = (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)),
+          Core.functionTypeCodomain = ftyp})) Substitution.idTypeSubst))))))
+
+-- | Infer the type of a record (Either version)
+inferTypeOfRecord :: Context.Context -> Graph.Graph -> Core.Record -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfRecord fcx cx record =
+
+      let tname = Core.recordTypeName record
+          fields = Core.recordFields record
+          fnames = Lists.map Core.fieldName fields
+      in (Eithers.bind (Schemas.requireSchemaType fcx (Graph.graphSchemaTypes cx) tname) (\stRp ->
+        let schemaType = Pairs.first stRp
+            fcx2 = Pairs.second stRp
+        in (Eithers.bind (inferMany fcx2 cx (Lists.map (\f -> (Core.fieldTerm f, (Strings.cat2 "field " (Core.unName (Core.fieldName f))))) fields)) (\rp ->
+          let results = Pairs.first rp
+              fcx3 = Pairs.second rp
+              svars = Core.typeSchemeVariables schemaType
+              stype = Core.typeSchemeType schemaType
+              iterms = Pairs.first results
+              itypes = Pairs.first (Pairs.second results)
+              isubst = Pairs.first (Pairs.second (Pairs.second results))
+              recElemConstraints = Pairs.second (Pairs.second (Pairs.second results))
+              ityp =
+                      Core.TypeRecord (Lists.zipWith (\n -> \t -> Core.FieldType {
+                        Core.fieldTypeName = n,
+                        Core.fieldTypeType = t}) fnames itypes)
+          in (Eithers.bind (mapConstraints fcx3 cx (\subst -> yieldWithConstraints fcx3 (buildTypeApplicationTerm svars (Core.TermRecord (Core.Record {
+            Core.recordTypeName = tname,
+            Core.recordFields = (Lists.zipWith (\n -> \t -> Core.Field {
+              Core.fieldName = n,
+              Core.fieldTerm = t}) fnames iterms)}))) (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)) (Substitution.composeTypeSubst isubst subst) (Substitution.substInClassConstraints subst recElemConstraints)) [
+            Typing_.TypeConstraint {
+              Typing_.typeConstraintLeft = stype,
+              Typing_.typeConstraintRight = ityp,
+              Typing_.typeConstraintComment = "schema type of record"}]) (\mcResult -> Right mcResult))))))
+
+-- | Infer the type of a set (Either version)
+inferTypeOfSet :: Context.Context -> Graph.Graph -> S.Set Core.Term -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfSet fcx cx s =
+    inferTypeOfCollection fcx cx (\x -> Core.TypeSet x) (\terms -> Core.TermSet (Sets.fromList terms)) "set element" (Sets.singleton (Core.Name "ordering")) (Sets.toList s)
+
+-- | Infer the type of a given term (Either version)
+inferTypeOfTerm :: Context.Context -> Graph.Graph -> Core.Term -> String -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfTerm fcx cx term desc =
+
+      let fcx2 =
+              Context.Context {
+                Context.contextTrace = (Lists.cons desc (Context.contextTrace fcx)),
+                Context.contextMessages = (Context.contextMessages fcx),
+                Context.contextOther = (Context.contextOther fcx)}
+      in case term of
+        Core.TermAnnotated v0 -> inferTypeOfAnnotatedTerm fcx2 cx v0
+        Core.TermApplication v0 -> inferTypeOfApplication fcx2 cx v0
+        Core.TermEither v0 -> inferTypeOfEither fcx2 cx v0
+        Core.TermFunction v0 -> inferTypeOfFunction fcx2 cx v0
+        Core.TermLet v0 -> inferTypeOfLet fcx2 cx v0
+        Core.TermList v0 -> inferTypeOfList fcx2 cx v0
+        Core.TermLiteral v0 -> Right (inferTypeOfLiteral fcx2 v0)
+        Core.TermMap v0 -> inferTypeOfMap fcx2 cx v0
+        Core.TermMaybe v0 -> inferTypeOfOptional fcx2 cx v0
+        Core.TermPair v0 -> inferTypeOfPair fcx2 cx v0
+        Core.TermRecord v0 -> inferTypeOfRecord fcx2 cx v0
+        Core.TermSet v0 -> inferTypeOfSet fcx2 cx v0
+        Core.TermTypeApplication v0 -> inferTypeOfTypeApplication fcx2 cx v0
+        Core.TermTypeLambda v0 -> inferTypeOfTypeLambda fcx2 cx v0
+        Core.TermUnion v0 -> inferTypeOfInjection fcx2 cx v0
+        Core.TermUnit -> Right (inferTypeOfUnit fcx2)
+        Core.TermVariable v0 -> inferTypeOfVariable fcx2 cx v0
+        Core.TermWrap v0 -> inferTypeOfWrappedTerm fcx2 cx v0
+
+-- | Infer the type of a type application (Either version)
+inferTypeOfTypeApplication :: Context.Context -> Graph.Graph -> Core.TypeApplicationTerm -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfTypeApplication fcx cx tt = inferTypeOfTerm fcx cx (Core.typeApplicationTermBody tt) "type application term"
+
+-- | Infer the type of a type abstraction (Either version)
+inferTypeOfTypeLambda :: Context.Context -> Graph.Graph -> Core.TypeLambda -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfTypeLambda fcx cx ta = inferTypeOfTerm fcx cx (Core.typeLambdaBody ta) "type abstraction"
+
+-- | The trivial inference rule for the unit term
+inferTypeOfUnit :: Context.Context -> Typing_.InferenceResult
+inferTypeOfUnit fcx =
+    Typing_.InferenceResult {
+      Typing_.inferenceResultTerm = Core.TermUnit,
+      Typing_.inferenceResultType = Core.TypeUnit,
+      Typing_.inferenceResultSubst = Substitution.idTypeSubst,
+      Typing_.inferenceResultClassConstraints = Maps.empty,
+      Typing_.inferenceResultContext = fcx}
+
+-- | Infer the type of an unwrap operation (Either version)
+inferTypeOfUnwrap :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfUnwrap fcx cx tname =
+    Eithers.bind (Schemas.requireSchemaType fcx (Graph.graphSchemaTypes cx) tname) (\stRp ->
+      let schemaType = Pairs.first stRp
+          fcx2 = Pairs.second stRp
+          svars = Core.typeSchemeVariables schemaType
+          stype = Core.typeSchemeType schemaType
+      in (Eithers.bind (Core_.wrappedType fcx2 tname stype) (\wtyp -> Right (yield fcx2 (buildTypeApplicationTerm svars (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap tname)))) (Core.TypeFunction (Core.FunctionType {
+        Core.functionTypeDomain = (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)),
+        Core.functionTypeCodomain = wtyp})) Substitution.idTypeSubst))))
+
+-- | Infer the type of a variable (Either version)
+inferTypeOfVariable :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfVariable fcx cx name =
+    Maybes.maybe (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "Variable not bound to type: " (Core.unName name)))),
+      Context.inContextContext = fcx})) (\scheme ->
+      let tsResult = Schemas.instantiateTypeScheme fcx scheme
+          ts = Pairs.first tsResult
+          fcx2 = Pairs.second tsResult
+          constraints = Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints ts)
+      in (Right (Typing_.InferenceResult {
+        Typing_.inferenceResultTerm = (buildTypeApplicationTerm (Core.typeSchemeVariables ts) (Core.TermVariable name)),
+        Typing_.inferenceResultType = (Core.typeSchemeType ts),
+        Typing_.inferenceResultSubst = Substitution.idTypeSubst,
+        Typing_.inferenceResultClassConstraints = constraints,
+        Typing_.inferenceResultContext = fcx2}))) (Maps.lookup name (Graph.graphBoundTypes cx))
+
+-- | Infer the type of a wrapped term (Either version)
+inferTypeOfWrappedTerm :: Context.Context -> Graph.Graph -> Core.WrappedTerm -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+inferTypeOfWrappedTerm fcx cx wt =
+
+      let tname = Core.wrappedTermTypeName wt
+          term = Core.wrappedTermBody wt
+      in (Eithers.bind (Schemas.requireSchemaType fcx (Graph.graphSchemaTypes cx) tname) (\stRp ->
+        let schemaType = Pairs.first stRp
+            fcx2 = Pairs.second stRp
+        in (Eithers.bind (inferTypeOfTerm fcx2 cx term "wrapped term") (\result ->
+          let fcx3 = Typing_.inferenceResultContext result
+              svars = Core.typeSchemeVariables schemaType
+              stype = Core.typeSchemeType schemaType
+              iterm = Typing_.inferenceResultTerm result
+              itype = Typing_.inferenceResultType result
+              isubst = Typing_.inferenceResultSubst result
+              ityp = Core.TypeWrap itype
+          in (Eithers.bind (mapConstraints fcx3 cx (\subst -> yield fcx3 (buildTypeApplicationTerm svars (Core.TermWrap (Core.WrappedTerm {
+            Core.wrappedTermTypeName = tname,
+            Core.wrappedTermBody = iterm}))) (Schemas.nominalApplication tname (Lists.map (\x -> Core.TypeVariable x) svars)) (Substitution.composeTypeSubst isubst subst)) [
+            Typing_.TypeConstraint {
+              Typing_.typeConstraintLeft = stype,
+              Typing_.typeConstraintRight = ityp,
+              Typing_.typeConstraintComment = "schema type of wrapper"}]) (\mcResult -> Right mcResult))))))
+
+-- | Infer types for temporary let bindings (Either version)
+inferTypesOfTemporaryBindings :: Context.Context -> Graph.Graph -> [Core.Binding] -> Either (Context.InContext Errors.Error) (([Core.Term], ([Core.Type], (Typing_.TypeSubst, (M.Map Core.Name Core.TypeVariableMetadata)))), Context.Context)
+inferTypesOfTemporaryBindings fcx cx bins =
+    Logic.ifElse (Lists.null bins) (Right (([], ([], (Substitution.idTypeSubst, Maps.empty))), fcx)) (
+      let dflt =
+
+                let binding = Lists.head bins
+                    k = Core.bindingName binding
+                    v = Core.bindingTerm binding
+                    tl = Lists.tail bins
+                in (Eithers.bind (inferTypeOfTerm fcx cx v (Strings.cat [
+                  "temporary let binding '",
+                  (Core.unName k),
+                  "'"])) (\result1 ->
+                  let fcx2 = Typing_.inferenceResultContext result1
+                      j = Typing_.inferenceResultTerm result1
+                      u_prime = Typing_.inferenceResultType result1
+                      u = Typing_.inferenceResultSubst result1
+                      c1Inferred = Typing_.inferenceResultClassConstraints result1
+                  in (Eithers.bind (Maybes.maybe (Right Maps.empty) (\ts ->
+                    let tsResult = Schemas.instantiateTypeScheme fcx2 ts
+                        instantiatedTs = Pairs.first tsResult
+                        freshConstraints = Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints instantiatedTs)
+                    in (Eithers.bind (Eithers.bimap (\_ic -> Context.InContext {
+                      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unificationErrorMessage (Context.inContextObject _ic)))),
+                      Context.inContextContext = (Context.inContextContext _ic)}) (\_a -> _a) (Unification.unifyTypes fcx2 (Graph.graphSchemaTypes cx) (Core.typeSchemeType instantiatedTs) u_prime "original binding type")) (\unifySubst -> Right (Substitution.substInClassConstraints unifySubst freshConstraints)))) (Core.bindingType binding)) (\originalBindingConstraints ->
+                    let c1 = mergeClassConstraints c1Inferred originalBindingConstraints
+                    in (Eithers.bind (inferTypesOfTemporaryBindings fcx2 (Substitution.substInContext u cx) tl) (\rp2 ->
+                      let result2 = Pairs.first rp2
+                          fcx3 = Pairs.second rp2
+                          h = Pairs.first result2
+                          r_prime = Pairs.first (Pairs.second result2)
+                          restPair = Pairs.second (Pairs.second result2)
+                          r = Pairs.first restPair
+                          c2 = Pairs.second restPair
+                          c1Subst = Substitution.substInClassConstraints r c1
+                          mergedConstraints = mergeClassConstraints c1Subst c2
+                      in (Right ((Lists.cons (Substitution.substTypesInTerm r j) h, (Lists.cons (Substitution.substInType r u_prime) r_prime, (Substitution.composeTypeSubst u r, mergedConstraints))), fcx3))))))))
+      in dflt)
+
+-- | Check if a variable is unbound in context
+isUnbound :: Graph.Graph -> Core.Name -> Bool
+isUnbound cx v =
+    Logic.and (Logic.not (Sets.member v (freeVariablesInContext cx))) (Logic.not (Maps.member v (Graph.graphSchemaTypes cx)))
+
+-- | Map over type constraints after unification
+mapConstraints :: Context.Context -> Graph.Graph -> (Typing_.TypeSubst -> t0) -> [Typing_.TypeConstraint] -> Either (Context.InContext Errors.Error) t0
+mapConstraints flowCx cx f constraints =
+    Eithers.bind (Eithers.bimap (\_ic -> Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors.unificationErrorMessage (Context.inContextObject _ic)))),
+      Context.inContextContext = (Context.inContextContext _ic)}) (\_a -> _a) (Unification.unifyTypeConstraints flowCx (Graph.graphSchemaTypes cx) constraints)) (\s -> Eithers.bind (Checking.checkTypeSubst flowCx cx s) (\_ -> Right (f s)))
+
+-- | Merge two maps of class constraints. When both maps have constraints for the same variable, union the class sets.
+mergeClassConstraints :: Ord t0 => (M.Map t0 Core.TypeVariableMetadata -> M.Map t0 Core.TypeVariableMetadata -> M.Map t0 Core.TypeVariableMetadata)
+mergeClassConstraints m1 m2 =
+    Lists.foldl (\acc -> \pair ->
+      let k = Pairs.first pair
+          v = Pairs.second pair
+      in (Maybes.maybe (Maps.insert k v acc) (\existing ->
+        let merged =
+                Core.TypeVariableMetadata {
+                  Core.typeVariableMetadataClasses = (Sets.union (Core.typeVariableMetadataClasses existing) (Core.typeVariableMetadataClasses v))}
+        in (Maps.insert k merged acc)) (Maps.lookup k acc))) m1 (Maps.toList m2)
+
+-- | Show an inference result for debugging
+showInferenceResult :: Typing_.InferenceResult -> String
+showInferenceResult result =
+
+      let term = Typing_.inferenceResultTerm result
+          typ = Typing_.inferenceResultType result
+          subst = Typing_.inferenceResultSubst result
+      in (Strings.cat [
+        "{term=",
+        (Core__.term term),
+        ", type=",
+        (Core__.type_ typ),
+        ", subst=",
+        (Typing.typeSubst subst),
+        "}"])
+
+-- | Create an inference result with no class constraints
+yield :: Context.Context -> Core.Term -> Core.Type -> Typing_.TypeSubst -> Typing_.InferenceResult
+yield fcx term typ subst =
+    Typing_.InferenceResult {
+      Typing_.inferenceResultTerm = (Substitution.substTypesInTerm subst term),
+      Typing_.inferenceResultType = (Substitution.substInType subst typ),
+      Typing_.inferenceResultSubst = subst,
+      Typing_.inferenceResultClassConstraints = Maps.empty,
+      Typing_.inferenceResultContext = fcx}
+
+-- | Create a checked inference result
+yieldChecked :: Context.Context -> Core.Term -> Core.Type -> Typing_.TypeSubst -> Typing_.InferenceResult
+yieldChecked fcx term typ subst =
+
+      let iterm = Substitution.substTypesInTerm subst term
+          itype = Substitution.substInType subst typ
+      in Typing_.InferenceResult {
+        Typing_.inferenceResultTerm = iterm,
+        Typing_.inferenceResultType = itype,
+        Typing_.inferenceResultSubst = subst,
+        Typing_.inferenceResultClassConstraints = Maps.empty,
+        Typing_.inferenceResultContext = fcx}
+
+-- | Create a checked inference result with class constraints
+yieldCheckedWithConstraints :: Context.Context -> Core.Term -> Core.Type -> Typing_.TypeSubst -> M.Map Core.Name Core.TypeVariableMetadata -> Typing_.InferenceResult
+yieldCheckedWithConstraints fcx term typ subst constraints =
+
+      let iterm = Substitution.substTypesInTerm subst term
+          itype = Substitution.substInType subst typ
+          iconstraints = Substitution.substInClassConstraints subst constraints
+      in Typing_.InferenceResult {
+        Typing_.inferenceResultTerm = iterm,
+        Typing_.inferenceResultType = itype,
+        Typing_.inferenceResultSubst = subst,
+        Typing_.inferenceResultClassConstraints = iconstraints,
+        Typing_.inferenceResultContext = fcx}
+
+-- | Create an inference result with debug output
+yieldDebug :: Context.Context -> t0 -> String -> Core.Term -> Core.Type -> Typing_.TypeSubst -> Either (Context.InContext Errors.Error) Typing_.InferenceResult
+yieldDebug fcx cx debugId term typ subst =
+
+      let rterm = Substitution.substTypesInTerm subst term
+          rtyp = Substitution.substInType subst typ
+      in (Eithers.bind (Annotations.debugIf fcx debugId (Strings.cat [
+        "\n\tterm: ",
+        (Core__.term term),
+        "\n\ttyp: ",
+        (Core__.type_ typ),
+        "\n\tsubst: ",
+        (Typing.typeSubst subst),
+        "\n\trterm: ",
+        (Core__.term rterm),
+        "\n\trtyp: ",
+        (Core__.type_ rtyp)])) (\result -> Right (Typing_.InferenceResult {
+        Typing_.inferenceResultTerm = rterm,
+        Typing_.inferenceResultType = rtyp,
+        Typing_.inferenceResultSubst = subst,
+        Typing_.inferenceResultClassConstraints = Maps.empty,
+        Typing_.inferenceResultContext = fcx})))
+
+-- | Create an inference result with class constraints
+yieldWithConstraints :: Context.Context -> Core.Term -> Core.Type -> Typing_.TypeSubst -> M.Map Core.Name Core.TypeVariableMetadata -> Typing_.InferenceResult
+yieldWithConstraints fcx term typ subst constraints =
+    Typing_.InferenceResult {
+      Typing_.inferenceResultTerm = (Substitution.substTypesInTerm subst term),
+      Typing_.inferenceResultType = (Substitution.substInType subst typ),
+      Typing_.inferenceResultSubst = subst,
+      Typing_.inferenceResultClassConstraints = constraints,
+      Typing_.inferenceResultContext = fcx}
diff --git a/src/gen-main/haskell/Hydra/Json/Bootstrap.hs b/src/gen-main/haskell/Hydra/Json/Bootstrap.hs
--- a/src/gen-main/haskell/Hydra/Json/Bootstrap.hs
+++ b/src/gen-main/haskell/Hydra/Json/Bootstrap.hs
@@ -12,1493 +12,1661 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-typesByName :: (M.Map Core.Name Core.Type)
-typesByName = (M.fromList [
-  (Core.Name "hydra.compute.Adapter", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = (Core.Name "s1"),
-      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-        Core.forallTypeParameter = (Core.Name "s2"),
-        Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t1"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t2"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "v1"),
-              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "v2"),
-                Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-                  Core.rowTypeTypeName = (Core.Name "hydra.compute.Adapter"),
-                  Core.rowTypeFields = [
-                    Core.FieldType {
-                      Core.fieldTypeName = (Core.Name "isLossy"),
-                      Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                        Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                        Core.annotatedTypeAnnotation = (M.fromList [
-                          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Whether information may be lost in the course of this adaptation")))])}))},
-                    Core.FieldType {
-                      Core.fieldTypeName = (Core.Name "source"),
-                      Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                        Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "t1")),
-                        Core.annotatedTypeAnnotation = (M.fromList [
-                          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The source type")))])}))},
-                    Core.FieldType {
-                      Core.fieldTypeName = (Core.Name "target"),
-                      Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                        Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "t2")),
-                        Core.annotatedTypeAnnotation = (M.fromList [
-                          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The target type")))])}))},
-                    Core.FieldType {
-                      Core.fieldTypeName = (Core.Name "coder"),
-                      Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                        Core.annotatedTypeBody = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Coder")),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s1"))})),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s2"))})),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v1"))})),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v2"))})),
-                        Core.annotatedTypeAnnotation = (M.fromList [
-                          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The coder for transforming instances of the source type to instances of the target type")))])}))}]}))}))}))}))}))}))})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A two-level bidirectional encoder which adapts types to types and terms to terms")))])}))),
-  (Core.Name "hydra.compute.Bicoder", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = (Core.Name "s1"),
-      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-        Core.forallTypeParameter = (Core.Name "s2"),
-        Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t1"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t2"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "v1"),
-              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "v2"),
-                Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-                  Core.rowTypeTypeName = (Core.Name "hydra.compute.Bicoder"),
-                  Core.rowTypeFields = [
-                    Core.FieldType {
-                      Core.fieldTypeName = (Core.Name "encode"),
-                      Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                        Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                          Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Adapter")),
-                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s1"))})),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s2"))})),
-                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v1"))})),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v2"))}))})),
-                        Core.annotatedTypeAnnotation = (M.fromList [
-                          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function from source types to adapters")))])}))},
-                    Core.FieldType {
-                      Core.fieldTypeName = (Core.Name "decode"),
-                      Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                        Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                          Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Adapter")),
-                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s2"))})),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s1"))})),
-                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v2"))})),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v1"))}))})),
-                        Core.annotatedTypeAnnotation = (M.fromList [
-                          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function from target types to adapters")))])}))}]}))}))}))}))}))}))})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A two-level encoder and decoder, operating both at a type level and an instance (data) level")))])}))),
-  (Core.Name "hydra.compute.Coder", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = (Core.Name "s1"),
-      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-        Core.forallTypeParameter = (Core.Name "s2"),
-        Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "v1"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "v2"),
-            Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-              Core.rowTypeTypeName = (Core.Name "hydra.compute.Coder"),
-              Core.rowTypeFields = [
-                Core.FieldType {
-                  Core.fieldTypeName = (Core.Name "encode"),
-                  Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                    Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v1")),
-                      Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Flow")),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s1"))})),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v2"))}))})),
-                    Core.annotatedTypeAnnotation = (M.fromList [
-                      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function from source values to a flow of target values")))])}))},
-                Core.FieldType {
-                  Core.fieldTypeName = (Core.Name "decode"),
-                  Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                    Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v2")),
-                      Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Flow")),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s2"))})),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v1"))}))})),
-                    Core.annotatedTypeAnnotation = (M.fromList [
-                      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function from target values to a flow of source values")))])}))}]}))}))}))}))})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An encoder and decoder; a bidirectional flow between two types")))])}))),
-  (Core.Name "hydra.compute.Flow", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = (Core.Name "s"),
-      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-        Core.forallTypeParameter = (Core.Name "v"),
-        Core.forallTypeBody = (Core.TypeWrap (Core.WrappedType {
-          Core.wrappedTypeTypeName = (Core.Name "hydra.compute.Flow"),
-          Core.wrappedTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "s")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.compute.Trace")),
-              Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.FlowState")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s"))})),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))}))})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A variant of the State monad with built-in logging and error handling")))])}))),
-  (Core.Name "hydra.compute.FlowState", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = (Core.Name "s"),
-      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-        Core.forallTypeParameter = (Core.Name "v"),
-        Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-          Core.rowTypeTypeName = (Core.Name "hydra.compute.FlowState"),
-          Core.rowTypeFields = [
-            Core.FieldType {
-              Core.fieldTypeName = (Core.Name "value"),
-              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "v"))),
-                Core.annotatedTypeAnnotation = (M.fromList [
-                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The resulting value, or nothing in the case of failure")))])}))},
-            Core.FieldType {
-              Core.fieldTypeName = (Core.Name "state"),
-              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "s")),
-                Core.annotatedTypeAnnotation = (M.fromList [
-                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The final state")))])}))},
-            Core.FieldType {
-              Core.fieldTypeName = (Core.Name "trace"),
-              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-                Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.compute.Trace")),
-                Core.annotatedTypeAnnotation = (M.fromList [
-                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The trace (log) produced during evaluation")))])}))}]}))}))})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The result of evaluating a Flow")))])}))),
-  (Core.Name "hydra.compute.Trace", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.compute.Trace"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "stack"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A stack of context labels")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "messages"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A log of warnings and/or info messages")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "other"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map of string keys to arbitrary terms as values, for application-specific use")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A container for logging and error information")))])}))),
-  (Core.Name "hydra.core.AnnotatedTerm", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term being annotated")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "annotation"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The annotation as a map from keys to values")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term together with an annotation")))])}))),
-  (Core.Name "hydra.core.AnnotatedType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.AnnotatedType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type being annotated")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "annotation"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The annotation as a map from keys to values")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type together with an annotation")))])}))),
-  (Core.Name "hydra.core.Application", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Application"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "function"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The left-hand side of the application")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "argument"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The right-hand side of the application")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term which applies a function to an argument")))])}))),
-  (Core.Name "hydra.core.ApplicationType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.ApplicationType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "function"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The left-hand side of the application")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "argument"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The right-hand side of the application")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type-level analog of an application term")))])}))),
-  (Core.Name "hydra.core.Binding", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Binding"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "name"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the bound variable")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "term"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term to which the variable is bound")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "type"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.TypeScheme"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The optional type of the bound term")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A field with an optional type scheme, used to bind variables to terms in a 'let' expression")))])}))),
-  (Core.Name "hydra.core.CaseStatement", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.CaseStatement"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeName"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the union type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "default"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.Term"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional default case, used if none of the explicit cases match")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "cases"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Field"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A list of case alternatives, one per union field")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A union elimination; a case statement")))])}))),
-  (Core.Name "hydra.core.EitherType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.EitherType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "left"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The 'left' alternative")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "right"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The 'right' alternative")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type which provides a choice between a 'left' type and a 'right' type")))])}))),
-  (Core.Name "hydra.core.Elimination", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Elimination"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "record"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Projection")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Eliminates a record by projecting a given field")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "union"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.CaseStatement")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Eliminates a union term by matching over the fields of the union. This is a case statement.")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "wrap"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Unwrap a wrapped term")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A corresponding elimination for an introduction term")))])}))),
-  (Core.Name "hydra.core.Field", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Field"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "name"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the field")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "term"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term value of the field")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A name/term pair")))])}))),
-  (Core.Name "hydra.core.FieldType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.FieldType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "name"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the field")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "type"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of the field")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A name/type pair")))])}))),
-  (Core.Name "hydra.core.FloatType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.FloatType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "bigfloat"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An arbitrary-precision floating-point type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "float32"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit floating-point type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "float64"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit floating-point type")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A floating-point type")))])}))),
-  (Core.Name "hydra.core.FloatValue", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.FloatValue"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "bigfloat"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeBigfloat)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An arbitrary-precision floating-point value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "float32"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit floating-point value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "float64"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit floating-point value")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A floating-point literal value")))])}))),
-  (Core.Name "hydra.core.ForallType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.ForallType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "parameter"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The variable which is bound by the lambda")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body of the lambda")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A universally quantified type; the System F equivalent of a type scheme, and the type-level equivalent of a lambda term.")))])}))),
-  (Core.Name "hydra.core.Function", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Function"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "elimination"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Elimination")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An elimination for any of a few term variants")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "lambda"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Lambda")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function abstraction (lambda)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "primitive"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A reference to a built-in (primitive) function")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function")))])}))),
-  (Core.Name "hydra.core.FunctionType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.FunctionType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "domain"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The domain (input) type of the function")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "codomain"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The codomain (output) type of the function")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function type, also known as an arrow type")))])}))),
-  (Core.Name "hydra.core.Injection", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Injection"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeName"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the union type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "field"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Field")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The field being injected, including its name and value")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An instance of a union type; i.e. a string-indexed generalization of inl() or inr()")))])}))),
-  (Core.Name "hydra.core.IntegerType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.IntegerType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "bigint"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An arbitrary-precision integer type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "int8"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An 8-bit signed integer type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "int16"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 16-bit signed integer type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "int32"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit signed integer type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "int64"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit signed integer type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "uint8"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An 8-bit unsigned integer type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "uint16"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 16-bit unsigned integer type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "uint32"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit unsigned integer type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "uint64"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit unsigned integer type")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An integer type")))])}))),
-  (Core.Name "hydra.core.IntegerValue", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.IntegerValue"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "bigint"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An arbitrary-precision integer value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "int8"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An 8-bit signed integer value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "int16"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 16-bit signed integer value (short value)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "int32"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit signed integer value (int value)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "int64"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit signed integer value (long value)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "uint8"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint8)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An 8-bit unsigned integer value (byte)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "uint16"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint16)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 16-bit unsigned integer value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "uint32"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint32)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit unsigned integer value (unsigned int)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "uint64"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit unsigned integer value (unsigned long)")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An integer literal value")))])}))),
-  (Core.Name "hydra.core.Lambda", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Lambda"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "parameter"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The parameter of the lambda")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "domain"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.Type"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional domain type for the lambda")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body of the lambda")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function abstraction (lambda)")))])}))),
-  (Core.Name "hydra.core.Let", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Let"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "bindings"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Binding"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The list of variable bindings")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body term in which the variables are bound")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A set of (possibly recursive) 'let' bindings together with a body in which they are bound")))])}))),
-  (Core.Name "hydra.core.Literal", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Literal"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "binary"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeBinary),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A binary literal")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "boolean"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A boolean literal")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "float"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.FloatValue")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A floating-point literal")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "integer"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.IntegerValue")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An integer literal")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "string"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A string literal")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term constant; an instance of a literal type")))])}))),
-  (Core.Name "hydra.core.LiteralType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.LiteralType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "binary"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of a binary (byte string) value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "boolean"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of a boolean (true/false) value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "float"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.FloatType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of a floating-point value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "integer"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.IntegerType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of an integer value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "string"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of a string value")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any of a fixed set of literal types, also called atomic types, base types, primitive types, or type constants")))])}))),
-  (Core.Name "hydra.core.MapType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.MapType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "keys"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of keys in the map")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "values"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of values in the map")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map type")))])}))),
-  (Core.Name "hydra.core.Name", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeWrap (Core.WrappedType {
-      Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-      Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A unique identifier in some context; a string-valued key")))])}))),
-  (Core.Name "hydra.core.PairType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.PairType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "first"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The first component of the pair")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "second"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The second component of the pair")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type which pairs a 'first' type and a 'second' type")))])}))),
-  (Core.Name "hydra.core.Projection", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Projection"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeName"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the record type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "field"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the projected field")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A record elimination; a projection")))])}))),
-  (Core.Name "hydra.core.Record", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Record"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeName"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the record type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "fields"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Field"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The fields of the record, as a list of name/term pairs")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A record, or labeled tuple; a map of field names to terms")))])}))),
-  (Core.Name "hydra.core.RowType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.RowType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeName"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the row type, which must correspond to the name of a Type element")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "fields"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.FieldType"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The fields of this row type, excluding any inherited fields")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A labeled record or union type")))])}))),
-  (Core.Name "hydra.core.Term", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Term"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "annotated"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedTerm")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term annotated with metadata")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "application"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Application")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function application")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "either"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An either value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "function"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Function")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function term")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "let"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Let")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 'let' term, which binds variables to terms")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "list"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Term"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A list")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "literal"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Literal")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A literal value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "map"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map of keys to values")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "maybe"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.Term"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "pair"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A pair (2-tuple)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "record"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Record")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A record term")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "set"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.core.Term"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A set of values")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeApplication"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.TypeApplicationTerm")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A System F type application term")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeLambda"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.TypeLambda")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A System F type abstraction term")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "union"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Injection")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An injection; an instance of a union type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "unit"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A unit value; a term with no value")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "variable"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A variable reference")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "wrap"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.WrappedTerm")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A wrapped term; an instance of a wrapper type (newtype)")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A data term")))])}))),
-  (Core.Name "hydra.core.Type", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.Type"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "annotated"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An annotated type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "application"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.ApplicationType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type application")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "either"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.EitherType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An either (sum) type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "forall"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.ForallType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A universally quantified (polymorphic) type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "function"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.FunctionType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "list"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A list type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "literal"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.LiteralType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A literal type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "map"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.MapType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "maybe"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "pair"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.PairType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A pair (2-tuple) type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "record"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.RowType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A record type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "set"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A set type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "union"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.RowType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A union type with field names")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "unit"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = Core.TypeUnit,
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The unit type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "variable"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type variable")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "wrap"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.WrappedType")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A wrapped type (newtype)")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A data type")))])}))),
-  (Core.Name "hydra.core.TypeApplicationTerm", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term being applied to a type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "type"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type argument")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term applied to a type; a type application")))])}))),
-  (Core.Name "hydra.core.TypeLambda", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.TypeLambda"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "parameter"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type variable introduced by the abstraction")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body of the abstraction")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A System F type abstraction term")))])}))),
-  (Core.Name "hydra.core.TypeScheme", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.TypeScheme"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "variables"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Name"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The free type variables")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "type"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type expression")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "constraints"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.TypeVariableMetadata"))}))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Optional metadata for type variables, including typeclass constraints. The map keys are type variable names.")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type expression together with free type variables occurring in the expression")))])}))),
-  (Core.Name "hydra.core.TypeVariableMetadata", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "classes"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.core.Name"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The set of typeclass constraints on this type variable")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Metadata associated with a type variable, including typeclass constraints")))])}))),
-  (Core.Name "hydra.core.WrappedTerm", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.WrappedTerm"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeName"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the wrapper type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The wrapped term")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term wrapped in a type name")))])}))),
-  (Core.Name "hydra.core.WrappedType", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.core.WrappedType"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeName"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the wrapper (newtype)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The wrapped type")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type wrapped in a type name; a newtype")))])}))),
-  (Core.Name "hydra.graph.Graph", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.graph.Graph"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "elements"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Binding"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All of the elements in the graph")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "environment"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-              Core.mapTypeValues = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.Term")))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The lambda environment of this graph context; it indicates whether a variable is bound by a lambda (Nothing) or a let (Just term)")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "types"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme"))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The typing environment of the graph")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "body"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body of the term which generated this context")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "primitives"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.graph.Primitive"))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All supported primitive constants and functions, by name")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "schema"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.graph.Graph"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The schema of this graph. If this parameter is omitted (nothing), the graph is its own schema graph.")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A graph, or set of name/term bindings together with parameters (annotations, primitives) and a schema graph")))])}))),
-  (Core.Name "hydra.graph.Primitive", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.graph.Primitive"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "name"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The unique name of the primitive function")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "type"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type signature of the primitive function")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "implementation"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Term"))),
-              Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Flow")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.graph.Graph"))})),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A concrete implementation of the primitive function")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A built-in function")))])}))),
-  (Core.Name "hydra.graph.TermCoder", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = (Core.Name "a"),
-      Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-        Core.rowTypeTypeName = (Core.Name "hydra.graph.TermCoder"),
-        Core.rowTypeFields = [
-          Core.FieldType {
-            Core.fieldTypeName = (Core.Name "type"),
-            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-              Core.annotatedTypeAnnotation = (M.fromList [
-                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The Hydra type of encoded terms")))])}))},
-          Core.FieldType {
-            Core.fieldTypeName = (Core.Name "coder"),
-            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Coder")),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.graph.Graph"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.graph.Graph"))})),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})),
-              Core.annotatedTypeAnnotation = (M.fromList [
-                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A coder between Hydra terms and instances of the given type")))])}))}]}))})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type together with a coder for mapping terms into arguments for primitive functions, and mapping computed results into terms")))])}))),
-  (Core.Name "hydra.module.Definition", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.module.Definition"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "term"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.module.TermDefinition")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term definition")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "type"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.module.TypeDefinition")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type definition")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A definition, which may be either a term or type definition")))])}))),
-  (Core.Name "hydra.module.FileExtension", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeWrap (Core.WrappedType {
-      Core.wrappedTypeTypeName = (Core.Name "hydra.module.FileExtension"),
-      Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A file extension (without the dot), e.g. \"json\" or \"py\"")))])}))),
-  (Core.Name "hydra.module.Library", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.module.Library"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "namespace"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A common prefix for all primitive function names in the library")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "prefix"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A preferred namespace prefix for function names in the library")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "primitives"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.graph.Primitive"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The primitives defined in this library")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A library of primitive functions")))])}))),
-  (Core.Name "hydra.module.Module", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.module.Module"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "namespace"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A common prefix for all element names in the module")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "elements"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Binding"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The elements defined in this module")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "termDependencies"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.module.Namespace"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any modules which the term expressions of this module directly depend upon")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "typeDependencies"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.module.Namespace"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any modules which the type expressions of this module directly depend upon")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "description"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional human-readable description of the module")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A logical collection of elements in the same namespace, having dependencies on zero or more other modules")))])}))),
-  (Core.Name "hydra.module.Namespace", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeWrap (Core.WrappedType {
-      Core.wrappedTypeTypeName = (Core.Name "hydra.module.Namespace"),
-      Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A prefix for element names")))])}))),
-  (Core.Name "hydra.module.Namespaces", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = (Core.Name "n"),
-      Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-        Core.rowTypeTypeName = (Core.Name "hydra.module.Namespaces"),
-        Core.rowTypeFields = [
-          Core.FieldType {
-            Core.fieldTypeName = (Core.Name "focus"),
-            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
-                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "n"))})),
-              Core.annotatedTypeAnnotation = (M.fromList [
-                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The namespace in focus, together with its associated value")))])}))},
-          Core.FieldType {
-            Core.fieldTypeName = (Core.Name "mapping"),
-            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
-                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
-                Core.mapTypeValues = (Core.TypeVariable (Core.Name "n"))})),
-              Core.annotatedTypeAnnotation = (M.fromList [
-                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A mapping of namespaces to values")))])}))}]}))})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A mapping from namespaces to values of type n, with a focus on one namespace")))])}))),
-  (Core.Name "hydra.module.QualifiedName", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.module.QualifiedName"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "namespace"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.module.Namespace"))),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The optional namespace")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "local"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The local name")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A qualified name consisting of an optional namespace together with a mandatory local name")))])}))),
-  (Core.Name "hydra.module.TermDefinition", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.module.TermDefinition"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "name"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the term")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "term"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term being defined")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "type"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type scheme of the term, including any class constraints")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term-level definition, including a name, a term, and the type scheme of the term")))])}))),
-  (Core.Name "hydra.module.TypeDefinition", (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = (Core.Name "hydra.module.TypeDefinition"),
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "name"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the type")))])}))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "type"),
-          Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-            Core.annotatedTypeAnnotation = (M.fromList [
-              (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type being defined")))])}))}]})),
-    Core.annotatedTypeAnnotation = (M.fromList [
-      (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type-level definition, including a name and the type")))])})))])
+typesByName :: M.Map Core.Name Core.Type
+typesByName =
+    M.fromList [
+      (Core.Name "hydra.coders.AdapterContext", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "graph"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The underlying graph of elements and primitives")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "language"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.coders.Language")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The language being encoded or decoded")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "adapters"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Adapter")),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.core.Type"))})),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.core.Type"))})),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map of type names to adapters for those types")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An evaluation context together with a source language and a target language")))])}))),
+      (Core.Name "hydra.coders.CoderDirection", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "encode"),
+            Core.fieldTypeType = Core.TypeUnit},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "decode"),
+            Core.fieldTypeType = Core.TypeUnit}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Indicates either the 'out' or the 'in' direction of a coder")))])}))),
+      (Core.Name "hydra.coders.Language", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "name"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.coders.LanguageName")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The unique name of the language")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "constraints"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.coders.LanguageConstraints")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The constraints which characterize the language")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A named language together with language-specific constraints")))])}))),
+      (Core.Name "hydra.coders.LanguageConstraints", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "eliminationVariants"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.variants.EliminationVariant"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All supported elimination variants")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "literalVariants"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.variants.LiteralVariant"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All supported literal variants")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "floatTypes"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.core.FloatType"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All supported float types")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "functionVariants"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.variants.FunctionVariant"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All supported function variants")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "integerTypes"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.core.IntegerType"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All supported integer types")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "termVariants"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.variants.TermVariant"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All supported term variants")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeVariants"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.variants.TypeVariant"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All supported type variants")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "types"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A logical set of types, as a predicate which tests a type for inclusion")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A set of constraints on valid type and term expressions, characterizing a language")))])}))),
+      (Core.Name "hydra.coders.LanguageName", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The unique name of a language")))])}))),
+      (Core.Name "hydra.coders.SymmetricAdapter", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = (Core.Name "t"),
+          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+            Core.forallTypeParameter = (Core.Name "v"),
+            Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Adapter")),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t"))})),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t"))})),
+                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
+              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))})),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A bidirectional encoder which maps between the same type and term languages on either side")))])}))),
+      (Core.Name "hydra.coders.TraversalOrder", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "pre"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Pre-order traversal")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "post"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Post-order traversal")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Specifies either a pre-order or post-order traversal")))])}))),
+      (Core.Name "hydra.coders.TypeAdapter", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.coders.AdapterContext")),
+          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+              Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.coders.SymmetricAdapter")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.core.Type"))})),
+                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))}))}))})),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function which maps a Hydra type to a symmetric adapter between types and terms")))])}))),
+      (Core.Name "hydra.context.Context", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "trace"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A stack of context labels describing the current execution path")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "messages"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A log of warnings and/or info messages")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "other"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map of string keys to arbitrary terms as values, for application-specific use")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An execution context for tracing and diagnostics, threaded through function calls")))])}))),
+      (Core.Name "hydra.context.InContext", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = (Core.Name "e"),
+          Core.forallTypeBody = (Core.TypeRecord [
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "object"),
+              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "e")),
+                Core.annotatedTypeAnnotation = (M.fromList [
+                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A domain object; typically an error")))])}))},
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "context"),
+              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.context.Context")),
+                Core.annotatedTypeAnnotation = (M.fromList [
+                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The execution context at the point of capture")))])}))}])})),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A particular domain object (such as an error) together with an execution context")))])}))),
+      (Core.Name "hydra.core.AnnotatedTerm", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "body"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term being annotated")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "annotation"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The annotation as a map from keys to values")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term together with an annotation")))])}))),
+      (Core.Name "hydra.core.AnnotatedType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "body"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type being annotated")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "annotation"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The annotation as a map from keys to values")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type together with an annotation")))])}))),
+      (Core.Name "hydra.core.Application", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "function"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The left-hand side of the application")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "argument"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The right-hand side of the application")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term which applies a function to an argument")))])}))),
+      (Core.Name "hydra.core.ApplicationType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "function"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The left-hand side of the application")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "argument"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The right-hand side of the application")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type-level analog of an application term")))])}))),
+      (Core.Name "hydra.core.Binding", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "name"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the bound variable")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "term"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term to which the variable is bound")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "type"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.TypeScheme"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The optional type of the bound term")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A field with an optional type scheme, used to bind variables to terms in a 'let' expression")))])}))),
+      (Core.Name "hydra.core.CaseStatement", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeName"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the union type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "default"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.Term"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional default case, used if none of the explicit cases match")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "cases"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Field"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A list of case alternatives, one per union field")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A union elimination; a case statement")))])}))),
+      (Core.Name "hydra.core.EitherType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "left"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The 'left' alternative")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "right"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The 'right' alternative")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type which provides a choice between a 'left' type and a 'right' type")))])}))),
+      (Core.Name "hydra.core.Elimination", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "record"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Projection")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Eliminates a record by projecting a given field")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "union"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.CaseStatement")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Eliminates a union term by matching over the fields of the union. This is a case statement.")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "wrap"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Unwrap a wrapped term")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A corresponding elimination for an introduction term")))])}))),
+      (Core.Name "hydra.core.Field", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "name"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the field")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "term"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term value of the field")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A name/term pair")))])}))),
+      (Core.Name "hydra.core.FieldType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "name"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the field")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "type"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of the field")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A name/type pair")))])}))),
+      (Core.Name "hydra.core.FloatType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "bigfloat"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An arbitrary-precision floating-point type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "float32"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit floating-point type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "float64"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit floating-point type")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A floating-point type")))])}))),
+      (Core.Name "hydra.core.FloatValue", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "bigfloat"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeBigfloat)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An arbitrary-precision floating-point value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "float32"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit floating-point value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "float64"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit floating-point value")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A floating-point literal value")))])}))),
+      (Core.Name "hydra.core.ForallType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "parameter"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The variable which is bound by the lambda")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "body"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body of the lambda")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A universally quantified type; the System F equivalent of a type scheme, and the type-level equivalent of a lambda term.")))])}))),
+      (Core.Name "hydra.core.Function", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "elimination"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Elimination")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An elimination for any of a few term variants")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "lambda"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Lambda")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function abstraction (lambda)")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "primitive"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A reference to a built-in (primitive) function")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function")))])}))),
+      (Core.Name "hydra.core.FunctionType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "domain"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The domain (input) type of the function")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "codomain"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The codomain (output) type of the function")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function type, also known as an arrow type")))])}))),
+      (Core.Name "hydra.core.Injection", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeName"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the union type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "field"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Field")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The field being injected, including its name and value")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An instance of a union type; i.e. a string-indexed generalization of inl() or inr()")))])}))),
+      (Core.Name "hydra.core.IntegerType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "bigint"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An arbitrary-precision integer type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "int8"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An 8-bit signed integer type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "int16"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 16-bit signed integer type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "int32"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit signed integer type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "int64"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit signed integer type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "uint8"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An 8-bit unsigned integer type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "uint16"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 16-bit unsigned integer type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "uint32"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit unsigned integer type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "uint64"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit unsigned integer type")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An integer type")))])}))),
+      (Core.Name "hydra.core.IntegerValue", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "bigint"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An arbitrary-precision integer value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "int8"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An 8-bit signed integer value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "int16"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 16-bit signed integer value (short value)")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "int32"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit signed integer value (int value)")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "int64"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit signed integer value (long value)")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "uint8"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint8)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An 8-bit unsigned integer value (byte)")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "uint16"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint16)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 16-bit unsigned integer value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "uint32"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint32)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 32-bit unsigned integer value (unsigned int)")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "uint64"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 64-bit unsigned integer value (unsigned long)")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An integer literal value")))])}))),
+      (Core.Name "hydra.core.Lambda", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "parameter"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The parameter of the lambda")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "domain"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.Type"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional domain type for the lambda")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "body"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body of the lambda")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function abstraction (lambda)")))])}))),
+      (Core.Name "hydra.core.Let", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "bindings"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Binding"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The list of variable bindings")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "body"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body term in which the variables are bound")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A set of (possibly recursive) 'let' bindings together with a body in which they are bound")))])}))),
+      (Core.Name "hydra.core.Literal", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "binary"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeBinary),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A binary literal")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "boolean"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeBoolean),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A boolean literal")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "float"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.FloatValue")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A floating-point literal")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "integer"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.IntegerValue")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An integer literal")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "string"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A string literal")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term constant; an instance of a literal type")))])}))),
+      (Core.Name "hydra.core.LiteralType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "binary"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of a binary (byte string) value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "boolean"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of a boolean (true/false) value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "float"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.FloatType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of a floating-point value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "integer"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.IntegerType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of an integer value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "string"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of a string value")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any of a fixed set of literal types, also called atomic types, base types, primitive types, or type constants")))])}))),
+      (Core.Name "hydra.core.MapType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "keys"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of keys in the map")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "values"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type of values in the map")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map type")))])}))),
+      (Core.Name "hydra.core.Name", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A unique identifier in some context; a string-valued key")))])}))),
+      (Core.Name "hydra.core.PairType", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "first"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The first component of the pair")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "second"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The second component of the pair")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type which pairs a 'first' type and a 'second' type")))])}))),
+      (Core.Name "hydra.core.Projection", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeName"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the record type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "field"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the projected field")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A record elimination; a projection")))])}))),
+      (Core.Name "hydra.core.Record", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeName"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the record type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "fields"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Field"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The fields of the record, as a list of name/term pairs")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A record, or labeled tuple; a map of field names to terms")))])}))),
+      (Core.Name "hydra.core.Term", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "annotated"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedTerm")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term annotated with metadata")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "application"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Application")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function application")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "either"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An either value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "function"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Function")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function term")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "let"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Let")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A 'let' term, which binds variables to terms")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "list"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Term"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A list")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "literal"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Literal")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A literal value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "map"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map of keys to values")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "maybe"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.Term"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "pair"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A pair (2-tuple)")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "record"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Record")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A record term")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "set"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.core.Term"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A set of values")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeApplication"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.TypeApplicationTerm")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A System F type application term")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeLambda"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.TypeLambda")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A System F type abstraction term")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "union"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Injection")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An injection; an instance of a union type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "unit"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A unit value; a term with no value")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "variable"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A variable reference")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "wrap"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.WrappedTerm")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A wrapped term; an instance of a wrapper type (newtype)")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A data term")))])}))),
+      (Core.Name "hydra.core.Type", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "annotated"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An annotated type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "application"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.ApplicationType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type application")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "either"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.EitherType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An either (sum) type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "forall"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.ForallType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A universally quantified (polymorphic) type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "function"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.FunctionType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "list"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A list type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "literal"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.LiteralType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A literal type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "map"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.MapType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A map type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "maybe"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "pair"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.PairType")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A pair (2-tuple) type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "record"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.FieldType"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A record type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "set"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A set type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "union"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.FieldType"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A union type with field names")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "unit"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The unit type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "variable"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type variable")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "void"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The void (uninhabited, or bottom) type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "wrap"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A wrapped type (newtype)")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A data type")))])}))),
+      (Core.Name "hydra.core.TypeApplicationTerm", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "body"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term being applied to a type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "type"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type argument")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term applied to a type; a type application")))])}))),
+      (Core.Name "hydra.core.TypeLambda", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "parameter"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type variable introduced by the abstraction")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "body"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The body of the abstraction")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A System F type abstraction term")))])}))),
+      (Core.Name "hydra.core.TypeScheme", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "variables"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Name"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The free type variables")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "type"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type expression")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "constraints"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.TypeVariableMetadata"))}))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Optional metadata for type variables, including typeclass constraints. The map keys are type variable names.")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type expression together with free type variables occurring in the expression")))])}))),
+      (Core.Name "hydra.core.TypeVariableMetadata", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "classes"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.core.Name"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The set of typeclass constraints on this type variable")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Metadata associated with a type variable, including typeclass constraints")))])}))),
+      (Core.Name "hydra.core.WrappedTerm", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeName"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the wrapper type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "body"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The wrapped term")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term wrapped in a type name")))])}))),
+      (Core.Name "hydra.errors.DecodingError", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An error that occurred during decoding of a term")))])}))),
+      (Core.Name "hydra.errors.Error", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "checking"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.error.checking.CheckingError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type checking error")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "decoding"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An error that occurred during decoding of a term")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "duplicateBinding"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateBindingError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A duplicate binding name error")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "duplicateField"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateFieldError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A duplicate field name error")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "other"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.errors.OtherError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any other error")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "undefinedField"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedFieldError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A reference to an undefined field")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "undefinedTermVariable"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTermVariableError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A reference to an undefined term variable")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "untypedTermVariable"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.error.core.UntypedTermVariableError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term variable whose type is not known")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "unexpectedTermVariant"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.error.core.UnexpectedTermVariantError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An unexpected term variant")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "unexpectedTypeVariant"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.error.core.UnexpectedTypeVariantError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An unexpected type variant")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "unification"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.errors.UnificationError")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type unification error")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An error of any kind, with kernel errors particularly differentiated")))])}))),
+      (Core.Name "hydra.errors.OtherError", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any other error")))])}))),
+      (Core.Name "hydra.errors.UnificationError", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "leftType"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The left-hand type in the unification")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "rightType"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The right-hand type in the unification")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "message"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A human-readable error message")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An error that occurred during type unification")))])}))),
+      (Core.Name "hydra.graph.Graph", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "boundTerms"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The terms bound by all term variables in scope")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "boundTypes"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type schemes of all term variables in scope")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "classConstraints"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.TypeVariableMetadata"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A mutable map from type variable names to their accumulated class constraints. This is populated during type inference when operations requiring Eq or Ord are encountered.")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "lambdaVariables"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.core.Name"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The set of term variables introduced by specifically by lambdas")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "metadata"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any additional metadata bound to term variables in scope")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "primitives"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.graph.Primitive"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All primitive functions and constants by name")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "schemaTypes"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme"))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "All schema types (type schemes) in scope")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeVariables"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "hydra.core.Name"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The set of type variables introduced specifically by type lambdas")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A graph, or lexical environment which binds names to terms, types, primitives, and metadata")))])}))),
+      (Core.Name "hydra.graph.Primitive", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "name"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The unique name of the primitive function")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "type"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type signature of the primitive function")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "implementation"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.context.Context")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.core.Term"))),
+                    Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.context.InContext")),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.errors.Error"))})),
+                      Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))}))}))})),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A concrete implementation of the primitive function. The Context and Graph parameters are needed by higher-order primitives (e.g. lists.map, lists.foldl, eithers.bind) which must evaluate function arguments via term reduction; the Graph provides variable and primitive bindings, while the Context supports tracing and error reporting.")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A built-in function or constant")))])}))),
+      (Core.Name "hydra.graph.TermCoder", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = (Core.Name "a"),
+          Core.forallTypeBody = (Core.TypeRecord [
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "type"),
+              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+                Core.annotatedTypeAnnotation = (M.fromList [
+                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The Hydra type of encoded terms")))])}))},
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "encode"),
+              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.context.Context")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                      Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                        Core.eitherTypeLeft = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.context.InContext")),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.errors.Error"))})),
+                        Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))}))})),
+                Core.annotatedTypeAnnotation = (M.fromList [
+                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An encode function from terms to native values")))])}))},
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "decode"),
+              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.context.Context")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                    Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.context.InContext")),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.errors.Error"))})),
+                      Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))}))})),
+                Core.annotatedTypeAnnotation = (M.fromList [
+                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A decode function from native values to terms")))])}))}])})),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type together with a coder for mapping terms into arguments for primitive functions, and mapping computed results into terms.")))])}))),
+      (Core.Name "hydra.module.Definition", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "term"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.module.TermDefinition")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term definition")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "type"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.module.TypeDefinition")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type definition")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A definition, which may be either a term or type definition")))])}))),
+      (Core.Name "hydra.module.FileExtension", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A file extension (without the dot), e.g. \"json\" or \"py\"")))])}))),
+      (Core.Name "hydra.module.Library", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "namespace"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A common prefix for all primitive function names in the library")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "prefix"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A preferred namespace prefix for function names in the library")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "primitives"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.graph.Primitive"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The primitives defined in this library")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A library of primitive functions")))])}))),
+      (Core.Name "hydra.module.Module", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "namespace"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A common prefix for all element names in the module")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "definitions"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.module.Definition"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The definitions in this module")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "termDependencies"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.module.Namespace"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any modules which the term expressions of this module directly depend upon")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "typeDependencies"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.module.Namespace"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Any modules which the type expressions of this module directly depend upon")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "description"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An optional human-readable description of the module")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A logical collection of elements in the same namespace, having dependencies on zero or more other modules")))])}))),
+      (Core.Name "hydra.module.Namespace", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A prefix for element names")))])}))),
+      (Core.Name "hydra.module.Namespaces", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = (Core.Name "n"),
+          Core.forallTypeBody = (Core.TypeRecord [
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "focus"),
+              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                Core.annotatedTypeBody = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
+                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "n"))})),
+                Core.annotatedTypeAnnotation = (M.fromList [
+                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The namespace in focus, together with its associated value")))])}))},
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "mapping"),
+              Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                Core.annotatedTypeBody = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
+                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "n"))})),
+                Core.annotatedTypeAnnotation = (M.fromList [
+                  (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A mapping of namespaces to values")))])}))}])})),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A mapping from namespaces to values of type n, with a focus on one namespace")))])}))),
+      (Core.Name "hydra.module.QualifiedName", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "namespace"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.module.Namespace"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The optional namespace")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "local"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The local name")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A qualified name consisting of an optional namespace together with a mandatory local name")))])}))),
+      (Core.Name "hydra.module.TermDefinition", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "name"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the term")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "term"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The term being defined")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "type"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "hydra.core.TypeScheme"))),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type scheme of the term, including any class constraints")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A term-level definition, including a name, a term, and the type scheme of the term")))])}))),
+      (Core.Name "hydra.module.TypeDefinition", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeRecord [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "name"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The name of the type")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "type"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The type being defined")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A type-level definition, including a name and the type")))])}))),
+      (Core.Name "hydra.util.Adapter", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = (Core.Name "t1"),
+          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+            Core.forallTypeParameter = (Core.Name "t2"),
+            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "v1"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "v2"),
+                Core.forallTypeBody = (Core.TypeRecord [
+                  Core.FieldType {
+                    Core.fieldTypeName = (Core.Name "isLossy"),
+                    Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                      Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                      Core.annotatedTypeAnnotation = (M.fromList [
+                        (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Whether information may be lost in the course of this adaptation")))])}))},
+                  Core.FieldType {
+                    Core.fieldTypeName = (Core.Name "source"),
+                    Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                      Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "t1")),
+                      Core.annotatedTypeAnnotation = (M.fromList [
+                        (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The source type")))])}))},
+                  Core.FieldType {
+                    Core.fieldTypeName = (Core.Name "target"),
+                    Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                      Core.annotatedTypeBody = (Core.TypeVariable (Core.Name "t2")),
+                      Core.annotatedTypeAnnotation = (M.fromList [
+                        (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The target type")))])}))},
+                  Core.FieldType {
+                    Core.fieldTypeName = (Core.Name "coder"),
+                    Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                      Core.annotatedTypeBody = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Coder")),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v1"))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v2"))})),
+                      Core.annotatedTypeAnnotation = (M.fromList [
+                        (Core.Name "description", (Core.TermLiteral (Core.LiteralString "The coder for transforming instances of the source type to instances of the target type")))])}))}])}))}))}))})),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A two-level bidirectional encoder which adapts types to types and terms to terms")))])}))),
+      (Core.Name "hydra.util.Bicoder", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = (Core.Name "t1"),
+          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+            Core.forallTypeParameter = (Core.Name "t2"),
+            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "v1"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "v2"),
+                Core.forallTypeBody = (Core.TypeRecord [
+                  Core.FieldType {
+                    Core.fieldTypeName = (Core.Name "encode"),
+                    Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                      Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Adapter")),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v1"))})),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v2"))}))})),
+                      Core.annotatedTypeAnnotation = (M.fromList [
+                        (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function from source types to adapters")))])}))},
+                  Core.FieldType {
+                    Core.fieldTypeName = (Core.Name "decode"),
+                    Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                      Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                        Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Adapter")),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v2"))})),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v1"))}))})),
+                      Core.annotatedTypeAnnotation = (M.fromList [
+                        (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function from target types to adapters")))])}))}])}))}))}))})),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A two-level encoder and decoder, operating both at a type level and an instance (data) level")))])}))),
+      (Core.Name "hydra.util.CaseConvention", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "camel"),
+            Core.fieldTypeType = Core.TypeUnit},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "pascal"),
+            Core.fieldTypeType = Core.TypeUnit},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "lowerSnake"),
+            Core.fieldTypeType = Core.TypeUnit},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "upperSnake"),
+            Core.fieldTypeType = Core.TypeUnit}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A naming convention for symbols, such as camelCase or snake_case")))])}))),
+      (Core.Name "hydra.util.Coder", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = (Core.Name "v1"),
+          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+            Core.forallTypeParameter = (Core.Name "v2"),
+            Core.forallTypeBody = (Core.TypeRecord [
+              Core.FieldType {
+                Core.fieldTypeName = (Core.Name "encode"),
+                Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                  Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.context.Context")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v1")),
+                      Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                        Core.eitherTypeLeft = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.context.InContext")),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.errors.Error"))})),
+                        Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v2"))}))}))})),
+                  Core.annotatedTypeAnnotation = (M.fromList [
+                    (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function which encodes source values as target values in a given context")))])}))},
+              Core.FieldType {
+                Core.fieldTypeName = (Core.Name "decode"),
+                Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+                  Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.context.Context")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v2")),
+                      Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                        Core.eitherTypeLeft = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.context.InContext")),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.errors.Error"))})),
+                        Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v1"))}))}))})),
+                  Core.annotatedTypeAnnotation = (M.fromList [
+                    (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A function which decodes target values as source values in a given context")))])}))}])}))})),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An encoder and decoder; a bidirectional transformation between two types")))])}))),
+      (Core.Name "hydra.util.Comparison", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "lessThan"),
+            Core.fieldTypeType = Core.TypeUnit},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "equalTo"),
+            Core.fieldTypeType = Core.TypeUnit},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "greaterThan"),
+            Core.fieldTypeType = Core.TypeUnit}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "An equality judgement: less than, equal to, or greater than")))])}))),
+      (Core.Name "hydra.util.Precision", (Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "arbitrary"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = Core.TypeUnit,
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Arbitrary precision")))])}))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "bits"),
+            Core.fieldTypeType = (Core.TypeAnnotated (Core.AnnotatedType {
+              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.annotatedTypeAnnotation = (M.fromList [
+                (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Precision to a specified number of bits")))])}))}]),
+        Core.annotatedTypeAnnotation = (M.fromList [
+          (Core.Name "description", (Core.TermLiteral (Core.LiteralString "Numeric precision: arbitrary precision, or precision to a specified number of bits")))])})))]
diff --git a/src/gen-main/haskell/Hydra/Json/Decode.hs b/src/gen-main/haskell/Hydra/Json/Decode.hs
--- a/src/gen-main/haskell/Hydra/Json/Decode.hs
+++ b/src/gen-main/haskell/Hydra/Json/Decode.hs
@@ -24,263 +24,237 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | Decode a JSON value to a Hydra term given a type. Returns Left for type mismatches.
-fromJson :: (M.Map Core.Name Core.Type -> Core.Type -> Model.Value -> Either String Core.Term)
-fromJson types typ value =  
-  let stripped = (Rewriting.deannotateType typ)
-  in ((\x -> case x of
-    Core.TypeLiteral v1 -> (decodeLiteral v1 value)
-    Core.TypeList v1 ->  
-      let decodeElem = (\v -> fromJson types v1 v)
-      in  
-        let arrResult = (expectArray value)
-        in (Eithers.either (\err -> Left err) (\arr ->  
-          let decoded = (Eithers.mapList decodeElem arr)
-          in (Eithers.map (\ts -> Core.TermList ts) decoded)) arrResult)
-    Core.TypeSet v1 ->  
-      let decodeElem = (\v -> fromJson types v1 v)
-      in  
-        let arrResult = (expectArray value)
-        in (Eithers.either (\err -> Left err) (\arr ->  
-          let decoded = (Eithers.mapList decodeElem arr)
-          in (Eithers.map (\elems -> Core.TermSet (Sets.fromList elems)) decoded)) arrResult)
-    Core.TypeMaybe v1 ->  
-      let decodeJust = (\arr -> Eithers.map (\v -> Core.TermMaybe (Just v)) (fromJson types v1 (Lists.head arr)))
-      in  
-        let decodeMaybeArray = (\arr ->  
-                let len = (Lists.length arr)
-                in (Logic.ifElse (Equality.equal len 0) (Right (Core.TermMaybe Nothing)) (Logic.ifElse (Equality.equal len 1) (decodeJust arr) (Left "expected single-element array for Just"))))
-        in ((\x -> case x of
-          Model.ValueNull -> (Right (Core.TermMaybe Nothing))
-          Model.ValueArray v2 -> (decodeMaybeArray v2)
-          _ -> (Left "expected null or single-element array for Maybe")) value)
-    Core.TypeRecord v1 ->  
-      let objResult = (expectObject value)
-      in (Eithers.either (\err -> Left err) (\obj ->  
-        let decodeField = (\ft ->  
-                let fname = (Core.fieldTypeName ft)
-                in  
-                  let ftype = (Core.fieldTypeType ft)
-                  in  
-                    let mval = (Maps.lookup (Core.unName fname) obj)
-                    in  
-                      let defaultVal = Model.ValueNull
-                      in  
-                        let jsonVal = (Maybes.fromMaybe defaultVal mval)
-                        in  
-                          let decoded = (fromJson types ftype jsonVal)
-                          in (Eithers.map (\v -> Core.Field {
-                            Core.fieldName = fname,
-                            Core.fieldTerm = v}) decoded))
-        in  
-          let fields = (Core.rowTypeFields v1)
-          in  
-            let decodedFields = (Eithers.mapList decodeField fields)
-            in (Eithers.map (\fs -> Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.rowTypeTypeName v1),
-              Core.recordFields = fs})) decodedFields)) objResult)
-    Core.TypeUnion v1 ->  
-      let decodeVariant = (\key -> \val -> \ftype ->  
-              let jsonVal = (Maybes.fromMaybe Model.ValueNull val)
-              in  
-                let decoded = (fromJson types ftype jsonVal)
-                in (Eithers.map (\v -> Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.rowTypeTypeName v1),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name key),
-                    Core.fieldTerm = v}})) decoded))
-      in  
-        let tryField = (\key -> \val -> \ft -> Logic.ifElse (Equality.equal (Core.unName (Core.fieldTypeName ft)) key) (Just (decodeVariant key val (Core.fieldTypeType ft))) Nothing)
-        in  
-          let findAndDecode = (\key -> \val -> \fts -> Logic.ifElse (Lists.null fts) (Left (Strings.cat [
-                  "unknown variant: ",
-                  key])) (Maybes.maybe (findAndDecode key val (Lists.tail fts)) (\r -> r) (tryField key val (Lists.head fts))))
-          in  
-            let decodeSingleKey = (\obj -> findAndDecode (Lists.head (Maps.keys obj)) (Maps.lookup (Lists.head (Maps.keys obj)) obj) (Core.rowTypeFields v1))
-            in  
-              let processUnion = (\obj -> Logic.ifElse (Equality.equal (Lists.length (Maps.keys obj)) 1) (decodeSingleKey obj) (Left "expected single-key object for union"))
-              in  
-                let objResult = (expectObject value)
-                in (Eithers.either (\err -> Left err) (\obj -> processUnion obj) objResult)
-    Core.TypeUnit ->  
-      let objResult = (expectObject value)
-      in (Eithers.map (\_ -> Core.TermUnit) objResult)
-    Core.TypeWrap v1 ->  
-      let extractInnerType = (\lt -> (\x -> case x of
-              Core.TypeWrap v2 -> (Core.wrappedTypeBody v2)
-              _ -> lt) lt)
-      in  
-        let decodeAndWrap = (\lt ->  
-                let innerType = (extractInnerType lt)
-                in  
-                  let decoded = (fromJson types innerType value)
-                  in (Eithers.map (\v -> Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.wrappedTypeTypeName v1),
-                    Core.wrappedTermBody = v})) decoded))
-        in  
-          let lookedUp = (Maps.lookup (Core.wrappedTypeTypeName v1) types)
-          in (Maybes.maybe (Left (Strings.cat [
-            "unknown wrapped type: ",
-            (Core.unName (Core.wrappedTypeTypeName v1))])) (\lt -> decodeAndWrap lt) lookedUp)
-    Core.TypeMap v1 ->  
-      let keyType = (Core.mapTypeKeys v1)
-      in  
-        let valType = (Core.mapTypeValues v1)
-        in  
-          let arrResult = (expectArray value)
-          in (Eithers.either (\err -> Left err) (\arr ->  
-            let decodeEntry = (\entryJson ->  
-                    let objResult = (expectObject entryJson)
-                    in (Eithers.either (\err -> Left err) (\entryObj ->  
-                      let keyJson = (Maps.lookup "@key" entryObj)
-                      in  
-                        let valJson = (Maps.lookup "@value" entryObj)
-                        in (Maybes.maybe (Left "missing @key in map entry") (\kj -> Maybes.maybe (Left "missing @value in map entry") (\vj ->  
-                          let decodedKey = (fromJson types keyType kj)
-                          in  
-                            let decodedVal = (fromJson types valType vj)
-                            in (Eithers.either (\err -> Left err) (\k -> Eithers.map (\v -> (k, v)) decodedVal) decodedKey)) valJson) keyJson)) objResult))
-            in  
-              let entries = (Eithers.mapList decodeEntry arr)
-              in (Eithers.map (\es -> Core.TermMap (Maps.fromList es)) entries)) arrResult)
-    Core.TypePair v1 ->  
-      let firstType = (Core.pairTypeFirst v1)
-      in  
-        let secondType = (Core.pairTypeSecond v1)
-        in  
-          let objResult = (expectObject value)
-          in (Eithers.either (\err -> Left err) (\obj ->  
-            let firstJson = (Maps.lookup "@first" obj)
-            in  
-              let secondJson = (Maps.lookup "@second" obj)
-              in (Maybes.maybe (Left "missing @first in pair") (\fj -> Maybes.maybe (Left "missing @second in pair") (\sj ->  
-                let decodedFirst = (fromJson types firstType fj)
-                in  
-                  let decodedSecond = (fromJson types secondType sj)
-                  in (Eithers.either (\err -> Left err) (\f -> Eithers.map (\s -> Core.TermPair (f, s)) decodedSecond) decodedFirst)) secondJson) firstJson)) objResult)
-    Core.TypeEither v1 ->  
-      let leftType = (Core.eitherTypeLeft v1)
-      in  
-        let rightType = (Core.eitherTypeRight v1)
-        in  
-          let objResult = (expectObject value)
-          in (Eithers.either (\err -> Left err) (\obj ->  
-            let leftJson = (Maps.lookup "@left" obj)
-            in  
-              let rightJson = (Maps.lookup "@right" obj)
-              in (Maybes.maybe (Maybes.maybe (Left "expected @left or @right in Either") (\rj ->  
-                let decoded = (fromJson types rightType rj)
-                in (Eithers.map (\v -> Core.TermEither (Right v)) decoded)) rightJson) (\lj ->  
-                let decoded = (fromJson types leftType lj)
-                in (Eithers.map (\v -> Core.TermEither (Left v)) decoded)) leftJson)) objResult)
-    Core.TypeVariable v1 ->  
-      let lookedUp = (Maps.lookup v1 types)
-      in (Maybes.maybe (Left (Strings.cat [
-        "unknown type variable: ",
-        (Core.unName v1)])) (\resolvedType -> fromJson types resolvedType value) lookedUp)
-    _ -> (Left (Strings.cat [
-      "unsupported type for JSON decoding: ",
-      (Core_.type_ typ)]))) stripped)
-
--- | Decode a JSON value to a literal term
-decodeLiteral :: (Core.LiteralType -> Model.Value -> Either String Core.Term)
-decodeLiteral lt value = ((\x -> case x of
-  Core.LiteralTypeBinary ->  
-    let strResult = (expectString value)
-    in (Eithers.map (\s -> Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary s))) strResult)
-  Core.LiteralTypeBoolean -> ((\x -> case x of
-    Model.ValueBoolean v2 -> (Right (Core.TermLiteral (Core.LiteralBoolean v2)))
-    _ -> (Left "expected boolean")) value)
-  Core.LiteralTypeFloat v1 -> (decodeFloat v1 value)
-  Core.LiteralTypeInteger v1 -> (decodeInteger v1 value)
-  Core.LiteralTypeString ->  
-    let strResult = (expectString value)
-    in (Eithers.map (\s -> Core.TermLiteral (Core.LiteralString s)) strResult)) lt)
-
 -- | Decode a JSON value to a float term. Float64/Bigfloat from numbers; Float32 from string.
-decodeFloat :: (Core.FloatType -> Model.Value -> Either String Core.Term)
-decodeFloat ft value = ((\x -> case x of
-  Core.FloatTypeBigfloat ->  
-    let numResult = (expectNumber value)
-    in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat n))) numResult)
-  Core.FloatTypeFloat32 ->  
-    let strResult = (expectString value)
-    in (Eithers.either (\err -> Left err) (\s ->  
-      let parsed = (Literals.readFloat32 s)
-      in (Maybes.maybe (Left (Strings.cat [
-        "invalid float32: ",
-        s])) (\v -> Right (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 v)))) parsed)) strResult)
-  Core.FloatTypeFloat64 ->  
-    let numResult = (expectNumber value)
-    in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (Literals.bigfloatToFloat64 n)))) numResult)) ft)
+decodeFloat :: Core.FloatType -> Model.Value -> Either String Core.Term
+decodeFloat ft value =
+    case ft of
+      Core.FloatTypeBigfloat ->
+        let numResult = expectNumber value
+        in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat n))) numResult)
+      Core.FloatTypeFloat32 ->
+        let strResult = expectString value
+        in (Eithers.either (\err -> Left err) (\s ->
+          let parsed = Literals.readFloat32 s
+          in (Maybes.maybe (Left (Strings.cat [
+            "invalid float32: ",
+            s])) (\v -> Right (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 v)))) parsed)) strResult)
+      Core.FloatTypeFloat64 ->
+        let numResult = expectNumber value
+        in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (Literals.bigfloatToFloat64 n)))) numResult)
 
 -- | Decode a JSON value to an integer term. Small ints from numbers; large ints from strings.
-decodeInteger :: (Core.IntegerType -> Model.Value -> Either String Core.Term)
-decodeInteger it value = ((\x -> case x of
-  Core.IntegerTypeBigint ->  
-    let strResult = (expectString value)
-    in (Eithers.either (\err -> Left err) (\s ->  
-      let parsed = (Literals.readBigint s)
-      in (Maybes.maybe (Left (Strings.cat [
-        "invalid bigint: ",
-        s])) (\v -> Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint v)))) parsed)) strResult)
-  Core.IntegerTypeInt64 ->  
-    let strResult = (expectString value)
-    in (Eithers.either (\err -> Left err) (\s ->  
-      let parsed = (Literals.readInt64 s)
-      in (Maybes.maybe (Left (Strings.cat [
-        "invalid int64: ",
-        s])) (\v -> Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 v)))) parsed)) strResult)
-  Core.IntegerTypeUint32 ->  
-    let strResult = (expectString value)
-    in (Eithers.either (\err -> Left err) (\s ->  
-      let parsed = (Literals.readUint32 s)
-      in (Maybes.maybe (Left (Strings.cat [
-        "invalid uint32: ",
-        s])) (\v -> Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 v)))) parsed)) strResult)
-  Core.IntegerTypeUint64 ->  
-    let strResult = (expectString value)
-    in (Eithers.either (\err -> Left err) (\s ->  
-      let parsed = (Literals.readUint64 s)
-      in (Maybes.maybe (Left (Strings.cat [
-        "invalid uint64: ",
-        s])) (\v -> Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 v)))) parsed)) strResult)
-  Core.IntegerTypeInt8 ->  
-    let numResult = (expectNumber value)
-    in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (Literals.bigintToInt8 (Literals.bigfloatToBigint n))))) numResult)
-  Core.IntegerTypeInt16 ->  
-    let numResult = (expectNumber value)
-    in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (Literals.bigintToInt16 (Literals.bigfloatToBigint n))))) numResult)
-  Core.IntegerTypeInt32 ->  
-    let numResult = (expectNumber value)
-    in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (Literals.bigintToInt32 (Literals.bigfloatToBigint n))))) numResult)
-  Core.IntegerTypeUint8 ->  
-    let numResult = (expectNumber value)
-    in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 (Literals.bigintToUint8 (Literals.bigfloatToBigint n))))) numResult)
-  Core.IntegerTypeUint16 ->  
-    let numResult = (expectNumber value)
-    in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 (Literals.bigintToUint16 (Literals.bigfloatToBigint n))))) numResult)) it)
+decodeInteger :: Core.IntegerType -> Model.Value -> Either String Core.Term
+decodeInteger it value =
+    case it of
+      Core.IntegerTypeBigint ->
+        let strResult = expectString value
+        in (Eithers.either (\err -> Left err) (\s ->
+          let parsed = Literals.readBigint s
+          in (Maybes.maybe (Left (Strings.cat [
+            "invalid bigint: ",
+            s])) (\v -> Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint v)))) parsed)) strResult)
+      Core.IntegerTypeInt64 ->
+        let strResult = expectString value
+        in (Eithers.either (\err -> Left err) (\s ->
+          let parsed = Literals.readInt64 s
+          in (Maybes.maybe (Left (Strings.cat [
+            "invalid int64: ",
+            s])) (\v -> Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 v)))) parsed)) strResult)
+      Core.IntegerTypeUint32 ->
+        let strResult = expectString value
+        in (Eithers.either (\err -> Left err) (\s ->
+          let parsed = Literals.readUint32 s
+          in (Maybes.maybe (Left (Strings.cat [
+            "invalid uint32: ",
+            s])) (\v -> Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 v)))) parsed)) strResult)
+      Core.IntegerTypeUint64 ->
+        let strResult = expectString value
+        in (Eithers.either (\err -> Left err) (\s ->
+          let parsed = Literals.readUint64 s
+          in (Maybes.maybe (Left (Strings.cat [
+            "invalid uint64: ",
+            s])) (\v -> Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 v)))) parsed)) strResult)
+      Core.IntegerTypeInt8 ->
+        let numResult = expectNumber value
+        in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (Literals.bigintToInt8 (Literals.bigfloatToBigint n))))) numResult)
+      Core.IntegerTypeInt16 ->
+        let numResult = expectNumber value
+        in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (Literals.bigintToInt16 (Literals.bigfloatToBigint n))))) numResult)
+      Core.IntegerTypeInt32 ->
+        let numResult = expectNumber value
+        in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (Literals.bigintToInt32 (Literals.bigfloatToBigint n))))) numResult)
+      Core.IntegerTypeUint8 ->
+        let numResult = expectNumber value
+        in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 (Literals.bigintToUint8 (Literals.bigfloatToBigint n))))) numResult)
+      Core.IntegerTypeUint16 ->
+        let numResult = expectNumber value
+        in (Eithers.map (\n -> Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 (Literals.bigintToUint16 (Literals.bigfloatToBigint n))))) numResult)
 
--- | Extract a string from a JSON value
-expectString :: (Model.Value -> Either String String)
-expectString value = ((\x -> case x of
-  Model.ValueString v1 -> (Right v1)
-  _ -> (Left "expected string")) value)
+-- | Decode a JSON value to a literal term
+decodeLiteral :: Core.LiteralType -> Model.Value -> Either String Core.Term
+decodeLiteral lt value =
+    case lt of
+      Core.LiteralTypeBinary ->
+        let strResult = expectString value
+        in (Eithers.map (\s -> Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary s))) strResult)
+      Core.LiteralTypeBoolean -> case value of
+        Model.ValueBoolean v1 -> Right (Core.TermLiteral (Core.LiteralBoolean v1))
+        _ -> Left "expected boolean"
+      Core.LiteralTypeFloat v0 -> decodeFloat v0 value
+      Core.LiteralTypeInteger v0 -> decodeInteger v0 value
+      Core.LiteralTypeString ->
+        let strResult = expectString value
+        in (Eithers.map (\s -> Core.TermLiteral (Core.LiteralString s)) strResult)
 
 -- | Extract an array from a JSON value
-expectArray :: (Model.Value -> Either String [Model.Value])
-expectArray value = ((\x -> case x of
-  Model.ValueArray v1 -> (Right v1)
-  _ -> (Left "expected array")) value)
+expectArray :: Model.Value -> Either String [Model.Value]
+expectArray value =
+    case value of
+      Model.ValueArray v0 -> Right v0
+      _ -> Left "expected array"
 
+-- | Extract a number from a JSON value
+expectNumber :: Model.Value -> Either String Double
+expectNumber value =
+    case value of
+      Model.ValueNumber v0 -> Right v0
+      _ -> Left "expected number"
+
 -- | Extract an object from a JSON value
-expectObject :: (Model.Value -> Either String (M.Map String Model.Value))
-expectObject value = ((\x -> case x of
-  Model.ValueObject v1 -> (Right v1)
-  _ -> (Left "expected object")) value)
+expectObject :: Model.Value -> Either String (M.Map String Model.Value)
+expectObject value =
+    case value of
+      Model.ValueObject v0 -> Right v0
+      _ -> Left "expected object"
 
--- | Extract a number from a JSON value
-expectNumber :: (Model.Value -> Either String Double)
-expectNumber value = ((\x -> case x of
-  Model.ValueNumber v1 -> (Right v1)
-  _ -> (Left "expected number")) value)
+-- | Extract a string from a JSON value
+expectString :: Model.Value -> Either String String
+expectString value =
+    case value of
+      Model.ValueString v0 -> Right v0
+      _ -> Left "expected string"
+
+-- | Decode a JSON value to a Hydra term given a type and type name. Returns Left for type mismatches.
+fromJson :: M.Map Core.Name Core.Type -> Core.Name -> Core.Type -> Model.Value -> Either String Core.Term
+fromJson types tname typ value =
+
+      let stripped = Rewriting.deannotateType typ
+      in case stripped of
+        Core.TypeLiteral v0 -> decodeLiteral v0 value
+        Core.TypeList v0 ->
+          let decodeElem = \v -> fromJson types tname v0 v
+              arrResult = expectArray value
+          in (Eithers.either (\err -> Left err) (\arr ->
+            let decoded = Eithers.mapList decodeElem arr
+            in (Eithers.map (\ts -> Core.TermList ts) decoded)) arrResult)
+        Core.TypeSet v0 ->
+          let decodeElem = \v -> fromJson types tname v0 v
+              arrResult = expectArray value
+          in (Eithers.either (\err -> Left err) (\arr ->
+            let decoded = Eithers.mapList decodeElem arr
+            in (Eithers.map (\elems -> Core.TermSet (Sets.fromList elems)) decoded)) arrResult)
+        Core.TypeMaybe v0 ->
+          let decodeJust = \arr -> Eithers.map (\v -> Core.TermMaybe (Just v)) (fromJson types tname v0 (Lists.head arr))
+              decodeMaybeArray =
+                      \arr ->
+                        let len = Lists.length arr
+                        in (Logic.ifElse (Equality.equal len 0) (Right (Core.TermMaybe Nothing)) (Logic.ifElse (Equality.equal len 1) (decodeJust arr) (Left "expected single-element array for Just")))
+          in case value of
+            Model.ValueNull -> Right (Core.TermMaybe Nothing)
+            Model.ValueArray v1 -> decodeMaybeArray v1
+            _ -> Left "expected null or single-element array for Maybe"
+        Core.TypeRecord v0 ->
+          let objResult = expectObject value
+          in (Eithers.either (\err -> Left err) (\obj ->
+            let decodeField =
+                    \ft ->
+                      let fname = Core.fieldTypeName ft
+                          ftype = Core.fieldTypeType ft
+                          mval = Maps.lookup (Core.unName fname) obj
+                          defaultVal = Model.ValueNull
+                          jsonVal = Maybes.fromMaybe defaultVal mval
+                          decoded = fromJson types tname ftype jsonVal
+                      in (Eithers.map (\v -> Core.Field {
+                        Core.fieldName = fname,
+                        Core.fieldTerm = v}) decoded)
+                decodedFields = Eithers.mapList decodeField v0
+            in (Eithers.map (\fs -> Core.TermRecord (Core.Record {
+              Core.recordTypeName = tname,
+              Core.recordFields = fs})) decodedFields)) objResult)
+        Core.TypeUnion v0 ->
+          let decodeVariant =
+                  \key -> \val -> \ftype ->
+                    let jsonVal = Maybes.fromMaybe Model.ValueNull val
+                        decoded = fromJson types tname ftype jsonVal
+                    in (Eithers.map (\v -> Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = tname,
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name key),
+                        Core.fieldTerm = v}})) decoded)
+              tryField =
+                      \key -> \val -> \ft -> Logic.ifElse (Equality.equal (Core.unName (Core.fieldTypeName ft)) key) (Just (decodeVariant key val (Core.fieldTypeType ft))) Nothing
+              findAndDecode =
+                      \key -> \val -> \fts -> Logic.ifElse (Lists.null fts) (Left (Strings.cat [
+                        "unknown variant: ",
+                        key])) (Maybes.maybe (findAndDecode key val (Lists.tail fts)) (\r -> r) (tryField key val (Lists.head fts)))
+              decodeSingleKey = \obj -> findAndDecode (Lists.head (Maps.keys obj)) (Maps.lookup (Lists.head (Maps.keys obj)) obj) v0
+              processUnion =
+                      \obj -> Logic.ifElse (Equality.equal (Lists.length (Maps.keys obj)) 1) (decodeSingleKey obj) (Left "expected single-key object for union")
+              objResult = expectObject value
+          in (Eithers.either (\err -> Left err) (\obj -> processUnion obj) objResult)
+        Core.TypeUnit ->
+          let objResult = expectObject value
+          in (Eithers.map (\_ -> Core.TermUnit) objResult)
+        Core.TypeWrap v0 ->
+          let decoded = fromJson types tname v0 value
+          in (Eithers.map (\v -> Core.TermWrap (Core.WrappedTerm {
+            Core.wrappedTermTypeName = tname,
+            Core.wrappedTermBody = v})) decoded)
+        Core.TypeMap v0 ->
+          let keyType = Core.mapTypeKeys v0
+              valType = Core.mapTypeValues v0
+              arrResult = expectArray value
+          in (Eithers.either (\err -> Left err) (\arr ->
+            let decodeEntry =
+                    \entryJson ->
+                      let objResult = expectObject entryJson
+                      in (Eithers.either (\err -> Left err) (\entryObj ->
+                        let keyJson = Maps.lookup "@key" entryObj
+                            valJson = Maps.lookup "@value" entryObj
+                        in (Maybes.maybe (Left "missing @key in map entry") (\kj -> Maybes.maybe (Left "missing @value in map entry") (\vj ->
+                          let decodedKey = fromJson types tname keyType kj
+                              decodedVal = fromJson types tname valType vj
+                          in (Eithers.either (\err -> Left err) (\k -> Eithers.map (\v -> (k, v)) decodedVal) decodedKey)) valJson) keyJson)) objResult)
+                entries = Eithers.mapList decodeEntry arr
+            in (Eithers.map (\es -> Core.TermMap (Maps.fromList es)) entries)) arrResult)
+        Core.TypePair v0 ->
+          let firstType = Core.pairTypeFirst v0
+              secondType = Core.pairTypeSecond v0
+              objResult = expectObject value
+          in (Eithers.either (\err -> Left err) (\obj ->
+            let firstJson = Maps.lookup "@first" obj
+                secondJson = Maps.lookup "@second" obj
+            in (Maybes.maybe (Left "missing @first in pair") (\fj -> Maybes.maybe (Left "missing @second in pair") (\sj ->
+              let decodedFirst = fromJson types tname firstType fj
+                  decodedSecond = fromJson types tname secondType sj
+              in (Eithers.either (\err -> Left err) (\f -> Eithers.map (\s -> Core.TermPair (f, s)) decodedSecond) decodedFirst)) secondJson) firstJson)) objResult)
+        Core.TypeEither v0 ->
+          let leftType = Core.eitherTypeLeft v0
+              rightType = Core.eitherTypeRight v0
+              objResult = expectObject value
+          in (Eithers.either (\err -> Left err) (\obj ->
+            let leftJson = Maps.lookup "@left" obj
+                rightJson = Maps.lookup "@right" obj
+            in (Maybes.maybe (Maybes.maybe (Left "expected @left or @right in Either") (\rj ->
+              let decoded = fromJson types tname rightType rj
+              in (Eithers.map (\v -> Core.TermEither (Right v)) decoded)) rightJson) (\lj ->
+              let decoded = fromJson types tname leftType lj
+              in (Eithers.map (\v -> Core.TermEither (Left v)) decoded)) leftJson)) objResult)
+        Core.TypeVariable v0 ->
+          let lookedUp = Maps.lookup v0 types
+          in (Maybes.maybe (Left (Strings.cat [
+            "unknown type variable: ",
+            (Core.unName v0)])) (\resolvedType -> fromJson types v0 resolvedType value) lookedUp)
+        _ -> Left (Strings.cat [
+          "unsupported type for JSON decoding: ",
+          (Core_.type_ typ)])
diff --git a/src/gen-main/haskell/Hydra/Json/Encode.hs b/src/gen-main/haskell/Hydra/Json/Encode.hs
--- a/src/gen-main/haskell/Hydra/Json/Encode.hs
+++ b/src/gen-main/haskell/Hydra/Json/Encode.hs
@@ -22,111 +22,102 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | Encode a Hydra term to a JSON value. Returns Left for unsupported constructs.
-toJson :: (Core.Term -> Either String Model.Value)
-toJson term =  
-  let stripped = (Rewriting.deannotateTerm term)
-  in ((\x -> case x of
-    Core.TermLiteral v1 -> (encodeLiteral v1)
-    Core.TermList v1 ->  
-      let results = (Eithers.mapList (\t -> toJson t) v1)
-      in (Eithers.map (\vs -> Model.ValueArray vs) results)
-    Core.TermSet v1 ->  
-      let terms = (Sets.toList v1)
-      in  
-        let results = (Eithers.mapList (\t -> toJson t) terms)
-        in (Eithers.map (\vs -> Model.ValueArray vs) results)
-    Core.TermMaybe v1 -> (Maybes.maybe (Right Model.ValueNull) (\v ->  
-      let encodedMaybe = (toJson v)
-      in (Eithers.map (\encoded -> Model.ValueArray [
-        encoded]) encodedMaybe)) v1)
-    Core.TermRecord v1 ->  
-      let encodeField = (\f ->  
-              let fname = (Core.unName (Core.fieldName f))
-              in  
-                let fterm = (Core.fieldTerm f)
-                in  
-                  let encodedField = (toJson fterm)
-                  in (Eithers.map (\v -> (fname, v)) encodedField))
-      in  
-        let fields = (Core.recordFields v1)
-        in  
-          let encodedFields = (Eithers.mapList encodeField fields)
-          in (Eithers.map (\fs -> Model.ValueObject (Maps.fromList fs)) encodedFields)
-    Core.TermUnion v1 ->  
-      let field = (Core.injectionField v1)
-      in  
-        let fname = (Core.unName (Core.fieldName field))
-        in  
-          let fterm = (Core.fieldTerm field)
-          in  
-            let encodedUnion = (toJson fterm)
-            in (Eithers.map (\v -> Model.ValueObject (Maps.fromList [
-              (fname, v)])) encodedUnion)
-    Core.TermUnit -> (Right (Model.ValueObject Maps.empty))
-    Core.TermWrap v1 -> (toJson (Core.wrappedTermBody v1))
-    Core.TermMap v1 ->  
-      let encodeEntry = (\kv ->  
-              let k = (Pairs.first kv)
-              in  
-                let v = (Pairs.second kv)
-                in  
-                  let encodedK = (toJson k)
-                  in  
-                    let encodedV = (toJson v)
-                    in (Eithers.either (\err -> Left err) (\ek -> Eithers.map (\ev -> Model.ValueObject (Maps.fromList [
-                      ("@key", ek),
-                      ("@value", ev)])) encodedV) encodedK))
-      in  
-        let entries = (Eithers.mapList encodeEntry (Maps.toList v1))
-        in (Eithers.map (\es -> Model.ValueArray es) entries)
-    Core.TermPair v1 ->  
-      let first = (Pairs.first v1)
-      in  
-        let second = (Pairs.second v1)
-        in  
-          let encodedFirst = (toJson first)
-          in  
-            let encodedSecond = (toJson second)
-            in (Eithers.either (\err -> Left err) (\ef -> Eithers.map (\es -> Model.ValueObject (Maps.fromList [
-              ("@first", ef),
-              ("@second", es)])) encodedSecond) encodedFirst)
-    Core.TermEither v1 -> (Eithers.either (\l ->  
-      let encodedL = (toJson l)
-      in (Eithers.map (\v -> Model.ValueObject (Maps.fromList [
-        ("@left", v)])) encodedL)) (\r ->  
-      let encodedR = (toJson r)
-      in (Eithers.map (\v -> Model.ValueObject (Maps.fromList [
-        ("@right", v)])) encodedR)) v1)
-    _ -> (Left (Strings.cat [
-      "unsupported term variant for JSON encoding: ",
-      (Core_.term term)]))) stripped)
+-- | Encode a float value to JSON. Float64/Bigfloat use native numbers; Float32 uses string.
+encodeFloat :: Core.FloatValue -> Either t0 Model.Value
+encodeFloat fv =
+    case fv of
+      Core.FloatValueBigfloat v0 -> Right (Model.ValueNumber v0)
+      Core.FloatValueFloat32 v0 -> Right (Model.ValueString (Literals.showFloat32 v0))
+      Core.FloatValueFloat64 v0 -> Right (Model.ValueNumber (Literals.float64ToBigfloat v0))
 
+-- | Encode an integer value to JSON. Small ints use native numbers; large ints use strings.
+encodeInteger :: Core.IntegerValue -> Either t0 Model.Value
+encodeInteger iv =
+    case iv of
+      Core.IntegerValueBigint v0 -> Right (Model.ValueString (Literals.showBigint v0))
+      Core.IntegerValueInt64 v0 -> Right (Model.ValueString (Literals.showInt64 v0))
+      Core.IntegerValueUint32 v0 -> Right (Model.ValueString (Literals.showUint32 v0))
+      Core.IntegerValueUint64 v0 -> Right (Model.ValueString (Literals.showUint64 v0))
+      Core.IntegerValueInt8 v0 -> Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.int8ToBigint v0)))
+      Core.IntegerValueInt16 v0 -> Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.int16ToBigint v0)))
+      Core.IntegerValueInt32 v0 -> Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.int32ToBigint v0)))
+      Core.IntegerValueUint8 v0 -> Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.uint8ToBigint v0)))
+      Core.IntegerValueUint16 v0 -> Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.uint16ToBigint v0)))
+
 -- | Encode a Hydra literal to a JSON value
-encodeLiteral :: (Core.Literal -> Either t0 Model.Value)
-encodeLiteral lit = ((\x -> case x of
-  Core.LiteralBinary v1 -> (Right (Model.ValueString (Literals.binaryToString v1)))
-  Core.LiteralBoolean v1 -> (Right (Model.ValueBoolean v1))
-  Core.LiteralFloat v1 -> (encodeFloat v1)
-  Core.LiteralInteger v1 -> (encodeInteger v1)
-  Core.LiteralString v1 -> (Right (Model.ValueString v1))) lit)
+encodeLiteral :: Core.Literal -> Either t0 Model.Value
+encodeLiteral lit =
+    case lit of
+      Core.LiteralBinary v0 -> Right (Model.ValueString (Literals.binaryToString v0))
+      Core.LiteralBoolean v0 -> Right (Model.ValueBoolean v0)
+      Core.LiteralFloat v0 -> encodeFloat v0
+      Core.LiteralInteger v0 -> encodeInteger v0
+      Core.LiteralString v0 -> Right (Model.ValueString v0)
 
--- | Encode a float value to JSON. Float64/Bigfloat use native numbers; Float32 uses string.
-encodeFloat :: (Core.FloatValue -> Either t0 Model.Value)
-encodeFloat fv = ((\x -> case x of
-  Core.FloatValueBigfloat v1 -> (Right (Model.ValueNumber v1))
-  Core.FloatValueFloat32 v1 -> (Right (Model.ValueString (Literals.showFloat32 v1)))
-  Core.FloatValueFloat64 v1 -> (Right (Model.ValueNumber (Literals.float64ToBigfloat v1)))) fv)
+-- | Encode a Hydra term to a JSON value. Returns Left for unsupported constructs.
+toJson :: Core.Term -> Either String Model.Value
+toJson term =
 
--- | Encode an integer value to JSON. Small ints use native numbers; large ints use strings.
-encodeInteger :: (Core.IntegerValue -> Either t0 Model.Value)
-encodeInteger iv = ((\x -> case x of
-  Core.IntegerValueBigint v1 -> (Right (Model.ValueString (Literals.showBigint v1)))
-  Core.IntegerValueInt64 v1 -> (Right (Model.ValueString (Literals.showInt64 v1)))
-  Core.IntegerValueUint32 v1 -> (Right (Model.ValueString (Literals.showUint32 v1)))
-  Core.IntegerValueUint64 v1 -> (Right (Model.ValueString (Literals.showUint64 v1)))
-  Core.IntegerValueInt8 v1 -> (Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.int8ToBigint v1))))
-  Core.IntegerValueInt16 v1 -> (Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.int16ToBigint v1))))
-  Core.IntegerValueInt32 v1 -> (Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.int32ToBigint v1))))
-  Core.IntegerValueUint8 v1 -> (Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.uint8ToBigint v1))))
-  Core.IntegerValueUint16 v1 -> (Right (Model.ValueNumber (Literals.bigintToBigfloat (Literals.uint16ToBigint v1))))) iv)
+      let stripped = Rewriting.deannotateTerm term
+      in case stripped of
+        Core.TermLiteral v0 -> encodeLiteral v0
+        Core.TermList v0 ->
+          let results = Eithers.mapList (\t -> toJson t) v0
+          in (Eithers.map (\vs -> Model.ValueArray vs) results)
+        Core.TermSet v0 ->
+          let terms = Sets.toList v0
+              results = Eithers.mapList (\t -> toJson t) terms
+          in (Eithers.map (\vs -> Model.ValueArray vs) results)
+        Core.TermMaybe v0 -> Maybes.maybe (Right Model.ValueNull) (\v ->
+          let encodedMaybe = toJson v
+          in (Eithers.map (\encoded -> Model.ValueArray [
+            encoded]) encodedMaybe)) v0
+        Core.TermRecord v0 ->
+          let encodeField =
+                  \f ->
+                    let fname = Core.unName (Core.fieldName f)
+                        fterm = Core.fieldTerm f
+                        encodedField = toJson fterm
+                    in (Eithers.map (\v -> (fname, v)) encodedField)
+              fields = Core.recordFields v0
+              encodedFields = Eithers.mapList encodeField fields
+          in (Eithers.map (\fs -> Model.ValueObject (Maps.fromList fs)) encodedFields)
+        Core.TermUnion v0 ->
+          let field = Core.injectionField v0
+              fname = Core.unName (Core.fieldName field)
+              fterm = Core.fieldTerm field
+              encodedUnion = toJson fterm
+          in (Eithers.map (\v -> Model.ValueObject (Maps.fromList [
+            (fname, v)])) encodedUnion)
+        Core.TermUnit -> Right (Model.ValueObject Maps.empty)
+        Core.TermWrap v0 -> toJson (Core.wrappedTermBody v0)
+        Core.TermMap v0 ->
+          let encodeEntry =
+                  \kv ->
+                    let k = Pairs.first kv
+                        v = Pairs.second kv
+                        encodedK = toJson k
+                        encodedV = toJson v
+                    in (Eithers.either (\err -> Left err) (\ek -> Eithers.map (\ev -> Model.ValueObject (Maps.fromList [
+                      ("@key", ek),
+                      ("@value", ev)])) encodedV) encodedK)
+              entries = Eithers.mapList encodeEntry (Maps.toList v0)
+          in (Eithers.map (\es -> Model.ValueArray es) entries)
+        Core.TermPair v0 ->
+          let first = Pairs.first v0
+              second = Pairs.second v0
+              encodedFirst = toJson first
+              encodedSecond = toJson second
+          in (Eithers.either (\err -> Left err) (\ef -> Eithers.map (\es -> Model.ValueObject (Maps.fromList [
+            ("@first", ef),
+            ("@second", es)])) encodedSecond) encodedFirst)
+        Core.TermEither v0 -> Eithers.either (\l ->
+          let encodedL = toJson l
+          in (Eithers.map (\v -> Model.ValueObject (Maps.fromList [
+            ("@left", v)])) encodedL)) (\r ->
+          let encodedR = toJson r
+          in (Eithers.map (\v -> Model.ValueObject (Maps.fromList [
+            ("@right", v)])) encodedR)) v0
+        _ -> Left (Strings.cat [
+          "unsupported term variant for JSON encoding: ",
+          (Core_.term term)])
diff --git a/src/gen-main/haskell/Hydra/Json/Model.hs b/src/gen-main/haskell/Hydra/Json/Model.hs
--- a/src/gen-main/haskell/Hydra/Json/Model.hs
+++ b/src/gen-main/haskell/Hydra/Json/Model.hs
@@ -13,7 +13,7 @@
 import qualified Data.Set as S
 
 -- | A JSON value
-data Value = 
+data Value =
   -- | A JSON array
   ValueArray [Value] |
   -- | A boolean value
@@ -28,16 +28,16 @@
   ValueString String
   deriving (Eq, Ord, Read, Show)
 
-_Value = (Core.Name "hydra.json.model.Value")
+_Value = Core.Name "hydra.json.model.Value"
 
-_Value_array = (Core.Name "array")
+_Value_array = Core.Name "array"
 
-_Value_boolean = (Core.Name "boolean")
+_Value_boolean = Core.Name "boolean"
 
-_Value_null = (Core.Name "null")
+_Value_null = Core.Name "null"
 
-_Value_number = (Core.Name "number")
+_Value_number = Core.Name "number"
 
-_Value_object = (Core.Name "object")
+_Value_object = Core.Name "object"
 
-_Value_string = (Core.Name "string")
+_Value_string = Core.Name "string"
diff --git a/src/gen-main/haskell/Hydra/Json/Parser.hs b/src/gen-main/haskell/Hydra/Json/Parser.hs
--- a/src/gen-main/haskell/Hydra/Json/Parser.hs
+++ b/src/gen-main/haskell/Hydra/Json/Parser.hs
@@ -21,94 +21,108 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | Parse zero or more JSON whitespace characters (space, tab, newline, carriage return)
-whitespace :: (Parsing.Parser ())
-whitespace = (Parsers.map (\_ -> ()) (Parsers.many (Parsers.satisfy (\c -> Lists.foldl Logic.or False [
-  Equality.equal c 32,
-  (Equality.equal c 9),
-  (Equality.equal c 10),
-  (Equality.equal c 13)]))))
+-- | Parse a single digit (0-9)
+digit :: Parsing.Parser Int
+digit = Parsers.satisfy (\c -> Logic.and (Equality.gte c 48) (Equality.lte c 57))
 
--- | Parse a token followed by optional whitespace
-token :: (Parsing.Parser t0 -> Parsing.Parser t0)
-token p = (Parsers.bind p (\x -> Parsers.bind whitespace (\_ -> Parsers.pure x)))
+-- | Parse one or more digits as a string
+digits :: Parsing.Parser String
+digits = Parsers.map Strings.fromList (Parsers.some digit)
 
--- | Parse JSON null value
-jsonNull :: (Parsing.Parser Model.Value)
-jsonNull = (Parsers.map (\_ -> Model.ValueNull) (token (Parsers.string "null")))
+-- | Parse a JSON array
+jsonArray :: Parsing.Parser Model.Value
+jsonArray =
+    Parsers.map (\x -> Model.ValueArray x) (Parsers.between (token (Parsers.char 91)) (token (Parsers.char 93)) (Parsers.sepBy (Parsers.lazy (\_ -> jsonValue)) (token (Parsers.char 44))))
 
 -- | Parse JSON boolean (true or false)
-jsonBool :: (Parsing.Parser Model.Value)
-jsonBool = (Parsers.alt (Parsers.map (\_ -> Model.ValueBoolean True) (token (Parsers.string "true"))) (Parsers.map (\_ -> Model.ValueBoolean False) (token (Parsers.string "false"))))
+jsonBool :: Parsing.Parser Model.Value
+jsonBool =
+    Parsers.alt (Parsers.map (\_ -> Model.ValueBoolean True) (token (Parsers.string "true"))) (Parsers.map (\_ -> Model.ValueBoolean False) (token (Parsers.string "false")))
 
--- | Parse a single digit (0-9)
-digit :: (Parsing.Parser Int)
-digit = (Parsers.satisfy (\c -> Logic.and (Equality.gte c 48) (Equality.lte c 57)))
+-- | Parse a JSON escape sequence after the backslash
+jsonEscapeChar :: Parsing.Parser Int
+jsonEscapeChar =
+    Parsers.choice [
+      Parsers.map (\_ -> 34) (Parsers.char 34),
+      (Parsers.map (\_ -> 92) (Parsers.char 92)),
+      (Parsers.map (\_ -> 47) (Parsers.char 47)),
+      (Parsers.map (\_ -> 8) (Parsers.char 98)),
+      (Parsers.map (\_ -> 12) (Parsers.char 102)),
+      (Parsers.map (\_ -> 10) (Parsers.char 110)),
+      (Parsers.map (\_ -> 13) (Parsers.char 114)),
+      (Parsers.map (\_ -> 9) (Parsers.char 116))]
 
--- | Parse one or more digits as a string
-digits :: (Parsing.Parser String)
-digits = (Parsers.map Strings.fromList (Parsers.some digit))
+-- | Parse the optional exponent part of a JSON number
+jsonExponentPart :: Parsing.Parser (Maybe String)
+jsonExponentPart =
+    Parsers.optional (Parsers.bind (Parsers.satisfy (\c -> Logic.or (Equality.equal c 101) (Equality.equal c 69))) (\_ -> Parsers.bind (Parsers.optional (Parsers.satisfy (\c -> Logic.or (Equality.equal c 43) (Equality.equal c 45)))) (\sign -> Parsers.map (\digits -> Strings.cat2 (Strings.cat2 "e" (Maybes.maybe "" (\arg_ -> Strings.fromList (Lists.pure arg_)) sign)) digits) digits)))
 
+-- | Parse the optional fractional part of a JSON number
+jsonFractionPart :: Parsing.Parser (Maybe String)
+jsonFractionPart = Parsers.optional (Parsers.bind (Parsers.char 46) (\_ -> Parsers.map (\d -> Strings.cat2 "." d) digits))
+
 -- | Parse the integer part of a JSON number (optional minus, then digits)
-jsonIntegerPart :: (Parsing.Parser String)
-jsonIntegerPart = (Parsers.bind (Parsers.optional (Parsers.char 45)) (\sign -> Parsers.bind digits (\digits -> Parsers.pure (Maybes.maybe digits (\_ -> Strings.cat2 "-" digits) sign))))
+jsonIntegerPart :: Parsing.Parser String
+jsonIntegerPart =
+    Parsers.bind (Parsers.optional (Parsers.char 45)) (\sign -> Parsers.bind digits (\digits -> Parsers.pure (Maybes.maybe digits (\_ -> Strings.cat2 "-" digits) sign)))
 
--- | Parse the optional fractional part of a JSON number
-jsonFractionPart :: (Parsing.Parser (Maybe String))
-jsonFractionPart = (Parsers.optional (Parsers.bind (Parsers.char 46) (\_ -> Parsers.map (\d -> Strings.cat2 "." d) digits)))
+-- | Parse a JSON object key-value pair
+jsonKeyValue :: Parsing.Parser (String, Model.Value)
+jsonKeyValue =
+    Parsers.bind (token (Parsers.bind (Parsers.char 34) (\_ -> Parsers.bind (Parsers.many jsonStringChar) (\chars -> Parsers.bind (Parsers.char 34) (\_ -> Parsers.pure (Strings.fromList chars)))))) (\key -> Parsers.bind (token (Parsers.char 58)) (\_ -> Parsers.map (\v -> (key, v)) (Parsers.lazy (\_ -> jsonValue))))
 
--- | Parse the optional exponent part of a JSON number
-jsonExponentPart :: (Parsing.Parser (Maybe String))
-jsonExponentPart = (Parsers.optional (Parsers.bind (Parsers.satisfy (\c -> Logic.or (Equality.equal c 101) (Equality.equal c 69))) (\_ -> Parsers.bind (Parsers.optional (Parsers.satisfy (\c -> Logic.or (Equality.equal c 43) (Equality.equal c 45)))) (\sign -> Parsers.map (\digits -> Strings.cat2 (Strings.cat2 "e" (Maybes.maybe "" (\arg_ -> Strings.fromList (Lists.pure arg_)) sign)) digits) digits))))
+-- | Parse JSON null value
+jsonNull :: Parsing.Parser Model.Value
+jsonNull = Parsers.map (\_ -> Model.ValueNull) (token (Parsers.string "null"))
 
 -- | Parse a JSON number (integer, decimal, or scientific notation)
-jsonNumber :: (Parsing.Parser Model.Value)
-jsonNumber = (token (Parsers.bind jsonIntegerPart (\intPart -> Parsers.bind jsonFractionPart (\fracPart -> Parsers.bind jsonExponentPart (\expPart ->  
-  let numStr = (Strings.cat2 (Strings.cat2 intPart (Maybes.maybe "" Equality.identity fracPart)) (Maybes.maybe "" Equality.identity expPart))
-  in (Parsers.pure (Model.ValueNumber (Maybes.maybe 0.0 Equality.identity (Literals.readBigfloat numStr)))))))))
-
--- | Parse a JSON escape sequence after the backslash
-jsonEscapeChar :: (Parsing.Parser Int)
-jsonEscapeChar = (Parsers.choice [
-  Parsers.map (\_ -> 34) (Parsers.char 34),
-  (Parsers.map (\_ -> 92) (Parsers.char 92)),
-  (Parsers.map (\_ -> 47) (Parsers.char 47)),
-  (Parsers.map (\_ -> 8) (Parsers.char 98)),
-  (Parsers.map (\_ -> 12) (Parsers.char 102)),
-  (Parsers.map (\_ -> 10) (Parsers.char 110)),
-  (Parsers.map (\_ -> 13) (Parsers.char 114)),
-  (Parsers.map (\_ -> 9) (Parsers.char 116))])
+jsonNumber :: Parsing.Parser Model.Value
+jsonNumber =
+    token (Parsers.bind jsonIntegerPart (\intPart -> Parsers.bind jsonFractionPart (\fracPart -> Parsers.bind jsonExponentPart (\expPart ->
+      let numStr =
+              Strings.cat2 (Strings.cat2 intPart (Maybes.maybe "" Equality.identity fracPart)) (Maybes.maybe "" Equality.identity expPart)
+      in (Parsers.pure (Model.ValueNumber (Maybes.maybe 0.0 Equality.identity (Literals.readBigfloat numStr))))))))
 
--- | Parse a single character in a JSON string (handling escapes)
-jsonStringChar :: (Parsing.Parser Int)
-jsonStringChar = (Parsers.alt (Parsers.bind (Parsers.char 92) (\_ -> jsonEscapeChar)) (Parsers.satisfy (\c -> Logic.and (Logic.not (Equality.equal c 34)) (Logic.not (Equality.equal c 92)))))
+-- | Parse a JSON object
+jsonObject :: Parsing.Parser Model.Value
+jsonObject =
+    Parsers.map (\arg_ -> (\x -> Model.ValueObject x) (Maps.fromList arg_)) (Parsers.between (token (Parsers.char 123)) (token (Parsers.char 125)) (Parsers.sepBy jsonKeyValue (token (Parsers.char 44))))
 
 -- | Parse a JSON string value
-jsonString :: (Parsing.Parser Model.Value)
-jsonString = (token (Parsers.bind (Parsers.char 34) (\_ -> Parsers.bind (Parsers.many jsonStringChar) (\chars -> Parsers.bind (Parsers.char 34) (\_ -> Parsers.pure (Model.ValueString (Strings.fromList chars)))))))
-
--- | Parse a JSON array
-jsonArray :: (Parsing.Parser Model.Value)
-jsonArray = (Parsers.map (\x -> Model.ValueArray x) (Parsers.between (token (Parsers.char 91)) (token (Parsers.char 93)) (Parsers.sepBy (Parsers.lazy (\_ -> jsonValue)) (token (Parsers.char 44)))))
-
--- | Parse a JSON object key-value pair
-jsonKeyValue :: (Parsing.Parser (String, Model.Value))
-jsonKeyValue = (Parsers.bind (token (Parsers.bind (Parsers.char 34) (\_ -> Parsers.bind (Parsers.many jsonStringChar) (\chars -> Parsers.bind (Parsers.char 34) (\_ -> Parsers.pure (Strings.fromList chars)))))) (\key -> Parsers.bind (token (Parsers.char 58)) (\_ -> Parsers.map (\v -> (key, v)) (Parsers.lazy (\_ -> jsonValue)))))
+jsonString :: Parsing.Parser Model.Value
+jsonString =
+    token (Parsers.bind (Parsers.char 34) (\_ -> Parsers.bind (Parsers.many jsonStringChar) (\chars -> Parsers.bind (Parsers.char 34) (\_ -> Parsers.pure (Model.ValueString (Strings.fromList chars))))))
 
--- | Parse a JSON object
-jsonObject :: (Parsing.Parser Model.Value)
-jsonObject = (Parsers.map (\arg_ -> (\x -> Model.ValueObject x) (Maps.fromList arg_)) (Parsers.between (token (Parsers.char 123)) (token (Parsers.char 125)) (Parsers.sepBy jsonKeyValue (token (Parsers.char 44)))))
+-- | Parse a single character in a JSON string (handling escapes)
+jsonStringChar :: Parsing.Parser Int
+jsonStringChar =
+    Parsers.alt (Parsers.bind (Parsers.char 92) (\_ -> jsonEscapeChar)) (Parsers.satisfy (\c -> Logic.and (Logic.not (Equality.equal c 34)) (Logic.not (Equality.equal c 92))))
 
 -- | Parse any JSON value
-jsonValue :: (Parsing.Parser Model.Value)
-jsonValue = (Parsers.choice [
-  jsonNull,
-  jsonBool,
-  jsonNumber,
-  jsonString,
-  jsonArray,
-  jsonObject])
+jsonValue :: Parsing.Parser Model.Value
+jsonValue =
+    Parsers.choice [
+      jsonNull,
+      jsonBool,
+      jsonNumber,
+      jsonString,
+      jsonArray,
+      jsonObject]
 
 -- | Parse a JSON document from a string
-parseJson :: (String -> Parsing.ParseResult Model.Value)
-parseJson input = (Parsing.unParser (Parsers.bind whitespace (\_ -> Parsers.bind jsonValue (\v -> Parsers.bind whitespace (\_ -> Parsers.bind Parsers.eof (\_ -> Parsers.pure v))))) input)
+parseJson :: String -> Parsing.ParseResult Model.Value
+parseJson input =
+    Parsing.unParser (Parsers.bind whitespace (\_ -> Parsers.bind jsonValue (\v -> Parsers.bind whitespace (\_ -> Parsers.bind Parsers.eof (\_ -> Parsers.pure v))))) input
+
+-- | Parse a token followed by optional whitespace
+token :: Parsing.Parser t0 -> Parsing.Parser t0
+token p = Parsers.bind p (\x -> Parsers.bind whitespace (\_ -> Parsers.pure x))
+
+-- | Parse zero or more JSON whitespace characters (space, tab, newline, carriage return)
+whitespace :: Parsing.Parser ()
+whitespace =
+    Parsers.map (\_ -> ()) (Parsers.many (Parsers.satisfy (\c -> Lists.foldl Logic.or False [
+      Equality.equal c 32,
+      (Equality.equal c 9),
+      (Equality.equal c 10),
+      (Equality.equal c 13)])))
diff --git a/src/gen-main/haskell/Hydra/Json/Writer.hs b/src/gen-main/haskell/Hydra/Json/Writer.hs
--- a/src/gen-main/haskell/Hydra/Json/Writer.hs
+++ b/src/gen-main/haskell/Hydra/Json/Writer.hs
@@ -24,48 +24,50 @@
 
 -- | The colon operator used to separate keys and values in JSON objects
 colonOp :: Ast.Op
-colonOp = Ast.Op {
-  Ast.opSymbol = (Ast.Symbol ":"),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsNone,
-    Ast.paddingRight = Ast.WsSpace},
-  Ast.opPrecedence = (Ast.Precedence 0),
-  Ast.opAssociativity = Ast.AssociativityNone}
+colonOp =
+    Ast.Op {
+      Ast.opSymbol = (Ast.Symbol ":"),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsNone,
+        Ast.paddingRight = Ast.WsSpace},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityNone}
 
 -- | Escape and quote a string for JSON output
-jsonString :: (String -> String)
-jsonString s =  
-  let hexEscape = (\c ->  
-          let hi = (Strings.fromList (Lists.pure (Strings.charAt (Math.div c 16) "0123456789abcdef")))
-          in  
-            let lo = (Strings.fromList (Lists.pure (Strings.charAt (Math.mod c 16) "0123456789abcdef")))
-            in (Strings.cat2 (Strings.cat2 "\\u00" hi) lo))
-  in  
-    let escape = (\c -> Logic.ifElse (Equality.equal c 34) "\\\"" (Logic.ifElse (Equality.equal c 92) "\\\\" (Logic.ifElse (Equality.equal c 8) "\\b" (Logic.ifElse (Equality.equal c 12) "\\f" (Logic.ifElse (Equality.equal c 10) "\\n" (Logic.ifElse (Equality.equal c 13) "\\r" (Logic.ifElse (Equality.equal c 9) "\\t" (Logic.ifElse (Equality.lt c 32) (hexEscape c) (Strings.fromList (Lists.pure c))))))))))
-    in  
-      let escaped = (Strings.cat (Lists.map escape (Strings.toList s)))
+jsonString :: String -> String
+jsonString s =
+
+      let hexEscape =
+              \c ->
+                let hi = Strings.fromList (Lists.pure (Strings.charAt (Math.div c 16) "0123456789abcdef"))
+                    lo = Strings.fromList (Lists.pure (Strings.charAt (Math.mod c 16) "0123456789abcdef"))
+                in (Strings.cat2 (Strings.cat2 "\\u00" hi) lo)
+          escape =
+                  \c -> Logic.ifElse (Equality.equal c 34) "\\\"" (Logic.ifElse (Equality.equal c 92) "\\\\" (Logic.ifElse (Equality.equal c 8) "\\b" (Logic.ifElse (Equality.equal c 12) "\\f" (Logic.ifElse (Equality.equal c 10) "\\n" (Logic.ifElse (Equality.equal c 13) "\\r" (Logic.ifElse (Equality.equal c 9) "\\t" (Logic.ifElse (Equality.lt c 32) (hexEscape c) (Strings.fromList (Lists.pure c)))))))))
+          escaped = Strings.cat (Lists.map escape (Strings.toList s))
       in (Strings.cat2 (Strings.cat2 "\"" escaped) "\"")
 
 -- | Convert a key-value pair to an AST expression
-keyValueToExpr :: ((String, Model.Value) -> Ast.Expr)
-keyValueToExpr pair =  
-  let key = (Pairs.first pair)
-  in  
-    let value = (Pairs.second pair)
-    in (Serialization.ifx colonOp (Serialization.cst (jsonString key)) (valueToExpr value))
+keyValueToExpr :: (String, Model.Value) -> Ast.Expr
+keyValueToExpr pair =
 
+      let key = Pairs.first pair
+          value = Pairs.second pair
+      in (Serialization.ifx colonOp (Serialization.cst (jsonString key)) (valueToExpr value))
+
 -- | Serialize a JSON value to a string
-printJson :: (Model.Value -> String)
-printJson value = (Serialization.printExpr (valueToExpr value))
+printJson :: Model.Value -> String
+printJson value = Serialization.printExpr (valueToExpr value)
 
 -- | Convert a JSON value to an AST expression for serialization
-valueToExpr :: (Model.Value -> Ast.Expr)
-valueToExpr value = ((\x -> case x of
-  Model.ValueArray v1 -> (Serialization.bracketListAdaptive (Lists.map valueToExpr v1))
-  Model.ValueBoolean v1 -> (Serialization.cst (Logic.ifElse v1 "true" "false"))
-  Model.ValueNull -> (Serialization.cst "null")
-  Model.ValueNumber v1 ->  
-    let rounded = (Literals.bigfloatToBigint v1)
-    in (Serialization.cst (Logic.ifElse (Equality.equal v1 (Literals.bigintToBigfloat rounded)) (Literals.showBigint rounded) (Literals.showBigfloat v1)))
-  Model.ValueObject v1 -> (Serialization.bracesListAdaptive (Lists.map keyValueToExpr (Maps.toList v1)))
-  Model.ValueString v1 -> (Serialization.cst (jsonString v1))) value)
+valueToExpr :: Model.Value -> Ast.Expr
+valueToExpr value =
+    case value of
+      Model.ValueArray v0 -> Serialization.bracketListAdaptive (Lists.map valueToExpr v0)
+      Model.ValueBoolean v0 -> Serialization.cst (Logic.ifElse v0 "true" "false")
+      Model.ValueNull -> Serialization.cst "null"
+      Model.ValueNumber v0 ->
+        let rounded = Literals.bigfloatToBigint v0
+        in (Serialization.cst (Logic.ifElse (Equality.equal v0 (Literals.bigintToBigfloat rounded)) (Literals.showBigint rounded) (Literals.showBigfloat v0)))
+      Model.ValueObject v0 -> Serialization.bracesListAdaptive (Lists.map keyValueToExpr (Maps.toList v0))
+      Model.ValueString v0 -> Serialization.cst (jsonString v0)
diff --git a/src/gen-main/haskell/Hydra/Json/Yaml/Decode.hs b/src/gen-main/haskell/Hydra/Json/Yaml/Decode.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Json/Yaml/Decode.hs
@@ -0,0 +1,57 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | YAML-to-JSON decoding. Converts YAML Nodes to JSON Values (may fail for non-JSON YAML), and YAML Nodes to Hydra Terms via JSON.
+
+module Hydra.Json.Yaml.Decode where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Ext.Org.Yaml.Model as Model
+import qualified Hydra.Json.Decode as Decode
+import qualified Hydra.Json.Model as Model_
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Pairs as Pairs
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Decode a YAML node to a Hydra term via JSON decoding.
+fromYaml :: M.Map Core.Name Core.Type -> Core.Name -> Core.Type -> Model.Node -> Either String Core.Term
+fromYaml types tname typ node =
+
+      let jsonResult = yamlToJson node
+      in (Eithers.either (\err -> Left err) (\json -> Decode.fromJson types tname typ json) jsonResult)
+
+-- | Convert a YAML node to a JSON value. Fails for non-JSON YAML features (e.g. non-string mapping keys).
+yamlToJson :: Model.Node -> Either String Model_.Value
+yamlToJson node =
+    case node of
+      Model.NodeMapping v0 ->
+        let convertEntry =
+                \kv ->
+                  let keyNode = Pairs.first kv
+                      valNode = Pairs.second kv
+                      keyResult =
+                              case keyNode of
+                                Model.NodeScalar v1 -> case v1 of
+                                  Model.ScalarStr v2 -> Right v2
+                                  _ -> Left "non-string YAML mapping key"
+                                _ -> Left "non-scalar YAML mapping key"
+                  in (Eithers.either (\err -> Left err) (\key ->
+                    let valResult = yamlToJson valNode
+                    in (Eithers.map (\v -> (key, v)) valResult)) keyResult)
+            entries = Eithers.mapList convertEntry (Maps.toList v0)
+        in (Eithers.map (\es -> Model_.ValueObject (Maps.fromList es)) entries)
+      Model.NodeScalar v0 -> case v0 of
+        Model.ScalarBool v1 -> Right (Model_.ValueBoolean v1)
+        Model.ScalarFloat v1 -> Right (Model_.ValueNumber v1)
+        Model.ScalarInt v1 -> Right (Model_.ValueNumber (Literals.bigintToBigfloat v1))
+        Model.ScalarNull -> Right Model_.ValueNull
+        Model.ScalarStr v1 -> Right (Model_.ValueString v1)
+      Model.NodeSequence v0 ->
+        let results = Eithers.mapList (\n -> yamlToJson n) v0
+        in (Eithers.map (\vs -> Model_.ValueArray vs) results)
diff --git a/src/gen-main/haskell/Hydra/Json/Yaml/Encode.hs b/src/gen-main/haskell/Hydra/Json/Yaml/Encode.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Json/Yaml/Encode.hs
@@ -0,0 +1,35 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | JSON-to-YAML encoding. Converts JSON Values to YAML Nodes (always succeeds), and Hydra Terms to YAML Nodes via JSON.
+
+module Hydra.Json.Yaml.Encode where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Ext.Org.Yaml.Model as Model
+import qualified Hydra.Json.Encode as Encode
+import qualified Hydra.Json.Model as Model_
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Pairs as Pairs
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Convert a JSON value to a YAML node. Always succeeds since YAML is a superset of JSON.
+jsonToYaml :: Model_.Value -> Model.Node
+jsonToYaml value =
+    case value of
+      Model_.ValueArray v0 -> Model.NodeSequence (Lists.map (\v -> jsonToYaml v) v0)
+      Model_.ValueBoolean v0 -> Model.NodeScalar (Model.ScalarBool v0)
+      Model_.ValueNull -> Model.NodeScalar Model.ScalarNull
+      Model_.ValueNumber v0 -> Model.NodeScalar (Model.ScalarFloat v0)
+      Model_.ValueObject v0 -> Model.NodeMapping (Maps.fromList (Lists.map (\kv -> (Model.NodeScalar (Model.ScalarStr (Pairs.first kv)), (jsonToYaml (Pairs.second kv)))) (Maps.toList v0)))
+      Model_.ValueString v0 -> Model.NodeScalar (Model.ScalarStr v0)
+
+-- | Encode a Hydra term to a YAML node via JSON encoding.
+toYaml :: Core.Term -> Either String Model.Node
+toYaml term = Eithers.map (\v -> jsonToYaml v) (Encode.toJson term)
diff --git a/src/gen-main/haskell/Hydra/Languages.hs b/src/gen-main/haskell/Hydra/Languages.hs
--- a/src/gen-main/haskell/Hydra/Languages.hs
+++ b/src/gen-main/haskell/Hydra/Languages.hs
@@ -17,24 +17,26 @@
 
 -- | Language constraints for Hydra Core, i.e. no constraints.
 hydraLanguage :: Coders.Language
-hydraLanguage = Coders.Language {
-  Coders.languageName = (Coders.LanguageName "hydra.core"),
-  Coders.languageConstraints = Coders.LanguageConstraints {
-    Coders.languageConstraintsEliminationVariants = eliminationVariants,
-    Coders.languageConstraintsLiteralVariants = literalVariants,
-    Coders.languageConstraintsFloatTypes = floatTypes,
-    Coders.languageConstraintsFunctionVariants = functionVariants,
-    Coders.languageConstraintsIntegerTypes = integerTypes,
-    Coders.languageConstraintsTermVariants = termVariants,
-    Coders.languageConstraintsTypeVariants = typeVariants,
-    Coders.languageConstraintsTypes = types}} 
-  where 
-    eliminationVariants = (Sets.fromList Reflect.eliminationVariants)
-    literalVariants = (Sets.fromList Reflect.literalVariants)
-    floatTypes = (Sets.fromList Reflect.floatTypes)
-    functionVariants = (Sets.fromList Reflect.functionVariants)
-    integerTypes = (Sets.fromList Reflect.integerTypes)
-    termVariants = (Sets.fromList Reflect.termVariants)
-    typeVariants = (Sets.fromList Reflect.typeVariants)
-    types = (\t -> (\x -> case x of
-      _ -> True) t)
+hydraLanguage =
+    Coders.Language {
+      Coders.languageName = (Coders.LanguageName "hydra.core"),
+      Coders.languageConstraints = Coders.LanguageConstraints {
+        Coders.languageConstraintsEliminationVariants = eliminationVariants,
+        Coders.languageConstraintsLiteralVariants = literalVariants,
+        Coders.languageConstraintsFloatTypes = floatTypes,
+        Coders.languageConstraintsFunctionVariants = functionVariants,
+        Coders.languageConstraintsIntegerTypes = integerTypes,
+        Coders.languageConstraintsTermVariants = termVariants,
+        Coders.languageConstraintsTypeVariants = typeVariants,
+        Coders.languageConstraintsTypes = types}}
+  where
+    eliminationVariants = Sets.fromList Reflect.eliminationVariants
+    literalVariants = Sets.fromList Reflect.literalVariants
+    floatTypes = Sets.fromList Reflect.floatTypes
+    functionVariants = Sets.fromList Reflect.functionVariants
+    integerTypes = Sets.fromList Reflect.integerTypes
+    termVariants = Sets.fromList Reflect.termVariants
+    typeVariants = Sets.fromList Reflect.typeVariants
+    types =
+        \t -> case t of
+          _ -> True
diff --git a/src/gen-main/haskell/Hydra/Lexical.hs b/src/gen-main/haskell/Hydra/Lexical.hs
--- a/src/gen-main/haskell/Hydra/Lexical.hs
+++ b/src/gen-main/haskell/Hydra/Lexical.hs
@@ -4,12 +4,12 @@
 
 module Hydra.Lexical where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Literals as Literals
 import qualified Hydra.Lib.Logic as Logic
@@ -19,10 +19,8 @@
 import qualified Hydra.Lib.Pairs as Pairs
 import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
 import qualified Hydra.Rewriting as Rewriting
 import qualified Hydra.Show.Core as Core_
-import qualified Hydra.Typing as Typing
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -30,176 +28,247 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-chooseUniqueName :: (S.Set Core.Name -> Core.Name -> Core.Name)
-chooseUniqueName reserved name =  
-  let tryName = (\index ->  
-          let candidate = (Logic.ifElse (Equality.equal index 1) name (Core.Name (Strings.cat2 (Core.unName name) (Literals.showInt32 index))))
-          in (Logic.ifElse (Sets.member candidate reserved) (tryName (Math.add index 1)) candidate))
-  in (tryName 1)
+-- | Build a Graph from element bindings, environment, and primitives
+buildGraph :: [Core.Binding] -> M.Map Core.Name (Maybe Core.Term) -> M.Map Core.Name Graph.Primitive -> Graph.Graph
+buildGraph elements environment primitives =
 
--- | Look up an element in the current graph context
-dereferenceElement :: (Core.Name -> Compute.Flow Graph.Graph (Maybe Core.Binding))
-dereferenceElement name = (Flows.map (\g -> lookupElement g name) Monads.getState)
+      let elementTerms = Maps.fromList (Lists.map (\b -> (Core.bindingName b, (Core.bindingTerm b))) elements)
+          letTerms = Maps.map (\mt -> Maybes.fromJust mt) (Maps.filter (\mt -> Maybes.isJust mt) environment)
+          elementTypes =
+                  Maps.fromList (Maybes.cat (Lists.map (\b -> Maybes.map (\ts -> (Core.bindingName b, ts)) (Core.bindingType b)) elements))
+      in Graph.Graph {
+        Graph.graphBoundTerms = (Maps.union elementTerms letTerms),
+        Graph.graphBoundTypes = elementTypes,
+        Graph.graphClassConstraints = Maps.empty,
+        Graph.graphLambdaVariables = (Sets.fromList (Maps.keys (Maps.filter (\mt -> Maybes.isNothing mt) environment))),
+        Graph.graphMetadata = Maps.empty,
+        Graph.graphPrimitives = primitives,
+        Graph.graphSchemaTypes = Maps.empty,
+        Graph.graphTypeVariables = Sets.empty}
 
+chooseUniqueName :: S.Set Core.Name -> Core.Name -> Core.Name
+chooseUniqueName reserved name =
+
+      let tryName =
+              \index ->
+                let candidate = Logic.ifElse (Equality.equal index 1) name (Core.Name (Strings.cat2 (Core.unName name) (Literals.showInt32 index)))
+                in (Logic.ifElse (Sets.member candidate reserved) (tryName (Math.add index 1)) candidate)
+      in (tryName 1)
+
+-- | Look up an element in a graph
+dereferenceElement :: Graph.Graph -> Core.Name -> Maybe Core.Binding
+dereferenceElement graph name = lookupElement graph name
+
 -- | Resolve a schema type through a chain of zero or more typedefs
-dereferenceSchemaType :: (Core.Name -> M.Map Core.Name Core.TypeScheme -> Maybe Core.TypeScheme)
-dereferenceSchemaType name types =  
-  let forType = (\t -> (\x -> case x of
-          Core.TypeAnnotated v1 -> (forType (Core.annotatedTypeBody v1))
-          Core.TypeForall v1 -> (Maybes.map (\ts -> Core.TypeScheme {
-            Core.typeSchemeVariables = (Lists.cons (Core.forallTypeParameter v1) (Core.typeSchemeVariables ts)),
-            Core.typeSchemeType = (Core.typeSchemeType ts),
-            Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}) (forType (Core.forallTypeBody v1)))
-          Core.TypeVariable v1 -> (dereferenceSchemaType v1 types)
-          _ -> (Just (Core.TypeScheme {
-            Core.typeSchemeVariables = [],
-            Core.typeSchemeType = t,
-            Core.typeSchemeConstraints = Nothing}))) t)
-  in (Maybes.bind (Maps.lookup name types) (\ts -> Maybes.map (\ts2 -> Core.TypeScheme {
-    Core.typeSchemeVariables = (Lists.concat2 (Core.typeSchemeVariables ts) (Core.typeSchemeVariables ts2)),
-    Core.typeSchemeType = (Core.typeSchemeType ts2),
-    Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts2)}) (forType (Core.typeSchemeType ts))))
+dereferenceSchemaType :: Core.Name -> M.Map Core.Name Core.TypeScheme -> Maybe Core.TypeScheme
+dereferenceSchemaType name types =
 
--- | Look up an element by name in a graph, returning Either an error or the binding
-dereferenceVariable :: (Graph.Graph -> Core.Name -> Either String Core.Binding)
-dereferenceVariable g name = (Maybes.maybe (Left (Strings.cat2 "no such element: " (Core.unName name))) (\right_ -> Right right_) (lookupElement g name))
+      let forType =
+              \t -> case t of
+                Core.TypeAnnotated v0 -> forType (Core.annotatedTypeBody v0)
+                Core.TypeForall v0 -> Maybes.map (\ts -> Core.TypeScheme {
+                  Core.typeSchemeVariables = (Lists.cons (Core.forallTypeParameter v0) (Core.typeSchemeVariables ts)),
+                  Core.typeSchemeType = (Core.typeSchemeType ts),
+                  Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}) (forType (Core.forallTypeBody v0))
+                Core.TypeVariable v0 -> dereferenceSchemaType v0 types
+                _ -> Just (Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = t,
+                  Core.typeSchemeConstraints = Nothing})
+      in (Maybes.bind (Maps.lookup name types) (\ts -> Maybes.map (\ts2 -> Core.TypeScheme {
+        Core.typeSchemeVariables = (Lists.concat2 (Core.typeSchemeVariables ts) (Core.typeSchemeVariables ts2)),
+        Core.typeSchemeType = (Core.typeSchemeType ts2),
+        Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts2)}) (forType (Core.typeSchemeType ts))))
 
--- | Create a graph from a parent graph, optional schema, and list of element bindings
-elementsToGraph :: (Graph.Graph -> Maybe Graph.Graph -> [Core.Binding] -> Graph.Graph)
-elementsToGraph parent schema elements = Graph.Graph {
-  Graph.graphElements = elements,
-  Graph.graphEnvironment = (Graph.graphEnvironment parent),
-  Graph.graphTypes = (Graph.graphTypes parent),
-  Graph.graphBody = (Graph.graphBody parent),
-  Graph.graphPrimitives = (Graph.graphPrimitives parent),
-  Graph.graphSchema = schema}
+-- | Look up a binding by name in a graph, returning Either an error or the binding
+dereferenceVariable :: Graph.Graph -> Core.Name -> Either String Core.Binding
+dereferenceVariable graph name =
+    Maybes.maybe (Left (Strings.cat2 "no such element: " (Core.unName name))) (\right_ -> Right right_) (lookupElement graph name)
 
--- | An empty graph; no elements, no primitives, no schema, and an arbitrary body.
-emptyGraph :: Graph.Graph
-emptyGraph = Graph.Graph {
-  Graph.graphElements = [],
-  Graph.graphEnvironment = Maps.empty,
-  Graph.graphTypes = Maps.empty,
-  Graph.graphBody = (Core.TermLiteral (Core.LiteralString "empty graph")),
-  Graph.graphPrimitives = Maps.empty,
-  Graph.graphSchema = Nothing}
+-- | Create a graph from a parent graph, schema types, and list of element bindings
+elementsToGraph :: Graph.Graph -> M.Map Core.Name Core.TypeScheme -> [Core.Binding] -> Graph.Graph
+elementsToGraph parent schemaTypes elements =
 
--- | Add bindings to an existing graph
-extendGraphWithBindings :: ([Core.Binding] -> Graph.Graph -> Graph.Graph)
-extendGraphWithBindings bindings g = Graph.Graph {
-  Graph.graphElements = (Lists.concat2 bindings (Graph.graphElements g)),
-  Graph.graphEnvironment = (Graph.graphEnvironment g),
-  Graph.graphTypes = (Graph.graphTypes g),
-  Graph.graphBody = (Graph.graphBody g),
-  Graph.graphPrimitives = (Graph.graphPrimitives g),
-  Graph.graphSchema = (Graph.graphSchema g)}
+      let prims = Graph.graphPrimitives parent
+          g = buildGraph elements Maps.empty prims
+      in Graph.Graph {
+        Graph.graphBoundTerms = (Graph.graphBoundTerms g),
+        Graph.graphBoundTypes = (Graph.graphBoundTypes g),
+        Graph.graphClassConstraints = (Graph.graphClassConstraints g),
+        Graph.graphLambdaVariables = (Graph.graphLambdaVariables g),
+        Graph.graphMetadata = (Graph.graphMetadata g),
+        Graph.graphPrimitives = (Graph.graphPrimitives g),
+        Graph.graphSchemaTypes = schemaTypes,
+        Graph.graphTypeVariables = (Graph.graphTypeVariables g)}
 
+-- | An empty context; no trace, no messages, no other data.
+emptyContext :: Context.Context
+emptyContext =
+    Context.Context {
+      Context.contextTrace = [],
+      Context.contextMessages = [],
+      Context.contextOther = Maps.empty}
+
+-- | An empty graph; no elements, no primitives, no schema.
+emptyGraph :: Graph.Graph
+emptyGraph =
+    Graph.Graph {
+      Graph.graphBoundTerms = Maps.empty,
+      Graph.graphBoundTypes = Maps.empty,
+      Graph.graphClassConstraints = Maps.empty,
+      Graph.graphLambdaVariables = Sets.empty,
+      Graph.graphMetadata = Maps.empty,
+      Graph.graphPrimitives = Maps.empty,
+      Graph.graphSchemaTypes = Maps.empty,
+      Graph.graphTypeVariables = Sets.empty}
+
 -- | Extract the fields of a record or union type
-fieldsOf :: (Core.Type -> [Core.FieldType])
-fieldsOf t =  
-  let stripped = (Rewriting.deannotateType t)
-  in ((\x -> case x of
-    Core.TypeForall v1 -> (fieldsOf (Core.forallTypeBody v1))
-    Core.TypeRecord v1 -> (Core.rowTypeFields v1)
-    Core.TypeUnion v1 -> (Core.rowTypeFields v1)
-    _ -> []) stripped)
+fieldsOf :: Core.Type -> [Core.FieldType]
+fieldsOf t =
 
-getField :: (M.Map Core.Name t0 -> Core.Name -> (t0 -> Compute.Flow t1 t2) -> Compute.Flow t1 t2)
-getField m fname decode = (Maybes.maybe (Flows.fail (Strings.cat2 (Strings.cat2 "expected field " (Core.unName fname)) " not found")) decode (Maps.lookup fname m))
+      let stripped = Rewriting.deannotateType t
+      in case stripped of
+        Core.TypeForall v0 -> fieldsOf (Core.forallTypeBody v0)
+        Core.TypeRecord v0 -> v0
+        Core.TypeUnion v0 -> v0
+        _ -> []
 
-lookupElement :: (Graph.Graph -> Core.Name -> Maybe Core.Binding)
-lookupElement g name = (Lists.find (\b -> Equality.equal (Core.bindingName b) name) (Graph.graphElements g))
+getField :: Context.Context -> M.Map Core.Name t0 -> Core.Name -> (t0 -> Either (Context.InContext Errors.Error) t1) -> Either (Context.InContext Errors.Error) t1
+getField cx m fname decode =
+    Maybes.maybe (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 "expected field " (Core.unName fname)) " not found"))),
+      Context.inContextContext = cx})) decode (Maps.lookup fname m)
 
-lookupPrimitive :: (Graph.Graph -> Core.Name -> Maybe Graph.Primitive)
-lookupPrimitive g name = (Maps.lookup name (Graph.graphPrimitives g))
+-- | Reconstruct a list of Bindings from a Graph's boundTerms and boundTypes
+graphToBindings :: Graph.Graph -> [Core.Binding]
+graphToBindings g =
+    Lists.map (\p ->
+      let name = Pairs.first p
+          term = Pairs.second p
+      in Core.Binding {
+        Core.bindingName = name,
+        Core.bindingTerm = term,
+        Core.bindingType = (Maps.lookup name (Graph.graphBoundTypes g))}) (Maps.toList (Graph.graphBoundTerms g))
 
-matchEnum :: (Core.Name -> [(Core.Name, t0)] -> Core.Term -> Compute.Flow Graph.Graph t0)
-matchEnum tname pairs = (matchUnion tname (Lists.map (\pair -> matchUnitField (Pairs.first pair) (Pairs.second pair)) pairs))
+-- | Look up a binding in a graph by name
+lookupElement :: Graph.Graph -> Core.Name -> Maybe Core.Binding
+lookupElement graph name =
+    Maybes.map (\term -> Core.Binding {
+      Core.bindingName = name,
+      Core.bindingTerm = term,
+      Core.bindingType = (Maps.lookup name (Graph.graphBoundTypes graph))}) (Maps.lookup name (Graph.graphBoundTerms graph))
 
-matchRecord :: ((M.Map Core.Name Core.Term -> Compute.Flow t0 t1) -> Core.Term -> Compute.Flow t0 t1)
-matchRecord decode term =  
-  let stripped = (Rewriting.deannotateAndDetypeTerm term)
-  in ((\x -> case x of
-    Core.TermRecord v1 -> (decode (Maps.fromList (Lists.map (\field -> (Core.fieldName field, (Core.fieldTerm field))) (Core.recordFields v1))))
-    _ -> (Monads.unexpected "record" (Core_.term term))) stripped)
+-- | Look up a primitive function in a graph by name
+lookupPrimitive :: Graph.Graph -> Core.Name -> Maybe Graph.Primitive
+lookupPrimitive graph name = Maps.lookup name (Graph.graphPrimitives graph)
 
-matchUnion :: (Core.Name -> [(Core.Name, (Core.Term -> Compute.Flow Graph.Graph t0))] -> Core.Term -> Compute.Flow Graph.Graph t0)
-matchUnion tname pairs term =  
-  let stripped = (Rewriting.deannotateAndDetypeTerm term)
-  in  
-    let mapping = (Maps.fromList pairs)
-    in ((\x -> case x of
-      Core.TermVariable v1 -> (Flows.bind (requireElement v1) (\el -> matchUnion tname pairs (Core.bindingTerm el)))
-      Core.TermUnion v1 ->  
-        let exp =  
-                let fname = (Core.fieldName (Core.injectionField v1))
-                in  
-                  let val = (Core.fieldTerm (Core.injectionField v1))
-                  in (Maybes.maybe (Flows.fail (Strings.cat2 (Strings.cat2 (Strings.cat2 "no matching case for field \"" (Core.unName fname)) "\" in union type ") (Core.unName tname))) (\f -> f val) (Maps.lookup fname mapping))
-        in (Logic.ifElse (Equality.equal (Core.unName (Core.injectionTypeName v1)) (Core.unName tname)) exp (Monads.unexpected (Strings.cat2 "injection for type " (Core.unName tname)) (Core_.term term)))
-      _ -> (Monads.unexpected (Strings.cat [
-        "inject(",
-        (Core.unName tname),
-        ") with one of {",
-        (Strings.intercalate ", " (Lists.map (\pair -> Core.unName (Pairs.first pair)) pairs)),
-        "}"]) (Core_.term stripped))) stripped)
+-- | Look up a term by name in a graph
+lookupTerm :: Graph.Graph -> Core.Name -> Maybe Core.Term
+lookupTerm graph name = Maps.lookup name (Graph.graphBoundTerms graph)
 
-matchUnitField :: (t0 -> t1 -> (t0, (t2 -> Compute.Flow t3 t1)))
-matchUnitField fname x = (fname, (\ignored -> Flows.pure x))
+matchEnum :: Context.Context -> Graph.Graph -> Core.Name -> [(Core.Name, t0)] -> Core.Term -> Either (Context.InContext Errors.Error) t0
+matchEnum cx graph tname pairs =
+    matchUnion cx graph tname (Lists.map (\pair -> matchUnitField (Pairs.first pair) (Pairs.second pair)) pairs)
 
-requireElement :: (Core.Name -> Compute.Flow Graph.Graph Core.Binding)
-requireElement name =  
-  let showAll = False
-  in  
-    let ellipsis = (\strings -> Logic.ifElse (Logic.and (Equality.gt (Lists.length strings) 3) (Logic.not showAll)) (Lists.concat2 (Lists.take 3 strings) [
-            "..."]) strings)
-    in  
-      let err = (\g -> Flows.fail (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "no such element: " (Core.unName name)) ". Available elements: {") (Strings.intercalate ", " (ellipsis (Lists.map (\el -> Core.unName (Core.bindingName el)) (Graph.graphElements g))))) "}"))
-      in (Flows.bind (dereferenceElement name) (\mel -> Maybes.maybe (Flows.bind Monads.getState (\g -> err g)) Flows.pure mel))
+matchRecord :: Context.Context -> t0 -> (M.Map Core.Name Core.Term -> Either (Context.InContext Errors.Error) t1) -> Core.Term -> Either (Context.InContext Errors.Error) t1
+matchRecord cx graph decode term =
 
-requirePrimitive :: (Core.Name -> Compute.Flow Graph.Graph Graph.Primitive)
-requirePrimitive name = (Flows.bind Monads.getState (\g -> Maybes.maybe (Flows.fail (Strings.cat2 "no such primitive function: " (Core.unName name))) Flows.pure (lookupPrimitive g name)))
+      let stripped = Rewriting.deannotateAndDetypeTerm term
+      in case stripped of
+        Core.TermRecord v0 -> decode (Maps.fromList (Lists.map (\field -> (Core.fieldName field, (Core.fieldTerm field))) (Core.recordFields v0)))
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "expected a record, got " (Core_.term term)))),
+          Context.inContextContext = cx})
 
-requirePrimitiveType :: (Typing.TypeContext -> Core.Name -> Compute.Flow t0 Core.TypeScheme)
-requirePrimitiveType tx name =  
-  let mts = (Maps.lookup name (Typing.inferenceContextPrimitiveTypes (Typing.typeContextInferenceContext tx)))
-  in (Maybes.maybe (Flows.fail (Strings.cat2 "no such primitive function: " (Core.unName name))) (\ts -> Flows.pure ts) mts)
+matchUnion :: Context.Context -> Graph.Graph -> Core.Name -> [(Core.Name, (Core.Term -> Either (Context.InContext Errors.Error) t0))] -> Core.Term -> Either (Context.InContext Errors.Error) t0
+matchUnion cx graph tname pairs term =
 
-requireTerm :: (Core.Name -> Compute.Flow Graph.Graph Core.Term)
-requireTerm name = (Flows.bind (resolveTerm name) (\mt -> Maybes.maybe (Flows.fail (Strings.cat2 "no such element: " (Core.unName name))) Flows.pure mt))
+      let stripped = Rewriting.deannotateAndDetypeTerm term
+          mapping = Maps.fromList pairs
+      in case stripped of
+        Core.TermVariable v0 -> Eithers.bind (requireElement cx graph v0) (\el -> matchUnion cx graph tname pairs (Core.bindingTerm el))
+        Core.TermUnion v0 ->
+          let exp =
 
+                    let fname = Core.fieldName (Core.injectionField v0)
+                        val = Core.fieldTerm (Core.injectionField v0)
+                    in (Maybes.maybe (Left (Context.InContext {
+                      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "no matching case for field \"" (Core.unName fname)) "\" in union type ") (Core.unName tname)))),
+                      Context.inContextContext = cx})) (\f -> f val) (Maps.lookup fname mapping))
+          in (Logic.ifElse (Equality.equal (Core.unName (Core.injectionTypeName v0)) (Core.unName tname)) exp (Left (Context.InContext {
+            Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected injection for type " (Core.unName tname)) ", got ") (Core_.term term)))),
+            Context.inContextContext = cx})))
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+            "expected inject(",
+            (Core.unName tname),
+            ") with one of {",
+            (Strings.intercalate ", " (Lists.map (\pair -> Core.unName (Pairs.first pair)) pairs)),
+            "}, got ",
+            (Core_.term stripped)]))),
+          Context.inContextContext = cx})
+
+matchUnitField :: t0 -> t1 -> (t0, (t2 -> Either t3 t1))
+matchUnitField fname x = (fname, (\ignored -> Right x))
+
+requireElement :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Core.Binding
+requireElement cx graph name =
+
+      let showAll = False
+          ellipsis =
+                  \strings -> Logic.ifElse (Logic.and (Equality.gt (Lists.length strings) 3) (Logic.not showAll)) (Lists.concat2 (Lists.take 3 strings) [
+                    "..."]) strings
+          errMsg =
+                  Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "no such element: " (Core.unName name)) ". Available elements: {") (Strings.intercalate ", " (ellipsis (Lists.map Core.unName (Maps.keys (Graph.graphBoundTerms graph)))))) "}"
+      in (Maybes.maybe (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError errMsg)),
+        Context.inContextContext = cx})) (\x -> Right x) (dereferenceElement graph name))
+
+requirePrimitive :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Graph.Primitive
+requirePrimitive cx graph name =
+    Maybes.maybe (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "no such primitive function: " (Core.unName name)))),
+      Context.inContextContext = cx})) (\x -> Right x) (lookupPrimitive graph name)
+
+requirePrimitiveType :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Core.TypeScheme
+requirePrimitiveType cx tx name =
+
+      let mts = Maybes.map (\_p -> Graph.primitiveType _p) (Maps.lookup name (Graph.graphPrimitives tx))
+      in (Maybes.maybe (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "no such primitive function: " (Core.unName name)))),
+        Context.inContextContext = cx})) (\ts -> Right ts) mts)
+
+requireTerm :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Core.Term
+requireTerm cx graph name =
+    Maybes.maybe (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "no such element: " (Core.unName name)))),
+      Context.inContextContext = cx})) (\x -> Right x) (resolveTerm graph name)
+
 -- | TODO: distinguish between lambda-bound and let-bound variables
-resolveTerm :: (Core.Name -> Compute.Flow Graph.Graph (Maybe Core.Term))
-resolveTerm name =  
-  let recurse = (\el ->  
-          let stripped = (Rewriting.deannotateTerm (Core.bindingTerm el))
-          in ((\x -> case x of
-            Core.TermVariable v1 -> (resolveTerm v1)
-            _ -> (Flows.pure (Just (Core.bindingTerm el)))) stripped))
-  in (Flows.bind Monads.getState (\g -> Maybes.maybe (Flows.pure Nothing) recurse (Lists.find (\b -> Equality.equal (Core.bindingName b) name) (Graph.graphElements g))))
+resolveTerm :: Graph.Graph -> Core.Name -> Maybe Core.Term
+resolveTerm graph name =
 
--- | Note: assuming for now that primitive functions are the same in the schema graph
-schemaContext :: (Graph.Graph -> Graph.Graph)
-schemaContext g = (Maybes.fromMaybe g (Graph.graphSchema g))
+      let recurse =
+              \term ->
+                let stripped = Rewriting.deannotateTerm term
+                in case stripped of
+                  Core.TermVariable v0 -> resolveTerm graph v0
+                  _ -> Just term
+      in (Maybes.maybe Nothing recurse (lookupTerm graph name))
 
-stripAndDereferenceTerm :: (Core.Term -> Compute.Flow Graph.Graph Core.Term)
-stripAndDereferenceTerm term =  
-  let stripped = (Rewriting.deannotateAndDetypeTerm term)
-  in ((\x -> case x of
-    Core.TermVariable v1 -> (Flows.bind (requireTerm v1) (\t -> stripAndDereferenceTerm t))
-    _ -> (Flows.pure stripped)) stripped)
+stripAndDereferenceTerm :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+stripAndDereferenceTerm cx graph term =
 
--- | Strip annotations and dereference variables, returning Either an error or the resolved term
-stripAndDereferenceTermEither :: (Graph.Graph -> Core.Term -> Either String Core.Term)
-stripAndDereferenceTermEither g term =  
-  let stripped = (Rewriting.deannotateAndDetypeTerm term)
-  in ((\x -> case x of
-    Core.TermVariable v1 -> (Eithers.either (\left_ -> Left left_) (\binding -> stripAndDereferenceTermEither g (Core.bindingTerm binding)) (dereferenceVariable g v1))
-    _ -> (Right stripped)) stripped)
+      let stripped = Rewriting.deannotateAndDetypeTerm term
+      in case stripped of
+        Core.TermVariable v0 -> Eithers.bind (requireTerm cx graph v0) (\t -> stripAndDereferenceTerm cx graph t)
+        _ -> Right stripped
 
--- | Execute flow with empty graph
-withEmptyGraph :: (Compute.Flow Graph.Graph t0 -> Compute.Flow t1 t0)
-withEmptyGraph = (Monads.withState emptyGraph)
+-- | Strip annotations and dereference variables, returning Either an error or the resolved term
+stripAndDereferenceTermEither :: Graph.Graph -> Core.Term -> Either String Core.Term
+stripAndDereferenceTermEither graph term =
 
-withSchemaContext :: (Compute.Flow Graph.Graph t0 -> Compute.Flow Graph.Graph t0)
-withSchemaContext f = (Flows.bind Monads.getState (\g -> Monads.withState (schemaContext g) f))
+      let stripped = Rewriting.deannotateAndDetypeTerm term
+      in case stripped of
+        Core.TermVariable v0 -> Eithers.either (\left_ -> Left left_) (\binding -> stripAndDereferenceTermEither graph (Core.bindingTerm binding)) (dereferenceVariable graph v0)
+        _ -> Right stripped
diff --git a/src/gen-main/haskell/Hydra/Lib/Names.hs b/src/gen-main/haskell/Hydra/Lib/Names.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Lib/Names.hs
@@ -0,0 +1,773 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Namespaces and primitive names for the Hydra standard library
+
+module Hydra.Lib.Names where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+chars :: Module.Namespace
+chars = Module.Namespace "hydra.lib.chars"
+
+charsIsAlphaNum :: Core.Name
+charsIsAlphaNum = Core.Name "hydra.lib.chars.isAlphaNum"
+
+charsIsLower :: Core.Name
+charsIsLower = Core.Name "hydra.lib.chars.isLower"
+
+charsIsSpace :: Core.Name
+charsIsSpace = Core.Name "hydra.lib.chars.isSpace"
+
+charsIsUpper :: Core.Name
+charsIsUpper = Core.Name "hydra.lib.chars.isUpper"
+
+charsToLower :: Core.Name
+charsToLower = Core.Name "hydra.lib.chars.toLower"
+
+charsToUpper :: Core.Name
+charsToUpper = Core.Name "hydra.lib.chars.toUpper"
+
+eithers :: Module.Namespace
+eithers = Module.Namespace "hydra.lib.eithers"
+
+eithersBimap :: Core.Name
+eithersBimap = Core.Name "hydra.lib.eithers.bimap"
+
+eithersBind :: Core.Name
+eithersBind = Core.Name "hydra.lib.eithers.bind"
+
+eithersEither :: Core.Name
+eithersEither = Core.Name "hydra.lib.eithers.either"
+
+eithersFoldl :: Core.Name
+eithersFoldl = Core.Name "hydra.lib.eithers.foldl"
+
+eithersFromLeft :: Core.Name
+eithersFromLeft = Core.Name "hydra.lib.eithers.fromLeft"
+
+eithersFromRight :: Core.Name
+eithersFromRight = Core.Name "hydra.lib.eithers.fromRight"
+
+eithersIsLeft :: Core.Name
+eithersIsLeft = Core.Name "hydra.lib.eithers.isLeft"
+
+eithersIsRight :: Core.Name
+eithersIsRight = Core.Name "hydra.lib.eithers.isRight"
+
+eithersLefts :: Core.Name
+eithersLefts = Core.Name "hydra.lib.eithers.lefts"
+
+eithersMap :: Core.Name
+eithersMap = Core.Name "hydra.lib.eithers.map"
+
+eithersMapList :: Core.Name
+eithersMapList = Core.Name "hydra.lib.eithers.mapList"
+
+eithersMapMaybe :: Core.Name
+eithersMapMaybe = Core.Name "hydra.lib.eithers.mapMaybe"
+
+eithersMapSet :: Core.Name
+eithersMapSet = Core.Name "hydra.lib.eithers.mapSet"
+
+eithersPartitionEithers :: Core.Name
+eithersPartitionEithers = Core.Name "hydra.lib.eithers.partitionEithers"
+
+eithersRights :: Core.Name
+eithersRights = Core.Name "hydra.lib.eithers.rights"
+
+equality :: Module.Namespace
+equality = Module.Namespace "hydra.lib.equality"
+
+equalityCompare :: Core.Name
+equalityCompare = Core.Name "hydra.lib.equality.compare"
+
+equalityEqual :: Core.Name
+equalityEqual = Core.Name "hydra.lib.equality.equal"
+
+equalityGt :: Core.Name
+equalityGt = Core.Name "hydra.lib.equality.gt"
+
+equalityGte :: Core.Name
+equalityGte = Core.Name "hydra.lib.equality.gte"
+
+equalityIdentity :: Core.Name
+equalityIdentity = Core.Name "hydra.lib.equality.identity"
+
+equalityLt :: Core.Name
+equalityLt = Core.Name "hydra.lib.equality.lt"
+
+equalityLte :: Core.Name
+equalityLte = Core.Name "hydra.lib.equality.lte"
+
+equalityMax :: Core.Name
+equalityMax = Core.Name "hydra.lib.equality.max"
+
+equalityMin :: Core.Name
+equalityMin = Core.Name "hydra.lib.equality.min"
+
+lists :: Module.Namespace
+lists = Module.Namespace "hydra.lib.lists"
+
+listsApply :: Core.Name
+listsApply = Core.Name "hydra.lib.lists.apply"
+
+listsAt :: Core.Name
+listsAt = Core.Name "hydra.lib.lists.at"
+
+listsBind :: Core.Name
+listsBind = Core.Name "hydra.lib.lists.bind"
+
+listsConcat :: Core.Name
+listsConcat = Core.Name "hydra.lib.lists.concat"
+
+listsConcat2 :: Core.Name
+listsConcat2 = Core.Name "hydra.lib.lists.concat2"
+
+listsCons :: Core.Name
+listsCons = Core.Name "hydra.lib.lists.cons"
+
+listsDrop :: Core.Name
+listsDrop = Core.Name "hydra.lib.lists.drop"
+
+listsDropWhile :: Core.Name
+listsDropWhile = Core.Name "hydra.lib.lists.dropWhile"
+
+listsElem :: Core.Name
+listsElem = Core.Name "hydra.lib.lists.elem"
+
+listsFilter :: Core.Name
+listsFilter = Core.Name "hydra.lib.lists.filter"
+
+listsFind :: Core.Name
+listsFind = Core.Name "hydra.lib.lists.find"
+
+listsFoldl :: Core.Name
+listsFoldl = Core.Name "hydra.lib.lists.foldl"
+
+listsFoldr :: Core.Name
+listsFoldr = Core.Name "hydra.lib.lists.foldr"
+
+listsGroup :: Core.Name
+listsGroup = Core.Name "hydra.lib.lists.group"
+
+listsHead :: Core.Name
+listsHead = Core.Name "hydra.lib.lists.head"
+
+listsInit :: Core.Name
+listsInit = Core.Name "hydra.lib.lists.init"
+
+listsIntercalate :: Core.Name
+listsIntercalate = Core.Name "hydra.lib.lists.intercalate"
+
+listsIntersperse :: Core.Name
+listsIntersperse = Core.Name "hydra.lib.lists.intersperse"
+
+listsLast :: Core.Name
+listsLast = Core.Name "hydra.lib.lists.last"
+
+listsLength :: Core.Name
+listsLength = Core.Name "hydra.lib.lists.length"
+
+listsMap :: Core.Name
+listsMap = Core.Name "hydra.lib.lists.map"
+
+listsNub :: Core.Name
+listsNub = Core.Name "hydra.lib.lists.nub"
+
+listsNull :: Core.Name
+listsNull = Core.Name "hydra.lib.lists.null"
+
+listsPartition :: Core.Name
+listsPartition = Core.Name "hydra.lib.lists.partition"
+
+listsPure :: Core.Name
+listsPure = Core.Name "hydra.lib.lists.pure"
+
+listsReplicate :: Core.Name
+listsReplicate = Core.Name "hydra.lib.lists.replicate"
+
+listsReverse :: Core.Name
+listsReverse = Core.Name "hydra.lib.lists.reverse"
+
+listsSafeHead :: Core.Name
+listsSafeHead = Core.Name "hydra.lib.lists.safeHead"
+
+listsSingleton :: Core.Name
+listsSingleton = Core.Name "hydra.lib.lists.singleton"
+
+listsSort :: Core.Name
+listsSort = Core.Name "hydra.lib.lists.sort"
+
+listsSortOn :: Core.Name
+listsSortOn = Core.Name "hydra.lib.lists.sortOn"
+
+listsSpan :: Core.Name
+listsSpan = Core.Name "hydra.lib.lists.span"
+
+listsTail :: Core.Name
+listsTail = Core.Name "hydra.lib.lists.tail"
+
+listsTake :: Core.Name
+listsTake = Core.Name "hydra.lib.lists.take"
+
+listsTranspose :: Core.Name
+listsTranspose = Core.Name "hydra.lib.lists.transpose"
+
+listsZip :: Core.Name
+listsZip = Core.Name "hydra.lib.lists.zip"
+
+listsZipWith :: Core.Name
+listsZipWith = Core.Name "hydra.lib.lists.zipWith"
+
+literals :: Module.Namespace
+literals = Module.Namespace "hydra.lib.literals"
+
+literalsBigfloatToBigint :: Core.Name
+literalsBigfloatToBigint = Core.Name "hydra.lib.literals.bigfloatToBigint"
+
+literalsBigfloatToFloat32 :: Core.Name
+literalsBigfloatToFloat32 = Core.Name "hydra.lib.literals.bigfloatToFloat32"
+
+literalsBigfloatToFloat64 :: Core.Name
+literalsBigfloatToFloat64 = Core.Name "hydra.lib.literals.bigfloatToFloat64"
+
+literalsBigintToBigfloat :: Core.Name
+literalsBigintToBigfloat = Core.Name "hydra.lib.literals.bigintToBigfloat"
+
+literalsBigintToInt16 :: Core.Name
+literalsBigintToInt16 = Core.Name "hydra.lib.literals.bigintToInt16"
+
+literalsBigintToInt32 :: Core.Name
+literalsBigintToInt32 = Core.Name "hydra.lib.literals.bigintToInt32"
+
+literalsBigintToInt64 :: Core.Name
+literalsBigintToInt64 = Core.Name "hydra.lib.literals.bigintToInt64"
+
+literalsBigintToInt8 :: Core.Name
+literalsBigintToInt8 = Core.Name "hydra.lib.literals.bigintToInt8"
+
+literalsBigintToUint16 :: Core.Name
+literalsBigintToUint16 = Core.Name "hydra.lib.literals.bigintToUint16"
+
+literalsBigintToUint32 :: Core.Name
+literalsBigintToUint32 = Core.Name "hydra.lib.literals.bigintToUint32"
+
+literalsBigintToUint64 :: Core.Name
+literalsBigintToUint64 = Core.Name "hydra.lib.literals.bigintToUint64"
+
+literalsBigintToUint8 :: Core.Name
+literalsBigintToUint8 = Core.Name "hydra.lib.literals.bigintToUint8"
+
+literalsBinaryToBytes :: Core.Name
+literalsBinaryToBytes = Core.Name "hydra.lib.literals.binaryToBytes"
+
+literalsBinaryToString :: Core.Name
+literalsBinaryToString = Core.Name "hydra.lib.literals.binaryToString"
+
+literalsFloat32ToBigfloat :: Core.Name
+literalsFloat32ToBigfloat = Core.Name "hydra.lib.literals.float32ToBigfloat"
+
+literalsFloat64ToBigfloat :: Core.Name
+literalsFloat64ToBigfloat = Core.Name "hydra.lib.literals.float64ToBigfloat"
+
+literalsInt16ToBigint :: Core.Name
+literalsInt16ToBigint = Core.Name "hydra.lib.literals.int16ToBigint"
+
+literalsInt32ToBigint :: Core.Name
+literalsInt32ToBigint = Core.Name "hydra.lib.literals.int32ToBigint"
+
+literalsInt64ToBigint :: Core.Name
+literalsInt64ToBigint = Core.Name "hydra.lib.literals.int64ToBigint"
+
+literalsInt8ToBigint :: Core.Name
+literalsInt8ToBigint = Core.Name "hydra.lib.literals.int8ToBigint"
+
+literalsReadBigfloat :: Core.Name
+literalsReadBigfloat = Core.Name "hydra.lib.literals.readBigfloat"
+
+literalsReadBigint :: Core.Name
+literalsReadBigint = Core.Name "hydra.lib.literals.readBigint"
+
+literalsReadBoolean :: Core.Name
+literalsReadBoolean = Core.Name "hydra.lib.literals.readBoolean"
+
+literalsReadFloat32 :: Core.Name
+literalsReadFloat32 = Core.Name "hydra.lib.literals.readFloat32"
+
+literalsReadFloat64 :: Core.Name
+literalsReadFloat64 = Core.Name "hydra.lib.literals.readFloat64"
+
+literalsReadInt16 :: Core.Name
+literalsReadInt16 = Core.Name "hydra.lib.literals.readInt16"
+
+literalsReadInt32 :: Core.Name
+literalsReadInt32 = Core.Name "hydra.lib.literals.readInt32"
+
+literalsReadInt64 :: Core.Name
+literalsReadInt64 = Core.Name "hydra.lib.literals.readInt64"
+
+literalsReadInt8 :: Core.Name
+literalsReadInt8 = Core.Name "hydra.lib.literals.readInt8"
+
+literalsReadString :: Core.Name
+literalsReadString = Core.Name "hydra.lib.literals.readString"
+
+literalsReadUint16 :: Core.Name
+literalsReadUint16 = Core.Name "hydra.lib.literals.readUint16"
+
+literalsReadUint32 :: Core.Name
+literalsReadUint32 = Core.Name "hydra.lib.literals.readUint32"
+
+literalsReadUint64 :: Core.Name
+literalsReadUint64 = Core.Name "hydra.lib.literals.readUint64"
+
+literalsReadUint8 :: Core.Name
+literalsReadUint8 = Core.Name "hydra.lib.literals.readUint8"
+
+literalsShowBigfloat :: Core.Name
+literalsShowBigfloat = Core.Name "hydra.lib.literals.showBigfloat"
+
+literalsShowBigint :: Core.Name
+literalsShowBigint = Core.Name "hydra.lib.literals.showBigint"
+
+literalsShowBoolean :: Core.Name
+literalsShowBoolean = Core.Name "hydra.lib.literals.showBoolean"
+
+literalsShowFloat32 :: Core.Name
+literalsShowFloat32 = Core.Name "hydra.lib.literals.showFloat32"
+
+literalsShowFloat64 :: Core.Name
+literalsShowFloat64 = Core.Name "hydra.lib.literals.showFloat64"
+
+literalsShowInt16 :: Core.Name
+literalsShowInt16 = Core.Name "hydra.lib.literals.showInt16"
+
+literalsShowInt32 :: Core.Name
+literalsShowInt32 = Core.Name "hydra.lib.literals.showInt32"
+
+literalsShowInt64 :: Core.Name
+literalsShowInt64 = Core.Name "hydra.lib.literals.showInt64"
+
+literalsShowInt8 :: Core.Name
+literalsShowInt8 = Core.Name "hydra.lib.literals.showInt8"
+
+literalsShowString :: Core.Name
+literalsShowString = Core.Name "hydra.lib.literals.showString"
+
+literalsShowUint16 :: Core.Name
+literalsShowUint16 = Core.Name "hydra.lib.literals.showUint16"
+
+literalsShowUint32 :: Core.Name
+literalsShowUint32 = Core.Name "hydra.lib.literals.showUint32"
+
+literalsShowUint64 :: Core.Name
+literalsShowUint64 = Core.Name "hydra.lib.literals.showUint64"
+
+literalsShowUint8 :: Core.Name
+literalsShowUint8 = Core.Name "hydra.lib.literals.showUint8"
+
+literalsStringToBinary :: Core.Name
+literalsStringToBinary = Core.Name "hydra.lib.literals.stringToBinary"
+
+literalsUint16ToBigint :: Core.Name
+literalsUint16ToBigint = Core.Name "hydra.lib.literals.uint16ToBigint"
+
+literalsUint32ToBigint :: Core.Name
+literalsUint32ToBigint = Core.Name "hydra.lib.literals.uint32ToBigint"
+
+literalsUint64ToBigint :: Core.Name
+literalsUint64ToBigint = Core.Name "hydra.lib.literals.uint64ToBigint"
+
+literalsUint8ToBigint :: Core.Name
+literalsUint8ToBigint = Core.Name "hydra.lib.literals.uint8ToBigint"
+
+logic :: Module.Namespace
+logic = Module.Namespace "hydra.lib.logic"
+
+logicAnd :: Core.Name
+logicAnd = Core.Name "hydra.lib.logic.and"
+
+logicIfElse :: Core.Name
+logicIfElse = Core.Name "hydra.lib.logic.ifElse"
+
+logicNot :: Core.Name
+logicNot = Core.Name "hydra.lib.logic.not"
+
+logicOr :: Core.Name
+logicOr = Core.Name "hydra.lib.logic.or"
+
+maps :: Module.Namespace
+maps = Module.Namespace "hydra.lib.maps"
+
+mapsAlter :: Core.Name
+mapsAlter = Core.Name "hydra.lib.maps.alter"
+
+mapsBimap :: Core.Name
+mapsBimap = Core.Name "hydra.lib.maps.bimap"
+
+mapsDelete :: Core.Name
+mapsDelete = Core.Name "hydra.lib.maps.delete"
+
+mapsElems :: Core.Name
+mapsElems = Core.Name "hydra.lib.maps.elems"
+
+mapsEmpty :: Core.Name
+mapsEmpty = Core.Name "hydra.lib.maps.empty"
+
+mapsFilter :: Core.Name
+mapsFilter = Core.Name "hydra.lib.maps.filter"
+
+mapsFilterWithKey :: Core.Name
+mapsFilterWithKey = Core.Name "hydra.lib.maps.filterWithKey"
+
+mapsFindWithDefault :: Core.Name
+mapsFindWithDefault = Core.Name "hydra.lib.maps.findWithDefault"
+
+mapsFromList :: Core.Name
+mapsFromList = Core.Name "hydra.lib.maps.fromList"
+
+mapsInsert :: Core.Name
+mapsInsert = Core.Name "hydra.lib.maps.insert"
+
+mapsKeys :: Core.Name
+mapsKeys = Core.Name "hydra.lib.maps.keys"
+
+mapsLookup :: Core.Name
+mapsLookup = Core.Name "hydra.lib.maps.lookup"
+
+mapsMap :: Core.Name
+mapsMap = Core.Name "hydra.lib.maps.map"
+
+mapsMapKeys :: Core.Name
+mapsMapKeys = Core.Name "hydra.lib.maps.mapKeys"
+
+mapsMember :: Core.Name
+mapsMember = Core.Name "hydra.lib.maps.member"
+
+mapsNull :: Core.Name
+mapsNull = Core.Name "hydra.lib.maps.null"
+
+mapsSingleton :: Core.Name
+mapsSingleton = Core.Name "hydra.lib.maps.singleton"
+
+mapsSize :: Core.Name
+mapsSize = Core.Name "hydra.lib.maps.size"
+
+mapsToList :: Core.Name
+mapsToList = Core.Name "hydra.lib.maps.toList"
+
+mapsUnion :: Core.Name
+mapsUnion = Core.Name "hydra.lib.maps.union"
+
+math :: Module.Namespace
+math = Module.Namespace "hydra.lib.math"
+
+mathAbs :: Core.Name
+mathAbs = Core.Name "hydra.lib.math.abs"
+
+mathAcos :: Core.Name
+mathAcos = Core.Name "hydra.lib.math.acos"
+
+mathAcosh :: Core.Name
+mathAcosh = Core.Name "hydra.lib.math.acosh"
+
+mathAdd :: Core.Name
+mathAdd = Core.Name "hydra.lib.math.add"
+
+mathAsin :: Core.Name
+mathAsin = Core.Name "hydra.lib.math.asin"
+
+mathAsinh :: Core.Name
+mathAsinh = Core.Name "hydra.lib.math.asinh"
+
+mathAtan :: Core.Name
+mathAtan = Core.Name "hydra.lib.math.atan"
+
+mathAtan2 :: Core.Name
+mathAtan2 = Core.Name "hydra.lib.math.atan2"
+
+mathAtanh :: Core.Name
+mathAtanh = Core.Name "hydra.lib.math.atanh"
+
+mathCeiling :: Core.Name
+mathCeiling = Core.Name "hydra.lib.math.ceiling"
+
+mathCos :: Core.Name
+mathCos = Core.Name "hydra.lib.math.cos"
+
+mathCosh :: Core.Name
+mathCosh = Core.Name "hydra.lib.math.cosh"
+
+mathDiv :: Core.Name
+mathDiv = Core.Name "hydra.lib.math.div"
+
+mathE :: Core.Name
+mathE = Core.Name "hydra.lib.math.e"
+
+mathEven :: Core.Name
+mathEven = Core.Name "hydra.lib.math.even"
+
+mathExp :: Core.Name
+mathExp = Core.Name "hydra.lib.math.exp"
+
+mathFloor :: Core.Name
+mathFloor = Core.Name "hydra.lib.math.floor"
+
+mathLog :: Core.Name
+mathLog = Core.Name "hydra.lib.math.log"
+
+mathLogBase :: Core.Name
+mathLogBase = Core.Name "hydra.lib.math.logBase"
+
+mathMax :: Core.Name
+mathMax = Core.Name "hydra.lib.math.max"
+
+mathMin :: Core.Name
+mathMin = Core.Name "hydra.lib.math.min"
+
+mathMod :: Core.Name
+mathMod = Core.Name "hydra.lib.math.mod"
+
+mathMul :: Core.Name
+mathMul = Core.Name "hydra.lib.math.mul"
+
+mathNegate :: Core.Name
+mathNegate = Core.Name "hydra.lib.math.negate"
+
+mathOdd :: Core.Name
+mathOdd = Core.Name "hydra.lib.math.odd"
+
+mathPi :: Core.Name
+mathPi = Core.Name "hydra.lib.math.pi"
+
+mathPow :: Core.Name
+mathPow = Core.Name "hydra.lib.math.pow"
+
+mathPred :: Core.Name
+mathPred = Core.Name "hydra.lib.math.pred"
+
+mathRange :: Core.Name
+mathRange = Core.Name "hydra.lib.math.range"
+
+mathRem :: Core.Name
+mathRem = Core.Name "hydra.lib.math.rem"
+
+mathRound :: Core.Name
+mathRound = Core.Name "hydra.lib.math.round"
+
+mathRoundBigfloat :: Core.Name
+mathRoundBigfloat = Core.Name "hydra.lib.math.roundBigfloat"
+
+mathRoundFloat32 :: Core.Name
+mathRoundFloat32 = Core.Name "hydra.lib.math.roundFloat32"
+
+mathRoundFloat64 :: Core.Name
+mathRoundFloat64 = Core.Name "hydra.lib.math.roundFloat64"
+
+mathSignum :: Core.Name
+mathSignum = Core.Name "hydra.lib.math.signum"
+
+mathSin :: Core.Name
+mathSin = Core.Name "hydra.lib.math.sin"
+
+mathSinh :: Core.Name
+mathSinh = Core.Name "hydra.lib.math.sinh"
+
+mathSqrt :: Core.Name
+mathSqrt = Core.Name "hydra.lib.math.sqrt"
+
+mathSub :: Core.Name
+mathSub = Core.Name "hydra.lib.math.sub"
+
+mathSucc :: Core.Name
+mathSucc = Core.Name "hydra.lib.math.succ"
+
+mathTan :: Core.Name
+mathTan = Core.Name "hydra.lib.math.tan"
+
+mathTanh :: Core.Name
+mathTanh = Core.Name "hydra.lib.math.tanh"
+
+mathTruncate :: Core.Name
+mathTruncate = Core.Name "hydra.lib.math.truncate"
+
+maybes :: Module.Namespace
+maybes = Module.Namespace "hydra.lib.maybes"
+
+maybesApply :: Core.Name
+maybesApply = Core.Name "hydra.lib.maybes.apply"
+
+maybesBind :: Core.Name
+maybesBind = Core.Name "hydra.lib.maybes.bind"
+
+maybesCases :: Core.Name
+maybesCases = Core.Name "hydra.lib.maybes.cases"
+
+maybesCat :: Core.Name
+maybesCat = Core.Name "hydra.lib.maybes.cat"
+
+maybesCompose :: Core.Name
+maybesCompose = Core.Name "hydra.lib.maybes.compose"
+
+maybesFromJust :: Core.Name
+maybesFromJust = Core.Name "hydra.lib.maybes.fromJust"
+
+maybesFromMaybe :: Core.Name
+maybesFromMaybe = Core.Name "hydra.lib.maybes.fromMaybe"
+
+maybesIsJust :: Core.Name
+maybesIsJust = Core.Name "hydra.lib.maybes.isJust"
+
+maybesIsNothing :: Core.Name
+maybesIsNothing = Core.Name "hydra.lib.maybes.isNothing"
+
+maybesMap :: Core.Name
+maybesMap = Core.Name "hydra.lib.maybes.map"
+
+maybesMapMaybe :: Core.Name
+maybesMapMaybe = Core.Name "hydra.lib.maybes.mapMaybe"
+
+maybesMaybe :: Core.Name
+maybesMaybe = Core.Name "hydra.lib.maybes.maybe"
+
+maybesPure :: Core.Name
+maybesPure = Core.Name "hydra.lib.maybes.pure"
+
+maybesToList :: Core.Name
+maybesToList = Core.Name "hydra.lib.maybes.toList"
+
+pairs :: Module.Namespace
+pairs = Module.Namespace "hydra.lib.pairs"
+
+pairsBimap :: Core.Name
+pairsBimap = Core.Name "hydra.lib.pairs.bimap"
+
+pairsFirst :: Core.Name
+pairsFirst = Core.Name "hydra.lib.pairs.first"
+
+pairsSecond :: Core.Name
+pairsSecond = Core.Name "hydra.lib.pairs.second"
+
+regex :: Module.Namespace
+regex = Module.Namespace "hydra.lib.regex"
+
+regexFind :: Core.Name
+regexFind = Core.Name "hydra.lib.regex.find"
+
+regexFindAll :: Core.Name
+regexFindAll = Core.Name "hydra.lib.regex.findAll"
+
+regexMatches :: Core.Name
+regexMatches = Core.Name "hydra.lib.regex.matches"
+
+regexReplace :: Core.Name
+regexReplace = Core.Name "hydra.lib.regex.replace"
+
+regexReplaceAll :: Core.Name
+regexReplaceAll = Core.Name "hydra.lib.regex.replaceAll"
+
+regexSplit :: Core.Name
+regexSplit = Core.Name "hydra.lib.regex.split"
+
+sets :: Module.Namespace
+sets = Module.Namespace "hydra.lib.sets"
+
+setsDelete :: Core.Name
+setsDelete = Core.Name "hydra.lib.sets.delete"
+
+setsDifference :: Core.Name
+setsDifference = Core.Name "hydra.lib.sets.difference"
+
+setsEmpty :: Core.Name
+setsEmpty = Core.Name "hydra.lib.sets.empty"
+
+setsFromList :: Core.Name
+setsFromList = Core.Name "hydra.lib.sets.fromList"
+
+setsInsert :: Core.Name
+setsInsert = Core.Name "hydra.lib.sets.insert"
+
+setsIntersection :: Core.Name
+setsIntersection = Core.Name "hydra.lib.sets.intersection"
+
+setsMap :: Core.Name
+setsMap = Core.Name "hydra.lib.sets.map"
+
+setsMember :: Core.Name
+setsMember = Core.Name "hydra.lib.sets.member"
+
+setsNull :: Core.Name
+setsNull = Core.Name "hydra.lib.sets.null"
+
+setsSingleton :: Core.Name
+setsSingleton = Core.Name "hydra.lib.sets.singleton"
+
+setsSize :: Core.Name
+setsSize = Core.Name "hydra.lib.sets.size"
+
+setsToList :: Core.Name
+setsToList = Core.Name "hydra.lib.sets.toList"
+
+setsUnion :: Core.Name
+setsUnion = Core.Name "hydra.lib.sets.union"
+
+setsUnions :: Core.Name
+setsUnions = Core.Name "hydra.lib.sets.unions"
+
+strings :: Module.Namespace
+strings = Module.Namespace "hydra.lib.strings"
+
+stringsCat :: Core.Name
+stringsCat = Core.Name "hydra.lib.strings.cat"
+
+stringsCat2 :: Core.Name
+stringsCat2 = Core.Name "hydra.lib.strings.cat2"
+
+stringsCharAt :: Core.Name
+stringsCharAt = Core.Name "hydra.lib.strings.charAt"
+
+stringsFromList :: Core.Name
+stringsFromList = Core.Name "hydra.lib.strings.fromList"
+
+stringsIntercalate :: Core.Name
+stringsIntercalate = Core.Name "hydra.lib.strings.intercalate"
+
+stringsLength :: Core.Name
+stringsLength = Core.Name "hydra.lib.strings.length"
+
+stringsLines :: Core.Name
+stringsLines = Core.Name "hydra.lib.strings.lines"
+
+stringsNull :: Core.Name
+stringsNull = Core.Name "hydra.lib.strings.null"
+
+stringsSplitOn :: Core.Name
+stringsSplitOn = Core.Name "hydra.lib.strings.splitOn"
+
+stringsToList :: Core.Name
+stringsToList = Core.Name "hydra.lib.strings.toList"
+
+stringsToLower :: Core.Name
+stringsToLower = Core.Name "hydra.lib.strings.toLower"
+
+stringsToUpper :: Core.Name
+stringsToUpper = Core.Name "hydra.lib.strings.toUpper"
+
+stringsUnlines :: Core.Name
+stringsUnlines = Core.Name "hydra.lib.strings.unlines"
+
+typeclass :: Module.Namespace
+typeclass = Module.Namespace "hydra.typeclass"
+
+typeclassEq :: Core.Name
+typeclassEq = Core.Name "hydra.typeclass.Eq"
+
+typeclassOrd :: Core.Name
+typeclassOrd = Core.Name "hydra.typeclass.Ord"
diff --git a/src/gen-main/haskell/Hydra/Literals.hs b/src/gen-main/haskell/Hydra/Literals.hs
--- a/src/gen-main/haskell/Hydra/Literals.hs
+++ b/src/gen-main/haskell/Hydra/Literals.hs
@@ -14,41 +14,45 @@
 import qualified Data.Set as S
 
 -- | Convert a bigfloat to a floating-point value of a given type (note: lossy)
-bigfloatToFloatValue :: (Core.FloatType -> Double -> Core.FloatValue)
-bigfloatToFloatValue ft bf = ((\x -> case x of
-  Core.FloatTypeBigfloat -> (Core.FloatValueBigfloat bf)
-  Core.FloatTypeFloat32 -> (Core.FloatValueFloat32 (Literals.bigfloatToFloat32 bf))
-  Core.FloatTypeFloat64 -> (Core.FloatValueFloat64 (Literals.bigfloatToFloat64 bf))) ft)
+bigfloatToFloatValue :: Core.FloatType -> Double -> Core.FloatValue
+bigfloatToFloatValue ft bf =
+    case ft of
+      Core.FloatTypeBigfloat -> Core.FloatValueBigfloat bf
+      Core.FloatTypeFloat32 -> Core.FloatValueFloat32 (Literals.bigfloatToFloat32 bf)
+      Core.FloatTypeFloat64 -> Core.FloatValueFloat64 (Literals.bigfloatToFloat64 bf)
 
 -- | Convert a bigint to an integer value of a given type (note: lossy)
-bigintToIntegerValue :: (Core.IntegerType -> Integer -> Core.IntegerValue)
-bigintToIntegerValue it bi = ((\x -> case x of
-  Core.IntegerTypeBigint -> (Core.IntegerValueBigint bi)
-  Core.IntegerTypeInt8 -> (Core.IntegerValueInt8 (Literals.bigintToInt8 bi))
-  Core.IntegerTypeInt16 -> (Core.IntegerValueInt16 (Literals.bigintToInt16 bi))
-  Core.IntegerTypeInt32 -> (Core.IntegerValueInt32 (Literals.bigintToInt32 bi))
-  Core.IntegerTypeInt64 -> (Core.IntegerValueInt64 (Literals.bigintToInt64 bi))
-  Core.IntegerTypeUint8 -> (Core.IntegerValueUint8 (Literals.bigintToUint8 bi))
-  Core.IntegerTypeUint16 -> (Core.IntegerValueUint16 (Literals.bigintToUint16 bi))
-  Core.IntegerTypeUint32 -> (Core.IntegerValueUint32 (Literals.bigintToUint32 bi))
-  Core.IntegerTypeUint64 -> (Core.IntegerValueUint64 (Literals.bigintToUint64 bi))) it)
+bigintToIntegerValue :: Core.IntegerType -> Integer -> Core.IntegerValue
+bigintToIntegerValue it bi =
+    case it of
+      Core.IntegerTypeBigint -> Core.IntegerValueBigint bi
+      Core.IntegerTypeInt8 -> Core.IntegerValueInt8 (Literals.bigintToInt8 bi)
+      Core.IntegerTypeInt16 -> Core.IntegerValueInt16 (Literals.bigintToInt16 bi)
+      Core.IntegerTypeInt32 -> Core.IntegerValueInt32 (Literals.bigintToInt32 bi)
+      Core.IntegerTypeInt64 -> Core.IntegerValueInt64 (Literals.bigintToInt64 bi)
+      Core.IntegerTypeUint8 -> Core.IntegerValueUint8 (Literals.bigintToUint8 bi)
+      Core.IntegerTypeUint16 -> Core.IntegerValueUint16 (Literals.bigintToUint16 bi)
+      Core.IntegerTypeUint32 -> Core.IntegerValueUint32 (Literals.bigintToUint32 bi)
+      Core.IntegerTypeUint64 -> Core.IntegerValueUint64 (Literals.bigintToUint64 bi)
 
 -- | Convert a floating-point value of any precision to a bigfloat
-floatValueToBigfloat :: (Core.FloatValue -> Double)
-floatValueToBigfloat x = case x of
-  Core.FloatValueBigfloat v1 -> v1
-  Core.FloatValueFloat32 v1 -> (Literals.float32ToBigfloat v1)
-  Core.FloatValueFloat64 v1 -> (Literals.float64ToBigfloat v1)
+floatValueToBigfloat :: Core.FloatValue -> Double
+floatValueToBigfloat x =
+    case x of
+      Core.FloatValueBigfloat v0 -> v0
+      Core.FloatValueFloat32 v0 -> Literals.float32ToBigfloat v0
+      Core.FloatValueFloat64 v0 -> Literals.float64ToBigfloat v0
 
 -- | Convert an integer value of any precision to a bigint
-integerValueToBigint :: (Core.IntegerValue -> Integer)
-integerValueToBigint x = case x of
-  Core.IntegerValueBigint v1 -> v1
-  Core.IntegerValueInt8 v1 -> (Literals.int8ToBigint v1)
-  Core.IntegerValueInt16 v1 -> (Literals.int16ToBigint v1)
-  Core.IntegerValueInt32 v1 -> (Literals.int32ToBigint v1)
-  Core.IntegerValueInt64 v1 -> (Literals.int64ToBigint v1)
-  Core.IntegerValueUint8 v1 -> (Literals.uint8ToBigint v1)
-  Core.IntegerValueUint16 v1 -> (Literals.uint16ToBigint v1)
-  Core.IntegerValueUint32 v1 -> (Literals.uint32ToBigint v1)
-  Core.IntegerValueUint64 v1 -> (Literals.uint64ToBigint v1)
+integerValueToBigint :: Core.IntegerValue -> Integer
+integerValueToBigint x =
+    case x of
+      Core.IntegerValueBigint v0 -> v0
+      Core.IntegerValueInt8 v0 -> Literals.int8ToBigint v0
+      Core.IntegerValueInt16 v0 -> Literals.int16ToBigint v0
+      Core.IntegerValueInt32 v0 -> Literals.int32ToBigint v0
+      Core.IntegerValueInt64 v0 -> Literals.int64ToBigint v0
+      Core.IntegerValueUint8 v0 -> Literals.uint8ToBigint v0
+      Core.IntegerValueUint16 v0 -> Literals.uint16ToBigint v0
+      Core.IntegerValueUint32 v0 -> Literals.uint32ToBigint v0
+      Core.IntegerValueUint64 v0 -> Literals.uint64ToBigint v0
diff --git a/src/gen-main/haskell/Hydra/Module.hs b/src/gen-main/haskell/Hydra/Module.hs
--- a/src/gen-main/haskell/Hydra/Module.hs
+++ b/src/gen-main/haskell/Hydra/Module.hs
@@ -14,29 +14,29 @@
 import qualified Data.Set as S
 
 -- | A definition, which may be either a term or type definition
-data Definition = 
+data Definition =
   -- | A term definition
   DefinitionTerm TermDefinition |
   -- | A type definition
   DefinitionType TypeDefinition
   deriving (Eq, Ord, Read, Show)
 
-_Definition = (Core.Name "hydra.module.Definition")
+_Definition = Core.Name "hydra.module.Definition"
 
-_Definition_term = (Core.Name "term")
+_Definition_term = Core.Name "term"
 
-_Definition_type = (Core.Name "type")
+_Definition_type = Core.Name "type"
 
 -- | A file extension (without the dot), e.g. "json" or "py"
-newtype FileExtension = 
+newtype FileExtension =
   FileExtension {
     unFileExtension :: String}
   deriving (Eq, Ord, Read, Show)
 
-_FileExtension = (Core.Name "hydra.module.FileExtension")
+_FileExtension = Core.Name "hydra.module.FileExtension"
 
 -- | A library of primitive functions
-data Library = 
+data Library =
   Library {
     -- | A common prefix for all primitive function names in the library
     libraryNamespace :: Namespace,
@@ -45,21 +45,21 @@
     -- | The primitives defined in this library
     libraryPrimitives :: [Graph.Primitive]}
 
-_Library = (Core.Name "hydra.module.Library")
+_Library = Core.Name "hydra.module.Library"
 
-_Library_namespace = (Core.Name "namespace")
+_Library_namespace = Core.Name "namespace"
 
-_Library_prefix = (Core.Name "prefix")
+_Library_prefix = Core.Name "prefix"
 
-_Library_primitives = (Core.Name "primitives")
+_Library_primitives = Core.Name "primitives"
 
 -- | A logical collection of elements in the same namespace, having dependencies on zero or more other modules
-data Module = 
+data Module =
   Module {
     -- | A common prefix for all element names in the module
     moduleNamespace :: Namespace,
-    -- | The elements defined in this module
-    moduleElements :: [Core.Binding],
+    -- | The definitions in this module
+    moduleDefinitions :: [Definition],
     -- | Any modules which the term expressions of this module directly depend upon
     moduleTermDependencies :: [Namespace],
     -- | Any modules which the type expressions of this module directly depend upon
@@ -68,28 +68,28 @@
     moduleDescription :: (Maybe String)}
   deriving (Eq, Ord, Read, Show)
 
-_Module = (Core.Name "hydra.module.Module")
+_Module = Core.Name "hydra.module.Module"
 
-_Module_namespace = (Core.Name "namespace")
+_Module_namespace = Core.Name "namespace"
 
-_Module_elements = (Core.Name "elements")
+_Module_definitions = Core.Name "definitions"
 
-_Module_termDependencies = (Core.Name "termDependencies")
+_Module_termDependencies = Core.Name "termDependencies"
 
-_Module_typeDependencies = (Core.Name "typeDependencies")
+_Module_typeDependencies = Core.Name "typeDependencies"
 
-_Module_description = (Core.Name "description")
+_Module_description = Core.Name "description"
 
 -- | A prefix for element names
-newtype Namespace = 
+newtype Namespace =
   Namespace {
     unNamespace :: String}
   deriving (Eq, Ord, Read, Show)
 
-_Namespace = (Core.Name "hydra.module.Namespace")
+_Namespace = Core.Name "hydra.module.Namespace"
 
 -- | A mapping from namespaces to values of type n, with a focus on one namespace
-data Namespaces n = 
+data Namespaces n =
   Namespaces {
     -- | The namespace in focus, together with its associated value
     namespacesFocus :: (Namespace, n),
@@ -97,14 +97,14 @@
     namespacesMapping :: (M.Map Namespace n)}
   deriving (Eq, Ord, Read, Show)
 
-_Namespaces = (Core.Name "hydra.module.Namespaces")
+_Namespaces = Core.Name "hydra.module.Namespaces"
 
-_Namespaces_focus = (Core.Name "focus")
+_Namespaces_focus = Core.Name "focus"
 
-_Namespaces_mapping = (Core.Name "mapping")
+_Namespaces_mapping = Core.Name "mapping"
 
 -- | A qualified name consisting of an optional namespace together with a mandatory local name
-data QualifiedName = 
+data QualifiedName =
   QualifiedName {
     -- | The optional namespace
     qualifiedNameNamespace :: (Maybe Namespace),
@@ -112,33 +112,33 @@
     qualifiedNameLocal :: String}
   deriving (Eq, Ord, Read, Show)
 
-_QualifiedName = (Core.Name "hydra.module.QualifiedName")
+_QualifiedName = Core.Name "hydra.module.QualifiedName"
 
-_QualifiedName_namespace = (Core.Name "namespace")
+_QualifiedName_namespace = Core.Name "namespace"
 
-_QualifiedName_local = (Core.Name "local")
+_QualifiedName_local = Core.Name "local"
 
 -- | A term-level definition, including a name, a term, and the type scheme of the term
-data TermDefinition = 
+data TermDefinition =
   TermDefinition {
     -- | The name of the term
     termDefinitionName :: Core.Name,
     -- | The term being defined
     termDefinitionTerm :: Core.Term,
     -- | The type scheme of the term, including any class constraints
-    termDefinitionType :: Core.TypeScheme}
+    termDefinitionType :: (Maybe Core.TypeScheme)}
   deriving (Eq, Ord, Read, Show)
 
-_TermDefinition = (Core.Name "hydra.module.TermDefinition")
+_TermDefinition = Core.Name "hydra.module.TermDefinition"
 
-_TermDefinition_name = (Core.Name "name")
+_TermDefinition_name = Core.Name "name"
 
-_TermDefinition_term = (Core.Name "term")
+_TermDefinition_term = Core.Name "term"
 
-_TermDefinition_type = (Core.Name "type")
+_TermDefinition_type = Core.Name "type"
 
 -- | A type-level definition, including a name and the type
-data TypeDefinition = 
+data TypeDefinition =
   TypeDefinition {
     -- | The name of the type
     typeDefinitionName :: Core.Name,
@@ -146,8 +146,8 @@
     typeDefinitionType :: Core.Type}
   deriving (Eq, Ord, Read, Show)
 
-_TypeDefinition = (Core.Name "hydra.module.TypeDefinition")
+_TypeDefinition = Core.Name "hydra.module.TypeDefinition"
 
-_TypeDefinition_name = (Core.Name "name")
+_TypeDefinition_name = Core.Name "name"
 
-_TypeDefinition_type = (Core.Name "type")
+_TypeDefinition_type = Core.Name "type"
diff --git a/src/gen-main/haskell/Hydra/Monads.hs b/src/gen-main/haskell/Hydra/Monads.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Monads.hs
+++ /dev/null
@@ -1,228 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Functions for working with Hydra's 'flow' and other monads.
-
-module Hydra.Monads where
-
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Constants as Constants
-import qualified Hydra.Core as Core
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Show.Core as Core_
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Monadic bind for flows
-bind :: (Compute.Flow t0 t1 -> (t1 -> Compute.Flow t0 t2) -> Compute.Flow t0 t2)
-bind l r =  
-  let q = (\s0 -> \t0 ->  
-          let fs1 = (Compute.unFlow l s0 t0)
-          in (Maybes.maybe (Compute.FlowState {
-            Compute.flowStateValue = Nothing,
-            Compute.flowStateState = (Compute.flowStateState fs1),
-            Compute.flowStateTrace = (Compute.flowStateTrace fs1)}) (\v -> Compute.unFlow (r v) (Compute.flowStateState fs1) (Compute.flowStateTrace fs1)) (Compute.flowStateValue fs1)))
-  in (Compute.Flow q)
-
--- | Adapt an either to a flow; a left value is mapped to a failure using the provided function
-eitherToFlow :: ((t0 -> String) -> Either t0 t1 -> Compute.Flow t2 t1)
-eitherToFlow formatError e = (Eithers.either (\l -> fail (formatError l)) (\r -> pure r) e)
-
--- | An empty trace with no stack, messages, or other attributes
-emptyTrace :: Compute.Trace
-emptyTrace = Compute.Trace {
-  Compute.traceStack = [],
-  Compute.traceMessages = [],
-  Compute.traceOther = Maps.empty}
-
--- | Execute a flow and return the final state
-exec :: (Compute.Flow t0 t1 -> t0 -> t0)
-exec f s0 = (Compute.flowStateState (Compute.unFlow f s0 emptyTrace))
-
--- | Fail a flow with an error message
-fail :: (String -> Compute.Flow t0 t1)
-fail msg = (Compute.Flow (\s -> \t -> Compute.FlowState {
-  Compute.flowStateValue = Nothing,
-  Compute.flowStateState = s,
-  Compute.flowStateTrace = (pushError msg t)}))
-
--- | Check whether a flow succeeds
-flowSucceeds :: (t0 -> Compute.Flow t0 t1 -> Bool)
-flowSucceeds s f = (Maybes.isJust (Compute.flowStateValue (Compute.unFlow f s emptyTrace)))
-
--- | Get the value of a flow, or a default value if the flow fails
-fromFlow :: (t0 -> t1 -> Compute.Flow t1 t0 -> t0)
-fromFlow def cx f = (Maybes.maybe def (\xmo -> xmo) (Compute.flowStateValue (Compute.unFlow f cx emptyTrace)))
-
--- | Get the state of the current flow
-getState :: (Compute.Flow t0 t0)
-getState = (Compute.Flow (\s0 -> \t0 ->  
-  let fs1 = (Compute.unFlow (pure ()) s0 t0)
-  in  
-    let v = (Compute.flowStateValue fs1)
-    in  
-      let s = (Compute.flowStateState fs1)
-      in  
-        let t = (Compute.flowStateTrace fs1)
-        in (Maybes.maybe (Compute.FlowState {
-          Compute.flowStateValue = Nothing,
-          Compute.flowStateState = s,
-          Compute.flowStateTrace = t}) (\_ -> Compute.FlowState {
-          Compute.flowStateValue = (Just s),
-          Compute.flowStateState = s,
-          Compute.flowStateTrace = t}) v)))
-
--- | Map a function over a flow
-map :: ((t0 -> t1) -> Compute.Flow t2 t0 -> Compute.Flow t2 t1)
-map f f1 = (Compute.Flow (\s0 -> \t0 ->  
-  let f2 = (Compute.unFlow f1 s0 t0)
-  in Compute.FlowState {
-    Compute.flowStateValue = (Maybes.map f (Compute.flowStateValue f2)),
-    Compute.flowStateState = (Compute.flowStateState f2),
-    Compute.flowStateTrace = (Compute.flowStateTrace f2)}))
-
--- | Modify the state of a flow using a given function
-modify :: ((t0 -> t0) -> Compute.Flow t0 ())
-modify f = (bind getState (\s -> putState (f s)))
-
--- | Temporarily mutate the trace for the duration of a flow
-mutateTrace :: ((Compute.Trace -> Either String Compute.Trace) -> (Compute.Trace -> Compute.Trace -> Compute.Trace) -> Compute.Flow t0 t1 -> Compute.Flow t0 t1)
-mutateTrace mutate restore f =  
-  let choose = (\forLeft -> \forRight -> \e -> Eithers.either (\l -> forLeft l) (\r -> forRight r) e)
-  in  
-    let flowFun = (\s0 -> \t0 ->  
-            let forLeft = (\msg -> Compute.FlowState {
-                    Compute.flowStateValue = Nothing,
-                    Compute.flowStateState = s0,
-                    Compute.flowStateTrace = (pushError msg t0)})
-            in  
-              let forRight = (\t1 ->  
-                      let f2 = (Compute.unFlow f s0 t1)
-                      in Compute.FlowState {
-                        Compute.flowStateValue = (Compute.flowStateValue f2),
-                        Compute.flowStateState = (Compute.flowStateState f2),
-                        Compute.flowStateTrace = (restore t0 (Compute.flowStateTrace f2))})
-              in (choose forLeft forRight (mutate t0)))
-    in (Compute.Flow flowFun)
-
--- | Converts an optional value either to an empty list (if nothing) or a singleton list (if just).
-maybeToList :: (Maybe t0 -> [t0])
-maybeToList mx = (Maybes.maybe [] Lists.pure mx)
-
--- | Lift a value into a flow
-pure :: (t0 -> Compute.Flow t1 t0)
-pure xp = (Compute.Flow (\s -> \t -> Compute.FlowState {
-  Compute.flowStateValue = (Just xp),
-  Compute.flowStateState = s,
-  Compute.flowStateTrace = t}))
-
--- | Push an error message
-pushError :: (String -> Compute.Trace -> Compute.Trace)
-pushError msg t =  
-  let condenseRepeats = (\ys ->  
-          let condenseGroup = (\xs ->  
-                  let x = (Lists.head xs)
-                  in  
-                    let n = (Lists.length xs)
-                    in (Logic.ifElse (Equality.equal n 1) x (Strings.cat [
-                      x,
-                      " (x",
-                      (Literals.showInt32 n),
-                      ")"])))
-          in (Lists.map condenseGroup (Lists.group ys)))
-  in  
-    let errorMsg = (Strings.cat [
-            "Error: ",
-            msg,
-            " (",
-            (Strings.intercalate " > " (condenseRepeats (Lists.reverse (Compute.traceStack t)))),
-            ")"])
-    in Compute.Trace {
-      Compute.traceStack = (Compute.traceStack t),
-      Compute.traceMessages = (Lists.cons errorMsg (Compute.traceMessages t)),
-      Compute.traceOther = (Compute.traceOther t)}
-
--- | Set the state of a flow
-putState :: (t0 -> Compute.Flow t0 ())
-putState cx = (Compute.Flow (\s0 -> \t0 ->  
-  let f1 = (Compute.unFlow (pure ()) s0 t0)
-  in Compute.FlowState {
-    Compute.flowStateValue = (Compute.flowStateValue f1),
-    Compute.flowStateState = cx,
-    Compute.flowStateTrace = (Compute.flowStateTrace f1)}))
-
--- | Summarize a trace as a string
-traceSummary :: (Compute.Trace -> String)
-traceSummary t =  
-  let messageLines = (Lists.nub (Compute.traceMessages t))
-  in  
-    let toLine = (\pair -> Strings.cat2 (Strings.cat2 (Strings.cat2 "\t" (Core.unName (Pairs.first pair))) ": ") (Core_.term (Pairs.second pair)))
-    in  
-      let keyvalLines = (Logic.ifElse (Maps.null (Compute.traceOther t)) [] (Lists.cons "key/value pairs: " (Lists.map toLine (Maps.toList (Compute.traceOther t)))))
-      in (Strings.intercalate "\n" (Lists.concat2 messageLines keyvalLines))
-
--- | Fail if an actual value does not match an expected value
-unexpected :: (String -> String -> Compute.Flow t0 t1)
-unexpected expected actual = (fail (Strings.cat2 (Strings.cat2 (Strings.cat2 "expected " expected) " but found ") actual))
-
--- | Continue the current flow after adding a warning message
-warn :: (String -> Compute.Flow t0 t1 -> Compute.Flow t0 t1)
-warn msg b = (Compute.Flow (\s0 -> \t0 ->  
-  let f1 = (Compute.unFlow b s0 t0)
-  in  
-    let addMessage = (\t -> Compute.Trace {
-            Compute.traceStack = (Compute.traceStack t),
-            Compute.traceMessages = (Lists.cons (Strings.cat2 "Warning: " msg) (Compute.traceMessages t)),
-            Compute.traceOther = (Compute.traceOther t)})
-    in Compute.FlowState {
-      Compute.flowStateValue = (Compute.flowStateValue f1),
-      Compute.flowStateState = (Compute.flowStateState f1),
-      Compute.flowStateTrace = (addMessage (Compute.flowStateTrace f1))}))
-
--- | Continue the current flow after setting a flag
-withFlag :: (Core.Name -> Compute.Flow t0 t1 -> Compute.Flow t0 t1)
-withFlag flag f =  
-  let mutate = (\t -> Logic.ifElse False (Left "never happens") (Right (Compute.Trace {
-          Compute.traceStack = (Compute.traceStack t),
-          Compute.traceMessages = (Compute.traceMessages t),
-          Compute.traceOther = (Maps.insert flag (Core.TermLiteral (Core.LiteralBoolean True)) (Compute.traceOther t))})))
-  in  
-    let restore = (\ignored -> \t1 -> Compute.Trace {
-            Compute.traceStack = (Compute.traceStack t1),
-            Compute.traceMessages = (Compute.traceMessages t1),
-            Compute.traceOther = (Maps.delete flag (Compute.traceOther t1))})
-    in (mutateTrace mutate restore f)
-
--- | Continue a flow using a given state
-withState :: (t0 -> Compute.Flow t0 t1 -> Compute.Flow t2 t1)
-withState cx0 f = (Compute.Flow (\cx1 -> \t1 ->  
-  let f1 = (Compute.unFlow f cx0 t1)
-  in Compute.FlowState {
-    Compute.flowStateValue = (Compute.flowStateValue f1),
-    Compute.flowStateState = cx1,
-    Compute.flowStateTrace = (Compute.flowStateTrace f1)}))
-
--- | Continue the current flow after augmenting the trace
-withTrace :: (String -> Compute.Flow t0 t1 -> Compute.Flow t0 t1)
-withTrace msg f =  
-  let mutate = (\t -> Logic.ifElse (Equality.gte (Lists.length (Compute.traceStack t)) Constants.maxTraceDepth) (Left "maximum trace depth exceeded. This may indicate an infinite loop") (Right (Compute.Trace {
-          Compute.traceStack = (Lists.cons msg (Compute.traceStack t)),
-          Compute.traceMessages = (Compute.traceMessages t),
-          Compute.traceOther = (Compute.traceOther t)})))
-  in  
-    let restore = (\t0 -> \t1 -> Compute.Trace {
-            Compute.traceStack = (Compute.traceStack t0),
-            Compute.traceMessages = (Compute.traceMessages t1),
-            Compute.traceOther = (Compute.traceOther t1)})
-    in (mutateTrace mutate restore f)
diff --git a/src/gen-main/haskell/Hydra/Names.hs b/src/gen-main/haskell/Hydra/Names.hs
--- a/src/gen-main/haskell/Hydra/Names.hs
+++ b/src/gen-main/haskell/Hydra/Names.hs
@@ -23,53 +23,58 @@
 import qualified Data.Set as S
 
 -- | Given a mapping of namespaces to prefixes, convert a name to a compact string representation
-compactName :: (M.Map Module.Namespace String -> Core.Name -> String)
-compactName namespaces name =  
-  let qualName = (qualifyName name) 
-      mns = (Module.qualifiedNameNamespace qualName)
-      local = (Module.qualifiedNameLocal qualName)
-  in (Maybes.maybe (Core.unName name) (\ns -> Maybes.maybe local (\pre -> Strings.cat [
-    pre,
-    ":",
-    local]) (Maps.lookup ns namespaces)) mns)
+compactName :: M.Map Module.Namespace String -> Core.Name -> String
+compactName namespaces name =
 
+      let qualName = qualifyName name
+          mns = Module.qualifiedNameNamespace qualName
+          local = Module.qualifiedNameLocal qualName
+      in (Maybes.maybe (Core.unName name) (\ns -> Maybes.maybe local (\pre -> Strings.cat [
+        pre,
+        ":",
+        local]) (Maps.lookup ns namespaces)) mns)
+
 -- | Extract the local part of a name
-localNameOf :: (Core.Name -> String)
-localNameOf arg_ = (Module.qualifiedNameLocal (qualifyName arg_))
+localNameOf :: Core.Name -> String
+localNameOf arg_ = Module.qualifiedNameLocal (qualifyName arg_)
 
 -- | Extract the namespace of a name, if any
-namespaceOf :: (Core.Name -> Maybe Module.Namespace)
-namespaceOf arg_ = (Module.qualifiedNameNamespace (qualifyName arg_))
+namespaceOf :: Core.Name -> Maybe Module.Namespace
+namespaceOf arg_ = Module.qualifiedNameNamespace (qualifyName arg_)
 
 -- | Convert a namespace to a file path with the given case convention and file extension
-namespaceToFilePath :: (Util.CaseConvention -> Module.FileExtension -> Module.Namespace -> String)
-namespaceToFilePath caseConv ext ns =  
-  let parts = (Lists.map (Formatting.convertCase Util.CaseConventionCamel caseConv) (Strings.splitOn "." (Module.unNamespace ns)))
-  in (Strings.cat2 (Strings.cat2 (Strings.intercalate "/" parts) ".") (Module.unFileExtension ext))
+namespaceToFilePath :: Util.CaseConvention -> Module.FileExtension -> Module.Namespace -> String
+namespaceToFilePath caseConv ext ns =
 
+      let parts = Lists.map (Formatting.convertCase Util.CaseConventionCamel caseConv) (Strings.splitOn "." (Module.unNamespace ns))
+      in (Strings.cat2 (Strings.cat2 (Strings.intercalate "/" parts) ".") (Module.unFileExtension ext))
+
 -- | Construct a qualified (dot-separated) name
-qname :: (Module.Namespace -> String -> Core.Name)
-qname ns name = (Core.Name (Strings.cat [
-  Module.unNamespace ns,
-  ".",
-  name]))
+qname :: Module.Namespace -> String -> Core.Name
+qname ns name =
+    Core.Name (Strings.cat [
+      Module.unNamespace ns,
+      ".",
+      name])
 
 -- | Split a dot-separated name into a namespace and local name
-qualifyName :: (Core.Name -> Module.QualifiedName)
-qualifyName name =  
-  let parts = (Lists.reverse (Strings.splitOn "." (Core.unName name)))
-  in (Logic.ifElse (Equality.equal 1 (Lists.length parts)) (Module.QualifiedName {
-    Module.qualifiedNameNamespace = Nothing,
-    Module.qualifiedNameLocal = (Core.unName name)}) (Module.QualifiedName {
-    Module.qualifiedNameNamespace = (Just (Module.Namespace (Strings.intercalate "." (Lists.reverse (Lists.tail parts))))),
-    Module.qualifiedNameLocal = (Lists.head parts)}))
+qualifyName :: Core.Name -> Module.QualifiedName
+qualifyName name =
 
+      let parts = Lists.reverse (Strings.splitOn "." (Core.unName name))
+      in (Logic.ifElse (Equality.equal 1 (Lists.length parts)) (Module.QualifiedName {
+        Module.qualifiedNameNamespace = Nothing,
+        Module.qualifiedNameLocal = (Core.unName name)}) (Module.QualifiedName {
+        Module.qualifiedNameNamespace = (Just (Module.Namespace (Strings.intercalate "." (Lists.reverse (Lists.tail parts))))),
+        Module.qualifiedNameLocal = (Lists.head parts)}))
+
 -- | Generate a unique label by appending a suffix if the label is already in use
-uniqueLabel :: (S.Set String -> String -> String)
-uniqueLabel visited l = (Logic.ifElse (Sets.member l visited) (uniqueLabel visited (Strings.cat2 l "'")) l)
+uniqueLabel :: S.Set String -> String -> String
+uniqueLabel visited l = Logic.ifElse (Sets.member l visited) (uniqueLabel visited (Strings.cat2 l "'")) l
 
 -- | Convert a qualified name to a dot-separated name
-unqualifyName :: (Module.QualifiedName -> Core.Name)
-unqualifyName qname =  
-  let prefix = (Maybes.maybe "" (\n -> Strings.cat2 (Module.unNamespace n) ".") (Module.qualifiedNameNamespace qname))
-  in (Core.Name (Strings.cat2 prefix (Module.qualifiedNameLocal qname)))
+unqualifyName :: Module.QualifiedName -> Core.Name
+unqualifyName qname =
+
+      let prefix = Maybes.maybe "" (\n -> Strings.cat2 (Module.unNamespace n) ".") (Module.qualifiedNameNamespace qname)
+      in (Core.Name (Strings.cat2 prefix (Module.qualifiedNameLocal qname)))
diff --git a/src/gen-main/haskell/Hydra/Packaging.hs b/src/gen-main/haskell/Hydra/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Packaging.hs
@@ -0,0 +1,45 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | A model for Hydra packages
+
+module Hydra.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | A package, which is a named collection of modules with metadata and dependencies
+data Package =
+  Package {
+    -- | The name of the package
+    packageName :: PackageName,
+    -- | The modules in this package
+    packageModules :: [Module.Module],
+    -- | The packages which this package depends on
+    packageDependencies :: [PackageName],
+    -- | An optional human-readable description of the package
+    packageDescription :: (Maybe String)}
+  deriving (Eq, Ord, Read, Show)
+
+_Package = Core.Name "hydra.packaging.Package"
+
+_Package_name = Core.Name "name"
+
+_Package_modules = Core.Name "modules"
+
+_Package_dependencies = Core.Name "dependencies"
+
+_Package_description = Core.Name "description"
+
+-- | The unique name of a package, e.g. "hydra-kernel" or "hydra-python"
+newtype PackageName =
+  PackageName {
+    unPackageName :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_PackageName = Core.Name "hydra.packaging.PackageName"
diff --git a/src/gen-main/haskell/Hydra/Parsers.hs b/src/gen-main/haskell/Hydra/Parsers.hs
--- a/src/gen-main/haskell/Hydra/Parsers.hs
+++ b/src/gen-main/haskell/Hydra/Parsers.hs
@@ -18,135 +18,146 @@
 import qualified Data.Set as S
 
 -- | Try the first parser; if it fails without consuming input, try the second
-alt :: (Parsing.Parser t0 -> Parsing.Parser t0 -> Parsing.Parser t0)
-alt p1 p2 =  
-  let parse = (\input -> (\x -> case x of
-          Parsing.ParseResultSuccess v1 -> (Parsing.ParseResultSuccess v1)
-          Parsing.ParseResultFailure v1 -> (Logic.ifElse (Equality.equal (Parsing.parseErrorRemainder v1) input) (Parsing.unParser p2 input) (Parsing.ParseResultFailure v1))) (Parsing.unParser p1 input))
-  in (Parsing.Parser parse)
+alt :: Parsing.Parser t0 -> Parsing.Parser t0 -> Parsing.Parser t0
+alt p1 p2 =
 
+      let parse =
+              \input -> (\x -> case x of
+                Parsing.ParseResultSuccess v0 -> Parsing.ParseResultSuccess v0
+                Parsing.ParseResultFailure v0 -> Logic.ifElse (Equality.equal (Parsing.parseErrorRemainder v0) input) (Parsing.unParser p2 input) (Parsing.ParseResultFailure v0)) (Parsing.unParser p1 input)
+      in (Parsing.Parser parse)
+
 -- | Parse any single character (codepoint)
-anyChar :: (Parsing.Parser Int)
-anyChar = (satisfy (\_ -> True))
+anyChar :: Parsing.Parser Int
+anyChar = satisfy (\_ -> True)
 
 -- | Apply a parser containing a function to a parser containing a value
-apply :: (Parsing.Parser (t0 -> t1) -> Parsing.Parser t0 -> Parsing.Parser t1)
-apply pf pa =  
-  let parse = (\input -> (\x -> case x of
-          Parsing.ParseResultSuccess v1 -> ((\x -> case x of
-            Parsing.ParseResultSuccess v2 -> (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Parsing.parseSuccessValue v1 (Parsing.parseSuccessValue v2)),
-              Parsing.parseSuccessRemainder = (Parsing.parseSuccessRemainder v2)}))
-            Parsing.ParseResultFailure v2 -> (Parsing.ParseResultFailure v2)) (Parsing.unParser pa (Parsing.parseSuccessRemainder v1)))
-          Parsing.ParseResultFailure v1 -> (Parsing.ParseResultFailure v1)) (Parsing.unParser pf input))
-  in (Parsing.Parser parse)
+apply :: Parsing.Parser (t0 -> t1) -> Parsing.Parser t0 -> Parsing.Parser t1
+apply pf pa =
 
+      let parse =
+              \input -> (\x -> case x of
+                Parsing.ParseResultSuccess v0 -> (\x -> case x of
+                  Parsing.ParseResultSuccess v1 -> Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                    Parsing.parseSuccessValue = (Parsing.parseSuccessValue v0 (Parsing.parseSuccessValue v1)),
+                    Parsing.parseSuccessRemainder = (Parsing.parseSuccessRemainder v1)})
+                  Parsing.ParseResultFailure v1 -> Parsing.ParseResultFailure v1) (Parsing.unParser pa (Parsing.parseSuccessRemainder v0))
+                Parsing.ParseResultFailure v0 -> Parsing.ParseResultFailure v0) (Parsing.unParser pf input)
+      in (Parsing.Parser parse)
+
 -- | Parse something between an opening and closing parser
-between :: (Parsing.Parser t0 -> Parsing.Parser t1 -> Parsing.Parser t2 -> Parsing.Parser t2)
-between open close p = (bind open (\_ -> bind p (\x -> bind close (\_ -> pure x))))
+between :: Parsing.Parser t0 -> Parsing.Parser t1 -> Parsing.Parser t2 -> Parsing.Parser t2
+between open close p = bind open (\_ -> bind p (\x -> bind close (\_ -> pure x)))
 
 -- | Sequence two parsers, passing the result of the first to a function that produces the second
-bind :: (Parsing.Parser t0 -> (t0 -> Parsing.Parser t1) -> Parsing.Parser t1)
-bind pa f =  
-  let parse = (\input -> (\x -> case x of
-          Parsing.ParseResultSuccess v1 -> (Parsing.unParser (f (Parsing.parseSuccessValue v1)) (Parsing.parseSuccessRemainder v1))
-          Parsing.ParseResultFailure v1 -> (Parsing.ParseResultFailure v1)) (Parsing.unParser pa input))
-  in (Parsing.Parser parse)
+bind :: Parsing.Parser t0 -> (t0 -> Parsing.Parser t1) -> Parsing.Parser t1
+bind pa f =
 
+      let parse =
+              \input -> (\x -> case x of
+                Parsing.ParseResultSuccess v0 -> Parsing.unParser (f (Parsing.parseSuccessValue v0)) (Parsing.parseSuccessRemainder v0)
+                Parsing.ParseResultFailure v0 -> Parsing.ParseResultFailure v0) (Parsing.unParser pa input)
+      in (Parsing.Parser parse)
+
 -- | Parse a specific character (codepoint)
-char :: (Int -> Parsing.Parser Int)
-char c = (satisfy (\x -> Equality.equal x c))
+char :: Int -> Parsing.Parser Int
+char c = satisfy (\x -> Equality.equal x c)
 
 -- | Try each parser in the list until one succeeds
-choice :: ([Parsing.Parser t0] -> Parsing.Parser t0)
-choice ps = (Lists.foldl alt (fail "no choice matched") ps)
+choice :: [Parsing.Parser t0] -> Parsing.Parser t0
+choice ps = Lists.foldl alt (fail "no choice matched") ps
 
 -- | A parser that succeeds only at the end of input
-eof :: (Parsing.Parser ())
-eof = (Parsing.Parser (\input -> Logic.ifElse (Equality.equal input "") (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-  Parsing.parseSuccessValue = (),
-  Parsing.parseSuccessRemainder = ""})) (Parsing.ParseResultFailure (Parsing.ParseError {
-  Parsing.parseErrorMessage = "expected end of input",
-  Parsing.parseErrorRemainder = input}))))
+eof :: Parsing.Parser ()
+eof =
+    Parsing.Parser (\input -> Logic.ifElse (Equality.equal input "") (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+      Parsing.parseSuccessValue = (),
+      Parsing.parseSuccessRemainder = ""})) (Parsing.ParseResultFailure (Parsing.ParseError {
+      Parsing.parseErrorMessage = "expected end of input",
+      Parsing.parseErrorRemainder = input})))
 
 -- | A parser that always fails with the given error message
-fail :: (String -> Parsing.Parser t0)
-fail msg = (Parsing.Parser (\input -> Parsing.ParseResultFailure (Parsing.ParseError {
-  Parsing.parseErrorMessage = msg,
-  Parsing.parseErrorRemainder = input})))
+fail :: String -> Parsing.Parser t0
+fail msg =
+    Parsing.Parser (\input -> Parsing.ParseResultFailure (Parsing.ParseError {
+      Parsing.parseErrorMessage = msg,
+      Parsing.parseErrorRemainder = input}))
 
 -- | Create a parser that defers construction of another parser until parsing time. This is essential for breaking recursive parser definitions.
-lazy :: ((() -> Parsing.Parser t0) -> Parsing.Parser t0)
-lazy f = (Parsing.Parser (\input -> Parsing.unParser (f ()) input))
+lazy :: (() -> Parsing.Parser t0) -> Parsing.Parser t0
+lazy f = Parsing.Parser (\input -> Parsing.unParser (f ()) input)
 
 -- | Parse zero or more occurrences of the given parser
-many :: (Parsing.Parser t0 -> Parsing.Parser [t0])
-many p = (alt (some p) (pure []))
+many :: Parsing.Parser t0 -> Parsing.Parser [t0]
+many p = alt (some p) (pure [])
 
 -- | Apply a function to the result of a parser
-map :: ((t0 -> t1) -> Parsing.Parser t0 -> Parsing.Parser t1)
-map f pa =  
-  let parse = (\input -> (\x -> case x of
-          Parsing.ParseResultSuccess v1 -> (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-            Parsing.parseSuccessValue = (f (Parsing.parseSuccessValue v1)),
-            Parsing.parseSuccessRemainder = (Parsing.parseSuccessRemainder v1)}))
-          Parsing.ParseResultFailure v1 -> (Parsing.ParseResultFailure v1)) (Parsing.unParser pa input))
-  in (Parsing.Parser parse)
+map :: (t0 -> t1) -> Parsing.Parser t0 -> Parsing.Parser t1
+map f pa =
 
+      let parse =
+              \input -> (\x -> case x of
+                Parsing.ParseResultSuccess v0 -> Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (f (Parsing.parseSuccessValue v0)),
+                  Parsing.parseSuccessRemainder = (Parsing.parseSuccessRemainder v0)})
+                Parsing.ParseResultFailure v0 -> Parsing.ParseResultFailure v0) (Parsing.unParser pa input)
+      in (Parsing.Parser parse)
+
 -- | Optionally parse something, returning Nothing if it fails
-optional :: (Parsing.Parser t0 -> Parsing.Parser (Maybe t0))
-optional p = (alt (map Maybes.pure p) (pure Nothing))
+optional :: Parsing.Parser t0 -> Parsing.Parser (Maybe t0)
+optional p = alt (map Maybes.pure p) (pure Nothing)
 
 -- | A parser that always succeeds with the given value without consuming input
-pure :: (t0 -> Parsing.Parser t0)
-pure a = (Parsing.Parser (\input -> Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-  Parsing.parseSuccessValue = a,
-  Parsing.parseSuccessRemainder = input})))
+pure :: t0 -> Parsing.Parser t0
+pure a =
+    Parsing.Parser (\input -> Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+      Parsing.parseSuccessValue = a,
+      Parsing.parseSuccessRemainder = input}))
 
 -- | Run a parser on the given input string
-runParser :: (Parsing.Parser t0 -> String -> Parsing.ParseResult t0)
-runParser p input = (Parsing.unParser p input)
+runParser :: Parsing.Parser t0 -> String -> Parsing.ParseResult t0
+runParser p input = Parsing.unParser p input
 
 -- | Parse a character (codepoint) that satisfies the given predicate
-satisfy :: ((Int -> Bool) -> Parsing.Parser Int)
-satisfy pred =  
-  let parse = (\input ->  
-          let codes = (Strings.toList input)
-          in (Maybes.maybe (Parsing.ParseResultFailure (Parsing.ParseError {
-            Parsing.parseErrorMessage = "unexpected end of input",
-            Parsing.parseErrorRemainder = input})) (\c ->  
-            let rest = (Strings.fromList (Lists.drop 1 codes))
-            in (Logic.ifElse (pred c) (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = c,
-              Parsing.parseSuccessRemainder = rest})) (Parsing.ParseResultFailure (Parsing.ParseError {
-              Parsing.parseErrorMessage = "character did not satisfy predicate",
-              Parsing.parseErrorRemainder = input})))) (Lists.safeHead codes)))
-  in (Parsing.Parser parse)
+satisfy :: (Int -> Bool) -> Parsing.Parser Int
+satisfy pred =
 
+      let parse =
+              \input ->
+                let codes = Strings.toList input
+                in (Maybes.maybe (Parsing.ParseResultFailure (Parsing.ParseError {
+                  Parsing.parseErrorMessage = "unexpected end of input",
+                  Parsing.parseErrorRemainder = input})) (\c ->
+                  let rest = Strings.fromList (Lists.drop 1 codes)
+                  in (Logic.ifElse (pred c) (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                    Parsing.parseSuccessValue = c,
+                    Parsing.parseSuccessRemainder = rest})) (Parsing.ParseResultFailure (Parsing.ParseError {
+                    Parsing.parseErrorMessage = "character did not satisfy predicate",
+                    Parsing.parseErrorRemainder = input})))) (Lists.safeHead codes))
+      in (Parsing.Parser parse)
+
 -- | Parse zero or more occurrences separated by a separator
-sepBy :: (Parsing.Parser t0 -> Parsing.Parser t1 -> Parsing.Parser [t0])
-sepBy p sep = (alt (sepBy1 p sep) (pure []))
+sepBy :: Parsing.Parser t0 -> Parsing.Parser t1 -> Parsing.Parser [t0]
+sepBy p sep = alt (sepBy1 p sep) (pure [])
 
 -- | Parse one or more occurrences separated by a separator
-sepBy1 :: (Parsing.Parser t0 -> Parsing.Parser t1 -> Parsing.Parser [t0])
-sepBy1 p sep = (bind p (\x -> bind (many (bind sep (\_ -> p))) (\xs -> pure (Lists.cons x xs))))
+sepBy1 :: Parsing.Parser t0 -> Parsing.Parser t1 -> Parsing.Parser [t0]
+sepBy1 p sep = bind p (\x -> bind (many (bind sep (\_ -> p))) (\xs -> pure (Lists.cons x xs)))
 
 -- | Parse one or more occurrences of the given parser
-some :: (Parsing.Parser t0 -> Parsing.Parser [t0])
-some p = (bind p (\x -> bind (many p) (\xs -> pure (Lists.cons x xs))))
+some :: Parsing.Parser t0 -> Parsing.Parser [t0]
+some p = bind p (\x -> bind (many p) (\xs -> pure (Lists.cons x xs)))
 
 -- | Parse a specific string
-string :: (String -> Parsing.Parser String)
-string str = (Parsing.Parser (\input ->  
-  let strCodes = (Strings.toList str)
-  in  
-    let inputCodes = (Strings.toList input)
-    in  
-      let strLen = (Lists.length strCodes)
-      in  
-        let inputPrefix = (Lists.take strLen inputCodes)
-        in (Logic.ifElse (Equality.equal strCodes inputPrefix) (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-          Parsing.parseSuccessValue = str,
-          Parsing.parseSuccessRemainder = (Strings.fromList (Lists.drop strLen inputCodes))})) (Parsing.ParseResultFailure (Parsing.ParseError {
-          Parsing.parseErrorMessage = (Strings.cat2 "expected: " str),
-          Parsing.parseErrorRemainder = input})))))
+string :: String -> Parsing.Parser String
+string str =
+    Parsing.Parser (\input ->
+      let strCodes = Strings.toList str
+          inputCodes = Strings.toList input
+          strLen = Lists.length strCodes
+          inputPrefix = Lists.take strLen inputCodes
+      in (Logic.ifElse (Equality.equal strCodes inputPrefix) (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+        Parsing.parseSuccessValue = str,
+        Parsing.parseSuccessRemainder = (Strings.fromList (Lists.drop strLen inputCodes))})) (Parsing.ParseResultFailure (Parsing.ParseError {
+        Parsing.parseErrorMessage = (Strings.cat2 "expected: " str),
+        Parsing.parseErrorRemainder = input}))))
diff --git a/src/gen-main/haskell/Hydra/Parsing.hs b/src/gen-main/haskell/Hydra/Parsing.hs
--- a/src/gen-main/haskell/Hydra/Parsing.hs
+++ b/src/gen-main/haskell/Hydra/Parsing.hs
@@ -13,7 +13,7 @@
 import qualified Data.Set as S
 
 -- | An error which occurred while parsing
-data ParseError = 
+data ParseError =
   ParseError {
     -- | An error message
     parseErrorMessage :: String,
@@ -21,28 +21,28 @@
     parseErrorRemainder :: String}
   deriving (Eq, Ord, Read, Show)
 
-_ParseError = (Core.Name "hydra.parsing.ParseError")
+_ParseError = Core.Name "hydra.parsing.ParseError"
 
-_ParseError_message = (Core.Name "message")
+_ParseError_message = Core.Name "message"
 
-_ParseError_remainder = (Core.Name "remainder")
+_ParseError_remainder = Core.Name "remainder"
 
 -- | The result of a parse operation
-data ParseResult a = 
+data ParseResult a =
   -- | A successful parse, with a value and the remaining unparsed input
   ParseResultSuccess (ParseSuccess a) |
   -- | A failed parse, with an error message and the remaining input
   ParseResultFailure ParseError
   deriving (Eq, Ord, Read, Show)
 
-_ParseResult = (Core.Name "hydra.parsing.ParseResult")
+_ParseResult = Core.Name "hydra.parsing.ParseResult"
 
-_ParseResult_success = (Core.Name "success")
+_ParseResult_success = Core.Name "success"
 
-_ParseResult_failure = (Core.Name "failure")
+_ParseResult_failure = Core.Name "failure"
 
 -- | A successful parse result
-data ParseSuccess a = 
+data ParseSuccess a =
   ParseSuccess {
     -- | The parsed value
     parseSuccessValue :: a,
@@ -50,15 +50,15 @@
     parseSuccessRemainder :: String}
   deriving (Eq, Ord, Read, Show)
 
-_ParseSuccess = (Core.Name "hydra.parsing.ParseSuccess")
+_ParseSuccess = Core.Name "hydra.parsing.ParseSuccess"
 
-_ParseSuccess_value = (Core.Name "value")
+_ParseSuccess_value = Core.Name "value"
 
-_ParseSuccess_remainder = (Core.Name "remainder")
+_ParseSuccess_remainder = Core.Name "remainder"
 
 -- | A parser which consumes characters from a string and produces a value
-newtype Parser a = 
+newtype Parser a =
   Parser {
     unParser :: (String -> ParseResult a)}
 
-_Parser = (Core.Name "hydra.parsing.Parser")
+_Parser = Core.Name "hydra.parsing.Parser"
diff --git a/src/gen-main/haskell/Hydra/Paths.hs b/src/gen-main/haskell/Hydra/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Paths.hs
@@ -0,0 +1,299 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | A model for subterm and subtype access patterns
+
+module Hydra.Paths where
+
+import qualified Hydra.Core as Core
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | An edge in a subterm graph, connecting two nodes via a path
+data SubtermEdge =
+  SubtermEdge {
+    -- | The source node of the edge
+    subtermEdgeSource :: SubtermNode,
+    -- | The subterm path connecting source to target
+    subtermEdgePath :: SubtermPath,
+    -- | The target node of the edge
+    subtermEdgeTarget :: SubtermNode}
+  deriving (Eq, Ord, Read, Show)
+
+_SubtermEdge = Core.Name "hydra.paths.SubtermEdge"
+
+_SubtermEdge_source = Core.Name "source"
+
+_SubtermEdge_path = Core.Name "path"
+
+_SubtermEdge_target = Core.Name "target"
+
+-- | A graph of subterm nodes and edges, representing term access patterns
+data SubtermGraph =
+  SubtermGraph {
+    -- | All nodes in the graph
+    subtermGraphNodes :: [SubtermNode],
+    -- | All edges in the graph
+    subtermGraphEdges :: [SubtermEdge]}
+  deriving (Eq, Ord, Read, Show)
+
+_SubtermGraph = Core.Name "hydra.paths.SubtermGraph"
+
+_SubtermGraph_nodes = Core.Name "nodes"
+
+_SubtermGraph_edges = Core.Name "edges"
+
+-- | A node in a subterm graph, representing a term or subterm
+data SubtermNode =
+  SubtermNode {
+    -- | The qualified name of the term
+    subtermNodeName :: Core.Name,
+    -- | A human-readable label for the node
+    subtermNodeLabel :: String,
+    -- | A unique identifier for the node
+    subtermNodeId :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_SubtermNode = Core.Name "hydra.paths.SubtermNode"
+
+_SubtermNode_name = Core.Name "name"
+
+_SubtermNode_label = Core.Name "label"
+
+_SubtermNode_id = Core.Name "id"
+
+-- | A sequence of subterm steps forming a path through a term
+newtype SubtermPath =
+  SubtermPath {
+    unSubtermPath :: [SubtermStep]}
+  deriving (Eq, Ord, Read, Show)
+
+_SubtermPath = Core.Name "hydra.paths.SubtermPath"
+
+-- | A function which maps from a term to a particular immediate subterm
+data SubtermStep =
+  -- | Access the body of an annotated term
+  SubtermStepAnnotatedBody  |
+  -- | Access the function of an application term
+  SubtermStepApplicationFunction  |
+  -- | Access the argument of an application term
+  SubtermStepApplicationArgument  |
+  -- | Access the body of a lambda term
+  SubtermStepLambdaBody  |
+  -- | Access the default case of a union elimination
+  SubtermStepUnionCasesDefault  |
+  -- | Access a specific branch of a union elimination by field name
+  SubtermStepUnionCasesBranch Core.Name |
+  -- | Access the body of a let term
+  SubtermStepLetBody  |
+  -- | Access a specific binding in a let term by variable name
+  SubtermStepLetBinding Core.Name |
+  -- | Access an element of a list by index
+  SubtermStepListElement Int |
+  -- | Access a key in a map by index
+  SubtermStepMapKey Int |
+  -- | Access a value in a map by index
+  SubtermStepMapValue Int |
+  -- | Access the term inside a Just value
+  SubtermStepMaybeTerm  |
+  -- | Access an element of a product (tuple) by index
+  SubtermStepProductTerm Int |
+  -- | Access a field of a record by field name
+  SubtermStepRecordField Core.Name |
+  -- | Access an element of a set by index
+  SubtermStepSetElement Int |
+  -- | Access the term inside a sum variant
+  SubtermStepSumTerm  |
+  -- | Access the body of a type lambda term
+  SubtermStepTypeLambdaBody  |
+  -- | Access the term being applied to a type
+  SubtermStepTypeApplicationTerm  |
+  -- | Access the term inside a union injection
+  SubtermStepInjectionTerm  |
+  -- | Access the term inside a wrapped term
+  SubtermStepWrappedTerm
+  deriving (Eq, Ord, Read, Show)
+
+_SubtermStep = Core.Name "hydra.paths.SubtermStep"
+
+_SubtermStep_annotatedBody = Core.Name "annotatedBody"
+
+_SubtermStep_applicationFunction = Core.Name "applicationFunction"
+
+_SubtermStep_applicationArgument = Core.Name "applicationArgument"
+
+_SubtermStep_lambdaBody = Core.Name "lambdaBody"
+
+_SubtermStep_unionCasesDefault = Core.Name "unionCasesDefault"
+
+_SubtermStep_unionCasesBranch = Core.Name "unionCasesBranch"
+
+_SubtermStep_letBody = Core.Name "letBody"
+
+_SubtermStep_letBinding = Core.Name "letBinding"
+
+_SubtermStep_listElement = Core.Name "listElement"
+
+_SubtermStep_mapKey = Core.Name "mapKey"
+
+_SubtermStep_mapValue = Core.Name "mapValue"
+
+_SubtermStep_maybeTerm = Core.Name "maybeTerm"
+
+_SubtermStep_productTerm = Core.Name "productTerm"
+
+_SubtermStep_recordField = Core.Name "recordField"
+
+_SubtermStep_setElement = Core.Name "setElement"
+
+_SubtermStep_sumTerm = Core.Name "sumTerm"
+
+_SubtermStep_typeLambdaBody = Core.Name "typeLambdaBody"
+
+_SubtermStep_typeApplicationTerm = Core.Name "typeApplicationTerm"
+
+_SubtermStep_injectionTerm = Core.Name "injectionTerm"
+
+_SubtermStep_wrappedTerm = Core.Name "wrappedTerm"
+
+-- | An edge in a subtype graph, connecting two nodes via a path
+data SubtypeEdge =
+  SubtypeEdge {
+    -- | The source node of the edge
+    subtypeEdgeSource :: SubtypeNode,
+    -- | The subtype path connecting source to target
+    subtypeEdgePath :: SubtypePath,
+    -- | The target node of the edge
+    subtypeEdgeTarget :: SubtypeNode}
+  deriving (Eq, Ord, Read, Show)
+
+_SubtypeEdge = Core.Name "hydra.paths.SubtypeEdge"
+
+_SubtypeEdge_source = Core.Name "source"
+
+_SubtypeEdge_path = Core.Name "path"
+
+_SubtypeEdge_target = Core.Name "target"
+
+-- | A graph of subtype nodes and edges, representing type access patterns
+data SubtypeGraph =
+  SubtypeGraph {
+    -- | All nodes in the graph
+    subtypeGraphNodes :: [SubtypeNode],
+    -- | All edges in the graph
+    subtypeGraphEdges :: [SubtypeEdge]}
+  deriving (Eq, Ord, Read, Show)
+
+_SubtypeGraph = Core.Name "hydra.paths.SubtypeGraph"
+
+_SubtypeGraph_nodes = Core.Name "nodes"
+
+_SubtypeGraph_edges = Core.Name "edges"
+
+-- | A node in a subtype graph, representing a type or subtype
+data SubtypeNode =
+  SubtypeNode {
+    -- | The qualified name of the type
+    subtypeNodeName :: Core.Name,
+    -- | A human-readable label for the node
+    subtypeNodeLabel :: String,
+    -- | A unique identifier for the node
+    subtypeNodeId :: String}
+  deriving (Eq, Ord, Read, Show)
+
+_SubtypeNode = Core.Name "hydra.paths.SubtypeNode"
+
+_SubtypeNode_name = Core.Name "name"
+
+_SubtypeNode_label = Core.Name "label"
+
+_SubtypeNode_id = Core.Name "id"
+
+-- | A sequence of subtype steps forming a path through a type
+newtype SubtypePath =
+  SubtypePath {
+    unSubtypePath :: [SubtypeStep]}
+  deriving (Eq, Ord, Read, Show)
+
+_SubtypePath = Core.Name "hydra.paths.SubtypePath"
+
+-- | A function which maps from a type to a particular immediate subtype
+data SubtypeStep =
+  -- | Access the body of an annotated type
+  SubtypeStepAnnotatedBody  |
+  -- | Access the function of an application type
+  SubtypeStepApplicationFunction  |
+  -- | Access the argument of an application type
+  SubtypeStepApplicationArgument  |
+  -- | Access the left type of an either type
+  SubtypeStepEitherLeft  |
+  -- | Access the right type of an either type
+  SubtypeStepEitherRight  |
+  -- | Access the body of a universally quantified type
+  SubtypeStepForallBody  |
+  -- | Access the domain type of a function type
+  SubtypeStepFunctionDomain  |
+  -- | Access the codomain type of a function type
+  SubtypeStepFunctionCodomain  |
+  -- | Access the element type of a list type
+  SubtypeStepListElement  |
+  -- | Access the key type of a map type
+  SubtypeStepMapKeys  |
+  -- | Access the value type of a map type
+  SubtypeStepMapValues  |
+  -- | Access the element type of an optional type
+  SubtypeStepMaybeElement  |
+  -- | Access the first type of a pair type
+  SubtypeStepPairFirst  |
+  -- | Access the second type of a pair type
+  SubtypeStepPairSecond  |
+  -- | Access a field type of a record type by field name
+  SubtypeStepRecordField Core.Name |
+  -- | Access the element type of a set type
+  SubtypeStepSetElement  |
+  -- | Access a field type of a union type by field name
+  SubtypeStepUnionField Core.Name |
+  -- | Access the type inside a wrapped type
+  SubtypeStepWrappedType
+  deriving (Eq, Ord, Read, Show)
+
+_SubtypeStep = Core.Name "hydra.paths.SubtypeStep"
+
+_SubtypeStep_annotatedBody = Core.Name "annotatedBody"
+
+_SubtypeStep_applicationFunction = Core.Name "applicationFunction"
+
+_SubtypeStep_applicationArgument = Core.Name "applicationArgument"
+
+_SubtypeStep_eitherLeft = Core.Name "eitherLeft"
+
+_SubtypeStep_eitherRight = Core.Name "eitherRight"
+
+_SubtypeStep_forallBody = Core.Name "forallBody"
+
+_SubtypeStep_functionDomain = Core.Name "functionDomain"
+
+_SubtypeStep_functionCodomain = Core.Name "functionCodomain"
+
+_SubtypeStep_listElement = Core.Name "listElement"
+
+_SubtypeStep_mapKeys = Core.Name "mapKeys"
+
+_SubtypeStep_mapValues = Core.Name "mapValues"
+
+_SubtypeStep_maybeElement = Core.Name "maybeElement"
+
+_SubtypeStep_pairFirst = Core.Name "pairFirst"
+
+_SubtypeStep_pairSecond = Core.Name "pairSecond"
+
+_SubtypeStep_recordField = Core.Name "recordField"
+
+_SubtypeStep_setElement = Core.Name "setElement"
+
+_SubtypeStep_unionField = Core.Name "unionField"
+
+_SubtypeStep_wrappedType = Core.Name "wrappedType"
diff --git a/src/gen-main/haskell/Hydra/Phantoms.hs b/src/gen-main/haskell/Hydra/Phantoms.hs
--- a/src/gen-main/haskell/Hydra/Phantoms.hs
+++ b/src/gen-main/haskell/Hydra/Phantoms.hs
@@ -13,7 +13,7 @@
 import qualified Data.Set as S
 
 -- | An association of a named term (element) with a phantom type
-data TBinding a = 
+data TBinding a =
   TBinding {
     -- | The name of the term
     tBindingName :: Core.Name,
@@ -21,16 +21,16 @@
     tBindingTerm :: (TTerm a)}
   deriving (Eq, Ord, Read, Show)
 
-_TBinding = (Core.Name "hydra.phantoms.TBinding")
+_TBinding = Core.Name "hydra.phantoms.TBinding"
 
-_TBinding_name = (Core.Name "name")
+_TBinding_name = Core.Name "name"
 
-_TBinding_term = (Core.Name "term")
+_TBinding_term = Core.Name "term"
 
 -- | An association of a term with a phantom type
-newtype TTerm a = 
+newtype TTerm a =
   TTerm {
     unTTerm :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_TTerm = (Core.Name "hydra.phantoms.TTerm")
+_TTerm = Core.Name "hydra.phantoms.TTerm"
diff --git a/src/gen-main/haskell/Hydra/Query.hs b/src/gen-main/haskell/Hydra/Query.hs
--- a/src/gen-main/haskell/Hydra/Query.hs
+++ b/src/gen-main/haskell/Hydra/Query.hs
@@ -13,31 +13,31 @@
 import qualified Data.Set as S
 
 -- | One of several comparison operators
-data ComparisonConstraint = 
+data ComparisonConstraint =
   ComparisonConstraintEqual  |
   ComparisonConstraintNotEqual  |
   ComparisonConstraintLessThan  |
   ComparisonConstraintGreaterThan  |
   ComparisonConstraintLessThanOrEqual  |
-  ComparisonConstraintGreaterThanOrEqual 
+  ComparisonConstraintGreaterThanOrEqual
   deriving (Eq, Ord, Read, Show)
 
-_ComparisonConstraint = (Core.Name "hydra.query.ComparisonConstraint")
+_ComparisonConstraint = Core.Name "hydra.query.ComparisonConstraint"
 
-_ComparisonConstraint_equal = (Core.Name "equal")
+_ComparisonConstraint_equal = Core.Name "equal"
 
-_ComparisonConstraint_notEqual = (Core.Name "notEqual")
+_ComparisonConstraint_notEqual = Core.Name "notEqual"
 
-_ComparisonConstraint_lessThan = (Core.Name "lessThan")
+_ComparisonConstraint_lessThan = Core.Name "lessThan"
 
-_ComparisonConstraint_greaterThan = (Core.Name "greaterThan")
+_ComparisonConstraint_greaterThan = Core.Name "greaterThan"
 
-_ComparisonConstraint_lessThanOrEqual = (Core.Name "lessThanOrEqual")
+_ComparisonConstraint_lessThanOrEqual = Core.Name "lessThanOrEqual"
 
-_ComparisonConstraint_greaterThanOrEqual = (Core.Name "greaterThanOrEqual")
+_ComparisonConstraint_greaterThanOrEqual = Core.Name "greaterThanOrEqual"
 
 -- | An abstract edge based on a record type
-data Edge = 
+data Edge =
   Edge {
     -- | The name of a record type, for which the edge also specifies an out- and an in- projection
     edgeType :: Core.Name,
@@ -47,16 +47,16 @@
     edgeIn :: (Maybe Core.Name)}
   deriving (Eq, Ord, Read, Show)
 
-_Edge = (Core.Name "hydra.query.Edge")
+_Edge = Core.Name "hydra.query.Edge"
 
-_Edge_type = (Core.Name "type")
+_Edge_type = Core.Name "type"
 
-_Edge_out = (Core.Name "out")
+_Edge_out = Core.Name "out"
 
-_Edge_in = (Core.Name "in")
+_Edge_in = Core.Name "in"
 
 -- | A query pattern which matches within a designated component subgraph
-data GraphPattern = 
+data GraphPattern =
   GraphPattern {
     -- | The name of the component graph
     graphPatternGraph :: Core.Name,
@@ -64,32 +64,32 @@
     graphPatternPatterns :: [Pattern]}
   deriving (Eq, Ord, Read, Show)
 
-_GraphPattern = (Core.Name "hydra.query.GraphPattern")
+_GraphPattern = Core.Name "hydra.query.GraphPattern"
 
-_GraphPattern_graph = (Core.Name "graph")
+_GraphPattern_graph = Core.Name "graph"
 
-_GraphPattern_patterns = (Core.Name "patterns")
+_GraphPattern_patterns = Core.Name "patterns"
 
 -- | A node in a query expression; it may be a term, a variable, or a wildcard
-data Node = 
+data Node =
   -- | A graph term; an expression which is valid in the graph being matched
   NodeTerm Core.Term |
   -- | A query variable, not to be confused with a variable term
   NodeVariable Variable |
   -- | An anonymous variable which we do not care to join across patterns
-  NodeWildcard 
+  NodeWildcard
   deriving (Eq, Ord, Read, Show)
 
-_Node = (Core.Name "hydra.query.Node")
+_Node = Core.Name "hydra.query.Node"
 
-_Node_term = (Core.Name "term")
+_Node_term = Core.Name "term"
 
-_Node_variable = (Core.Name "variable")
+_Node_variable = Core.Name "variable"
 
-_Node_wildcard = (Core.Name "wildcard")
+_Node_wildcard = Core.Name "wildcard"
 
 -- | A query path
-data Path = 
+data Path =
   -- | A path given by a single step
   PathStep Step |
   -- | A path given by a regular expression quantifier applied to another path
@@ -98,16 +98,31 @@
   PathInverse Path
   deriving (Eq, Ord, Read, Show)
 
-_Path = (Core.Name "hydra.query.Path")
+_Path = Core.Name "hydra.query.Path"
 
-_Path_step = (Core.Name "step")
+_Path_step = Core.Name "step"
 
-_Path_regex = (Core.Name "regex")
+_Path_regex = Core.Name "regex"
 
-_Path_inverse = (Core.Name "inverse")
+_Path_inverse = Core.Name "inverse"
 
+-- | A declared equivalence between two abstract paths in a graph
+data PathEquation =
+  PathEquation {
+    -- | The left-hand side of the equation
+    pathEquationLeft :: Path,
+    -- | The right-hand side of the equation
+    pathEquationRight :: Path}
+  deriving (Eq, Ord, Read, Show)
+
+_PathEquation = Core.Name "hydra.query.PathEquation"
+
+_PathEquation_left = Core.Name "left"
+
+_PathEquation_right = Core.Name "right"
+
 -- | A query pattern
-data Pattern = 
+data Pattern =
   -- | A subject/predicate/object pattern
   PatternTriple TriplePattern |
   -- | The negation of another pattern
@@ -120,20 +135,35 @@
   PatternGraph GraphPattern
   deriving (Eq, Ord, Read, Show)
 
-_Pattern = (Core.Name "hydra.query.Pattern")
+_Pattern = Core.Name "hydra.query.Pattern"
 
-_Pattern_triple = (Core.Name "triple")
+_Pattern_triple = Core.Name "triple"
 
-_Pattern_negation = (Core.Name "negation")
+_Pattern_negation = Core.Name "negation"
 
-_Pattern_conjunction = (Core.Name "conjunction")
+_Pattern_conjunction = Core.Name "conjunction"
 
-_Pattern_disjunction = (Core.Name "disjunction")
+_Pattern_disjunction = Core.Name "disjunction"
 
-_Pattern_graph = (Core.Name "graph")
+_Pattern_graph = Core.Name "graph"
 
+-- | A pattern which, if it matches in a given graph, implies that another pattern must also match. Query variables are shared between the two patterns.
+data PatternImplication =
+  PatternImplication {
+    -- | The pattern which, if it matches, triggers the constraint
+    patternImplicationAntecedent :: Pattern,
+    -- | The pattern which must also match when the antecedent matches
+    patternImplicationConsequent :: Pattern}
+  deriving (Eq, Ord, Read, Show)
+
+_PatternImplication = Core.Name "hydra.query.PatternImplication"
+
+_PatternImplication_antecedent = Core.Name "antecedent"
+
+_PatternImplication_consequent = Core.Name "consequent"
+
 -- | A SELECT-style graph pattern matching query
-data Query = 
+data Query =
   Query {
     -- | The variables selected by the query
     queryVariables :: [Variable],
@@ -141,14 +171,14 @@
     queryPatterns :: [Pattern]}
   deriving (Eq, Ord, Read, Show)
 
-_Query = (Core.Name "hydra.query.Query")
+_Query = Core.Name "hydra.query.Query"
 
-_Query_variables = (Core.Name "variables")
+_Query_variables = Core.Name "variables"
 
-_Query_patterns = (Core.Name "patterns")
+_Query_patterns = Core.Name "patterns"
 
 -- | A range from min to max, inclusive
-data Range = 
+data Range =
   Range {
     -- | The minimum value (inclusive)
     rangeMin :: Int,
@@ -156,14 +186,14 @@
     rangeMax :: Int}
   deriving (Eq, Ord, Read, Show)
 
-_Range = (Core.Name "hydra.query.Range")
+_Range = Core.Name "hydra.query.Range"
 
-_Range_min = (Core.Name "min")
+_Range_min = Core.Name "min"
 
-_Range_max = (Core.Name "max")
+_Range_max = Core.Name "max"
 
 -- | A regular expression quantifier
-data RegexQuantifier = 
+data RegexQuantifier =
   -- | No quantifier; matches a single occurrence
   RegexQuantifierOne  |
   -- | The ? quanifier; matches zero or one occurrence
@@ -180,24 +210,24 @@
   RegexQuantifierRange Range
   deriving (Eq, Ord, Read, Show)
 
-_RegexQuantifier = (Core.Name "hydra.query.RegexQuantifier")
+_RegexQuantifier = Core.Name "hydra.query.RegexQuantifier"
 
-_RegexQuantifier_one = (Core.Name "one")
+_RegexQuantifier_one = Core.Name "one"
 
-_RegexQuantifier_zeroOrOne = (Core.Name "zeroOrOne")
+_RegexQuantifier_zeroOrOne = Core.Name "zeroOrOne"
 
-_RegexQuantifier_zeroOrMore = (Core.Name "zeroOrMore")
+_RegexQuantifier_zeroOrMore = Core.Name "zeroOrMore"
 
-_RegexQuantifier_oneOrMore = (Core.Name "oneOrMore")
+_RegexQuantifier_oneOrMore = Core.Name "oneOrMore"
 
-_RegexQuantifier_exactly = (Core.Name "exactly")
+_RegexQuantifier_exactly = Core.Name "exactly"
 
-_RegexQuantifier_atLeast = (Core.Name "atLeast")
+_RegexQuantifier_atLeast = Core.Name "atLeast"
 
-_RegexQuantifier_range = (Core.Name "range")
+_RegexQuantifier_range = Core.Name "range"
 
 -- | A path with a regex quantifier
-data RegexSequence = 
+data RegexSequence =
   RegexSequence {
     -- | The path to which the quantifier applies
     regexSequencePath :: Path,
@@ -205,14 +235,14 @@
     regexSequenceQuantifier :: RegexQuantifier}
   deriving (Eq, Ord, Read, Show)
 
-_RegexSequence = (Core.Name "hydra.query.RegexSequence")
+_RegexSequence = Core.Name "hydra.query.RegexSequence"
 
-_RegexSequence_path = (Core.Name "path")
+_RegexSequence_path = Core.Name "path"
 
-_RegexSequence_quantifier = (Core.Name "quantifier")
+_RegexSequence_quantifier = Core.Name "quantifier"
 
 -- | An atomic function as part of a query. When applied to a graph, steps are typed by function types.
-data Step = 
+data Step =
   -- | An out-to-in traversal of an abstract edge
   StepEdge Edge |
   -- | A projection from a record through one of its fields
@@ -221,16 +251,16 @@
   StepCompare ComparisonConstraint
   deriving (Eq, Ord, Read, Show)
 
-_Step = (Core.Name "hydra.query.Step")
+_Step = Core.Name "hydra.query.Step"
 
-_Step_edge = (Core.Name "edge")
+_Step_edge = Core.Name "edge"
 
-_Step_project = (Core.Name "project")
+_Step_project = Core.Name "project"
 
-_Step_compare = (Core.Name "compare")
+_Step_compare = Core.Name "compare"
 
 -- | A subject/predicate/object pattern
-data TriplePattern = 
+data TriplePattern =
   TriplePattern {
     -- | The subject of the pattern
     triplePatternSubject :: Node,
@@ -240,18 +270,18 @@
     triplePatternObject :: Node}
   deriving (Eq, Ord, Read, Show)
 
-_TriplePattern = (Core.Name "hydra.query.TriplePattern")
+_TriplePattern = Core.Name "hydra.query.TriplePattern"
 
-_TriplePattern_subject = (Core.Name "subject")
+_TriplePattern_subject = Core.Name "subject"
 
-_TriplePattern_predicate = (Core.Name "predicate")
+_TriplePattern_predicate = Core.Name "predicate"
 
-_TriplePattern_object = (Core.Name "object")
+_TriplePattern_object = Core.Name "object"
 
 -- | A query variable
-newtype Variable = 
+newtype Variable =
   Variable {
     unVariable :: String}
   deriving (Eq, Ord, Read, Show)
 
-_Variable = (Core.Name "hydra.query.Variable")
+_Variable = Core.Name "hydra.query.Variable"
diff --git a/src/gen-main/haskell/Hydra/Reduction.hs b/src/gen-main/haskell/Hydra/Reduction.hs
--- a/src/gen-main/haskell/Hydra/Reduction.hs
+++ b/src/gen-main/haskell/Hydra/Reduction.hs
@@ -6,628 +6,617 @@
 
 import qualified Hydra.Arity as Arity
 import qualified Hydra.Checking as Checking
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Encode.Core as Core_
-import qualified Hydra.Extract.Core as Core__
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Math as Math
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Schemas as Schemas
-import qualified Hydra.Typing as Typing
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Alpha convert a variable in a term
-alphaConvert :: (Core.Name -> Core.Name -> Core.Term -> Core.Term)
-alphaConvert vold vnew term = (Rewriting.replaceFreeTermVariable vold (Core.TermVariable vnew) term)
-
--- | Eagerly beta-reduce a type by substituting type arguments into type lambdas
-betaReduceType :: (Core.Type -> Compute.Flow Graph.Graph Core.Type)
-betaReduceType typ =  
-  let reduceApp = (\app ->  
-          let lhs = (Core.applicationTypeFunction app)
-          in  
-            let rhs = (Core.applicationTypeArgument app)
-            in ((\x -> case x of
-              Core.TypeAnnotated v1 -> (Flows.bind (reduceApp (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.annotatedTypeBody v1),
-                Core.applicationTypeArgument = rhs})) (\a -> Flows.pure (Core.TypeAnnotated (Core.AnnotatedType {
-                Core.annotatedTypeBody = a,
-                Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v1)}))))
-              Core.TypeForall v1 -> (betaReduceType (Rewriting.replaceFreeTypeVariable (Core.forallTypeParameter v1) rhs (Core.forallTypeBody v1)))
-              Core.TypeVariable v1 -> (Flows.bind (Schemas.requireType v1) (\t_ -> betaReduceType (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = t_,
-                Core.applicationTypeArgument = rhs}))))) lhs))
-  in  
-    let mapExpr = (\recurse -> \t ->  
-            let findApp = (\r -> (\x -> case x of
-                    Core.TypeApplication v1 -> (reduceApp v1)
-                    _ -> (Flows.pure r)) r)
-            in (Flows.bind (recurse t) (\r -> findApp r)))
-    in (Rewriting.rewriteTypeM mapExpr typ)
-
--- | Apply the special rules:
--- |     ((\x.e1) e2) == e1, where x does not appear free in e1
--- |   and
--- |      ((\x.e1) e2) = e1[x/e2]
--- | These are both limited forms of beta reduction which help to "clean up" a term without fully evaluating it.
-contractTerm :: (Core.Term -> Core.Term)
-contractTerm term =  
-  let rewrite = (\recurse -> \t ->  
-          let rec = (recurse t)
-          in ((\x -> case x of
-            Core.TermApplication v1 ->  
-              let lhs = (Core.applicationFunction v1)
-              in  
-                let rhs = (Core.applicationArgument v1)
-                in ((\x -> case x of
-                  Core.TermFunction v2 -> ((\x -> case x of
-                    Core.FunctionLambda v3 ->  
-                      let v = (Core.lambdaParameter v3)
-                      in  
-                        let body = (Core.lambdaBody v3)
-                        in (Logic.ifElse (Rewriting.isFreeVariableInTerm v body) body (Rewriting.replaceFreeTermVariable v rhs body))
-                    _ -> rec) v2)
-                  _ -> rec) (Rewriting.deannotateTerm lhs))
-            _ -> rec) rec))
-  in (Rewriting.rewriteTerm rewrite term)
-
-countPrimitiveInvocations :: Bool
-countPrimitiveInvocations = True
-
--- | Eta-reduce a term by removing redundant lambda abstractions
-etaReduceTerm :: (Core.Term -> Core.Term)
-etaReduceTerm term =  
-  let noChange = term
-  in  
-    let reduceLambda = (\l ->  
-            let v = (Core.lambdaParameter l)
-            in  
-              let d = (Core.lambdaDomain l)
-              in  
-                let body = (Core.lambdaBody l)
-                in ((\x -> case x of
-                  Core.TermAnnotated v1 -> (reduceLambda (Core.Lambda {
-                    Core.lambdaParameter = v,
-                    Core.lambdaDomain = d,
-                    Core.lambdaBody = (Core.annotatedTermBody v1)}))
-                  Core.TermApplication v1 ->  
-                    let lhs = (Core.applicationFunction v1)
-                    in  
-                      let rhs = (Core.applicationArgument v1)
-                      in ((\x -> case x of
-                        Core.TermAnnotated v2 -> (reduceLambda (Core.Lambda {
-                          Core.lambdaParameter = v,
-                          Core.lambdaDomain = d,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = lhs,
-                            Core.applicationArgument = (Core.annotatedTermBody v2)}))}))
-                        Core.TermVariable v2 -> (Logic.ifElse (Logic.and (Equality.equal (Core.unName v) (Core.unName v2)) (Logic.not (Rewriting.isFreeVariableInTerm v lhs))) (etaReduceTerm lhs) noChange)
-                        _ -> noChange) (etaReduceTerm rhs))
-                  _ -> noChange) (etaReduceTerm body)))
-    in ((\x -> case x of
-      Core.TermAnnotated v1 -> (Core.TermAnnotated (Core.AnnotatedTerm {
-        Core.annotatedTermBody = (etaReduceTerm (Core.annotatedTermBody v1)),
-        Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)}))
-      Core.TermFunction v1 -> ((\x -> case x of
-        Core.FunctionLambda v2 -> (reduceLambda v2)
-        _ -> noChange) v1)
-      _ -> noChange) term)
-
--- | Recursively transform arbitrary terms like 'add 42' into terms like '\x.add 42 x', in which the implicit parameters of primitive functions and eliminations are made into explicit lambda parameters. Variable references are not expanded. This is useful for targets like Python with weaker support for currying than Hydra or Haskell. Note: this is a "trusty" function which assumes the graph is well-formed, i.e. no dangling references.
-etaExpandTerm :: (Graph.Graph -> Core.Term -> Core.Term)
-etaExpandTerm graph term =  
-  let expand = (\args -> \arity -> \t ->  
-          let apps = (Lists.foldl (\lhs -> \arg -> Core.TermApplication (Core.Application {
-                  Core.applicationFunction = lhs,
-                  Core.applicationArgument = arg})) t args)
-          in  
-            let is = (Logic.ifElse (Equality.lte arity (Lists.length args)) [] (Math.range 1 (Math.sub arity (Lists.length args))))
-            in  
-              let pad = (\indices -> \t -> Logic.ifElse (Lists.null indices) t (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name (Strings.cat2 "v" (Literals.showInt32 (Lists.head indices)))),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (pad (Lists.tail indices) (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = t,
-                        Core.applicationArgument = (Core.TermVariable (Core.Name (Strings.cat2 "v" (Literals.showInt32 (Lists.head indices)))))})))}))))
-              in (pad is apps))
-  in  
-    let rewrite = (\args -> \recurse -> \t ->  
-            let afterRecursion = (\term -> expand args (etaExpansionArity graph term) term)
-            in  
-              let t2 = (Rewriting.detypeTerm t)
-              in ((\x -> case x of
-                Core.TermApplication v1 ->  
-                  let lhs = (Core.applicationFunction v1)
-                  in  
-                    let rhs = (Core.applicationArgument v1)
-                    in  
-                      let erhs = (rewrite [] recurse rhs)
-                      in (rewrite (Lists.cons erhs args) recurse lhs)
-                _ -> (afterRecursion (recurse t2))) t2))
-    in (contractTerm (Rewriting.rewriteTerm (rewrite []) term))
-
--- | Recursively transform terms to eliminate partial application, e.g. 'add 42' becomes '\x.add 42 x'. Uses the TypeContext to look up types for arity calculation. Bare primitives and variables are NOT expanded; eliminations and partial applications are. This version properly tracks the TypeContext through nested scopes.
-etaExpandTermNew :: (Typing.TypeContext -> Core.Term -> Core.Term)
-etaExpandTermNew tx0 term0 =  
-  let termArityWithContext = (\tx -> \term -> (\x -> case x of
-          Core.TermAnnotated v1 -> (termArityWithContext tx (Core.annotatedTermBody v1))
-          Core.TermApplication v1 -> (Math.sub (termArityWithContext tx (Core.applicationFunction v1)) 1)
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionElimination _ -> 1
-            Core.FunctionLambda _ -> 0
-            Core.FunctionPrimitive v2 -> (Maybes.maybe 0 Arity.typeSchemeArity (Maps.lookup v2 (Typing.inferenceContextPrimitiveTypes (Typing.typeContextInferenceContext tx))))) v1)
-          Core.TermLet v1 -> (termArityWithContext (Schemas.extendTypeContextForLet (\_ -> \_ -> Nothing) tx v1) (Core.letBody v1))
-          Core.TermTypeLambda v1 -> (termArityWithContext (Schemas.extendTypeContextForTypeLambda tx v1) (Core.typeLambdaBody v1))
-          Core.TermTypeApplication v1 -> (termArityWithContext tx (Core.typeApplicationTermBody v1))
-          Core.TermVariable v1 -> (Maybes.maybe 0 Arity.typeArity (Maps.lookup v1 (Typing.typeContextTypes tx)))
-          _ -> 0) term)
-  in  
-    let domainTypes = (\n -> \mt -> Logic.ifElse (Equality.lte n 0) [] (Maybes.maybe (Lists.map (\_ -> Nothing) (Math.range 1 n)) (\typ -> (\x -> case x of
-            Core.TypeFunction v1 -> (Lists.cons (Just (Core.functionTypeDomain v1)) (domainTypes (Math.sub n 1) (Just (Core.functionTypeCodomain v1))))
-            Core.TypeAnnotated v1 -> (domainTypes n (Just (Core.annotatedTypeBody v1)))
-            Core.TypeApplication v1 -> (domainTypes n (Just (Core.applicationTypeFunction v1)))
-            Core.TypeForall v1 -> (domainTypes n (Just (Core.forallTypeBody v1)))
-            _ -> (Lists.map (\_ -> Nothing) (Math.range 1 n))) typ) mt))
-    in  
-      let peelFunctionDomains = (\mtyp -> \n -> Logic.ifElse (Equality.lte n 0) mtyp (Maybes.maybe Nothing (\typ -> (\x -> case x of
-              Core.TypeFunction v1 -> (peelFunctionDomains (Just (Core.functionTypeCodomain v1)) (Math.sub n 1))
-              Core.TypeAnnotated v1 -> (peelFunctionDomains (Just (Core.annotatedTypeBody v1)) n)
-              Core.TypeApplication v1 -> (peelFunctionDomains (Just (Core.applicationTypeFunction v1)) n)
-              Core.TypeForall v1 -> (peelFunctionDomains (Just (Core.forallTypeBody v1)) n)
-              _ -> Nothing) typ) mtyp))
-      in  
-        let expand = (\alwaysPad -> \args -> \arity -> \headTyp -> \head ->  
-                let applied = (Lists.foldl (\lhs -> \arg -> Core.TermApplication (Core.Application {
-                        Core.applicationFunction = lhs,
-                        Core.applicationArgument = arg})) head args)
-                in  
-                  let numArgs = (Lists.length args)
-                  in  
-                    let needed = (Math.sub arity numArgs)
-                    in (Logic.ifElse (Logic.and (Equality.gt needed 0) (Logic.or alwaysPad (Equality.gt numArgs 0))) ( 
-                      let indices = (Math.range 1 needed)
-                      in  
-                        let remainingType = (peelFunctionDomains headTyp numArgs)
-                        in  
-                          let domains = (domainTypes needed remainingType)
-                          in  
-                            let codomainType = (peelFunctionDomains remainingType needed)
-                            in  
-                              let fullyAppliedRaw = (Lists.foldl (\body -> \i ->  
-                                      let vn = (Core.Name (Strings.cat2 "v" (Literals.showInt32 i)))
-                                      in (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = body,
-                                        Core.applicationArgument = (Core.TermVariable vn)}))) applied indices)
-                              in  
-                                let fullyApplied = (Maybes.maybe fullyAppliedRaw (\ct -> Core.TermAnnotated (Core.AnnotatedTerm {
-                                        Core.annotatedTermBody = fullyAppliedRaw,
-                                        Core.annotatedTermAnnotation = (Maps.singleton (Core.Name "type") (Core_.type_ ct))})) codomainType)
-                                in  
-                                  let indexedDomains = (Lists.zip indices domains)
-                                  in (Lists.foldl (\body -> \idPair ->  
-                                    let i = (Pairs.first idPair)
-                                    in  
-                                      let dom = (Pairs.second idPair)
-                                      in  
-                                        let vn = (Core.Name (Strings.cat2 "v" (Literals.showInt32 i)))
-                                        in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = vn,
-                                          Core.lambdaDomain = dom,
-                                          Core.lambdaBody = body})))) fullyApplied (Lists.reverse indexedDomains))) applied))
-        in  
-          let rewriteWithArgs = (\args -> \tx -> \term ->  
-                  let recurse = (\tx1 -> \term1 -> rewriteWithArgs [] tx1 term1)
-                  in  
-                    let termHeadType = (\tx2 -> \trm2 -> (\x -> case x of
-                            Core.TermAnnotated v1 -> (termHeadType tx2 (Core.annotatedTermBody v1))
-                            Core.TermFunction v1 -> ((\x -> case x of
-                              Core.FunctionPrimitive v2 -> (Maybes.map (\ts2 -> Core.typeSchemeType ts2) (Maps.lookup v2 (Typing.inferenceContextPrimitiveTypes (Typing.typeContextInferenceContext tx2))))
-                              _ -> Nothing) v1)
-                            Core.TermLet v1 -> (termHeadType (Schemas.extendTypeContextForLet (\_ -> \_ -> Nothing) tx2 v1) (Core.letBody v1))
-                            Core.TermTypeLambda v1 -> (termHeadType (Schemas.extendTypeContextForTypeLambda tx2 v1) (Core.typeLambdaBody v1))
-                            Core.TermTypeApplication v1 -> (Maybes.bind (termHeadType tx2 (Core.typeApplicationTermBody v1)) (\htyp2 -> (\x -> case x of
-                              Core.TypeForall v2 -> (Just (Rewriting.replaceFreeTypeVariable (Core.forallTypeParameter v2) (Core.typeApplicationTermType v1) (Core.forallTypeBody v2)))
-                              _ -> (Just htyp2)) htyp2))
-                            Core.TermVariable v1 -> (Maps.lookup v1 (Typing.typeContextTypes tx2))
-                            _ -> Nothing) trm2)
-                    in  
-                      let afterRecursion = (\trm ->  
-                              let arity = (termArityWithContext tx trm)
-                              in  
-                                let hType = (termHeadType tx trm)
-                                in (expand False args arity hType trm))
-                      in  
-                        let forField = (\f -> Core.Field {
-                                Core.fieldName = (Core.fieldName f),
-                                Core.fieldTerm = (recurse tx (Core.fieldTerm f))})
-                        in  
-                          let forCaseBranch = (\f ->  
-                                  let branchBody = (recurse tx (Core.fieldTerm f))
-                                  in  
-                                    let arty = (termArityWithContext tx branchBody)
-                                    in  
-                                      let branchHType = (termHeadType tx branchBody)
-                                      in Core.Field {
-                                        Core.fieldName = (Core.fieldName f),
-                                        Core.fieldTerm = (expand True [] arty branchHType branchBody)})
-                          in  
-                            let forElimination = (\elm -> (\x -> case x of
-                                    Core.EliminationRecord v1 -> (Core.EliminationRecord v1)
-                                    Core.EliminationUnion v1 -> (Core.EliminationUnion (Core.CaseStatement {
-                                      Core.caseStatementTypeName = (Core.caseStatementTypeName v1),
-                                      Core.caseStatementDefault = (Maybes.map (\t1 -> recurse tx t1) (Core.caseStatementDefault v1)),
-                                      Core.caseStatementCases = (Lists.map forCaseBranch (Core.caseStatementCases v1))}))
-                                    Core.EliminationWrap v1 -> (Core.EliminationWrap v1)) elm)
-                            in  
-                              let forMap = (\mp ->  
-                                      let forPair = (\pr -> (recurse tx (Pairs.first pr), (recurse tx (Pairs.second pr))))
-                                      in (Maps.fromList (Lists.map forPair (Maps.toList mp))))
-                              in ((\x -> case x of
-                                Core.TermAnnotated v1 -> (afterRecursion (Core.TermAnnotated (Core.AnnotatedTerm {
-                                  Core.annotatedTermBody = (recurse tx (Core.annotatedTermBody v1)),
-                                  Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)})))
-                                Core.TermApplication v1 ->  
-                                  let rhs = (rewriteWithArgs [] tx (Core.applicationArgument v1))
-                                  in (rewriteWithArgs (Lists.cons rhs args) tx (Core.applicationFunction v1))
-                                Core.TermEither v1 -> (afterRecursion (Core.TermEither (Eithers.either (\l -> Left (recurse tx l)) (\r -> Right (recurse tx r)) v1)))
-                                Core.TermFunction v1 -> ((\x -> case x of
-                                  Core.FunctionElimination v2 ->  
-                                    let padElim = ((\x -> case x of
-                                            Core.EliminationRecord _ -> False
-                                            Core.EliminationUnion _ -> True
-                                            Core.EliminationWrap _ -> False) v2)
-                                    in  
-                                      let elimTerm = (Core.TermFunction (Core.FunctionElimination (forElimination v2)))
-                                      in  
-                                        let elimHeadType = ((\x -> case x of
-                                                Core.EliminationUnion v3 -> (Just (Core.TypeFunction (Core.FunctionType {
-                                                  Core.functionTypeDomain = (Core.TypeVariable (Core.caseStatementTypeName v3)),
-                                                  Core.functionTypeCodomain = Core.TypeUnit})))
-                                                _ -> Nothing) v2)
-                                        in (expand padElim args 1 elimHeadType elimTerm)
-                                  Core.FunctionLambda v2 ->  
-                                    let tx1 = (Schemas.extendTypeContextForLambda tx v2)
-                                    in  
-                                      let body = (rewriteWithArgs [] tx1 (Core.lambdaBody v2))
-                                      in  
-                                        let result = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.lambdaParameter v2),
-                                                Core.lambdaDomain = (Core.lambdaDomain v2),
-                                                Core.lambdaBody = body})))
-                                        in  
-                                          let arty = (termArityWithContext tx result)
-                                          in (expand False args arty Nothing result)
-                                  Core.FunctionPrimitive v2 ->  
-                                    let arty = (termArityWithContext tx term)
-                                    in  
-                                      let primType = (Maybes.map (\ts -> Core.typeSchemeType ts) (Maps.lookup v2 (Typing.inferenceContextPrimitiveTypes (Typing.typeContextInferenceContext tx))))
-                                      in (expand False args arty primType term)) v1)
-                                Core.TermLet v1 ->  
-                                  let tx1 = (Schemas.extendTypeContextForLet (\_ -> \_ -> Nothing) tx v1)
-                                  in  
-                                    let mapBinding = (\b -> Core.Binding {
-                                            Core.bindingName = (Core.bindingName b),
-                                            Core.bindingTerm = (rewriteWithArgs [] tx1 (Core.bindingTerm b)),
-                                            Core.bindingType = (Core.bindingType b)})
-                                    in  
-                                      let result = (Core.TermLet (Core.Let {
-                                              Core.letBindings = (Lists.map mapBinding (Core.letBindings v1)),
-                                              Core.letBody = (rewriteWithArgs [] tx1 (Core.letBody v1))}))
-                                      in (afterRecursion result)
-                                Core.TermList v1 -> (afterRecursion (Core.TermList (Lists.map (\el -> recurse tx el) v1)))
-                                Core.TermLiteral v1 -> (Core.TermLiteral v1)
-                                Core.TermMap v1 -> (afterRecursion (Core.TermMap (forMap v1)))
-                                Core.TermMaybe v1 -> (afterRecursion (Core.TermMaybe (Maybes.map (\v -> recurse tx v) v1)))
-                                Core.TermPair v1 -> (afterRecursion (Core.TermPair (recurse tx (Pairs.first v1), (recurse tx (Pairs.second v1)))))
-                                Core.TermRecord v1 -> (afterRecursion (Core.TermRecord (Core.Record {
-                                  Core.recordTypeName = (Core.recordTypeName v1),
-                                  Core.recordFields = (Lists.map forField (Core.recordFields v1))})))
-                                Core.TermSet v1 -> (afterRecursion (Core.TermSet (Sets.fromList (Lists.map (\el -> recurse tx el) (Sets.toList v1)))))
-                                Core.TermTypeApplication v1 -> (afterRecursion (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                  Core.typeApplicationTermBody = (recurse tx (Core.typeApplicationTermBody v1)),
-                                  Core.typeApplicationTermType = (Core.typeApplicationTermType v1)})))
-                                Core.TermTypeLambda v1 ->  
-                                  let tx1 = (Schemas.extendTypeContextForTypeLambda tx v1)
-                                  in  
-                                    let result = (Core.TermTypeLambda (Core.TypeLambda {
-                                            Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-                                            Core.typeLambdaBody = (rewriteWithArgs [] tx1 (Core.typeLambdaBody v1))}))
-                                    in (afterRecursion result)
-                                Core.TermUnion v1 -> (afterRecursion (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.injectionTypeName v1),
-                                  Core.injectionField = (forField (Core.injectionField v1))})))
-                                Core.TermUnit -> Core.TermUnit
-                                Core.TermVariable v1 ->  
-                                  let arty = (termArityWithContext tx term)
-                                  in  
-                                    let varType = (Maps.lookup v1 (Typing.typeContextTypes tx))
-                                    in (expand False args arty varType term)
-                                Core.TermWrap v1 -> (afterRecursion (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.wrappedTermTypeName v1),
-                                  Core.wrappedTermBody = (recurse tx (Core.wrappedTermBody v1))})))) term))
-          in (contractTerm (rewriteWithArgs [] tx0 term0))
-
--- | Calculate the arity for eta expansion Note: this is a "trusty" function which assumes the graph is well-formed, i.e. no dangling references.
-etaExpansionArity :: (Graph.Graph -> Core.Term -> Int)
-etaExpansionArity graph term = ((\x -> case x of
-  Core.TermAnnotated v1 -> (etaExpansionArity graph (Core.annotatedTermBody v1))
-  Core.TermApplication v1 -> (Math.sub (etaExpansionArity graph (Core.applicationFunction v1)) 1)
-  Core.TermFunction v1 -> ((\x -> case x of
-    Core.FunctionElimination _ -> 1
-    Core.FunctionLambda _ -> 0
-    Core.FunctionPrimitive v2 -> (Arity.primitiveArity (Maybes.fromJust (Lexical.lookupPrimitive graph v2)))) v1)
-  Core.TermTypeLambda v1 -> (etaExpansionArity graph (Core.typeLambdaBody v1))
-  Core.TermTypeApplication v1 -> (etaExpansionArity graph (Core.typeApplicationTermBody v1))
-  Core.TermVariable v1 -> (Maybes.maybe 0 (\ts -> Arity.typeArity (Core.typeSchemeType ts)) (Maybes.bind (Lexical.lookupElement graph v1) (\b -> Core.bindingType b)))
-  _ -> 0) term)
-
--- | Recursively transform arbitrary terms like 'add 42' into terms like '\x.add 42 x', eliminating partial application. Variable references are not expanded. This is useful for targets like Python with weaker support for currying than Hydra or Haskell. Note: this is a "trusty" function which assumes the graph is well-formed, i.e. no dangling references. It also assumes that type inference has already been performed. After eta expansion, type inference needs to be performed again, as new, untyped lambdas may have been added.
-etaExpandTypedTerm :: (Typing.TypeContext -> Core.Term -> Compute.Flow t0 Core.Term)
-etaExpandTypedTerm tx0 term0 =  
-  let rewrite = (\topLevel -> \forced -> \typeArgs -> \recurse -> \tx -> \term ->  
-          let rewriteSpine = (\term -> (\x -> case x of
-                  Core.TermAnnotated v1 -> (Flows.bind (rewriteSpine (Core.annotatedTermBody v1)) (\body ->  
-                    let ann = (Core.annotatedTermAnnotation v1)
-                    in (Flows.pure (Core.TermAnnotated (Core.AnnotatedTerm {
-                      Core.annotatedTermBody = body,
-                      Core.annotatedTermAnnotation = ann})))))
-                  Core.TermApplication v1 ->  
-                    let l = (Logic.ifElse False [
-                            Core.TypeLiteral Core.LiteralTypeString] [])
-                    in (Flows.bind (rewriteSpine (Core.applicationFunction v1)) (\lhs -> Flows.bind (rewrite True False l recurse tx (Core.applicationArgument v1)) (\rhs -> Flows.pure (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = lhs,
-                      Core.applicationArgument = rhs})))))
-                  Core.TermTypeApplication v1 -> (Flows.bind (rewriteSpine (Core.typeApplicationTermBody v1)) (\body ->  
-                    let typ = (Core.typeApplicationTermType v1)
-                    in (Flows.pure (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = body,
-                      Core.typeApplicationTermType = typ})))))
-                  _ -> (rewrite False False [] recurse tx term)) term)
-          in  
-            let arityOf = (\tx -> \term ->  
-                    let dflt = (Flows.map Arity.typeArity (Checking.typeOf tx [] term))
-                    in  
-                      let forFunction = (\tx -> \f -> (\x -> case x of
-                              Core.FunctionElimination _ -> (Flows.pure 1)
-                              Core.FunctionLambda v1 ->  
-                                let txl = (Schemas.extendTypeContextForLambda tx v1)
-                                in (arityOf txl (Core.lambdaBody v1))
-                              Core.FunctionPrimitive v1 -> (Flows.map Arity.typeSchemeArity (Lexical.requirePrimitiveType tx v1))) f)
-                      in ((\x -> case x of
-                        Core.TermAnnotated v1 -> (arityOf tx (Core.annotatedTermBody v1))
-                        Core.TermFunction v1 -> (forFunction tx v1)
-                        Core.TermLet v1 ->  
-                          let txl = (Schemas.extendTypeContextForLet (\_ -> \_ -> Nothing) tx v1)
-                          in (arityOf txl (Core.letBody v1))
-                        Core.TermTypeApplication v1 -> (arityOf tx (Core.typeApplicationTermBody v1))
-                        Core.TermTypeLambda v1 ->  
-                          let txt = (Schemas.extendTypeContextForTypeLambda tx v1)
-                          in (arityOf txt (Core.typeLambdaBody v1))
-                        Core.TermVariable v1 -> (Maybes.maybe (Flows.map Arity.typeArity (Checking.typeOf tx [] (Core.TermVariable v1))) (\t -> Flows.pure (Arity.typeArity t)) (Maps.lookup v1 (Typing.typeContextTypes tx)))
-                        _ -> dflt) term))
-            in  
-              let extraVariables = (\n -> Lists.map (\i -> Core.Name (Strings.cat2 "v" (Literals.showInt32 i))) (Math.range 1 n))
-              in  
-                let pad = (\vars -> \body -> Logic.ifElse (Lists.null vars) body (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Lists.head vars),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (pad (Lists.tail vars) (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = body,
-                          Core.applicationArgument = (Core.TermVariable (Lists.head vars))})))}))))
-                in  
-                  let padn = (\n -> \body -> pad (extraVariables n) body)
-                  in  
-                    let unwind = (\term -> Lists.foldl (\e -> \t -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = e,
-                            Core.typeApplicationTermType = t})) term typeArgs)
-                    in  
-                      let forceExpansion = (\t -> Flows.bind (Checking.typeOf tx [] t) (\typ ->  
-                              let arity = (Arity.typeArity typ)
-                              in (Flows.pure (padn arity (unwind t)))))
-                      in  
-                        let recurseOrForce = (\term -> Logic.ifElse forced (forceExpansion term) (recurse tx (unwind term)))
-                        in  
-                          let forCase = (\f -> Flows.bind (rewrite False True [] recurse tx (Core.fieldTerm f)) (\r -> Flows.pure (Core.Field {
-                                  Core.fieldName = (Core.fieldName f),
-                                  Core.fieldTerm = r})))
-                          in  
-                            let forCaseStatement = (\cs ->  
-                                    let tname = (Core.caseStatementTypeName cs)
-                                    in  
-                                      let dflt = (Core.caseStatementDefault cs)
-                                      in  
-                                        let cases = (Core.caseStatementCases cs)
-                                        in (Flows.bind (Flows.mapMaybe (rewrite False False [] recurse tx) dflt) (\rdflt -> Flows.bind (Flows.mapList forCase cases) (\rcases -> Flows.pure (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                          Core.caseStatementTypeName = tname,
-                                          Core.caseStatementDefault = rdflt,
-                                          Core.caseStatementCases = rcases}))))))))
-                            in  
-                              let forElimination = (\elm ->  
-                                      let checkBase = (\elm -> (\x -> case x of
-                                              Core.EliminationUnion v1 -> (forCaseStatement v1)
-                                              _ -> (recurse tx term)) elm)
-                                      in (Flows.bind (Flows.map unwind (checkBase elm)) (\base -> Flows.pure (Logic.ifElse (Logic.or topLevel forced) (padn 1 base) base))))
-                              in ((\x -> case x of
-                                Core.TermApplication v1 ->  
-                                  let lhs = (Core.applicationFunction v1)
-                                  in  
-                                    let rhs = (Core.applicationArgument v1)
-                                    in (Flows.bind (rewrite True False [] recurse tx rhs) (\rhs2 -> Flows.bind (arityOf tx lhs) (\lhsarity -> Flows.bind (rewriteSpine lhs) (\lhs2 ->  
-                                      let a2 = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = lhs2,
-                                              Core.applicationArgument = rhs2}))
-                                      in (Flows.pure (Logic.ifElse (Equality.gt lhsarity 1) (padn (Math.sub lhsarity 1) a2) a2))))))
-                                Core.TermFunction v1 -> ((\x -> case x of
-                                  Core.FunctionElimination v2 -> (forElimination v2)
-                                  Core.FunctionLambda v2 ->  
-                                    let txl = (Schemas.extendTypeContextForLambda tx v2)
-                                    in (Flows.map unwind (recurse txl term))
-                                  _ -> (recurseOrForce term)) v1)
-                                Core.TermLet v1 ->  
-                                  let txlt = (Schemas.extendTypeContextForLet (\_ -> \_ -> Nothing) tx v1)
-                                  in (recurse txlt term)
-                                Core.TermTypeApplication v1 -> (rewrite topLevel forced (Lists.cons (Core.typeApplicationTermType v1) typeArgs) recurse tx (Core.typeApplicationTermBody v1))
-                                Core.TermTypeLambda v1 ->  
-                                  let txt = (Schemas.extendTypeContextForTypeLambda tx v1)
-                                  in (recurse txt term)
-                                _ -> (recurseOrForce term)) term))
-  in (Rewriting.rewriteTermWithContextM (rewrite True False []) tx0 term0)
-
--- | A term evaluation function which is alternatively lazy or eager
-reduceTerm :: (Bool -> Core.Term -> Compute.Flow Graph.Graph Core.Term)
-reduceTerm eager term =  
-  let reduce = (\eager -> reduceTerm eager)
-  in  
-    let doRecurse = (\eager -> \term ->  
-            let isNonLambda = (\f -> (\x -> case x of
-                    Core.FunctionLambda _ -> False
-                    _ -> True) f)
-            in  
-              let isNonLambdaTerm = ((\x -> case x of
-                      Core.TermFunction v1 -> (isNonLambda v1)
-                      Core.TermLet _ -> False
-                      _ -> True) term)
-              in (Logic.and eager isNonLambdaTerm))
-    in  
-      let reduceArg = (\eager -> \arg -> Logic.ifElse eager (Flows.pure arg) (reduce False arg))
-      in  
-        let applyToArguments = (\fun -> \args -> Logic.ifElse (Lists.null args) fun (applyToArguments (Core.TermApplication (Core.Application {
-                Core.applicationFunction = fun,
-                Core.applicationArgument = (Lists.head args)})) (Lists.tail args)))
-        in  
-          let applyElimination = (\elm -> \reducedArg -> (\x -> case x of
-                  Core.EliminationRecord v1 -> (Flows.bind (Core__.record (Core.projectionTypeName v1) (Rewriting.deannotateTerm reducedArg)) (\fields ->  
-                    let matchingFields = (Lists.filter (\f -> Equality.equal (Core.fieldName f) (Core.projectionField v1)) fields)
-                    in (Logic.ifElse (Lists.null matchingFields) (Flows.fail (Strings.cat [
-                      "no such field: ",
-                      (Core.unName (Core.projectionField v1)),
-                      " in ",
-                      (Core.unName (Core.projectionTypeName v1)),
-                      " record"])) (Flows.pure (Core.fieldTerm (Lists.head matchingFields))))))
-                  Core.EliminationUnion v1 -> (Flows.bind (Core__.injection (Core.caseStatementTypeName v1) reducedArg) (\field ->  
-                    let matchingFields = (Lists.filter (\f -> Equality.equal (Core.fieldName f) (Core.fieldName field)) (Core.caseStatementCases v1))
-                    in (Logic.ifElse (Lists.null matchingFields) (Maybes.maybe (Flows.fail (Strings.cat [
-                      "no such field ",
-                      (Core.unName (Core.fieldName field)),
-                      " in ",
-                      (Core.unName (Core.caseStatementTypeName v1)),
-                      " case statement"])) Flows.pure (Core.caseStatementDefault v1)) (Flows.pure (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.fieldTerm (Lists.head matchingFields)),
-                      Core.applicationArgument = (Core.fieldTerm field)}))))))
-                  Core.EliminationWrap v1 -> (Core__.wrap v1 reducedArg)) elm)
-          in  
-            let applyIfNullary = (\eager -> \original -> \args ->  
-                    let stripped = (Rewriting.deannotateTerm original)
-                    in  
-                      let forElimination = (\elm -> \args ->  
-                              let arg = (Lists.head args)
-                              in  
-                                let remainingArgs = (Lists.tail args)
-                                in (Flows.bind (reduceArg eager (Rewriting.deannotateTerm arg)) (\reducedArg -> Flows.bind (Flows.bind (applyElimination elm reducedArg) (reduce eager)) (\reducedResult -> applyIfNullary eager reducedResult remainingArgs))))
-                      in  
-                        let forLambda = (\l -> \args ->  
-                                let param = (Core.lambdaParameter l)
-                                in  
-                                  let body = (Core.lambdaBody l)
-                                  in  
-                                    let arg = (Lists.head args)
-                                    in  
-                                      let remainingArgs = (Lists.tail args)
-                                      in (Flows.bind (reduce eager (Rewriting.deannotateTerm arg)) (\reducedArg -> Flows.bind (reduce eager (Rewriting.replaceFreeTermVariable param reducedArg body)) (\reducedResult -> applyIfNullary eager reducedResult remainingArgs))))
-                        in  
-                          let forPrimitive = (\prim -> \arity -> \args ->  
-                                  let argList = (Lists.take arity args)
-                                  in  
-                                    let remainingArgs = (Lists.drop arity args)
-                                    in (Flows.bind (Flows.mapList (reduceArg eager) argList) (\reducedArgs ->  
-                                      let strippedArgs = (Lists.map Rewriting.deannotateTerm reducedArgs)
-                                      in (Flows.bind (Flows.bind (Graph.primitiveImplementation prim strippedArgs) (reduce eager)) (\reducedResult -> applyIfNullary eager reducedResult remainingArgs)))))
-                          in ((\x -> case x of
-                            Core.TermApplication v1 -> (applyIfNullary eager (Core.applicationFunction v1) (Lists.cons (Core.applicationArgument v1) args))
-                            Core.TermFunction v1 -> ((\x -> case x of
-                              Core.FunctionElimination v2 -> (Logic.ifElse (Lists.null args) (Flows.pure original) (forElimination v2 args))
-                              Core.FunctionLambda v2 -> (Logic.ifElse (Lists.null args) (Flows.pure original) (forLambda v2 args))
-                              Core.FunctionPrimitive v2 -> (Flows.bind (Lexical.requirePrimitive v2) (\prim ->  
-                                let arity = (Arity.primitiveArity prim)
-                                in (Logic.ifElse (Equality.gt arity (Lists.length args)) (Flows.pure (applyToArguments original args)) (forPrimitive prim arity args))))) v1)
-                            Core.TermVariable v1 -> (Flows.bind (Lexical.dereferenceElement v1) (\mBinding -> Maybes.maybe (Flows.pure (applyToArguments original args)) (\binding -> applyIfNullary eager (Core.bindingTerm binding) args) mBinding))
-                            Core.TermLet v1 ->  
-                              let bindings = (Core.letBindings v1)
-                              in  
-                                let body = (Core.letBody v1)
-                                in  
-                                  let letExpr = (\b -> Core.TermLet (Core.Let {
-                                          Core.letBindings = [
-                                            b],
-                                          Core.letBody = (Core.TermVariable (Core.bindingName b))}))
-                                  in  
-                                    let expandBinding = (\b -> Core.Binding {
-                                            Core.bindingName = (Core.bindingName b),
-                                            Core.bindingTerm = (Rewriting.replaceFreeTermVariable (Core.bindingName b) (letExpr b) (Core.bindingTerm b)),
-                                            Core.bindingType = (Core.bindingType b)})
-                                    in  
-                                      let expandedBindings = (Lists.map expandBinding bindings)
-                                      in  
-                                        let substituteBinding = (\term -> \b -> Rewriting.replaceFreeTermVariable (Core.bindingName b) (Core.bindingTerm b) term)
-                                        in  
-                                          let substituteAll = (\bs -> \term -> Lists.foldl substituteBinding term bs)
-                                          in  
-                                            let expandedBody = (substituteAll expandedBindings body)
-                                            in (Flows.bind (reduce eager expandedBody) (\reducedBody -> applyIfNullary eager reducedBody args))
-                            _ -> (Flows.pure (applyToArguments original args))) stripped))
-            in  
-              let mapping = (\recurse -> \mid -> Flows.bind (Logic.ifElse (doRecurse eager mid) (recurse mid) (Flows.pure mid)) (\inner -> applyIfNullary eager inner []))
-              in (Rewriting.rewriteTermM mapping term)
-
--- | Whether a term is closed, i.e. represents a complete program
-termIsClosed :: (Core.Term -> Bool)
-termIsClosed term = (Sets.null (Rewriting.freeVariablesInTerm term))
-
--- | Whether a term has been fully reduced to a value
-termIsValue :: (t0 -> Core.Term -> Bool)
-termIsValue g term =  
-  let forList = (\els -> Lists.foldl (\b -> \t -> Logic.and b (termIsValue g t)) True els)
-  in  
-    let checkField = (\f -> termIsValue g (Core.fieldTerm f))
-    in  
-      let checkFields = (\fields -> Lists.foldl (\b -> \f -> Logic.and b (checkField f)) True fields)
-      in  
-        let functionIsValue = (\f -> (\x -> case x of
-                Core.FunctionElimination v1 -> ((\x -> case x of
-                  Core.EliminationWrap _ -> True
-                  Core.EliminationRecord _ -> True
-                  Core.EliminationUnion v2 -> (Logic.and (checkFields (Core.caseStatementCases v2)) (Maybes.maybe True (termIsValue g) (Core.caseStatementDefault v2)))) v1)
-                Core.FunctionLambda v1 -> (termIsValue g (Core.lambdaBody v1))
-                Core.FunctionPrimitive _ -> True) f)
-        in ((\x -> case x of
-          Core.TermApplication _ -> False
-          Core.TermEither v1 -> (Eithers.either (\l -> termIsValue g l) (\r -> termIsValue g r) v1)
-          Core.TermLiteral _ -> True
-          Core.TermFunction v1 -> (functionIsValue v1)
-          Core.TermList v1 -> (forList v1)
-          Core.TermMap v1 -> (Lists.foldl (\b -> \kv -> Logic.and b (Logic.and (termIsValue g (Pairs.first kv)) (termIsValue g (Pairs.second kv)))) True (Maps.toList v1))
-          Core.TermMaybe v1 -> (Maybes.maybe True (termIsValue g) v1)
-          Core.TermRecord v1 -> (checkFields (Core.recordFields v1))
-          Core.TermSet v1 -> (forList (Sets.toList v1))
-          Core.TermUnion v1 -> (checkField (Core.injectionField v1))
-          Core.TermUnit -> True
-          Core.TermVariable _ -> False
-          _ -> False) (Rewriting.deannotateTerm term))
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Encode.Core as Core_
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Extract.Core as Core__
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Math as Math
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Rewriting as Rewriting
+import qualified Hydra.Schemas as Schemas
+import qualified Hydra.Show.Errors as Errors_
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Alpha convert a variable in a term
+alphaConvert :: Core.Name -> Core.Name -> Core.Term -> Core.Term
+alphaConvert vold vnew term = Rewriting.replaceFreeTermVariable vold (Core.TermVariable vnew) term
+
+-- | Eagerly beta-reduce a type by substituting type arguments into type lambdas
+betaReduceType :: Context.Context -> Graph.Graph -> Core.Type -> Either (Context.InContext Errors.Error) Core.Type
+betaReduceType cx graph typ =
+
+      let reduceApp =
+              \app ->
+                let lhs = Core.applicationTypeFunction app
+                    rhs = Core.applicationTypeArgument app
+                in case lhs of
+                  Core.TypeAnnotated v0 -> Eithers.bind (reduceApp (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.annotatedTypeBody v0),
+                    Core.applicationTypeArgument = rhs})) (\a -> Right (Core.TypeAnnotated (Core.AnnotatedType {
+                    Core.annotatedTypeBody = a,
+                    Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v0)})))
+                  Core.TypeForall v0 -> betaReduceType cx graph (Rewriting.replaceFreeTypeVariable (Core.forallTypeParameter v0) rhs (Core.forallTypeBody v0))
+                  Core.TypeVariable v0 -> Eithers.bind (Schemas.requireType cx graph v0) (\t_ -> betaReduceType cx graph (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = t_,
+                    Core.applicationTypeArgument = rhs})))
+          mapExpr =
+                  \recurse -> \t ->
+                    let findApp =
+                            \r -> case r of
+                              Core.TypeApplication v0 -> reduceApp v0
+                              _ -> Right r
+                    in (Eithers.bind (recurse t) (\r -> findApp r))
+      in (Rewriting.rewriteTypeM mapExpr typ)
+
+-- | Apply the special rules:
+-- |     ((\x.e1) e2) == e1, where x does not appear free in e1
+-- |   and
+-- |      ((\x.e1) e2) = e1[x/e2]
+-- | These are both limited forms of beta reduction which help to "clean up" a term without fully evaluating it.
+contractTerm :: Core.Term -> Core.Term
+contractTerm term =
+
+      let rewrite =
+              \recurse -> \t ->
+                let rec = recurse t
+                in case rec of
+                  Core.TermApplication v0 ->
+                    let lhs = Core.applicationFunction v0
+                        rhs = Core.applicationArgument v0
+                    in case (Rewriting.deannotateTerm lhs) of
+                      Core.TermFunction v1 -> case v1 of
+                        Core.FunctionLambda v2 ->
+                          let v = Core.lambdaParameter v2
+                              body = Core.lambdaBody v2
+                          in (Logic.ifElse (Rewriting.isFreeVariableInTerm v body) body (Rewriting.replaceFreeTermVariable v rhs body))
+                        _ -> rec
+                      _ -> rec
+                  _ -> rec
+      in (Rewriting.rewriteTerm rewrite term)
+
+countPrimitiveInvocations :: Bool
+countPrimitiveInvocations = True
+
+-- | Recursively transform arbitrary terms like 'add 42' into terms like '\x.add 42 x', in which the implicit parameters of primitive functions and eliminations are made into explicit lambda parameters. Variable references are not expanded. This is useful for targets like Python with weaker support for currying than Hydra or Haskell. Note: this is a "trusty" function which assumes the graph is well-formed, i.e. no dangling references.
+etaExpandTerm :: Graph.Graph -> Core.Term -> Core.Term
+etaExpandTerm graph term =
+
+      let expand =
+              \args -> \arity -> \t ->
+                let apps =
+                        Lists.foldl (\lhs -> \arg -> Core.TermApplication (Core.Application {
+                          Core.applicationFunction = lhs,
+                          Core.applicationArgument = arg})) t args
+                    is = Logic.ifElse (Equality.lte arity (Lists.length args)) [] (Math.range 1 (Math.sub arity (Lists.length args)))
+                    pad =
+                            \indices -> \t -> Logic.ifElse (Lists.null indices) t (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name (Strings.cat2 "v" (Literals.showInt32 (Lists.head indices)))),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (pad (Lists.tail indices) (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = t,
+                                Core.applicationArgument = (Core.TermVariable (Core.Name (Strings.cat2 "v" (Literals.showInt32 (Lists.head indices)))))})))})))
+                in (pad is apps)
+          rewrite =
+                  \args -> \recurse -> \t ->
+                    let afterRecursion = \term -> expand args (etaExpansionArity graph term) term
+                        t2 = Rewriting.detypeTerm t
+                    in case t2 of
+                      Core.TermApplication v0 ->
+                        let lhs = Core.applicationFunction v0
+                            rhs = Core.applicationArgument v0
+                            erhs = rewrite [] recurse rhs
+                        in (rewrite (Lists.cons erhs args) recurse lhs)
+                      _ -> afterRecursion (recurse t2)
+      in (contractTerm (Rewriting.rewriteTerm (rewrite []) term))
+
+-- | Recursively transform terms to eliminate partial application, e.g. 'add 42' becomes '\x.add 42 x'. Uses the Graph to look up types for arity calculation. Bare primitives and variables are NOT expanded; eliminations and partial applications are. This version properly tracks the Graph through nested scopes.
+etaExpandTermNew :: Graph.Graph -> Core.Term -> Core.Term
+etaExpandTermNew tx0 term0 =
+
+      let primTypes =
+              Maps.fromList (Lists.map (\_gpt_p -> (Graph.primitiveName _gpt_p, (Graph.primitiveType _gpt_p))) (Maps.elems (Graph.graphPrimitives tx0)))
+          termArityWithContext =
+                  \tx -> \term -> case term of
+                    Core.TermAnnotated v0 -> termArityWithContext tx (Core.annotatedTermBody v0)
+                    Core.TermApplication v0 -> Math.sub (termArityWithContext tx (Core.applicationFunction v0)) 1
+                    Core.TermFunction v0 -> case v0 of
+                      Core.FunctionElimination _ -> 1
+                      Core.FunctionLambda _ -> 0
+                      Core.FunctionPrimitive v1 -> Maybes.maybe 0 Arity.typeSchemeArity (Maps.lookup v1 primTypes)
+                    Core.TermLet v0 -> termArityWithContext (Rewriting.extendGraphForLet (\_ -> \_ -> Nothing) tx v0) (Core.letBody v0)
+                    Core.TermTypeLambda v0 -> termArityWithContext (Rewriting.extendGraphForTypeLambda tx v0) (Core.typeLambdaBody v0)
+                    Core.TermTypeApplication v0 -> termArityWithContext tx (Core.typeApplicationTermBody v0)
+                    Core.TermVariable v0 -> Maybes.maybe 0 Arity.typeArity (Maybes.map Rewriting.typeSchemeToFType (Maps.lookup v0 (Graph.graphBoundTypes tx)))
+                    _ -> 0
+          domainTypes =
+                  \n -> \mt -> Logic.ifElse (Equality.lte n 0) [] (Maybes.maybe (Lists.map (\_ -> Nothing) (Math.range 1 n)) (\typ -> case typ of
+                    Core.TypeFunction v0 -> Lists.cons (Just (Core.functionTypeDomain v0)) (domainTypes (Math.sub n 1) (Just (Core.functionTypeCodomain v0)))
+                    Core.TypeAnnotated v0 -> domainTypes n (Just (Core.annotatedTypeBody v0))
+                    Core.TypeApplication v0 -> domainTypes n (Just (Core.applicationTypeFunction v0))
+                    Core.TypeForall _ -> Lists.map (\_ -> Nothing) (Math.range 1 n)
+                    _ -> Lists.map (\_ -> Nothing) (Math.range 1 n)) mt)
+          peelFunctionDomains =
+                  \mtyp -> \n -> Logic.ifElse (Equality.lte n 0) mtyp (Maybes.maybe Nothing (\typ -> case typ of
+                    Core.TypeFunction v0 -> peelFunctionDomains (Just (Core.functionTypeCodomain v0)) (Math.sub n 1)
+                    Core.TypeAnnotated v0 -> peelFunctionDomains (Just (Core.annotatedTypeBody v0)) n
+                    Core.TypeApplication v0 -> peelFunctionDomains (Just (Core.applicationTypeFunction v0)) n
+                    Core.TypeForall _ -> Nothing
+                    _ -> Nothing) mtyp)
+          expand =
+                  \alwaysPad -> \args -> \arity -> \headTyp -> \head ->
+                    let applied =
+                            Lists.foldl (\lhs -> \arg -> Core.TermApplication (Core.Application {
+                              Core.applicationFunction = lhs,
+                              Core.applicationArgument = arg})) head args
+                        numArgs = Lists.length args
+                        needed = Math.sub arity numArgs
+                    in (Logic.ifElse (Logic.and (Equality.gt needed 0) (Logic.or alwaysPad (Equality.gt numArgs 0))) (
+                      let indices = Math.range 1 needed
+                          remainingType = peelFunctionDomains headTyp numArgs
+                          domains = domainTypes needed remainingType
+                          codomainType = peelFunctionDomains remainingType needed
+                          fullyAppliedRaw =
+                                  Lists.foldl (\body -> \i ->
+                                    let vn = Core.Name (Strings.cat2 "v" (Literals.showInt32 i))
+                                    in (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = body,
+                                      Core.applicationArgument = (Core.TermVariable vn)}))) applied indices
+                          fullyApplied =
+                                  Maybes.maybe fullyAppliedRaw (\ct -> Core.TermAnnotated (Core.AnnotatedTerm {
+                                    Core.annotatedTermBody = fullyAppliedRaw,
+                                    Core.annotatedTermAnnotation = (Maps.singleton (Core.Name "type") (Core_.type_ ct))})) codomainType
+                          indexedDomains = Lists.zip indices domains
+                      in (Lists.foldl (\body -> \idPair ->
+                        let i = Pairs.first idPair
+                            dom = Pairs.second idPair
+                            vn = Core.Name (Strings.cat2 "v" (Literals.showInt32 i))
+                        in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = vn,
+                          Core.lambdaDomain = dom,
+                          Core.lambdaBody = body})))) fullyApplied (Lists.reverse indexedDomains))) applied)
+          rewriteWithArgs =
+                  \args -> \tx -> \term ->
+                    let recurse = \tx1 -> \term1 -> rewriteWithArgs [] tx1 term1
+                        termHeadType =
+                                \tx2 -> \trm2 -> case trm2 of
+                                  Core.TermAnnotated v0 -> termHeadType tx2 (Core.annotatedTermBody v0)
+                                  Core.TermFunction v0 -> case v0 of
+                                    Core.FunctionPrimitive v1 -> Maybes.map Rewriting.typeSchemeToFType (Maps.lookup v1 primTypes)
+                                    _ -> Nothing
+                                  Core.TermLet v0 -> termHeadType (Rewriting.extendGraphForLet (\_ -> \_ -> Nothing) tx2 v0) (Core.letBody v0)
+                                  Core.TermTypeLambda v0 -> termHeadType (Rewriting.extendGraphForTypeLambda tx2 v0) (Core.typeLambdaBody v0)
+                                  Core.TermTypeApplication v0 -> Maybes.bind (termHeadType tx2 (Core.typeApplicationTermBody v0)) (\htyp2 -> case htyp2 of
+                                    Core.TypeForall v1 -> Just (Rewriting.replaceFreeTypeVariable (Core.forallTypeParameter v1) (Core.typeApplicationTermType v0) (Core.forallTypeBody v1))
+                                    _ -> Just htyp2)
+                                  Core.TermVariable v0 -> Maybes.map Rewriting.typeSchemeToFType (Maps.lookup v0 (Graph.graphBoundTypes tx2))
+                                  _ -> Nothing
+                        afterRecursion =
+                                \trm ->
+                                  let arity = termArityWithContext tx trm
+                                      hType = termHeadType tx trm
+                                  in (expand False args arity hType trm)
+                        forField =
+                                \f -> Core.Field {
+                                  Core.fieldName = (Core.fieldName f),
+                                  Core.fieldTerm = (recurse tx (Core.fieldTerm f))}
+                        forCaseBranch =
+                                \f ->
+                                  let branchBody = recurse tx (Core.fieldTerm f)
+                                      arty = termArityWithContext tx branchBody
+                                      branchHType = termHeadType tx branchBody
+                                  in Core.Field {
+                                    Core.fieldName = (Core.fieldName f),
+                                    Core.fieldTerm = (expand True [] arty branchHType branchBody)}
+                        forElimination =
+                                \elm -> case elm of
+                                  Core.EliminationRecord v0 -> Core.EliminationRecord v0
+                                  Core.EliminationUnion v0 -> Core.EliminationUnion (Core.CaseStatement {
+                                    Core.caseStatementTypeName = (Core.caseStatementTypeName v0),
+                                    Core.caseStatementDefault = (Maybes.map (\t1 -> recurse tx t1) (Core.caseStatementDefault v0)),
+                                    Core.caseStatementCases = (Lists.map forCaseBranch (Core.caseStatementCases v0))})
+                                  Core.EliminationWrap v0 -> Core.EliminationWrap v0
+                        forMap =
+                                \mp ->
+                                  let forPair = \pr -> (recurse tx (Pairs.first pr), (recurse tx (Pairs.second pr)))
+                                  in (Maps.fromList (Lists.map forPair (Maps.toList mp)))
+                    in case term of
+                      Core.TermAnnotated v0 -> afterRecursion (Core.TermAnnotated (Core.AnnotatedTerm {
+                        Core.annotatedTermBody = (recurse tx (Core.annotatedTermBody v0)),
+                        Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)}))
+                      Core.TermApplication v0 ->
+                        let rhs = rewriteWithArgs [] tx (Core.applicationArgument v0)
+                        in (rewriteWithArgs (Lists.cons rhs args) tx (Core.applicationFunction v0))
+                      Core.TermEither v0 -> afterRecursion (Core.TermEither (Eithers.either (\l -> Left (recurse tx l)) (\r -> Right (recurse tx r)) v0))
+                      Core.TermFunction v0 -> case v0 of
+                        Core.FunctionElimination v1 ->
+                          let padElim =
+                                  case v1 of
+                                    Core.EliminationRecord _ -> False
+                                    Core.EliminationUnion _ -> True
+                                    Core.EliminationWrap _ -> False
+                              elimTerm = Core.TermFunction (Core.FunctionElimination (forElimination v1))
+                              elimHeadType =
+                                      case v1 of
+                                        Core.EliminationUnion v2 -> Just (Core.TypeFunction (Core.FunctionType {
+                                          Core.functionTypeDomain = (Core.TypeVariable (Core.caseStatementTypeName v2)),
+                                          Core.functionTypeCodomain = Core.TypeUnit}))
+                                        _ -> Nothing
+                          in (expand padElim args 1 elimHeadType elimTerm)
+                        Core.FunctionLambda v1 ->
+                          let tx1 = Rewriting.extendGraphForLambda tx v1
+                              body = rewriteWithArgs [] tx1 (Core.lambdaBody v1)
+                              result =
+                                      Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.lambdaParameter v1),
+                                        Core.lambdaDomain = (Core.lambdaDomain v1),
+                                        Core.lambdaBody = body}))
+                              arty = termArityWithContext tx result
+                          in (expand False args arty Nothing result)
+                        Core.FunctionPrimitive v1 ->
+                          let arty = termArityWithContext tx term
+                              primType = Maybes.map (\ts -> Core.typeSchemeType ts) (Maps.lookup v1 primTypes)
+                          in (expand False args arty primType term)
+                      Core.TermLet v0 ->
+                        let tx1 = Rewriting.extendGraphForLet (\_ -> \_ -> Nothing) tx v0
+                            mapBinding =
+                                    \b -> Core.Binding {
+                                      Core.bindingName = (Core.bindingName b),
+                                      Core.bindingTerm = (rewriteWithArgs [] tx1 (Core.bindingTerm b)),
+                                      Core.bindingType = (Core.bindingType b)}
+                            result =
+                                    Core.TermLet (Core.Let {
+                                      Core.letBindings = (Lists.map mapBinding (Core.letBindings v0)),
+                                      Core.letBody = (rewriteWithArgs [] tx1 (Core.letBody v0))})
+                        in (afterRecursion result)
+                      Core.TermList v0 -> afterRecursion (Core.TermList (Lists.map (\el -> recurse tx el) v0))
+                      Core.TermLiteral v0 -> Core.TermLiteral v0
+                      Core.TermMap v0 -> afterRecursion (Core.TermMap (forMap v0))
+                      Core.TermMaybe v0 -> afterRecursion (Core.TermMaybe (Maybes.map (\v -> recurse tx v) v0))
+                      Core.TermPair v0 -> afterRecursion (Core.TermPair (recurse tx (Pairs.first v0), (recurse tx (Pairs.second v0))))
+                      Core.TermRecord v0 -> afterRecursion (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.recordTypeName v0),
+                        Core.recordFields = (Lists.map forField (Core.recordFields v0))}))
+                      Core.TermSet v0 -> afterRecursion (Core.TermSet (Sets.fromList (Lists.map (\el -> recurse tx el) (Sets.toList v0))))
+                      Core.TermTypeApplication v0 -> afterRecursion (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (recurse tx (Core.typeApplicationTermBody v0)),
+                        Core.typeApplicationTermType = (Core.typeApplicationTermType v0)}))
+                      Core.TermTypeLambda v0 ->
+                        let tx1 = Rewriting.extendGraphForTypeLambda tx v0
+                            result =
+                                    Core.TermTypeLambda (Core.TypeLambda {
+                                      Core.typeLambdaParameter = (Core.typeLambdaParameter v0),
+                                      Core.typeLambdaBody = (rewriteWithArgs [] tx1 (Core.typeLambdaBody v0))})
+                        in (afterRecursion result)
+                      Core.TermUnion v0 -> afterRecursion (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.injectionTypeName v0),
+                        Core.injectionField = (forField (Core.injectionField v0))}))
+                      Core.TermUnit -> Core.TermUnit
+                      Core.TermVariable v0 ->
+                        let arty = termArityWithContext tx term
+                            varType = Maybes.map Rewriting.typeSchemeToFType (Maps.lookup v0 (Graph.graphBoundTypes tx))
+                        in (expand False args arty varType term)
+                      Core.TermWrap v0 -> afterRecursion (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.wrappedTermTypeName v0),
+                        Core.wrappedTermBody = (recurse tx (Core.wrappedTermBody v0))}))
+      in (contractTerm (rewriteWithArgs [] tx0 term0))
+
+-- | Recursively transform arbitrary terms like 'add 42' into terms like '\x.add 42 x', eliminating partial application. Variable references are not expanded. This is useful for targets like Python with weaker support for currying than Hydra or Haskell. Note: this is a "trusty" function which assumes the graph is well-formed, i.e. no dangling references. It also assumes that type inference has already been performed. After eta expansion, type inference needs to be performed again, as new, untyped lambdas may have been added.
+etaExpandTypedTerm :: Context.Context -> Graph.Graph -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+etaExpandTypedTerm cx tx0 term0 =
+
+      let rewrite =
+              \topLevel -> \forced -> \typeArgs -> \recurse -> \tx -> \term ->
+                let rewriteSpine =
+                        \term -> case term of
+                          Core.TermAnnotated v0 -> Eithers.bind (rewriteSpine (Core.annotatedTermBody v0)) (\body ->
+                            let ann = Core.annotatedTermAnnotation v0
+                            in (Right (Core.TermAnnotated (Core.AnnotatedTerm {
+                              Core.annotatedTermBody = body,
+                              Core.annotatedTermAnnotation = ann}))))
+                          Core.TermApplication v0 ->
+                            let l = Logic.ifElse False [
+                                  Core.TypeLiteral Core.LiteralTypeString] []
+                            in (Eithers.bind (rewriteSpine (Core.applicationFunction v0)) (\lhs -> Eithers.bind (rewrite True False l recurse tx (Core.applicationArgument v0)) (\rhs -> Right (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = lhs,
+                              Core.applicationArgument = rhs})))))
+                          Core.TermTypeApplication v0 -> Eithers.bind (rewriteSpine (Core.typeApplicationTermBody v0)) (\body ->
+                            let typ = Core.typeApplicationTermType v0
+                            in (Right (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = body,
+                              Core.typeApplicationTermType = typ}))))
+                          _ -> rewrite False False [] recurse tx term
+                    arityOf =
+                            \tx -> \term ->
+                              let dflt = Eithers.map (\_tc -> Arity.typeArity (Pairs.first _tc)) (Checking.typeOf cx tx [] term)
+                                  forFunction =
+                                          \tx -> \f -> case f of
+                                            Core.FunctionElimination _ -> Right 1
+                                            Core.FunctionLambda v0 ->
+                                              let txl = Rewriting.extendGraphForLambda tx v0
+                                              in (arityOf txl (Core.lambdaBody v0))
+                                            Core.FunctionPrimitive v0 -> Eithers.map (\_ts -> Arity.typeSchemeArity _ts) (Lexical.requirePrimitiveType cx tx v0)
+                              in case term of
+                                Core.TermAnnotated v0 -> arityOf tx (Core.annotatedTermBody v0)
+                                Core.TermFunction v0 -> forFunction tx v0
+                                Core.TermLet v0 ->
+                                  let txl = Rewriting.extendGraphForLet (\_ -> \_ -> Nothing) tx v0
+                                  in (arityOf txl (Core.letBody v0))
+                                Core.TermTypeApplication v0 -> arityOf tx (Core.typeApplicationTermBody v0)
+                                Core.TermTypeLambda v0 ->
+                                  let txt = Rewriting.extendGraphForTypeLambda tx v0
+                                  in (arityOf txt (Core.typeLambdaBody v0))
+                                Core.TermVariable v0 -> Maybes.maybe (Eithers.map (\_tc -> Arity.typeArity (Pairs.first _tc)) (Checking.typeOf cx tx [] (Core.TermVariable v0))) (\t -> Right (Arity.typeArity t)) (Maybes.map Rewriting.typeSchemeToFType (Maps.lookup v0 (Graph.graphBoundTypes tx)))
+                                _ -> dflt
+                    extraVariables = \n -> Lists.map (\i -> Core.Name (Strings.cat2 "v" (Literals.showInt32 i))) (Math.range 1 n)
+                    pad =
+                            \vars -> \body -> Logic.ifElse (Lists.null vars) body (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Lists.head vars),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (pad (Lists.tail vars) (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = body,
+                                Core.applicationArgument = (Core.TermVariable (Lists.head vars))})))})))
+                    padn = \n -> \body -> pad (extraVariables n) body
+                    unwind =
+                            \term -> Lists.foldl (\e -> \t -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = e,
+                              Core.typeApplicationTermType = t})) term typeArgs
+                    forceExpansion =
+                            \t -> Eithers.bind (Checking.typeOf cx tx [] t) (\typCx ->
+                              let arity = Arity.typeArity (Pairs.first typCx)
+                              in (Right (padn arity (unwind t))))
+                    recurseOrForce = \term -> Logic.ifElse forced (forceExpansion term) (recurse tx (unwind term))
+                    forCase =
+                            \f -> Eithers.bind (rewrite False True [] recurse tx (Core.fieldTerm f)) (\r -> Right (Core.Field {
+                              Core.fieldName = (Core.fieldName f),
+                              Core.fieldTerm = r}))
+                    forCaseStatement =
+                            \cs ->
+                              let tname = Core.caseStatementTypeName cs
+                                  dflt = Core.caseStatementDefault cs
+                                  cases = Core.caseStatementCases cs
+                              in (Eithers.bind (Eithers.mapMaybe (rewrite False False [] recurse tx) dflt) (\rdflt -> Eithers.bind (Eithers.mapList forCase cases) (\rcases -> Right (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = tname,
+                                Core.caseStatementDefault = rdflt,
+                                Core.caseStatementCases = rcases})))))))
+                    forElimination =
+                            \elm ->
+                              let checkBase =
+                                      \elm -> case elm of
+                                        Core.EliminationUnion v0 -> forCaseStatement v0
+                                        _ -> recurse tx term
+                              in (Eithers.bind (Eithers.map unwind (checkBase elm)) (\base -> Right (Logic.ifElse (Logic.or topLevel forced) (padn 1 base) base)))
+                in case term of
+                  Core.TermApplication v0 ->
+                    let lhs = Core.applicationFunction v0
+                        rhs = Core.applicationArgument v0
+                    in (Eithers.bind (rewrite True False [] recurse tx rhs) (\rhs2 -> Eithers.bind (arityOf tx lhs) (\lhsarity -> Eithers.bind (rewriteSpine lhs) (\lhs2 ->
+                      let a2 =
+                              Core.TermApplication (Core.Application {
+                                Core.applicationFunction = lhs2,
+                                Core.applicationArgument = rhs2})
+                      in (Right (Logic.ifElse (Equality.gt lhsarity 1) (padn (Math.sub lhsarity 1) a2) a2))))))
+                  Core.TermFunction v0 -> case v0 of
+                    Core.FunctionElimination v1 -> forElimination v1
+                    Core.FunctionLambda v1 ->
+                      let txl = Rewriting.extendGraphForLambda tx v1
+                      in (Eithers.map unwind (recurse txl term))
+                    _ -> recurseOrForce term
+                  Core.TermLet v0 ->
+                    let txlt = Rewriting.extendGraphForLet (\_ -> \_ -> Nothing) tx v0
+                    in (recurse txlt term)
+                  Core.TermTypeApplication v0 -> rewrite topLevel forced (Lists.cons (Core.typeApplicationTermType v0) typeArgs) recurse tx (Core.typeApplicationTermBody v0)
+                  Core.TermTypeLambda v0 ->
+                    let txt = Rewriting.extendGraphForTypeLambda tx v0
+                    in (recurse txt term)
+                  _ -> recurseOrForce term
+      in (Rewriting.rewriteTermWithContextM (rewrite True False []) tx0 term0)
+
+-- | Calculate the arity for eta expansion Note: this is a "trusty" function which assumes the graph is well-formed, i.e. no dangling references.
+etaExpansionArity :: Graph.Graph -> Core.Term -> Int
+etaExpansionArity graph term =
+    case term of
+      Core.TermAnnotated v0 -> etaExpansionArity graph (Core.annotatedTermBody v0)
+      Core.TermApplication v0 -> Math.sub (etaExpansionArity graph (Core.applicationFunction v0)) 1
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionElimination _ -> 1
+        Core.FunctionLambda _ -> 0
+        Core.FunctionPrimitive v1 -> Arity.primitiveArity (Maybes.fromJust (Lexical.lookupPrimitive graph v1))
+      Core.TermTypeLambda v0 -> etaExpansionArity graph (Core.typeLambdaBody v0)
+      Core.TermTypeApplication v0 -> etaExpansionArity graph (Core.typeApplicationTermBody v0)
+      Core.TermVariable v0 -> Maybes.maybe 0 (\ts -> Arity.typeArity (Core.typeSchemeType ts)) (Maybes.bind (Lexical.lookupElement graph v0) (\b -> Core.bindingType b))
+      _ -> 0
+
+-- | Eta-reduce a term by removing redundant lambda abstractions
+etaReduceTerm :: Core.Term -> Core.Term
+etaReduceTerm term =
+
+      let noChange = term
+          reduceLambda =
+                  \l ->
+                    let v = Core.lambdaParameter l
+                        d = Core.lambdaDomain l
+                        body = Core.lambdaBody l
+                    in case (etaReduceTerm body) of
+                      Core.TermAnnotated v0 -> reduceLambda (Core.Lambda {
+                        Core.lambdaParameter = v,
+                        Core.lambdaDomain = d,
+                        Core.lambdaBody = (Core.annotatedTermBody v0)})
+                      Core.TermApplication v0 ->
+                        let lhs = Core.applicationFunction v0
+                            rhs = Core.applicationArgument v0
+                        in case (etaReduceTerm rhs) of
+                          Core.TermAnnotated v1 -> reduceLambda (Core.Lambda {
+                            Core.lambdaParameter = v,
+                            Core.lambdaDomain = d,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = lhs,
+                              Core.applicationArgument = (Core.annotatedTermBody v1)}))})
+                          Core.TermVariable v1 -> Logic.ifElse (Logic.and (Equality.equal (Core.unName v) (Core.unName v1)) (Logic.not (Rewriting.isFreeVariableInTerm v lhs))) (etaReduceTerm lhs) noChange
+                          _ -> noChange
+                      _ -> noChange
+      in case term of
+        Core.TermAnnotated v0 -> Core.TermAnnotated (Core.AnnotatedTerm {
+          Core.annotatedTermBody = (etaReduceTerm (Core.annotatedTermBody v0)),
+          Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})
+        Core.TermFunction v0 -> case v0 of
+          Core.FunctionLambda v1 -> reduceLambda v1
+          _ -> noChange
+        _ -> noChange
+
+-- | A term evaluation function which is alternatively lazy or eager
+reduceTerm :: Context.Context -> Graph.Graph -> Bool -> Core.Term -> Either (Context.InContext Errors.Error) Core.Term
+reduceTerm cx graph eager term =
+
+      let reduce = \eager -> reduceTerm cx graph eager
+          doRecurse =
+                  \eager -> \term ->
+                    let isNonLambda =
+                            \f -> case f of
+                              Core.FunctionLambda _ -> False
+                              _ -> True
+                        isNonLambdaTerm =
+                                case term of
+                                  Core.TermFunction v0 -> isNonLambda v0
+                                  Core.TermLet _ -> False
+                                  _ -> True
+                    in (Logic.and eager isNonLambdaTerm)
+          reduceArg = \eager -> \arg -> Logic.ifElse eager (Right arg) (reduce False arg)
+          applyToArguments =
+                  \fun -> \args -> Logic.ifElse (Lists.null args) fun (applyToArguments (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = fun,
+                    Core.applicationArgument = (Lists.head args)})) (Lists.tail args))
+          mapErrorToString =
+                  \ic -> Context.InContext {
+                    Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Errors_.error (Context.inContextObject ic)))),
+                    Context.inContextContext = (Context.inContextContext ic)}
+          applyElimination =
+                  \elm -> \reducedArg -> case elm of
+                    Core.EliminationRecord v0 -> Eithers.bind (Core__.record cx (Core.projectionTypeName v0) graph (Rewriting.deannotateTerm reducedArg)) (\fields ->
+                      let matchingFields = Lists.filter (\f -> Equality.equal (Core.fieldName f) (Core.projectionField v0)) fields
+                      in (Logic.ifElse (Lists.null matchingFields) (Left (Context.InContext {
+                        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+                          "no such field: ",
+                          (Core.unName (Core.projectionField v0)),
+                          " in ",
+                          (Core.unName (Core.projectionTypeName v0)),
+                          " record"]))),
+                        Context.inContextContext = cx})) (Right (Core.fieldTerm (Lists.head matchingFields)))))
+                    Core.EliminationUnion v0 -> Eithers.bind (Core__.injection cx (Core.caseStatementTypeName v0) graph reducedArg) (\field ->
+                      let matchingFields = Lists.filter (\f -> Equality.equal (Core.fieldName f) (Core.fieldName field)) (Core.caseStatementCases v0)
+                      in (Logic.ifElse (Lists.null matchingFields) (Maybes.maybe (Left (Context.InContext {
+                        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+                          "no such field ",
+                          (Core.unName (Core.fieldName field)),
+                          " in ",
+                          (Core.unName (Core.caseStatementTypeName v0)),
+                          " case statement"]))),
+                        Context.inContextContext = cx})) (\x -> Right x) (Core.caseStatementDefault v0)) (Right (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.fieldTerm (Lists.head matchingFields)),
+                        Core.applicationArgument = (Core.fieldTerm field)})))))
+                    Core.EliminationWrap v0 -> Core__.wrap cx v0 graph reducedArg
+          applyIfNullary =
+                  \eager -> \original -> \args ->
+                    let stripped = Rewriting.deannotateTerm original
+                        forElimination =
+                                \elm -> \args ->
+                                  let arg = Lists.head args
+                                      remainingArgs = Lists.tail args
+                                  in (Eithers.bind (reduceArg eager (Rewriting.deannotateTerm arg)) (\reducedArg -> Eithers.bind (Eithers.bind (applyElimination elm reducedArg) (reduce eager)) (\reducedResult -> applyIfNullary eager reducedResult remainingArgs)))
+                        forLambda =
+                                \l -> \args ->
+                                  let param = Core.lambdaParameter l
+                                      body = Core.lambdaBody l
+                                      arg = Lists.head args
+                                      remainingArgs = Lists.tail args
+                                  in (Eithers.bind (reduce eager (Rewriting.deannotateTerm arg)) (\reducedArg -> Eithers.bind (reduce eager (Rewriting.replaceFreeTermVariable param reducedArg body)) (\reducedResult -> applyIfNullary eager reducedResult remainingArgs)))
+                        forPrimitive =
+                                \prim -> \arity -> \args ->
+                                  let argList = Lists.take arity args
+                                      remainingArgs = Lists.drop arity args
+                                  in (Eithers.bind (Eithers.mapList (reduceArg eager) argList) (\reducedArgs ->
+                                    let strippedArgs = Lists.map Rewriting.deannotateTerm reducedArgs
+                                    in (Eithers.bind (Eithers.bimap mapErrorToString (\x -> x) (Graph.primitiveImplementation prim cx graph strippedArgs)) (\primResult -> Eithers.bind (reduce eager primResult) (\reducedResult -> applyIfNullary eager reducedResult remainingArgs)))))
+                    in case stripped of
+                      Core.TermApplication v0 -> applyIfNullary eager (Core.applicationFunction v0) (Lists.cons (Core.applicationArgument v0) args)
+                      Core.TermFunction v0 -> case v0 of
+                        Core.FunctionElimination v1 -> Logic.ifElse (Lists.null args) (Right original) (forElimination v1 args)
+                        Core.FunctionLambda v1 -> Logic.ifElse (Lists.null args) (Right original) (forLambda v1 args)
+                        Core.FunctionPrimitive v1 -> Eithers.bind (Lexical.requirePrimitive cx graph v1) (\prim ->
+                          let arity = Arity.primitiveArity prim
+                          in (Logic.ifElse (Equality.gt arity (Lists.length args)) (Right (applyToArguments original args)) (forPrimitive prim arity args)))
+                      Core.TermVariable v0 ->
+                        let mBinding = Lexical.dereferenceElement graph v0
+                        in (Maybes.maybe (Right (applyToArguments original args)) (\binding -> applyIfNullary eager (Core.bindingTerm binding) args) mBinding)
+                      Core.TermLet v0 ->
+                        let bindings = Core.letBindings v0
+                            body = Core.letBody v0
+                            letExpr =
+                                    \b -> Core.TermLet (Core.Let {
+                                      Core.letBindings = [
+                                        b],
+                                      Core.letBody = (Core.TermVariable (Core.bindingName b))})
+                            expandBinding =
+                                    \b -> Core.Binding {
+                                      Core.bindingName = (Core.bindingName b),
+                                      Core.bindingTerm = (Rewriting.replaceFreeTermVariable (Core.bindingName b) (letExpr b) (Core.bindingTerm b)),
+                                      Core.bindingType = (Core.bindingType b)}
+                            expandedBindings = Lists.map expandBinding bindings
+                            substituteBinding = \term -> \b -> Rewriting.replaceFreeTermVariable (Core.bindingName b) (Core.bindingTerm b) term
+                            substituteAll = \bs -> \term -> Lists.foldl substituteBinding term bs
+                            expandedBody = substituteAll expandedBindings body
+                        in (Eithers.bind (reduce eager expandedBody) (\reducedBody -> applyIfNullary eager reducedBody args))
+                      _ -> Right (applyToArguments original args)
+          mapping =
+                  \recurse -> \mid -> Eithers.bind (Logic.ifElse (doRecurse eager mid) (recurse mid) (Right mid)) (\inner -> applyIfNullary eager inner [])
+      in (Rewriting.rewriteTermM mapping term)
+
+-- | Whether a term is closed, i.e. represents a complete program
+termIsClosed :: Core.Term -> Bool
+termIsClosed term = Sets.null (Rewriting.freeVariablesInTerm term)
+
+-- | Whether a term has been fully reduced to a value
+termIsValue :: Core.Term -> Bool
+termIsValue term =
+
+      let forList = \els -> Lists.foldl (\b -> \t -> Logic.and b (termIsValue t)) True els
+          checkField = \f -> termIsValue (Core.fieldTerm f)
+          checkFields = \fields -> Lists.foldl (\b -> \f -> Logic.and b (checkField f)) True fields
+          functionIsValue =
+                  \f -> case f of
+                    Core.FunctionElimination v0 -> case v0 of
+                      Core.EliminationWrap _ -> True
+                      Core.EliminationRecord _ -> True
+                      Core.EliminationUnion v1 -> Logic.and (checkFields (Core.caseStatementCases v1)) (Maybes.maybe True termIsValue (Core.caseStatementDefault v1))
+                    Core.FunctionLambda v0 -> termIsValue (Core.lambdaBody v0)
+                    Core.FunctionPrimitive _ -> True
+      in case (Rewriting.deannotateTerm term) of
+        Core.TermApplication _ -> False
+        Core.TermEither v0 -> Eithers.either (\l -> termIsValue l) (\r -> termIsValue r) v0
+        Core.TermLiteral _ -> True
+        Core.TermFunction v0 -> functionIsValue v0
+        Core.TermList v0 -> forList v0
+        Core.TermMap v0 -> Lists.foldl (\b -> \kv -> Logic.and b (Logic.and (termIsValue (Pairs.first kv)) (termIsValue (Pairs.second kv)))) True (Maps.toList v0)
+        Core.TermMaybe v0 -> Maybes.maybe True termIsValue v0
+        Core.TermRecord v0 -> checkFields (Core.recordFields v0)
+        Core.TermSet v0 -> forList (Sets.toList v0)
+        Core.TermUnion v0 -> checkField (Core.injectionField v0)
+        Core.TermUnit -> True
+        Core.TermVariable _ -> False
+        _ -> False
diff --git a/src/gen-main/haskell/Hydra/Reflect.hs b/src/gen-main/haskell/Hydra/Reflect.hs
--- a/src/gen-main/haskell/Hydra/Reflect.hs
+++ b/src/gen-main/haskell/Hydra/Reflect.hs
@@ -16,227 +16,248 @@
 import qualified Data.Set as S
 
 -- | Find the elimination inject (constructor) for a given elimination term
-eliminationVariant :: (Core.Elimination -> Variants.EliminationVariant)
-eliminationVariant x = case x of
-  Core.EliminationRecord _ -> Variants.EliminationVariantRecord
-  Core.EliminationUnion _ -> Variants.EliminationVariantUnion
-  Core.EliminationWrap _ -> Variants.EliminationVariantWrap
+eliminationVariant :: Core.Elimination -> Variants.EliminationVariant
+eliminationVariant x =
+    case x of
+      Core.EliminationRecord _ -> Variants.EliminationVariantRecord
+      Core.EliminationUnion _ -> Variants.EliminationVariantUnion
+      Core.EliminationWrap _ -> Variants.EliminationVariantWrap
 
 -- | All elimination variants (constructors), in a canonical order
 eliminationVariants :: [Variants.EliminationVariant]
-eliminationVariants = [
-  Variants.EliminationVariantRecord,
-  Variants.EliminationVariantUnion,
-  Variants.EliminationVariantWrap]
+eliminationVariants =
+    [
+      Variants.EliminationVariantRecord,
+      Variants.EliminationVariantUnion,
+      Variants.EliminationVariantWrap]
 
 -- | Find the precision of a given floating-point type
-floatTypePrecision :: (Core.FloatType -> Util.Precision)
-floatTypePrecision x = case x of
-  Core.FloatTypeBigfloat -> Util.PrecisionArbitrary
-  Core.FloatTypeFloat32 -> (Util.PrecisionBits 32)
-  Core.FloatTypeFloat64 -> (Util.PrecisionBits 64)
+floatTypePrecision :: Core.FloatType -> Util.Precision
+floatTypePrecision x =
+    case x of
+      Core.FloatTypeBigfloat -> Util.PrecisionArbitrary
+      Core.FloatTypeFloat32 -> Util.PrecisionBits 32
+      Core.FloatTypeFloat64 -> Util.PrecisionBits 64
 
 -- | All floating-point types in a canonical order
 floatTypes :: [Core.FloatType]
-floatTypes = [
-  Core.FloatTypeBigfloat,
-  Core.FloatTypeFloat32,
-  Core.FloatTypeFloat64]
+floatTypes =
+    [
+      Core.FloatTypeBigfloat,
+      Core.FloatTypeFloat32,
+      Core.FloatTypeFloat64]
 
 -- | Find the float type for a given floating-point value
-floatValueType :: (Core.FloatValue -> Core.FloatType)
-floatValueType x = case x of
-  Core.FloatValueBigfloat _ -> Core.FloatTypeBigfloat
-  Core.FloatValueFloat32 _ -> Core.FloatTypeFloat32
-  Core.FloatValueFloat64 _ -> Core.FloatTypeFloat64
+floatValueType :: Core.FloatValue -> Core.FloatType
+floatValueType x =
+    case x of
+      Core.FloatValueBigfloat _ -> Core.FloatTypeBigfloat
+      Core.FloatValueFloat32 _ -> Core.FloatTypeFloat32
+      Core.FloatValueFloat64 _ -> Core.FloatTypeFloat64
 
 -- | Find the function inject (constructor) for a given function
-functionVariant :: (Core.Function -> Variants.FunctionVariant)
-functionVariant x = case x of
-  Core.FunctionElimination _ -> Variants.FunctionVariantElimination
-  Core.FunctionLambda _ -> Variants.FunctionVariantLambda
-  Core.FunctionPrimitive _ -> Variants.FunctionVariantPrimitive
+functionVariant :: Core.Function -> Variants.FunctionVariant
+functionVariant x =
+    case x of
+      Core.FunctionElimination _ -> Variants.FunctionVariantElimination
+      Core.FunctionLambda _ -> Variants.FunctionVariantLambda
+      Core.FunctionPrimitive _ -> Variants.FunctionVariantPrimitive
 
 -- | All function variants (constructors), in a canonical order
 functionVariants :: [Variants.FunctionVariant]
-functionVariants = [
-  Variants.FunctionVariantElimination,
-  Variants.FunctionVariantLambda,
-  Variants.FunctionVariantPrimitive]
+functionVariants =
+    [
+      Variants.FunctionVariantElimination,
+      Variants.FunctionVariantLambda,
+      Variants.FunctionVariantPrimitive]
 
 -- | Find whether a given integer type is signed (true) or unsigned (false)
-integerTypeIsSigned :: (Core.IntegerType -> Bool)
-integerTypeIsSigned x = case x of
-  Core.IntegerTypeBigint -> True
-  Core.IntegerTypeInt8 -> True
-  Core.IntegerTypeInt16 -> True
-  Core.IntegerTypeInt32 -> True
-  Core.IntegerTypeInt64 -> True
-  Core.IntegerTypeUint8 -> False
-  Core.IntegerTypeUint16 -> False
-  Core.IntegerTypeUint32 -> False
-  Core.IntegerTypeUint64 -> False
+integerTypeIsSigned :: Core.IntegerType -> Bool
+integerTypeIsSigned x =
+    case x of
+      Core.IntegerTypeBigint -> True
+      Core.IntegerTypeInt8 -> True
+      Core.IntegerTypeInt16 -> True
+      Core.IntegerTypeInt32 -> True
+      Core.IntegerTypeInt64 -> True
+      Core.IntegerTypeUint8 -> False
+      Core.IntegerTypeUint16 -> False
+      Core.IntegerTypeUint32 -> False
+      Core.IntegerTypeUint64 -> False
 
 -- | Find the precision of a given integer type
-integerTypePrecision :: (Core.IntegerType -> Util.Precision)
-integerTypePrecision x = case x of
-  Core.IntegerTypeBigint -> Util.PrecisionArbitrary
-  Core.IntegerTypeInt8 -> (Util.PrecisionBits 8)
-  Core.IntegerTypeInt16 -> (Util.PrecisionBits 16)
-  Core.IntegerTypeInt32 -> (Util.PrecisionBits 32)
-  Core.IntegerTypeInt64 -> (Util.PrecisionBits 64)
-  Core.IntegerTypeUint8 -> (Util.PrecisionBits 8)
-  Core.IntegerTypeUint16 -> (Util.PrecisionBits 16)
-  Core.IntegerTypeUint32 -> (Util.PrecisionBits 32)
-  Core.IntegerTypeUint64 -> (Util.PrecisionBits 64)
+integerTypePrecision :: Core.IntegerType -> Util.Precision
+integerTypePrecision x =
+    case x of
+      Core.IntegerTypeBigint -> Util.PrecisionArbitrary
+      Core.IntegerTypeInt8 -> Util.PrecisionBits 8
+      Core.IntegerTypeInt16 -> Util.PrecisionBits 16
+      Core.IntegerTypeInt32 -> Util.PrecisionBits 32
+      Core.IntegerTypeInt64 -> Util.PrecisionBits 64
+      Core.IntegerTypeUint8 -> Util.PrecisionBits 8
+      Core.IntegerTypeUint16 -> Util.PrecisionBits 16
+      Core.IntegerTypeUint32 -> Util.PrecisionBits 32
+      Core.IntegerTypeUint64 -> Util.PrecisionBits 64
 
 -- | All integer types, in a canonical order
 integerTypes :: [Core.IntegerType]
-integerTypes = [
-  Core.IntegerTypeBigint,
-  Core.IntegerTypeInt8,
-  Core.IntegerTypeInt16,
-  Core.IntegerTypeInt32,
-  Core.IntegerTypeInt64,
-  Core.IntegerTypeUint8,
-  Core.IntegerTypeUint16,
-  Core.IntegerTypeUint32,
-  Core.IntegerTypeUint64]
+integerTypes =
+    [
+      Core.IntegerTypeBigint,
+      Core.IntegerTypeInt8,
+      Core.IntegerTypeInt16,
+      Core.IntegerTypeInt32,
+      Core.IntegerTypeInt64,
+      Core.IntegerTypeUint8,
+      Core.IntegerTypeUint16,
+      Core.IntegerTypeUint32,
+      Core.IntegerTypeUint64]
 
 -- | Find the integer type for a given integer value
-integerValueType :: (Core.IntegerValue -> Core.IntegerType)
-integerValueType x = case x of
-  Core.IntegerValueBigint _ -> Core.IntegerTypeBigint
-  Core.IntegerValueInt8 _ -> Core.IntegerTypeInt8
-  Core.IntegerValueInt16 _ -> Core.IntegerTypeInt16
-  Core.IntegerValueInt32 _ -> Core.IntegerTypeInt32
-  Core.IntegerValueInt64 _ -> Core.IntegerTypeInt64
-  Core.IntegerValueUint8 _ -> Core.IntegerTypeUint8
-  Core.IntegerValueUint16 _ -> Core.IntegerTypeUint16
-  Core.IntegerValueUint32 _ -> Core.IntegerTypeUint32
-  Core.IntegerValueUint64 _ -> Core.IntegerTypeUint64
+integerValueType :: Core.IntegerValue -> Core.IntegerType
+integerValueType x =
+    case x of
+      Core.IntegerValueBigint _ -> Core.IntegerTypeBigint
+      Core.IntegerValueInt8 _ -> Core.IntegerTypeInt8
+      Core.IntegerValueInt16 _ -> Core.IntegerTypeInt16
+      Core.IntegerValueInt32 _ -> Core.IntegerTypeInt32
+      Core.IntegerValueInt64 _ -> Core.IntegerTypeInt64
+      Core.IntegerValueUint8 _ -> Core.IntegerTypeUint8
+      Core.IntegerValueUint16 _ -> Core.IntegerTypeUint16
+      Core.IntegerValueUint32 _ -> Core.IntegerTypeUint32
+      Core.IntegerValueUint64 _ -> Core.IntegerTypeUint64
 
 -- | Find the literal type for a given literal value
-literalType :: (Core.Literal -> Core.LiteralType)
-literalType x = case x of
-  Core.LiteralBinary _ -> Core.LiteralTypeBinary
-  Core.LiteralBoolean _ -> Core.LiteralTypeBoolean
-  Core.LiteralFloat v1 -> ((\injected_ -> Core.LiteralTypeFloat injected_) (floatValueType v1))
-  Core.LiteralInteger v1 -> ((\injected_ -> Core.LiteralTypeInteger injected_) (integerValueType v1))
-  Core.LiteralString _ -> Core.LiteralTypeString
+literalType :: Core.Literal -> Core.LiteralType
+literalType x =
+    case x of
+      Core.LiteralBinary _ -> Core.LiteralTypeBinary
+      Core.LiteralBoolean _ -> Core.LiteralTypeBoolean
+      Core.LiteralFloat v0 -> (\injected_ -> Core.LiteralTypeFloat injected_) (floatValueType v0)
+      Core.LiteralInteger v0 -> (\injected_ -> Core.LiteralTypeInteger injected_) (integerValueType v0)
+      Core.LiteralString _ -> Core.LiteralTypeString
 
 -- | Find the literal type inject (constructor) for a given literal value
-literalTypeVariant :: (Core.LiteralType -> Variants.LiteralVariant)
-literalTypeVariant x = case x of
-  Core.LiteralTypeBinary -> Variants.LiteralVariantBinary
-  Core.LiteralTypeBoolean -> Variants.LiteralVariantBoolean
-  Core.LiteralTypeFloat _ -> Variants.LiteralVariantFloat
-  Core.LiteralTypeInteger _ -> Variants.LiteralVariantInteger
-  Core.LiteralTypeString -> Variants.LiteralVariantString
+literalTypeVariant :: Core.LiteralType -> Variants.LiteralVariant
+literalTypeVariant x =
+    case x of
+      Core.LiteralTypeBinary -> Variants.LiteralVariantBinary
+      Core.LiteralTypeBoolean -> Variants.LiteralVariantBoolean
+      Core.LiteralTypeFloat _ -> Variants.LiteralVariantFloat
+      Core.LiteralTypeInteger _ -> Variants.LiteralVariantInteger
+      Core.LiteralTypeString -> Variants.LiteralVariantString
 
 -- | All literal types, in a canonical order
 literalTypes :: [Core.LiteralType]
-literalTypes = (Lists.concat [
-  [
-    Core.LiteralTypeBinary,
-    Core.LiteralTypeBoolean],
-  (Lists.map (\x -> Core.LiteralTypeFloat x) floatTypes),
-  (Lists.map (\x -> Core.LiteralTypeInteger x) integerTypes),
-  [
-    Core.LiteralTypeString]])
+literalTypes =
+    Lists.concat [
+      [
+        Core.LiteralTypeBinary,
+        Core.LiteralTypeBoolean],
+      (Lists.map (\x -> Core.LiteralTypeFloat x) floatTypes),
+      (Lists.map (\x -> Core.LiteralTypeInteger x) integerTypes),
+      [
+        Core.LiteralTypeString]]
 
 -- | Find the literal inject (constructor) for a given literal value
-literalVariant :: (Core.Literal -> Variants.LiteralVariant)
-literalVariant arg_ = (literalTypeVariant (literalType arg_))
+literalVariant :: Core.Literal -> Variants.LiteralVariant
+literalVariant arg_ = literalTypeVariant (literalType arg_)
 
 -- | All literal variants, in a canonical order
 literalVariants :: [Variants.LiteralVariant]
-literalVariants = [
-  Variants.LiteralVariantBinary,
-  Variants.LiteralVariantBoolean,
-  Variants.LiteralVariantFloat,
-  Variants.LiteralVariantInteger,
-  Variants.LiteralVariantString]
+literalVariants =
+    [
+      Variants.LiteralVariantBinary,
+      Variants.LiteralVariantBoolean,
+      Variants.LiteralVariantFloat,
+      Variants.LiteralVariantInteger,
+      Variants.LiteralVariantString]
 
 -- | Find the term inject (constructor) for a given term
-termVariant :: (Core.Term -> Variants.TermVariant)
-termVariant x = case x of
-  Core.TermAnnotated _ -> Variants.TermVariantAnnotated
-  Core.TermApplication _ -> Variants.TermVariantApplication
-  Core.TermEither _ -> Variants.TermVariantEither
-  Core.TermFunction _ -> Variants.TermVariantFunction
-  Core.TermLet _ -> Variants.TermVariantLet
-  Core.TermList _ -> Variants.TermVariantList
-  Core.TermLiteral _ -> Variants.TermVariantLiteral
-  Core.TermMap _ -> Variants.TermVariantMap
-  Core.TermMaybe _ -> Variants.TermVariantMaybe
-  Core.TermPair _ -> Variants.TermVariantPair
-  Core.TermRecord _ -> Variants.TermVariantRecord
-  Core.TermSet _ -> Variants.TermVariantSet
-  Core.TermTypeApplication _ -> Variants.TermVariantTypeApplication
-  Core.TermTypeLambda _ -> Variants.TermVariantTypeLambda
-  Core.TermUnion _ -> Variants.TermVariantUnion
-  Core.TermUnit -> Variants.TermVariantUnit
-  Core.TermVariable _ -> Variants.TermVariantVariable
-  Core.TermWrap _ -> Variants.TermVariantWrap
+termVariant :: Core.Term -> Variants.TermVariant
+termVariant x =
+    case x of
+      Core.TermAnnotated _ -> Variants.TermVariantAnnotated
+      Core.TermApplication _ -> Variants.TermVariantApplication
+      Core.TermEither _ -> Variants.TermVariantEither
+      Core.TermFunction _ -> Variants.TermVariantFunction
+      Core.TermLet _ -> Variants.TermVariantLet
+      Core.TermList _ -> Variants.TermVariantList
+      Core.TermLiteral _ -> Variants.TermVariantLiteral
+      Core.TermMap _ -> Variants.TermVariantMap
+      Core.TermMaybe _ -> Variants.TermVariantMaybe
+      Core.TermPair _ -> Variants.TermVariantPair
+      Core.TermRecord _ -> Variants.TermVariantRecord
+      Core.TermSet _ -> Variants.TermVariantSet
+      Core.TermTypeApplication _ -> Variants.TermVariantTypeApplication
+      Core.TermTypeLambda _ -> Variants.TermVariantTypeLambda
+      Core.TermUnion _ -> Variants.TermVariantUnion
+      Core.TermUnit -> Variants.TermVariantUnit
+      Core.TermVariable _ -> Variants.TermVariantVariable
+      Core.TermWrap _ -> Variants.TermVariantWrap
 
 -- | All term (expression) variants, in a canonical order
 termVariants :: [Variants.TermVariant]
-termVariants = [
-  Variants.TermVariantAnnotated,
-  Variants.TermVariantApplication,
-  Variants.TermVariantEither,
-  Variants.TermVariantFunction,
-  Variants.TermVariantList,
-  Variants.TermVariantLiteral,
-  Variants.TermVariantMap,
-  Variants.TermVariantMaybe,
-  Variants.TermVariantPair,
-  Variants.TermVariantRecord,
-  Variants.TermVariantSet,
-  Variants.TermVariantTypeLambda,
-  Variants.TermVariantTypeApplication,
-  Variants.TermVariantUnion,
-  Variants.TermVariantUnit,
-  Variants.TermVariantVariable,
-  Variants.TermVariantWrap]
+termVariants =
+    [
+      Variants.TermVariantAnnotated,
+      Variants.TermVariantApplication,
+      Variants.TermVariantEither,
+      Variants.TermVariantFunction,
+      Variants.TermVariantList,
+      Variants.TermVariantLiteral,
+      Variants.TermVariantMap,
+      Variants.TermVariantMaybe,
+      Variants.TermVariantPair,
+      Variants.TermVariantRecord,
+      Variants.TermVariantSet,
+      Variants.TermVariantTypeLambda,
+      Variants.TermVariantTypeApplication,
+      Variants.TermVariantUnion,
+      Variants.TermVariantUnit,
+      Variants.TermVariantVariable,
+      Variants.TermVariantWrap]
 
 -- | Find the type inject (constructor) for a given type
-typeVariant :: (Core.Type -> Variants.TypeVariant)
-typeVariant x = case x of
-  Core.TypeAnnotated _ -> Variants.TypeVariantAnnotated
-  Core.TypeApplication _ -> Variants.TypeVariantApplication
-  Core.TypeEither _ -> Variants.TypeVariantEither
-  Core.TypeFunction _ -> Variants.TypeVariantFunction
-  Core.TypeForall _ -> Variants.TypeVariantForall
-  Core.TypeList _ -> Variants.TypeVariantList
-  Core.TypeLiteral _ -> Variants.TypeVariantLiteral
-  Core.TypeMap _ -> Variants.TypeVariantMap
-  Core.TypeMaybe _ -> Variants.TypeVariantMaybe
-  Core.TypePair _ -> Variants.TypeVariantPair
-  Core.TypeRecord _ -> Variants.TypeVariantRecord
-  Core.TypeSet _ -> Variants.TypeVariantSet
-  Core.TypeUnion _ -> Variants.TypeVariantUnion
-  Core.TypeUnit -> Variants.TypeVariantUnit
-  Core.TypeVariable _ -> Variants.TypeVariantVariable
-  Core.TypeWrap _ -> Variants.TypeVariantWrap
+typeVariant :: Core.Type -> Variants.TypeVariant
+typeVariant x =
+    case x of
+      Core.TypeAnnotated _ -> Variants.TypeVariantAnnotated
+      Core.TypeApplication _ -> Variants.TypeVariantApplication
+      Core.TypeEither _ -> Variants.TypeVariantEither
+      Core.TypeFunction _ -> Variants.TypeVariantFunction
+      Core.TypeForall _ -> Variants.TypeVariantForall
+      Core.TypeList _ -> Variants.TypeVariantList
+      Core.TypeLiteral _ -> Variants.TypeVariantLiteral
+      Core.TypeMap _ -> Variants.TypeVariantMap
+      Core.TypeMaybe _ -> Variants.TypeVariantMaybe
+      Core.TypePair _ -> Variants.TypeVariantPair
+      Core.TypeRecord _ -> Variants.TypeVariantRecord
+      Core.TypeSet _ -> Variants.TypeVariantSet
+      Core.TypeUnion _ -> Variants.TypeVariantUnion
+      Core.TypeUnit -> Variants.TypeVariantUnit
+      Core.TypeVariable _ -> Variants.TypeVariantVariable
+      Core.TypeVoid -> Variants.TypeVariantVoid
+      Core.TypeWrap _ -> Variants.TypeVariantWrap
 
 -- | All type variants, in a canonical order
 typeVariants :: [Variants.TypeVariant]
-typeVariants = [
-  Variants.TypeVariantAnnotated,
-  Variants.TypeVariantApplication,
-  Variants.TypeVariantEither,
-  Variants.TypeVariantFunction,
-  Variants.TypeVariantForall,
-  Variants.TypeVariantList,
-  Variants.TypeVariantLiteral,
-  Variants.TypeVariantMap,
-  Variants.TypeVariantWrap,
-  Variants.TypeVariantMaybe,
-  Variants.TypeVariantPair,
-  Variants.TypeVariantRecord,
-  Variants.TypeVariantSet,
-  Variants.TypeVariantUnion,
-  Variants.TypeVariantUnit,
-  Variants.TypeVariantVariable]
+typeVariants =
+    [
+      Variants.TypeVariantAnnotated,
+      Variants.TypeVariantApplication,
+      Variants.TypeVariantEither,
+      Variants.TypeVariantFunction,
+      Variants.TypeVariantForall,
+      Variants.TypeVariantList,
+      Variants.TypeVariantLiteral,
+      Variants.TypeVariantMap,
+      Variants.TypeVariantWrap,
+      Variants.TypeVariantMaybe,
+      Variants.TypeVariantPair,
+      Variants.TypeVariantRecord,
+      Variants.TypeVariantSet,
+      Variants.TypeVariantUnion,
+      Variants.TypeVariantUnit,
+      Variants.TypeVariantVariable,
+      Variants.TypeVariantVoid]
diff --git a/src/gen-main/haskell/Hydra/Relational.hs b/src/gen-main/haskell/Hydra/Relational.hs
--- a/src/gen-main/haskell/Hydra/Relational.hs
+++ b/src/gen-main/haskell/Hydra/Relational.hs
@@ -13,15 +13,15 @@
 import qualified Data.Set as S
 
 -- | A name for a domain which serves to identify the role played by that domain in the given relation; a 'role name' in Codd
-newtype ColumnName = 
+newtype ColumnName =
   ColumnName {
     unColumnName :: String}
   deriving (Eq, Ord, Read, Show)
 
-_ColumnName = (Core.Name "hydra.relational.ColumnName")
+_ColumnName = Core.Name "hydra.relational.ColumnName"
 
 -- | An abstract specification of the domain represented by a column in a relation; a role
-data ColumnSchema t = 
+data ColumnSchema t =
   ColumnSchema {
     -- | A unique name for the column
     columnSchemaName :: ColumnName,
@@ -29,14 +29,14 @@
     columnSchemaDomain :: t}
   deriving (Eq, Ord, Read, Show)
 
-_ColumnSchema = (Core.Name "hydra.relational.ColumnSchema")
+_ColumnSchema = Core.Name "hydra.relational.ColumnSchema"
 
-_ColumnSchema_name = (Core.Name "name")
+_ColumnSchema_name = Core.Name "name"
 
-_ColumnSchema_domain = (Core.Name "domain")
+_ColumnSchema_domain = Core.Name "domain"
 
 -- | A mapping from certain columns of a source relation to primary key columns of a target relation
-data ForeignKey = 
+data ForeignKey =
   ForeignKey {
     -- | The name of the target relation
     foreignKeyForeignRelation :: RelationName,
@@ -44,38 +44,38 @@
     foreignKeyKeys :: (M.Map ColumnName ColumnName)}
   deriving (Eq, Ord, Read, Show)
 
-_ForeignKey = (Core.Name "hydra.relational.ForeignKey")
+_ForeignKey = Core.Name "hydra.relational.ForeignKey"
 
-_ForeignKey_foreignRelation = (Core.Name "foreignRelation")
+_ForeignKey_foreignRelation = Core.Name "foreignRelation"
 
-_ForeignKey_keys = (Core.Name "keys")
+_ForeignKey_keys = Core.Name "keys"
 
 -- | A primary key of a relation, specified either as a single column, or as a list of columns
-newtype PrimaryKey = 
+newtype PrimaryKey =
   PrimaryKey {
     unPrimaryKey :: [ColumnName]}
   deriving (Eq, Ord, Read, Show)
 
-_PrimaryKey = (Core.Name "hydra.relational.PrimaryKey")
+_PrimaryKey = Core.Name "hydra.relational.PrimaryKey"
 
 -- | A set of distinct n-tuples; a table
-newtype Relation v = 
+newtype Relation v =
   Relation {
     unRelation :: [Row v]}
   deriving (Eq, Ord, Read, Show)
 
-_Relation = (Core.Name "hydra.relational.Relation")
+_Relation = Core.Name "hydra.relational.Relation"
 
 -- | A unique relation (table) name
-newtype RelationName = 
+newtype RelationName =
   RelationName {
     unRelationName :: String}
   deriving (Eq, Ord, Read, Show)
 
-_RelationName = (Core.Name "hydra.relational.RelationName")
+_RelationName = Core.Name "hydra.relational.RelationName"
 
 -- | An abstract relation; the name and columns of a relation without its actual data
-data RelationSchema t = 
+data RelationSchema t =
   RelationSchema {
     -- | A unique name for the relation
     relationSchemaName :: RelationName,
@@ -87,28 +87,28 @@
     relationSchemaForeignKeys :: [ForeignKey]}
   deriving (Eq, Ord, Read, Show)
 
-_RelationSchema = (Core.Name "hydra.relational.RelationSchema")
+_RelationSchema = Core.Name "hydra.relational.RelationSchema"
 
-_RelationSchema_name = (Core.Name "name")
+_RelationSchema_name = Core.Name "name"
 
-_RelationSchema_columns = (Core.Name "columns")
+_RelationSchema_columns = Core.Name "columns"
 
-_RelationSchema_primaryKeys = (Core.Name "primaryKeys")
+_RelationSchema_primaryKeys = Core.Name "primaryKeys"
 
-_RelationSchema_foreignKeys = (Core.Name "foreignKeys")
+_RelationSchema_foreignKeys = Core.Name "foreignKeys"
 
 -- | A domain-unordered (string-indexed, rather than position-indexed) relation
-newtype Relationship v = 
+newtype Relationship v =
   Relationship {
     unRelationship :: (S.Set (M.Map ColumnName v))}
   deriving (Eq, Ord, Read, Show)
 
-_Relationship = (Core.Name "hydra.relational.Relationship")
+_Relationship = Core.Name "hydra.relational.Relationship"
 
 -- | An n-tuple which is an element of a given relation
-newtype Row v = 
+newtype Row v =
   Row {
     unRow :: [v]}
   deriving (Eq, Ord, Read, Show)
 
-_Row = (Core.Name "hydra.relational.Row")
+_Row = Core.Name "hydra.relational.Row"
diff --git a/src/gen-main/haskell/Hydra/Rewriting.hs b/src/gen-main/haskell/Hydra/Rewriting.hs
--- a/src/gen-main/haskell/Hydra/Rewriting.hs
+++ b/src/gen-main/haskell/Hydra/Rewriting.hs
@@ -4,1726 +4,1850 @@
 
 module Hydra.Rewriting where
 
-import qualified Hydra.Accessors as Accessors
-import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Lib.Eithers as Eithers
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Literals as Literals
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Math as Math
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Names as Names
-import qualified Hydra.Sorting as Sorting
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Apply a term-level function inside any leading type lambdas
-applyInsideTypeLambdasAndAnnotations :: ((Core.Term -> Core.Term) -> Core.Term -> Core.Term)
-applyInsideTypeLambdasAndAnnotations f term0 = ((\x -> case x of
-  Core.TermAnnotated v1 -> (Core.TermAnnotated (Core.AnnotatedTerm {
-    Core.annotatedTermBody = (applyInsideTypeLambdasAndAnnotations f (Core.annotatedTermBody v1)),
-    Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)}))
-  Core.TermTypeLambda v1 -> (Core.TermTypeLambda (Core.TypeLambda {
-    Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-    Core.typeLambdaBody = (applyInsideTypeLambdasAndAnnotations f (Core.typeLambdaBody v1))}))
-  _ -> (f term0)) term0)
-
--- | Strip type annotations from the top levels of a term
-deannotateAndDetypeTerm :: (Core.Term -> Core.Term)
-deannotateAndDetypeTerm t = ((\x -> case x of
-  Core.TermAnnotated v1 -> (deannotateAndDetypeTerm (Core.annotatedTermBody v1))
-  Core.TermTypeApplication v1 -> (deannotateAndDetypeTerm (Core.typeApplicationTermBody v1))
-  Core.TermTypeLambda v1 -> (deannotateAndDetypeTerm (Core.typeLambdaBody v1))
-  _ -> t) t)
-
--- | Strip all annotations (including System F type annotations) from the top levels of a term
-deannotateTerm :: (Core.Term -> Core.Term)
-deannotateTerm t = ((\x -> case x of
-  Core.TermAnnotated v1 -> (deannotateTerm (Core.annotatedTermBody v1))
-  _ -> t) t)
-
--- | Strip all annotations from a term
-deannotateType :: (Core.Type -> Core.Type)
-deannotateType t = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (deannotateType (Core.annotatedTypeBody v1))
-  _ -> t) t)
-
--- | Strip any top-level type lambdas from a type, extracting the (possibly nested) type body
-deannotateTypeParameters :: (Core.Type -> Core.Type)
-deannotateTypeParameters t = ((\x -> case x of
-  Core.TypeForall v1 -> (deannotateTypeParameters (Core.forallTypeBody v1))
-  _ -> t) (deannotateType t))
-
--- | Recursively strip all annotations from a type
-deannotateTypeRecursive :: (Core.Type -> Core.Type)
-deannotateTypeRecursive typ =  
-  let strip = (\recurse -> \typ ->  
-          let rewritten = (recurse typ)
-          in ((\x -> case x of
-            Core.TypeAnnotated v1 -> (Core.annotatedTypeBody v1)
-            _ -> rewritten) rewritten))
-  in (rewriteType strip typ)
-
--- | Recursively strip all annotations from a type scheme
-deannotateTypeSchemeRecursive :: (Core.TypeScheme -> Core.TypeScheme)
-deannotateTypeSchemeRecursive ts =  
-  let vars = (Core.typeSchemeVariables ts)
-  in  
-    let typ = (Core.typeSchemeType ts)
-    in  
-      let constraints = (Core.typeSchemeConstraints ts)
-      in Core.TypeScheme {
-        Core.typeSchemeVariables = vars,
-        Core.typeSchemeType = (deannotateTypeRecursive typ),
-        Core.typeSchemeConstraints = constraints}
-
--- | Strip System F type annotations from the top levels of a term, but leave application-specific annotations intact
-detypeTerm :: (Core.Term -> Core.Term)
-detypeTerm t = ((\x -> case x of
-  Core.TermAnnotated v1 ->  
-    let subj = (Core.annotatedTermBody v1)
-    in  
-      let ann = (Core.annotatedTermAnnotation v1)
-      in (Core.TermAnnotated (Core.AnnotatedTerm {
-        Core.annotatedTermBody = (detypeTerm subj),
-        Core.annotatedTermAnnotation = ann}))
-  Core.TermTypeApplication v1 -> (deannotateAndDetypeTerm (Core.typeApplicationTermBody v1))
-  Core.TermTypeLambda v1 -> (deannotateAndDetypeTerm (Core.typeLambdaBody v1))
-  _ -> t) t)
-
--- | Flatten nested let expressions
-flattenLetTerms :: (Core.Term -> Core.Term)
-flattenLetTerms term =  
-  let rewriteBinding = (\binding ->  
-          let key0 = (Core.bindingName binding)
-          in  
-            let val0 = (Core.bindingTerm binding)
-            in  
-              let t = (Core.bindingType binding)
-              in ((\x -> case x of
-                Core.TermAnnotated v1 ->  
-                  let val1 = (Core.annotatedTermBody v1)
-                  in  
-                    let ann = (Core.annotatedTermAnnotation v1)
-                    in  
-                      let recursive = (rewriteBinding (Core.Binding {
-                              Core.bindingName = key0,
-                              Core.bindingTerm = val1,
-                              Core.bindingType = t}))
-                      in  
-                        let innerBinding = (Pairs.first recursive)
-                        in  
-                          let deps = (Pairs.second recursive)
-                          in  
-                            let val2 = (Core.bindingTerm innerBinding)
-                            in (Core.Binding {
-                              Core.bindingName = key0,
-                              Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                                Core.annotatedTermBody = val2,
-                                Core.annotatedTermAnnotation = ann})),
-                              Core.bindingType = t}, deps)
-                Core.TermLet v1 ->  
-                  let bindings1 = (Core.letBindings v1)
-                  in  
-                    let body1 = (Core.letBody v1)
-                    in  
-                      let prefix = (Strings.cat2 (Core.unName key0) "_")
-                      in  
-                        let qualify = (\n -> Core.Name (Strings.cat2 prefix (Core.unName n)))
-                        in  
-                          let toSubstPair = (\b -> (Core.bindingName b, (qualify (Core.bindingName b))))
-                          in  
-                            let subst = (Maps.fromList (Lists.map toSubstPair bindings1))
-                            in  
-                              let replaceVars = (substituteVariables subst)
-                              in  
-                                let newBody = (replaceVars body1)
-                                in  
-                                  let newBinding = (\b -> Core.Binding {
-                                          Core.bindingName = (qualify (Core.bindingName b)),
-                                          Core.bindingTerm = (replaceVars (Core.bindingTerm b)),
-                                          Core.bindingType = (Core.bindingType b)})
-                                  in (Core.Binding {
-                                    Core.bindingName = key0,
-                                    Core.bindingTerm = newBody,
-                                    Core.bindingType = t}, (Lists.map newBinding bindings1))
-                _ -> (Core.Binding {
-                  Core.bindingName = key0,
-                  Core.bindingTerm = val0,
-                  Core.bindingType = t}, [])) val0))
-  in  
-    let flattenBodyLet = (\bindings -> \body -> (\x -> case x of
-            Core.TermLet v1 ->  
-              let innerBindings = (Core.letBindings v1)
-              in  
-                let innerBody = (Core.letBody v1)
-                in (flattenBodyLet (Lists.concat2 bindings innerBindings) innerBody)
-            _ -> (Lists.concat2 [] bindings, body)) body)
-    in  
-      let flatten = (\recurse -> \term ->  
-              let rewritten = (recurse term)
-              in ((\x -> case x of
-                Core.TermLet v1 ->  
-                  let bindings = (Core.letBindings v1)
-                  in  
-                    let body = (Core.letBody v1)
-                    in  
-                      let forResult = (\hr -> Lists.concat2 (Pairs.second hr) (Lists.pure (Pairs.first hr)))
-                      in  
-                        let flattenedBindings = (Lists.concat (Lists.map (\arg_ -> forResult (rewriteBinding arg_)) bindings))
-                        in  
-                          let merged = (flattenBodyLet flattenedBindings body)
-                          in  
-                            let newBindings = (Pairs.first merged)
-                            in  
-                              let newBody = (Pairs.second merged)
-                              in (Core.TermLet (Core.Let {
-                                Core.letBindings = newBindings,
-                                Core.letBody = newBody}))
-                _ -> rewritten) rewritten))
-      in (rewriteTerm flatten term)
-
--- | Fold over a term, traversing its subterms in the specified order
-foldOverTerm :: (Coders.TraversalOrder -> (t0 -> Core.Term -> t0) -> t0 -> Core.Term -> t0)
-foldOverTerm order fld b0 term = ((\x -> case x of
-  Coders.TraversalOrderPre -> (Lists.foldl (foldOverTerm order fld) (fld b0 term) (subterms term))
-  Coders.TraversalOrderPost -> (fld (Lists.foldl (foldOverTerm order fld) b0 (subterms term)) term)) order)
-
--- | Fold over a type, traversing its subtypes in the specified order
-foldOverType :: (Coders.TraversalOrder -> (t0 -> Core.Type -> t0) -> t0 -> Core.Type -> t0)
-foldOverType order fld b0 typ = ((\x -> case x of
-  Coders.TraversalOrderPre -> (Lists.foldl (foldOverType order fld) (fld b0 typ) (subtypes typ))
-  Coders.TraversalOrderPost -> (fld (Lists.foldl (foldOverType order fld) b0 (subtypes typ)) typ)) order)
-
--- | Get the set of free type variables in a term (including schema names, where they appear in type annotations). In this context, only the type schemes of let bindings can bind type variables; type lambdas do not.
-freeTypeVariablesInTerm :: (Core.Term -> S.Set Core.Name)
-freeTypeVariablesInTerm term0 =  
-  let allOf = (\sets -> Lists.foldl Sets.union Sets.empty sets)
-  in  
-    let tryType = (\tvars -> \typ -> Sets.difference (freeVariablesInType typ) tvars)
-    in  
-      let getAll = (\vars -> \term ->  
-              let recurse = (getAll vars)
-              in  
-                let dflt = (allOf (Lists.map recurse (subterms term)))
-                in ((\x -> case x of
-                  Core.TermFunction v1 -> ((\x -> case x of
-                    Core.FunctionElimination _ -> dflt
-                    Core.FunctionLambda v2 ->  
-                      let domt = (Maybes.maybe Sets.empty (tryType vars) (Core.lambdaDomain v2))
-                      in (Sets.union domt (recurse (Core.lambdaBody v2)))
-                    _ -> dflt) v1)
-                  Core.TermLet v1 ->  
-                    let forBinding = (\b ->  
-                            let newVars = (Maybes.maybe vars (\ts -> Sets.union vars (Sets.fromList (Core.typeSchemeVariables ts))) (Core.bindingType b))
-                            in (Sets.union (getAll newVars (Core.bindingTerm b)) (Maybes.maybe Sets.empty (\ts -> tryType newVars (Core.typeSchemeType ts)) (Core.bindingType b))))
-                    in (Sets.union (allOf (Lists.map forBinding (Core.letBindings v1))) (recurse (Core.letBody v1)))
-                  Core.TermTypeApplication v1 -> (Sets.union (tryType vars (Core.typeApplicationTermType v1)) (recurse (Core.typeApplicationTermBody v1)))
-                  Core.TermTypeLambda v1 -> (Sets.union (tryType vars (Core.TypeVariable (Core.typeLambdaParameter v1))) (recurse (Core.typeLambdaBody v1)))
-                  _ -> dflt) term))
-      in (getAll Sets.empty term0)
-
--- | Find the free variables (i.e. variables not bound by a lambda or let) in a term
-freeVariablesInTerm :: (Core.Term -> S.Set Core.Name)
-freeVariablesInTerm term =  
-  let dfltVars = (Lists.foldl (\s -> \t -> Sets.union s (freeVariablesInTerm t)) Sets.empty (subterms term))
-  in ((\x -> case x of
-    Core.TermFunction v1 -> ((\x -> case x of
-      Core.FunctionLambda v2 -> (Sets.delete (Core.lambdaParameter v2) (freeVariablesInTerm (Core.lambdaBody v2)))
-      _ -> dfltVars) v1)
-    Core.TermLet v1 -> (Sets.difference dfltVars (Sets.fromList (Lists.map Core.bindingName (Core.letBindings v1))))
-    Core.TermVariable v1 -> (Sets.singleton v1)
-    _ -> dfltVars) term)
-
--- | Find the free variables (i.e. variables not bound by a lambda or let) in a type
-freeVariablesInType :: (Core.Type -> S.Set Core.Name)
-freeVariablesInType typ =  
-  let dfltVars = (Lists.foldl (\s -> \t -> Sets.union s (freeVariablesInType t)) Sets.empty (subtypes typ))
-  in ((\x -> case x of
-    Core.TypeForall v1 -> (Sets.delete (Core.forallTypeParameter v1) (freeVariablesInType (Core.forallTypeBody v1)))
-    Core.TypeVariable v1 -> (Sets.singleton v1)
-    _ -> dfltVars) typ)
-
--- | Find the free variables in a type in deterministic left-to-right order
-freeVariablesInTypeOrdered :: (Core.Type -> [Core.Name])
-freeVariablesInTypeOrdered typ =  
-  let collectVars = (\boundVars -> \t -> (\x -> case x of
-          Core.TypeVariable v1 -> (Logic.ifElse (Sets.member v1 boundVars) [] [
-            v1])
-          Core.TypeForall v1 -> (collectVars (Sets.insert (Core.forallTypeParameter v1) boundVars) (Core.forallTypeBody v1))
-          _ -> (Lists.concat (Lists.map (collectVars boundVars) (subtypes t)))) t)
-  in (Lists.nub (collectVars Sets.empty typ))
-
--- | Find free variables in a type scheme (simple version)
-freeVariablesInTypeSchemeSimple :: (Core.TypeScheme -> S.Set Core.Name)
-freeVariablesInTypeSchemeSimple ts =  
-  let vars = (Core.typeSchemeVariables ts)
-  in  
-    let t = (Core.typeSchemeType ts)
-    in (Sets.difference (freeVariablesInTypeSimple t) (Sets.fromList vars))
-
--- | Find free variables in a type scheme
-freeVariablesInTypeScheme :: (Core.TypeScheme -> S.Set Core.Name)
-freeVariablesInTypeScheme ts =  
-  let vars = (Core.typeSchemeVariables ts)
-  in  
-    let t = (Core.typeSchemeType ts)
-    in (Sets.difference (freeVariablesInType t) (Sets.fromList vars))
-
--- | Same as freeVariablesInType, but ignores the binding action of lambda types
-freeVariablesInTypeSimple :: (Core.Type -> S.Set Core.Name)
-freeVariablesInTypeSimple typ =  
-  let helper = (\types -> \typ -> (\x -> case x of
-          Core.TypeVariable v1 -> (Sets.insert v1 types)
-          _ -> types) typ)
-  in (foldOverType Coders.TraversalOrderPre helper Sets.empty typ)
-
--- | Inline all type variables in a type using the provided schema. Note: this function is only appropriate for nonrecursive type definitions
-inlineType :: (M.Map Core.Name Core.Type -> Core.Type -> Compute.Flow t0 Core.Type)
-inlineType schema typ =  
-  let f = (\recurse -> \typ ->  
-          let afterRecurse = (\tr -> (\x -> case x of
-                  Core.TypeVariable v1 -> (Maybes.maybe (Flows.fail (Strings.cat2 "No such type in schema: " (Core.unName v1))) (inlineType schema) (Maps.lookup v1 schema))
-                  _ -> (Flows.pure tr)) tr)
-          in (Flows.bind (recurse typ) (\tr -> afterRecurse tr)))
-  in (rewriteTypeM f typ)
-
--- | Check whether a variable is free (not bound) in a term
-isFreeVariableInTerm :: (Core.Name -> Core.Term -> Bool)
-isFreeVariableInTerm v term = (Logic.not (Sets.member v (freeVariablesInTerm term)))
-
--- | Check whether a term is a lambda, possibly nested within let and/or annotation terms
-isLambda :: (Core.Term -> Bool)
-isLambda term = ((\x -> case x of
-  Core.TermFunction v1 -> ((\x -> case x of
-    Core.FunctionLambda _ -> True
-    _ -> False) v1)
-  Core.TermLet v1 -> (isLambda (Core.letBody v1))
-  _ -> False) (deannotateTerm term))
-
--- | Rewrite terms like `let foo = bar in λx.baz` to `λx.let foo = bar in baz`, lifting lambda-bound variables above let-bound variables, recursively. This is helpful for targets such as Python.
-liftLambdaAboveLet :: (Core.Term -> Core.Term)
-liftLambdaAboveLet term0 =  
-  let rewrite = (\recurse -> \term ->  
-          let rewriteBinding = (\b -> Core.Binding {
-                  Core.bindingName = (Core.bindingName b),
-                  Core.bindingTerm = (rewrite recurse (Core.bindingTerm b)),
-                  Core.bindingType = (Core.bindingType b)})
-          in  
-            let rewriteBindings = (\bs -> Lists.map rewriteBinding bs)
-            in  
-              let digForLambdas = (\original -> \cons -> \term -> (\x -> case x of
-                      Core.TermAnnotated v1 -> (digForLambdas original (\t -> Core.TermAnnotated (Core.AnnotatedTerm {
-                        Core.annotatedTermBody = (cons t),
-                        Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)})) (Core.annotatedTermBody v1))
-                      Core.TermFunction v1 -> ((\x -> case x of
-                        Core.FunctionLambda v2 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.lambdaParameter v2),
-                          Core.lambdaDomain = (Core.lambdaDomain v2),
-                          Core.lambdaBody = (digForLambdas (cons (Core.lambdaBody v2)) (\t -> cons t) (Core.lambdaBody v2))})))
-                        _ -> (recurse original)) v1)
-                      Core.TermLet v1 -> (digForLambdas original (\t -> cons (Core.TermLet (Core.Let {
-                        Core.letBindings = (rewriteBindings (Core.letBindings v1)),
-                        Core.letBody = t}))) (Core.letBody v1))
-                      _ -> (recurse original)) term)
-              in ((\x -> case x of
-                Core.TermLet v1 -> (digForLambdas term (\t -> Core.TermLet (Core.Let {
-                  Core.letBindings = (rewriteBindings (Core.letBindings v1)),
-                  Core.letBody = t})) (Core.letBody v1))
-                _ -> (recurse term)) term))
-  in (rewriteTerm rewrite term0)
-
--- | Apply a transformation to the first type beneath a chain of annotations
-mapBeneathTypeAnnotations :: ((Core.Type -> Core.Type) -> Core.Type -> Core.Type)
-mapBeneathTypeAnnotations f t = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (Core.TypeAnnotated (Core.AnnotatedType {
-    Core.annotatedTypeBody = (mapBeneathTypeAnnotations f (Core.annotatedTypeBody v1)),
-    Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v1)}))
-  _ -> (f t)) t)
-
--- | Recursively replace the type variables of let bindings with the systematic type variables t0, t1, t2, ...
-normalizeTypeVariablesInTerm :: (Core.Term -> Core.Term)
-normalizeTypeVariablesInTerm term =  
-  let replaceName = (\subst -> \v -> Maybes.fromMaybe v (Maps.lookup v subst))
-  in  
-    let substType = (\subst -> \typ ->  
-            let rewrite = (\recurse -> \typ -> (\x -> case x of
-                    Core.TypeVariable v1 -> (Core.TypeVariable (replaceName subst v1))
-                    _ -> (recurse typ)) typ)
-            in (rewriteType rewrite typ))
-    in  
-      let rewriteWithSubst = (\state -> \term0 ->  
-              let sb = (Pairs.first state)
-              in  
-                let next = (Pairs.second state)
-                in  
-                  let subst = (Pairs.first sb)
-                  in  
-                    let boundVars = (Pairs.second sb)
-                    in  
-                      let rewrite = (\recurse -> \term -> (\x -> case x of
-                              Core.TermFunction v1 -> ((\x -> case x of
-                                Core.FunctionElimination _ -> (recurse term)
-                                Core.FunctionLambda v2 ->  
-                                  let domain = (Core.lambdaDomain v2)
-                                  in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.lambdaParameter v2),
-                                    Core.lambdaDomain = (Maybes.map (substType subst) domain),
-                                    Core.lambdaBody = (rewriteWithSubst ((subst, boundVars), next) (Core.lambdaBody v2))})))
-                                _ -> (recurse term)) v1)
-                              Core.TermLet v1 ->  
-                                let bindings0 = (Core.letBindings v1)
-                                in  
-                                  let body0 = (Core.letBody v1)
-                                  in  
-                                    let step = (\acc -> \bs ->  
-                                            let b = (Lists.head bs)
-                                            in  
-                                              let tl = (Lists.tail bs)
-                                              in  
-                                                let noType =  
-                                                        let newVal = (rewriteWithSubst ((subst, boundVars), next) (Core.bindingTerm b))
-                                                        in  
-                                                          let b1 = Core.Binding {
-                                                                  Core.bindingName = (Core.bindingName b),
-                                                                  Core.bindingTerm = newVal,
-                                                                  Core.bindingType = Nothing}
-                                                          in (step (Lists.cons b1 acc) tl)
-                                                in  
-                                                  let withType = (\ts ->  
-                                                          let vars = (Core.typeSchemeVariables ts)
-                                                          in  
-                                                            let typ = (Core.typeSchemeType ts)
-                                                            in  
-                                                              let k = (Lists.length vars)
-                                                              in  
-                                                                let gen = (\i -> \rem -> \acc2 ->  
-                                                                        let ti = (Core.Name (Strings.cat2 "t" (Literals.showInt32 (Math.add next i))))
-                                                                        in (Logic.ifElse (Equality.equal rem 0) (Lists.reverse acc2) (gen (Math.add i 1) (Math.sub rem 1) (Lists.cons ti acc2))))
-                                                                in  
-                                                                  let newVars = (gen 0 k [])
-                                                                  in  
-                                                                    let newSubst = (Maps.union (Maps.fromList (Lists.zip vars newVars)) subst)
-                                                                    in  
-                                                                      let newBound = (Sets.union boundVars (Sets.fromList newVars))
-                                                                      in  
-                                                                        let newVal = (rewriteWithSubst ((newSubst, newBound), (Math.add next k)) (Core.bindingTerm b))
-                                                                        in  
-                                                                          let renameConstraintKeys = (\constraintMap -> Maps.fromList (Lists.map (\p ->  
-                                                                                  let oldName = (Pairs.first p)
-                                                                                  in  
-                                                                                    let meta = (Pairs.second p)
-                                                                                    in  
-                                                                                      let newName = (Maybes.fromMaybe oldName (Maps.lookup oldName newSubst))
-                                                                                      in (newName, meta)) (Maps.toList constraintMap)))
-                                                                          in  
-                                                                            let oldConstraints = (Core.typeSchemeConstraints ts)
-                                                                            in  
-                                                                              let newConstraints = (Maybes.map renameConstraintKeys oldConstraints)
-                                                                              in  
-                                                                                let b1 = Core.Binding {
-                                                                                        Core.bindingName = (Core.bindingName b),
-                                                                                        Core.bindingTerm = newVal,
-                                                                                        Core.bindingType = (Just (Core.TypeScheme {
-                                                                                          Core.typeSchemeVariables = newVars,
-                                                                                          Core.typeSchemeType = (substType newSubst typ),
-                                                                                          Core.typeSchemeConstraints = newConstraints}))}
-                                                                                in (step (Lists.cons b1 acc) tl))
-                                                  in (Logic.ifElse (Lists.null bs) (Lists.reverse acc) (Maybes.maybe noType (\ts -> withType ts) (Core.bindingType b))))
-                                    in  
-                                      let bindings1 = (step [] bindings0)
-                                      in (Core.TermLet (Core.Let {
-                                        Core.letBindings = bindings1,
-                                        Core.letBody = (rewriteWithSubst ((subst, boundVars), next) body0)}))
-                              Core.TermTypeApplication v1 -> (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (rewriteWithSubst ((subst, boundVars), next) (Core.typeApplicationTermBody v1)),
-                                Core.typeApplicationTermType = (substType subst (Core.typeApplicationTermType v1))}))
-                              Core.TermTypeLambda v1 -> (Core.TermTypeLambda (Core.TypeLambda {
-                                Core.typeLambdaParameter = (replaceName subst (Core.typeLambdaParameter v1)),
-                                Core.typeLambdaBody = (rewriteWithSubst ((subst, boundVars), next) (Core.typeLambdaBody v1))}))
-                              _ -> (recurse term)) term)
-                      in (rewriteTerm rewrite term0))
-      in (rewriteWithSubst ((Maps.empty, Sets.empty), 0) term)
-
--- | Given a let expression, remove any unused bindings. The resulting expression is still a let, even if has no remaining bindings
-pruneLet :: (Core.Let -> Core.Let)
-pruneLet l =  
-  let bindingMap = (Maps.fromList (Lists.map (\b -> (Core.bindingName b, (Core.bindingTerm b))) (Core.letBindings l)))
-  in  
-    let rootName = (Core.Name "[[[root]]]")
-    in  
-      let adj = (\n -> Sets.intersection (Sets.fromList (Maps.keys bindingMap)) (freeVariablesInTerm (Logic.ifElse (Equality.equal n rootName) (Core.letBody l) (Maybes.fromJust (Maps.lookup n bindingMap)))))
-      in  
-        let reachable = (Sorting.findReachableNodes adj rootName)
-        in  
-          let prunedBindings = (Lists.filter (\b -> Sets.member (Core.bindingName b) reachable) (Core.letBindings l))
-          in Core.Let {
-            Core.letBindings = prunedBindings,
-            Core.letBody = (Core.letBody l)}
-
--- | Recursively remove term annotations, including within subterms
-removeTermAnnotations :: (Core.Term -> Core.Term)
-removeTermAnnotations term =  
-  let remove = (\recurse -> \term ->  
-          let rewritten = (recurse term)
-          in ((\x -> case x of
-            Core.TermAnnotated v1 -> (Core.annotatedTermBody v1)
-            _ -> rewritten) term))
-  in (rewriteTerm remove term)
-
--- | Recursively remove type annotations, including within subtypes
-removeTypeAnnotations :: (Core.Type -> Core.Type)
-removeTypeAnnotations typ =  
-  let remove = (\recurse -> \typ ->  
-          let rewritten = (recurse typ)
-          in ((\x -> case x of
-            Core.TypeAnnotated v1 -> (Core.annotatedTypeBody v1)
-            _ -> rewritten) rewritten))
-  in (rewriteType remove typ)
-
--- | Strip type annotations (TypeLambda, TypeApplication, binding type schemes) from terms while preserving lambda domain types and other annotations
-removeTypeAnnotationsFromTerm :: (Core.Term -> Core.Term)
-removeTypeAnnotationsFromTerm term =  
-  let strip = (\recurse -> \term ->  
-          let rewritten = (recurse term)
-          in  
-            let stripBinding = (\b -> Core.Binding {
-                    Core.bindingName = (Core.bindingName b),
-                    Core.bindingTerm = (Core.bindingTerm b),
-                    Core.bindingType = Nothing})
-            in ((\x -> case x of
-              Core.TermLet v1 -> (Core.TermLet (Core.Let {
-                Core.letBindings = (Lists.map stripBinding (Core.letBindings v1)),
-                Core.letBody = (Core.letBody v1)}))
-              Core.TermTypeApplication v1 -> (Core.typeApplicationTermBody v1)
-              Core.TermTypeLambda v1 -> (Core.typeLambdaBody v1)
-              _ -> rewritten) rewritten))
-  in (rewriteTerm strip term)
-
--- | Strip type annotations from terms while preserving other annotations
-removeTypesFromTerm :: (Core.Term -> Core.Term)
-removeTypesFromTerm term =  
-  let strip = (\recurse -> \term ->  
-          let rewritten = (recurse term)
-          in  
-            let stripBinding = (\b -> Core.Binding {
-                    Core.bindingName = (Core.bindingName b),
-                    Core.bindingTerm = (Core.bindingTerm b),
-                    Core.bindingType = Nothing})
-            in ((\x -> case x of
-              Core.TermFunction v1 -> ((\x -> case x of
-                Core.FunctionElimination v2 -> (Core.TermFunction (Core.FunctionElimination v2))
-                Core.FunctionLambda v2 -> (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.lambdaParameter v2),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.lambdaBody v2)})))
-                _ -> (Core.TermFunction v1)) v1)
-              Core.TermLet v1 -> (Core.TermLet (Core.Let {
-                Core.letBindings = (Lists.map stripBinding (Core.letBindings v1)),
-                Core.letBody = (Core.letBody v1)}))
-              Core.TermTypeApplication v1 -> (Core.typeApplicationTermBody v1)
-              Core.TermTypeLambda v1 -> (Core.typeLambdaBody v1)
-              _ -> rewritten) rewritten))
-  in (rewriteTerm strip term)
-
--- | Replace a free variable in a term
-replaceFreeTermVariable :: (Core.Name -> Core.Term -> Core.Term -> Core.Term)
-replaceFreeTermVariable vold tnew term =  
-  let rewrite = (\recurse -> \t -> (\x -> case x of
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionLambda v2 ->  
-              let v = (Core.lambdaParameter v2)
-              in (Logic.ifElse (Equality.equal v vold) t (recurse t))
-            _ -> (recurse t)) v1)
-          Core.TermVariable v1 -> (Logic.ifElse (Equality.equal v1 vold) tnew (Core.TermVariable v1))
-          _ -> (recurse t)) t)
-  in (rewriteTerm rewrite term)
-
--- | Replace free occurrences of a name in a type
-replaceFreeTypeVariable :: (Core.Name -> Core.Type -> Core.Type -> Core.Type)
-replaceFreeTypeVariable v rep typ =  
-  let mapExpr = (\recurse -> \t -> (\x -> case x of
-          Core.TypeForall v1 -> (Logic.ifElse (Equality.equal v (Core.forallTypeParameter v1)) t (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.forallTypeParameter v1),
-            Core.forallTypeBody = (recurse (Core.forallTypeBody v1))})))
-          Core.TypeVariable v1 -> (Logic.ifElse (Equality.equal v v1) rep t)
-          _ -> (recurse t)) t)
-  in (rewriteType mapExpr typ)
-
--- | Replace all occurrences of simple typedefs (type aliases) with the aliased types, recursively
-replaceTypedefs :: (M.Map Core.Name Core.TypeScheme -> Core.Type -> Core.Type)
-replaceTypedefs types typ0 =  
-  let rewrite = (\recurse -> \typ -> (\x -> case x of
-          Core.TypeAnnotated v1 -> (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = (rewrite recurse (Core.annotatedTypeBody v1)),
-            Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v1)}))
-          Core.TypeRecord _ -> typ
-          Core.TypeUnion _ -> typ
-          Core.TypeVariable v1 ->  
-            let forMono = (\t -> (\x -> case x of
-                    Core.TypeRecord _ -> typ
-                    Core.TypeUnion _ -> typ
-                    Core.TypeWrap _ -> typ
-                    _ -> (rewrite recurse t)) t)
-            in  
-              let forTypeScheme = (\ts ->  
-                      let t = (Core.typeSchemeType ts)
-                      in (Logic.ifElse (Lists.null (Core.typeSchemeVariables ts)) (forMono t) typ))
-              in (Maybes.maybe typ (\ts -> forTypeScheme ts) (Maps.lookup v1 types))
-          Core.TypeWrap _ -> typ
-          _ -> (recurse typ)) typ)
-  in (rewriteType rewrite typ0)
-
--- | Rewrite a term, and at the same time, fold a function over it, accumulating a value
-rewriteAndFoldTerm :: (((t0 -> Core.Term -> (t0, Core.Term)) -> t0 -> Core.Term -> (t0, Core.Term)) -> t0 -> Core.Term -> (t0, Core.Term))
-rewriteAndFoldTerm f term0 =  
-  let fsub = (\recurse -> \val0 -> \term0 ->  
-          let forSingle = (\rec -> \cons -> \val -> \term ->  
-                  let r = (rec val term)
-                  in (Pairs.first r, (cons (Pairs.second r))))
-          in  
-            let forMany = (\rec -> \cons -> \val -> \els ->  
-                    let rr = (Lists.foldl (\r -> \el ->  
-                            let r2 = (rec (Pairs.first r) el)
-                            in (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second r)))) (val, []) els)
-                    in (Pairs.first rr, (cons (Lists.reverse (Pairs.second rr)))))
-            in  
-              let forField = (\val -> \field ->  
-                      let r = (recurse val (Core.fieldTerm field))
-                      in (Pairs.first r, Core.Field {
-                        Core.fieldName = (Core.fieldName field),
-                        Core.fieldTerm = (Pairs.second r)}))
-              in  
-                let forFields = (forMany forField (\x -> x))
-                in  
-                  let forPair = (\val -> \kv ->  
-                          let rk = (recurse val (Pairs.first kv))
-                          in  
-                            let rv = (recurse (Pairs.first rk) (Pairs.second kv))
-                            in (Pairs.first rv, (Pairs.second rk, (Pairs.second rv))))
-                  in  
-                    let forBinding = (\val -> \binding ->  
-                            let r = (recurse val (Core.bindingTerm binding))
-                            in (Pairs.first r, Core.Binding {
-                              Core.bindingName = (Core.bindingName binding),
-                              Core.bindingTerm = (Pairs.second r),
-                              Core.bindingType = (Core.bindingType binding)}))
-                    in  
-                      let forElimination = (\val -> \elm ->  
-                              let r = ((\x -> case x of
-                                      Core.EliminationUnion v1 ->  
-                                        let rmd = (Maybes.map (recurse val) (Core.caseStatementDefault v1))
-                                        in  
-                                          let val1 = (Maybes.maybe val Pairs.first rmd)
-                                          in  
-                                            let rcases = (forFields val1 (Core.caseStatementCases v1))
-                                            in (Pairs.first rcases, (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.caseStatementTypeName v1),
-                                              Core.caseStatementDefault = (Maybes.map Pairs.second rmd),
-                                              Core.caseStatementCases = (Pairs.second rcases)})))
-                                      _ -> (val, elm)) elm)
-                              in (Pairs.first r, (Pairs.second r)))
-                      in  
-                        let forFunction = (\val -> \fun -> (\x -> case x of
-                                Core.FunctionElimination v1 ->  
-                                  let re = (forElimination val v1)
-                                  in (Pairs.first re, (Core.FunctionElimination (Pairs.second re)))
-                                Core.FunctionLambda v1 ->  
-                                  let rl = (recurse val (Core.lambdaBody v1))
-                                  in (Pairs.first rl, (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.lambdaParameter v1),
-                                    Core.lambdaDomain = (Core.lambdaDomain v1),
-                                    Core.lambdaBody = (Pairs.second rl)})))
-                                _ -> (val, fun)) fun)
-                        in  
-                          let dflt = (val0, term0)
-                          in ((\x -> case x of
-                            Core.TermAnnotated v1 -> (forSingle recurse (\t -> Core.TermAnnotated (Core.AnnotatedTerm {
-                              Core.annotatedTermBody = t,
-                              Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)})) val0 (Core.annotatedTermBody v1))
-                            Core.TermApplication v1 ->  
-                              let rlhs = (recurse val0 (Core.applicationFunction v1))
-                              in  
-                                let rrhs = (recurse (Pairs.first rlhs) (Core.applicationArgument v1))
-                                in (Pairs.first rrhs, (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Pairs.second rlhs),
-                                  Core.applicationArgument = (Pairs.second rrhs)})))
-                            Core.TermEither v1 -> (Eithers.either (\l ->  
-                              let rl = (recurse val0 l)
-                              in (Pairs.first rl, (Core.TermEither (Left (Pairs.second rl))))) (\r ->  
-                              let rr = (recurse val0 r)
-                              in (Pairs.first rr, (Core.TermEither (Right (Pairs.second rr))))) v1)
-                            Core.TermFunction v1 -> (forSingle forFunction (\f -> Core.TermFunction f) val0 v1)
-                            Core.TermLet v1 ->  
-                              let renv = (recurse val0 (Core.letBody v1))
-                              in (forMany forBinding (\bins -> Core.TermLet (Core.Let {
-                                Core.letBindings = bins,
-                                Core.letBody = (Pairs.second renv)})) (Pairs.first renv) (Core.letBindings v1))
-                            Core.TermList v1 -> (forMany recurse (\x -> Core.TermList x) val0 v1)
-                            Core.TermMap v1 -> (forMany forPair (\pairs -> Core.TermMap (Maps.fromList pairs)) val0 (Maps.toList v1))
-                            Core.TermMaybe v1 -> (Maybes.maybe dflt (\t -> forSingle recurse (\t1 -> Core.TermMaybe (Just t1)) val0 t) v1)
-                            Core.TermPair v1 ->  
-                              let rf = (recurse val0 (Pairs.first v1))
-                              in  
-                                let rs = (recurse (Pairs.first rf) (Pairs.second v1))
-                                in (Pairs.first rs, (Core.TermPair (Pairs.second rf, (Pairs.second rs))))
-                            Core.TermRecord v1 -> (forMany forField (\fields -> Core.TermRecord (Core.Record {
-                              Core.recordTypeName = (Core.recordTypeName v1),
-                              Core.recordFields = fields})) val0 (Core.recordFields v1))
-                            Core.TermSet v1 -> (forMany recurse (\e -> Core.TermSet (Sets.fromList e)) val0 (Sets.toList v1))
-                            Core.TermTypeApplication v1 -> (forSingle recurse (\t -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = t,
-                              Core.typeApplicationTermType = (Core.typeApplicationTermType v1)})) val0 (Core.typeApplicationTermBody v1))
-                            Core.TermTypeLambda v1 -> (forSingle recurse (\t -> Core.TermTypeLambda (Core.TypeLambda {
-                              Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-                              Core.typeLambdaBody = t})) val0 (Core.typeLambdaBody v1))
-                            Core.TermUnion v1 -> (forSingle recurse (\t -> Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.injectionTypeName v1),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.fieldName (Core.injectionField v1)),
-                                Core.fieldTerm = t}})) val0 (Core.fieldTerm (Core.injectionField v1)))
-                            Core.TermWrap v1 -> (forSingle recurse (\t -> Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.wrappedTermTypeName v1),
-                              Core.wrappedTermBody = t})) val0 (Core.wrappedTermBody v1))
-                            _ -> dflt) term0))
-  in  
-    let recurse = (f (fsub recurse))
-    in (recurse term0)
-
--- | Monadic version: rewrite a term and fold a function over it, accumulating a value
-rewriteAndFoldTermM :: (((t0 -> Core.Term -> Compute.Flow t1 (t0, Core.Term)) -> t0 -> Core.Term -> Compute.Flow t1 (t0, Core.Term)) -> t0 -> Core.Term -> Compute.Flow t1 (t0, Core.Term))
-rewriteAndFoldTermM f term0 =  
-  let fsub = (\recurse -> \val0 -> \term0 ->  
-          let forSingle = (\rec -> \cons -> \val -> \term -> Flows.bind (rec val term) (\r -> Flows.pure (Pairs.first r, (cons (Pairs.second r)))))
-          in  
-            let forMany = (\rec -> \cons -> \val -> \els -> Flows.bind (Flows.foldl (\r -> \el -> Flows.bind (rec (Pairs.first r) el) (\r2 -> Flows.pure (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second r))))) (val, []) els) (\rr -> Flows.pure (Pairs.first rr, (cons (Lists.reverse (Pairs.second rr))))))
-            in  
-              let forField = (\val -> \field -> Flows.bind (recurse val (Core.fieldTerm field)) (\r -> Flows.pure (Pairs.first r, Core.Field {
-                      Core.fieldName = (Core.fieldName field),
-                      Core.fieldTerm = (Pairs.second r)})))
-              in  
-                let forFields = (forMany forField (\x -> x))
-                in  
-                  let forPair = (\val -> \kv -> Flows.bind (recurse val (Pairs.first kv)) (\rk -> Flows.bind (recurse (Pairs.first rk) (Pairs.second kv)) (\rv -> Flows.pure (Pairs.first rv, (Pairs.second rk, (Pairs.second rv))))))
-                  in  
-                    let forBinding = (\val -> \binding -> Flows.bind (recurse val (Core.bindingTerm binding)) (\r -> Flows.pure (Pairs.first r, Core.Binding {
-                            Core.bindingName = (Core.bindingName binding),
-                            Core.bindingTerm = (Pairs.second r),
-                            Core.bindingType = (Core.bindingType binding)})))
-                    in  
-                      let forElimination = (\val -> \elm ->  
-                              let rw = (\elm -> (\x -> case x of
-                                      Core.EliminationUnion v1 -> (Flows.bind (Maybes.maybe (Flows.pure Nothing) (\def -> Flows.map Maybes.pure (recurse val def)) (Core.caseStatementDefault v1)) (\rmd ->  
-                                        let val1 = (Maybes.maybe val Pairs.first rmd)
-                                        in (Flows.bind (forFields val1 (Core.caseStatementCases v1)) (\rcases -> Flows.pure (Pairs.first rcases, (Core.EliminationUnion (Core.CaseStatement {
-                                          Core.caseStatementTypeName = (Core.caseStatementTypeName v1),
-                                          Core.caseStatementDefault = (Maybes.map Pairs.second rmd),
-                                          Core.caseStatementCases = (Pairs.second rcases)})))))))
-                                      _ -> (Flows.pure (val, elm))) elm)
-                              in (Flows.bind (rw elm) (\r -> Flows.pure (Pairs.first r, (Pairs.second r)))))
-                      in  
-                        let forFunction = (\val -> \fun -> (\x -> case x of
-                                Core.FunctionElimination v1 -> (Flows.bind (forElimination val v1) (\r -> Flows.pure (Pairs.first r, (Core.FunctionElimination (Pairs.second r)))))
-                                Core.FunctionLambda v1 -> (Flows.bind (recurse val (Core.lambdaBody v1)) (\r -> Flows.pure (Pairs.first r, (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.lambdaParameter v1),
-                                  Core.lambdaDomain = (Core.lambdaDomain v1),
-                                  Core.lambdaBody = (Pairs.second r)})))))
-                                _ -> (Flows.pure (val, fun))) fun)
-                        in  
-                          let dflt = (Flows.pure (val0, term0))
-                          in ((\x -> case x of
-                            Core.TermAnnotated v1 -> (forSingle recurse (\t -> Core.TermAnnotated (Core.AnnotatedTerm {
-                              Core.annotatedTermBody = t,
-                              Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)})) val0 (Core.annotatedTermBody v1))
-                            Core.TermApplication v1 -> (Flows.bind (recurse val0 (Core.applicationFunction v1)) (\rlhs -> Flows.bind (recurse (Pairs.first rlhs) (Core.applicationArgument v1)) (\rrhs -> Flows.pure (Pairs.first rrhs, (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Pairs.second rlhs),
-                              Core.applicationArgument = (Pairs.second rrhs)}))))))
-                            Core.TermEither v1 -> (Eithers.either (\l -> Flows.bind (recurse val0 l) (\rl -> Flows.pure (Pairs.first rl, (Core.TermEither (Left (Pairs.second rl)))))) (\r -> Flows.bind (recurse val0 r) (\rr -> Flows.pure (Pairs.first rr, (Core.TermEither (Right (Pairs.second rr)))))) v1)
-                            Core.TermFunction v1 -> (forSingle forFunction (\f -> Core.TermFunction f) val0 v1)
-                            Core.TermLet v1 -> (Flows.bind (recurse val0 (Core.letBody v1)) (\renv -> forMany forBinding (\bins -> Core.TermLet (Core.Let {
-                              Core.letBindings = bins,
-                              Core.letBody = (Pairs.second renv)})) (Pairs.first renv) (Core.letBindings v1)))
-                            Core.TermList v1 -> (forMany recurse (\x -> Core.TermList x) val0 v1)
-                            Core.TermMap v1 -> (forMany forPair (\pairs -> Core.TermMap (Maps.fromList pairs)) val0 (Maps.toList v1))
-                            Core.TermMaybe v1 -> (Maybes.maybe dflt (\t -> forSingle recurse (\t1 -> Core.TermMaybe (Just t1)) val0 t) v1)
-                            Core.TermPair v1 -> (Flows.bind (recurse val0 (Pairs.first v1)) (\rf -> Flows.bind (recurse (Pairs.first rf) (Pairs.second v1)) (\rs -> Flows.pure (Pairs.first rs, (Core.TermPair (Pairs.second rf, (Pairs.second rs)))))))
-                            Core.TermRecord v1 -> (forMany forField (\fields -> Core.TermRecord (Core.Record {
-                              Core.recordTypeName = (Core.recordTypeName v1),
-                              Core.recordFields = fields})) val0 (Core.recordFields v1))
-                            Core.TermSet v1 -> (forMany recurse (\e -> Core.TermSet (Sets.fromList e)) val0 (Sets.toList v1))
-                            Core.TermTypeApplication v1 -> (forSingle recurse (\t -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = t,
-                              Core.typeApplicationTermType = (Core.typeApplicationTermType v1)})) val0 (Core.typeApplicationTermBody v1))
-                            Core.TermTypeLambda v1 -> (forSingle recurse (\t -> Core.TermTypeLambda (Core.TypeLambda {
-                              Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-                              Core.typeLambdaBody = t})) val0 (Core.typeLambdaBody v1))
-                            Core.TermUnion v1 -> (forSingle recurse (\t -> Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.injectionTypeName v1),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.fieldName (Core.injectionField v1)),
-                                Core.fieldTerm = t}})) val0 (Core.fieldTerm (Core.injectionField v1)))
-                            Core.TermWrap v1 -> (forSingle recurse (\t -> Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.wrappedTermTypeName v1),
-                              Core.wrappedTermBody = t})) val0 (Core.wrappedTermBody v1))
-                            _ -> dflt) term0))
-  in  
-    let recurse = (f (fsub recurse))
-    in (recurse term0)
-
--- | Rewrite a term with path tracking, and fold a function over it, accumulating a value. The path is a list of TermAccessors from root to current position.
-rewriteAndFoldTermWithPath :: ((([Accessors.TermAccessor] -> t0 -> Core.Term -> (t0, Core.Term)) -> [Accessors.TermAccessor] -> t0 -> Core.Term -> (t0, Core.Term)) -> t0 -> Core.Term -> (t0, Core.Term))
-rewriteAndFoldTermWithPath f term0 =  
-  let fsub = (\recurse -> \path -> \val0 -> \term0 ->  
-          let forSingleWithAccessor = (\rec -> \cons -> \accessor -> \val -> \term ->  
-                  let r = (rec (Lists.concat2 path [
-                          accessor]) val term)
-                  in (Pairs.first r, (cons (Pairs.second r))))
-          in  
-            let forManyWithAccessors = (\rec -> \cons -> \val -> \accessorTermPairs ->  
-                    let rr = (Lists.foldl (\r -> \atp ->  
-                            let r2 = (rec (Lists.concat2 path [
-                                    Pairs.first atp]) (Pairs.first r) (Pairs.second atp))
-                            in (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second r)))) (val, []) accessorTermPairs)
-                    in (Pairs.first rr, (cons (Lists.reverse (Pairs.second rr)))))
-            in  
-              let forFieldWithAccessor = (\mkAccessor -> \val -> \field ->  
-                      let r = (recurse (Lists.concat2 path [
-                              mkAccessor (Core.fieldName field)]) val (Core.fieldTerm field))
-                      in (Pairs.first r, Core.Field {
-                        Core.fieldName = (Core.fieldName field),
-                        Core.fieldTerm = (Pairs.second r)}))
-              in  
-                let forFieldsWithAccessor = (\mkAccessor -> forManyWithAccessors (\path1 -> \val1 -> \field1 -> forFieldWithAccessor mkAccessor val1 field1) (\x -> x))
-                in  
-                  let forPairWithAccessors = (\keyAccessor -> \valAccessor -> \val -> \kv ->  
-                          let rk = (recurse (Lists.concat2 path [
-                                  keyAccessor]) val (Pairs.first kv))
-                          in  
-                            let rv = (recurse (Lists.concat2 path [
-                                    valAccessor]) (Pairs.first rk) (Pairs.second kv))
-                            in (Pairs.first rv, (Pairs.second rk, (Pairs.second rv))))
-                  in  
-                    let forBindingWithAccessor = (\val -> \binding ->  
-                            let r = (recurse (Lists.concat2 path [
-                                    Accessors.TermAccessorLetBinding (Core.bindingName binding)]) val (Core.bindingTerm binding))
-                            in (Pairs.first r, Core.Binding {
-                              Core.bindingName = (Core.bindingName binding),
-                              Core.bindingTerm = (Pairs.second r),
-                              Core.bindingType = (Core.bindingType binding)}))
-                    in  
-                      let forElimination = (\val -> \elm ->  
-                              let r = ((\x -> case x of
-                                      Core.EliminationUnion v1 ->  
-                                        let rmd = (Maybes.map (\def -> recurse (Lists.concat2 path [
-                                                Accessors.TermAccessorUnionCasesDefault]) val def) (Core.caseStatementDefault v1))
-                                        in  
-                                          let val1 = (Maybes.maybe val Pairs.first rmd)
-                                          in  
-                                            let rcases = (forManyWithAccessors recurse (\x -> x) val1 (Lists.map (\f -> (Accessors.TermAccessorUnionCasesBranch (Core.fieldName f), (Core.fieldTerm f))) (Core.caseStatementCases v1)))
-                                            in (Pairs.first rcases, (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.caseStatementTypeName v1),
-                                              Core.caseStatementDefault = (Maybes.map Pairs.second rmd),
-                                              Core.caseStatementCases = (Lists.map (\ft -> Core.Field {
-                                                Core.fieldName = (Pairs.first ft),
-                                                Core.fieldTerm = (Pairs.second ft)}) (Lists.zip (Lists.map Core.fieldName (Core.caseStatementCases v1)) (Pairs.second rcases)))})))
-                                      _ -> (val, elm)) elm)
-                              in (Pairs.first r, (Pairs.second r)))
-                      in  
-                        let forFunction = (\val -> \fun -> (\x -> case x of
-                                Core.FunctionElimination v1 ->  
-                                  let re = (forElimination val v1)
-                                  in (Pairs.first re, (Core.FunctionElimination (Pairs.second re)))
-                                Core.FunctionLambda v1 ->  
-                                  let rl = (recurse (Lists.concat2 path [
-                                          Accessors.TermAccessorLambdaBody]) val (Core.lambdaBody v1))
-                                  in (Pairs.first rl, (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.lambdaParameter v1),
-                                    Core.lambdaDomain = (Core.lambdaDomain v1),
-                                    Core.lambdaBody = (Pairs.second rl)})))
-                                _ -> (val, fun)) fun)
-                        in  
-                          let dflt = (val0, term0)
-                          in ((\x -> case x of
-                            Core.TermAnnotated v1 -> (forSingleWithAccessor recurse (\t -> Core.TermAnnotated (Core.AnnotatedTerm {
-                              Core.annotatedTermBody = t,
-                              Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)})) Accessors.TermAccessorAnnotatedBody val0 (Core.annotatedTermBody v1))
-                            Core.TermApplication v1 ->  
-                              let rlhs = (recurse (Lists.concat2 path [
-                                      Accessors.TermAccessorApplicationFunction]) val0 (Core.applicationFunction v1))
-                              in  
-                                let rrhs = (recurse (Lists.concat2 path [
-                                        Accessors.TermAccessorApplicationArgument]) (Pairs.first rlhs) (Core.applicationArgument v1))
-                                in (Pairs.first rrhs, (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Pairs.second rlhs),
-                                  Core.applicationArgument = (Pairs.second rrhs)})))
-                            Core.TermEither v1 -> (Eithers.either (\l ->  
-                              let rl = (recurse (Lists.concat2 path [
-                                      Accessors.TermAccessorSumTerm]) val0 l)
-                              in (Pairs.first rl, (Core.TermEither (Left (Pairs.second rl))))) (\r ->  
-                              let rr = (recurse (Lists.concat2 path [
-                                      Accessors.TermAccessorSumTerm]) val0 r)
-                              in (Pairs.first rr, (Core.TermEither (Right (Pairs.second rr))))) v1)
-                            Core.TermFunction v1 ->  
-                              let rf = (forFunction val0 v1)
-                              in (Pairs.first rf, (Core.TermFunction (Pairs.second rf)))
-                            Core.TermLet v1 ->  
-                              let renv = (recurse (Lists.concat2 path [
-                                      Accessors.TermAccessorLetBody]) val0 (Core.letBody v1))
-                              in  
-                                let rbindings = (Lists.foldl (\r -> \binding ->  
-                                        let rb = (forBindingWithAccessor (Pairs.first r) binding)
-                                        in (Pairs.first rb, (Lists.cons (Pairs.second rb) (Pairs.second r)))) (Pairs.first renv, []) (Core.letBindings v1))
-                                in (Pairs.first rbindings, (Core.TermLet (Core.Let {
-                                  Core.letBindings = (Lists.reverse (Pairs.second rbindings)),
-                                  Core.letBody = (Pairs.second renv)})))
-                            Core.TermList v1 ->  
-                              let idx = 0
-                              in  
-                                let rr = (Lists.foldl (\r -> \el ->  
-                                        let r2 = (recurse (Lists.concat2 path [
-                                                Accessors.TermAccessorListElement (Pairs.first r)]) (Pairs.first (Pairs.second r)) el)
-                                        in (Math.add (Pairs.first r) 1, (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second (Pairs.second r)))))) (idx, (val0, [])) v1)
-                                in (Pairs.first (Pairs.second rr), (Core.TermList (Lists.reverse (Pairs.second (Pairs.second rr)))))
-                            Core.TermMap v1 ->  
-                              let idx = 0
-                              in  
-                                let rr = (Lists.foldl (\r -> \kv ->  
-                                        let rk = (recurse (Lists.concat2 path [
-                                                Accessors.TermAccessorMapKey (Pairs.first r)]) (Pairs.first (Pairs.second r)) (Pairs.first kv))
-                                        in  
-                                          let rv = (recurse (Lists.concat2 path [
-                                                  Accessors.TermAccessorMapValue (Pairs.first r)]) (Pairs.first rk) (Pairs.second kv))
-                                          in (Math.add (Pairs.first r) 1, (Pairs.first rv, (Lists.cons (Pairs.second rk, (Pairs.second rv)) (Pairs.second (Pairs.second r)))))) (idx, (val0, [])) (Maps.toList v1))
-                                in (Pairs.first (Pairs.second rr), (Core.TermMap (Maps.fromList (Lists.reverse (Pairs.second (Pairs.second rr))))))
-                            Core.TermMaybe v1 -> (Maybes.maybe dflt (\t -> forSingleWithAccessor recurse (\t1 -> Core.TermMaybe (Just t1)) Accessors.TermAccessorMaybeTerm val0 t) v1)
-                            Core.TermPair v1 ->  
-                              let rf = (recurse (Lists.concat2 path [
-                                      Accessors.TermAccessorProductTerm 0]) val0 (Pairs.first v1))
-                              in  
-                                let rs = (recurse (Lists.concat2 path [
-                                        Accessors.TermAccessorProductTerm 1]) (Pairs.first rf) (Pairs.second v1))
-                                in (Pairs.first rs, (Core.TermPair (Pairs.second rf, (Pairs.second rs))))
-                            Core.TermRecord v1 ->  
-                              let rfields = (forManyWithAccessors recurse (\x -> x) val0 (Lists.map (\f -> (Accessors.TermAccessorRecordField (Core.fieldName f), (Core.fieldTerm f))) (Core.recordFields v1)))
-                              in (Pairs.first rfields, (Core.TermRecord (Core.Record {
-                                Core.recordTypeName = (Core.recordTypeName v1),
-                                Core.recordFields = (Lists.map (\ft -> Core.Field {
-                                  Core.fieldName = (Pairs.first ft),
-                                  Core.fieldTerm = (Pairs.second ft)}) (Lists.zip (Lists.map Core.fieldName (Core.recordFields v1)) (Pairs.second rfields)))})))
-                            Core.TermSet v1 ->  
-                              let idx = 0
-                              in  
-                                let rr = (Lists.foldl (\r -> \el ->  
-                                        let r2 = (recurse (Lists.concat2 path [
-                                                Accessors.TermAccessorSetElement (Pairs.first r)]) (Pairs.first (Pairs.second r)) el)
-                                        in (Math.add (Pairs.first r) 1, (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second (Pairs.second r)))))) (idx, (val0, [])) (Sets.toList v1))
-                                in (Pairs.first (Pairs.second rr), (Core.TermSet (Sets.fromList (Lists.reverse (Pairs.second (Pairs.second rr))))))
-                            Core.TermTypeApplication v1 -> (forSingleWithAccessor recurse (\t -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = t,
-                              Core.typeApplicationTermType = (Core.typeApplicationTermType v1)})) Accessors.TermAccessorTypeApplicationTerm val0 (Core.typeApplicationTermBody v1))
-                            Core.TermTypeLambda v1 -> (forSingleWithAccessor recurse (\t -> Core.TermTypeLambda (Core.TypeLambda {
-                              Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-                              Core.typeLambdaBody = t})) Accessors.TermAccessorTypeLambdaBody val0 (Core.typeLambdaBody v1))
-                            Core.TermUnion v1 -> (forSingleWithAccessor recurse (\t -> Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.injectionTypeName v1),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.fieldName (Core.injectionField v1)),
-                                Core.fieldTerm = t}})) Accessors.TermAccessorInjectionTerm val0 (Core.fieldTerm (Core.injectionField v1)))
-                            Core.TermWrap v1 -> (forSingleWithAccessor recurse (\t -> Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.wrappedTermTypeName v1),
-                              Core.wrappedTermBody = t})) Accessors.TermAccessorWrappedTerm val0 (Core.wrappedTermBody v1))
-                            _ -> dflt) term0))
-  in  
-    let recurse = (f (fsub recurse))
-    in (recurse [] term0)
-
-rewriteTerm :: (((Core.Term -> Core.Term) -> Core.Term -> Core.Term) -> Core.Term -> Core.Term)
-rewriteTerm f term0 =  
-  let fsub = (\recurse -> \term ->  
-          let forField = (\f -> Core.Field {
-                  Core.fieldName = (Core.fieldName f),
-                  Core.fieldTerm = (recurse (Core.fieldTerm f))})
-          in  
-            let forElimination = (\elm -> (\x -> case x of
-                    Core.EliminationRecord v1 -> (Core.EliminationRecord v1)
-                    Core.EliminationUnion v1 -> (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.caseStatementTypeName v1),
-                      Core.caseStatementDefault = (Maybes.map recurse (Core.caseStatementDefault v1)),
-                      Core.caseStatementCases = (Lists.map forField (Core.caseStatementCases v1))}))
-                    Core.EliminationWrap v1 -> (Core.EliminationWrap v1)) elm)
-            in  
-              let forFunction = (\fun -> (\x -> case x of
-                      Core.FunctionElimination v1 -> (Core.FunctionElimination (forElimination v1))
-                      Core.FunctionLambda v1 -> (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.lambdaParameter v1),
-                        Core.lambdaDomain = (Core.lambdaDomain v1),
-                        Core.lambdaBody = (recurse (Core.lambdaBody v1))}))
-                      Core.FunctionPrimitive v1 -> (Core.FunctionPrimitive v1)) fun)
-              in  
-                let forLet = (\lt ->  
-                        let mapBinding = (\b -> Core.Binding {
-                                Core.bindingName = (Core.bindingName b),
-                                Core.bindingTerm = (recurse (Core.bindingTerm b)),
-                                Core.bindingType = (Core.bindingType b)})
-                        in Core.Let {
-                          Core.letBindings = (Lists.map mapBinding (Core.letBindings lt)),
-                          Core.letBody = (recurse (Core.letBody lt))})
-                in  
-                  let forMap = (\m ->  
-                          let forPair = (\p -> (recurse (Pairs.first p), (recurse (Pairs.second p))))
-                          in (Maps.fromList (Lists.map forPair (Maps.toList m))))
-                  in ((\x -> case x of
-                    Core.TermAnnotated v1 -> (Core.TermAnnotated (Core.AnnotatedTerm {
-                      Core.annotatedTermBody = (recurse (Core.annotatedTermBody v1)),
-                      Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)}))
-                    Core.TermApplication v1 -> (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (recurse (Core.applicationFunction v1)),
-                      Core.applicationArgument = (recurse (Core.applicationArgument v1))}))
-                    Core.TermEither v1 -> (Core.TermEither (Eithers.either (\l -> Left (recurse l)) (\r -> Right (recurse r)) v1))
-                    Core.TermFunction v1 -> (Core.TermFunction (forFunction v1))
-                    Core.TermLet v1 -> (Core.TermLet (forLet v1))
-                    Core.TermList v1 -> (Core.TermList (Lists.map recurse v1))
-                    Core.TermLiteral v1 -> (Core.TermLiteral v1)
-                    Core.TermMap v1 -> (Core.TermMap (forMap v1))
-                    Core.TermMaybe v1 -> (Core.TermMaybe (Maybes.map recurse v1))
-                    Core.TermPair v1 -> (Core.TermPair (recurse (Pairs.first v1), (recurse (Pairs.second v1))))
-                    Core.TermRecord v1 -> (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.recordTypeName v1),
-                      Core.recordFields = (Lists.map forField (Core.recordFields v1))}))
-                    Core.TermSet v1 -> (Core.TermSet (Sets.fromList (Lists.map recurse (Sets.toList v1))))
-                    Core.TermTypeApplication v1 -> (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (recurse (Core.typeApplicationTermBody v1)),
-                      Core.typeApplicationTermType = (Core.typeApplicationTermType v1)}))
-                    Core.TermTypeLambda v1 -> (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-                      Core.typeLambdaBody = (recurse (Core.typeLambdaBody v1))}))
-                    Core.TermUnion v1 -> (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.injectionTypeName v1),
-                      Core.injectionField = (forField (Core.injectionField v1))}))
-                    Core.TermUnit -> Core.TermUnit
-                    Core.TermVariable v1 -> (Core.TermVariable v1)
-                    Core.TermWrap v1 -> (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.wrappedTermTypeName v1),
-                      Core.wrappedTermBody = (recurse (Core.wrappedTermBody v1))}))) term))
-  in  
-    let recurse = (f (fsub recurse))
-    in (recurse term0)
-
--- | Monadic term rewriting with custom transformation function
-rewriteTermM :: (((Core.Term -> Compute.Flow t0 Core.Term) -> Core.Term -> Compute.Flow t0 Core.Term) -> Core.Term -> Compute.Flow t0 Core.Term)
-rewriteTermM f term0 =  
-  let fsub = (\recurse -> \term ->  
-          let forField = (\field -> Flows.bind (recurse (Core.fieldTerm field)) (\t -> Flows.pure (Core.Field {
-                  Core.fieldName = (Core.fieldName field),
-                  Core.fieldTerm = t})))
-          in  
-            let forPair = (\kv -> Flows.bind (recurse (Pairs.first kv)) (\k -> Flows.bind (recurse (Pairs.second kv)) (\v -> Flows.pure (k, v))))
-            in  
-              let mapBinding = (\b -> Flows.bind (recurse (Core.bindingTerm b)) (\v -> Flows.pure (Core.Binding {
-                      Core.bindingName = (Core.bindingName b),
-                      Core.bindingTerm = v,
-                      Core.bindingType = (Core.bindingType b)})))
-              in ((\x -> case x of
-                Core.TermAnnotated v1 -> (Flows.bind (recurse (Core.annotatedTermBody v1)) (\ex -> Flows.pure (Core.TermAnnotated (Core.AnnotatedTerm {
-                  Core.annotatedTermBody = ex,
-                  Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)}))))
-                Core.TermApplication v1 -> (Flows.bind (recurse (Core.applicationFunction v1)) (\lhs -> Flows.bind (recurse (Core.applicationArgument v1)) (\rhs -> Flows.pure (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = lhs,
-                  Core.applicationArgument = rhs})))))
-                Core.TermEither v1 -> (Flows.bind (Eithers.either (\l -> Flows.map (\x -> Left x) (recurse l)) (\r -> Flows.map (\x -> Right x) (recurse r)) v1) (\re -> Flows.pure (Core.TermEither re)))
-                Core.TermFunction v1 ->  
-                  let forElm = (\e -> (\x -> case x of
-                          Core.EliminationRecord v2 -> (Flows.pure (Core.FunctionElimination (Core.EliminationRecord v2)))
-                          Core.EliminationUnion v2 ->  
-                            let n = (Core.caseStatementTypeName v2)
-                            in  
-                              let def = (Core.caseStatementDefault v2)
-                              in  
-                                let cases = (Core.caseStatementCases v2)
-                                in (Flows.bind (Maybes.maybe (Flows.pure Nothing) (\t -> Flows.map Maybes.pure (recurse t)) def) (\rdef -> Flows.map (\rcases -> Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = n,
-                                  Core.caseStatementDefault = rdef,
-                                  Core.caseStatementCases = rcases}))) (Flows.mapList forField cases)))
-                          Core.EliminationWrap v2 -> (Flows.pure (Core.FunctionElimination (Core.EliminationWrap v2)))) e)
-                  in  
-                    let forFun = (\fun -> (\x -> case x of
-                            Core.FunctionElimination v2 -> (forElm v2)
-                            Core.FunctionLambda v2 ->  
-                              let v = (Core.lambdaParameter v2)
-                              in  
-                                let d = (Core.lambdaDomain v2)
-                                in  
-                                  let body = (Core.lambdaBody v2)
-                                  in (Flows.bind (recurse body) (\rbody -> Flows.pure (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = v,
-                                    Core.lambdaDomain = d,
-                                    Core.lambdaBody = rbody}))))
-                            Core.FunctionPrimitive v2 -> (Flows.pure (Core.FunctionPrimitive v2))) fun)
-                    in (Flows.bind (forFun v1) (\rfun -> Flows.pure (Core.TermFunction rfun)))
-                Core.TermLet v1 ->  
-                  let bindings = (Core.letBindings v1)
-                  in  
-                    let env = (Core.letBody v1)
-                    in (Flows.bind (Flows.mapList mapBinding bindings) (\rbindings -> Flows.bind (recurse env) (\renv -> Flows.pure (Core.TermLet (Core.Let {
-                      Core.letBindings = rbindings,
-                      Core.letBody = renv})))))
-                Core.TermList v1 -> (Flows.bind (Flows.mapList recurse v1) (\rels -> Flows.pure (Core.TermList rels)))
-                Core.TermLiteral v1 -> (Flows.pure (Core.TermLiteral v1))
-                Core.TermMap v1 -> (Flows.bind (Flows.mapList forPair (Maps.toList v1)) (\pairs -> Flows.pure (Core.TermMap (Maps.fromList pairs))))
-                Core.TermMaybe v1 -> (Flows.bind (Flows.mapMaybe recurse v1) (\rm -> Flows.pure (Core.TermMaybe rm)))
-                Core.TermPair v1 -> (Flows.bind (recurse (Pairs.first v1)) (\rf -> Flows.bind (recurse (Pairs.second v1)) (\rs -> Flows.pure (Core.TermPair (rf, rs)))))
-                Core.TermRecord v1 ->  
-                  let n = (Core.recordTypeName v1)
-                  in  
-                    let fields = (Core.recordFields v1)
-                    in (Flows.map (\rfields -> Core.TermRecord (Core.Record {
-                      Core.recordTypeName = n,
-                      Core.recordFields = rfields})) (Flows.mapList forField fields))
-                Core.TermSet v1 -> (Flows.bind (Flows.mapList recurse (Sets.toList v1)) (\rlist -> Flows.pure (Core.TermSet (Sets.fromList rlist))))
-                Core.TermTypeApplication v1 -> (Flows.bind (recurse (Core.typeApplicationTermBody v1)) (\t -> Flows.pure (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = t,
-                  Core.typeApplicationTermType = (Core.typeApplicationTermType v1)}))))
-                Core.TermTypeLambda v1 ->  
-                  let v = (Core.typeLambdaParameter v1)
-                  in  
-                    let body = (Core.typeLambdaBody v1)
-                    in (Flows.bind (recurse body) (\rbody -> Flows.pure (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = v,
-                      Core.typeLambdaBody = rbody}))))
-                Core.TermUnion v1 ->  
-                  let n = (Core.injectionTypeName v1)
-                  in  
-                    let field = (Core.injectionField v1)
-                    in (Flows.map (\rfield -> Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = n,
-                      Core.injectionField = rfield})) (forField field))
-                Core.TermUnit -> (Flows.pure Core.TermUnit)
-                Core.TermVariable v1 -> (Flows.pure (Core.TermVariable v1))
-                Core.TermWrap v1 ->  
-                  let name = (Core.wrappedTermTypeName v1)
-                  in  
-                    let t = (Core.wrappedTermBody v1)
-                    in (Flows.bind (recurse t) (\rt -> Flows.pure (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = name,
-                      Core.wrappedTermBody = rt}))))) term))
-  in  
-    let recurse = (f (fsub recurse))
-    in (recurse term0)
-
--- | A variant of rewriteTerm which allows a context (e.g. a TypeContext) to be passed down to all subterms during rewriting
-rewriteTermWithContext :: (((t0 -> Core.Term -> Core.Term) -> t0 -> Core.Term -> Core.Term) -> t0 -> Core.Term -> Core.Term)
-rewriteTermWithContext f cx0 term0 =  
-  let forSubterms = (\recurse0 -> \cx -> \term ->  
-          let recurse = (recurse0 cx)
-          in  
-            let forField = (\field -> Core.Field {
-                    Core.fieldName = (Core.fieldName field),
-                    Core.fieldTerm = (recurse (Core.fieldTerm field))})
-            in  
-              let forElimination = (\elm -> (\x -> case x of
-                      Core.EliminationRecord v1 -> (Core.EliminationRecord v1)
-                      Core.EliminationUnion v1 -> (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.caseStatementTypeName v1),
-                        Core.caseStatementDefault = (Maybes.map recurse (Core.caseStatementDefault v1)),
-                        Core.caseStatementCases = (Lists.map forField (Core.caseStatementCases v1))}))
-                      Core.EliminationWrap v1 -> (Core.EliminationWrap v1)) elm)
-              in  
-                let forFunction = (\fun -> (\x -> case x of
-                        Core.FunctionElimination v1 -> (Core.FunctionElimination (forElimination v1))
-                        Core.FunctionLambda v1 -> (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.lambdaParameter v1),
-                          Core.lambdaDomain = (Core.lambdaDomain v1),
-                          Core.lambdaBody = (recurse (Core.lambdaBody v1))}))
-                        Core.FunctionPrimitive v1 -> (Core.FunctionPrimitive v1)) fun)
-                in  
-                  let forLet = (\lt ->  
-                          let mapBinding = (\b -> Core.Binding {
-                                  Core.bindingName = (Core.bindingName b),
-                                  Core.bindingTerm = (recurse (Core.bindingTerm b)),
-                                  Core.bindingType = (Core.bindingType b)})
-                          in Core.Let {
-                            Core.letBindings = (Lists.map mapBinding (Core.letBindings lt)),
-                            Core.letBody = (recurse (Core.letBody lt))})
-                  in  
-                    let forMap = (\m ->  
-                            let forPair = (\p -> (recurse (Pairs.first p), (recurse (Pairs.second p))))
-                            in (Maps.fromList (Lists.map forPair (Maps.toList m))))
-                    in ((\x -> case x of
-                      Core.TermAnnotated v1 -> (Core.TermAnnotated (Core.AnnotatedTerm {
-                        Core.annotatedTermBody = (recurse (Core.annotatedTermBody v1)),
-                        Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)}))
-                      Core.TermApplication v1 -> (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (recurse (Core.applicationFunction v1)),
-                        Core.applicationArgument = (recurse (Core.applicationArgument v1))}))
-                      Core.TermEither v1 -> (Core.TermEither (Eithers.either (\l -> Left (recurse l)) (\r -> Right (recurse r)) v1))
-                      Core.TermFunction v1 -> (Core.TermFunction (forFunction v1))
-                      Core.TermLet v1 -> (Core.TermLet (forLet v1))
-                      Core.TermList v1 -> (Core.TermList (Lists.map recurse v1))
-                      Core.TermLiteral v1 -> (Core.TermLiteral v1)
-                      Core.TermMap v1 -> (Core.TermMap (forMap v1))
-                      Core.TermMaybe v1 -> (Core.TermMaybe (Maybes.map recurse v1))
-                      Core.TermPair v1 -> (Core.TermPair (recurse (Pairs.first v1), (recurse (Pairs.second v1))))
-                      Core.TermRecord v1 -> (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.recordTypeName v1),
-                        Core.recordFields = (Lists.map forField (Core.recordFields v1))}))
-                      Core.TermSet v1 -> (Core.TermSet (Sets.fromList (Lists.map recurse (Sets.toList v1))))
-                      Core.TermTypeApplication v1 -> (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (recurse (Core.typeApplicationTermBody v1)),
-                        Core.typeApplicationTermType = (Core.typeApplicationTermType v1)}))
-                      Core.TermTypeLambda v1 -> (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.typeLambdaParameter v1),
-                        Core.typeLambdaBody = (recurse (Core.typeLambdaBody v1))}))
-                      Core.TermUnion v1 -> (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.injectionTypeName v1),
-                        Core.injectionField = (forField (Core.injectionField v1))}))
-                      Core.TermUnit -> Core.TermUnit
-                      Core.TermVariable v1 -> (Core.TermVariable v1)
-                      Core.TermWrap v1 -> (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.wrappedTermTypeName v1),
-                        Core.wrappedTermBody = (recurse (Core.wrappedTermBody v1))}))) term))
-  in  
-    let rewrite = (\cx -> \term -> f (forSubterms rewrite) cx term)
-    in (rewrite cx0 term0)
-
--- | A variant of rewriteTermM which allows a context (e.g. a TypeContext) to be passed down to all subterms during rewriting
-rewriteTermWithContextM :: (((t0 -> Core.Term -> Compute.Flow t1 Core.Term) -> t0 -> Core.Term -> Compute.Flow t1 Core.Term) -> t0 -> Core.Term -> Compute.Flow t1 Core.Term)
-rewriteTermWithContextM f cx0 term0 =  
-  let forSubterms = (\recurse0 -> \cx -> \term ->  
-          let recurse = (recurse0 cx)
-          in  
-            let forField = (\field -> Flows.bind (recurse (Core.fieldTerm field)) (\t -> Flows.pure (Core.Field {
-                    Core.fieldName = (Core.fieldName field),
-                    Core.fieldTerm = t})))
-            in  
-              let forPair = (\kv -> Flows.bind (recurse (Pairs.first kv)) (\k -> Flows.bind (recurse (Pairs.second kv)) (\v -> Flows.pure (k, v))))
-              in  
-                let forElimination = (\e -> (\x -> case x of
-                        Core.EliminationRecord v1 -> (Flows.pure (Core.FunctionElimination (Core.EliminationRecord v1)))
-                        Core.EliminationUnion v1 ->  
-                          let n = (Core.caseStatementTypeName v1)
-                          in  
-                            let def = (Core.caseStatementDefault v1)
-                            in  
-                              let cases = (Core.caseStatementCases v1)
-                              in (Flows.bind (Maybes.maybe (Flows.pure Nothing) (\t -> Flows.map Maybes.pure (recurse t)) def) (\rdef -> Flows.map (\rcases -> Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                Core.caseStatementTypeName = n,
-                                Core.caseStatementDefault = rdef,
-                                Core.caseStatementCases = rcases}))) (Flows.mapList forField cases)))
-                        Core.EliminationWrap v1 -> (Flows.pure (Core.FunctionElimination (Core.EliminationWrap v1)))) e)
-                in  
-                  let forFunction = (\fun -> (\x -> case x of
-                          Core.FunctionElimination v1 -> (forElimination v1)
-                          Core.FunctionLambda v1 ->  
-                            let v = (Core.lambdaParameter v1)
-                            in  
-                              let d = (Core.lambdaDomain v1)
-                              in  
-                                let body = (Core.lambdaBody v1)
-                                in (Flows.bind (recurse body) (\rbody -> Flows.pure (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = v,
-                                  Core.lambdaDomain = d,
-                                  Core.lambdaBody = rbody}))))
-                          Core.FunctionPrimitive v1 -> (Flows.pure (Core.FunctionPrimitive v1))) fun)
-                  in  
-                    let mapBinding = (\b -> Flows.bind (recurse (Core.bindingTerm b)) (\v -> Flows.pure (Core.Binding {
-                            Core.bindingName = (Core.bindingName b),
-                            Core.bindingTerm = v,
-                            Core.bindingType = (Core.bindingType b)})))
-                    in ((\x -> case x of
-                      Core.TermAnnotated v1 -> (Flows.bind (recurse (Core.annotatedTermBody v1)) (\ex -> Flows.pure (Core.TermAnnotated (Core.AnnotatedTerm {
-                        Core.annotatedTermBody = ex,
-                        Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v1)}))))
-                      Core.TermApplication v1 -> (Flows.bind (recurse (Core.applicationFunction v1)) (\lhs -> Flows.bind (recurse (Core.applicationArgument v1)) (\rhs -> Flows.pure (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = lhs,
-                        Core.applicationArgument = rhs})))))
-                      Core.TermEither v1 -> (Flows.bind (Eithers.either (\l -> Flows.map (\x -> Left x) (recurse l)) (\r -> Flows.map (\x -> Right x) (recurse r)) v1) (\re -> Flows.pure (Core.TermEither re)))
-                      Core.TermFunction v1 -> (Flows.bind (forFunction v1) (\rfun -> Flows.pure (Core.TermFunction rfun)))
-                      Core.TermLet v1 ->  
-                        let bindings = (Core.letBindings v1)
-                        in  
-                          let body = (Core.letBody v1)
-                          in (Flows.bind (Flows.mapList mapBinding bindings) (\rbindings -> Flows.bind (recurse body) (\rbody -> Flows.pure (Core.TermLet (Core.Let {
-                            Core.letBindings = rbindings,
-                            Core.letBody = rbody})))))
-                      Core.TermList v1 -> (Flows.bind (Flows.mapList recurse v1) (\rels -> Flows.pure (Core.TermList rels)))
-                      Core.TermLiteral v1 -> (Flows.pure (Core.TermLiteral v1))
-                      Core.TermMap v1 -> (Flows.bind (Flows.mapList forPair (Maps.toList v1)) (\pairs -> Flows.pure (Core.TermMap (Maps.fromList pairs))))
-                      Core.TermMaybe v1 -> (Flows.bind (Flows.mapMaybe recurse v1) (\rm -> Flows.pure (Core.TermMaybe rm)))
-                      Core.TermPair v1 -> (Flows.bind (recurse (Pairs.first v1)) (\rfirst -> Flows.bind (recurse (Pairs.second v1)) (\rsecond -> Flows.pure (Core.TermPair (rfirst, rsecond)))))
-                      Core.TermRecord v1 ->  
-                        let n = (Core.recordTypeName v1)
-                        in  
-                          let fields = (Core.recordFields v1)
-                          in (Flows.map (\rfields -> Core.TermRecord (Core.Record {
-                            Core.recordTypeName = n,
-                            Core.recordFields = rfields})) (Flows.mapList forField fields))
-                      Core.TermSet v1 -> (Flows.bind (Flows.mapList recurse (Sets.toList v1)) (\rlist -> Flows.pure (Core.TermSet (Sets.fromList rlist))))
-                      Core.TermTypeApplication v1 -> (Flows.bind (recurse (Core.typeApplicationTermBody v1)) (\t -> Flows.pure (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = t,
-                        Core.typeApplicationTermType = (Core.typeApplicationTermType v1)}))))
-                      Core.TermTypeLambda v1 ->  
-                        let v = (Core.typeLambdaParameter v1)
-                        in  
-                          let body = (Core.typeLambdaBody v1)
-                          in (Flows.bind (recurse body) (\rbody -> Flows.pure (Core.TermTypeLambda (Core.TypeLambda {
-                            Core.typeLambdaParameter = v,
-                            Core.typeLambdaBody = rbody}))))
-                      Core.TermUnion v1 ->  
-                        let n = (Core.injectionTypeName v1)
-                        in  
-                          let field = (Core.injectionField v1)
-                          in (Flows.map (\rfield -> Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = n,
-                            Core.injectionField = rfield})) (forField field))
-                      Core.TermUnit -> (Flows.pure Core.TermUnit)
-                      Core.TermVariable v1 -> (Flows.pure (Core.TermVariable v1))
-                      Core.TermWrap v1 ->  
-                        let name = (Core.wrappedTermTypeName v1)
-                        in  
-                          let t = (Core.wrappedTermBody v1)
-                          in (Flows.bind (recurse t) (\rt -> Flows.pure (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = name,
-                            Core.wrappedTermBody = rt}))))) term))
-  in  
-    let rewrite = (\cx -> \term -> f (forSubterms rewrite) cx term)
-    in (rewrite cx0 term0)
-
-rewriteType :: (((Core.Type -> Core.Type) -> Core.Type -> Core.Type) -> Core.Type -> Core.Type)
-rewriteType f typ0 =  
-  let fsub = (\recurse -> \typ ->  
-          let forField = (\field -> Core.FieldType {
-                  Core.fieldTypeName = (Core.fieldTypeName field),
-                  Core.fieldTypeType = (recurse (Core.fieldTypeType field))})
-          in ((\x -> case x of
-            Core.TypeAnnotated v1 -> (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (recurse (Core.annotatedTypeBody v1)),
-              Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v1)}))
-            Core.TypeApplication v1 -> (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (recurse (Core.applicationTypeFunction v1)),
-              Core.applicationTypeArgument = (recurse (Core.applicationTypeArgument v1))}))
-            Core.TypeEither v1 -> (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (recurse (Core.eitherTypeLeft v1)),
-              Core.eitherTypeRight = (recurse (Core.eitherTypeRight v1))}))
-            Core.TypePair v1 -> (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (recurse (Core.pairTypeFirst v1)),
-              Core.pairTypeSecond = (recurse (Core.pairTypeSecond v1))}))
-            Core.TypeFunction v1 -> (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (recurse (Core.functionTypeDomain v1)),
-              Core.functionTypeCodomain = (recurse (Core.functionTypeCodomain v1))}))
-            Core.TypeForall v1 -> (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.forallTypeParameter v1),
-              Core.forallTypeBody = (recurse (Core.forallTypeBody v1))}))
-            Core.TypeList v1 -> (Core.TypeList (recurse v1))
-            Core.TypeLiteral v1 -> (Core.TypeLiteral v1)
-            Core.TypeMap v1 -> (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (recurse (Core.mapTypeKeys v1)),
-              Core.mapTypeValues = (recurse (Core.mapTypeValues v1))}))
-            Core.TypeMaybe v1 -> (Core.TypeMaybe (recurse v1))
-            Core.TypeRecord v1 -> (Core.TypeRecord (Core.RowType {
-              Core.rowTypeTypeName = (Core.rowTypeTypeName v1),
-              Core.rowTypeFields = (Lists.map forField (Core.rowTypeFields v1))}))
-            Core.TypeSet v1 -> (Core.TypeSet (recurse v1))
-            Core.TypeUnion v1 -> (Core.TypeUnion (Core.RowType {
-              Core.rowTypeTypeName = (Core.rowTypeTypeName v1),
-              Core.rowTypeFields = (Lists.map forField (Core.rowTypeFields v1))}))
-            Core.TypeUnit -> Core.TypeUnit
-            Core.TypeVariable v1 -> (Core.TypeVariable v1)
-            Core.TypeWrap v1 -> (Core.TypeWrap (Core.WrappedType {
-              Core.wrappedTypeTypeName = (Core.wrappedTypeTypeName v1),
-              Core.wrappedTypeBody = (recurse (Core.wrappedTypeBody v1))}))) typ))
-  in  
-    let recurse = (f (fsub recurse))
-    in (recurse typ0)
-
--- | Monadic type rewriting
-rewriteTypeM :: (((Core.Type -> Compute.Flow t0 Core.Type) -> Core.Type -> Compute.Flow t0 Core.Type) -> Core.Type -> Compute.Flow t0 Core.Type)
-rewriteTypeM f typ0 =  
-  let fsub = (\recurse -> \typ -> (\x -> case x of
-          Core.TypeAnnotated v1 -> (Flows.bind (recurse (Core.annotatedTypeBody v1)) (\t -> Flows.pure (Core.TypeAnnotated (Core.AnnotatedType {
-            Core.annotatedTypeBody = t,
-            Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v1)}))))
-          Core.TypeApplication v1 -> (Flows.bind (recurse (Core.applicationTypeFunction v1)) (\lhs -> Flows.bind (recurse (Core.applicationTypeArgument v1)) (\rhs -> Flows.pure (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = lhs,
-            Core.applicationTypeArgument = rhs})))))
-          Core.TypeEither v1 -> (Flows.bind (recurse (Core.eitherTypeLeft v1)) (\left -> Flows.bind (recurse (Core.eitherTypeRight v1)) (\right -> Flows.pure (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = left,
-            Core.eitherTypeRight = right})))))
-          Core.TypePair v1 -> (Flows.bind (recurse (Core.pairTypeFirst v1)) (\pairFirst -> Flows.bind (recurse (Core.pairTypeSecond v1)) (\pairSecond -> Flows.pure (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = pairFirst,
-            Core.pairTypeSecond = pairSecond})))))
-          Core.TypeFunction v1 -> (Flows.bind (recurse (Core.functionTypeDomain v1)) (\dom -> Flows.bind (recurse (Core.functionTypeCodomain v1)) (\cod -> Flows.pure (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = dom,
-            Core.functionTypeCodomain = cod})))))
-          Core.TypeForall v1 -> (Flows.bind (recurse (Core.forallTypeBody v1)) (\b -> Flows.pure (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.forallTypeParameter v1),
-            Core.forallTypeBody = b}))))
-          Core.TypeList v1 -> (Flows.bind (recurse v1) (\rt -> Flows.pure (Core.TypeList rt)))
-          Core.TypeLiteral v1 -> (Flows.pure (Core.TypeLiteral v1))
-          Core.TypeMap v1 -> (Flows.bind (recurse (Core.mapTypeKeys v1)) (\kt -> Flows.bind (recurse (Core.mapTypeValues v1)) (\vt -> Flows.pure (Core.TypeMap (Core.MapType {
-            Core.mapTypeKeys = kt,
-            Core.mapTypeValues = vt})))))
-          Core.TypeMaybe v1 -> (Flows.bind (recurse v1) (\rt -> Flows.pure (Core.TypeMaybe rt)))
-          Core.TypeRecord v1 ->  
-            let name = (Core.rowTypeTypeName v1)
-            in  
-              let fields = (Core.rowTypeFields v1)
-              in  
-                let forField = (\f -> Flows.bind (recurse (Core.fieldTypeType f)) (\t -> Flows.pure (Core.FieldType {
-                        Core.fieldTypeName = (Core.fieldTypeName f),
-                        Core.fieldTypeType = t})))
-                in (Flows.bind (Flows.mapList forField fields) (\rfields -> Flows.pure (Core.TypeRecord (Core.RowType {
-                  Core.rowTypeTypeName = name,
-                  Core.rowTypeFields = rfields}))))
-          Core.TypeSet v1 -> (Flows.bind (recurse v1) (\rt -> Flows.pure (Core.TypeSet rt)))
-          Core.TypeUnion v1 ->  
-            let name = (Core.rowTypeTypeName v1)
-            in  
-              let fields = (Core.rowTypeFields v1)
-              in  
-                let forField = (\f -> Flows.bind (recurse (Core.fieldTypeType f)) (\t -> Flows.pure (Core.FieldType {
-                        Core.fieldTypeName = (Core.fieldTypeName f),
-                        Core.fieldTypeType = t})))
-                in (Flows.bind (Flows.mapList forField fields) (\rfields -> Flows.pure (Core.TypeUnion (Core.RowType {
-                  Core.rowTypeTypeName = name,
-                  Core.rowTypeFields = rfields}))))
-          Core.TypeUnit -> (Flows.pure Core.TypeUnit)
-          Core.TypeVariable v1 -> (Flows.pure (Core.TypeVariable v1))
-          Core.TypeWrap v1 -> (Flows.bind (recurse (Core.wrappedTypeBody v1)) (\t -> Flows.pure (Core.TypeWrap (Core.WrappedType {
-            Core.wrappedTypeTypeName = (Core.wrappedTypeTypeName v1),
-            Core.wrappedTypeBody = t}))))) typ)
-  in  
-    let recurse = (f (fsub recurse))
-    in (recurse typ0)
-
--- | Simplify terms by applying beta reduction where possible
-simplifyTerm :: (Core.Term -> Core.Term)
-simplifyTerm term =  
-  let simplify = (\recurse -> \term ->  
-          let forRhs = (\rhs -> \var -> \body -> (\x -> case x of
-                  Core.TermVariable v1 -> (simplifyTerm (substituteVariable var v1 body))
-                  _ -> term) (deannotateTerm rhs))
-          in  
-            let forLhs = (\lhs -> \rhs ->  
-                    let forFun = (\fun -> (\x -> case x of
-                            Core.FunctionLambda v1 ->  
-                              let var = (Core.lambdaParameter v1)
-                              in  
-                                let body = (Core.lambdaBody v1)
-                                in (Logic.ifElse (Sets.member var (freeVariablesInTerm body)) (forRhs rhs var body) (simplifyTerm body))
-                            _ -> term) fun)
-                    in ((\x -> case x of
-                      Core.TermFunction v1 -> (forFun v1)
-                      _ -> term) (deannotateTerm lhs)))
-            in  
-              let forTerm = (\stripped -> (\x -> case x of
-                      Core.TermApplication v1 ->  
-                        let lhs = (Core.applicationFunction v1)
-                        in  
-                          let rhs = (Core.applicationArgument v1)
-                          in (forLhs lhs rhs)
-                      _ -> term) stripped)
-              in  
-                let stripped = (deannotateTerm term)
-                in (recurse (forTerm stripped)))
-  in (rewriteTerm simplify term)
-
--- | Substitute type variables in a type
-substituteTypeVariables :: (M.Map Core.Name Core.Name -> Core.Type -> Core.Type)
-substituteTypeVariables subst typ =  
-  let replace = (\recurse -> \typ -> (\x -> case x of
-          Core.TypeVariable v1 -> (Core.TypeVariable (Maybes.fromMaybe v1 (Maps.lookup v1 subst)))
-          _ -> (recurse typ)) typ)
-  in (rewriteType replace typ)
-
--- | Substitute one variable for another in a term
-substituteVariable :: (Core.Name -> Core.Name -> Core.Term -> Core.Term)
-substituteVariable from to term =  
-  let replace = (\recurse -> \term -> (\x -> case x of
-          Core.TermVariable v1 -> (Core.TermVariable (Logic.ifElse (Equality.equal v1 from) to v1))
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionLambda v2 -> (Logic.ifElse (Equality.equal (Core.lambdaParameter v2) from) term (recurse term))
-            _ -> (recurse term)) v1)
-          _ -> (recurse term)) term)
-  in (rewriteTerm replace term)
-
--- | Substitute multiple variables in a term
-substituteVariables :: (M.Map Core.Name Core.Name -> Core.Term -> Core.Term)
-substituteVariables subst term =  
-  let replace = (\recurse -> \term -> (\x -> case x of
-          Core.TermVariable v1 -> (Core.TermVariable (Maybes.fromMaybe v1 (Maps.lookup v1 subst)))
-          Core.TermFunction v1 -> ((\x -> case x of
-            Core.FunctionLambda v2 -> (Maybes.maybe (recurse term) (\_ -> term) (Maps.lookup (Core.lambdaParameter v2) subst))
-            _ -> (recurse term)) v1)
-          _ -> (recurse term)) term)
-  in (rewriteTerm replace term)
-
--- | Strip outer type lambda wrappers from a term, preserving type application wrappers and annotations
-stripTypeLambdas :: (Core.Term -> Core.Term)
-stripTypeLambdas t = ((\x -> case x of
-  Core.TermAnnotated v1 ->  
-    let subj = (Core.annotatedTermBody v1)
-    in  
-      let ann = (Core.annotatedTermAnnotation v1)
-      in (Core.TermAnnotated (Core.AnnotatedTerm {
-        Core.annotatedTermBody = (stripTypeLambdas subj),
-        Core.annotatedTermAnnotation = ann}))
-  Core.TermTypeLambda v1 -> (stripTypeLambdas (Core.typeLambdaBody v1))
-  _ -> t) t)
-
--- | Find the children of a given term
-subterms :: (Core.Term -> [Core.Term])
-subterms x = case x of
-  Core.TermAnnotated v1 -> [
-    Core.annotatedTermBody v1]
-  Core.TermApplication v1 -> [
-    Core.applicationFunction v1,
-    (Core.applicationArgument v1)]
-  Core.TermEither v1 -> (Eithers.either (\l -> [
-    l]) (\r -> [
-    r]) v1)
-  Core.TermFunction v1 -> ((\x -> case x of
-    Core.FunctionElimination v2 -> ((\x -> case x of
-      Core.EliminationUnion v3 -> (Lists.concat2 (Maybes.maybe [] (\t -> [
-        t]) (Core.caseStatementDefault v3)) (Lists.map Core.fieldTerm (Core.caseStatementCases v3)))
-      _ -> []) v2)
-    Core.FunctionLambda v2 -> [
-      Core.lambdaBody v2]
-    _ -> []) v1)
-  Core.TermLet v1 -> (Lists.cons (Core.letBody v1) (Lists.map Core.bindingTerm (Core.letBindings v1)))
-  Core.TermList v1 -> v1
-  Core.TermLiteral _ -> []
-  Core.TermMap v1 -> (Lists.concat (Lists.map (\p -> [
-    Pairs.first p,
-    (Pairs.second p)]) (Maps.toList v1)))
-  Core.TermMaybe v1 -> (Maybes.maybe [] (\t -> [
-    t]) v1)
-  Core.TermPair v1 -> [
-    Pairs.first v1,
-    (Pairs.second v1)]
-  Core.TermRecord v1 -> (Lists.map Core.fieldTerm (Core.recordFields v1))
-  Core.TermSet v1 -> (Sets.toList v1)
-  Core.TermTypeApplication v1 -> [
-    Core.typeApplicationTermBody v1]
-  Core.TermTypeLambda v1 -> [
-    Core.typeLambdaBody v1]
-  Core.TermUnion v1 -> [
-    Core.fieldTerm (Core.injectionField v1)]
-  Core.TermUnit -> []
-  Core.TermVariable _ -> []
-  Core.TermWrap v1 -> [
-    Core.wrappedTermBody v1]
-
--- | Find the children of a given term
-subtermsWithAccessors :: (Core.Term -> [(Accessors.TermAccessor, Core.Term)])
-subtermsWithAccessors x = case x of
-  Core.TermAnnotated v1 -> [
-    (Accessors.TermAccessorAnnotatedBody, (Core.annotatedTermBody v1))]
-  Core.TermApplication v1 -> [
-    (Accessors.TermAccessorApplicationFunction, (Core.applicationFunction v1)),
-    (Accessors.TermAccessorApplicationArgument, (Core.applicationArgument v1))]
-  Core.TermEither _ -> []
-  Core.TermFunction v1 -> ((\x -> case x of
-    Core.FunctionElimination v2 -> ((\x -> case x of
-      Core.EliminationUnion v3 -> (Lists.concat2 (Maybes.maybe [] (\t -> [
-        (Accessors.TermAccessorUnionCasesDefault, t)]) (Core.caseStatementDefault v3)) (Lists.map (\f -> (Accessors.TermAccessorUnionCasesBranch (Core.fieldName f), (Core.fieldTerm f))) (Core.caseStatementCases v3)))
-      _ -> []) v2)
-    Core.FunctionLambda v2 -> [
-      (Accessors.TermAccessorLambdaBody, (Core.lambdaBody v2))]
-    _ -> []) v1)
-  Core.TermLet v1 -> (Lists.cons (Accessors.TermAccessorLetBody, (Core.letBody v1)) (Lists.map (\b -> (Accessors.TermAccessorLetBinding (Core.bindingName b), (Core.bindingTerm b))) (Core.letBindings v1)))
-  Core.TermList v1 -> (Lists.map (\e -> (Accessors.TermAccessorListElement 0, e)) v1)
-  Core.TermLiteral _ -> []
-  Core.TermMap v1 -> (Lists.concat (Lists.map (\p -> [
-    (Accessors.TermAccessorMapKey 0, (Pairs.first p)),
-    (Accessors.TermAccessorMapValue 0, (Pairs.second p))]) (Maps.toList v1)))
-  Core.TermMaybe v1 -> (Maybes.maybe [] (\t -> [
-    (Accessors.TermAccessorMaybeTerm, t)]) v1)
-  Core.TermPair _ -> []
-  Core.TermRecord v1 -> (Lists.map (\f -> (Accessors.TermAccessorRecordField (Core.fieldName f), (Core.fieldTerm f))) (Core.recordFields v1))
-  Core.TermSet v1 -> (Lists.map (\e -> (Accessors.TermAccessorListElement 0, e)) (Sets.toList v1))
-  Core.TermTypeApplication v1 -> [
-    (Accessors.TermAccessorTypeApplicationTerm, (Core.typeApplicationTermBody v1))]
-  Core.TermTypeLambda v1 -> [
-    (Accessors.TermAccessorTypeLambdaBody, (Core.typeLambdaBody v1))]
-  Core.TermUnion v1 -> [
-    (Accessors.TermAccessorInjectionTerm, (Core.fieldTerm (Core.injectionField v1)))]
-  Core.TermUnit -> []
-  Core.TermVariable _ -> []
-  Core.TermWrap v1 -> [
-    (Accessors.TermAccessorWrappedTerm, (Core.wrappedTermBody v1))]
-
--- | Find the children of a given type expression
-subtypes :: (Core.Type -> [Core.Type])
-subtypes x = case x of
-  Core.TypeAnnotated v1 -> [
-    Core.annotatedTypeBody v1]
-  Core.TypeApplication v1 -> [
-    Core.applicationTypeFunction v1,
-    (Core.applicationTypeArgument v1)]
-  Core.TypeEither v1 -> [
-    Core.eitherTypeLeft v1,
-    (Core.eitherTypeRight v1)]
-  Core.TypePair v1 -> [
-    Core.pairTypeFirst v1,
-    (Core.pairTypeSecond v1)]
-  Core.TypeFunction v1 -> [
-    Core.functionTypeDomain v1,
-    (Core.functionTypeCodomain v1)]
-  Core.TypeForall v1 -> [
-    Core.forallTypeBody v1]
-  Core.TypeList v1 -> [
-    v1]
-  Core.TypeLiteral _ -> []
-  Core.TypeMap v1 -> [
-    Core.mapTypeKeys v1,
-    (Core.mapTypeValues v1)]
-  Core.TypeMaybe v1 -> [
-    v1]
-  Core.TypeRecord v1 -> (Lists.map Core.fieldTypeType (Core.rowTypeFields v1))
-  Core.TypeSet v1 -> [
-    v1]
-  Core.TypeUnion v1 -> (Lists.map Core.fieldTypeType (Core.rowTypeFields v1))
-  Core.TypeUnit -> []
-  Core.TypeVariable _ -> []
-  Core.TypeWrap v1 -> [
-    Core.wrappedTypeBody v1]
-
--- | Note: does not distinguish between bound and free variables; use freeVariablesInTerm for that
-termDependencyNames :: (Bool -> Bool -> Bool -> Core.Term -> S.Set Core.Name)
-termDependencyNames binds withPrims withNoms term0 =  
-  let addNames = (\names -> \term ->  
-          let nominal = (\name -> Logic.ifElse withNoms (Sets.insert name names) names)
-          in  
-            let prim = (\name -> Logic.ifElse withPrims (Sets.insert name names) names)
-            in  
-              let var = (\name -> Logic.ifElse binds (Sets.insert name names) names)
-              in ((\x -> case x of
-                Core.TermFunction v1 -> ((\x -> case x of
-                  Core.FunctionPrimitive v2 -> (prim v2)
-                  Core.FunctionElimination v2 -> ((\x -> case x of
-                    Core.EliminationRecord v3 -> (nominal (Core.projectionTypeName v3))
-                    Core.EliminationUnion v3 -> (nominal (Core.caseStatementTypeName v3))
-                    Core.EliminationWrap v3 -> (nominal v3)) v2)
-                  _ -> names) v1)
-                Core.TermRecord v1 -> (nominal (Core.recordTypeName v1))
-                Core.TermUnion v1 -> (nominal (Core.injectionTypeName v1))
-                Core.TermVariable v1 -> (var v1)
-                Core.TermWrap v1 -> (nominal (Core.wrappedTermTypeName v1))
-                _ -> names) term))
-  in (foldOverTerm Coders.TraversalOrderPre addNames Sets.empty term0)
-
--- | Generate short names from a list of fully qualified names
-toShortNames :: ([Core.Name] -> M.Map Core.Name Core.Name)
-toShortNames original =  
-  let addName = (\acc -> \name ->  
-          let local = (Names.localNameOf name)
-          in  
-            let group = (Maybes.fromMaybe Sets.empty (Maps.lookup local acc))
-            in (Maps.insert local (Sets.insert name group) acc))
-  in  
-    let groupNamesByLocal = (\names -> Lists.foldl addName Maps.empty names)
-    in  
-      let groups = (groupNamesByLocal original)
-      in  
-        let renameGroup = (\localNames ->  
-                let local = (Pairs.first localNames)
-                in  
-                  let names = (Pairs.second localNames)
-                  in  
-                    let rangeFrom = (\start -> Lists.cons start (rangeFrom (Math.add start 1)))
-                    in  
-                      let rename = (\name -> \i -> (name, (Core.Name (Logic.ifElse (Equality.gt i 1) (Strings.cat2 local (Literals.showInt32 i)) local))))
-                      in (Lists.zipWith rename (Sets.toList names) (rangeFrom 1)))
-        in (Maps.fromList (Lists.concat (Lists.map renameGroup (Maps.toList groups))))
-
--- | Topological sort of connected components, in terms of dependencies between variable/term binding pairs
-topologicalSortBindingMap :: (M.Map Core.Name Core.Term -> [[(Core.Name, Core.Term)]])
-topologicalSortBindingMap bindingMap =  
-  let bindings = (Maps.toList bindingMap)
-  in  
-    let keys = (Sets.fromList (Lists.map Pairs.first bindings))
-    in  
-      let hasTypeAnnotation = (\term -> (\x -> case x of
-              Core.TermAnnotated v1 -> (hasTypeAnnotation (Core.annotatedTermBody v1))
-              _ -> False) term)
-      in  
-        let depsOf = (\nameAndTerm ->  
-                let name = (Pairs.first nameAndTerm)
-                in  
-                  let term = (Pairs.second nameAndTerm)
-                  in (name, (Logic.ifElse (hasTypeAnnotation term) [] (Sets.toList (Sets.intersection keys (freeVariablesInTerm term))))))
-        in  
-          let toPair = (\name -> (name, (Maybes.fromMaybe (Core.TermLiteral (Core.LiteralString "Impossible!")) (Maps.lookup name bindingMap))))
-          in (Lists.map (Lists.map toPair) (Sorting.topologicalSortComponents (Lists.map depsOf bindings)))
-
--- | Topological sort of elements based on their dependencies
-topologicalSortBindings :: ([Core.Binding] -> Either [[Core.Name]] [Core.Name])
-topologicalSortBindings els =  
-  let adjlist = (\e -> (Core.bindingName e, (Sets.toList (termDependencyNames False True True (Core.bindingTerm e)))))
-  in (Sorting.topologicalSort (Lists.map adjlist els))
-
-typeDependencyNames :: (Bool -> Core.Type -> S.Set Core.Name)
-typeDependencyNames withSchema typ = (Logic.ifElse withSchema (Sets.union (freeVariablesInType typ) (typeNamesInType typ)) (freeVariablesInType typ))
-
-typeNamesInType :: (Core.Type -> S.Set Core.Name)
-typeNamesInType typ0 =  
-  let addNames = (\names -> \typ -> (\x -> case x of
-          Core.TypeRecord v1 ->  
-            let tname = (Core.rowTypeTypeName v1)
-            in (Sets.insert tname names)
-          Core.TypeUnion v1 ->  
-            let tname = (Core.rowTypeTypeName v1)
-            in (Sets.insert tname names)
-          Core.TypeWrap v1 ->  
-            let tname = (Core.wrappedTypeTypeName v1)
-            in (Sets.insert tname names)
-          _ -> names) typ)
-  in (foldOverType Coders.TraversalOrderPre addNames Sets.empty typ0)
-
--- | Rename all shadowed variables (both lambda parameters and let-bound variables that shadow lambda parameters) in a term.
-unshadowVariables :: (Core.Term -> Core.Term)
-unshadowVariables term0 =  
-  let freshName = (\base -> \i -> \m ->  
-          let candidate = (Core.Name (Strings.cat2 (Core.unName base) (Literals.showInt32 i)))
-          in (Logic.ifElse (Maps.member candidate m) (freshName base (Math.add i 1) m) candidate))
-  in  
-    let f = (\recurse -> \m -> \term -> (\x -> case x of
-            Core.TermFunction v1 -> ((\x -> case x of
-              Core.FunctionLambda v2 ->  
-                let v = (Core.lambdaParameter v2)
-                in  
-                  let domain = (Core.lambdaDomain v2)
-                  in  
-                    let body = (Core.lambdaBody v2)
-                    in (Logic.ifElse (Maps.member v m) ( 
-                      let v2 = (freshName v 2 m)
-                      in  
-                        let m2 = (Maps.insert v v2 (Maps.insert v2 v2 m))
-                        in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = v2,
-                          Core.lambdaDomain = domain,
-                          Core.lambdaBody = (f recurse m2 body)})))) (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = v,
-                      Core.lambdaDomain = domain,
-                      Core.lambdaBody = (f recurse (Maps.insert v v m) body)}))))
-              _ -> (recurse m term)) v1)
-            Core.TermLet v1 ->  
-              let m2 = (Lists.foldl (\acc -> \b ->  
-                      let bname = (Core.bindingName b)
-                      in (Logic.ifElse (Maps.member bname acc) acc (Maps.insert bname bname acc))) m (Core.letBindings v1))
-              in (recurse m2 term)
-            Core.TermVariable v1 -> (Core.TermVariable (Maybes.maybe v1 (\renamed -> renamed) (Maps.lookup v1 m)))
-            _ -> (recurse m term)) term)
-    in (rewriteTermWithContext f Maps.empty term0)
+import qualified Hydra.Coders as Coders
+import qualified Hydra.Core as Core
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Math as Math
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Names as Names
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Sorting as Sorting
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Apply a term-level function inside any leading type lambdas
+applyInsideTypeLambdasAndAnnotations :: (Core.Term -> Core.Term) -> Core.Term -> Core.Term
+applyInsideTypeLambdasAndAnnotations f term0 =
+    case term0 of
+      Core.TermAnnotated v0 -> Core.TermAnnotated (Core.AnnotatedTerm {
+        Core.annotatedTermBody = (applyInsideTypeLambdasAndAnnotations f (Core.annotatedTermBody v0)),
+        Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})
+      Core.TermTypeLambda v0 -> Core.TermTypeLambda (Core.TypeLambda {
+        Core.typeLambdaParameter = (Core.typeLambdaParameter v0),
+        Core.typeLambdaBody = (applyInsideTypeLambdasAndAnnotations f (Core.typeLambdaBody v0))})
+      _ -> f term0
+
+-- | Strip type annotations from the top levels of a term
+deannotateAndDetypeTerm :: Core.Term -> Core.Term
+deannotateAndDetypeTerm t =
+    case t of
+      Core.TermAnnotated v0 -> deannotateAndDetypeTerm (Core.annotatedTermBody v0)
+      Core.TermTypeApplication v0 -> deannotateAndDetypeTerm (Core.typeApplicationTermBody v0)
+      Core.TermTypeLambda v0 -> deannotateAndDetypeTerm (Core.typeLambdaBody v0)
+      _ -> t
+
+-- | Strip all annotations (including System F type annotations) from the top levels of a term
+deannotateTerm :: Core.Term -> Core.Term
+deannotateTerm t =
+    case t of
+      Core.TermAnnotated v0 -> deannotateTerm (Core.annotatedTermBody v0)
+      _ -> t
+
+-- | Strip all annotations from a term
+deannotateType :: Core.Type -> Core.Type
+deannotateType t =
+    case t of
+      Core.TypeAnnotated v0 -> deannotateType (Core.annotatedTypeBody v0)
+      _ -> t
+
+-- | Strip any top-level type lambdas from a type, extracting the (possibly nested) type body
+deannotateTypeParameters :: Core.Type -> Core.Type
+deannotateTypeParameters t =
+    case (deannotateType t) of
+      Core.TypeForall v0 -> deannotateTypeParameters (Core.forallTypeBody v0)
+      _ -> t
+
+-- | Recursively strip all annotations from a type
+deannotateTypeRecursive :: Core.Type -> Core.Type
+deannotateTypeRecursive typ =
+
+      let strip =
+              \recurse -> \typ ->
+                let rewritten = recurse typ
+                in case rewritten of
+                  Core.TypeAnnotated v0 -> Core.annotatedTypeBody v0
+                  _ -> rewritten
+      in (rewriteType strip typ)
+
+-- | Recursively strip all annotations from a type scheme
+deannotateTypeSchemeRecursive :: Core.TypeScheme -> Core.TypeScheme
+deannotateTypeSchemeRecursive ts =
+
+      let vars = Core.typeSchemeVariables ts
+          typ = Core.typeSchemeType ts
+          constraints = Core.typeSchemeConstraints ts
+      in Core.TypeScheme {
+        Core.typeSchemeVariables = vars,
+        Core.typeSchemeType = (deannotateTypeRecursive typ),
+        Core.typeSchemeConstraints = constraints}
+
+-- | Strip System F type annotations from the top levels of a term, but leave application-specific annotations intact
+detypeTerm :: Core.Term -> Core.Term
+detypeTerm t =
+    case t of
+      Core.TermAnnotated v0 ->
+        let subj = Core.annotatedTermBody v0
+            ann = Core.annotatedTermAnnotation v0
+        in (Core.TermAnnotated (Core.AnnotatedTerm {
+          Core.annotatedTermBody = (detypeTerm subj),
+          Core.annotatedTermAnnotation = ann}))
+      Core.TermTypeApplication v0 -> deannotateAndDetypeTerm (Core.typeApplicationTermBody v0)
+      Core.TermTypeLambda v0 -> deannotateAndDetypeTerm (Core.typeLambdaBody v0)
+      _ -> t
+
+-- | Extend a graph by descending into a lambda body
+extendGraphForLambda :: Graph.Graph -> Core.Lambda -> Graph.Graph
+extendGraphForLambda g lam =
+
+      let var = Core.lambdaParameter lam
+      in Graph.Graph {
+        Graph.graphBoundTerms = (Graph.graphBoundTerms g),
+        Graph.graphBoundTypes = (Maybes.maybe (Graph.graphBoundTypes g) (\dom -> Maps.insert var (fTypeToTypeScheme dom) (Graph.graphBoundTypes g)) (Core.lambdaDomain lam)),
+        Graph.graphClassConstraints = (Graph.graphClassConstraints g),
+        Graph.graphLambdaVariables = (Sets.insert var (Graph.graphLambdaVariables g)),
+        Graph.graphMetadata = (Maps.delete var (Graph.graphMetadata g)),
+        Graph.graphPrimitives = (Graph.graphPrimitives g),
+        Graph.graphSchemaTypes = (Graph.graphSchemaTypes g),
+        Graph.graphTypeVariables = (Graph.graphTypeVariables g)}
+
+-- | Extend a graph by descending into a let body
+extendGraphForLet :: (Graph.Graph -> Core.Binding -> Maybe Core.Term) -> Graph.Graph -> Core.Let -> Graph.Graph
+extendGraphForLet forBinding g letrec =
+
+      let bindings = Core.letBindings letrec
+          g2 = extendGraphWithBindings bindings g
+      in Graph.Graph {
+        Graph.graphBoundTerms = (Maps.union (Maps.fromList (Lists.map (\b -> (Core.bindingName b, (Core.bindingTerm b))) bindings)) (Graph.graphBoundTerms g)),
+        Graph.graphBoundTypes = (Maps.union (Maps.fromList (Maybes.cat (Lists.map (\b -> Maybes.map (\ts -> (Core.bindingName b, ts)) (Core.bindingType b)) bindings))) (Graph.graphBoundTypes g)),
+        Graph.graphClassConstraints = (Graph.graphClassConstraints g),
+        Graph.graphLambdaVariables = (Lists.foldl (\s -> \b -> Sets.delete (Core.bindingName b) s) (Graph.graphLambdaVariables g) bindings),
+        Graph.graphMetadata = (Graph.graphMetadata (Lists.foldl (\gAcc -> \b ->
+          let m = Graph.graphMetadata gAcc
+              newMeta = Maybes.maybe (Maps.delete (Core.bindingName b) m) (\t -> Maps.insert (Core.bindingName b) t m) (forBinding gAcc b)
+          in Graph.Graph {
+            Graph.graphBoundTerms = (Graph.graphBoundTerms gAcc),
+            Graph.graphBoundTypes = (Graph.graphBoundTypes gAcc),
+            Graph.graphClassConstraints = (Graph.graphClassConstraints gAcc),
+            Graph.graphLambdaVariables = (Graph.graphLambdaVariables gAcc),
+            Graph.graphMetadata = newMeta,
+            Graph.graphPrimitives = (Graph.graphPrimitives gAcc),
+            Graph.graphSchemaTypes = (Graph.graphSchemaTypes gAcc),
+            Graph.graphTypeVariables = (Graph.graphTypeVariables gAcc)}) g2 bindings)),
+        Graph.graphPrimitives = (Graph.graphPrimitives g),
+        Graph.graphSchemaTypes = (Graph.graphSchemaTypes g),
+        Graph.graphTypeVariables = (Graph.graphTypeVariables g)}
+
+-- | Extend a graph by descending into a type lambda body
+extendGraphForTypeLambda :: Graph.Graph -> Core.TypeLambda -> Graph.Graph
+extendGraphForTypeLambda g tlam =
+
+      let name = Core.typeLambdaParameter tlam
+      in Graph.Graph {
+        Graph.graphBoundTerms = (Graph.graphBoundTerms g),
+        Graph.graphBoundTypes = (Graph.graphBoundTypes g),
+        Graph.graphClassConstraints = (Graph.graphClassConstraints g),
+        Graph.graphLambdaVariables = (Graph.graphLambdaVariables g),
+        Graph.graphMetadata = (Graph.graphMetadata g),
+        Graph.graphPrimitives = (Graph.graphPrimitives g),
+        Graph.graphSchemaTypes = (Graph.graphSchemaTypes g),
+        Graph.graphTypeVariables = (Sets.insert name (Graph.graphTypeVariables g))}
+
+-- | Add bindings to an existing graph
+extendGraphWithBindings :: [Core.Binding] -> Graph.Graph -> Graph.Graph
+extendGraphWithBindings bindings g =
+
+      let newTerms = Maps.fromList (Lists.map (\b -> (Core.bindingName b, (Core.bindingTerm b))) bindings)
+          newTypes =
+                  Maps.fromList (Maybes.cat (Lists.map (\b -> Maybes.map (\ts -> (Core.bindingName b, ts)) (Core.bindingType b)) bindings))
+      in Graph.Graph {
+        Graph.graphBoundTerms = (Maps.union newTerms (Graph.graphBoundTerms g)),
+        Graph.graphBoundTypes = (Maps.union newTypes (Graph.graphBoundTypes g)),
+        Graph.graphClassConstraints = (Graph.graphClassConstraints g),
+        Graph.graphLambdaVariables = (Graph.graphLambdaVariables g),
+        Graph.graphMetadata = (Graph.graphMetadata g),
+        Graph.graphPrimitives = (Graph.graphPrimitives g),
+        Graph.graphSchemaTypes = (Graph.graphSchemaTypes g),
+        Graph.graphTypeVariables = (Graph.graphTypeVariables g)}
+
+-- | Convert a forall type to a type scheme
+fTypeToTypeScheme :: Core.Type -> Core.TypeScheme
+fTypeToTypeScheme typ =
+
+      let gatherForall =
+              \vars -> \typ -> case (deannotateType typ) of
+                Core.TypeForall v0 -> gatherForall (Lists.cons (Core.forallTypeParameter v0) vars) (Core.forallTypeBody v0)
+                _ -> Core.TypeScheme {
+                  Core.typeSchemeVariables = (Lists.reverse vars),
+                  Core.typeSchemeType = typ,
+                  Core.typeSchemeConstraints = Nothing}
+      in (gatherForall [] typ)
+
+-- | Flatten nested let expressions
+flattenLetTerms :: Core.Term -> Core.Term
+flattenLetTerms term =
+
+      let rewriteBinding =
+              \binding ->
+                let key0 = Core.bindingName binding
+                    val0 = Core.bindingTerm binding
+                    t = Core.bindingType binding
+                in case val0 of
+                  Core.TermAnnotated v0 ->
+                    let val1 = Core.annotatedTermBody v0
+                        ann = Core.annotatedTermAnnotation v0
+                        recursive =
+                                rewriteBinding (Core.Binding {
+                                  Core.bindingName = key0,
+                                  Core.bindingTerm = val1,
+                                  Core.bindingType = t})
+                        innerBinding = Pairs.first recursive
+                        deps = Pairs.second recursive
+                        val2 = Core.bindingTerm innerBinding
+                    in (Core.Binding {
+                      Core.bindingName = key0,
+                      Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                        Core.annotatedTermBody = val2,
+                        Core.annotatedTermAnnotation = ann})),
+                      Core.bindingType = t}, deps)
+                  Core.TermLet v0 ->
+                    let bindings1 = Core.letBindings v0
+                        body1 = Core.letBody v0
+                        prefix = Strings.cat2 (Core.unName key0) "_"
+                        qualify = \n -> Core.Name (Strings.cat2 prefix (Core.unName n))
+                        toSubstPair = \b -> (Core.bindingName b, (qualify (Core.bindingName b)))
+                        subst = Maps.fromList (Lists.map toSubstPair bindings1)
+                        replaceVars = substituteVariables subst
+                        newBody = replaceVars body1
+                        newBinding =
+                                \b -> Core.Binding {
+                                  Core.bindingName = (qualify (Core.bindingName b)),
+                                  Core.bindingTerm = (replaceVars (Core.bindingTerm b)),
+                                  Core.bindingType = (Core.bindingType b)}
+                    in (Core.Binding {
+                      Core.bindingName = key0,
+                      Core.bindingTerm = newBody,
+                      Core.bindingType = t}, (Lists.map newBinding bindings1))
+                  _ -> (Core.Binding {
+                    Core.bindingName = key0,
+                    Core.bindingTerm = val0,
+                    Core.bindingType = t}, [])
+          flattenBodyLet =
+                  \bindings -> \body -> case body of
+                    Core.TermLet v0 ->
+                      let innerBindings = Core.letBindings v0
+                          innerBody = Core.letBody v0
+                      in (flattenBodyLet (Lists.concat2 bindings innerBindings) innerBody)
+                    _ -> (Lists.concat2 [] bindings, body)
+          flatten =
+                  \recurse -> \term ->
+                    let rewritten = recurse term
+                    in case rewritten of
+                      Core.TermLet v0 ->
+                        let bindings = Core.letBindings v0
+                            body = Core.letBody v0
+                            forResult = \hr -> Lists.concat2 (Pairs.second hr) (Lists.pure (Pairs.first hr))
+                            flattenedBindings = Lists.concat (Lists.map (\arg_ -> forResult (rewriteBinding arg_)) bindings)
+                            merged = flattenBodyLet flattenedBindings body
+                            newBindings = Pairs.first merged
+                            newBody = Pairs.second merged
+                        in (Core.TermLet (Core.Let {
+                          Core.letBindings = newBindings,
+                          Core.letBody = newBody}))
+                      _ -> rewritten
+      in (rewriteTerm flatten term)
+
+-- | Fold over a term, traversing its subterms in the specified order
+foldOverTerm :: Coders.TraversalOrder -> (t0 -> Core.Term -> t0) -> t0 -> Core.Term -> t0
+foldOverTerm order fld b0 term =
+    case order of
+      Coders.TraversalOrderPre -> Lists.foldl (foldOverTerm order fld) (fld b0 term) (subterms term)
+      Coders.TraversalOrderPost -> fld (Lists.foldl (foldOverTerm order fld) b0 (subterms term)) term
+
+-- | Fold over a type, traversing its subtypes in the specified order
+foldOverType :: Coders.TraversalOrder -> (t0 -> Core.Type -> t0) -> t0 -> Core.Type -> t0
+foldOverType order fld b0 typ =
+    case order of
+      Coders.TraversalOrderPre -> Lists.foldl (foldOverType order fld) (fld b0 typ) (subtypes typ)
+      Coders.TraversalOrderPost -> fld (Lists.foldl (foldOverType order fld) b0 (subtypes typ)) typ
+
+-- | Fold over a term to produce a value, with both Graph and accessor path tracked. Like rewriteAndFoldTermWithGraphAndPath, but only folds without rewriting. The Graph is automatically updated when descending into lambdas, lets, and type lambdas.
+foldTermWithGraphAndPath :: ((t0 -> Core.Term -> t0) -> [Paths.SubtermStep] -> Graph.Graph -> t0 -> Core.Term -> t0) -> Graph.Graph -> t0 -> Core.Term -> t0
+foldTermWithGraphAndPath f cx0 val0 term0 =
+
+      let wrapper =
+              \recurse -> \path -> \cx -> \val -> \term ->
+                let recurseForUser =
+                        \valIn -> \subterm ->
+                          let r = recurse valIn subterm
+                          in (Pairs.first r)
+                in (f recurseForUser path cx val term, term)
+          result = rewriteAndFoldTermWithGraphAndPath wrapper cx0 val0 term0
+      in (Pairs.first result)
+
+-- | Get the set of free type variables in a term (including schema names, where they appear in type annotations). In this context, only the type schemes of let bindings can bind type variables; type lambdas do not.
+freeTypeVariablesInTerm :: Core.Term -> S.Set Core.Name
+freeTypeVariablesInTerm term0 =
+
+      let allOf = \sets -> Lists.foldl Sets.union Sets.empty sets
+          tryType = \tvars -> \typ -> Sets.difference (freeVariablesInType typ) tvars
+          getAll =
+                  \vars -> \term ->
+                    let recurse = getAll vars
+                        dflt = allOf (Lists.map recurse (subterms term))
+                    in case term of
+                      Core.TermFunction v0 -> case v0 of
+                        Core.FunctionElimination _ -> dflt
+                        Core.FunctionLambda v1 ->
+                          let domt = Maybes.maybe Sets.empty (tryType vars) (Core.lambdaDomain v1)
+                          in (Sets.union domt (recurse (Core.lambdaBody v1)))
+                        _ -> dflt
+                      Core.TermLet v0 ->
+                        let forBinding =
+                                \b ->
+                                  let newVars = Maybes.maybe vars (\ts -> Sets.union vars (Sets.fromList (Core.typeSchemeVariables ts))) (Core.bindingType b)
+                                  in (Sets.union (getAll newVars (Core.bindingTerm b)) (Maybes.maybe Sets.empty (\ts -> tryType newVars (Core.typeSchemeType ts)) (Core.bindingType b)))
+                        in (Sets.union (allOf (Lists.map forBinding (Core.letBindings v0))) (recurse (Core.letBody v0)))
+                      Core.TermTypeApplication v0 -> Sets.union (tryType vars (Core.typeApplicationTermType v0)) (recurse (Core.typeApplicationTermBody v0))
+                      Core.TermTypeLambda v0 -> Sets.union (tryType vars (Core.TypeVariable (Core.typeLambdaParameter v0))) (recurse (Core.typeLambdaBody v0))
+                      _ -> dflt
+      in (getAll Sets.empty term0)
+
+-- | Find the free variables (i.e. variables not bound by a lambda or let) in a term
+freeVariablesInTerm :: Core.Term -> S.Set Core.Name
+freeVariablesInTerm term =
+
+      let dfltVars = \_ -> Lists.foldl (\s -> \t -> Sets.union s (freeVariablesInTerm t)) Sets.empty (subterms term)
+      in case term of
+        Core.TermFunction v0 -> case v0 of
+          Core.FunctionLambda v1 -> Sets.delete (Core.lambdaParameter v1) (freeVariablesInTerm (Core.lambdaBody v1))
+          _ -> dfltVars ()
+        Core.TermLet v0 -> Sets.difference (dfltVars ()) (Sets.fromList (Lists.map Core.bindingName (Core.letBindings v0)))
+        Core.TermVariable v0 -> Sets.singleton v0
+        _ -> dfltVars ()
+
+-- | Find the free variables (i.e. variables not bound by a lambda or let) in a type
+freeVariablesInType :: Core.Type -> S.Set Core.Name
+freeVariablesInType typ =
+
+      let dfltVars = Lists.foldl (\s -> \t -> Sets.union s (freeVariablesInType t)) Sets.empty (subtypes typ)
+      in case typ of
+        Core.TypeForall v0 -> Sets.delete (Core.forallTypeParameter v0) (freeVariablesInType (Core.forallTypeBody v0))
+        Core.TypeVariable v0 -> Sets.singleton v0
+        _ -> dfltVars
+
+-- | Find the free variables in a type in deterministic left-to-right order
+freeVariablesInTypeOrdered :: Core.Type -> [Core.Name]
+freeVariablesInTypeOrdered typ =
+
+      let collectVars =
+              \boundVars -> \t -> case t of
+                Core.TypeVariable v0 -> Logic.ifElse (Sets.member v0 boundVars) [] [
+                  v0]
+                Core.TypeForall v0 -> collectVars (Sets.insert (Core.forallTypeParameter v0) boundVars) (Core.forallTypeBody v0)
+                _ -> Lists.concat (Lists.map (collectVars boundVars) (subtypes t))
+      in (Lists.nub (collectVars Sets.empty typ))
+
+-- | Find free variables in a type scheme
+freeVariablesInTypeScheme :: Core.TypeScheme -> S.Set Core.Name
+freeVariablesInTypeScheme ts =
+
+      let vars = Core.typeSchemeVariables ts
+          t = Core.typeSchemeType ts
+      in (Sets.difference (freeVariablesInType t) (Sets.fromList vars))
+
+-- | Find free variables in a type scheme (simple version)
+freeVariablesInTypeSchemeSimple :: Core.TypeScheme -> S.Set Core.Name
+freeVariablesInTypeSchemeSimple ts =
+
+      let vars = Core.typeSchemeVariables ts
+          t = Core.typeSchemeType ts
+      in (Sets.difference (freeVariablesInTypeSimple t) (Sets.fromList vars))
+
+-- | Same as freeVariablesInType, but ignores the binding action of lambda types
+freeVariablesInTypeSimple :: Core.Type -> S.Set Core.Name
+freeVariablesInTypeSimple typ =
+
+      let helper =
+              \types -> \typ -> case typ of
+                Core.TypeVariable v0 -> Sets.insert v0 types
+                _ -> types
+      in (foldOverType Coders.TraversalOrderPre helper Sets.empty typ)
+
+-- | Inline all type variables in a type using the provided schema (Either version). Note: this function is only appropriate for nonrecursive type definitions
+inlineType :: M.Map Core.Name Core.Type -> Core.Type -> Either String Core.Type
+inlineType schema typ =
+
+      let f =
+              \recurse -> \typ ->
+                let afterRecurse =
+                        \tr -> case tr of
+                          Core.TypeVariable v0 -> Maybes.maybe (Left (Strings.cat2 "No such type in schema: " (Core.unName v0))) (inlineType schema) (Maps.lookup v0 schema)
+                          _ -> Right tr
+                in (Eithers.bind (recurse typ) (\tr -> afterRecurse tr))
+      in (rewriteTypeM f typ)
+
+-- | Check whether a variable is free (not bound) in a term
+isFreeVariableInTerm :: Core.Name -> Core.Term -> Bool
+isFreeVariableInTerm v term = Logic.not (Sets.member v (freeVariablesInTerm term))
+
+-- | Check whether a term is a lambda, possibly nested within let and/or annotation terms
+isLambda :: Core.Term -> Bool
+isLambda term =
+    case (deannotateTerm term) of
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionLambda _ -> True
+        _ -> False
+      Core.TermLet v0 -> isLambda (Core.letBody v0)
+      _ -> False
+
+-- | Rewrite terms like `let foo = bar in λx.baz` to `λx.let foo = bar in baz`, lifting lambda-bound variables above let-bound variables, recursively. This is helpful for targets such as Python.
+liftLambdaAboveLet :: Core.Term -> Core.Term
+liftLambdaAboveLet term0 =
+
+      let rewrite =
+              \recurse -> \term ->
+                let rewriteBinding =
+                        \b -> Core.Binding {
+                          Core.bindingName = (Core.bindingName b),
+                          Core.bindingTerm = (rewrite recurse (Core.bindingTerm b)),
+                          Core.bindingType = (Core.bindingType b)}
+                    rewriteBindings = \bs -> Lists.map rewriteBinding bs
+                    digForLambdas =
+                            \original -> \cons -> \term -> case term of
+                              Core.TermAnnotated v0 -> digForLambdas original (\t -> Core.TermAnnotated (Core.AnnotatedTerm {
+                                Core.annotatedTermBody = (cons t),
+                                Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})) (Core.annotatedTermBody v0)
+                              Core.TermFunction v0 -> case v0 of
+                                Core.FunctionLambda v1 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.lambdaParameter v1),
+                                  Core.lambdaDomain = (Core.lambdaDomain v1),
+                                  Core.lambdaBody = (digForLambdas (cons (Core.lambdaBody v1)) (\t -> cons t) (Core.lambdaBody v1))}))
+                                _ -> recurse original
+                              Core.TermLet v0 -> digForLambdas original (\t -> cons (Core.TermLet (Core.Let {
+                                Core.letBindings = (rewriteBindings (Core.letBindings v0)),
+                                Core.letBody = t}))) (Core.letBody v0)
+                              _ -> recurse original
+                in case term of
+                  Core.TermLet v0 -> digForLambdas term (\t -> Core.TermLet (Core.Let {
+                    Core.letBindings = (rewriteBindings (Core.letBindings v0)),
+                    Core.letBody = t})) (Core.letBody v0)
+                  _ -> recurse term
+      in (rewriteTerm rewrite term0)
+
+-- | Apply a transformation to the first type beneath a chain of annotations
+mapBeneathTypeAnnotations :: (Core.Type -> Core.Type) -> Core.Type -> Core.Type
+mapBeneathTypeAnnotations f t =
+    case t of
+      Core.TypeAnnotated v0 -> Core.TypeAnnotated (Core.AnnotatedType {
+        Core.annotatedTypeBody = (mapBeneathTypeAnnotations f (Core.annotatedTypeBody v0)),
+        Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v0)})
+      _ -> f t
+
+-- | Recursively replace the type variables of let bindings with the systematic type variables t0, t1, t2, ...
+normalizeTypeVariablesInTerm :: Core.Term -> Core.Term
+normalizeTypeVariablesInTerm term =
+
+      let replaceName = \subst -> \v -> Maybes.fromMaybe v (Maps.lookup v subst)
+          substType =
+                  \subst -> \typ ->
+                    let rewrite =
+                            \recurse -> \typ -> case typ of
+                              Core.TypeVariable v0 -> Core.TypeVariable (replaceName subst v0)
+                              _ -> recurse typ
+                    in (rewriteType rewrite typ)
+          rewriteWithSubst =
+                  \state -> \term0 ->
+                    let sb = Pairs.first state
+                        next = Pairs.second state
+                        subst = Pairs.first sb
+                        boundVars = Pairs.second sb
+                        rewrite =
+                                \recurse -> \term -> case term of
+                                  Core.TermFunction v0 -> case v0 of
+                                    Core.FunctionElimination _ -> recurse term
+                                    Core.FunctionLambda v1 ->
+                                      let domain = Core.lambdaDomain v1
+                                      in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.lambdaParameter v1),
+                                        Core.lambdaDomain = (Maybes.map (substType subst) domain),
+                                        Core.lambdaBody = (rewriteWithSubst ((subst, boundVars), next) (Core.lambdaBody v1))})))
+                                    _ -> recurse term
+                                  Core.TermLet v0 ->
+                                    let bindings0 = Core.letBindings v0
+                                        body0 = Core.letBody v0
+                                        step =
+                                                \acc -> \bs -> Logic.ifElse (Lists.null bs) (Lists.reverse acc) (
+                                                  let b = Lists.head bs
+                                                      tl = Lists.tail bs
+                                                      noType =
+
+                                                                let newVal = rewriteWithSubst ((subst, boundVars), next) (Core.bindingTerm b)
+                                                                    b1 =
+                                                                            Core.Binding {
+                                                                              Core.bindingName = (Core.bindingName b),
+                                                                              Core.bindingTerm = newVal,
+                                                                              Core.bindingType = Nothing}
+                                                                in (step (Lists.cons b1 acc) tl)
+                                                      withType =
+                                                              \ts ->
+                                                                let vars = Core.typeSchemeVariables ts
+                                                                    typ = Core.typeSchemeType ts
+                                                                    k = Lists.length vars
+                                                                    gen =
+                                                                            \i -> \rem -> \acc2 ->
+                                                                              let ti = Core.Name (Strings.cat2 "t" (Literals.showInt32 (Math.add next i)))
+                                                                              in (Logic.ifElse (Equality.equal rem 0) (Lists.reverse acc2) (gen (Math.add i 1) (Math.sub rem 1) (Lists.cons ti acc2)))
+                                                                    newVars = gen 0 k []
+                                                                    newSubst = Maps.union (Maps.fromList (Lists.zip vars newVars)) subst
+                                                                    newBound = Sets.union boundVars (Sets.fromList newVars)
+                                                                    newVal = rewriteWithSubst ((newSubst, newBound), (Math.add next k)) (Core.bindingTerm b)
+                                                                    renameConstraintKeys =
+                                                                            \constraintMap -> Maps.fromList (Lists.map (\p ->
+                                                                              let oldName = Pairs.first p
+                                                                                  meta = Pairs.second p
+                                                                                  newName = Maybes.fromMaybe oldName (Maps.lookup oldName newSubst)
+                                                                              in (newName, meta)) (Maps.toList constraintMap))
+                                                                    oldConstraints = Core.typeSchemeConstraints ts
+                                                                    newConstraints = Maybes.map renameConstraintKeys oldConstraints
+                                                                    b1 =
+                                                                            Core.Binding {
+                                                                              Core.bindingName = (Core.bindingName b),
+                                                                              Core.bindingTerm = newVal,
+                                                                              Core.bindingType = (Just (Core.TypeScheme {
+                                                                                Core.typeSchemeVariables = newVars,
+                                                                                Core.typeSchemeType = (substType newSubst typ),
+                                                                                Core.typeSchemeConstraints = newConstraints}))}
+                                                                in (step (Lists.cons b1 acc) tl)
+                                                  in (Maybes.maybe noType (\ts -> withType ts) (Core.bindingType b)))
+                                        bindings1 = step [] bindings0
+                                    in (Core.TermLet (Core.Let {
+                                      Core.letBindings = bindings1,
+                                      Core.letBody = (rewriteWithSubst ((subst, boundVars), next) body0)}))
+                                  Core.TermTypeApplication v0 -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (rewriteWithSubst ((subst, boundVars), next) (Core.typeApplicationTermBody v0)),
+                                    Core.typeApplicationTermType = (substType subst (Core.typeApplicationTermType v0))})
+                                  Core.TermTypeLambda v0 -> Core.TermTypeLambda (Core.TypeLambda {
+                                    Core.typeLambdaParameter = (replaceName subst (Core.typeLambdaParameter v0)),
+                                    Core.typeLambdaBody = (rewriteWithSubst ((subst, boundVars), next) (Core.typeLambdaBody v0))})
+                                  _ -> recurse term
+                    in (rewriteTerm rewrite term0)
+      in (rewriteWithSubst ((Maps.empty, Sets.empty), 0) term)
+
+-- | Given a let expression, remove any unused bindings. The resulting expression is still a let, even if has no remaining bindings
+pruneLet :: Core.Let -> Core.Let
+pruneLet l =
+
+      let bindingMap = Maps.fromList (Lists.map (\b -> (Core.bindingName b, (Core.bindingTerm b))) (Core.letBindings l))
+          rootName = Core.Name "[[[root]]]"
+          adj =
+                  \n -> Sets.intersection (Sets.fromList (Maps.keys bindingMap)) (freeVariablesInTerm (Logic.ifElse (Equality.equal n rootName) (Core.letBody l) (Maybes.fromJust (Maps.lookup n bindingMap))))
+          reachable = Sorting.findReachableNodes adj rootName
+          prunedBindings = Lists.filter (\b -> Sets.member (Core.bindingName b) reachable) (Core.letBindings l)
+      in Core.Let {
+        Core.letBindings = prunedBindings,
+        Core.letBody = (Core.letBody l)}
+
+-- | Recursively remove term annotations, including within subterms
+removeTermAnnotations :: Core.Term -> Core.Term
+removeTermAnnotations term =
+
+      let remove =
+              \recurse -> \term ->
+                let rewritten = recurse term
+                in case term of
+                  Core.TermAnnotated v0 -> Core.annotatedTermBody v0
+                  _ -> rewritten
+      in (rewriteTerm remove term)
+
+-- | Recursively remove type annotations, including within subtypes
+removeTypeAnnotations :: Core.Type -> Core.Type
+removeTypeAnnotations typ =
+
+      let remove =
+              \recurse -> \typ ->
+                let rewritten = recurse typ
+                in case rewritten of
+                  Core.TypeAnnotated v0 -> Core.annotatedTypeBody v0
+                  _ -> rewritten
+      in (rewriteType remove typ)
+
+-- | Strip type annotations (TypeLambda, TypeApplication, binding type schemes) from terms while preserving lambda domain types and other annotations
+removeTypeAnnotationsFromTerm :: Core.Term -> Core.Term
+removeTypeAnnotationsFromTerm term =
+
+      let strip =
+              \recurse -> \term ->
+                let rewritten = recurse term
+                    stripBinding =
+                            \b -> Core.Binding {
+                              Core.bindingName = (Core.bindingName b),
+                              Core.bindingTerm = (Core.bindingTerm b),
+                              Core.bindingType = Nothing}
+                in case rewritten of
+                  Core.TermLet v0 -> Core.TermLet (Core.Let {
+                    Core.letBindings = (Lists.map stripBinding (Core.letBindings v0)),
+                    Core.letBody = (Core.letBody v0)})
+                  Core.TermTypeApplication v0 -> Core.typeApplicationTermBody v0
+                  Core.TermTypeLambda v0 -> Core.typeLambdaBody v0
+                  _ -> rewritten
+      in (rewriteTerm strip term)
+
+-- | Strip type annotations from terms while preserving other annotations
+removeTypesFromTerm :: Core.Term -> Core.Term
+removeTypesFromTerm term =
+
+      let strip =
+              \recurse -> \term ->
+                let rewritten = recurse term
+                    stripBinding =
+                            \b -> Core.Binding {
+                              Core.bindingName = (Core.bindingName b),
+                              Core.bindingTerm = (Core.bindingTerm b),
+                              Core.bindingType = Nothing}
+                in case rewritten of
+                  Core.TermFunction v0 -> case v0 of
+                    Core.FunctionElimination v1 -> Core.TermFunction (Core.FunctionElimination v1)
+                    Core.FunctionLambda v1 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.lambdaParameter v1),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.lambdaBody v1)}))
+                    _ -> Core.TermFunction v0
+                  Core.TermLet v0 -> Core.TermLet (Core.Let {
+                    Core.letBindings = (Lists.map stripBinding (Core.letBindings v0)),
+                    Core.letBody = (Core.letBody v0)})
+                  Core.TermTypeApplication v0 -> Core.typeApplicationTermBody v0
+                  Core.TermTypeLambda v0 -> Core.typeLambdaBody v0
+                  _ -> rewritten
+      in (rewriteTerm strip term)
+
+-- | Replace a free variable in a term
+replaceFreeTermVariable :: Core.Name -> Core.Term -> Core.Term -> Core.Term
+replaceFreeTermVariable vold tnew term =
+
+      let rewrite =
+              \recurse -> \t -> case t of
+                Core.TermFunction v0 -> case v0 of
+                  Core.FunctionLambda v1 ->
+                    let v = Core.lambdaParameter v1
+                    in (Logic.ifElse (Equality.equal v vold) t (recurse t))
+                  _ -> recurse t
+                Core.TermVariable v0 -> Logic.ifElse (Equality.equal v0 vold) tnew (Core.TermVariable v0)
+                _ -> recurse t
+      in (rewriteTerm rewrite term)
+
+-- | Replace free occurrences of a name in a type
+replaceFreeTypeVariable :: Core.Name -> Core.Type -> Core.Type -> Core.Type
+replaceFreeTypeVariable v rep typ =
+
+      let mapExpr =
+              \recurse -> \t -> case t of
+                Core.TypeForall v0 -> Logic.ifElse (Equality.equal v (Core.forallTypeParameter v0)) t (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.forallTypeParameter v0),
+                  Core.forallTypeBody = (recurse (Core.forallTypeBody v0))}))
+                Core.TypeVariable v0 -> Logic.ifElse (Equality.equal v v0) rep t
+                _ -> recurse t
+      in (rewriteType mapExpr typ)
+
+-- | Replace all occurrences of simple typedefs (type aliases) with the aliased types, recursively
+replaceTypedefs :: M.Map Core.Name Core.TypeScheme -> Core.Type -> Core.Type
+replaceTypedefs types typ0 =
+
+      let rewrite =
+              \recurse -> \typ -> case typ of
+                Core.TypeAnnotated v0 -> Core.TypeAnnotated (Core.AnnotatedType {
+                  Core.annotatedTypeBody = (rewrite recurse (Core.annotatedTypeBody v0)),
+                  Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v0)})
+                Core.TypeRecord _ -> typ
+                Core.TypeUnion _ -> typ
+                Core.TypeVariable v0 ->
+                  let forMono =
+                          \t -> case t of
+                            Core.TypeRecord _ -> typ
+                            Core.TypeUnion _ -> typ
+                            Core.TypeWrap _ -> typ
+                            _ -> rewrite recurse t
+                      forTypeScheme =
+                              \ts ->
+                                let t = Core.typeSchemeType ts
+                                in (Logic.ifElse (Lists.null (Core.typeSchemeVariables ts)) (forMono t) typ)
+                  in (Maybes.maybe typ (\ts -> forTypeScheme ts) (Maps.lookup v0 types))
+                Core.TypeWrap _ -> typ
+                _ -> recurse typ
+      in (rewriteType rewrite typ0)
+
+-- | Rewrite a term, and at the same time, fold a function over it, accumulating a value
+rewriteAndFoldTerm :: ((t0 -> Core.Term -> (t0, Core.Term)) -> t0 -> Core.Term -> (t0, Core.Term)) -> t0 -> Core.Term -> (t0, Core.Term)
+rewriteAndFoldTerm f term0 =
+
+      let fsub =
+              \recurse -> \val0 -> \term0 ->
+                let forSingle =
+                        \rec -> \cons -> \val -> \term ->
+                          let r = rec val term
+                          in (Pairs.first r, (cons (Pairs.second r)))
+                    forMany =
+                            \rec -> \cons -> \val -> \els ->
+                              let rr =
+                                      Lists.foldl (\r -> \el ->
+                                        let r2 = rec (Pairs.first r) el
+                                        in (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second r)))) (val, []) els
+                              in (Pairs.first rr, (cons (Lists.reverse (Pairs.second rr))))
+                    forField =
+                            \val -> \field ->
+                              let r = recurse val (Core.fieldTerm field)
+                              in (Pairs.first r, Core.Field {
+                                Core.fieldName = (Core.fieldName field),
+                                Core.fieldTerm = (Pairs.second r)})
+                    forFields = forMany forField (\x -> x)
+                    forPair =
+                            \val -> \kv ->
+                              let rk = recurse val (Pairs.first kv)
+                                  rv = recurse (Pairs.first rk) (Pairs.second kv)
+                              in (Pairs.first rv, (Pairs.second rk, (Pairs.second rv)))
+                    forBinding =
+                            \val -> \binding ->
+                              let r = recurse val (Core.bindingTerm binding)
+                              in (Pairs.first r, Core.Binding {
+                                Core.bindingName = (Core.bindingName binding),
+                                Core.bindingTerm = (Pairs.second r),
+                                Core.bindingType = (Core.bindingType binding)})
+                    forElimination =
+                            \val -> \elm ->
+                              let r =
+                                      case elm of
+                                        Core.EliminationUnion v0 ->
+                                          let rmd = Maybes.map (recurse val) (Core.caseStatementDefault v0)
+                                              val1 = Maybes.maybe val Pairs.first rmd
+                                              rcases = forFields val1 (Core.caseStatementCases v0)
+                                          in (Pairs.first rcases, (Core.EliminationUnion (Core.CaseStatement {
+                                            Core.caseStatementTypeName = (Core.caseStatementTypeName v0),
+                                            Core.caseStatementDefault = (Maybes.map Pairs.second rmd),
+                                            Core.caseStatementCases = (Pairs.second rcases)})))
+                                        _ -> (val, elm)
+                              in (Pairs.first r, (Pairs.second r))
+                    forFunction =
+                            \val -> \fun -> case fun of
+                              Core.FunctionElimination v0 ->
+                                let re = forElimination val v0
+                                in (Pairs.first re, (Core.FunctionElimination (Pairs.second re)))
+                              Core.FunctionLambda v0 ->
+                                let rl = recurse val (Core.lambdaBody v0)
+                                in (Pairs.first rl, (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.lambdaParameter v0),
+                                  Core.lambdaDomain = (Core.lambdaDomain v0),
+                                  Core.lambdaBody = (Pairs.second rl)})))
+                              _ -> (val, fun)
+                    dflt = (val0, term0)
+                in case term0 of
+                  Core.TermAnnotated v0 -> forSingle recurse (\t -> Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = t,
+                    Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})) val0 (Core.annotatedTermBody v0)
+                  Core.TermApplication v0 ->
+                    let rlhs = recurse val0 (Core.applicationFunction v0)
+                        rrhs = recurse (Pairs.first rlhs) (Core.applicationArgument v0)
+                    in (Pairs.first rrhs, (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Pairs.second rlhs),
+                      Core.applicationArgument = (Pairs.second rrhs)})))
+                  Core.TermEither v0 -> Eithers.either (\l ->
+                    let rl = recurse val0 l
+                    in (Pairs.first rl, (Core.TermEither (Left (Pairs.second rl))))) (\r ->
+                    let rr = recurse val0 r
+                    in (Pairs.first rr, (Core.TermEither (Right (Pairs.second rr))))) v0
+                  Core.TermFunction v0 -> forSingle forFunction (\f -> Core.TermFunction f) val0 v0
+                  Core.TermLet v0 ->
+                    let renv = recurse val0 (Core.letBody v0)
+                    in (forMany forBinding (\bins -> Core.TermLet (Core.Let {
+                      Core.letBindings = bins,
+                      Core.letBody = (Pairs.second renv)})) (Pairs.first renv) (Core.letBindings v0))
+                  Core.TermList v0 -> forMany recurse (\x -> Core.TermList x) val0 v0
+                  Core.TermMap v0 -> forMany forPair (\pairs -> Core.TermMap (Maps.fromList pairs)) val0 (Maps.toList v0)
+                  Core.TermMaybe v0 -> Maybes.maybe dflt (\t -> forSingle recurse (\t1 -> Core.TermMaybe (Just t1)) val0 t) v0
+                  Core.TermPair v0 ->
+                    let rf = recurse val0 (Pairs.first v0)
+                        rs = recurse (Pairs.first rf) (Pairs.second v0)
+                    in (Pairs.first rs, (Core.TermPair (Pairs.second rf, (Pairs.second rs))))
+                  Core.TermRecord v0 -> forMany forField (\fields -> Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.recordTypeName v0),
+                    Core.recordFields = fields})) val0 (Core.recordFields v0)
+                  Core.TermSet v0 -> forMany recurse (\e -> Core.TermSet (Sets.fromList e)) val0 (Sets.toList v0)
+                  Core.TermTypeApplication v0 -> forSingle recurse (\t -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = t,
+                    Core.typeApplicationTermType = (Core.typeApplicationTermType v0)})) val0 (Core.typeApplicationTermBody v0)
+                  Core.TermTypeLambda v0 -> forSingle recurse (\t -> Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.typeLambdaParameter v0),
+                    Core.typeLambdaBody = t})) val0 (Core.typeLambdaBody v0)
+                  Core.TermUnion v0 -> forSingle recurse (\t -> Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.injectionTypeName v0),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.fieldName (Core.injectionField v0)),
+                      Core.fieldTerm = t}})) val0 (Core.fieldTerm (Core.injectionField v0))
+                  Core.TermWrap v0 -> forSingle recurse (\t -> Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.wrappedTermTypeName v0),
+                    Core.wrappedTermBody = t})) val0 (Core.wrappedTermBody v0)
+                  _ -> dflt
+          recurse = f (fsub recurse)
+      in (recurse term0)
+
+-- | Rewrite a term while folding to produce a value, with Graph updated as we descend into subterms. Combines the features of rewriteAndFoldTerm and rewriteTermWithGraph. The user function f receives a recurse function that handles subterm traversal and Graph management.
+rewriteAndFoldTermWithGraph :: ((t0 -> Core.Term -> (t0, Core.Term)) -> Graph.Graph -> t0 -> Core.Term -> (t0, Core.Term)) -> Graph.Graph -> t0 -> Core.Term -> (t0, Core.Term)
+rewriteAndFoldTermWithGraph f cx0 val0 term0 =
+
+      let wrapper =
+              \lowLevelRecurse -> \valAndCx -> \term ->
+                let val = Pairs.first valAndCx
+                    cx = Pairs.second valAndCx
+                    cx1 =
+                            case term of
+                              Core.TermFunction v0 -> case v0 of
+                                Core.FunctionLambda v1 -> extendGraphForLambda cx v1
+                                _ -> cx
+                              Core.TermLet v0 -> extendGraphForLet (\_ -> \_ -> Nothing) cx v0
+                              Core.TermTypeLambda v0 -> extendGraphForTypeLambda cx v0
+                              _ -> cx
+                    recurseForUser =
+                            \newVal -> \subterm ->
+                              let result = lowLevelRecurse (newVal, cx1) subterm
+                              in (Pairs.first (Pairs.first result), (Pairs.second result))
+                    fResult = f recurseForUser cx1 val term
+                in ((Pairs.first fResult, cx), (Pairs.second fResult))
+          result = rewriteAndFoldTerm wrapper (val0, cx0) term0
+      in (Pairs.first (Pairs.first result), (Pairs.second result))
+
+-- | Rewrite a term while folding to produce a value, with both Graph and accessor path tracked. The path is a list of SubtermSteps representing the position from the root to the current term. Combines the features of rewriteAndFoldTermWithPath and Graph tracking. The Graph is automatically updated when descending into lambdas, lets, and type lambdas.
+rewriteAndFoldTermWithGraphAndPath :: ((t0 -> Core.Term -> (t0, Core.Term)) -> [Paths.SubtermStep] -> Graph.Graph -> t0 -> Core.Term -> (t0, Core.Term)) -> Graph.Graph -> t0 -> Core.Term -> (t0, Core.Term)
+rewriteAndFoldTermWithGraphAndPath f cx0 val0 term0 =
+
+      let wrapper =
+              \recurse -> \path -> \cxAndVal -> \term ->
+                let cx = Pairs.first cxAndVal
+                    val = Pairs.second cxAndVal
+                    cx1 =
+                            case term of
+                              Core.TermFunction v0 -> case v0 of
+                                Core.FunctionLambda v1 -> extendGraphForLambda cx v1
+                                _ -> cx
+                              Core.TermLet v0 -> extendGraphForLet (\_ -> \_ -> Nothing) cx v0
+                              Core.TermTypeLambda v0 -> extendGraphForTypeLambda cx v0
+                              _ -> cx
+                    recurseForUser =
+                            \valIn -> \termIn ->
+                              let result = recurse path (cx1, valIn) termIn
+                              in (Pairs.second (Pairs.first result), (Pairs.second result))
+                    fResult = f recurseForUser path cx1 val term
+                in ((cx, (Pairs.first fResult)), (Pairs.second fResult))
+          result = rewriteAndFoldTermWithPath wrapper (cx0, val0) term0
+      in (Pairs.second (Pairs.first result), (Pairs.second result))
+
+-- | Rewrite a term with path tracking, and fold a function over it, accumulating a value. The path is a list of SubtermSteps from root to current position.
+rewriteAndFoldTermWithPath :: (([Paths.SubtermStep] -> t0 -> Core.Term -> (t0, Core.Term)) -> [Paths.SubtermStep] -> t0 -> Core.Term -> (t0, Core.Term)) -> t0 -> Core.Term -> (t0, Core.Term)
+rewriteAndFoldTermWithPath f term0 =
+
+      let fsub =
+              \recurse -> \path -> \val0 -> \term0 ->
+                let forSingleWithAccessor =
+                        \rec -> \cons -> \accessor -> \val -> \term ->
+                          let r = rec (Lists.concat2 path [
+                                accessor]) val term
+                          in (Pairs.first r, (cons (Pairs.second r)))
+                    forManyWithAccessors =
+                            \rec -> \cons -> \val -> \accessorTermPairs ->
+                              let rr =
+                                      Lists.foldl (\r -> \atp ->
+                                        let r2 = rec (Lists.concat2 path [
+                                              Pairs.first atp]) (Pairs.first r) (Pairs.second atp)
+                                        in (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second r)))) (val, []) accessorTermPairs
+                              in (Pairs.first rr, (cons (Lists.reverse (Pairs.second rr))))
+                    forFieldWithAccessor =
+                            \mkAccessor -> \val -> \field ->
+                              let r = recurse (Lists.concat2 path [
+                                    mkAccessor (Core.fieldName field)]) val (Core.fieldTerm field)
+                              in (Pairs.first r, Core.Field {
+                                Core.fieldName = (Core.fieldName field),
+                                Core.fieldTerm = (Pairs.second r)})
+                    forFieldsWithAccessor =
+                            \mkAccessor -> forManyWithAccessors (\path1 -> \val1 -> \field1 -> forFieldWithAccessor mkAccessor val1 field1) (\x -> x)
+                    forPairWithAccessors =
+                            \keyAccessor -> \valAccessor -> \val -> \kv ->
+                              let rk = recurse (Lists.concat2 path [
+                                    keyAccessor]) val (Pairs.first kv)
+                                  rv = recurse (Lists.concat2 path [
+                                        valAccessor]) (Pairs.first rk) (Pairs.second kv)
+                              in (Pairs.first rv, (Pairs.second rk, (Pairs.second rv)))
+                    forBindingWithAccessor =
+                            \val -> \binding ->
+                              let r = recurse (Lists.concat2 path [
+                                    Paths.SubtermStepLetBinding (Core.bindingName binding)]) val (Core.bindingTerm binding)
+                              in (Pairs.first r, Core.Binding {
+                                Core.bindingName = (Core.bindingName binding),
+                                Core.bindingTerm = (Pairs.second r),
+                                Core.bindingType = (Core.bindingType binding)})
+                    forElimination =
+                            \val -> \elm ->
+                              let r =
+                                      case elm of
+                                        Core.EliminationUnion v0 ->
+                                          let rmd =
+                                                  Maybes.map (\def -> recurse (Lists.concat2 path [
+                                                    Paths.SubtermStepUnionCasesDefault]) val def) (Core.caseStatementDefault v0)
+                                              val1 = Maybes.maybe val Pairs.first rmd
+                                              rcases =
+                                                      forManyWithAccessors recurse (\x -> x) val1 (Lists.map (\f -> (Paths.SubtermStepUnionCasesBranch (Core.fieldName f), (Core.fieldTerm f))) (Core.caseStatementCases v0))
+                                          in (Pairs.first rcases, (Core.EliminationUnion (Core.CaseStatement {
+                                            Core.caseStatementTypeName = (Core.caseStatementTypeName v0),
+                                            Core.caseStatementDefault = (Maybes.map Pairs.second rmd),
+                                            Core.caseStatementCases = (Lists.map (\ft -> Core.Field {
+                                              Core.fieldName = (Pairs.first ft),
+                                              Core.fieldTerm = (Pairs.second ft)}) (Lists.zip (Lists.map Core.fieldName (Core.caseStatementCases v0)) (Pairs.second rcases)))})))
+                                        _ -> (val, elm)
+                              in (Pairs.first r, (Pairs.second r))
+                    forFunction =
+                            \val -> \fun -> case fun of
+                              Core.FunctionElimination v0 ->
+                                let re = forElimination val v0
+                                in (Pairs.first re, (Core.FunctionElimination (Pairs.second re)))
+                              Core.FunctionLambda v0 ->
+                                let rl = recurse (Lists.concat2 path [
+                                      Paths.SubtermStepLambdaBody]) val (Core.lambdaBody v0)
+                                in (Pairs.first rl, (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.lambdaParameter v0),
+                                  Core.lambdaDomain = (Core.lambdaDomain v0),
+                                  Core.lambdaBody = (Pairs.second rl)})))
+                              _ -> (val, fun)
+                    dflt = (val0, term0)
+                in case term0 of
+                  Core.TermAnnotated v0 -> forSingleWithAccessor recurse (\t -> Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = t,
+                    Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})) Paths.SubtermStepAnnotatedBody val0 (Core.annotatedTermBody v0)
+                  Core.TermApplication v0 ->
+                    let rlhs = recurse (Lists.concat2 path [
+                          Paths.SubtermStepApplicationFunction]) val0 (Core.applicationFunction v0)
+                        rrhs = recurse (Lists.concat2 path [
+                              Paths.SubtermStepApplicationArgument]) (Pairs.first rlhs) (Core.applicationArgument v0)
+                    in (Pairs.first rrhs, (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Pairs.second rlhs),
+                      Core.applicationArgument = (Pairs.second rrhs)})))
+                  Core.TermEither v0 -> Eithers.either (\l ->
+                    let rl = recurse (Lists.concat2 path [
+                          Paths.SubtermStepSumTerm]) val0 l
+                    in (Pairs.first rl, (Core.TermEither (Left (Pairs.second rl))))) (\r ->
+                    let rr = recurse (Lists.concat2 path [
+                          Paths.SubtermStepSumTerm]) val0 r
+                    in (Pairs.first rr, (Core.TermEither (Right (Pairs.second rr))))) v0
+                  Core.TermFunction v0 ->
+                    let rf = forFunction val0 v0
+                    in (Pairs.first rf, (Core.TermFunction (Pairs.second rf)))
+                  Core.TermLet v0 ->
+                    let renv = recurse (Lists.concat2 path [
+                          Paths.SubtermStepLetBody]) val0 (Core.letBody v0)
+                        rbindings =
+                                Lists.foldl (\r -> \binding ->
+                                  let rb = forBindingWithAccessor (Pairs.first r) binding
+                                  in (Pairs.first rb, (Lists.cons (Pairs.second rb) (Pairs.second r)))) (Pairs.first renv, []) (Core.letBindings v0)
+                    in (Pairs.first rbindings, (Core.TermLet (Core.Let {
+                      Core.letBindings = (Lists.reverse (Pairs.second rbindings)),
+                      Core.letBody = (Pairs.second renv)})))
+                  Core.TermList v0 ->
+                    let idx = 0
+                        rr =
+                                Lists.foldl (\r -> \el ->
+                                  let r2 = recurse (Lists.concat2 path [
+                                        Paths.SubtermStepListElement (Pairs.first r)]) (Pairs.first (Pairs.second r)) el
+                                  in (Math.add (Pairs.first r) 1, (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second (Pairs.second r)))))) (idx, (val0, [])) v0
+                    in (Pairs.first (Pairs.second rr), (Core.TermList (Lists.reverse (Pairs.second (Pairs.second rr)))))
+                  Core.TermMap v0 ->
+                    let idx = 0
+                        rr =
+                                Lists.foldl (\r -> \kv ->
+                                  let rk = recurse (Lists.concat2 path [
+                                        Paths.SubtermStepMapKey (Pairs.first r)]) (Pairs.first (Pairs.second r)) (Pairs.first kv)
+                                      rv = recurse (Lists.concat2 path [
+                                            Paths.SubtermStepMapValue (Pairs.first r)]) (Pairs.first rk) (Pairs.second kv)
+                                  in (Math.add (Pairs.first r) 1, (Pairs.first rv, (Lists.cons (Pairs.second rk, (Pairs.second rv)) (Pairs.second (Pairs.second r)))))) (idx, (val0, [])) (Maps.toList v0)
+                    in (Pairs.first (Pairs.second rr), (Core.TermMap (Maps.fromList (Lists.reverse (Pairs.second (Pairs.second rr))))))
+                  Core.TermMaybe v0 -> Maybes.maybe dflt (\t -> forSingleWithAccessor recurse (\t1 -> Core.TermMaybe (Just t1)) Paths.SubtermStepMaybeTerm val0 t) v0
+                  Core.TermPair v0 ->
+                    let rf = recurse (Lists.concat2 path [
+                          Paths.SubtermStepProductTerm 0]) val0 (Pairs.first v0)
+                        rs = recurse (Lists.concat2 path [
+                              Paths.SubtermStepProductTerm 1]) (Pairs.first rf) (Pairs.second v0)
+                    in (Pairs.first rs, (Core.TermPair (Pairs.second rf, (Pairs.second rs))))
+                  Core.TermRecord v0 ->
+                    let rfields =
+                            forManyWithAccessors recurse (\x -> x) val0 (Lists.map (\f -> (Paths.SubtermStepRecordField (Core.fieldName f), (Core.fieldTerm f))) (Core.recordFields v0))
+                    in (Pairs.first rfields, (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.recordTypeName v0),
+                      Core.recordFields = (Lists.map (\ft -> Core.Field {
+                        Core.fieldName = (Pairs.first ft),
+                        Core.fieldTerm = (Pairs.second ft)}) (Lists.zip (Lists.map Core.fieldName (Core.recordFields v0)) (Pairs.second rfields)))})))
+                  Core.TermSet v0 ->
+                    let idx = 0
+                        rr =
+                                Lists.foldl (\r -> \el ->
+                                  let r2 = recurse (Lists.concat2 path [
+                                        Paths.SubtermStepSetElement (Pairs.first r)]) (Pairs.first (Pairs.second r)) el
+                                  in (Math.add (Pairs.first r) 1, (Pairs.first r2, (Lists.cons (Pairs.second r2) (Pairs.second (Pairs.second r)))))) (idx, (val0, [])) (Sets.toList v0)
+                    in (Pairs.first (Pairs.second rr), (Core.TermSet (Sets.fromList (Lists.reverse (Pairs.second (Pairs.second rr))))))
+                  Core.TermTypeApplication v0 -> forSingleWithAccessor recurse (\t -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = t,
+                    Core.typeApplicationTermType = (Core.typeApplicationTermType v0)})) Paths.SubtermStepTypeApplicationTerm val0 (Core.typeApplicationTermBody v0)
+                  Core.TermTypeLambda v0 -> forSingleWithAccessor recurse (\t -> Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.typeLambdaParameter v0),
+                    Core.typeLambdaBody = t})) Paths.SubtermStepTypeLambdaBody val0 (Core.typeLambdaBody v0)
+                  Core.TermUnion v0 -> forSingleWithAccessor recurse (\t -> Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.injectionTypeName v0),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.fieldName (Core.injectionField v0)),
+                      Core.fieldTerm = t}})) Paths.SubtermStepInjectionTerm val0 (Core.fieldTerm (Core.injectionField v0))
+                  Core.TermWrap v0 -> forSingleWithAccessor recurse (\t -> Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.wrappedTermTypeName v0),
+                    Core.wrappedTermBody = t})) Paths.SubtermStepWrappedTerm val0 (Core.wrappedTermBody v0)
+                  _ -> dflt
+          recurse = f (fsub recurse)
+      in (recurse [] term0)
+
+rewriteTerm :: ((Core.Term -> Core.Term) -> Core.Term -> Core.Term) -> Core.Term -> Core.Term
+rewriteTerm f term0 =
+
+      let fsub =
+              \recurse -> \term ->
+                let forField =
+                        \f -> Core.Field {
+                          Core.fieldName = (Core.fieldName f),
+                          Core.fieldTerm = (recurse (Core.fieldTerm f))}
+                    forElimination =
+                            \elm -> case elm of
+                              Core.EliminationRecord v0 -> Core.EliminationRecord v0
+                              Core.EliminationUnion v0 -> Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.caseStatementTypeName v0),
+                                Core.caseStatementDefault = (Maybes.map recurse (Core.caseStatementDefault v0)),
+                                Core.caseStatementCases = (Lists.map forField (Core.caseStatementCases v0))})
+                              Core.EliminationWrap v0 -> Core.EliminationWrap v0
+                    forFunction =
+                            \fun -> case fun of
+                              Core.FunctionElimination v0 -> Core.FunctionElimination (forElimination v0)
+                              Core.FunctionLambda v0 -> Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.lambdaParameter v0),
+                                Core.lambdaDomain = (Core.lambdaDomain v0),
+                                Core.lambdaBody = (recurse (Core.lambdaBody v0))})
+                              Core.FunctionPrimitive v0 -> Core.FunctionPrimitive v0
+                    forLet =
+                            \lt ->
+                              let mapBinding =
+                                      \b -> Core.Binding {
+                                        Core.bindingName = (Core.bindingName b),
+                                        Core.bindingTerm = (recurse (Core.bindingTerm b)),
+                                        Core.bindingType = (Core.bindingType b)}
+                              in Core.Let {
+                                Core.letBindings = (Lists.map mapBinding (Core.letBindings lt)),
+                                Core.letBody = (recurse (Core.letBody lt))}
+                    forMap =
+                            \m ->
+                              let forPair = \p -> (recurse (Pairs.first p), (recurse (Pairs.second p)))
+                              in (Maps.fromList (Lists.map forPair (Maps.toList m)))
+                in case term of
+                  Core.TermAnnotated v0 -> Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (recurse (Core.annotatedTermBody v0)),
+                    Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})
+                  Core.TermApplication v0 -> Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (recurse (Core.applicationFunction v0)),
+                    Core.applicationArgument = (recurse (Core.applicationArgument v0))})
+                  Core.TermEither v0 -> Core.TermEither (Eithers.either (\l -> Left (recurse l)) (\r -> Right (recurse r)) v0)
+                  Core.TermFunction v0 -> Core.TermFunction (forFunction v0)
+                  Core.TermLet v0 -> Core.TermLet (forLet v0)
+                  Core.TermList v0 -> Core.TermList (Lists.map recurse v0)
+                  Core.TermLiteral v0 -> Core.TermLiteral v0
+                  Core.TermMap v0 -> Core.TermMap (forMap v0)
+                  Core.TermMaybe v0 -> Core.TermMaybe (Maybes.map recurse v0)
+                  Core.TermPair v0 -> Core.TermPair (recurse (Pairs.first v0), (recurse (Pairs.second v0)))
+                  Core.TermRecord v0 -> Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.recordTypeName v0),
+                    Core.recordFields = (Lists.map forField (Core.recordFields v0))})
+                  Core.TermSet v0 -> Core.TermSet (Sets.fromList (Lists.map recurse (Sets.toList v0)))
+                  Core.TermTypeApplication v0 -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (recurse (Core.typeApplicationTermBody v0)),
+                    Core.typeApplicationTermType = (Core.typeApplicationTermType v0)})
+                  Core.TermTypeLambda v0 -> Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.typeLambdaParameter v0),
+                    Core.typeLambdaBody = (recurse (Core.typeLambdaBody v0))})
+                  Core.TermUnion v0 -> Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.injectionTypeName v0),
+                    Core.injectionField = (forField (Core.injectionField v0))})
+                  Core.TermUnit -> Core.TermUnit
+                  Core.TermVariable v0 -> Core.TermVariable v0
+                  Core.TermWrap v0 -> Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.wrappedTermTypeName v0),
+                    Core.wrappedTermBody = (recurse (Core.wrappedTermBody v0))})
+          recurse = f (fsub recurse)
+      in (recurse term0)
+
+-- | Either-based term rewriting with custom transformation function
+rewriteTermM :: ((Core.Term -> Either t0 Core.Term) -> Core.Term -> Either t0 Core.Term) -> Core.Term -> Either t0 Core.Term
+rewriteTermM f term0 =
+
+      let fsub =
+              \recurse -> \term ->
+                let forField =
+                        \field -> Eithers.bind (recurse (Core.fieldTerm field)) (\t -> Right (Core.Field {
+                          Core.fieldName = (Core.fieldName field),
+                          Core.fieldTerm = t}))
+                    forPair =
+                            \kv -> Eithers.bind (recurse (Pairs.first kv)) (\k -> Eithers.bind (recurse (Pairs.second kv)) (\v -> Right (k, v)))
+                    mapBinding =
+                            \b -> Eithers.bind (recurse (Core.bindingTerm b)) (\v -> Right (Core.Binding {
+                              Core.bindingName = (Core.bindingName b),
+                              Core.bindingTerm = v,
+                              Core.bindingType = (Core.bindingType b)}))
+                in case term of
+                  Core.TermAnnotated v0 -> Eithers.bind (recurse (Core.annotatedTermBody v0)) (\ex -> Right (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = ex,
+                    Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})))
+                  Core.TermApplication v0 -> Eithers.bind (recurse (Core.applicationFunction v0)) (\lhs -> Eithers.bind (recurse (Core.applicationArgument v0)) (\rhs -> Right (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = lhs,
+                    Core.applicationArgument = rhs}))))
+                  Core.TermEither v0 -> Eithers.bind (Eithers.either (\l -> Eithers.map (\x -> Left x) (recurse l)) (\r -> Eithers.map (\x -> Right x) (recurse r)) v0) (\re -> Right (Core.TermEither re))
+                  Core.TermFunction v0 ->
+                    let forElm =
+                            \e -> case e of
+                              Core.EliminationRecord v1 -> Right (Core.FunctionElimination (Core.EliminationRecord v1))
+                              Core.EliminationUnion v1 ->
+                                let n = Core.caseStatementTypeName v1
+                                    def = Core.caseStatementDefault v1
+                                    cases = Core.caseStatementCases v1
+                                in (Eithers.bind (Maybes.maybe (Right Nothing) (\t -> Eithers.map Maybes.pure (recurse t)) def) (\rdef -> Eithers.map (\rcases -> Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = n,
+                                  Core.caseStatementDefault = rdef,
+                                  Core.caseStatementCases = rcases}))) (Eithers.mapList forField cases)))
+                              Core.EliminationWrap v1 -> Right (Core.FunctionElimination (Core.EliminationWrap v1))
+                        forFun =
+                                \fun -> case fun of
+                                  Core.FunctionElimination v1 -> forElm v1
+                                  Core.FunctionLambda v1 ->
+                                    let v = Core.lambdaParameter v1
+                                        d = Core.lambdaDomain v1
+                                        body = Core.lambdaBody v1
+                                    in (Eithers.bind (recurse body) (\rbody -> Right (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = v,
+                                      Core.lambdaDomain = d,
+                                      Core.lambdaBody = rbody}))))
+                                  Core.FunctionPrimitive v1 -> Right (Core.FunctionPrimitive v1)
+                    in (Eithers.bind (forFun v0) (\rfun -> Right (Core.TermFunction rfun)))
+                  Core.TermLet v0 ->
+                    let bindings = Core.letBindings v0
+                        env = Core.letBody v0
+                    in (Eithers.bind (Eithers.mapList mapBinding bindings) (\rbindings -> Eithers.bind (recurse env) (\renv -> Right (Core.TermLet (Core.Let {
+                      Core.letBindings = rbindings,
+                      Core.letBody = renv})))))
+                  Core.TermList v0 -> Eithers.bind (Eithers.mapList recurse v0) (\rels -> Right (Core.TermList rels))
+                  Core.TermLiteral v0 -> Right (Core.TermLiteral v0)
+                  Core.TermMap v0 -> Eithers.bind (Eithers.mapList forPair (Maps.toList v0)) (\pairs -> Right (Core.TermMap (Maps.fromList pairs)))
+                  Core.TermMaybe v0 -> Eithers.bind (Eithers.mapMaybe recurse v0) (\rm -> Right (Core.TermMaybe rm))
+                  Core.TermPair v0 -> Eithers.bind (recurse (Pairs.first v0)) (\rf -> Eithers.bind (recurse (Pairs.second v0)) (\rs -> Right (Core.TermPair (rf, rs))))
+                  Core.TermRecord v0 ->
+                    let n = Core.recordTypeName v0
+                        fields = Core.recordFields v0
+                    in (Eithers.map (\rfields -> Core.TermRecord (Core.Record {
+                      Core.recordTypeName = n,
+                      Core.recordFields = rfields})) (Eithers.mapList forField fields))
+                  Core.TermSet v0 -> Eithers.bind (Eithers.mapList recurse (Sets.toList v0)) (\rlist -> Right (Core.TermSet (Sets.fromList rlist)))
+                  Core.TermTypeApplication v0 -> Eithers.bind (recurse (Core.typeApplicationTermBody v0)) (\t -> Right (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = t,
+                    Core.typeApplicationTermType = (Core.typeApplicationTermType v0)})))
+                  Core.TermTypeLambda v0 ->
+                    let v = Core.typeLambdaParameter v0
+                        body = Core.typeLambdaBody v0
+                    in (Eithers.bind (recurse body) (\rbody -> Right (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = v,
+                      Core.typeLambdaBody = rbody}))))
+                  Core.TermUnion v0 ->
+                    let n = Core.injectionTypeName v0
+                        field = Core.injectionField v0
+                    in (Eithers.map (\rfield -> Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = n,
+                      Core.injectionField = rfield})) (forField field))
+                  Core.TermUnit -> Right Core.TermUnit
+                  Core.TermVariable v0 -> Right (Core.TermVariable v0)
+                  Core.TermWrap v0 ->
+                    let name = Core.wrappedTermTypeName v0
+                        t = Core.wrappedTermBody v0
+                    in (Eithers.bind (recurse t) (\rt -> Right (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = name,
+                      Core.wrappedTermBody = rt}))))
+          recurse = f (fsub recurse)
+      in (recurse term0)
+
+-- | A variant of rewriteTerm which allows a context (e.g. a TypeContext) to be passed down to all subterms during rewriting
+rewriteTermWithContext :: ((t0 -> Core.Term -> Core.Term) -> t0 -> Core.Term -> Core.Term) -> t0 -> Core.Term -> Core.Term
+rewriteTermWithContext f cx0 term0 =
+
+      let forSubterms =
+              \recurse0 -> \cx -> \term ->
+                let recurse = recurse0 cx
+                    forField =
+                            \field -> Core.Field {
+                              Core.fieldName = (Core.fieldName field),
+                              Core.fieldTerm = (recurse (Core.fieldTerm field))}
+                    forElimination =
+                            \elm -> case elm of
+                              Core.EliminationRecord v0 -> Core.EliminationRecord v0
+                              Core.EliminationUnion v0 -> Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.caseStatementTypeName v0),
+                                Core.caseStatementDefault = (Maybes.map recurse (Core.caseStatementDefault v0)),
+                                Core.caseStatementCases = (Lists.map forField (Core.caseStatementCases v0))})
+                              Core.EliminationWrap v0 -> Core.EliminationWrap v0
+                    forFunction =
+                            \fun -> case fun of
+                              Core.FunctionElimination v0 -> Core.FunctionElimination (forElimination v0)
+                              Core.FunctionLambda v0 -> Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.lambdaParameter v0),
+                                Core.lambdaDomain = (Core.lambdaDomain v0),
+                                Core.lambdaBody = (recurse (Core.lambdaBody v0))})
+                              Core.FunctionPrimitive v0 -> Core.FunctionPrimitive v0
+                    forLet =
+                            \lt ->
+                              let mapBinding =
+                                      \b -> Core.Binding {
+                                        Core.bindingName = (Core.bindingName b),
+                                        Core.bindingTerm = (recurse (Core.bindingTerm b)),
+                                        Core.bindingType = (Core.bindingType b)}
+                              in Core.Let {
+                                Core.letBindings = (Lists.map mapBinding (Core.letBindings lt)),
+                                Core.letBody = (recurse (Core.letBody lt))}
+                    forMap =
+                            \m ->
+                              let forPair = \p -> (recurse (Pairs.first p), (recurse (Pairs.second p)))
+                              in (Maps.fromList (Lists.map forPair (Maps.toList m)))
+                in case term of
+                  Core.TermAnnotated v0 -> Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (recurse (Core.annotatedTermBody v0)),
+                    Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})
+                  Core.TermApplication v0 -> Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (recurse (Core.applicationFunction v0)),
+                    Core.applicationArgument = (recurse (Core.applicationArgument v0))})
+                  Core.TermEither v0 -> Core.TermEither (Eithers.either (\l -> Left (recurse l)) (\r -> Right (recurse r)) v0)
+                  Core.TermFunction v0 -> Core.TermFunction (forFunction v0)
+                  Core.TermLet v0 -> Core.TermLet (forLet v0)
+                  Core.TermList v0 -> Core.TermList (Lists.map recurse v0)
+                  Core.TermLiteral v0 -> Core.TermLiteral v0
+                  Core.TermMap v0 -> Core.TermMap (forMap v0)
+                  Core.TermMaybe v0 -> Core.TermMaybe (Maybes.map recurse v0)
+                  Core.TermPair v0 -> Core.TermPair (recurse (Pairs.first v0), (recurse (Pairs.second v0)))
+                  Core.TermRecord v0 -> Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.recordTypeName v0),
+                    Core.recordFields = (Lists.map forField (Core.recordFields v0))})
+                  Core.TermSet v0 -> Core.TermSet (Sets.fromList (Lists.map recurse (Sets.toList v0)))
+                  Core.TermTypeApplication v0 -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (recurse (Core.typeApplicationTermBody v0)),
+                    Core.typeApplicationTermType = (Core.typeApplicationTermType v0)})
+                  Core.TermTypeLambda v0 -> Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.typeLambdaParameter v0),
+                    Core.typeLambdaBody = (recurse (Core.typeLambdaBody v0))})
+                  Core.TermUnion v0 -> Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.injectionTypeName v0),
+                    Core.injectionField = (forField (Core.injectionField v0))})
+                  Core.TermUnit -> Core.TermUnit
+                  Core.TermVariable v0 -> Core.TermVariable v0
+                  Core.TermWrap v0 -> Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.wrappedTermTypeName v0),
+                    Core.wrappedTermBody = (recurse (Core.wrappedTermBody v0))})
+          rewrite = \cx -> \term -> f (forSubterms rewrite) cx term
+      in (rewrite cx0 term0)
+
+-- | Either-based variant of rewriteTermWithContextM which allows a context (e.g. a TypeContext) to be passed down to all subterms during rewriting
+rewriteTermWithContextM :: ((t0 -> Core.Term -> Either t1 Core.Term) -> t0 -> Core.Term -> Either t1 Core.Term) -> t0 -> Core.Term -> Either t1 Core.Term
+rewriteTermWithContextM f cx0 term0 =
+
+      let forSubterms =
+              \recurse0 -> \cx -> \term ->
+                let recurse = recurse0 cx
+                    forField =
+                            \field -> Eithers.bind (recurse (Core.fieldTerm field)) (\t -> Right (Core.Field {
+                              Core.fieldName = (Core.fieldName field),
+                              Core.fieldTerm = t}))
+                    forPair =
+                            \kv -> Eithers.bind (recurse (Pairs.first kv)) (\k -> Eithers.bind (recurse (Pairs.second kv)) (\v -> Right (k, v)))
+                    forElimination =
+                            \e -> case e of
+                              Core.EliminationRecord v0 -> Right (Core.FunctionElimination (Core.EliminationRecord v0))
+                              Core.EliminationUnion v0 ->
+                                let n = Core.caseStatementTypeName v0
+                                    def = Core.caseStatementDefault v0
+                                    cases = Core.caseStatementCases v0
+                                in (Eithers.bind (Maybes.maybe (Right Nothing) (\t -> Eithers.map Maybes.pure (recurse t)) def) (\rdef -> Eithers.map (\rcases -> Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = n,
+                                  Core.caseStatementDefault = rdef,
+                                  Core.caseStatementCases = rcases}))) (Eithers.mapList forField cases)))
+                              Core.EliminationWrap v0 -> Right (Core.FunctionElimination (Core.EliminationWrap v0))
+                    forFunction =
+                            \fun -> case fun of
+                              Core.FunctionElimination v0 -> forElimination v0
+                              Core.FunctionLambda v0 ->
+                                let v = Core.lambdaParameter v0
+                                    d = Core.lambdaDomain v0
+                                    body = Core.lambdaBody v0
+                                in (Eithers.bind (recurse body) (\rbody -> Right (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = v,
+                                  Core.lambdaDomain = d,
+                                  Core.lambdaBody = rbody}))))
+                              Core.FunctionPrimitive v0 -> Right (Core.FunctionPrimitive v0)
+                    mapBinding =
+                            \b -> Eithers.bind (recurse (Core.bindingTerm b)) (\v -> Right (Core.Binding {
+                              Core.bindingName = (Core.bindingName b),
+                              Core.bindingTerm = v,
+                              Core.bindingType = (Core.bindingType b)}))
+                in case term of
+                  Core.TermAnnotated v0 -> Eithers.bind (recurse (Core.annotatedTermBody v0)) (\ex -> Right (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = ex,
+                    Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})))
+                  Core.TermApplication v0 -> Eithers.bind (recurse (Core.applicationFunction v0)) (\lhs -> Eithers.bind (recurse (Core.applicationArgument v0)) (\rhs -> Right (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = lhs,
+                    Core.applicationArgument = rhs}))))
+                  Core.TermEither v0 -> Eithers.bind (Eithers.either (\l -> Eithers.map (\x -> Left x) (recurse l)) (\r -> Eithers.map (\x -> Right x) (recurse r)) v0) (\re -> Right (Core.TermEither re))
+                  Core.TermFunction v0 -> Eithers.bind (forFunction v0) (\rfun -> Right (Core.TermFunction rfun))
+                  Core.TermLet v0 ->
+                    let bindings = Core.letBindings v0
+                        body = Core.letBody v0
+                    in (Eithers.bind (Eithers.mapList mapBinding bindings) (\rbindings -> Eithers.bind (recurse body) (\rbody -> Right (Core.TermLet (Core.Let {
+                      Core.letBindings = rbindings,
+                      Core.letBody = rbody})))))
+                  Core.TermList v0 -> Eithers.bind (Eithers.mapList recurse v0) (\rels -> Right (Core.TermList rels))
+                  Core.TermLiteral v0 -> Right (Core.TermLiteral v0)
+                  Core.TermMap v0 -> Eithers.bind (Eithers.mapList forPair (Maps.toList v0)) (\pairs -> Right (Core.TermMap (Maps.fromList pairs)))
+                  Core.TermMaybe v0 -> Eithers.bind (Eithers.mapMaybe recurse v0) (\rm -> Right (Core.TermMaybe rm))
+                  Core.TermPair v0 -> Eithers.bind (recurse (Pairs.first v0)) (\rfirst -> Eithers.bind (recurse (Pairs.second v0)) (\rsecond -> Right (Core.TermPair (rfirst, rsecond))))
+                  Core.TermRecord v0 ->
+                    let n = Core.recordTypeName v0
+                        fields = Core.recordFields v0
+                    in (Eithers.map (\rfields -> Core.TermRecord (Core.Record {
+                      Core.recordTypeName = n,
+                      Core.recordFields = rfields})) (Eithers.mapList forField fields))
+                  Core.TermSet v0 -> Eithers.bind (Eithers.mapList recurse (Sets.toList v0)) (\rlist -> Right (Core.TermSet (Sets.fromList rlist)))
+                  Core.TermTypeApplication v0 -> Eithers.bind (recurse (Core.typeApplicationTermBody v0)) (\t -> Right (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = t,
+                    Core.typeApplicationTermType = (Core.typeApplicationTermType v0)})))
+                  Core.TermTypeLambda v0 ->
+                    let v = Core.typeLambdaParameter v0
+                        body = Core.typeLambdaBody v0
+                    in (Eithers.bind (recurse body) (\rbody -> Right (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = v,
+                      Core.typeLambdaBody = rbody}))))
+                  Core.TermUnion v0 ->
+                    let n = Core.injectionTypeName v0
+                        field = Core.injectionField v0
+                    in (Eithers.map (\rfield -> Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = n,
+                      Core.injectionField = rfield})) (forField field))
+                  Core.TermUnit -> Right Core.TermUnit
+                  Core.TermVariable v0 -> Right (Core.TermVariable v0)
+                  Core.TermWrap v0 ->
+                    let name = Core.wrappedTermTypeName v0
+                        t = Core.wrappedTermBody v0
+                    in (Eithers.bind (recurse t) (\rt -> Right (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = name,
+                      Core.wrappedTermBody = rt}))))
+          rewrite = \cx -> \term -> f (forSubterms rewrite) cx term
+      in (rewrite cx0 term0)
+
+-- | Rewrite a term with the help of a Graph which is updated as we descend into subterms
+rewriteTermWithGraph :: ((Core.Term -> t0) -> Graph.Graph -> Core.Term -> t0) -> Graph.Graph -> Core.Term -> t0
+rewriteTermWithGraph f cx0 term0 =
+
+      let f2 =
+              \recurse -> \cx -> \term ->
+                let recurse1 = \term -> recurse cx term
+                in case term of
+                  Core.TermFunction v0 -> case v0 of
+                    Core.FunctionLambda v1 ->
+                      let cx1 = extendGraphForLambda cx v1
+                          recurse2 = \term -> recurse cx1 term
+                      in (f recurse2 cx1 term)
+                    _ -> f recurse1 cx term
+                  Core.TermLet v0 ->
+                    let cx1 = extendGraphForLet (\_ -> \_ -> Nothing) cx v0
+                        recurse2 = \term -> recurse cx1 term
+                    in (f recurse2 cx1 term)
+                  Core.TermTypeLambda v0 ->
+                    let cx1 = extendGraphForTypeLambda cx v0
+                        recurse2 = \term -> recurse cx1 term
+                    in (f recurse2 cx1 term)
+                  _ -> f recurse1 cx term
+          rewrite = \cx -> \term -> f2 rewrite cx term
+      in (rewrite cx0 term0)
+
+rewriteType :: ((Core.Type -> Core.Type) -> Core.Type -> Core.Type) -> Core.Type -> Core.Type
+rewriteType f typ0 =
+
+      let fsub =
+              \recurse -> \typ ->
+                let forField =
+                        \field -> Core.FieldType {
+                          Core.fieldTypeName = (Core.fieldTypeName field),
+                          Core.fieldTypeType = (recurse (Core.fieldTypeType field))}
+                in case typ of
+                  Core.TypeAnnotated v0 -> Core.TypeAnnotated (Core.AnnotatedType {
+                    Core.annotatedTypeBody = (recurse (Core.annotatedTypeBody v0)),
+                    Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v0)})
+                  Core.TypeApplication v0 -> Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (recurse (Core.applicationTypeFunction v0)),
+                    Core.applicationTypeArgument = (recurse (Core.applicationTypeArgument v0))})
+                  Core.TypeEither v0 -> Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (recurse (Core.eitherTypeLeft v0)),
+                    Core.eitherTypeRight = (recurse (Core.eitherTypeRight v0))})
+                  Core.TypePair v0 -> Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (recurse (Core.pairTypeFirst v0)),
+                    Core.pairTypeSecond = (recurse (Core.pairTypeSecond v0))})
+                  Core.TypeFunction v0 -> Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (recurse (Core.functionTypeDomain v0)),
+                    Core.functionTypeCodomain = (recurse (Core.functionTypeCodomain v0))})
+                  Core.TypeForall v0 -> Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.forallTypeParameter v0),
+                    Core.forallTypeBody = (recurse (Core.forallTypeBody v0))})
+                  Core.TypeList v0 -> Core.TypeList (recurse v0)
+                  Core.TypeLiteral v0 -> Core.TypeLiteral v0
+                  Core.TypeMap v0 -> Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (recurse (Core.mapTypeKeys v0)),
+                    Core.mapTypeValues = (recurse (Core.mapTypeValues v0))})
+                  Core.TypeMaybe v0 -> Core.TypeMaybe (recurse v0)
+                  Core.TypeRecord v0 -> Core.TypeRecord (Lists.map forField v0)
+                  Core.TypeSet v0 -> Core.TypeSet (recurse v0)
+                  Core.TypeUnion v0 -> Core.TypeUnion (Lists.map forField v0)
+                  Core.TypeUnit -> Core.TypeUnit
+                  Core.TypeVariable v0 -> Core.TypeVariable v0
+                  Core.TypeVoid -> Core.TypeVoid
+                  Core.TypeWrap v0 -> Core.TypeWrap (recurse v0)
+          recurse = f (fsub recurse)
+      in (recurse typ0)
+
+-- | Either-based type rewriting
+rewriteTypeM :: ((Core.Type -> Either t0 Core.Type) -> Core.Type -> Either t0 Core.Type) -> Core.Type -> Either t0 Core.Type
+rewriteTypeM f typ0 =
+
+      let fsub =
+              \recurse -> \typ -> case typ of
+                Core.TypeAnnotated v0 -> Eithers.bind (recurse (Core.annotatedTypeBody v0)) (\t -> Right (Core.TypeAnnotated (Core.AnnotatedType {
+                  Core.annotatedTypeBody = t,
+                  Core.annotatedTypeAnnotation = (Core.annotatedTypeAnnotation v0)})))
+                Core.TypeApplication v0 -> Eithers.bind (recurse (Core.applicationTypeFunction v0)) (\lhs -> Eithers.bind (recurse (Core.applicationTypeArgument v0)) (\rhs -> Right (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = lhs,
+                  Core.applicationTypeArgument = rhs}))))
+                Core.TypeEither v0 -> Eithers.bind (recurse (Core.eitherTypeLeft v0)) (\left -> Eithers.bind (recurse (Core.eitherTypeRight v0)) (\right -> Right (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = left,
+                  Core.eitherTypeRight = right}))))
+                Core.TypePair v0 -> Eithers.bind (recurse (Core.pairTypeFirst v0)) (\pairFirst -> Eithers.bind (recurse (Core.pairTypeSecond v0)) (\pairSecond -> Right (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = pairFirst,
+                  Core.pairTypeSecond = pairSecond}))))
+                Core.TypeFunction v0 -> Eithers.bind (recurse (Core.functionTypeDomain v0)) (\dom -> Eithers.bind (recurse (Core.functionTypeCodomain v0)) (\cod -> Right (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = dom,
+                  Core.functionTypeCodomain = cod}))))
+                Core.TypeForall v0 -> Eithers.bind (recurse (Core.forallTypeBody v0)) (\b -> Right (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.forallTypeParameter v0),
+                  Core.forallTypeBody = b})))
+                Core.TypeList v0 -> Eithers.bind (recurse v0) (\rt -> Right (Core.TypeList rt))
+                Core.TypeLiteral v0 -> Right (Core.TypeLiteral v0)
+                Core.TypeMap v0 -> Eithers.bind (recurse (Core.mapTypeKeys v0)) (\kt -> Eithers.bind (recurse (Core.mapTypeValues v0)) (\vt -> Right (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = kt,
+                  Core.mapTypeValues = vt}))))
+                Core.TypeMaybe v0 -> Eithers.bind (recurse v0) (\rt -> Right (Core.TypeMaybe rt))
+                Core.TypeRecord v0 ->
+                  let forField =
+                          \f -> Eithers.bind (recurse (Core.fieldTypeType f)) (\t -> Right (Core.FieldType {
+                            Core.fieldTypeName = (Core.fieldTypeName f),
+                            Core.fieldTypeType = t}))
+                  in (Eithers.bind (Eithers.mapList forField v0) (\rfields -> Right (Core.TypeRecord rfields)))
+                Core.TypeSet v0 -> Eithers.bind (recurse v0) (\rt -> Right (Core.TypeSet rt))
+                Core.TypeUnion v0 ->
+                  let forField =
+                          \f -> Eithers.bind (recurse (Core.fieldTypeType f)) (\t -> Right (Core.FieldType {
+                            Core.fieldTypeName = (Core.fieldTypeName f),
+                            Core.fieldTypeType = t}))
+                  in (Eithers.bind (Eithers.mapList forField v0) (\rfields -> Right (Core.TypeUnion rfields)))
+                Core.TypeUnit -> Right Core.TypeUnit
+                Core.TypeVariable v0 -> Right (Core.TypeVariable v0)
+                Core.TypeVoid -> Right Core.TypeVoid
+                Core.TypeWrap v0 -> Eithers.bind (recurse v0) (\t -> Right (Core.TypeWrap t))
+          recurse = f (fsub recurse)
+      in (recurse typ0)
+
+-- | Simplify terms by applying beta reduction where possible
+simplifyTerm :: Core.Term -> Core.Term
+simplifyTerm term =
+
+      let simplify =
+              \recurse -> \term ->
+                let forRhs =
+                        \rhs -> \var -> \body -> case (deannotateTerm rhs) of
+                          Core.TermVariable v0 -> simplifyTerm (substituteVariable var v0 body)
+                          _ -> term
+                    forLhs =
+                            \lhs -> \rhs ->
+                              let forFun =
+                                      \fun -> case fun of
+                                        Core.FunctionLambda v0 ->
+                                          let var = Core.lambdaParameter v0
+                                              body = Core.lambdaBody v0
+                                          in (Logic.ifElse (Sets.member var (freeVariablesInTerm body)) (forRhs rhs var body) (simplifyTerm body))
+                                        _ -> term
+                              in case (deannotateTerm lhs) of
+                                Core.TermFunction v0 -> forFun v0
+                                _ -> term
+                    forTerm =
+                            \stripped -> case stripped of
+                              Core.TermApplication v0 ->
+                                let lhs = Core.applicationFunction v0
+                                    rhs = Core.applicationArgument v0
+                                in (forLhs lhs rhs)
+                              _ -> term
+                    stripped = deannotateTerm term
+                in (recurse (forTerm stripped))
+      in (rewriteTerm simplify term)
+
+-- | Strip outer type lambda wrappers from a term, preserving type application wrappers and annotations
+stripTypeLambdas :: Core.Term -> Core.Term
+stripTypeLambdas t =
+    case t of
+      Core.TermAnnotated v0 ->
+        let subj = Core.annotatedTermBody v0
+            ann = Core.annotatedTermAnnotation v0
+        in (Core.TermAnnotated (Core.AnnotatedTerm {
+          Core.annotatedTermBody = (stripTypeLambdas subj),
+          Core.annotatedTermAnnotation = ann}))
+      Core.TermTypeLambda v0 -> stripTypeLambdas (Core.typeLambdaBody v0)
+      _ -> t
+
+-- | Substitute type variables in a type
+substituteTypeVariables :: M.Map Core.Name Core.Name -> Core.Type -> Core.Type
+substituteTypeVariables subst typ =
+
+      let replace =
+              \recurse -> \typ -> case typ of
+                Core.TypeVariable v0 -> Core.TypeVariable (Maybes.fromMaybe v0 (Maps.lookup v0 subst))
+                _ -> recurse typ
+      in (rewriteType replace typ)
+
+-- | Substitute type variables throughout a term, including in type annotations, type applications, lambda domains, and type schemes
+substituteTypeVariablesInTerm :: M.Map Core.Name Core.Name -> Core.Term -> Core.Term
+substituteTypeVariablesInTerm subst term =
+
+      let st = substituteTypeVariables subst
+          stOpt = \mt -> Maybes.map st mt
+          stScheme =
+                  \ts -> Core.TypeScheme {
+                    Core.typeSchemeVariables = (Core.typeSchemeVariables ts),
+                    Core.typeSchemeType = (st (Core.typeSchemeType ts)),
+                    Core.typeSchemeConstraints = (Core.typeSchemeConstraints ts)}
+          stSchemeOpt = \mts -> Maybes.map stScheme mts
+          replace =
+                  \recurse -> \t -> case t of
+                    Core.TermFunction v0 -> case v0 of
+                      Core.FunctionLambda v1 -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.lambdaParameter v1),
+                        Core.lambdaDomain = (stOpt (Core.lambdaDomain v1)),
+                        Core.lambdaBody = (recurse (Core.lambdaBody v1))}))
+                      _ -> recurse t
+                    Core.TermLet v0 ->
+                      let mapBinding =
+                              \b -> Core.Binding {
+                                Core.bindingName = (Core.bindingName b),
+                                Core.bindingTerm = (recurse (Core.bindingTerm b)),
+                                Core.bindingType = (stSchemeOpt (Core.bindingType b))}
+                      in (Core.TermLet (Core.Let {
+                        Core.letBindings = (Lists.map mapBinding (Core.letBindings v0)),
+                        Core.letBody = (recurse (Core.letBody v0))}))
+                    Core.TermTypeApplication v0 -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (recurse (Core.typeApplicationTermBody v0)),
+                      Core.typeApplicationTermType = (st (Core.typeApplicationTermType v0))})
+                    Core.TermTypeLambda v0 -> Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Maybes.fromMaybe (Core.typeLambdaParameter v0) (Maps.lookup (Core.typeLambdaParameter v0) subst)),
+                      Core.typeLambdaBody = (recurse (Core.typeLambdaBody v0))})
+                    Core.TermAnnotated v0 -> Core.TermAnnotated (Core.AnnotatedTerm {
+                      Core.annotatedTermBody = (recurse (Core.annotatedTermBody v0)),
+                      Core.annotatedTermAnnotation = (Core.annotatedTermAnnotation v0)})
+                    _ -> recurse t
+      in (rewriteTerm replace term)
+
+-- | Substitute one variable for another in a term
+substituteVariable :: Core.Name -> Core.Name -> Core.Term -> Core.Term
+substituteVariable from to term =
+
+      let replace =
+              \recurse -> \term -> case term of
+                Core.TermVariable v0 -> Core.TermVariable (Logic.ifElse (Equality.equal v0 from) to v0)
+                Core.TermFunction v0 -> case v0 of
+                  Core.FunctionLambda v1 -> Logic.ifElse (Equality.equal (Core.lambdaParameter v1) from) term (recurse term)
+                  _ -> recurse term
+                _ -> recurse term
+      in (rewriteTerm replace term)
+
+-- | Substitute multiple variables in a term
+substituteVariables :: M.Map Core.Name Core.Name -> Core.Term -> Core.Term
+substituteVariables subst term =
+
+      let replace =
+              \recurse -> \term -> case term of
+                Core.TermVariable v0 -> Core.TermVariable (Maybes.fromMaybe v0 (Maps.lookup v0 subst))
+                Core.TermFunction v0 -> case v0 of
+                  Core.FunctionLambda v1 -> Maybes.maybe (recurse term) (\_ -> term) (Maps.lookup (Core.lambdaParameter v1) subst)
+                  _ -> recurse term
+                _ -> recurse term
+      in (rewriteTerm replace term)
+
+-- | Find the children of a given term
+subterms :: Core.Term -> [Core.Term]
+subterms x =
+    case x of
+      Core.TermAnnotated v0 -> [
+        Core.annotatedTermBody v0]
+      Core.TermApplication v0 -> [
+        Core.applicationFunction v0,
+        (Core.applicationArgument v0)]
+      Core.TermEither v0 -> Eithers.either (\l -> [
+        l]) (\r -> [
+        r]) v0
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionElimination v1 -> case v1 of
+          Core.EliminationUnion v2 -> Lists.concat2 (Maybes.maybe [] (\t -> [
+            t]) (Core.caseStatementDefault v2)) (Lists.map Core.fieldTerm (Core.caseStatementCases v2))
+          _ -> []
+        Core.FunctionLambda v1 -> [
+          Core.lambdaBody v1]
+        _ -> []
+      Core.TermLet v0 -> Lists.cons (Core.letBody v0) (Lists.map Core.bindingTerm (Core.letBindings v0))
+      Core.TermList v0 -> v0
+      Core.TermLiteral _ -> []
+      Core.TermMap v0 -> Lists.concat (Lists.map (\p -> [
+        Pairs.first p,
+        (Pairs.second p)]) (Maps.toList v0))
+      Core.TermMaybe v0 -> Maybes.maybe [] (\t -> [
+        t]) v0
+      Core.TermPair v0 -> [
+        Pairs.first v0,
+        (Pairs.second v0)]
+      Core.TermRecord v0 -> Lists.map Core.fieldTerm (Core.recordFields v0)
+      Core.TermSet v0 -> Sets.toList v0
+      Core.TermTypeApplication v0 -> [
+        Core.typeApplicationTermBody v0]
+      Core.TermTypeLambda v0 -> [
+        Core.typeLambdaBody v0]
+      Core.TermUnion v0 -> [
+        Core.fieldTerm (Core.injectionField v0)]
+      Core.TermUnit -> []
+      Core.TermVariable _ -> []
+      Core.TermWrap v0 -> [
+        Core.wrappedTermBody v0]
+
+-- | Find the children of a given term
+subtermsWithSteps :: Core.Term -> [(Paths.SubtermStep, Core.Term)]
+subtermsWithSteps x =
+    case x of
+      Core.TermAnnotated v0 -> [
+        (Paths.SubtermStepAnnotatedBody, (Core.annotatedTermBody v0))]
+      Core.TermApplication v0 -> [
+        (Paths.SubtermStepApplicationFunction, (Core.applicationFunction v0)),
+        (Paths.SubtermStepApplicationArgument, (Core.applicationArgument v0))]
+      Core.TermEither _ -> []
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionElimination v1 -> case v1 of
+          Core.EliminationUnion v2 -> Lists.concat2 (Maybes.maybe [] (\t -> [
+            (Paths.SubtermStepUnionCasesDefault, t)]) (Core.caseStatementDefault v2)) (Lists.map (\f -> (Paths.SubtermStepUnionCasesBranch (Core.fieldName f), (Core.fieldTerm f))) (Core.caseStatementCases v2))
+          _ -> []
+        Core.FunctionLambda v1 -> [
+          (Paths.SubtermStepLambdaBody, (Core.lambdaBody v1))]
+        _ -> []
+      Core.TermLet v0 -> Lists.cons (Paths.SubtermStepLetBody, (Core.letBody v0)) (Lists.map (\b -> (Paths.SubtermStepLetBinding (Core.bindingName b), (Core.bindingTerm b))) (Core.letBindings v0))
+      Core.TermList v0 -> Lists.map (\e -> (Paths.SubtermStepListElement 0, e)) v0
+      Core.TermLiteral _ -> []
+      Core.TermMap v0 -> Lists.concat (Lists.map (\p -> [
+        (Paths.SubtermStepMapKey 0, (Pairs.first p)),
+        (Paths.SubtermStepMapValue 0, (Pairs.second p))]) (Maps.toList v0))
+      Core.TermMaybe v0 -> Maybes.maybe [] (\t -> [
+        (Paths.SubtermStepMaybeTerm, t)]) v0
+      Core.TermPair _ -> []
+      Core.TermRecord v0 -> Lists.map (\f -> (Paths.SubtermStepRecordField (Core.fieldName f), (Core.fieldTerm f))) (Core.recordFields v0)
+      Core.TermSet v0 -> Lists.map (\e -> (Paths.SubtermStepListElement 0, e)) (Sets.toList v0)
+      Core.TermTypeApplication v0 -> [
+        (Paths.SubtermStepTypeApplicationTerm, (Core.typeApplicationTermBody v0))]
+      Core.TermTypeLambda v0 -> [
+        (Paths.SubtermStepTypeLambdaBody, (Core.typeLambdaBody v0))]
+      Core.TermUnion v0 -> [
+        (Paths.SubtermStepInjectionTerm, (Core.fieldTerm (Core.injectionField v0)))]
+      Core.TermUnit -> []
+      Core.TermVariable _ -> []
+      Core.TermWrap v0 -> [
+        (Paths.SubtermStepWrappedTerm, (Core.wrappedTermBody v0))]
+
+-- | Find the children of a given type expression
+subtypes :: Core.Type -> [Core.Type]
+subtypes x =
+    case x of
+      Core.TypeAnnotated v0 -> [
+        Core.annotatedTypeBody v0]
+      Core.TypeApplication v0 -> [
+        Core.applicationTypeFunction v0,
+        (Core.applicationTypeArgument v0)]
+      Core.TypeEither v0 -> [
+        Core.eitherTypeLeft v0,
+        (Core.eitherTypeRight v0)]
+      Core.TypePair v0 -> [
+        Core.pairTypeFirst v0,
+        (Core.pairTypeSecond v0)]
+      Core.TypeFunction v0 -> [
+        Core.functionTypeDomain v0,
+        (Core.functionTypeCodomain v0)]
+      Core.TypeForall v0 -> [
+        Core.forallTypeBody v0]
+      Core.TypeList v0 -> [
+        v0]
+      Core.TypeLiteral _ -> []
+      Core.TypeMap v0 -> [
+        Core.mapTypeKeys v0,
+        (Core.mapTypeValues v0)]
+      Core.TypeMaybe v0 -> [
+        v0]
+      Core.TypeRecord v0 -> Lists.map Core.fieldTypeType v0
+      Core.TypeSet v0 -> [
+        v0]
+      Core.TypeUnion v0 -> Lists.map Core.fieldTypeType v0
+      Core.TypeUnit -> []
+      Core.TypeVariable _ -> []
+      Core.TypeVoid -> []
+      Core.TypeWrap v0 -> [
+        v0]
+
+-- | Note: does not distinguish between bound and free variables; use freeVariablesInTerm for that
+termDependencyNames :: Bool -> Bool -> Bool -> Core.Term -> S.Set Core.Name
+termDependencyNames binds withPrims withNoms term0 =
+
+      let addNames =
+              \names -> \term ->
+                let nominal = \name -> Logic.ifElse withNoms (Sets.insert name names) names
+                    prim = \name -> Logic.ifElse withPrims (Sets.insert name names) names
+                    var = \name -> Logic.ifElse binds (Sets.insert name names) names
+                in case term of
+                  Core.TermFunction v0 -> case v0 of
+                    Core.FunctionPrimitive v1 -> prim v1
+                    Core.FunctionElimination v1 -> case v1 of
+                      Core.EliminationRecord v2 -> nominal (Core.projectionTypeName v2)
+                      Core.EliminationUnion v2 -> nominal (Core.caseStatementTypeName v2)
+                      Core.EliminationWrap v2 -> nominal v2
+                    _ -> names
+                  Core.TermRecord v0 -> nominal (Core.recordTypeName v0)
+                  Core.TermUnion v0 -> nominal (Core.injectionTypeName v0)
+                  Core.TermVariable v0 -> var v0
+                  Core.TermWrap v0 -> nominal (Core.wrappedTermTypeName v0)
+                  _ -> names
+      in (foldOverTerm Coders.TraversalOrderPre addNames Sets.empty term0)
+
+-- | Generate short names from a list of fully qualified names
+toShortNames :: [Core.Name] -> M.Map Core.Name Core.Name
+toShortNames original =
+
+      let addName =
+              \acc -> \name ->
+                let local = Names.localNameOf name
+                    group = Maybes.fromMaybe Sets.empty (Maps.lookup local acc)
+                in (Maps.insert local (Sets.insert name group) acc)
+          groupNamesByLocal = \names -> Lists.foldl addName Maps.empty names
+          groups = groupNamesByLocal original
+          renameGroup =
+                  \localNames ->
+                    let local = Pairs.first localNames
+                        names = Pairs.second localNames
+                        rangeFrom = \start -> Lists.cons start (rangeFrom (Math.add start 1))
+                        rename =
+                                \name -> \i -> (name, (Core.Name (Logic.ifElse (Equality.gt i 1) (Strings.cat2 local (Literals.showInt32 i)) local)))
+                    in (Lists.zipWith rename (Sets.toList names) (rangeFrom 1))
+      in (Maps.fromList (Lists.concat (Lists.map renameGroup (Maps.toList groups))))
+
+-- | Topological sort of connected components, in terms of dependencies between variable/term binding pairs
+topologicalSortBindingMap :: M.Map Core.Name Core.Term -> [[(Core.Name, Core.Term)]]
+topologicalSortBindingMap bindingMap =
+
+      let bindings = Maps.toList bindingMap
+          keys = Sets.fromList (Lists.map Pairs.first bindings)
+          hasTypeAnnotation =
+                  \term -> case term of
+                    Core.TermAnnotated v0 -> hasTypeAnnotation (Core.annotatedTermBody v0)
+                    _ -> False
+          depsOf =
+                  \nameAndTerm ->
+                    let name = Pairs.first nameAndTerm
+                        term = Pairs.second nameAndTerm
+                    in (name, (Logic.ifElse (hasTypeAnnotation term) [] (Sets.toList (Sets.intersection keys (freeVariablesInTerm term)))))
+          toPair =
+                  \name -> (name, (Maybes.fromMaybe (Core.TermLiteral (Core.LiteralString "Impossible!")) (Maps.lookup name bindingMap)))
+      in (Lists.map (Lists.map toPair) (Sorting.topologicalSortComponents (Lists.map depsOf bindings)))
+
+-- | Topological sort of elements based on their dependencies
+topologicalSortBindings :: [Core.Binding] -> Either [[Core.Name]] [Core.Name]
+topologicalSortBindings els =
+
+      let adjlist = \e -> (Core.bindingName e, (Sets.toList (termDependencyNames False True True (Core.bindingTerm e))))
+      in (Sorting.topologicalSort (Lists.map adjlist els))
+
+typeDependencyNames :: Bool -> Core.Type -> S.Set Core.Name
+typeDependencyNames withSchema typ =
+    Logic.ifElse withSchema (Sets.union (freeVariablesInType typ) (typeNamesInType typ)) (freeVariablesInType typ)
+
+typeNamesInType :: Ord t0 => (Core.Type -> S.Set t0)
+typeNamesInType typ0 =
+
+      let addNames = \names -> \typ -> names
+      in (foldOverType Coders.TraversalOrderPre addNames Sets.empty typ0)
+
+-- | Convert a type scheme to a forall type
+typeSchemeToFType :: Core.TypeScheme -> Core.Type
+typeSchemeToFType ts =
+
+      let vars = Core.typeSchemeVariables ts
+          body = Core.typeSchemeType ts
+      in (Lists.foldl (\t -> \v -> Core.TypeForall (Core.ForallType {
+        Core.forallTypeParameter = v,
+        Core.forallTypeBody = t})) body (Lists.reverse vars))
+
+-- | Rename all shadowed variables (both lambda parameters and let-bound variables that shadow lambda parameters) in a term.
+unshadowVariables :: Core.Term -> Core.Term
+unshadowVariables term0 =
+
+      let freshName =
+              \base -> \i -> \m ->
+                let candidate = Core.Name (Strings.cat2 (Core.unName base) (Literals.showInt32 i))
+                in (Logic.ifElse (Maps.member candidate m) (freshName base (Math.add i 1) m) candidate)
+          f =
+                  \recurse -> \m -> \term -> case term of
+                    Core.TermFunction v0 -> case v0 of
+                      Core.FunctionLambda v1 ->
+                        let v = Core.lambdaParameter v1
+                            domain = Core.lambdaDomain v1
+                            body = Core.lambdaBody v1
+                        in (Logic.ifElse (Maps.member v m) (
+                          let v2 = freshName v 2 m
+                              m2 = Maps.insert v v2 (Maps.insert v2 v2 m)
+                          in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = v2,
+                            Core.lambdaDomain = domain,
+                            Core.lambdaBody = (f recurse m2 body)})))) (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = v,
+                          Core.lambdaDomain = domain,
+                          Core.lambdaBody = (f recurse (Maps.insert v v m) body)}))))
+                      _ -> recurse m term
+                    Core.TermLet v0 ->
+                      let m2 =
+                              Lists.foldl (\acc -> \b ->
+                                let bname = Core.bindingName b
+                                in (Logic.ifElse (Maps.member bname acc) acc (Maps.insert bname bname acc))) m (Core.letBindings v0)
+                      in (recurse m2 term)
+                    Core.TermVariable v0 -> Core.TermVariable (Maybes.maybe v0 (\renamed -> renamed) (Maps.lookup v0 m))
+                    _ -> recurse m term
+      in (rewriteTermWithContext f Maps.empty term0)
diff --git a/src/gen-main/haskell/Hydra/Schemas.hs b/src/gen-main/haskell/Hydra/Schemas.hs
--- a/src/gen-main/haskell/Hydra/Schemas.hs
+++ b/src/gen-main/haskell/Hydra/Schemas.hs
@@ -6,15 +6,16 @@
 
 import qualified Hydra.Annotations as Annotations
 import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Constants as Constants
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
 import qualified Hydra.Encode.Core as Core__
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Literals as Literals
 import qualified Hydra.Lib.Logic as Logic
@@ -25,7 +26,6 @@
 import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
 import qualified Hydra.Module as Module
-import qualified Hydra.Monads as Monads
 import qualified Hydra.Names as Names
 import qualified Hydra.Reflect as Reflect
 import qualified Hydra.Rewriting as Rewriting
@@ -33,7 +33,6 @@
 import qualified Hydra.Sorting as Sorting
 import qualified Hydra.Substitution as Substitution
 import qualified Hydra.Typing as Typing
-import qualified Hydra.Util as Util
 import qualified Hydra.Variants as Variants
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -43,523 +42,576 @@
 import qualified Data.Set as S
 
 -- | Add names to existing namespaces mapping
-addNamesToNamespaces :: ((Module.Namespace -> t0) -> S.Set Core.Name -> Module.Namespaces t0 -> Module.Namespaces t0)
-addNamesToNamespaces encodeNamespace names ns0 =  
-  let nss = (Sets.fromList (Maybes.cat (Lists.map Names.namespaceOf (Sets.toList names))))
-  in  
-    let toPair = (\ns -> (ns, (encodeNamespace ns)))
-    in Module.Namespaces {
-      Module.namespacesFocus = (Module.namespacesFocus ns0),
-      Module.namespacesMapping = (Maps.union (Module.namespacesMapping ns0) (Maps.fromList (Lists.map toPair (Sets.toList nss))))}
+addNamesToNamespaces :: (Module.Namespace -> t0) -> S.Set Core.Name -> Module.Namespaces t0 -> Module.Namespaces t0
+addNamesToNamespaces encodeNamespace names ns0 =
 
+      let nss = Sets.fromList (Maybes.cat (Lists.map Names.namespaceOf (Sets.toList names)))
+          toPair = \ns -> (ns, (encodeNamespace ns))
+      in Module.Namespaces {
+        Module.namespacesFocus = (Module.namespacesFocus ns0),
+        Module.namespacesMapping = (Maps.union (Module.namespacesMapping ns0) (Maps.fromList (Lists.map toPair (Sets.toList nss))))}
+
 -- | Get dependency namespaces from definitions
-definitionDependencyNamespaces :: ([Module.Definition] -> S.Set Module.Namespace)
-definitionDependencyNamespaces defs =  
-  let defNames = (\def -> (\x -> case x of
-          Module.DefinitionType v1 -> (Rewriting.typeDependencyNames True (Module.typeDefinitionType v1))
-          Module.DefinitionTerm v1 -> (Rewriting.termDependencyNames True True True (Module.termDefinitionTerm v1))) def)
-  in  
-    let allNames = (Sets.unions (Lists.map defNames defs))
-    in (Sets.fromList (Maybes.cat (Lists.map Names.namespaceOf (Sets.toList allNames))))
+definitionDependencyNamespaces :: [Module.Definition] -> S.Set Module.Namespace
+definitionDependencyNamespaces defs =
 
--- | Find dependency namespaces in all of a set of terms
-dependencyNamespaces :: (Bool -> Bool -> Bool -> Bool -> [Core.Binding] -> Compute.Flow Graph.Graph (S.Set Module.Namespace))
-dependencyNamespaces binds withPrims withNoms withSchema els = (Flows.bind Monads.getState (\cx ->  
-  let depNames = (\el ->  
-          let term = (Core.bindingTerm el)
-          in  
-            let deannotatedTerm = (Rewriting.deannotateTerm term)
-            in  
-              let dataNames = (Rewriting.termDependencyNames binds withPrims withNoms term)
-              in  
-                let schemaNames = (Logic.ifElse withSchema (Maybes.maybe Sets.empty (\ts -> Rewriting.typeDependencyNames True (Core.typeSchemeType ts)) (Core.bindingType el)) Sets.empty)
-                in (Logic.ifElse (isEncodedType deannotatedTerm) (Flows.bind (Monads.withTrace "dependency namespace (type)" (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx term))) (\typ -> Flows.pure (Sets.unions [
+      let defNames =
+              \def -> case def of
+                Module.DefinitionType v0 -> Rewriting.typeDependencyNames True (Module.typeDefinitionType v0)
+                Module.DefinitionTerm v0 -> Rewriting.termDependencyNames True True True (Module.termDefinitionTerm v0)
+          allNames = Sets.unions (Lists.map defNames defs)
+      in (Sets.fromList (Maybes.cat (Lists.map Names.namespaceOf (Sets.toList allNames))))
+
+-- | Find dependency namespaces in all of a set of terms (Either version)
+dependencyNamespaces :: Context.Context -> Graph.Graph -> Bool -> Bool -> Bool -> Bool -> [Core.Binding] -> Either (Context.InContext Errors.Error) (S.Set Module.Namespace)
+dependencyNamespaces cx graph binds withPrims withNoms withSchema els =
+
+      let depNames =
+              \el ->
+                let term = Core.bindingTerm el
+                    deannotatedTerm = Rewriting.deannotateTerm term
+                    dataNames = Rewriting.termDependencyNames binds withPrims withNoms term
+                    schemaNames =
+                            Logic.ifElse withSchema (Maybes.maybe Sets.empty (\ts -> Rewriting.typeDependencyNames True (Core.typeSchemeType ts)) (Core.bindingType el)) Sets.empty
+                in (Logic.ifElse (isEncodedType deannotatedTerm) (Eithers.map (\typ -> Sets.unions [
                   dataNames,
                   schemaNames,
-                  (Rewriting.typeDependencyNames True typ)]))) (Logic.ifElse (isEncodedTerm deannotatedTerm) (Flows.bind (Monads.withTrace "dependency namespace (term)" (Monads.eitherToFlow Util.unDecodingError (Core_.term cx term))) (\decodedTerm -> Flows.pure (Sets.unions [
+                  (Rewriting.typeDependencyNames True typ)]) (Eithers.bimap (\_wc_e -> Context.InContext {
+                  Context.inContextObject = _wc_e,
+                  Context.inContextContext = Context.Context {
+                    Context.contextTrace = (Lists.cons "dependency namespace (type)" (Context.contextTrace cx)),
+                    Context.contextMessages = (Context.contextMessages cx),
+                    Context.contextOther = (Context.contextOther cx)}}) (\_wc_a -> _wc_a) (Eithers.bimap (\_e -> Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError _e))) (\_a -> _a) (Core_.type_ graph term)))) (Logic.ifElse (isEncodedTerm deannotatedTerm) (Eithers.map (\decodedTerm -> Sets.unions [
                   dataNames,
                   schemaNames,
-                  (Rewriting.termDependencyNames binds withPrims withNoms decodedTerm)]))) (Flows.pure (Sets.unions [
+                  (Rewriting.termDependencyNames binds withPrims withNoms decodedTerm)]) (Eithers.bimap (\_wc_e -> Context.InContext {
+                  Context.inContextObject = _wc_e,
+                  Context.inContextContext = Context.Context {
+                    Context.contextTrace = (Lists.cons "dependency namespace (term)" (Context.contextTrace cx)),
+                    Context.contextMessages = (Context.contextMessages cx),
+                    Context.contextOther = (Context.contextOther cx)}}) (\_wc_a -> _wc_a) (Eithers.bimap (\_e -> Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError _e))) (\_a -> _a) (Core_.term graph term)))) (Right (Sets.unions [
                   dataNames,
-                  schemaNames])))))
-  in (Flows.bind (Flows.mapList depNames els) (\namesList -> Flows.pure (Sets.fromList (Maybes.cat (Lists.map Names.namespaceOf (Sets.toList (Sets.delete Constants.placeholderName (Sets.unions namesList))))))))))
+                  schemaNames]))))
+      in (Eithers.map (\namesList -> Sets.fromList (Maybes.cat (Lists.map Names.namespaceOf (Sets.toList (Sets.unions namesList))))) (Eithers.mapList depNames els))
 
--- | Dereference a type name to get the actual type
-dereferenceType :: (Core.Name -> Compute.Flow Graph.Graph (Maybe Core.Type))
-dereferenceType name = (Flows.bind Monads.getState (\cx -> Flows.bind (Lexical.dereferenceElement name) (\mel -> Maybes.maybe (Flows.pure Nothing) (\el -> Flows.map Maybes.pure (Monads.withTrace "dereference type" (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el))))) mel)))
+-- | Dereference a type name to get the actual type (Either version)
+dereferenceType :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) (Maybe Core.Type)
+dereferenceType cx graph name =
 
+      let mel = Lexical.dereferenceElement graph name
+      in (Maybes.maybe (Right Nothing) (\el -> Eithers.map Maybes.pure (Eithers.bimap (\_wc_e -> Context.InContext {
+        Context.inContextObject = _wc_e,
+        Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Eithers.bimap (\_e -> Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError _e))) (\_a -> _a) (Core_.type_ graph (Core.bindingTerm el))))) mel)
+
 -- | Convert an element to a typed term
-elementAsTypeApplicationTerm :: (Core.Binding -> Compute.Flow t0 Core.TypeApplicationTerm)
-elementAsTypeApplicationTerm el = (Maybes.maybe (Flows.fail "missing element type") (\ts -> Flows.pure (Core.TypeApplicationTerm {
-  Core.typeApplicationTermBody = (Core.bindingTerm el),
-  Core.typeApplicationTermType = (Core.typeSchemeType ts)})) (Core.bindingType el))
+elementAsTypeApplicationTerm :: Context.Context -> Core.Binding -> Either (Context.InContext Errors.Error) Core.TypeApplicationTerm
+elementAsTypeApplicationTerm cx el =
+    Maybes.maybe (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError "missing element type")),
+      Context.inContextContext = cx})) (\ts -> Right (Core.TypeApplicationTerm {
+      Core.typeApplicationTermBody = (Core.bindingTerm el),
+      Core.typeApplicationTermType = (Core.typeSchemeType ts)})) (Core.bindingType el)
 
 -- | Get elements with their dependencies
-elementsWithDependencies :: ([Core.Binding] -> Compute.Flow Graph.Graph [Core.Binding])
-elementsWithDependencies original =  
-  let depNames = (\el -> Sets.toList (Rewriting.termDependencyNames True False False (Core.bindingTerm el)))
-  in  
-    let allDepNames = (Lists.nub (Lists.concat2 (Lists.map Core.bindingName original) (Lists.concat (Lists.map depNames original))))
-    in (Flows.mapList Lexical.requireElement allDepNames)
+elementsWithDependencies :: Context.Context -> Graph.Graph -> [Core.Binding] -> Either (Context.InContext Errors.Error) [Core.Binding]
+elementsWithDependencies cx graph original =
 
--- | Extend a type context by descending into a System F lambda body
-extendTypeContextForLambda :: (Typing.TypeContext -> Core.Lambda -> Typing.TypeContext)
-extendTypeContextForLambda tcontext lam =  
-  let var = (Core.lambdaParameter lam)
-  in Typing.TypeContext {
-    Typing.typeContextTypes = (Maybes.maybe (Typing.typeContextTypes tcontext) (\dom -> Maps.insert var dom (Typing.typeContextTypes tcontext)) (Core.lambdaDomain lam)),
-    Typing.typeContextMetadata = (Maps.delete var (Typing.typeContextMetadata tcontext)),
-    Typing.typeContextTypeVariables = (Typing.typeContextTypeVariables tcontext),
-    Typing.typeContextLambdaVariables = (Sets.insert var (Typing.typeContextLambdaVariables tcontext)),
-    Typing.typeContextLetVariables = (Sets.delete var (Typing.typeContextLetVariables tcontext)),
-    Typing.typeContextInferenceContext = (Typing.typeContextInferenceContext tcontext)}
+      let depNames = \el -> Sets.toList (Rewriting.termDependencyNames True False False (Core.bindingTerm el))
+          allDepNames = Lists.nub (Lists.concat2 (Lists.map Core.bindingName original) (Lists.concat (Lists.map depNames original)))
+      in (Eithers.mapList (\name -> Lexical.requireElement cx graph name) allDepNames)
 
--- | Extend a type context by descending into a let body
-extendTypeContextForLet :: ((Typing.TypeContext -> Core.Binding -> Maybe Core.Term) -> Typing.TypeContext -> Core.Let -> Typing.TypeContext)
-extendTypeContextForLet forBinding tcontext letrec =  
-  let bindings = (Core.letBindings letrec)
-  in Typing.TypeContext {
-    Typing.typeContextTypes = (Maps.union (Maps.fromList (Maybes.cat (Lists.map (\b -> Maybes.map (\ts -> (Core.bindingName b, (typeSchemeToFType ts))) (Core.bindingType b)) bindings))) (Typing.typeContextTypes tcontext)),
-    Typing.typeContextMetadata = (Lists.foldl (\m -> \b -> Maybes.maybe (Maps.delete (Core.bindingName b) m) (\t -> Maps.insert (Core.bindingName b) t m) (forBinding tcontext b)) (Typing.typeContextMetadata tcontext) bindings),
-    Typing.typeContextTypeVariables = (Typing.typeContextTypeVariables tcontext),
-    Typing.typeContextLambdaVariables = (Lists.foldl (\s -> \b -> Sets.delete (Core.bindingName b) s) (Typing.typeContextLambdaVariables tcontext) bindings),
-    Typing.typeContextLetVariables = (Lists.foldl (\s -> \b -> Sets.insert (Core.bindingName b) s) (Typing.typeContextLetVariables tcontext) bindings),
-    Typing.typeContextInferenceContext = (Typing.typeContextInferenceContext tcontext)}
+-- | Test whether a given System F type is polymorphic (i.e., a forall type)
+fTypeIsPolymorphic :: Core.Type -> Bool
+fTypeIsPolymorphic typ =
+    case typ of
+      Core.TypeAnnotated v0 -> fTypeIsPolymorphic (Core.annotatedTypeBody v0)
+      Core.TypeForall _ -> True
+      _ -> False
 
--- | Extend a type context by descending into a System F type lambda body
-extendTypeContextForTypeLambda :: (Typing.TypeContext -> Core.TypeLambda -> Typing.TypeContext)
-extendTypeContextForTypeLambda tcontext tlam =  
-  let name = (Core.typeLambdaParameter tlam)
-  in Typing.TypeContext {
-    Typing.typeContextTypes = (Typing.typeContextTypes tcontext),
-    Typing.typeContextMetadata = (Typing.typeContextMetadata tcontext),
-    Typing.typeContextTypeVariables = (Sets.insert name (Typing.typeContextTypeVariables tcontext)),
-    Typing.typeContextLambdaVariables = (Typing.typeContextLambdaVariables tcontext),
-    Typing.typeContextLetVariables = (Typing.typeContextLetVariables tcontext),
-    Typing.typeContextInferenceContext = (Typing.typeContextInferenceContext tcontext)}
+fieldMap :: [Core.Field] -> M.Map Core.Name Core.Term
+fieldMap fields =
 
-fieldMap :: ([Core.Field] -> M.Map Core.Name Core.Term)
-fieldMap fields =  
-  let toPair = (\f -> (Core.fieldName f, (Core.fieldTerm f)))
-  in (Maps.fromList (Lists.map toPair fields))
+      let toPair = \f -> (Core.fieldName f, (Core.fieldTerm f))
+      in (Maps.fromList (Lists.map toPair fields))
 
-fieldTypeMap :: ([Core.FieldType] -> M.Map Core.Name Core.Type)
-fieldTypeMap fields =  
-  let toPair = (\f -> (Core.fieldTypeName f, (Core.fieldTypeType f)))
-  in (Maps.fromList (Lists.map toPair fields))
+fieldTypeMap :: [Core.FieldType] -> M.Map Core.Name Core.Type
+fieldTypeMap fields =
 
--- | Get field types from a record or union type
-fieldTypes :: (Core.Type -> Compute.Flow Graph.Graph (M.Map Core.Name Core.Type))
-fieldTypes t = (Flows.bind Monads.getState (\cx ->  
-  let toMap = (\fields -> Maps.fromList (Lists.map (\ft -> (Core.fieldTypeName ft, (Core.fieldTypeType ft))) fields))
-  in ((\x -> case x of
-    Core.TypeForall v1 -> (fieldTypes (Core.forallTypeBody v1))
-    Core.TypeRecord v1 -> (Flows.pure (toMap (Core.rowTypeFields v1)))
-    Core.TypeUnion v1 -> (Flows.pure (toMap (Core.rowTypeFields v1)))
-    Core.TypeVariable v1 -> (Monads.withTrace (Strings.cat2 "field types of " (Core.unName v1)) (Flows.bind (Lexical.requireElement v1) (\el -> Flows.bind (Monads.withTrace "field types" (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el)))) fieldTypes)))
-    _ -> (Monads.unexpected "record or union type" (Core___.type_ t))) (Rewriting.deannotateType t))))
+      let toPair = \f -> (Core.fieldTypeName f, (Core.fieldTypeType f))
+      in (Maps.fromList (Lists.map toPair fields))
 
+-- | Get field types from a record or union type (Either version)
+fieldTypes :: Context.Context -> Graph.Graph -> Core.Type -> Either (Context.InContext Errors.Error) (M.Map Core.Name Core.Type)
+fieldTypes cx graph t =
+
+      let toMap = \fields -> Maps.fromList (Lists.map (\ft -> (Core.fieldTypeName ft, (Core.fieldTypeType ft))) fields)
+      in case (Rewriting.deannotateType t) of
+        Core.TypeForall v0 -> fieldTypes cx graph (Core.forallTypeBody v0)
+        Core.TypeRecord v0 -> Right (toMap v0)
+        Core.TypeUnion v0 -> Right (toMap v0)
+        Core.TypeVariable v0 -> Maybes.maybe (Eithers.bind (Lexical.requireElement cx graph v0) (\el -> Eithers.bind (Eithers.bimap (\_wc_e -> Context.InContext {
+          Context.inContextObject = _wc_e,
+          Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Eithers.bimap (\_e -> Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError _e))) (\_a -> _a) (Core_.type_ graph (Core.bindingTerm el)))) (\decodedType -> fieldTypes cx graph decodedType))) (\ts -> fieldTypes cx graph (Core.typeSchemeType ts)) (Maps.lookup v0 (Graph.graphSchemaTypes graph))
+        _ -> Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+            "expected record or union type but found ",
+            (Core___.type_ t)]))),
+          Context.inContextContext = cx})
+
 -- | Find a field type by name in a list of field types
-findFieldType :: (Core.Name -> [Core.FieldType] -> Compute.Flow t0 Core.Type)
-findFieldType fname fields =  
-  let matchingFields = (Lists.filter (\ft -> Equality.equal (Core.unName (Core.fieldTypeName ft)) (Core.unName fname)) fields)
-  in (Logic.ifElse (Lists.null matchingFields) (Flows.fail (Strings.cat2 "No such field: " (Core.unName fname))) (Logic.ifElse (Equality.equal (Lists.length matchingFields) 1) (Flows.pure (Core.fieldTypeType (Lists.head matchingFields))) (Flows.fail (Strings.cat2 "Multiple fields named " (Core.unName fname)))))
+findFieldType :: Context.Context -> Core.Name -> [Core.FieldType] -> Either (Context.InContext Errors.Error) Core.Type
+findFieldType cx fname fields =
 
--- | Generate a fresh type variable name
-freshName :: (Compute.Flow t0 Core.Name)
-freshName = (Flows.map normalTypeVariable (Annotations.nextCount Constants.key_freshTypeVariableCount))
+      let matchingFields = Lists.filter (\ft -> Equality.equal (Core.unName (Core.fieldTypeName ft)) (Core.unName fname)) fields
+      in (Logic.ifElse (Lists.null matchingFields) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "No such field: " (Core.unName fname)))),
+        Context.inContextContext = cx})) (Logic.ifElse (Equality.equal (Lists.length matchingFields) 1) (Right (Core.fieldTypeType (Lists.head matchingFields))) (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "Multiple fields named " (Core.unName fname)))),
+        Context.inContextContext = cx}))))
 
--- | Generate multiple fresh type variable names
-freshNames :: (Int -> Compute.Flow t0 [Core.Name])
-freshNames n = (Flows.sequence (Lists.replicate n freshName))
+-- | Generate a fresh type variable name, threading Context
+freshName :: Context.Context -> (Core.Name, Context.Context)
+freshName cx =
 
--- | Test whether a given System F type is polymorphic (i.e., a forall type)
-fTypeIsPolymorphic :: (Core.Type -> Bool)
-fTypeIsPolymorphic typ = ((\x -> case x of
-  Core.TypeAnnotated v1 -> (fTypeIsPolymorphic (Core.annotatedTypeBody v1))
-  Core.TypeForall _ -> True
-  _ -> False) typ)
+      let count = Annotations.getCount Constants.key_freshTypeVariableCount cx
+      in (normalTypeVariable count, (Annotations.putCount Constants.key_freshTypeVariableCount (Math.add count 1) cx))
 
--- | Convert a forall type to a type scheme
-fTypeToTypeScheme :: (Core.Type -> Core.TypeScheme)
-fTypeToTypeScheme typ =  
-  let gatherForall = (\vars -> \typ -> (\x -> case x of
-          Core.TypeForall v1 -> (gatherForall (Lists.cons (Core.forallTypeParameter v1) vars) (Core.forallTypeBody v1))
-          _ -> Core.TypeScheme {
-            Core.typeSchemeVariables = (Lists.reverse vars),
-            Core.typeSchemeType = typ,
-            Core.typeSchemeConstraints = Nothing}) (Rewriting.deannotateType typ))
-  in (gatherForall [] typ)
+-- | Generate multiple fresh type variable names, threading Context
+freshNames :: Int -> Context.Context -> ([Core.Name], Context.Context)
+freshNames n cx =
 
+      let go =
+              \acc -> \_ ->
+                let names = Pairs.first acc
+                    cx0 = Pairs.second acc
+                    result = freshName cx0
+                    name = Pairs.first result
+                    cx1 = Pairs.second result
+                in (Lists.concat2 names (Lists.pure name), cx1)
+      in (Lists.foldl go ([], cx) (Lists.replicate n ()))
+
 -- | Fully strip a type of forall quantifiers, normalizing bound variable names for alpha-equivalence comparison
-fullyStripAndNormalizeType :: (Core.Type -> Core.Type)
-fullyStripAndNormalizeType typ =  
-  let go = (\depth -> \subst -> \t -> (\x -> case x of
-          Core.TypeForall v1 ->  
-            let oldVar = (Core.forallTypeParameter v1)
-            in  
-              let newVar = (Core.Name (Strings.cat2 "_" (Literals.showInt32 depth)))
-              in (go (Math.add depth 1) (Maps.insert oldVar newVar subst) (Core.forallTypeBody v1))
-          _ -> (subst, t)) (Rewriting.deannotateType t))
-  in  
-    let result = (go 0 Maps.empty typ)
-    in  
-      let subst = (Pairs.first result)
-      in  
-        let body = (Pairs.second result)
-        in (Rewriting.substituteTypeVariables subst body)
+fullyStripAndNormalizeType :: Core.Type -> Core.Type
+fullyStripAndNormalizeType typ =
 
+      let go =
+              \depth -> \subst -> \t -> case (Rewriting.deannotateType t) of
+                Core.TypeForall v0 ->
+                  let oldVar = Core.forallTypeParameter v0
+                      newVar = Core.Name (Strings.cat2 "_" (Literals.showInt32 depth))
+                  in (go (Math.add depth 1) (Maps.insert oldVar newVar subst) (Core.forallTypeBody v0))
+                _ -> (subst, t)
+          result = go 0 Maps.empty typ
+          subst = Pairs.first result
+          body = Pairs.second result
+      in (Rewriting.substituteTypeVariables subst body)
+
 -- | Fully strip a type of forall quantifiers
-fullyStripType :: (Core.Type -> Core.Type)
-fullyStripType typ = ((\x -> case x of
-  Core.TypeForall v1 -> (fullyStripType (Core.forallTypeBody v1))
-  _ -> typ) (Rewriting.deannotateType typ))
+fullyStripType :: Core.Type -> Core.Type
+fullyStripType typ =
+    case (Rewriting.deannotateType typ) of
+      Core.TypeForall v0 -> fullyStripType (Core.forallTypeBody v0)
+      _ -> typ
 
--- | Convert a graph to a let expression
-graphAsLet :: (Graph.Graph -> Core.Let)
-graphAsLet g = Core.Let {
-  Core.letBindings = (Graph.graphElements g),
-  Core.letBody = (Graph.graphBody g)}
+-- | Convert bindings and a body to a let expression
+graphAsLet :: [Core.Binding] -> Core.Term -> Core.Let
+graphAsLet bindings body =
+    Core.Let {
+      Core.letBindings = bindings,
+      Core.letBody = body}
 
--- | Convert a graph to a term, taking advantage of the built-in duality between graphs and terms
-graphAsTerm :: (Graph.Graph -> Core.Term)
-graphAsTerm g = (Core.TermLet (graphAsLet g))
+-- | Convert bindings and a body to a term, using let-term duality
+graphAsTerm :: [Core.Binding] -> Core.Term -> Core.Term
+graphAsTerm bindings body = Core.TermLet (graphAsLet bindings body)
 
--- | Decode a schema graph which encodes a set of named types
-graphAsTypes :: (Graph.Graph -> Compute.Flow Graph.Graph (M.Map Core.Name Core.Type))
-graphAsTypes sg = (Flows.bind Monads.getState (\cx ->  
-  let els = (Graph.graphElements sg)
-  in  
-    let toPair = (\el -> Flows.bind (Monads.withTrace (Strings.cat2 "graph as types: " (Core.unName (Core.bindingName el))) (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el)))) (\typ -> Flows.pure (Core.bindingName el, typ)))
-    in (Flows.bind (Flows.mapList toPair els) (\pairs -> Flows.pure (Maps.fromList pairs)))))
+-- | Decode a list of type-encoding bindings into a map of named types
+graphAsTypes :: Context.Context -> Graph.Graph -> [Core.Binding] -> Either (Context.InContext Errors.DecodingError) (M.Map Core.Name Core.Type)
+graphAsTypes cx graph els =
 
--- | Convert a graph to an inference context
-graphToInferenceContext :: (Graph.Graph -> Compute.Flow t0 Typing.InferenceContext)
-graphToInferenceContext graph =  
-  let schema = (Maybes.fromMaybe graph (Graph.graphSchema graph))
-  in  
-    let primTypes = (Maps.fromList (Lists.map (\p -> (Graph.primitiveName p, (Graph.primitiveType p))) (Maps.elems (Graph.graphPrimitives graph))))
-    in  
-      let varTypes = (Maps.fromList (Maybes.cat (Lists.map (\b -> Maybes.map (\ts -> (Core.bindingName b, ts)) (Core.bindingType b)) (Graph.graphElements graph))))
-      in (Flows.bind (schemaGraphToTypingEnvironment schema) (\schemaTypes -> Flows.pure (Typing.InferenceContext {
-        Typing.inferenceContextSchemaTypes = schemaTypes,
-        Typing.inferenceContextPrimitiveTypes = primTypes,
-        Typing.inferenceContextDataTypes = varTypes,
-        Typing.inferenceContextClassConstraints = Maps.empty,
-        Typing.inferenceContextDebug = False})))
+      let toPair =
+              \el -> Eithers.map (\typ -> (Core.bindingName el, typ)) (Eithers.bimap (\_wc_e -> Context.InContext {
+                Context.inContextObject = _wc_e,
+                Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Core_.type_ graph (Core.bindingTerm el)))
+      in (Eithers.map Maps.fromList (Eithers.mapList toPair els))
 
--- | Convert a graph to a type context including the graph's element types
-graphToTypeContext :: (Graph.Graph -> Compute.Flow t0 Typing.TypeContext)
-graphToTypeContext graph = (Flows.bind (graphToInferenceContext graph) (\ix ->  
-  let elementTypes = (Maps.fromList (Maybes.cat (Lists.map (\b -> Maybes.map (\ts -> (Core.bindingName b, (typeSchemeToFType ts))) (Core.bindingType b)) (Graph.graphElements graph))))
-  in (Flows.pure (Typing.TypeContext {
-    Typing.typeContextTypes = elementTypes,
-    Typing.typeContextMetadata = Maps.empty,
-    Typing.typeContextTypeVariables = Sets.empty,
-    Typing.typeContextLambdaVariables = Sets.empty,
-    Typing.typeContextLetVariables = Sets.empty,
-    Typing.typeContextInferenceContext = ix}))))
+-- | Instantiate a type by replacing all forall-bound type variables with fresh variables, threading Context
+instantiateType :: Context.Context -> Core.Type -> (Core.Type, Context.Context)
+instantiateType cx typ =
 
--- | Instantiate a type by replacing all forall-bound type variables with fresh variables
-instantiateType :: (Core.Type -> Compute.Flow t0 Core.Type)
-instantiateType typ = (Flows.bind (instantiateTypeScheme (typeToTypeScheme typ)) (\ts -> Flows.pure (typeSchemeToFType ts)))
+      let result = instantiateTypeScheme cx (typeToTypeScheme typ)
+      in (Rewriting.typeSchemeToFType (Pairs.first result), (Pairs.second result))
 
--- | Instantiate a type scheme with fresh variables
-instantiateTypeScheme :: (Core.TypeScheme -> Compute.Flow t0 Core.TypeScheme)
-instantiateTypeScheme scheme =  
-  let oldVars = (Core.typeSchemeVariables scheme)
-  in (Flows.bind (freshNames (Lists.length oldVars)) (\newVars ->  
-    let subst = (Typing.TypeSubst (Maps.fromList (Lists.zip oldVars (Lists.map (\x -> Core.TypeVariable x) newVars))))
-    in  
-      let nameSubst = (Maps.fromList (Lists.zip oldVars newVars))
-      in  
-        let renamedConstraints = (Maybes.map (\oldConstraints -> Maps.fromList (Lists.map (\kv -> (Maybes.fromMaybe (Pairs.first kv) (Maps.lookup (Pairs.first kv) nameSubst), (Pairs.second kv))) (Maps.toList oldConstraints))) (Core.typeSchemeConstraints scheme))
-        in (Flows.pure (Core.TypeScheme {
-          Core.typeSchemeVariables = newVars,
-          Core.typeSchemeType = (Substitution.substInType subst (Core.typeSchemeType scheme)),
-          Core.typeSchemeConstraints = renamedConstraints}))))
+-- | Instantiate a type scheme with fresh variables, threading Context
+instantiateTypeScheme :: Context.Context -> Core.TypeScheme -> (Core.TypeScheme, Context.Context)
+instantiateTypeScheme cx scheme =
 
+      let oldVars = Core.typeSchemeVariables scheme
+          result = freshNames (Lists.length oldVars) cx
+          newVars = Pairs.first result
+          cx2 = Pairs.second result
+          subst = Typing.TypeSubst (Maps.fromList (Lists.zip oldVars (Lists.map (\x -> Core.TypeVariable x) newVars)))
+          nameSubst = Maps.fromList (Lists.zip oldVars newVars)
+          renamedConstraints =
+                  Maybes.map (\oldConstraints -> Maps.fromList (Lists.map (\kv -> (Maybes.fromMaybe (Pairs.first kv) (Maps.lookup (Pairs.first kv) nameSubst), (Pairs.second kv))) (Maps.toList oldConstraints))) (Core.typeSchemeConstraints scheme)
+      in (Core.TypeScheme {
+        Core.typeSchemeVariables = newVars,
+        Core.typeSchemeType = (Substitution.substInType subst (Core.typeSchemeType scheme)),
+        Core.typeSchemeConstraints = renamedConstraints}, cx2)
+
 -- | Determines whether a given term is an encoded term (meta-level term)
-isEncodedTerm :: (Core.Term -> Bool)
-isEncodedTerm t = ((\x -> case x of
-  Core.TermApplication v1 -> (isEncodedTerm (Core.applicationFunction v1))
-  Core.TermUnion v1 -> (Equality.equal "hydra.core.Term" (Core.unName (Core.injectionTypeName v1)))
-  _ -> False) (Rewriting.deannotateTerm t))
+isEncodedTerm :: Core.Term -> Bool
+isEncodedTerm t =
+    case (Rewriting.deannotateTerm t) of
+      Core.TermApplication v0 -> isEncodedTerm (Core.applicationFunction v0)
+      Core.TermUnion v0 -> Equality.equal "hydra.core.Term" (Core.unName (Core.injectionTypeName v0))
+      _ -> False
 
 -- | Determines whether a given term is an encoded type
-isEncodedType :: (Core.Term -> Bool)
-isEncodedType t = ((\x -> case x of
-  Core.TermApplication v1 -> (isEncodedType (Core.applicationFunction v1))
-  Core.TermUnion v1 -> (Equality.equal "hydra.core.Type" (Core.unName (Core.injectionTypeName v1)))
-  _ -> False) (Rewriting.deannotateTerm t))
+isEncodedType :: Core.Term -> Bool
+isEncodedType t =
+    case (Rewriting.deannotateTerm t) of
+      Core.TermApplication v0 -> isEncodedType (Core.applicationFunction v0)
+      Core.TermUnion v0 -> Equality.equal "hydra.core.Type" (Core.unName (Core.injectionTypeName v0))
+      _ -> False
 
 -- | Check if a row type represents an enum (all fields are unit-typed)
-isEnumRowType :: (Core.RowType -> Bool)
-isEnumRowType rt = (Lists.foldl Logic.and True (Lists.map (\f -> isUnitType (Rewriting.deannotateType (Core.fieldTypeType f))) (Core.rowTypeFields rt)))
+isEnumRowType :: [Core.FieldType] -> Bool
+isEnumRowType rt =
+    Lists.foldl Logic.and True (Lists.map (\f -> isUnitType (Rewriting.deannotateType (Core.fieldTypeType f))) rt)
 
 -- | Check if a type is an enum type
-isEnumType :: (Core.Type -> Bool)
-isEnumType typ = ((\x -> case x of
-  Core.TypeUnion v1 -> (isEnumRowType v1)
-  _ -> False) (Rewriting.deannotateType typ))
+isEnumType :: Core.Type -> Bool
+isEnumType typ =
+    case (Rewriting.deannotateType typ) of
+      Core.TypeUnion v0 -> isEnumRowType v0
+      _ -> False
 
--- | Check if an element is serializable (no function types in dependencies)
-isSerializable :: (Core.Binding -> Compute.Flow Graph.Graph Bool)
-isSerializable el =  
-  let variants = (\typ -> Lists.map Reflect.typeVariant (Rewriting.foldOverType Coders.TraversalOrderPre (\m -> \t -> Lists.cons t m) [] typ))
-  in (Flows.map (\deps ->  
-    let allVariants = (Sets.fromList (Lists.concat (Lists.map variants (Maps.elems deps))))
-    in (Logic.not (Sets.member Variants.TypeVariantFunction allVariants))) (typeDependencies False Equality.identity (Core.bindingName el)))
+isNominalType :: Core.Type -> Bool
+isNominalType typ =
+    case (Rewriting.deannotateType typ) of
+      Core.TypeRecord _ -> True
+      Core.TypeUnion _ -> True
+      Core.TypeWrap _ -> True
+      Core.TypeForall v0 -> isNominalType (Core.forallTypeBody v0)
+      _ -> False
 
+-- | Check if an element is serializable (no function types in dependencies) (Either version)
+isSerializable :: Context.Context -> Graph.Graph -> Core.Binding -> Either (Context.InContext Errors.Error) Bool
+isSerializable cx graph el =
+
+      let variants =
+              \typ -> Lists.map Reflect.typeVariant (Rewriting.foldOverType Coders.TraversalOrderPre (\m -> \t -> Lists.cons t m) [] typ)
+      in (Eithers.map (\deps ->
+        let allVariants = Sets.fromList (Lists.concat (Lists.map variants (Maps.elems deps)))
+        in (Logic.not (Sets.member Variants.TypeVariantFunction allVariants))) (typeDependencies cx graph False Equality.identity (Core.bindingName el)))
+
+-- | Check if a type (by name) is serializable, resolving all type dependencies (Either version)
+isSerializableByName :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Bool
+isSerializableByName cx graph name =
+
+      let variants =
+              \typ -> Lists.map Reflect.typeVariant (Rewriting.foldOverType Coders.TraversalOrderPre (\m -> \t -> Lists.cons t m) [] typ)
+      in (Eithers.map (\deps ->
+        let allVariants = Sets.fromList (Lists.concat (Lists.map variants (Maps.elems deps)))
+        in (Logic.not (Sets.member Variants.TypeVariantFunction allVariants))) (typeDependencies cx graph False Equality.identity name))
+
 -- | Check if a type is serializable (no function types in the type itself)
-isSerializableType :: (Core.Type -> Bool)
-isSerializableType typ =  
-  let allVariants = (Sets.fromList (Lists.map Reflect.typeVariant (Rewriting.foldOverType Coders.TraversalOrderPre (\m -> \t -> Lists.cons t m) [] typ)))
-  in (Logic.not (Sets.member Variants.TypeVariantFunction allVariants))
+isSerializableType :: Core.Type -> Bool
+isSerializableType typ =
 
--- | Check if a type (by name) is serializable, resolving all type dependencies
-isSerializableByName :: (Core.Name -> Compute.Flow Graph.Graph Bool)
-isSerializableByName name =  
-  let variants = (\typ -> Lists.map Reflect.typeVariant (Rewriting.foldOverType Coders.TraversalOrderPre (\m -> \t -> Lists.cons t m) [] typ))
-  in (Flows.map (\deps ->  
-    let allVariants = (Sets.fromList (Lists.concat (Lists.map variants (Maps.elems deps))))
-    in (Logic.not (Sets.member Variants.TypeVariantFunction allVariants))) (typeDependencies False Equality.identity name))
+      let allVariants =
+              Sets.fromList (Lists.map Reflect.typeVariant (Rewriting.foldOverType Coders.TraversalOrderPre (\m -> \t -> Lists.cons t m) [] typ))
+      in (Logic.not (Sets.member Variants.TypeVariantFunction allVariants))
 
 -- | Check whether a type is a type (always true for non-encoded types)
-isType :: (Core.Type -> Bool)
-isType t = ((\x -> case x of
-  Core.TypeApplication v1 -> (isType (Core.applicationTypeFunction v1))
-  Core.TypeForall v1 -> (isType (Core.forallTypeBody v1))
-  Core.TypeUnion v1 -> (Equality.equal "hydra.core.Type" (Core.unName (Core.rowTypeTypeName v1)))
-  Core.TypeVariable v1 -> (Equality.equal v1 (Core.Name "hydra.core.Type"))
-  _ -> False) (Rewriting.deannotateType t))
+isType :: Core.Type -> Bool
+isType t =
+    case (Rewriting.deannotateType t) of
+      Core.TypeApplication v0 -> isType (Core.applicationTypeFunction v0)
+      Core.TypeForall v0 -> isType (Core.forallTypeBody v0)
+      Core.TypeUnion _ -> False
+      Core.TypeVariable v0 -> Equality.equal v0 (Core.Name "hydra.core.Type")
+      _ -> False
 
 -- | Check whether a term is the unit term
-isUnitTerm :: (Core.Term -> Bool)
-isUnitTerm x = case x of
-  Core.TermUnit -> True
-  _ -> False
+isUnitTerm :: Core.Term -> Bool
+isUnitTerm x =
+    case x of
+      Core.TermUnit -> True
+      _ -> False
 
 -- | Check whether a type is the unit type
-isUnitType :: (Core.Type -> Bool)
-isUnitType x = case x of
-  Core.TypeUnit -> True
-  _ -> False
+isUnitType :: Core.Type -> Bool
+isUnitType x =
+    case x of
+      Core.TypeUnit -> True
+      _ -> False
 
 -- | Check whether a module contains any binary literal values
-moduleContainsBinaryLiterals :: (Module.Module -> Bool)
-moduleContainsBinaryLiterals mod =  
-  let checkTerm = (\found -> \term -> Logic.or found ((\x -> case x of
-          Core.TermLiteral v1 -> ((\x -> case x of
-            Core.LiteralBinary _ -> True
-            _ -> False) v1)
-          _ -> False) term))
-  in  
-    let termContainsBinary = (\term -> Rewriting.foldOverTerm Coders.TraversalOrderPre checkTerm False term)
-    in (Lists.foldl (\acc -> \el -> Logic.or acc (termContainsBinary (Core.bindingTerm el))) False (Module.moduleElements mod))
+moduleContainsBinaryLiterals :: Module.Module -> Bool
+moduleContainsBinaryLiterals mod =
 
--- | Find dependency namespaces in all elements of a module, excluding the module's own namespace
-moduleDependencyNamespaces :: (Bool -> Bool -> Bool -> Bool -> Module.Module -> Compute.Flow Graph.Graph (S.Set Module.Namespace))
-moduleDependencyNamespaces binds withPrims withNoms withSchema mod = (Flows.bind (dependencyNamespaces binds withPrims withNoms withSchema (Module.moduleElements mod)) (\deps -> Flows.pure (Sets.delete (Module.moduleNamespace mod) deps)))
+      let checkTerm =
+              \found -> \term -> Logic.or found (case term of
+                Core.TermLiteral v0 -> case v0 of
+                  Core.LiteralBinary _ -> True
+                  _ -> False
+                _ -> False)
+          termContainsBinary = \term -> Rewriting.foldOverTerm Coders.TraversalOrderPre checkTerm False term
+          defTerms =
+                  Maybes.cat (Lists.map (\d -> case d of
+                    Module.DefinitionTerm v0 -> Just (Module.termDefinitionTerm v0)
+                    _ -> Nothing) (Module.moduleDefinitions mod))
+      in (Lists.foldl (\acc -> \t -> Logic.or acc (termContainsBinary t)) False defTerms)
 
+-- | Find dependency namespaces in all elements of a module, excluding the module's own namespace (Either version)
+moduleDependencyNamespaces :: Context.Context -> Graph.Graph -> Bool -> Bool -> Bool -> Bool -> Module.Module -> Either (Context.InContext Errors.Error) (S.Set Module.Namespace)
+moduleDependencyNamespaces cx graph binds withPrims withNoms withSchema mod =
+
+      let allBindings =
+              Maybes.cat (Lists.map (\d -> case d of
+                Module.DefinitionType v0 -> Just (Annotations.typeElement (Module.typeDefinitionName v0) (Module.typeDefinitionType v0))
+                Module.DefinitionTerm v0 -> Just (Core.Binding {
+                  Core.bindingName = (Module.termDefinitionName v0),
+                  Core.bindingTerm = (Module.termDefinitionTerm v0),
+                  Core.bindingType = (Module.termDefinitionType v0)})
+                _ -> Nothing) (Module.moduleDefinitions mod))
+      in (Eithers.map (\deps -> Sets.delete (Module.moduleNamespace mod) deps) (dependencyNamespaces cx graph binds withPrims withNoms withSchema allBindings))
+
 -- | Create namespaces mapping for definitions
-namespacesForDefinitions :: ((Module.Namespace -> t0) -> Module.Namespace -> [Module.Definition] -> Module.Namespaces t0)
-namespacesForDefinitions encodeNamespace focusNs defs =  
-  let nss = (Sets.delete focusNs (definitionDependencyNamespaces defs))
-  in  
-    let toPair = (\ns -> (ns, (encodeNamespace ns)))
-    in Module.Namespaces {
-      Module.namespacesFocus = (toPair focusNs),
-      Module.namespacesMapping = (Maps.fromList (Lists.map toPair (Sets.toList nss)))}
+namespacesForDefinitions :: (Module.Namespace -> t0) -> Module.Namespace -> [Module.Definition] -> Module.Namespaces t0
+namespacesForDefinitions encodeNamespace focusNs defs =
 
+      let nss = Sets.delete focusNs (definitionDependencyNamespaces defs)
+          toPair = \ns -> (ns, (encodeNamespace ns))
+      in Module.Namespaces {
+        Module.namespacesFocus = (toPair focusNs),
+        Module.namespacesMapping = (Maps.fromList (Lists.map toPair (Sets.toList nss)))}
+
 -- | Apply type arguments to a nominal type
-nominalApplication :: (Core.Name -> [Core.Type] -> Core.Type)
-nominalApplication tname args = (Lists.foldl (\t -> \a -> Core.TypeApplication (Core.ApplicationType {
-  Core.applicationTypeFunction = t,
-  Core.applicationTypeArgument = a})) (Core.TypeVariable tname) args)
+nominalApplication :: Core.Name -> [Core.Type] -> Core.Type
+nominalApplication tname args =
+    Lists.foldl (\t -> \a -> Core.TypeApplication (Core.ApplicationType {
+      Core.applicationTypeFunction = t,
+      Core.applicationTypeArgument = a})) (Core.TypeVariable tname) args
 
 -- | Type variable naming convention follows Haskell: t0, t1, etc.
-normalTypeVariable :: (Int -> Core.Name)
-normalTypeVariable i = (Core.Name (Strings.cat2 "t" (Literals.showInt32 i)))
+normalTypeVariable :: Int -> Core.Name
+normalTypeVariable i = Core.Name (Strings.cat2 "t" (Literals.showInt32 i))
 
 -- | Partition a list of definitions into type definitions and term definitions
-partitionDefinitions :: ([Module.Definition] -> ([Module.TypeDefinition], [Module.TermDefinition]))
-partitionDefinitions defs =  
-  let getType = (\def -> (\x -> case x of
-          Module.DefinitionType v1 -> (Just v1)
-          Module.DefinitionTerm _ -> Nothing) def)
-  in  
-    let getTerm = (\def -> (\x -> case x of
-            Module.DefinitionType _ -> Nothing
-            Module.DefinitionTerm v1 -> (Just v1)) def)
-    in (Maybes.cat (Lists.map getType defs), (Maybes.cat (Lists.map getTerm defs)))
+partitionDefinitions :: [Module.Definition] -> ([Module.TypeDefinition], [Module.TermDefinition])
+partitionDefinitions defs =
 
+      let getType =
+              \def -> case def of
+                Module.DefinitionType v0 -> Just v0
+                Module.DefinitionTerm _ -> Nothing
+          getTerm =
+                  \def -> case def of
+                    Module.DefinitionType _ -> Nothing
+                    Module.DefinitionTerm v0 -> Just v0
+      in (Maybes.cat (Lists.map getType defs), (Maybes.cat (Lists.map getTerm defs)))
+
 -- | Require a name to resolve to a record type
-requireRecordType :: (Core.Name -> Compute.Flow Graph.Graph Core.RowType)
-requireRecordType name =  
-  let toRecord = (\t -> (\x -> case x of
-          Core.TypeRecord v1 -> (Just v1)
-          _ -> Nothing) t)
-  in (requireRowType "record type" toRecord name)
+requireRecordType :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) [Core.FieldType]
+requireRecordType cx graph name =
 
+      let toRecord =
+              \t -> case t of
+                Core.TypeRecord v0 -> Just v0
+                _ -> Nothing
+      in (requireRowType cx "record type" toRecord graph name)
+
 -- | Require a name to resolve to a row type
-requireRowType :: (String -> (Core.Type -> Maybe t0) -> Core.Name -> Compute.Flow Graph.Graph t0)
-requireRowType label getter name =  
-  let rawType = (\t -> (\x -> case x of
-          Core.TypeAnnotated v1 -> (rawType (Core.annotatedTypeBody v1))
-          Core.TypeForall v1 -> (rawType (Core.forallTypeBody v1))
-          _ -> t) t)
-  in (Flows.bind (requireType name) (\t -> Maybes.maybe (Flows.fail (Strings.cat [
-    Core.unName name,
-    " does not resolve to a ",
-    label,
-    " type: ",
-    (Core___.type_ t)])) Flows.pure (getter (rawType t))))
+requireRowType :: Context.Context -> String -> (Core.Type -> Maybe t0) -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) t0
+requireRowType cx label getter graph name =
 
--- | Look up a schema type in the context and instantiate it
-requireSchemaType :: (Typing.InferenceContext -> Core.Name -> Compute.Flow t0 Core.TypeScheme)
-requireSchemaType cx tname =  
-  let types = (Typing.inferenceContextSchemaTypes cx)
-  in (Maybes.maybe (Flows.fail (Strings.cat [
-    "No such schema type: ",
-    (Core.unName tname),
-    ". Available types are: ",
-    (Strings.intercalate ", " (Lists.map Core.unName (Maps.keys types)))])) (\ts -> instantiateTypeScheme (Rewriting.deannotateTypeSchemeRecursive ts)) (Maps.lookup tname types))
+      let rawType =
+              \t -> case t of
+                Core.TypeAnnotated v0 -> rawType (Core.annotatedTypeBody v0)
+                Core.TypeForall v0 -> rawType (Core.forallTypeBody v0)
+                _ -> t
+      in (Eithers.bind (requireType cx graph name) (\t -> Maybes.maybe (Left (Context.InContext {
+        Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+          Core.unName name,
+          " does not resolve to a ",
+          label,
+          " type: ",
+          (Core___.type_ t)]))),
+        Context.inContextContext = cx})) (\x -> Right x) (getter (rawType t))))
 
+-- | Look up a schema type and instantiate it, threading Context
+requireSchemaType :: Context.Context -> M.Map Core.Name Core.TypeScheme -> Core.Name -> Either (Context.InContext Errors.Error) (Core.TypeScheme, Context.Context)
+requireSchemaType cx types tname =
+    Maybes.maybe (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+        "No such schema type: ",
+        (Core.unName tname),
+        ". Available types are: ",
+        (Strings.intercalate ", " (Lists.map Core.unName (Maps.keys types)))]))),
+      Context.inContextContext = cx})) (\ts -> Right (instantiateTypeScheme cx (Rewriting.deannotateTypeSchemeRecursive ts))) (Maps.lookup tname types)
+
 -- | Require a type by name
-requireType :: (Core.Name -> Compute.Flow Graph.Graph Core.Type)
-requireType name = (Flows.bind Monads.getState (\cx -> Monads.withTrace (Strings.cat2 "require type " (Core.unName name)) (Flows.bind (Lexical.withSchemaContext (Lexical.requireElement name)) (\el -> Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el))))))
+requireType :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) Core.Type
+requireType cx graph name =
+    Maybes.maybe (Maybes.maybe (Left (Context.InContext {
+      Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "no such type: " (Core.unName name)))),
+      Context.inContextContext = cx})) (\ts -> Right (Rewriting.typeSchemeToFType ts)) (Maps.lookup name (Graph.graphBoundTypes graph))) (\ts -> Right (Rewriting.typeSchemeToFType ts)) (Maps.lookup name (Graph.graphSchemaTypes graph))
 
 -- | Require a field type from a union type
-requireUnionField :: (Core.Name -> Core.Name -> Compute.Flow Graph.Graph Core.Type)
-requireUnionField tname fname =  
-  let withRowType = (\rt ->  
-          let matches = (Lists.filter (\ft -> Equality.equal (Core.fieldTypeName ft) fname) (Core.rowTypeFields rt))
-          in (Logic.ifElse (Lists.null matches) (Flows.fail (Strings.cat [
-            "no field \"",
-            (Core.unName fname),
-            "\" in union type \"",
-            (Core.unName tname)])) (Flows.pure (Core.fieldTypeType (Lists.head matches)))))
-  in (Flows.bind (requireUnionType tname) withRowType)
+requireUnionField :: Context.Context -> Graph.Graph -> Core.Name -> Core.Name -> Either (Context.InContext Errors.Error) Core.Type
+requireUnionField cx graph tname fname =
 
+      let withRowType =
+              \rt ->
+                let matches = Lists.filter (\ft -> Equality.equal (Core.fieldTypeName ft) fname) rt
+                in (Logic.ifElse (Lists.null matches) (Left (Context.InContext {
+                  Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat [
+                    "no field \"",
+                    (Core.unName fname),
+                    "\" in union type \"",
+                    (Core.unName tname)]))),
+                  Context.inContextContext = cx})) (Right (Core.fieldTypeType (Lists.head matches))))
+      in (Eithers.bind (requireUnionType cx graph tname) withRowType)
+
 -- | Require a name to resolve to a union type
-requireUnionType :: (Core.Name -> Compute.Flow Graph.Graph Core.RowType)
-requireUnionType name =  
-  let toUnion = (\t -> (\x -> case x of
-          Core.TypeUnion v1 -> (Just v1)
-          _ -> Nothing) t)
-  in (requireRowType "union" toUnion name)
+requireUnionType :: Context.Context -> Graph.Graph -> Core.Name -> Either (Context.InContext Errors.Error) [Core.FieldType]
+requireUnionType cx graph name =
 
+      let toUnion =
+              \t -> case t of
+                Core.TypeUnion v0 -> Just v0
+                _ -> Nothing
+      in (requireRowType cx "union" toUnion graph name)
+
 -- | Resolve a type, dereferencing type variables
-resolveType :: (Core.Type -> Compute.Flow Graph.Graph (Maybe Core.Type))
-resolveType typ = (Flows.bind Monads.getState (\cx -> (\x -> case x of
-  Core.TypeVariable v1 -> (Lexical.withSchemaContext (Flows.bind (Lexical.resolveTerm v1) (\mterm -> Maybes.maybe (Flows.pure Nothing) (\t -> Flows.map Maybes.pure (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx t))) mterm)))
-  _ -> (Flows.pure (Just typ))) (Rewriting.deannotateType typ)))
+resolveType :: Graph.Graph -> Core.Type -> Maybe Core.Type
+resolveType graph typ =
+    case (Rewriting.deannotateType typ) of
+      Core.TypeVariable v0 -> Maybes.maybe (Maybes.map (\ts -> Rewriting.typeSchemeToFType ts) (Maps.lookup v0 (Graph.graphBoundTypes graph))) (\ts -> Just (Rewriting.typeSchemeToFType ts)) (Maps.lookup v0 (Graph.graphSchemaTypes graph))
+      _ -> Just typ
 
--- | Convert a schema graph to a typing environment
-schemaGraphToTypingEnvironment :: (Graph.Graph -> Compute.Flow t0 (M.Map Core.Name Core.TypeScheme))
-schemaGraphToTypingEnvironment g =  
-  let toTypeScheme = (\vars -> \typ -> (\x -> case x of
-          Core.TypeForall v1 -> (toTypeScheme (Lists.cons (Core.forallTypeParameter v1) vars) (Core.forallTypeBody v1))
-          _ -> Core.TypeScheme {
-            Core.typeSchemeVariables = (Lists.reverse vars),
-            Core.typeSchemeType = typ,
-            Core.typeSchemeConstraints = Nothing}) (Rewriting.deannotateType typ))
-  in  
-    let toPair = (\el -> Flows.bind Monads.getState (\cx ->  
-            let forTerm = (\term -> (\x -> case x of
-                    Core.TermRecord v1 -> (Logic.ifElse (Equality.equal (Core.recordTypeName v1) (Core.Name "hydra.core.TypeScheme")) (Flows.map Maybes.pure (Monads.eitherToFlow Util.unDecodingError (Core_.typeScheme cx (Core.bindingTerm el)))) (Flows.pure Nothing))
-                    Core.TermUnion v1 -> (Logic.ifElse (Equality.equal (Core.injectionTypeName v1) (Core.Name "hydra.core.Type")) (Flows.map (\decoded -> Just (toTypeScheme [] decoded)) (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el)))) (Flows.pure Nothing))
-                    _ -> (Flows.pure Nothing)) term)
-            in (Flows.bind (Maybes.maybe (Flows.map (\typ -> Just (fTypeToTypeScheme typ)) (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el)))) (\ts -> Logic.ifElse (Equality.equal ts (Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme")),
-              Core.typeSchemeConstraints = Nothing})) (Flows.map Maybes.pure (Monads.eitherToFlow Util.unDecodingError (Core_.typeScheme cx (Core.bindingTerm el)))) (Logic.ifElse (Equality.equal ts (Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-              Core.typeSchemeConstraints = Nothing})) (Flows.map (\decoded -> Just (toTypeScheme [] decoded)) (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el)))) (forTerm (Rewriting.deannotateTerm (Core.bindingTerm el))))) (Core.bindingType el)) (\mts -> Flows.pure (Maybes.map (\ts -> (Core.bindingName el, ts)) mts)))))
-    in (Monads.withTrace "schema graph to typing environment" (Monads.withState g (Flows.bind (Flows.mapList toPair (Graph.graphElements g)) (\mpairs -> Flows.pure (Maps.fromList (Maybes.cat mpairs))))))
+-- | Convert a schema graph to a typing environment (Either version)
+schemaGraphToTypingEnvironment :: Context.Context -> Graph.Graph -> Either (Context.InContext Errors.Error) (M.Map Core.Name Core.TypeScheme)
+schemaGraphToTypingEnvironment cx g =
 
--- | Find the equivalent graph representation of a term
-termAsGraph :: (Core.Term -> [Core.Binding])
-termAsGraph term = ((\x -> case x of
-  Core.TermLet v1 -> (Core.letBindings v1)
-  _ -> []) (Rewriting.deannotateTerm term))
+      let toTypeScheme =
+              \vars -> \typ -> case (Rewriting.deannotateType typ) of
+                Core.TypeForall v0 -> toTypeScheme (Lists.cons (Core.forallTypeParameter v0) vars) (Core.forallTypeBody v0)
+                _ -> Core.TypeScheme {
+                  Core.typeSchemeVariables = (Lists.reverse vars),
+                  Core.typeSchemeType = typ,
+                  Core.typeSchemeConstraints = Nothing}
+          decodeType =
+                  \term -> Eithers.bimap (\_wc_e -> Context.InContext {
+                    Context.inContextObject = _wc_e,
+                    Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Eithers.bimap (\_e -> Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError _e))) (\_a -> _a) (Core_.type_ g term))
+          decodeTypeScheme =
+                  \term -> Eithers.bimap (\_wc_e -> Context.InContext {
+                    Context.inContextObject = _wc_e,
+                    Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Eithers.bimap (\_e -> Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError _e))) (\_a -> _a) (Core_.typeScheme g term))
+          toPair =
+                  \el ->
+                    let forTerm =
+                            \term -> case term of
+                              Core.TermRecord v0 -> Logic.ifElse (Equality.equal (Core.recordTypeName v0) (Core.Name "hydra.core.TypeScheme")) (Eithers.map Maybes.pure (decodeTypeScheme (Core.bindingTerm el))) (Right Nothing)
+                              Core.TermUnion v0 -> Logic.ifElse (Equality.equal (Core.injectionTypeName v0) (Core.Name "hydra.core.Type")) (Eithers.map (\decoded -> Just (toTypeScheme [] decoded)) (decodeType (Core.bindingTerm el))) (Right Nothing)
+                              _ -> Right Nothing
+                    in (Eithers.bind (Maybes.maybe (Eithers.map (\typ -> Just (Rewriting.fTypeToTypeScheme typ)) (decodeType (Core.bindingTerm el))) (\ts -> Logic.ifElse (Equality.equal ts (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme")),
+                      Core.typeSchemeConstraints = Nothing})) (Eithers.map Maybes.pure (decodeTypeScheme (Core.bindingTerm el))) (Logic.ifElse (Equality.equal ts (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+                      Core.typeSchemeConstraints = Nothing})) (Eithers.map (\decoded -> Just (toTypeScheme [] decoded)) (decodeType (Core.bindingTerm el))) (forTerm (Rewriting.deannotateTerm (Core.bindingTerm el))))) (Core.bindingType el)) (\mts -> Right (Maybes.map (\ts -> (Core.bindingName el, ts)) mts)))
+      in (Eithers.map (\mpairs -> Maps.fromList (Maybes.cat mpairs)) (Eithers.mapList toPair (Lexical.graphToBindings g)))
 
+-- | Extract the bindings from a let term, or return an empty list for other terms
+termAsBindings :: Core.Term -> [Core.Binding]
+termAsBindings term =
+    case (Rewriting.deannotateTerm term) of
+      Core.TermLet v0 -> Core.letBindings v0
+      _ -> []
+
 -- | Topologically sort type definitions by dependencies
-topologicalSortTypeDefinitions :: ([Module.TypeDefinition] -> [[Module.TypeDefinition]])
-topologicalSortTypeDefinitions defs =  
-  let toPair = (\def -> (Module.typeDefinitionName def, (Sets.toList (Rewriting.typeDependencyNames False (Module.typeDefinitionType def)))))
-  in  
-    let nameToDef = (Maps.fromList (Lists.map (\d -> (Module.typeDefinitionName d, d)) defs))
-    in  
-      let sorted = (Sorting.topologicalSortComponents (Lists.map toPair defs))
+topologicalSortTypeDefinitions :: [Module.TypeDefinition] -> [[Module.TypeDefinition]]
+topologicalSortTypeDefinitions defs =
+
+      let toPair =
+              \def -> (Module.typeDefinitionName def, (Sets.toList (Rewriting.typeDependencyNames False (Module.typeDefinitionType def))))
+          nameToDef = Maps.fromList (Lists.map (\d -> (Module.typeDefinitionName d, d)) defs)
+          sorted = Sorting.topologicalSortComponents (Lists.map toPair defs)
       in (Lists.map (\names -> Maybes.cat (Lists.map (\n -> Maps.lookup n nameToDef) names)) sorted)
 
--- | Get all type dependencies for a given type name
-typeDependencies :: (Bool -> (Core.Type -> Core.Type) -> Core.Name -> Compute.Flow Graph.Graph (M.Map Core.Name Core.Type))
-typeDependencies withSchema transform name = (Flows.bind Monads.getState (\cx ->  
-  let requireType = (\name -> Monads.withTrace (Strings.cat2 "type dependencies of " (Core.unName name)) (Flows.bind (Lexical.requireElement name) (\el -> Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el)))))
-  in  
-    let toPair = (\name -> Flows.bind (requireType name) (\typ -> Flows.pure (name, (transform typ))))
-    in  
-      let deps = (\seeds -> \names -> Logic.ifElse (Sets.null seeds) (Flows.pure names) (Flows.bind (Flows.mapList toPair (Sets.toList seeds)) (\pairs ->  
-              let newNames = (Maps.union names (Maps.fromList pairs))
-              in  
-                let refs = (Lists.foldl Sets.union Sets.empty (Lists.map (\pair -> Rewriting.typeDependencyNames withSchema (Pairs.second pair)) pairs))
-                in  
-                  let visited = (Sets.fromList (Maps.keys names))
-                  in  
-                    let newSeeds = (Sets.difference refs visited)
-                    in (deps newSeeds newNames))))
-      in (Monads.withTrace "type dependencies" (deps (Sets.singleton name) Maps.empty))))
+-- | Get all type dependencies for a given type name (Either version)
+typeDependencies :: Context.Context -> Graph.Graph -> Bool -> (Core.Type -> Core.Type) -> Core.Name -> Either (Context.InContext Errors.Error) (M.Map Core.Name Core.Type)
+typeDependencies cx graph withSchema transform name =
 
--- | Convert a type scheme to a forall type
-typeSchemeToFType :: (Core.TypeScheme -> Core.Type)
-typeSchemeToFType ts =  
-  let vars = (Core.typeSchemeVariables ts)
-  in  
-    let body = (Core.typeSchemeType ts)
-    in (Lists.foldl (\t -> \v -> Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = v,
-      Core.forallTypeBody = t})) body (Lists.reverse vars))
+      let requireType =
+              \name ->
+                let cx1 =
+                        Context.Context {
+                          Context.contextTrace = (Lists.cons (Strings.cat2 "type dependencies of " (Core.unName name)) (Context.contextTrace cx)),
+                          Context.contextMessages = (Context.contextMessages cx),
+                          Context.contextOther = (Context.contextOther cx)}
+                in (Eithers.bind (Lexical.requireElement cx1 graph name) (\el -> Eithers.bimap (\_wc_e -> Context.InContext {
+                  Context.inContextObject = _wc_e,
+                  Context.inContextContext = cx1}) (\_wc_a -> _wc_a) (Eithers.bimap (\_e -> Errors.ErrorOther (Errors.OtherError (Errors.unDecodingError _e))) (\_a -> _a) (Core_.type_ graph (Core.bindingTerm el)))))
+          toPair = \name -> Eithers.map (\typ -> (name, (transform typ))) (requireType name)
+          deps =
+                  \seeds -> \names -> Logic.ifElse (Sets.null seeds) (Right names) (Eithers.bind (Eithers.mapList toPair (Sets.toList seeds)) (\pairs ->
+                    let newNames = Maps.union names (Maps.fromList pairs)
+                        refs =
+                                Lists.foldl Sets.union Sets.empty (Lists.map (\pair -> Rewriting.typeDependencyNames withSchema (Pairs.second pair)) pairs)
+                        visited = Sets.fromList (Maps.keys names)
+                        newSeeds = Sets.difference refs visited
+                    in (deps newSeeds newNames)))
+      in (deps (Sets.singleton name) Maps.empty)
 
 -- | Convert a (System F -style) type to a type scheme
-typeToTypeScheme :: (Core.Type -> Core.TypeScheme)
-typeToTypeScheme t0 =  
-  let helper = (\vars -> \t -> (\x -> case x of
-          Core.TypeForall v1 -> (helper (Lists.cons (Core.forallTypeParameter v1) vars) (Core.forallTypeBody v1))
-          _ -> Core.TypeScheme {
-            Core.typeSchemeVariables = (Lists.reverse vars),
-            Core.typeSchemeType = t,
-            Core.typeSchemeConstraints = Nothing}) (Rewriting.deannotateType t))
-  in (helper [] t0)
+typeToTypeScheme :: Core.Type -> Core.TypeScheme
+typeToTypeScheme t0 =
 
+      let helper =
+              \vars -> \t -> case (Rewriting.deannotateType t) of
+                Core.TypeForall v0 -> helper (Lists.cons (Core.forallTypeParameter v0) vars) (Core.forallTypeBody v0)
+                _ -> Core.TypeScheme {
+                  Core.typeSchemeVariables = (Lists.reverse vars),
+                  Core.typeSchemeType = t,
+                  Core.typeSchemeConstraints = Nothing}
+      in (helper [] t0)
+
 -- | Encode a map of named types to a list of elements
-typesToElements :: (M.Map Core.Name Core.Type -> [Core.Binding])
-typesToElements typeMap =  
-  let toElement = (\pair ->  
-          let name = (Pairs.first pair)
-          in Core.Binding {
-            Core.bindingName = name,
-            Core.bindingTerm = (Core__.type_ (Pairs.second pair)),
-            Core.bindingType = Nothing})
-  in (Lists.map toElement (Maps.toList typeMap))
+typesToElements :: M.Map Core.Name Core.Type -> [Core.Binding]
+typesToElements typeMap =
 
+      let toElement =
+              \pair ->
+                let name = Pairs.first pair
+                in Core.Binding {
+                  Core.bindingName = name,
+                  Core.bindingTerm = (Core__.type_ (Pairs.second pair)),
+                  Core.bindingType = Nothing}
+      in (Lists.map toElement (Maps.toList typeMap))
+
 -- | Execute a computation in the context of a lambda body, extending the type context with the lambda parameter
-withLambdaContext :: ((t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t1) -> t0 -> Core.Lambda -> (t1 -> t2) -> t2)
-withLambdaContext getContext setContext env lam body =  
-  let newContext = (extendTypeContextForLambda (getContext env) lam)
-  in (body (setContext newContext env))
+withLambdaContext :: (t0 -> Graph.Graph) -> (Graph.Graph -> t0 -> t1) -> t0 -> Core.Lambda -> (t1 -> t2) -> t2
+withLambdaContext getContext setContext env lam body =
 
+      let newContext = Rewriting.extendGraphForLambda (getContext env) lam
+      in (body (setContext newContext env))
+
 -- | Execute a computation in the context of a let body, extending the type context with the let bindings
-withLetContext :: ((t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t1) -> (Typing.TypeContext -> Core.Binding -> Maybe Core.Term) -> t0 -> Core.Let -> (t1 -> t2) -> t2)
-withLetContext getContext setContext forBinding env letrec body =  
-  let newContext = (extendTypeContextForLet forBinding (getContext env) letrec)
-  in (body (setContext newContext env))
+withLetContext :: (t0 -> Graph.Graph) -> (Graph.Graph -> t0 -> t1) -> (Graph.Graph -> Core.Binding -> Maybe Core.Term) -> t0 -> Core.Let -> (t1 -> t2) -> t2
+withLetContext getContext setContext forBinding env letrec body =
 
+      let newContext = Rewriting.extendGraphForLet forBinding (getContext env) letrec
+      in (body (setContext newContext env))
+
 -- | Execute a computation in the context of a type lambda body, extending the type context with the type parameter
-withTypeLambdaContext :: ((t0 -> Typing.TypeContext) -> (Typing.TypeContext -> t0 -> t1) -> t0 -> Core.TypeLambda -> (t1 -> t2) -> t2)
-withTypeLambdaContext getContext setContext env tlam body =  
-  let newContext = (extendTypeContextForTypeLambda (getContext env) tlam)
-  in (body (setContext newContext env))
+withTypeLambdaContext :: (t0 -> Graph.Graph) -> (Graph.Graph -> t0 -> t1) -> t0 -> Core.TypeLambda -> (t1 -> t2) -> t2
+withTypeLambdaContext getContext setContext env tlam body =
+
+      let newContext = Rewriting.extendGraphForTypeLambda (getContext env) tlam
+      in (body (setContext newContext env))
diff --git a/src/gen-main/haskell/Hydra/Serialization.hs b/src/gen-main/haskell/Hydra/Serialization.hs
--- a/src/gen-main/haskell/Hydra/Serialization.hs
+++ b/src/gen-main/haskell/Hydra/Serialization.hs
@@ -21,476 +21,517 @@
 import qualified Data.Set as S
 
 angleBraces :: Ast.Brackets
-angleBraces = Ast.Brackets {
-  Ast.bracketsOpen = (sym "<"),
-  Ast.bracketsClose = (sym ">")}
+angleBraces =
+    Ast.Brackets {
+      Ast.bracketsOpen = (Ast.Symbol "<"),
+      Ast.bracketsClose = (Ast.Symbol ">")}
 
-angleBracesList :: (Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr)
-angleBracesList style els = (Logic.ifElse (Lists.null els) (cst "<>") (brackets angleBraces style (commaSep style els)))
+angleBracesList :: Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr
+angleBracesList style els = Logic.ifElse (Lists.null els) (cst "<>") (brackets angleBraces style (commaSep style els))
 
 -- | Produce a bracketed list which separates elements by spaces or newlines depending on the estimated width of the expression.
-bracesListAdaptive :: ([Ast.Expr] -> Ast.Expr)
-bracesListAdaptive els =  
-  let inlineList = (curlyBracesList Nothing inlineStyle els)
-  in (Logic.ifElse (Equality.gt (expressionLength inlineList) 70) (curlyBracesList Nothing halfBlockStyle els) inlineList)
+bracesListAdaptive :: [Ast.Expr] -> Ast.Expr
+bracesListAdaptive els =
 
-bracketList :: (Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr)
-bracketList style els = (Logic.ifElse (Lists.null els) (cst "[]") (brackets squareBrackets style (commaSep style els)))
+      let inlineList = curlyBracesList Nothing inlineStyle els
+      in (Logic.ifElse (Equality.gt (expressionLength inlineList) 70) (curlyBracesList Nothing halfBlockStyle els) inlineList)
 
+bracketList :: Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr
+bracketList style els = Logic.ifElse (Lists.null els) (cst "[]") (brackets squareBrackets style (commaSep style els))
+
 -- | Produce a bracketed list which separates elements by spaces or newlines depending on the estimated width of the expression.
-bracketListAdaptive :: ([Ast.Expr] -> Ast.Expr)
-bracketListAdaptive els =  
-  let inlineList = (bracketList inlineStyle els)
-  in (Logic.ifElse (Equality.gt (expressionLength inlineList) 70) (bracketList halfBlockStyle els) inlineList)
+bracketListAdaptive :: [Ast.Expr] -> Ast.Expr
+bracketListAdaptive els =
 
-brackets :: (Ast.Brackets -> Ast.BlockStyle -> Ast.Expr -> Ast.Expr)
-brackets br style e = (Ast.ExprBrackets (Ast.BracketExpr {
-  Ast.bracketExprBrackets = br,
-  Ast.bracketExprEnclosed = e,
-  Ast.bracketExprStyle = style}))
+      let inlineList = bracketList inlineStyle els
+      in (Logic.ifElse (Equality.gt (expressionLength inlineList) 70) (bracketList halfBlockStyle els) inlineList)
 
-commaSep :: (Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr)
-commaSep = (symbolSep ",")
+brackets :: Ast.Brackets -> Ast.BlockStyle -> Ast.Expr -> Ast.Expr
+brackets br style e =
+    Ast.ExprBrackets (Ast.BracketExpr {
+      Ast.bracketExprBrackets = br,
+      Ast.bracketExprEnclosed = e,
+      Ast.bracketExprStyle = style})
 
-curlyBlock :: (Ast.BlockStyle -> Ast.Expr -> Ast.Expr)
-curlyBlock style e = (curlyBracesList Nothing style [
-  e])
+commaSep :: Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr
+commaSep = symbolSep ","
 
+cst :: String -> Ast.Expr
+cst s = Ast.ExprConst (sym s)
+
+curlyBlock :: Ast.BlockStyle -> Ast.Expr -> Ast.Expr
+curlyBlock style e = curlyBracesList Nothing style [
+  e]
+
 curlyBraces :: Ast.Brackets
-curlyBraces = Ast.Brackets {
-  Ast.bracketsOpen = (sym "{"),
-  Ast.bracketsClose = (sym "}")}
+curlyBraces =
+    Ast.Brackets {
+      Ast.bracketsOpen = (Ast.Symbol "{"),
+      Ast.bracketsClose = (Ast.Symbol "}")}
 
-curlyBracesList :: (Maybe String -> Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr)
-curlyBracesList msymb style els = (Logic.ifElse (Lists.null els) (cst "{}") (brackets curlyBraces style (symbolSep (Maybes.fromMaybe "," msymb) style els)))
+curlyBracesList :: Maybe String -> Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr
+curlyBracesList msymb style els =
+    Logic.ifElse (Lists.null els) (cst "{}") (brackets curlyBraces style (symbolSep (Maybes.fromMaybe "," msymb) style els))
 
-cst :: (String -> Ast.Expr)
-cst s = (Ast.ExprConst (sym s))
+customIndent :: String -> String -> String
+customIndent idt s = Strings.cat (Lists.intersperse "\n" (Lists.map (\line -> Strings.cat2 idt line) (Strings.lines s)))
 
-customIndent :: (String -> String -> String)
-customIndent idt s = (Strings.cat (Lists.intersperse "\n" (Lists.map (\line -> Strings.cat2 idt line) (Strings.lines s))))
+customIndentBlock :: String -> [Ast.Expr] -> Ast.Expr
+customIndentBlock idt els =
 
-customIndentBlock :: (String -> [Ast.Expr] -> Ast.Expr)
-customIndentBlock idt els =  
-  let idtOp = Ast.Op {
-          Ast.opSymbol = (sym ""),
-          Ast.opPadding = Ast.Padding {
-            Ast.paddingLeft = Ast.WsSpace,
-            Ast.paddingRight = (Ast.WsBreakAndIndent idt)},
-          Ast.opPrecedence = (Ast.Precedence 0),
-          Ast.opAssociativity = Ast.AssociativityNone}
-  in (Maybes.maybe (cst "") (\head -> Logic.ifElse (Equality.equal (Lists.length els) 1) head (ifx idtOp head (newlineSep (Lists.drop 1 els)))) (Lists.safeHead els))
+      let idtOp =
+              Ast.Op {
+                Ast.opSymbol = (sym ""),
+                Ast.opPadding = Ast.Padding {
+                  Ast.paddingLeft = Ast.WsSpace,
+                  Ast.paddingRight = (Ast.WsBreakAndIndent idt)},
+                Ast.opPrecedence = (Ast.Precedence 0),
+                Ast.opAssociativity = Ast.AssociativityNone}
+      in (Maybes.maybe (cst "") (\head -> Logic.ifElse (Equality.equal (Lists.length els) 1) head (ifx idtOp head (newlineSep (Lists.drop 1 els)))) (Lists.safeHead els))
 
-dotSep :: ([Ast.Expr] -> Ast.Expr)
-dotSep = (sep (Ast.Op {
-  Ast.opSymbol = (sym "."),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsNone,
-    Ast.paddingRight = Ast.WsNone},
-  Ast.opPrecedence = (Ast.Precedence 0),
-  Ast.opAssociativity = Ast.AssociativityNone}))
+dotSep :: [Ast.Expr] -> Ast.Expr
+dotSep =
+    sep (Ast.Op {
+      Ast.opSymbol = (sym "."),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsNone,
+        Ast.paddingRight = Ast.WsNone},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityNone})
 
-doubleNewlineSep :: ([Ast.Expr] -> Ast.Expr)
-doubleNewlineSep = (sep (Ast.Op {
-  Ast.opSymbol = (sym ""),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsBreak,
-    Ast.paddingRight = Ast.WsBreak},
-  Ast.opPrecedence = (Ast.Precedence 0),
-  Ast.opAssociativity = Ast.AssociativityNone}))
+doubleNewlineSep :: [Ast.Expr] -> Ast.Expr
+doubleNewlineSep =
+    sep (Ast.Op {
+      Ast.opSymbol = (sym ""),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsBreak,
+        Ast.paddingRight = Ast.WsBreak},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityNone})
 
 doubleSpace :: String
 doubleSpace = "  "
 
 -- | Find the approximate length (number of characters, including spaces and newlines) of an expression without actually printing it.
-expressionLength :: (Ast.Expr -> Int)
-expressionLength e =  
-  let symbolLength = (\s -> Strings.length (Ast.unSymbol s))
-  in  
-    let wsLength = (\ws -> (\x -> case x of
-            Ast.WsNone -> 0
-            Ast.WsSpace -> 1
-            Ast.WsBreak -> 1
-            Ast.WsBreakAndIndent v1 -> (Math.add 1 (Strings.length v1))
-            Ast.WsDoubleBreak -> 2) ws)
-    in  
-      let blockStyleLength = (\style ->  
-              let mindentLen = (Maybes.maybe 0 Strings.length (Ast.blockStyleIndent style))
-              in  
-                let nlBeforeLen = (Logic.ifElse (Ast.blockStyleNewlineBeforeContent style) 1 0)
-                in  
-                  let nlAfterLen = (Logic.ifElse (Ast.blockStyleNewlineAfterContent style) 1 0)
-                  in (Math.add mindentLen (Math.add nlBeforeLen nlAfterLen)))
-      in  
-        let bracketsLength = (\brackets -> Math.add (symbolLength (Ast.bracketsOpen brackets)) (symbolLength (Ast.bracketsClose brackets)))
-        in  
-          let bracketExprLength = (\be -> Math.add (bracketsLength (Ast.bracketExprBrackets be)) (Math.add (expressionLength (Ast.bracketExprEnclosed be)) (blockStyleLength (Ast.bracketExprStyle be))))
-          in  
-            let indentedExpressionLength = (\ie ->  
-                    let baseLen = (expressionLength (Ast.indentedExpressionExpr ie))
-                    in  
-                      let indentLen = ((\x -> case x of
-                              Ast.IndentStyleAllLines v1 -> (Strings.length v1)
-                              Ast.IndentStyleSubsequentLines v1 -> (Strings.length v1)) (Ast.indentedExpressionStyle ie))
-                      in (Math.add baseLen indentLen))
-            in  
-              let opLength = (\op ->  
-                      let symLen = (symbolLength (Ast.opSymbol op))
-                      in  
-                        let padding = (Ast.opPadding op)
-                        in  
-                          let leftLen = (wsLength (Ast.paddingLeft padding))
-                          in  
-                            let rightLen = (wsLength (Ast.paddingRight padding))
-                            in (Math.add symLen (Math.add leftLen rightLen)))
-              in  
-                let opExprLength = (\oe ->  
-                        let opLen = (opLength (Ast.opExprOp oe))
-                        in  
-                          let leftLen = (expressionLength (Ast.opExprLhs oe))
-                          in  
-                            let rightLen = (expressionLength (Ast.opExprRhs oe))
-                            in (Math.add opLen (Math.add leftLen rightLen)))
-                in ((\x -> case x of
-                  Ast.ExprConst v1 -> (symbolLength v1)
-                  Ast.ExprIndent v1 -> (indentedExpressionLength v1)
-                  Ast.ExprOp v1 -> (opExprLength v1)
-                  Ast.ExprBrackets v1 -> (bracketExprLength v1)) e)
+expressionLength :: Ast.Expr -> Int
+expressionLength e =
 
+      let symbolLength = \s -> Strings.length (Ast.unSymbol s)
+          wsLength =
+                  \ws -> case ws of
+                    Ast.WsNone -> 0
+                    Ast.WsSpace -> 1
+                    Ast.WsBreak -> 10000
+                    Ast.WsBreakAndIndent _ -> 10000
+                    Ast.WsDoubleBreak -> 10000
+          blockStyleLength =
+                  \style ->
+                    let mindentLen = Maybes.maybe 0 Strings.length (Ast.blockStyleIndent style)
+                        nlBeforeLen = Logic.ifElse (Ast.blockStyleNewlineBeforeContent style) 1 0
+                        nlAfterLen = Logic.ifElse (Ast.blockStyleNewlineAfterContent style) 1 0
+                    in (Math.add mindentLen (Math.add nlBeforeLen nlAfterLen))
+          bracketsLength =
+                  \brackets -> Math.add (symbolLength (Ast.bracketsOpen brackets)) (symbolLength (Ast.bracketsClose brackets))
+          bracketExprLength =
+                  \be -> Math.add (bracketsLength (Ast.bracketExprBrackets be)) (Math.add (expressionLength (Ast.bracketExprEnclosed be)) (blockStyleLength (Ast.bracketExprStyle be)))
+          indentedExpressionLength =
+                  \ie ->
+                    let baseLen = expressionLength (Ast.indentedExpressionExpr ie)
+                        indentLen =
+                                case (Ast.indentedExpressionStyle ie) of
+                                  Ast.IndentStyleAllLines v0 -> Strings.length v0
+                                  Ast.IndentStyleSubsequentLines v0 -> Strings.length v0
+                    in (Math.add baseLen indentLen)
+          opLength =
+                  \op ->
+                    let symLen = symbolLength (Ast.opSymbol op)
+                        padding = Ast.opPadding op
+                        leftLen = wsLength (Ast.paddingLeft padding)
+                        rightLen = wsLength (Ast.paddingRight padding)
+                    in (Math.add symLen (Math.add leftLen rightLen))
+          opExprLength =
+                  \oe ->
+                    let opLen = opLength (Ast.opExprOp oe)
+                        leftLen = expressionLength (Ast.opExprLhs oe)
+                        rightLen = expressionLength (Ast.opExprRhs oe)
+                    in (Math.add opLen (Math.add leftLen rightLen))
+          seqExprLength =
+                  \se ->
+                    let sopLen = opLength (Ast.seqExprOp se)
+                        elementLens = Lists.map expressionLength (Ast.seqExprElements se)
+                        totalElLen = Lists.foldl Math.add 0 elementLens
+                        numSeps = Math.sub (Lists.length (Ast.seqExprElements se)) 1
+                    in (Math.add totalElLen (Math.mul sopLen (Logic.ifElse (Equality.gt numSeps 0) numSeps 0)))
+      in case e of
+        Ast.ExprConst v0 -> symbolLength v0
+        Ast.ExprIndent v0 -> indentedExpressionLength v0
+        Ast.ExprOp v0 -> opExprLength v0
+        Ast.ExprBrackets v0 -> bracketExprLength v0
+        Ast.ExprSeq v0 -> seqExprLength v0
+
 fullBlockStyle :: Ast.BlockStyle
-fullBlockStyle = Ast.BlockStyle {
-  Ast.blockStyleIndent = (Just doubleSpace),
-  Ast.blockStyleNewlineBeforeContent = True,
-  Ast.blockStyleNewlineAfterContent = True}
+fullBlockStyle =
+    Ast.BlockStyle {
+      Ast.blockStyleIndent = (Just doubleSpace),
+      Ast.blockStyleNewlineBeforeContent = True,
+      Ast.blockStyleNewlineAfterContent = True}
 
 halfBlockStyle :: Ast.BlockStyle
-halfBlockStyle = Ast.BlockStyle {
-  Ast.blockStyleIndent = (Just doubleSpace),
-  Ast.blockStyleNewlineBeforeContent = True,
-  Ast.blockStyleNewlineAfterContent = False}
+halfBlockStyle =
+    Ast.BlockStyle {
+      Ast.blockStyleIndent = (Just doubleSpace),
+      Ast.blockStyleNewlineBeforeContent = True,
+      Ast.blockStyleNewlineAfterContent = False}
 
-ifx :: (Ast.Op -> Ast.Expr -> Ast.Expr -> Ast.Expr)
-ifx op lhs rhs = (Ast.ExprOp (Ast.OpExpr {
-  Ast.opExprOp = op,
-  Ast.opExprLhs = lhs,
-  Ast.opExprRhs = rhs}))
+ifx :: Ast.Op -> Ast.Expr -> Ast.Expr -> Ast.Expr
+ifx op lhs rhs =
+    Ast.ExprOp (Ast.OpExpr {
+      Ast.opExprOp = op,
+      Ast.opExprLhs = lhs,
+      Ast.opExprRhs = rhs})
 
-indent :: (String -> String)
-indent = (customIndent doubleSpace)
+indent :: String -> String
+indent = customIndent doubleSpace
 
-indentBlock :: ([Ast.Expr] -> Ast.Expr)
-indentBlock = (customIndentBlock doubleSpace)
+indentBlock :: [Ast.Expr] -> Ast.Expr
+indentBlock = customIndentBlock doubleSpace
 
-indentSubsequentLines :: (String -> Ast.Expr -> Ast.Expr)
-indentSubsequentLines idt e = (Ast.ExprIndent (Ast.IndentedExpression {
-  Ast.indentedExpressionStyle = (Ast.IndentStyleSubsequentLines idt),
-  Ast.indentedExpressionExpr = e}))
+indentSubsequentLines :: String -> Ast.Expr -> Ast.Expr
+indentSubsequentLines idt e =
+    Ast.ExprIndent (Ast.IndentedExpression {
+      Ast.indentedExpressionStyle = (Ast.IndentStyleSubsequentLines idt),
+      Ast.indentedExpressionExpr = e})
 
-infixWs :: (String -> Ast.Expr -> Ast.Expr -> Ast.Expr)
-infixWs op l r = (spaceSep [
-  l,
-  (cst op),
-  r])
+infixWs :: String -> Ast.Expr -> Ast.Expr -> Ast.Expr
+infixWs op l r =
+    spaceSep [
+      l,
+      (cst op),
+      r]
 
-infixWsList :: (String -> [Ast.Expr] -> Ast.Expr)
-infixWsList op opers =  
-  let opExpr = (cst op)
-  in  
-    let foldFun = (\e -> \r -> Logic.ifElse (Lists.null e) [
-            r] (Lists.cons r (Lists.cons opExpr e)))
-    in (spaceSep (Lists.foldl foldFun [] (Lists.reverse opers)))
+infixWsList :: String -> [Ast.Expr] -> Ast.Expr
+infixWsList op opers =
 
+      let opExpr = cst op
+          foldFun = \e -> \r -> Logic.ifElse (Lists.null e) [
+                r] (Lists.cons r (Lists.cons opExpr e))
+      in (spaceSep (Lists.foldl foldFun [] (Lists.reverse opers)))
+
 inlineStyle :: Ast.BlockStyle
-inlineStyle = Ast.BlockStyle {
-  Ast.blockStyleIndent = Nothing,
-  Ast.blockStyleNewlineBeforeContent = False,
-  Ast.blockStyleNewlineAfterContent = False}
+inlineStyle =
+    Ast.BlockStyle {
+      Ast.blockStyleIndent = Nothing,
+      Ast.blockStyleNewlineBeforeContent = False,
+      Ast.blockStyleNewlineAfterContent = False}
 
-newlineSep :: ([Ast.Expr] -> Ast.Expr)
-newlineSep = (sep (Ast.Op {
-  Ast.opSymbol = (sym ""),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsNone,
-    Ast.paddingRight = Ast.WsBreak},
-  Ast.opPrecedence = (Ast.Precedence 0),
-  Ast.opAssociativity = Ast.AssociativityNone}))
+newlineSep :: [Ast.Expr] -> Ast.Expr
+newlineSep =
+    sep (Ast.Op {
+      Ast.opSymbol = (sym ""),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsNone,
+        Ast.paddingRight = Ast.WsBreak},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityNone})
 
 noPadding :: Ast.Padding
-noPadding = Ast.Padding {
-  Ast.paddingLeft = Ast.WsNone,
-  Ast.paddingRight = Ast.WsNone}
+noPadding =
+    Ast.Padding {
+      Ast.paddingLeft = Ast.WsNone,
+      Ast.paddingRight = Ast.WsNone}
 
-noSep :: ([Ast.Expr] -> Ast.Expr)
-noSep = (sep (Ast.Op {
-  Ast.opSymbol = (sym ""),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsNone,
-    Ast.paddingRight = Ast.WsNone},
-  Ast.opPrecedence = (Ast.Precedence 0),
-  Ast.opAssociativity = Ast.AssociativityNone}))
+noSep :: [Ast.Expr] -> Ast.Expr
+noSep =
+    sep (Ast.Op {
+      Ast.opSymbol = (sym ""),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsNone,
+        Ast.paddingRight = Ast.WsNone},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityNone})
 
-num :: (Int -> Ast.Expr)
-num i = (cst (Literals.showInt32 i))
+num :: Int -> Ast.Expr
+num i = cst (Literals.showInt32 i)
 
-op :: (String -> Int -> Ast.Associativity -> Ast.Op)
-op s p assoc = Ast.Op {
-  Ast.opSymbol = (sym s),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsSpace,
-    Ast.paddingRight = Ast.WsSpace},
-  Ast.opPrecedence = (Ast.Precedence p),
-  Ast.opAssociativity = assoc}
+op :: String -> Int -> Ast.Associativity -> Ast.Op
+op s p assoc =
+    Ast.Op {
+      Ast.opSymbol = (sym s),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsSpace,
+        Ast.paddingRight = Ast.WsSpace},
+      Ast.opPrecedence = (Ast.Precedence p),
+      Ast.opAssociativity = assoc}
 
-orOp :: (Bool -> Ast.Op)
-orOp newlines = Ast.Op {
-  Ast.opSymbol = (sym "|"),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsSpace,
-    Ast.paddingRight = (Logic.ifElse newlines Ast.WsBreak Ast.WsSpace)},
-  Ast.opPrecedence = (Ast.Precedence 0),
-  Ast.opAssociativity = Ast.AssociativityNone}
+orOp :: Bool -> Ast.Op
+orOp newlines =
+    Ast.Op {
+      Ast.opSymbol = (sym "|"),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsSpace,
+        Ast.paddingRight = (Logic.ifElse newlines Ast.WsBreak Ast.WsSpace)},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityNone}
 
-orSep :: (Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr)
-orSep style l =  
-  let newlines = (Ast.blockStyleNewlineBeforeContent style)
-  in (Maybes.maybe (cst "") (\h -> Lists.foldl (\acc -> \el -> ifx (orOp newlines) acc el) h (Lists.drop 1 l)) (Lists.safeHead l))
+orSep :: Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr
+orSep style l =
 
-parenList :: (Bool -> [Ast.Expr] -> Ast.Expr)
-parenList newlines els =  
-  let style = (Logic.ifElse (Logic.and newlines (Equality.gt (Lists.length els) 1)) halfBlockStyle inlineStyle)
-  in (Logic.ifElse (Lists.null els) (cst "()") (brackets parentheses style (commaSep style els)))
+      let newlines = Ast.blockStyleNewlineBeforeContent style
+      in (Maybes.maybe (cst "") (\h -> Lists.foldl (\acc -> \el -> ifx (orOp newlines) acc el) h (Lists.drop 1 l)) (Lists.safeHead l))
 
-parens :: (Ast.Expr -> Ast.Expr)
-parens = (brackets parentheses inlineStyle)
+parenList :: Bool -> [Ast.Expr] -> Ast.Expr
+parenList newlines els =
 
+      let style = Logic.ifElse (Logic.and newlines (Equality.gt (Lists.length els) 1)) halfBlockStyle inlineStyle
+      in (Logic.ifElse (Lists.null els) (cst "()") (brackets parentheses style (commaSep style els)))
+
+parens :: Ast.Expr -> Ast.Expr
+parens = brackets parentheses inlineStyle
+
 parentheses :: Ast.Brackets
-parentheses = Ast.Brackets {
-  Ast.bracketsOpen = (sym "("),
-  Ast.bracketsClose = (sym ")")}
+parentheses =
+    Ast.Brackets {
+      Ast.bracketsOpen = (Ast.Symbol "("),
+      Ast.bracketsClose = (Ast.Symbol ")")}
 
-parenthesize :: (Ast.Expr -> Ast.Expr)
-parenthesize exp =  
-  let assocLeft = (\a -> (\x -> case x of
-          Ast.AssociativityRight -> False
-          _ -> True) a)
-  in  
-    let assocRight = (\a -> (\x -> case x of
-            Ast.AssociativityLeft -> False
-            _ -> True) a)
-    in ((\x -> case x of
-      Ast.ExprBrackets v1 -> (Ast.ExprBrackets (Ast.BracketExpr {
-        Ast.bracketExprBrackets = (Ast.bracketExprBrackets v1),
-        Ast.bracketExprEnclosed = (parenthesize (Ast.bracketExprEnclosed v1)),
-        Ast.bracketExprStyle = (Ast.bracketExprStyle v1)}))
-      Ast.ExprConst _ -> exp
-      Ast.ExprIndent v1 -> (Ast.ExprIndent (Ast.IndentedExpression {
-        Ast.indentedExpressionStyle = (Ast.indentedExpressionStyle v1),
-        Ast.indentedExpressionExpr = (parenthesize (Ast.indentedExpressionExpr v1))}))
-      Ast.ExprOp v1 ->  
-        let op = (Ast.opExprOp v1)
-        in  
-          let prec = (Ast.unPrecedence (Ast.opPrecedence op))
-          in  
-            let assoc = (Ast.opAssociativity op)
-            in  
-              let lhs = (Ast.opExprLhs v1)
-              in  
-                let rhs = (Ast.opExprRhs v1)
-                in  
-                  let lhs_ = (parenthesize lhs)
-                  in  
-                    let rhs_ = (parenthesize rhs)
-                    in  
-                      let lhs2 = ((\x -> case x of
-                              Ast.ExprOp v2 ->  
-                                let lop = (Ast.opExprOp v2)
-                                in  
-                                  let lprec = (Ast.unPrecedence (Ast.opPrecedence lop))
-                                  in  
-                                    let lassoc = (Ast.opAssociativity lop)
-                                    in  
-                                      let comparison = (Equality.compare prec lprec)
-                                      in ((\x -> case x of
-                                        Util.ComparisonLessThan -> lhs_
-                                        Util.ComparisonGreaterThan -> (parens lhs_)
-                                        Util.ComparisonEqualTo -> (Logic.ifElse (Logic.and (assocLeft assoc) (assocLeft lassoc)) lhs_ (parens lhs_))) comparison)
-                              _ -> lhs_) lhs_)
-                      in  
-                        let rhs2 = ((\x -> case x of
-                                Ast.ExprOp v2 ->  
-                                  let rop = (Ast.opExprOp v2)
-                                  in  
-                                    let rprec = (Ast.unPrecedence (Ast.opPrecedence rop))
-                                    in  
-                                      let rassoc = (Ast.opAssociativity rop)
-                                      in  
-                                        let comparison = (Equality.compare prec rprec)
-                                        in ((\x -> case x of
-                                          Util.ComparisonLessThan -> rhs_
-                                          Util.ComparisonGreaterThan -> (parens rhs_)
-                                          Util.ComparisonEqualTo -> (Logic.ifElse (Logic.and (assocRight assoc) (assocRight rassoc)) rhs_ (parens rhs_))) comparison)
-                                _ -> rhs_) rhs_)
-                        in (Ast.ExprOp (Ast.OpExpr {
-                          Ast.opExprOp = op,
-                          Ast.opExprLhs = lhs2,
-                          Ast.opExprRhs = rhs2}))) exp)
+parenthesize :: Ast.Expr -> Ast.Expr
+parenthesize exp =
 
-prefix :: (String -> Ast.Expr -> Ast.Expr)
-prefix p expr =  
-  let preOp = Ast.Op {
-          Ast.opSymbol = (sym p),
-          Ast.opPadding = Ast.Padding {
-            Ast.paddingLeft = Ast.WsNone,
-            Ast.paddingRight = Ast.WsNone},
-          Ast.opPrecedence = (Ast.Precedence 0),
-          Ast.opAssociativity = Ast.AssociativityNone}
-  in (ifx preOp (cst "") expr)
+      let assocLeft =
+              \a -> case a of
+                Ast.AssociativityRight -> False
+                _ -> True
+          assocRight =
+                  \a -> case a of
+                    Ast.AssociativityLeft -> False
+                    _ -> True
+      in case exp of
+        Ast.ExprBrackets v0 -> Ast.ExprBrackets (Ast.BracketExpr {
+          Ast.bracketExprBrackets = (Ast.bracketExprBrackets v0),
+          Ast.bracketExprEnclosed = (parenthesize (Ast.bracketExprEnclosed v0)),
+          Ast.bracketExprStyle = (Ast.bracketExprStyle v0)})
+        Ast.ExprConst _ -> exp
+        Ast.ExprIndent v0 -> Ast.ExprIndent (Ast.IndentedExpression {
+          Ast.indentedExpressionStyle = (Ast.indentedExpressionStyle v0),
+          Ast.indentedExpressionExpr = (parenthesize (Ast.indentedExpressionExpr v0))})
+        Ast.ExprSeq v0 -> Ast.ExprSeq (Ast.SeqExpr {
+          Ast.seqExprOp = (Ast.seqExprOp v0),
+          Ast.seqExprElements = (Lists.map parenthesize (Ast.seqExprElements v0))})
+        Ast.ExprOp v0 ->
+          let op = Ast.opExprOp v0
+              prec = Ast.unPrecedence (Ast.opPrecedence op)
+              assoc = Ast.opAssociativity op
+              lhs = Ast.opExprLhs v0
+              rhs = Ast.opExprRhs v0
+              lhs_ = parenthesize lhs
+              rhs_ = parenthesize rhs
+              lhs2 =
+                      case lhs_ of
+                        Ast.ExprOp v1 ->
+                          let lop = Ast.opExprOp v1
+                              lprec = Ast.unPrecedence (Ast.opPrecedence lop)
+                              lassoc = Ast.opAssociativity lop
+                              comparison = Equality.compare prec lprec
+                          in case comparison of
+                            Util.ComparisonLessThan -> lhs_
+                            Util.ComparisonGreaterThan -> parens lhs_
+                            Util.ComparisonEqualTo -> Logic.ifElse (Logic.and (assocLeft assoc) (assocLeft lassoc)) lhs_ (parens lhs_)
+                        _ -> lhs_
+              rhs2 =
+                      case rhs_ of
+                        Ast.ExprOp v1 ->
+                          let rop = Ast.opExprOp v1
+                              rprec = Ast.unPrecedence (Ast.opPrecedence rop)
+                              rassoc = Ast.opAssociativity rop
+                              comparison = Equality.compare prec rprec
+                          in case comparison of
+                            Util.ComparisonLessThan -> rhs_
+                            Util.ComparisonGreaterThan -> parens rhs_
+                            Util.ComparisonEqualTo -> Logic.ifElse (Logic.and (assocRight assoc) (assocRight rassoc)) rhs_ (parens rhs_)
+                        _ -> rhs_
+          in (Ast.ExprOp (Ast.OpExpr {
+            Ast.opExprOp = op,
+            Ast.opExprLhs = lhs2,
+            Ast.opExprRhs = rhs2}))
 
-printExpr :: (Ast.Expr -> String)
-printExpr e =  
-  let pad = (\ws -> (\x -> case x of
-          Ast.WsNone -> ""
-          Ast.WsSpace -> " "
-          Ast.WsBreak -> "\n"
-          Ast.WsBreakAndIndent _ -> "\n"
-          Ast.WsDoubleBreak -> "\n\n") ws)
-  in  
-    let idt = (\ws -> \s -> (\x -> case x of
-            Ast.WsBreakAndIndent v1 -> (customIndent v1 s)
-            _ -> s) ws)
-    in ((\x -> case x of
-      Ast.ExprConst v1 -> (Ast.unSymbol v1)
-      Ast.ExprIndent v1 ->  
-        let style = (Ast.indentedExpressionStyle v1)
-        in  
-          let expr = (Ast.indentedExpressionExpr v1)
-          in  
-            let lns = (Strings.lines (printExpr expr))
-            in  
-              let ilns = ((\x -> case x of
-                      Ast.IndentStyleAllLines v2 -> (Lists.map (\line -> Strings.cat2 v2 line) lns)
-                      Ast.IndentStyleSubsequentLines v2 -> (Logic.ifElse (Equality.equal (Lists.length lns) 1) lns (Lists.cons (Lists.head lns) (Lists.map (\line -> Strings.cat2 v2 line) (Lists.tail lns))))) style)
-              in (Strings.intercalate "\n" ilns)
-      Ast.ExprOp v1 ->  
-        let op = (Ast.opExprOp v1)
-        in  
-          let sym = (Ast.unSymbol (Ast.opSymbol op))
-          in  
-            let padding = (Ast.opPadding op)
-            in  
-              let padl = (Ast.paddingLeft padding)
-              in  
-                let padr = (Ast.paddingRight padding)
-                in  
-                  let l = (Ast.opExprLhs v1)
-                  in  
-                    let r = (Ast.opExprRhs v1)
-                    in  
-                      let lhs = (idt padl (printExpr l))
-                      in  
-                        let rhs = (idt padr (printExpr r))
-                        in (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 lhs (pad padl)) sym) (pad padr)) rhs)
-      Ast.ExprBrackets v1 ->  
-        let brackets = (Ast.bracketExprBrackets v1)
-        in  
-          let l = (Ast.unSymbol (Ast.bracketsOpen brackets))
-          in  
-            let r = (Ast.unSymbol (Ast.bracketsClose brackets))
-            in  
-              let e = (Ast.bracketExprEnclosed v1)
-              in  
-                let style = (Ast.bracketExprStyle v1)
-                in  
-                  let body = (printExpr e)
-                  in  
-                    let doIndent = (Ast.blockStyleIndent style)
-                    in  
-                      let nlBefore = (Ast.blockStyleNewlineBeforeContent style)
-                      in  
-                        let nlAfter = (Ast.blockStyleNewlineAfterContent style)
-                        in  
-                          let ibody = (Maybes.maybe body (\idt -> customIndent idt body) doIndent)
-                          in  
-                            let pre = (Logic.ifElse nlBefore "\n" "")
-                            in  
-                              let suf = (Logic.ifElse nlAfter "\n" "")
-                              in (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 l pre) ibody) suf) r)) e)
+prefix :: String -> Ast.Expr -> Ast.Expr
+prefix p expr =
 
-semicolonSep :: ([Ast.Expr] -> Ast.Expr)
-semicolonSep = (symbolSep ";" inlineStyle)
+      let preOp =
+              Ast.Op {
+                Ast.opSymbol = (sym p),
+                Ast.opPadding = Ast.Padding {
+                  Ast.paddingLeft = Ast.WsNone,
+                  Ast.paddingRight = Ast.WsNone},
+                Ast.opPrecedence = (Ast.Precedence 0),
+                Ast.opAssociativity = Ast.AssociativityNone}
+      in (ifx preOp (cst "") expr)
 
-sep :: (Ast.Op -> [Ast.Expr] -> Ast.Expr)
-sep op els = (Maybes.maybe (cst "") (\h -> Lists.foldl (\acc -> \el -> ifx op acc el) h (Lists.drop 1 els)) (Lists.safeHead els))
+printExpr :: Ast.Expr -> String
+printExpr e =
 
-spaceSep :: ([Ast.Expr] -> Ast.Expr)
-spaceSep = (sep (Ast.Op {
-  Ast.opSymbol = (sym ""),
-  Ast.opPadding = Ast.Padding {
-    Ast.paddingLeft = Ast.WsSpace,
-    Ast.paddingRight = Ast.WsNone},
-  Ast.opPrecedence = (Ast.Precedence 0),
-  Ast.opAssociativity = Ast.AssociativityNone}))
+      let pad =
+              \ws -> case ws of
+                Ast.WsNone -> ""
+                Ast.WsSpace -> " "
+                Ast.WsBreak -> "\n"
+                Ast.WsBreakAndIndent _ -> "\n"
+                Ast.WsDoubleBreak -> "\n\n"
+          idt =
+                  \ws -> \s -> case ws of
+                    Ast.WsBreakAndIndent v0 -> customIndent v0 s
+                    _ -> s
+      in case e of
+        Ast.ExprConst v0 -> Ast.unSymbol v0
+        Ast.ExprIndent v0 ->
+          let style = Ast.indentedExpressionStyle v0
+              expr = Ast.indentedExpressionExpr v0
+              lns = Strings.lines (printExpr expr)
+              ilns =
+                      case style of
+                        Ast.IndentStyleAllLines v1 -> Lists.map (\line -> Strings.cat2 v1 line) lns
+                        Ast.IndentStyleSubsequentLines v1 -> Logic.ifElse (Equality.equal (Lists.length lns) 1) lns (Lists.cons (Lists.head lns) (Lists.map (\line -> Strings.cat2 v1 line) (Lists.tail lns)))
+          in (Strings.intercalate "\n" ilns)
+        Ast.ExprSeq v0 ->
+          let sop = Ast.seqExprOp v0
+              ssym = Ast.unSymbol (Ast.opSymbol sop)
+              spadding = Ast.opPadding sop
+              spadl = Ast.paddingLeft spadding
+              spadr = Ast.paddingRight spadding
+              selements = Ast.seqExprElements v0
+              separator = Strings.cat2 (Strings.cat2 (pad spadl) ssym) (pad spadr)
+              printedElements = Lists.map (\el -> idt spadr (printExpr el)) selements
+          in (Strings.intercalate separator printedElements)
+        Ast.ExprOp v0 ->
+          let op = Ast.opExprOp v0
+              sym = Ast.unSymbol (Ast.opSymbol op)
+              padding = Ast.opPadding op
+              padl = Ast.paddingLeft padding
+              padr = Ast.paddingRight padding
+              l = Ast.opExprLhs v0
+              r = Ast.opExprRhs v0
+              lhs = idt padl (printExpr l)
+              rhs = idt padr (printExpr r)
+          in (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 lhs (pad padl)) sym) (pad padr)) rhs)
+        Ast.ExprBrackets v0 ->
+          let brs = Ast.bracketExprBrackets v0
+              l = Ast.unSymbol (Ast.bracketsOpen brs)
+              r = Ast.unSymbol (Ast.bracketsClose brs)
+              e = Ast.bracketExprEnclosed v0
+              style = Ast.bracketExprStyle v0
+              body = printExpr e
+              doIndent = Ast.blockStyleIndent style
+              nlBefore = Ast.blockStyleNewlineBeforeContent style
+              nlAfter = Ast.blockStyleNewlineAfterContent style
+              ibody = Maybes.maybe body (\idt -> customIndent idt body) doIndent
+              pre = Logic.ifElse nlBefore "\n" ""
+              suf = Logic.ifElse nlAfter "\n" ""
+          in (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 l pre) ibody) suf) r)
 
+semicolonSep :: [Ast.Expr] -> Ast.Expr
+semicolonSep = symbolSep ";" inlineStyle
+
+sep :: Ast.Op -> [Ast.Expr] -> Ast.Expr
+sep op els =
+    Maybes.maybe (cst "") (\h -> Lists.foldl (\acc -> \el -> ifx op acc el) h (Lists.drop 1 els)) (Lists.safeHead els)
+
+spaceSep :: [Ast.Expr] -> Ast.Expr
+spaceSep =
+    sep (Ast.Op {
+      Ast.opSymbol = (sym ""),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsSpace,
+        Ast.paddingRight = Ast.WsNone},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityNone})
+
 squareBrackets :: Ast.Brackets
-squareBrackets = Ast.Brackets {
-  Ast.bracketsOpen = (sym "["),
-  Ast.bracketsClose = (sym "]")}
+squareBrackets =
+    Ast.Brackets {
+      Ast.bracketsOpen = (Ast.Symbol "["),
+      Ast.bracketsClose = (Ast.Symbol "]")}
 
+-- | Like sep, but produces a SeqExpr instead of an OpExpr chain. SeqExpr is treated as structural layout and is not subject to parenthesization.
+structuralSep :: Ast.Op -> [Ast.Expr] -> Ast.Expr
+structuralSep op els =
+    Logic.ifElse (Lists.null els) (cst "") (Logic.ifElse (Equality.equal (Lists.length els) 1) (Lists.head els) (Ast.ExprSeq (Ast.SeqExpr {
+      Ast.seqExprOp = op,
+      Ast.seqExprElements = els})))
+
+-- | Like spaceSep, but produces a SeqExpr. Use for structural layout that should not trigger parenthesization of children.
+structuralSpaceSep :: [Ast.Expr] -> Ast.Expr
+structuralSpaceSep =
+    structuralSep (Ast.Op {
+      Ast.opSymbol = (sym ""),
+      Ast.opPadding = Ast.Padding {
+        Ast.paddingLeft = Ast.WsSpace,
+        Ast.paddingRight = Ast.WsNone},
+      Ast.opPrecedence = (Ast.Precedence 0),
+      Ast.opAssociativity = Ast.AssociativityNone})
+
 -- | Append a suffix string to an expression
-suffix :: (String -> Ast.Expr -> Ast.Expr)
-suffix s expr =  
-  let sufOp = Ast.Op {
-          Ast.opSymbol = (sym s),
-          Ast.opPadding = Ast.Padding {
-            Ast.paddingLeft = Ast.WsNone,
-            Ast.paddingRight = Ast.WsNone},
-          Ast.opPrecedence = (Ast.Precedence 0),
-          Ast.opAssociativity = Ast.AssociativityNone}
-  in (ifx sufOp expr (cst ""))
+suffix :: String -> Ast.Expr -> Ast.Expr
+suffix s expr =
 
-sym :: (String -> Ast.Symbol)
-sym s = (Ast.Symbol s)
+      let sufOp =
+              Ast.Op {
+                Ast.opSymbol = (sym s),
+                Ast.opPadding = Ast.Padding {
+                  Ast.paddingLeft = Ast.WsNone,
+                  Ast.paddingRight = Ast.WsNone},
+                Ast.opPrecedence = (Ast.Precedence 0),
+                Ast.opAssociativity = Ast.AssociativityNone}
+      in (ifx sufOp expr (cst ""))
 
-symbolSep :: (String -> Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr)
-symbolSep symb style l =  
-  let breakCount = (Lists.length (Lists.filter (\x_ -> x_) [
-          Ast.blockStyleNewlineBeforeContent style,
-          (Ast.blockStyleNewlineAfterContent style)]))
-  in  
-    let break = (Logic.ifElse (Equality.equal breakCount 0) Ast.WsSpace (Logic.ifElse (Equality.equal breakCount 1) Ast.WsBreak Ast.WsDoubleBreak))
-    in  
-      let commaOp = Ast.Op {
-              Ast.opSymbol = (sym symb),
-              Ast.opPadding = Ast.Padding {
-                Ast.paddingLeft = Ast.WsNone,
-                Ast.paddingRight = break},
-              Ast.opPrecedence = (Ast.Precedence 0),
-              Ast.opAssociativity = Ast.AssociativityNone}
+sym :: String -> Ast.Symbol
+sym s = Ast.Symbol s
+
+symbolSep :: String -> Ast.BlockStyle -> [Ast.Expr] -> Ast.Expr
+symbolSep symb style l =
+
+      let breakCount =
+              Lists.length (Lists.filter (\x_ -> x_) [
+                Ast.blockStyleNewlineBeforeContent style,
+                (Ast.blockStyleNewlineAfterContent style)])
+          break =
+                  Logic.ifElse (Equality.equal breakCount 0) Ast.WsSpace (Logic.ifElse (Equality.equal breakCount 1) Ast.WsBreak Ast.WsDoubleBreak)
+          commaOp =
+                  Ast.Op {
+                    Ast.opSymbol = (sym symb),
+                    Ast.opPadding = Ast.Padding {
+                      Ast.paddingLeft = Ast.WsNone,
+                      Ast.paddingRight = break},
+                    Ast.opPrecedence = (Ast.Precedence 0),
+                    Ast.opAssociativity = Ast.AssociativityNone}
       in (Maybes.maybe (cst "") (\h -> Lists.foldl (\acc -> \el -> ifx commaOp acc el) h (Lists.drop 1 l)) (Lists.safeHead l))
 
-tabIndent :: (Ast.Expr -> Ast.Expr)
-tabIndent e = (Ast.ExprIndent (Ast.IndentedExpression {
-  Ast.indentedExpressionStyle = (Ast.IndentStyleAllLines "    "),
-  Ast.indentedExpressionExpr = e}))
+tabIndent :: Ast.Expr -> Ast.Expr
+tabIndent e =
+    Ast.ExprIndent (Ast.IndentedExpression {
+      Ast.indentedExpressionStyle = (Ast.IndentStyleAllLines "    "),
+      Ast.indentedExpressionExpr = e})
 
-tabIndentDoubleSpace :: ([Ast.Expr] -> Ast.Expr)
-tabIndentDoubleSpace exprs = (tabIndent (doubleNewlineSep exprs))
+tabIndentDoubleSpace :: [Ast.Expr] -> Ast.Expr
+tabIndentDoubleSpace exprs = tabIndent (doubleNewlineSep exprs)
 
-tabIndentSingleSpace :: ([Ast.Expr] -> Ast.Expr)
-tabIndentSingleSpace exprs = (tabIndent (newlineSep exprs))
+tabIndentSingleSpace :: [Ast.Expr] -> Ast.Expr
+tabIndentSingleSpace exprs = tabIndent (newlineSep exprs)
 
-unsupportedType :: (String -> Ast.Expr)
-unsupportedType label = (cst (Strings.cat2 (Strings.cat2 "[" label) "]"))
+unsupportedType :: String -> Ast.Expr
+unsupportedType label = cst (Strings.cat2 (Strings.cat2 "[" label) "]")
 
-unsupportedVariant :: (String -> String -> Ast.Expr)
-unsupportedVariant label obj = (cst (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "[unsupported " label) ": ") (Literals.showString obj)) "]"))
+unsupportedVariant :: String -> String -> Ast.Expr
+unsupportedVariant label obj =
+    cst (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "[unsupported " label) ": ") (Literals.showString obj)) "]")
 
-withComma :: (Ast.Expr -> Ast.Expr)
-withComma e = (noSep [
-  e,
-  (cst ",")])
+withComma :: Ast.Expr -> Ast.Expr
+withComma e =
+    noSep [
+      e,
+      (cst ",")]
 
-withSemi :: (Ast.Expr -> Ast.Expr)
-withSemi e = (noSep [
-  e,
-  (cst ";")])
+withSemi :: Ast.Expr -> Ast.Expr
+withSemi e =
+    noSep [
+      e,
+      (cst ";")]
diff --git a/src/gen-main/haskell/Hydra/Show/Accessors.hs b/src/gen-main/haskell/Hydra/Show/Accessors.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Show/Accessors.hs
+++ /dev/null
@@ -1,112 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Utilities for working with term accessors.
-
-module Hydra.Show.Accessors where
-
-import qualified Hydra.Accessors as Accessors
-import qualified Hydra.Core as Core
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Module as Module
-import qualified Hydra.Names as Names
-import qualified Hydra.Rewriting as Rewriting
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Convert a term accessor to a string representation
-termAccessor :: (Accessors.TermAccessor -> Maybe String)
-termAccessor accessor =  
-  let idx = (\i -> Nothing)
-  in  
-    let idxSuff = (\suffix -> \i -> Maybes.map (\s -> Strings.cat2 s suffix) (idx i))
-    in ((\x -> case x of
-      Accessors.TermAccessorAnnotatedBody -> Nothing
-      Accessors.TermAccessorApplicationFunction -> (Just "fun")
-      Accessors.TermAccessorApplicationArgument -> (Just "arg")
-      Accessors.TermAccessorLambdaBody -> (Just "body")
-      Accessors.TermAccessorUnionCasesDefault -> (Just "default")
-      Accessors.TermAccessorUnionCasesBranch v1 -> (Just (Strings.cat2 "." (Core.unName v1)))
-      Accessors.TermAccessorLetBody -> (Just "in")
-      Accessors.TermAccessorLetBinding v1 -> (Just (Strings.cat2 (Core.unName v1) "="))
-      Accessors.TermAccessorListElement v1 -> (idx v1)
-      Accessors.TermAccessorMapKey v1 -> (idxSuff ".key" v1)
-      Accessors.TermAccessorMapValue v1 -> (idxSuff ".value" v1)
-      Accessors.TermAccessorMaybeTerm -> (Just "just")
-      Accessors.TermAccessorProductTerm v1 -> (idx v1)
-      Accessors.TermAccessorRecordField v1 -> (Just (Strings.cat2 "." (Core.unName v1)))
-      Accessors.TermAccessorSetElement v1 -> (idx v1)
-      Accessors.TermAccessorSumTerm -> Nothing
-      Accessors.TermAccessorTypeLambdaBody -> Nothing
-      Accessors.TermAccessorTypeApplicationTerm -> Nothing
-      Accessors.TermAccessorInjectionTerm -> Nothing
-      Accessors.TermAccessorWrappedTerm -> Nothing) accessor)
-
--- | Build an accessor graph from a term
-termToAccessorGraph :: (M.Map Module.Namespace String -> Core.Term -> Accessors.AccessorGraph)
-termToAccessorGraph namespaces term =  
-  let dontCareAccessor = Accessors.TermAccessorAnnotatedBody 
-      helper = (\ids -> \mroot -> \path -> \state -> \accessorTerm ->  
-              let accessor = (Pairs.first accessorTerm) 
-                  currentTerm = (Pairs.second accessorTerm)
-                  nodesEdges = (Pairs.first state)
-                  visited = (Pairs.second state)
-                  nodes = (Pairs.first nodesEdges)
-                  edges = (Pairs.second nodesEdges)
-                  nextPath = (Lists.cons accessor path)
-              in ((\x -> case x of
-                Core.TermLet v1 ->  
-                  let bindings = (Core.letBindings v1) 
-                      env = (Core.letBody v1)
-                      bindingNames = (Lists.map Core.bindingName bindings)
-                      addBindingName = (\nodesVisitedIds -> \name ->  
-                              let currentNodesVisited = (Pairs.first nodesVisitedIds) 
-                                  currentIds = (Pairs.second nodesVisitedIds)
-                                  currentNodes = (Pairs.first currentNodesVisited)
-                                  currentVisited = (Pairs.second currentNodesVisited)
-                                  rawLabel = (Names.compactName namespaces name)
-                                  uniqueLabel = (Names.uniqueLabel currentVisited rawLabel)
-                                  node = Accessors.AccessorNode {
-                                          Accessors.accessorNodeName = name,
-                                          Accessors.accessorNodeLabel = rawLabel,
-                                          Accessors.accessorNodeId = uniqueLabel}
-                                  newVisited = (Sets.insert uniqueLabel currentVisited)
-                                  newNodes = (Lists.cons node currentNodes)
-                                  newIds = (Maps.insert name node currentIds)
-                              in ((newNodes, newVisited), newIds))
-                      nodesVisitedIds1 = (Lists.foldl addBindingName (([], visited), ids) bindingNames)
-                      nodes1 = (Pairs.first (Pairs.first nodesVisitedIds1))
-                      visited1 = (Pairs.second (Pairs.first nodesVisitedIds1))
-                      ids1 = (Pairs.second nodesVisitedIds1)
-                      addBindingTerm = (\currentState -> \nodeBinding ->  
-                              let root = (Pairs.first nodeBinding) 
-                                  binding = (Pairs.second nodeBinding)
-                                  term1 = (Core.bindingTerm binding)
-                              in (helper ids1 (Just root) [] currentState (dontCareAccessor, term1)))
-                      nodeBindingPairs = (Lists.zip nodes1 bindings)
-                      stateAfterBindings = (Lists.foldl addBindingTerm ((Lists.concat2 nodes1 nodes, edges), visited1) nodeBindingPairs)
-                  in (helper ids1 mroot nextPath stateAfterBindings (Accessors.TermAccessorLetBody, env))
-                Core.TermVariable v1 -> (Maybes.maybe state (\root -> Maybes.maybe state (\node ->  
-                  let edge = Accessors.AccessorEdge {
-                          Accessors.accessorEdgeSource = root,
-                          Accessors.accessorEdgePath = (Accessors.AccessorPath (Lists.reverse nextPath)),
-                          Accessors.accessorEdgeTarget = node} 
-                      newEdges = (Lists.cons edge edges)
-                  in ((nodes, newEdges), visited)) (Maps.lookup v1 ids)) mroot)
-                _ -> (Lists.foldl (helper ids mroot nextPath) state (Rewriting.subtermsWithAccessors currentTerm))) currentTerm))
-      initialState = (([], []), Sets.empty)
-      result = (helper Maps.empty Nothing [] initialState (dontCareAccessor, term))
-      finalNodesEdges = (Pairs.first result)
-      finalNodes = (Pairs.first finalNodesEdges)
-      finalEdges = (Pairs.second finalNodesEdges)
-  in Accessors.AccessorGraph {
-    Accessors.accessorGraphNodes = finalNodes,
-    Accessors.accessorGraphEdges = finalEdges}
diff --git a/src/gen-main/haskell/Hydra/Show/Core.hs b/src/gen-main/haskell/Hydra/Show/Core.hs
--- a/src/gen-main/haskell/Hydra/Show/Core.hs
+++ b/src/gen-main/haskell/Hydra/Show/Core.hs
@@ -21,21 +21,17 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | A placeholder for reading terms from their serialized form. Not implemented.
-readTerm :: (String -> Maybe Core.Term)
-readTerm s = (Just (Core.TermLiteral (Core.LiteralString s)))
-
 -- | Show a binding as a string
-binding :: (Core.Binding -> String)
-binding el =  
-  let name = (Core.unName (Core.bindingName el))
-  in  
-    let t = (Core.bindingTerm el)
-    in  
-      let typeStr = (Maybes.maybe "" (\ts -> Strings.cat [
-              ":(",
-              (typeScheme ts),
-              ")"]) (Core.bindingType el))
+binding :: Core.Binding -> String
+binding el =
+
+      let name = Core.unName (Core.bindingName el)
+          t = Core.bindingTerm el
+          typeStr =
+                  Maybes.maybe "" (\ts -> Strings.cat [
+                    ":(",
+                    (typeScheme ts),
+                    ")"]) (Core.bindingType el)
       in (Strings.cat [
         name,
         typeStr,
@@ -43,157 +39,158 @@
         (term t)])
 
 -- | Show an elimination as a string
-elimination :: (Core.Elimination -> String)
-elimination elm = ((\x -> case x of
-  Core.EliminationRecord v1 ->  
-    let tname = (Core.unName (Core.projectionTypeName v1))
-    in  
-      let fname = (Core.unName (Core.projectionField v1))
+elimination :: Core.Elimination -> String
+elimination elm =
+    case elm of
+      Core.EliminationRecord v0 ->
+        let tname = Core.unName (Core.projectionTypeName v0)
+            fname = Core.unName (Core.projectionField v0)
+        in (Strings.cat [
+          "project(",
+          tname,
+          "){",
+          fname,
+          "}"])
+      Core.EliminationUnion v0 ->
+        let tname = Core.unName (Core.caseStatementTypeName v0)
+            mdef = Core.caseStatementDefault v0
+            cases = Core.caseStatementCases v0
+            defaultField =
+                    Maybes.maybe [] (\d -> [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "[default]"),
+                        Core.fieldTerm = d}]) mdef
+            allFields =
+                    Lists.concat [
+                      cases,
+                      defaultField]
+        in (Strings.cat [
+          "case(",
+          tname,
+          ")",
+          (fields allFields)])
+      Core.EliminationWrap v0 -> Strings.cat [
+        "unwrap(",
+        (Core.unName v0),
+        ")"]
+
+field :: Core.Field -> String
+field field =
+
+      let fname = Core.unName (Core.fieldName field)
+          fterm = Core.fieldTerm field
       in (Strings.cat [
-        "project(",
-        tname,
-        "){",
         fname,
-        "}"])
-  Core.EliminationUnion v1 ->  
-    let tname = (Core.unName (Core.caseStatementTypeName v1))
-    in  
-      let mdef = (Core.caseStatementDefault v1)
-      in  
-        let cases = (Core.caseStatementCases v1)
-        in  
-          let defaultField = (Maybes.maybe [] (\d -> [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "[default]"),
-                    Core.fieldTerm = d}]) mdef)
-          in  
-            let allFields = (Lists.concat [
-                    cases,
-                    defaultField])
-            in (Strings.cat [
-              "case(",
-              tname,
-              ")",
-              (fields allFields)])
-  Core.EliminationWrap v1 -> (Strings.cat [
-    "unwrap(",
-    (Core.unName v1),
-    ")"])) elm)
+        "=",
+        (term fterm)])
 
-field :: (Core.Field -> String)
-field field =  
-  let fname = (Core.unName (Core.fieldName field))
-  in  
-    let fterm = (Core.fieldTerm field)
-    in (Strings.cat [
-      fname,
-      "=",
-      (term fterm)])
+fieldType :: Core.FieldType -> String
+fieldType ft =
 
-fieldType :: (Core.FieldType -> String)
-fieldType ft =  
-  let fname = (Core.unName (Core.fieldTypeName ft))
-  in  
-    let ftyp = (Core.fieldTypeType ft)
-    in (Strings.cat [
-      fname,
-      ":",
-      (type_ ftyp)])
+      let fname = Core.unName (Core.fieldTypeName ft)
+          ftyp = Core.fieldTypeType ft
+      in (Strings.cat [
+        fname,
+        ":",
+        (type_ ftyp)])
 
 -- | Show a list of fields as a string
-fields :: ([Core.Field] -> String)
-fields flds =  
-  let fieldStrs = (Lists.map field flds)
-  in (Strings.cat [
-    "{",
-    (Strings.intercalate ", " fieldStrs),
-    "}"])
+fields :: [Core.Field] -> String
+fields flds =
 
+      let fieldStrs = Lists.map field flds
+      in (Strings.cat [
+        "{",
+        (Strings.intercalate ", " fieldStrs),
+        "}"])
+
 -- | Show a float value as a string
-float :: (Core.FloatValue -> String)
-float fv = ((\x -> case x of
-  Core.FloatValueBigfloat v1 -> (Strings.cat2 (Literals.showBigfloat v1) ":bigfloat")
-  Core.FloatValueFloat32 v1 -> (Strings.cat2 (Literals.showFloat32 v1) ":float32")
-  Core.FloatValueFloat64 v1 -> (Strings.cat2 (Literals.showFloat64 v1) ":float64")) fv)
+float :: Core.FloatValue -> String
+float fv =
+    case fv of
+      Core.FloatValueBigfloat v0 -> Strings.cat2 (Literals.showBigfloat v0) ":bigfloat"
+      Core.FloatValueFloat32 v0 -> Strings.cat2 (Literals.showFloat32 v0) ":float32"
+      Core.FloatValueFloat64 v0 -> Strings.cat2 (Literals.showFloat64 v0) ":float64"
 
 -- | Show a float type as a string
-floatType :: (Core.FloatType -> String)
-floatType ft = ((\x -> case x of
-  Core.FloatTypeBigfloat -> "bigfloat"
-  Core.FloatTypeFloat32 -> "float32"
-  Core.FloatTypeFloat64 -> "float64") ft)
+floatType :: Core.FloatType -> String
+floatType ft =
+    case ft of
+      Core.FloatTypeBigfloat -> "bigfloat"
+      Core.FloatTypeFloat32 -> "float32"
+      Core.FloatTypeFloat64 -> "float64"
 
 -- | Show a function as a string
-function :: (Core.Function -> String)
-function f = ((\x -> case x of
-  Core.FunctionElimination v1 -> (elimination v1)
-  Core.FunctionLambda v1 -> (lambda v1)
-  Core.FunctionPrimitive v1 -> (Strings.cat2 (Core.unName v1) "!")) f)
+function :: Core.Function -> String
+function f =
+    case f of
+      Core.FunctionElimination v0 -> elimination v0
+      Core.FunctionLambda v0 -> lambda v0
+      Core.FunctionPrimitive v0 -> Strings.cat2 (Core.unName v0) "!"
 
 -- | Show an injection as a string
-injection :: (Core.Injection -> String)
-injection inj =  
-  let tname = (Core.injectionTypeName inj)
-  in  
-    let f = (Core.injectionField inj)
-    in (Strings.cat [
-      "inject(",
-      (Core.unName tname),
-      ")",
-      (fields [
-        f])])
+injection :: Core.Injection -> String
+injection inj =
 
+      let tname = Core.injectionTypeName inj
+          f = Core.injectionField inj
+      in (Strings.cat [
+        "inject(",
+        (Core.unName tname),
+        ")",
+        (fields [
+          f])])
+
 -- | Show an integer value as a string
-integer :: (Core.IntegerValue -> String)
-integer iv = ((\x -> case x of
-  Core.IntegerValueBigint v1 -> (Strings.cat2 (Literals.showBigint v1) ":bigint")
-  Core.IntegerValueInt8 v1 -> (Strings.cat2 (Literals.showInt8 v1) ":int8")
-  Core.IntegerValueInt16 v1 -> (Strings.cat2 (Literals.showInt16 v1) ":int16")
-  Core.IntegerValueInt32 v1 -> (Strings.cat2 (Literals.showInt32 v1) ":int32")
-  Core.IntegerValueInt64 v1 -> (Strings.cat2 (Literals.showInt64 v1) ":int64")
-  Core.IntegerValueUint8 v1 -> (Strings.cat2 (Literals.showUint8 v1) ":uint8")
-  Core.IntegerValueUint16 v1 -> (Strings.cat2 (Literals.showUint16 v1) ":uint16")
-  Core.IntegerValueUint32 v1 -> (Strings.cat2 (Literals.showUint32 v1) ":uint32")
-  Core.IntegerValueUint64 v1 -> (Strings.cat2 (Literals.showUint64 v1) ":uint64")) iv)
+integer :: Core.IntegerValue -> String
+integer iv =
+    case iv of
+      Core.IntegerValueBigint v0 -> Strings.cat2 (Literals.showBigint v0) ":bigint"
+      Core.IntegerValueInt8 v0 -> Strings.cat2 (Literals.showInt8 v0) ":int8"
+      Core.IntegerValueInt16 v0 -> Strings.cat2 (Literals.showInt16 v0) ":int16"
+      Core.IntegerValueInt32 v0 -> Strings.cat2 (Literals.showInt32 v0) ":int32"
+      Core.IntegerValueInt64 v0 -> Strings.cat2 (Literals.showInt64 v0) ":int64"
+      Core.IntegerValueUint8 v0 -> Strings.cat2 (Literals.showUint8 v0) ":uint8"
+      Core.IntegerValueUint16 v0 -> Strings.cat2 (Literals.showUint16 v0) ":uint16"
+      Core.IntegerValueUint32 v0 -> Strings.cat2 (Literals.showUint32 v0) ":uint32"
+      Core.IntegerValueUint64 v0 -> Strings.cat2 (Literals.showUint64 v0) ":uint64"
 
 -- | Show an integer type as a string
-integerType :: (Core.IntegerType -> String)
-integerType it = ((\x -> case x of
-  Core.IntegerTypeBigint -> "bigint"
-  Core.IntegerTypeInt8 -> "int8"
-  Core.IntegerTypeInt16 -> "int16"
-  Core.IntegerTypeInt32 -> "int32"
-  Core.IntegerTypeInt64 -> "int64"
-  Core.IntegerTypeUint8 -> "uint8"
-  Core.IntegerTypeUint16 -> "uint16"
-  Core.IntegerTypeUint32 -> "uint32"
-  Core.IntegerTypeUint64 -> "uint64") it)
+integerType :: Core.IntegerType -> String
+integerType it =
+    case it of
+      Core.IntegerTypeBigint -> "bigint"
+      Core.IntegerTypeInt8 -> "int8"
+      Core.IntegerTypeInt16 -> "int16"
+      Core.IntegerTypeInt32 -> "int32"
+      Core.IntegerTypeInt64 -> "int64"
+      Core.IntegerTypeUint8 -> "uint8"
+      Core.IntegerTypeUint16 -> "uint16"
+      Core.IntegerTypeUint32 -> "uint32"
+      Core.IntegerTypeUint64 -> "uint64"
 
 -- | Show a lambda as a string
-lambda :: (Core.Lambda -> String)
-lambda l =  
-  let v = (Core.unName (Core.lambdaParameter l))
-  in  
-    let mt = (Core.lambdaDomain l)
-    in  
-      let body = (Core.lambdaBody l)
-      in  
-        let typeStr = (Maybes.maybe "" (\t -> Strings.cat2 ":" (type_ t)) mt)
-        in (Strings.cat [
-          "\955",
-          v,
-          typeStr,
-          ".",
-          (term body)])
+lambda :: Core.Lambda -> String
+lambda l =
 
+      let v = Core.unName (Core.lambdaParameter l)
+          mt = Core.lambdaDomain l
+          body = Core.lambdaBody l
+          typeStr = Maybes.maybe "" (\t -> Strings.cat2 ":" (type_ t)) mt
+      in (Strings.cat [
+        "\955",
+        v,
+        typeStr,
+        ".",
+        (term body)])
+
 -- | Show a let expression as a string
-let_ :: (Core.Let -> String)
-let_ l =  
-  let bindings = (Core.letBindings l)
-  in  
-    let env = (Core.letBody l)
-    in  
-      let bindingStrs = (Lists.map binding bindings)
+let_ :: Core.Let -> String
+let_ l =
+
+      let bindings = Core.letBindings l
+          env = Core.letBody l
+          bindingStrs = Lists.map binding bindings
       in (Strings.cat [
         "let ",
         (Strings.intercalate ", " bindingStrs),
@@ -201,260 +198,262 @@
         (term env)])
 
 -- | Show a list using a given function to show each element
-list :: ((t0 -> String) -> [t0] -> String)
-list f xs =  
-  let elementStrs = (Lists.map f xs)
-  in (Strings.cat [
-    "[",
-    (Strings.intercalate ", " elementStrs),
-    "]"])
+list :: (t0 -> String) -> [t0] -> String
+list f xs =
 
+      let elementStrs = Lists.map f xs
+      in (Strings.cat [
+        "[",
+        (Strings.intercalate ", " elementStrs),
+        "]"])
+
 -- | Show a literal as a string
-literal :: (Core.Literal -> String)
-literal l = ((\x -> case x of
-  Core.LiteralBinary _ -> "[binary]"
-  Core.LiteralBoolean v1 -> (Logic.ifElse v1 "true" "false")
-  Core.LiteralFloat v1 -> (float v1)
-  Core.LiteralInteger v1 -> (integer v1)
-  Core.LiteralString v1 -> (Literals.showString v1)) l)
+literal :: Core.Literal -> String
+literal l =
+    case l of
+      Core.LiteralBinary _ -> "[binary]"
+      Core.LiteralBoolean v0 -> Logic.ifElse v0 "true" "false"
+      Core.LiteralFloat v0 -> float v0
+      Core.LiteralInteger v0 -> integer v0
+      Core.LiteralString v0 -> Literals.showString v0
 
 -- | Show a literal type as a string
-literalType :: (Core.LiteralType -> String)
-literalType lt = ((\x -> case x of
-  Core.LiteralTypeBinary -> "binary"
-  Core.LiteralTypeBoolean -> "boolean"
-  Core.LiteralTypeFloat v1 -> (floatType v1)
-  Core.LiteralTypeInteger v1 -> (integerType v1)
-  Core.LiteralTypeString -> "string") lt)
+literalType :: Core.LiteralType -> String
+literalType lt =
+    case lt of
+      Core.LiteralTypeBinary -> "binary"
+      Core.LiteralTypeBoolean -> "boolean"
+      Core.LiteralTypeFloat v0 -> floatType v0
+      Core.LiteralTypeInteger v0 -> integerType v0
+      Core.LiteralTypeString -> "string"
 
+-- | A placeholder for reading terms from their serialized form. Not implemented.
+readTerm :: String -> Maybe Core.Term
+readTerm s = Just (Core.TermLiteral (Core.LiteralString s))
+
 -- | Show a term as a string
-term :: (Core.Term -> String)
-term t =  
-  let gatherTerms = (\prev -> \app ->  
-          let lhs = (Core.applicationFunction app)
-          in  
-            let rhs = (Core.applicationArgument app)
-            in ((\x -> case x of
-              Core.TermApplication v1 -> (gatherTerms (Lists.cons rhs prev) v1)
-              _ -> (Lists.cons lhs (Lists.cons rhs prev))) lhs))
-  in ((\x -> case x of
-    Core.TermAnnotated v1 -> (term (Core.annotatedTermBody v1))
-    Core.TermApplication v1 ->  
-      let terms = (gatherTerms [] v1)
-      in  
-        let termStrs = (Lists.map term terms)
-        in (Strings.cat [
+term :: Core.Term -> String
+term t =
+
+      let gatherTerms =
+              \prev -> \app ->
+                let lhs = Core.applicationFunction app
+                    rhs = Core.applicationArgument app
+                in case lhs of
+                  Core.TermApplication v0 -> gatherTerms (Lists.cons rhs prev) v0
+                  _ -> Lists.cons lhs (Lists.cons rhs prev)
+      in case t of
+        Core.TermAnnotated v0 -> term (Core.annotatedTermBody v0)
+        Core.TermApplication v0 ->
+          let terms = gatherTerms [] v0
+              termStrs = Lists.map term terms
+          in (Strings.cat [
+            "(",
+            (Strings.intercalate " @ " termStrs),
+            ")"])
+        Core.TermEither v0 -> Eithers.either (\l -> Strings.cat [
+          "left(",
+          (term l),
+          ")"]) (\r -> Strings.cat [
+          "right(",
+          (term r),
+          ")"]) v0
+        Core.TermFunction v0 -> function v0
+        Core.TermLet v0 -> let_ v0
+        Core.TermList v0 ->
+          let termStrs = Lists.map term v0
+          in (Strings.cat [
+            "[",
+            (Strings.intercalate ", " termStrs),
+            "]"])
+        Core.TermLiteral v0 -> literal v0
+        Core.TermMap v0 ->
+          let entry =
+                  \p -> Strings.cat [
+                    term (Pairs.first p),
+                    "=",
+                    (term (Pairs.second p))]
+          in (Strings.cat [
+            "{",
+            (Strings.intercalate ", " (Lists.map entry (Maps.toList v0))),
+            "}"])
+        Core.TermMaybe v0 -> Maybes.maybe "nothing" (\t -> Strings.cat [
+          "just(",
+          (term t),
+          ")"]) v0
+        Core.TermPair v0 -> Strings.cat [
           "(",
-          (Strings.intercalate " @ " termStrs),
-          ")"])
-    Core.TermEither v1 -> (Eithers.either (\l -> Strings.cat [
-      "left(",
-      (term l),
-      ")"]) (\r -> Strings.cat [
-      "right(",
-      (term r),
-      ")"]) v1)
-    Core.TermFunction v1 -> (function v1)
-    Core.TermLet v1 -> (let_ v1)
-    Core.TermList v1 ->  
-      let termStrs = (Lists.map term v1)
-      in (Strings.cat [
-        "[",
-        (Strings.intercalate ", " termStrs),
-        "]"])
-    Core.TermLiteral v1 -> (literal v1)
-    Core.TermMap v1 ->  
-      let entry = (\p -> Strings.cat [
-              term (Pairs.first p),
-              "=",
-              (term (Pairs.second p))])
-      in (Strings.cat [
-        "{",
-        (Strings.intercalate ", " (Lists.map entry (Maps.toList v1))),
-        "}"])
-    Core.TermMaybe v1 -> (Maybes.maybe "nothing" (\t -> Strings.cat [
-      "just(",
-      (term t),
-      ")"]) v1)
-    Core.TermPair v1 -> (Strings.cat [
-      "(",
-      (term (Pairs.first v1)),
-      ", ",
-      (term (Pairs.second v1)),
-      ")"])
-    Core.TermRecord v1 ->  
-      let tname = (Core.unName (Core.recordTypeName v1))
-      in  
-        let flds = (Core.recordFields v1)
-        in (Strings.cat [
-          "record(",
-          tname,
-          ")",
-          (fields flds)])
-    Core.TermSet v1 -> (Strings.cat [
-      "{",
-      (Strings.intercalate ", " (Lists.map term (Sets.toList v1))),
-      "}"])
-    Core.TermTypeLambda v1 ->  
-      let param = (Core.unName (Core.typeLambdaParameter v1))
-      in  
-        let body = (Core.typeLambdaBody v1)
-        in (Strings.cat [
-          "\923",
-          param,
-          ".",
-          (term body)])
-    Core.TermTypeApplication v1 ->  
-      let t2 = (Core.typeApplicationTermBody v1)
-      in  
-        let typ = (Core.typeApplicationTermType v1)
-        in (Strings.cat [
-          term t2,
-          "\10216",
-          (type_ typ),
-          "\10217"])
-    Core.TermUnion v1 -> (injection v1)
-    Core.TermUnit -> "unit"
-    Core.TermVariable v1 -> (Core.unName v1)
-    Core.TermWrap v1 ->  
-      let tname = (Core.unName (Core.wrappedTermTypeName v1))
-      in  
-        let term1 = (Core.wrappedTermBody v1)
-        in (Strings.cat [
-          "wrap(",
-          tname,
-          "){",
-          (term term1),
-          "}"])) t)
+          (term (Pairs.first v0)),
+          ", ",
+          (term (Pairs.second v0)),
+          ")"]
+        Core.TermRecord v0 ->
+          let tname = Core.unName (Core.recordTypeName v0)
+              flds = Core.recordFields v0
+          in (Strings.cat [
+            "record(",
+            tname,
+            ")",
+            (fields flds)])
+        Core.TermSet v0 -> Strings.cat [
+          "{",
+          (Strings.intercalate ", " (Lists.map term (Sets.toList v0))),
+          "}"]
+        Core.TermTypeLambda v0 ->
+          let param = Core.unName (Core.typeLambdaParameter v0)
+              body = Core.typeLambdaBody v0
+          in (Strings.cat [
+            "\923",
+            param,
+            ".",
+            (term body)])
+        Core.TermTypeApplication v0 ->
+          let t2 = Core.typeApplicationTermBody v0
+              typ = Core.typeApplicationTermType v0
+          in (Strings.cat [
+            term t2,
+            "\10216",
+            (type_ typ),
+            "\10217"])
+        Core.TermUnion v0 -> injection v0
+        Core.TermUnit -> "unit"
+        Core.TermVariable v0 -> Core.unName v0
+        Core.TermWrap v0 ->
+          let tname = Core.unName (Core.wrappedTermTypeName v0)
+              term1 = Core.wrappedTermBody v0
+          in (Strings.cat [
+            "wrap(",
+            tname,
+            "){",
+            (term term1),
+            "}"])
 
 -- | Show a type as a string
-type_ :: (Core.Type -> String)
-type_ typ =  
-  let showRowType = (\rt ->  
-          let flds = (Core.rowTypeFields rt)
-          in  
-            let fieldStrs = (Lists.map fieldType flds)
-            in (Strings.cat [
-              "{",
-              (Strings.intercalate ", " fieldStrs),
-              "}"]))
-  in  
-    let gatherTypes = (\prev -> \app ->  
-            let lhs = (Core.applicationTypeFunction app)
-            in  
-              let rhs = (Core.applicationTypeArgument app)
-              in ((\x -> case x of
-                Core.TypeApplication v1 -> (gatherTypes (Lists.cons rhs prev) v1)
-                _ -> (Lists.cons lhs (Lists.cons rhs prev))) lhs))
-    in  
-      let gatherFunctionTypes = (\prev -> \t -> (\x -> case x of
-              Core.TypeFunction v1 ->  
-                let dom = (Core.functionTypeDomain v1)
-                in  
-                  let cod = (Core.functionTypeCodomain v1)
-                  in (gatherFunctionTypes (Lists.cons dom prev) cod)
-              _ -> (Lists.reverse (Lists.cons t prev))) t)
-      in ((\x -> case x of
-        Core.TypeAnnotated v1 -> (type_ (Core.annotatedTypeBody v1))
-        Core.TypeApplication v1 ->  
-          let types = (gatherTypes [] v1)
-          in  
-            let typeStrs = (Lists.map type_ types)
-            in (Strings.cat [
-              "(",
-              (Strings.intercalate " @ " typeStrs),
-              ")"])
-        Core.TypeEither v1 ->  
-          let leftTyp = (Core.eitherTypeLeft v1)
-          in  
-            let rightTyp = (Core.eitherTypeRight v1)
-            in (Strings.cat [
-              "either<",
-              (type_ leftTyp),
-              ", ",
-              (type_ rightTyp),
-              ">"])
-        Core.TypeForall v1 ->  
-          let var = (Core.unName (Core.forallTypeParameter v1))
-          in  
-            let body = (Core.forallTypeBody v1)
-            in (Strings.cat [
-              "(\8704",
-              var,
-              ".",
-              (type_ body),
-              ")"])
-        Core.TypeFunction _ ->  
-          let types = (gatherFunctionTypes [] typ)
-          in  
-            let typeStrs = (Lists.map type_ types)
-            in (Strings.cat [
-              "(",
-              (Strings.intercalate " \8594 " typeStrs),
-              ")"])
-        Core.TypeList v1 -> (Strings.cat [
+type_ :: Core.Type -> String
+type_ typ =
+
+      let showRowType =
+              \flds ->
+                let fieldStrs = Lists.map fieldType flds
+                in (Strings.cat [
+                  "{",
+                  (Strings.intercalate ", " fieldStrs),
+                  "}"])
+          gatherTypes =
+                  \prev -> \app ->
+                    let lhs = Core.applicationTypeFunction app
+                        rhs = Core.applicationTypeArgument app
+                    in case lhs of
+                      Core.TypeApplication v0 -> gatherTypes (Lists.cons rhs prev) v0
+                      _ -> Lists.cons lhs (Lists.cons rhs prev)
+          gatherFunctionTypes =
+                  \prev -> \t -> case t of
+                    Core.TypeFunction v0 ->
+                      let dom = Core.functionTypeDomain v0
+                          cod = Core.functionTypeCodomain v0
+                      in (gatherFunctionTypes (Lists.cons dom prev) cod)
+                    _ -> Lists.reverse (Lists.cons t prev)
+      in case typ of
+        Core.TypeAnnotated v0 -> type_ (Core.annotatedTypeBody v0)
+        Core.TypeApplication v0 ->
+          let types = gatherTypes [] v0
+              typeStrs = Lists.map type_ types
+          in (Strings.cat [
+            "(",
+            (Strings.intercalate " @ " typeStrs),
+            ")"])
+        Core.TypeEither v0 ->
+          let leftTyp = Core.eitherTypeLeft v0
+              rightTyp = Core.eitherTypeRight v0
+          in (Strings.cat [
+            "either<",
+            (type_ leftTyp),
+            ", ",
+            (type_ rightTyp),
+            ">"])
+        Core.TypeForall v0 ->
+          let var = Core.unName (Core.forallTypeParameter v0)
+              body = Core.forallTypeBody v0
+          in (Strings.cat [
+            "(\8704",
+            var,
+            ".",
+            (type_ body),
+            ")"])
+        Core.TypeFunction _ ->
+          let types = gatherFunctionTypes [] typ
+              typeStrs = Lists.map type_ types
+          in (Strings.cat [
+            "(",
+            (Strings.intercalate " \8594 " typeStrs),
+            ")"])
+        Core.TypeList v0 -> Strings.cat [
           "list<",
-          (type_ v1),
-          ">"])
-        Core.TypeLiteral v1 -> (literalType v1)
-        Core.TypeMap v1 ->  
-          let keyTyp = (Core.mapTypeKeys v1)
-          in  
-            let valTyp = (Core.mapTypeValues v1)
-            in (Strings.cat [
-              "map<",
-              (type_ keyTyp),
-              ", ",
-              (type_ valTyp),
-              ">"])
-        Core.TypeMaybe v1 -> (Strings.cat [
+          (type_ v0),
+          ">"]
+        Core.TypeLiteral v0 -> literalType v0
+        Core.TypeMap v0 ->
+          let keyTyp = Core.mapTypeKeys v0
+              valTyp = Core.mapTypeValues v0
+          in (Strings.cat [
+            "map<",
+            (type_ keyTyp),
+            ", ",
+            (type_ valTyp),
+            ">"])
+        Core.TypeMaybe v0 -> Strings.cat [
           "maybe<",
-          (type_ v1),
-          ">"])
-        Core.TypePair v1 ->  
-          let firstTyp = (Core.pairTypeFirst v1)
-          in  
-            let secondTyp = (Core.pairTypeSecond v1)
-            in (Strings.cat [
-              "(",
-              (type_ firstTyp),
-              ", ",
-              (type_ secondTyp),
-              ")"])
-        Core.TypeRecord v1 -> (Strings.cat2 "record" (showRowType v1))
-        Core.TypeSet v1 -> (Strings.cat [
+          (type_ v0),
+          ">"]
+        Core.TypePair v0 ->
+          let firstTyp = Core.pairTypeFirst v0
+              secondTyp = Core.pairTypeSecond v0
+          in (Strings.cat [
+            "(",
+            (type_ firstTyp),
+            ", ",
+            (type_ secondTyp),
+            ")"])
+        Core.TypeRecord v0 -> Strings.cat2 "record" (showRowType v0)
+        Core.TypeSet v0 -> Strings.cat [
           "set<",
-          (type_ v1),
-          ">"])
-        Core.TypeUnion v1 -> (Strings.cat2 "union" (showRowType v1))
+          (type_ v0),
+          ">"]
+        Core.TypeUnion v0 -> Strings.cat2 "union" (showRowType v0)
         Core.TypeUnit -> "unit"
-        Core.TypeVariable v1 -> (Core.unName v1)
-        Core.TypeWrap v1 ->  
-          let tname = (Core.unName (Core.wrappedTypeTypeName v1))
-          in  
-            let typ1 = (Core.wrappedTypeBody v1)
-            in (Strings.cat [
-              "wrap[",
-              tname,
-              "](",
-              (type_ typ1),
-              ")"])) typ)
+        Core.TypeVariable v0 -> Core.unName v0
+        Core.TypeVoid -> "void"
+        Core.TypeWrap v0 -> Strings.cat [
+          "wrap(",
+          (type_ v0),
+          ")"]
 
 -- | Show a type scheme as a string
-typeScheme :: (Core.TypeScheme -> String)
-typeScheme ts =  
-  let vars = (Core.typeSchemeVariables ts)
-  in  
-    let body = (Core.typeSchemeType ts)
-    in  
-      let varNames = (Lists.map Core.unName vars)
-      in  
-        let fa = (Logic.ifElse (Lists.null vars) "" (Strings.cat [
-                "\8704[",
-                (Strings.intercalate "," varNames),
-                "]."]))
-        in (Strings.cat [
+typeScheme :: Core.TypeScheme -> String
+typeScheme ts =
+
+      let vars = Core.typeSchemeVariables ts
+          body = Core.typeSchemeType ts
+          varNames = Lists.map Core.unName vars
+          fa =
+                  Logic.ifElse (Lists.null vars) "" (Strings.cat [
+                    "forall ",
+                    (Strings.intercalate "," varNames),
+                    ". "])
+          toConstraintPair =
+                  \v -> \c -> Strings.cat [
+                    Core.unName c,
+                    " ",
+                    (Core.unName v)]
+          toConstraintPairs =
+                  \p -> Lists.map (toConstraintPair (Pairs.first p)) (Sets.toList (Core.typeVariableMetadataClasses (Pairs.second p)))
+          tc = Maybes.maybe [] (\m -> Lists.concat (Lists.map toConstraintPairs (Maps.toList m))) (Core.typeSchemeConstraints ts)
+      in (Strings.cat [
+        "(",
+        fa,
+        (Logic.ifElse (Lists.null tc) "" (Strings.cat [
           "(",
-          fa,
-          (type_ body),
-          ")"])
+          (Strings.intercalate ", " tc),
+          ") => "])),
+        (type_ body),
+        ")"])
diff --git a/src/gen-main/haskell/Hydra/Show/Error/Core.hs b/src/gen-main/haskell/Hydra/Show/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Show/Error/Core.hs
@@ -0,0 +1,323 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | String representations of hydra.error.core types
+
+module Hydra.Show.Error.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Core as Core_
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Show.Core as Core__
+import qualified Hydra.Show.Meta as Meta
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Show a constant condition error as a string
+constantConditionError :: Core_.ConstantConditionError -> String
+constantConditionError e =
+    Strings.cat [
+      "constant condition: ifElse with literal ",
+      (Literals.showBoolean (Core_.constantConditionErrorValue e))]
+
+-- | Show a duplicate binding error as a string
+duplicateBindingError :: Core_.DuplicateBindingError -> String
+duplicateBindingError e =
+    Strings.cat [
+      "duplicate binding: ",
+      (Core.unName (Core_.duplicateBindingErrorName e))]
+
+-- | Show a duplicate field error as a string
+duplicateFieldError :: Core_.DuplicateFieldError -> String
+duplicateFieldError e =
+    Strings.cat [
+      "duplicate field: ",
+      (Core.unName (Core_.duplicateFieldErrorName e))]
+
+-- | Show a duplicate record type field names error as a string
+duplicateRecordTypeFieldNamesError :: Core_.DuplicateRecordTypeFieldNamesError -> String
+duplicateRecordTypeFieldNamesError e =
+    Strings.cat [
+      "duplicate field in record type: ",
+      (Core.unName (Core_.duplicateRecordTypeFieldNamesErrorName e))]
+
+-- | Show a duplicate union type field names error as a string
+duplicateUnionTypeFieldNamesError :: Core_.DuplicateUnionTypeFieldNamesError -> String
+duplicateUnionTypeFieldNamesError e =
+    Strings.cat [
+      "duplicate field in union type: ",
+      (Core.unName (Core_.duplicateUnionTypeFieldNamesErrorName e))]
+
+-- | Show an empty case statement error as a string
+emptyCaseStatementError :: Core_.EmptyCaseStatementError -> String
+emptyCaseStatementError e =
+    Strings.cat [
+      "empty case statement for type: ",
+      (Core.unName (Core_.emptyCaseStatementErrorTypeName e))]
+
+-- | Show an empty let bindings error as a string
+emptyLetBindingsError :: t0 -> String
+emptyLetBindingsError e = "let expression with no bindings"
+
+-- | Show an empty record type error as a string
+emptyRecordTypeError :: t0 -> String
+emptyRecordTypeError e = "record type with no fields (use TypeUnit instead)"
+
+-- | Show an empty term annotation error as a string
+emptyTermAnnotationError :: t0 -> String
+emptyTermAnnotationError e = "term annotation with empty annotation map"
+
+-- | Show an empty type annotation error as a string
+emptyTypeAnnotationError :: t0 -> String
+emptyTypeAnnotationError e = "type annotation with empty annotation map"
+
+-- | Show an empty type name in term error as a string
+emptyTypeNameInTermError :: t0 -> String
+emptyTypeNameInTermError e = "term with empty type name"
+
+-- | Show an empty union type error as a string
+emptyUnionTypeError :: t0 -> String
+emptyUnionTypeError e = "union type with no alternatives (use TypeVoid instead)"
+
+-- | Show an invalid forall parameter name error as a string
+invalidForallParameterNameError :: Core_.InvalidForallParameterNameError -> String
+invalidForallParameterNameError e =
+    Strings.cat [
+      "invalid forall parameter name: ",
+      (Core.unName (Core_.invalidForallParameterNameErrorName e))]
+
+-- | Show an invalid lambda parameter name error as a string
+invalidLambdaParameterNameError :: Core_.InvalidLambdaParameterNameError -> String
+invalidLambdaParameterNameError e =
+    Strings.cat [
+      "invalid lambda parameter name: ",
+      (Core.unName (Core_.invalidLambdaParameterNameErrorName e))]
+
+-- | Show an invalid let binding name error as a string
+invalidLetBindingNameError :: Core_.InvalidLetBindingNameError -> String
+invalidLetBindingNameError e =
+    Strings.cat [
+      "invalid let binding name: ",
+      (Core.unName (Core_.invalidLetBindingNameErrorName e))]
+
+-- | Show an invalid term error as a string
+invalidTermError :: Core_.InvalidTermError -> String
+invalidTermError e =
+    Strings.cat2 "invalid term: " (case e of
+      Core_.InvalidTermErrorConstantCondition v0 -> constantConditionError v0
+      Core_.InvalidTermErrorDuplicateBinding v0 -> duplicateBindingError v0
+      Core_.InvalidTermErrorDuplicateField v0 -> duplicateFieldError v0
+      Core_.InvalidTermErrorEmptyCaseStatement v0 -> emptyCaseStatementError v0
+      Core_.InvalidTermErrorEmptyLetBindings v0 -> emptyLetBindingsError v0
+      Core_.InvalidTermErrorEmptyTermAnnotation v0 -> emptyTermAnnotationError v0
+      Core_.InvalidTermErrorEmptyTypeNameInTerm v0 -> emptyTypeNameInTermError v0
+      Core_.InvalidTermErrorInvalidLambdaParameterName v0 -> invalidLambdaParameterNameError v0
+      Core_.InvalidTermErrorInvalidLetBindingName v0 -> invalidLetBindingNameError v0
+      Core_.InvalidTermErrorInvalidTypeLambdaParameterName v0 -> invalidTypeLambdaParameterNameError v0
+      Core_.InvalidTermErrorNestedTermAnnotation v0 -> nestedTermAnnotationError v0
+      Core_.InvalidTermErrorRedundantWrapUnwrap v0 -> redundantWrapUnwrapError v0
+      Core_.InvalidTermErrorSelfApplication v0 -> selfApplicationError v0
+      Core_.InvalidTermErrorTermVariableShadowing v0 -> termVariableShadowingError v0
+      Core_.InvalidTermErrorTypeVariableShadowingInTypeLambda v0 -> typeVariableShadowingInTypeLambdaError v0
+      Core_.InvalidTermErrorUndefinedTermVariable v0 -> undefinedTermVariableError v0
+      Core_.InvalidTermErrorUndefinedTypeVariableInBindingType v0 -> undefinedTypeVariableInBindingTypeError v0
+      Core_.InvalidTermErrorUndefinedTypeVariableInLambdaDomain v0 -> undefinedTypeVariableInLambdaDomainError v0
+      Core_.InvalidTermErrorUndefinedTypeVariableInTypeApplication v0 -> undefinedTypeVariableInTypeApplicationError v0
+      Core_.InvalidTermErrorUnknownPrimitiveName v0 -> unknownPrimitiveNameError v0
+      Core_.InvalidTermErrorUnnecessaryIdentityApplication v0 -> unnecessaryIdentityApplicationError v0
+      Core_.InvalidTermErrorUntypedTermVariable v0 -> untypedTermVariableError v0)
+
+-- | Show an invalid type error as a string
+invalidTypeError :: Core_.InvalidTypeError -> String
+invalidTypeError e =
+    Strings.cat2 "invalid type: " (case e of
+      Core_.InvalidTypeErrorDuplicateRecordTypeFieldNames v0 -> duplicateRecordTypeFieldNamesError v0
+      Core_.InvalidTypeErrorDuplicateUnionTypeFieldNames v0 -> duplicateUnionTypeFieldNamesError v0
+      Core_.InvalidTypeErrorEmptyRecordType v0 -> emptyRecordTypeError v0
+      Core_.InvalidTypeErrorEmptyTypeAnnotation v0 -> emptyTypeAnnotationError v0
+      Core_.InvalidTypeErrorEmptyUnionType v0 -> emptyUnionTypeError v0
+      Core_.InvalidTypeErrorInvalidForallParameterName v0 -> invalidForallParameterNameError v0
+      Core_.InvalidTypeErrorInvalidTypeSchemeVariableName v0 -> invalidTypeSchemeVariableNameError v0
+      Core_.InvalidTypeErrorNestedTypeAnnotation v0 -> nestedTypeAnnotationError v0
+      Core_.InvalidTypeErrorNonComparableMapKeyType v0 -> nonComparableMapKeyTypeError v0
+      Core_.InvalidTypeErrorNonComparableSetElementType v0 -> nonComparableSetElementTypeError v0
+      Core_.InvalidTypeErrorSingleVariantUnion v0 -> singleVariantUnionError v0
+      Core_.InvalidTypeErrorTypeVariableShadowingInForall v0 -> typeVariableShadowingInForallError v0
+      Core_.InvalidTypeErrorUndefinedTypeVariable v0 -> undefinedTypeVariableError v0
+      Core_.InvalidTypeErrorVoidInNonBottomPosition v0 -> voidInNonBottomPositionError v0)
+
+-- | Show an invalid type lambda parameter name error as a string
+invalidTypeLambdaParameterNameError :: Core_.InvalidTypeLambdaParameterNameError -> String
+invalidTypeLambdaParameterNameError e =
+    Strings.cat [
+      "invalid type lambda parameter name: ",
+      (Core.unName (Core_.invalidTypeLambdaParameterNameErrorName e))]
+
+-- | Show an invalid type scheme variable name error as a string
+invalidTypeSchemeVariableNameError :: Core_.InvalidTypeSchemeVariableNameError -> String
+invalidTypeSchemeVariableNameError e =
+    Strings.cat [
+      "invalid type scheme variable name: ",
+      (Core.unName (Core_.invalidTypeSchemeVariableNameErrorName e))]
+
+-- | Show a nested term annotation error as a string
+nestedTermAnnotationError :: t0 -> String
+nestedTermAnnotationError e = "nested term annotations should be merged"
+
+-- | Show a nested type annotation error as a string
+nestedTypeAnnotationError :: t0 -> String
+nestedTypeAnnotationError e = "nested type annotations should be merged"
+
+-- | Show a non-comparable map key type error as a string
+nonComparableMapKeyTypeError :: Core_.NonComparableMapKeyTypeError -> String
+nonComparableMapKeyTypeError e =
+    Strings.cat [
+      "map key type contains a function type: ",
+      (Core__.type_ (Core_.nonComparableMapKeyTypeErrorKeyType e))]
+
+-- | Show a non-comparable set element type error as a string
+nonComparableSetElementTypeError :: Core_.NonComparableSetElementTypeError -> String
+nonComparableSetElementTypeError e =
+    Strings.cat [
+      "set element type contains a function type: ",
+      (Core__.type_ (Core_.nonComparableSetElementTypeErrorElementType e))]
+
+-- | Show a redundant wrap/unwrap error as a string
+redundantWrapUnwrapError :: Core_.RedundantWrapUnwrapError -> String
+redundantWrapUnwrapError e =
+    Strings.cat [
+      "redundant wrap/unwrap for type: ",
+      (Core.unName (Core_.redundantWrapUnwrapErrorTypeName e))]
+
+-- | Show a self-application error as a string
+selfApplicationError :: Core_.SelfApplicationError -> String
+selfApplicationError e =
+    Strings.cat [
+      "self-application of variable: ",
+      (Core.unName (Core_.selfApplicationErrorName e))]
+
+-- | Show a single variant union error as a string
+singleVariantUnionError :: Core_.SingleVariantUnionError -> String
+singleVariantUnionError e =
+    Strings.cat [
+      "union type with single variant: ",
+      (Core.unName (Core_.singleVariantUnionErrorFieldName e))]
+
+-- | Show a term variable shadowing error as a string
+termVariableShadowingError :: Core_.TermVariableShadowingError -> String
+termVariableShadowingError e =
+    Strings.cat [
+      "variable shadowing: ",
+      (Core.unName (Core_.termVariableShadowingErrorName e))]
+
+-- | Show a type variable shadowing in forall error as a string
+typeVariableShadowingInForallError :: Core_.TypeVariableShadowingInForallError -> String
+typeVariableShadowingInForallError e =
+    Strings.cat [
+      "type variable shadowing in forall: ",
+      (Core.unName (Core_.typeVariableShadowingInForallErrorName e))]
+
+-- | Show a type variable shadowing in type lambda error as a string
+typeVariableShadowingInTypeLambdaError :: Core_.TypeVariableShadowingInTypeLambdaError -> String
+typeVariableShadowingInTypeLambdaError e =
+    Strings.cat [
+      "type variable shadowing in type lambda: ",
+      (Core.unName (Core_.typeVariableShadowingInTypeLambdaErrorName e))]
+
+-- | Show an undefined field error as a string
+undefinedFieldError :: Core_.UndefinedFieldError -> String
+undefinedFieldError e =
+
+      let fname = Core_.undefinedFieldErrorFieldName e
+          tname = Core_.undefinedFieldErrorTypeName e
+      in (Strings.cat [
+        "no such field \"",
+        (Core.unName fname),
+        "\" in type \"",
+        (Core.unName tname),
+        "\""])
+
+-- | Show an undefined term variable error as a string
+undefinedTermVariableError :: Core_.UndefinedTermVariableError -> String
+undefinedTermVariableError e =
+    Strings.cat [
+      "undefined term variable: ",
+      (Core.unName (Core_.undefinedTermVariableErrorName e))]
+
+-- | Show an undefined type variable error as a string
+undefinedTypeVariableError :: Core_.UndefinedTypeVariableError -> String
+undefinedTypeVariableError e =
+    Strings.cat [
+      "undefined type variable: ",
+      (Core.unName (Core_.undefinedTypeVariableErrorName e))]
+
+-- | Show an undefined type variable in binding type error as a string
+undefinedTypeVariableInBindingTypeError :: Core_.UndefinedTypeVariableInBindingTypeError -> String
+undefinedTypeVariableInBindingTypeError e =
+    Strings.cat [
+      "undefined type variable in binding type: ",
+      (Core.unName (Core_.undefinedTypeVariableInBindingTypeErrorName e))]
+
+-- | Show an undefined type variable in lambda domain error as a string
+undefinedTypeVariableInLambdaDomainError :: Core_.UndefinedTypeVariableInLambdaDomainError -> String
+undefinedTypeVariableInLambdaDomainError e =
+    Strings.cat [
+      "undefined type variable in lambda domain: ",
+      (Core.unName (Core_.undefinedTypeVariableInLambdaDomainErrorName e))]
+
+-- | Show an undefined type variable in type application error as a string
+undefinedTypeVariableInTypeApplicationError :: Core_.UndefinedTypeVariableInTypeApplicationError -> String
+undefinedTypeVariableInTypeApplicationError e =
+    Strings.cat [
+      "undefined type variable in type application: ",
+      (Core.unName (Core_.undefinedTypeVariableInTypeApplicationErrorName e))]
+
+-- | Show an unexpected term variant error as a string
+unexpectedTermVariantError :: Core_.UnexpectedTermVariantError -> String
+unexpectedTermVariantError e =
+
+      let expected = Core_.unexpectedTermVariantErrorExpectedVariant e
+          actual = Core_.unexpectedTermVariantErrorActualTerm e
+      in (Strings.cat [
+        "expected ",
+        (Meta.termVariant expected),
+        " term but found ",
+        (Core__.term actual)])
+
+-- | Show an unexpected type variant error as a string
+unexpectedTypeVariantError :: Core_.UnexpectedTypeVariantError -> String
+unexpectedTypeVariantError e =
+
+      let expected = Core_.unexpectedTypeVariantErrorExpectedVariant e
+          actual = Core_.unexpectedTypeVariantErrorActualType e
+      in (Strings.cat [
+        "expected ",
+        (Meta.typeVariant expected),
+        " type but found ",
+        (Core__.type_ actual)])
+
+-- | Show an unknown primitive name error as a string
+unknownPrimitiveNameError :: Core_.UnknownPrimitiveNameError -> String
+unknownPrimitiveNameError e =
+    Strings.cat [
+      "unknown primitive: ",
+      (Core.unName (Core_.unknownPrimitiveNameErrorName e))]
+
+-- | Show an unnecessary identity application error as a string
+unnecessaryIdentityApplicationError :: t0 -> String
+unnecessaryIdentityApplicationError e = "unnecessary application of identity lambda"
+
+-- | Show an untyped term variable error as a string
+untypedTermVariableError :: Core_.UntypedTermVariableError -> String
+untypedTermVariableError e =
+    Strings.cat [
+      "untyped term variable: ",
+      (Core.unName (Core_.untypedTermVariableErrorName e))]
+
+-- | Show a void in non-bottom position error as a string
+voidInNonBottomPositionError :: t0 -> String
+voidInNonBottomPositionError e = "TypeVoid in a position where no value can be constructed"
diff --git a/src/gen-main/haskell/Hydra/Show/Errors.hs b/src/gen-main/haskell/Hydra/Show/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Show/Errors.hs
@@ -0,0 +1,176 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | String representations of hydra.error types
+
+module Hydra.Show.Errors where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Checking as Checking
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Formatting as Formatting
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Literals as Literals
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Show.Core as Core_
+import qualified Hydra.Show.Error.Core as Core__
+import qualified Hydra.Show.Meta as Meta
+import qualified Hydra.Show.Typing as Typing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Show a checking error as a string
+checkingError :: Checking.CheckingError -> String
+checkingError ce =
+    case ce of
+      Checking.CheckingErrorIncorrectUnification v0 -> incorrectUnificationError v0
+      Checking.CheckingErrorNotAForallType v0 -> notAForallTypeError v0
+      Checking.CheckingErrorNotAFunctionType v0 -> notAFunctionTypeError v0
+      Checking.CheckingErrorTypeArityMismatch v0 -> typeArityMismatchError v0
+      Checking.CheckingErrorTypeMismatch v0 -> typeMismatchError v0
+      Checking.CheckingErrorUnboundTypeVariables v0 -> unboundTypeVariablesError v0
+      Checking.CheckingErrorUnequalTypes v0 -> unequalTypesError v0
+      Checking.CheckingErrorUnsupportedTermVariant v0 -> unsupportedTermVariantError v0
+      Checking.CheckingErrorUntypedLambda v0 -> untypedLambdaError v0
+      Checking.CheckingErrorUntypedLetBinding v0 -> untypedLetBindingError v0
+
+-- | Show a decoding error as a string
+decodingError :: Errors.DecodingError -> String
+decodingError de = Strings.cat2 "decoding error: " (Errors.unDecodingError de)
+
+-- | Show an error as a string
+error :: Errors.Error -> String
+error e =
+    case e of
+      Errors.ErrorChecking v0 -> checkingError v0
+      Errors.ErrorDecoding v0 -> decodingError v0
+      Errors.ErrorDuplicateBinding v0 -> Core__.duplicateBindingError v0
+      Errors.ErrorDuplicateField v0 -> Core__.duplicateFieldError v0
+      Errors.ErrorOther v0 -> otherError v0
+      Errors.ErrorUndefinedField v0 -> Core__.undefinedFieldError v0
+      Errors.ErrorUndefinedTermVariable v0 -> Core__.undefinedTermVariableError v0
+      Errors.ErrorUntypedTermVariable v0 -> Core__.untypedTermVariableError v0
+      Errors.ErrorUnexpectedTermVariant v0 -> Core__.unexpectedTermVariantError v0
+      Errors.ErrorUnexpectedTypeVariant v0 -> Core__.unexpectedTypeVariantError v0
+      Errors.ErrorUnification v0 -> unificationError v0
+
+-- | Show an incorrect unification error as a string
+incorrectUnificationError :: Checking.IncorrectUnificationError -> String
+incorrectUnificationError e =
+
+      let subst = Checking.incorrectUnificationErrorSubstitution e
+      in (Strings.cat2 "incorrect unification: " (Typing.typeSubst subst))
+
+-- | Show a not-a-forall-type error as a string
+notAForallTypeError :: Checking.NotAForallTypeError -> String
+notAForallTypeError e =
+
+      let typ = Checking.notAForallTypeErrorType e
+          args = Checking.notAForallTypeErrorTypeArguments e
+      in (Strings.cat [
+        "not a forall type: ",
+        (Core_.type_ typ),
+        ". Trying to apply ",
+        (Literals.showInt32 (Lists.length args)),
+        " type argument(s): ",
+        (Formatting.showList Core_.type_ args)])
+
+-- | Show a not-a-function-type error as a string
+notAFunctionTypeError :: Checking.NotAFunctionTypeError -> String
+notAFunctionTypeError e =
+
+      let typ = Checking.notAFunctionTypeErrorType e
+      in (Strings.cat2 "not a function type: " (Core_.type_ typ))
+
+-- | Show an other error as a string
+otherError :: Errors.OtherError -> String
+otherError oe = Errors.unOtherError oe
+
+-- | Show a type arity mismatch error as a string
+typeArityMismatchError :: Checking.TypeArityMismatchError -> String
+typeArityMismatchError e =
+
+      let typ = Checking.typeArityMismatchErrorType e
+          expected = Checking.typeArityMismatchErrorExpectedArity e
+          actual = Checking.typeArityMismatchErrorActualArity e
+          args = Checking.typeArityMismatchErrorTypeArguments e
+      in (Strings.cat [
+        "type ",
+        (Core_.type_ typ),
+        " applied to the wrong number of type arguments (expected ",
+        (Literals.showInt32 expected),
+        ", got ",
+        (Literals.showInt32 actual),
+        "): ",
+        (Formatting.showList Core_.type_ args)])
+
+-- | Show a type mismatch error as a string
+typeMismatchError :: Checking.TypeMismatchError -> String
+typeMismatchError e =
+
+      let expected = Checking.typeMismatchErrorExpectedType e
+          actual = Checking.typeMismatchErrorActualType e
+      in (Strings.cat [
+        "type mismatch: expected ",
+        (Core_.type_ expected),
+        " but found ",
+        (Core_.type_ actual)])
+
+-- | Show an unbound type variables error as a string
+unboundTypeVariablesError :: Checking.UnboundTypeVariablesError -> String
+unboundTypeVariablesError e =
+
+      let vars = Checking.unboundTypeVariablesErrorVariables e
+          typ = Checking.unboundTypeVariablesErrorType e
+      in (Strings.cat [
+        "unbound type variables: {",
+        (Strings.intercalate ", " (Lists.map Core.unName (Sets.toList vars))),
+        "} in type ",
+        (Core_.type_ typ)])
+
+-- | Show an unequal types error as a string
+unequalTypesError :: Checking.UnequalTypesError -> String
+unequalTypesError e =
+
+      let types = Checking.unequalTypesErrorTypes e
+          desc = Checking.unequalTypesErrorDescription e
+      in (Strings.cat [
+        "unequal types ",
+        (Formatting.showList Core_.type_ types),
+        " in ",
+        desc])
+
+-- | Show a unification error as a string
+unificationError :: Errors.UnificationError -> String
+unificationError e =
+
+      let lt = Errors.unificationErrorLeftType e
+          rt = Errors.unificationErrorRightType e
+          msg = Errors.unificationErrorMessage e
+      in (Strings.cat [
+        "unification error: cannot unify ",
+        (Core_.type_ lt),
+        " with ",
+        (Core_.type_ rt),
+        ": ",
+        msg])
+
+-- | Show an unsupported term variant error as a string
+unsupportedTermVariantError :: Checking.UnsupportedTermVariantError -> String
+unsupportedTermVariantError e =
+    Strings.cat2 "unsupported term variant: " (Meta.termVariant (Checking.unsupportedTermVariantErrorTermVariant e))
+
+-- | Show an untyped lambda error as a string
+untypedLambdaError :: t0 -> String
+untypedLambdaError _ = "untyped lambda"
+
+-- | Show an untyped let binding error as a string
+untypedLetBindingError :: Checking.UntypedLetBindingError -> String
+untypedLetBindingError e =
+
+      let b = Checking.untypedLetBindingErrorBinding e
+      in (Strings.cat2 "untyped let binding: " (Core_.binding b))
diff --git a/src/gen-main/haskell/Hydra/Show/Graph.hs b/src/gen-main/haskell/Hydra/Show/Graph.hs
--- a/src/gen-main/haskell/Hydra/Show/Graph.hs
+++ b/src/gen-main/haskell/Hydra/Show/Graph.hs
@@ -4,10 +4,10 @@
 
 module Hydra.Show.Graph where
 
-import qualified Hydra.Graph as Graph
+import qualified Hydra.Core as Core
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Show.Core as Core
+import qualified Hydra.Show.Core as Core_
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -15,12 +15,12 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | Show a graph as a string
-graph :: (Graph.Graph -> String)
-graph graph =  
-  let elements = (Graph.graphElements graph) 
-      elementStrs = (Lists.map Core.binding elements)
-  in (Strings.cat [
-    "{",
-    (Strings.intercalate ", " elementStrs),
-    "}"])
+-- | Show a list of bindings as a string
+graph :: [Core.Binding] -> String
+graph elements =
+
+      let elementStrs = Lists.map Core_.binding elements
+      in (Strings.cat [
+        "{",
+        (Strings.intercalate ", " elementStrs),
+        "}"])
diff --git a/src/gen-main/haskell/Hydra/Show/Meta.hs b/src/gen-main/haskell/Hydra/Show/Meta.hs
--- a/src/gen-main/haskell/Hydra/Show/Meta.hs
+++ b/src/gen-main/haskell/Hydra/Show/Meta.hs
@@ -13,43 +13,46 @@
 import qualified Data.Set as S
 
 -- | Show a term variant as a string
-termVariant :: (Variants.TermVariant -> String)
-termVariant x = case x of
-  Variants.TermVariantAnnotated -> "annotated"
-  Variants.TermVariantApplication -> "application"
-  Variants.TermVariantEither -> "either"
-  Variants.TermVariantFunction -> "function"
-  Variants.TermVariantLet -> "let"
-  Variants.TermVariantList -> "list"
-  Variants.TermVariantLiteral -> "literal"
-  Variants.TermVariantMap -> "map"
-  Variants.TermVariantMaybe -> "maybe"
-  Variants.TermVariantPair -> "pair"
-  Variants.TermVariantRecord -> "record"
-  Variants.TermVariantSet -> "set"
-  Variants.TermVariantTypeLambda -> "typeLambda"
-  Variants.TermVariantTypeApplication -> "typeApplication"
-  Variants.TermVariantUnion -> "union"
-  Variants.TermVariantUnit -> "unit"
-  Variants.TermVariantVariable -> "variable"
-  Variants.TermVariantWrap -> "wrap"
+termVariant :: Variants.TermVariant -> String
+termVariant x =
+    case x of
+      Variants.TermVariantAnnotated -> "annotated"
+      Variants.TermVariantApplication -> "application"
+      Variants.TermVariantEither -> "either"
+      Variants.TermVariantFunction -> "function"
+      Variants.TermVariantLet -> "let"
+      Variants.TermVariantList -> "list"
+      Variants.TermVariantLiteral -> "literal"
+      Variants.TermVariantMap -> "map"
+      Variants.TermVariantMaybe -> "maybe"
+      Variants.TermVariantPair -> "pair"
+      Variants.TermVariantRecord -> "record"
+      Variants.TermVariantSet -> "set"
+      Variants.TermVariantTypeLambda -> "typeLambda"
+      Variants.TermVariantTypeApplication -> "typeApplication"
+      Variants.TermVariantUnion -> "union"
+      Variants.TermVariantUnit -> "unit"
+      Variants.TermVariantVariable -> "variable"
+      Variants.TermVariantWrap -> "wrap"
 
 -- | Show a type variant as a string
-typeVariant :: (Variants.TypeVariant -> String)
-typeVariant x = case x of
-  Variants.TypeVariantAnnotated -> "annotated"
-  Variants.TypeVariantApplication -> "application"
-  Variants.TypeVariantEither -> "either"
-  Variants.TypeVariantForall -> "forall"
-  Variants.TypeVariantFunction -> "function"
-  Variants.TypeVariantList -> "list"
-  Variants.TypeVariantLiteral -> "literal"
-  Variants.TypeVariantMap -> "map"
-  Variants.TypeVariantMaybe -> "maybe"
-  Variants.TypeVariantPair -> "pair"
-  Variants.TypeVariantRecord -> "record"
-  Variants.TypeVariantSet -> "set"
-  Variants.TypeVariantUnion -> "union"
-  Variants.TypeVariantUnit -> "unit"
-  Variants.TypeVariantVariable -> "variable"
-  Variants.TypeVariantWrap -> "wrap"
+typeVariant :: Variants.TypeVariant -> String
+typeVariant x =
+    case x of
+      Variants.TypeVariantAnnotated -> "annotated"
+      Variants.TypeVariantApplication -> "application"
+      Variants.TypeVariantEither -> "either"
+      Variants.TypeVariantForall -> "forall"
+      Variants.TypeVariantFunction -> "function"
+      Variants.TypeVariantList -> "list"
+      Variants.TypeVariantLiteral -> "literal"
+      Variants.TypeVariantMap -> "map"
+      Variants.TypeVariantMaybe -> "maybe"
+      Variants.TypeVariantPair -> "pair"
+      Variants.TypeVariantRecord -> "record"
+      Variants.TypeVariantSet -> "set"
+      Variants.TypeVariantUnion -> "union"
+      Variants.TypeVariantUnit -> "unit"
+      Variants.TypeVariantVariable -> "variable"
+      Variants.TypeVariantVoid -> "void"
+      Variants.TypeVariantWrap -> "wrap"
diff --git a/src/gen-main/haskell/Hydra/Show/Paths.hs b/src/gen-main/haskell/Hydra/Show/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Show/Paths.hs
@@ -0,0 +1,118 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Utilities for working with subterm steps and paths.
+
+module Hydra.Show.Paths where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Module as Module
+import qualified Hydra.Names as Names
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Rewriting as Rewriting
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Convert a subterm step to a string representation
+subtermStep :: Paths.SubtermStep -> Maybe String
+subtermStep step =
+
+      let idx = \i -> Nothing
+          idxSuff = \suffix -> \i -> Maybes.map (\s -> Strings.cat2 s suffix) (idx i)
+      in case step of
+        Paths.SubtermStepAnnotatedBody -> Nothing
+        Paths.SubtermStepApplicationFunction -> Just "fun"
+        Paths.SubtermStepApplicationArgument -> Just "arg"
+        Paths.SubtermStepLambdaBody -> Just "body"
+        Paths.SubtermStepUnionCasesDefault -> Just "default"
+        Paths.SubtermStepUnionCasesBranch v0 -> Just (Strings.cat2 "." (Core.unName v0))
+        Paths.SubtermStepLetBody -> Just "in"
+        Paths.SubtermStepLetBinding v0 -> Just (Strings.cat2 (Core.unName v0) "=")
+        Paths.SubtermStepListElement v0 -> idx v0
+        Paths.SubtermStepMapKey v0 -> idxSuff ".key" v0
+        Paths.SubtermStepMapValue v0 -> idxSuff ".value" v0
+        Paths.SubtermStepMaybeTerm -> Just "just"
+        Paths.SubtermStepProductTerm v0 -> idx v0
+        Paths.SubtermStepRecordField v0 -> Just (Strings.cat2 "." (Core.unName v0))
+        Paths.SubtermStepSetElement v0 -> idx v0
+        Paths.SubtermStepSumTerm -> Nothing
+        Paths.SubtermStepTypeLambdaBody -> Nothing
+        Paths.SubtermStepTypeApplicationTerm -> Nothing
+        Paths.SubtermStepInjectionTerm -> Nothing
+        Paths.SubtermStepWrappedTerm -> Nothing
+
+-- | Build a subterm graph from a term
+termToSubtermGraph :: M.Map Module.Namespace String -> Core.Term -> Paths.SubtermGraph
+termToSubtermGraph namespaces term =
+
+      let dontCareStep = Paths.SubtermStepAnnotatedBody
+          helper =
+                  \ids -> \mroot -> \path -> \state -> \stepTerm ->
+                    let step = Pairs.first stepTerm
+                        currentTerm = Pairs.second stepTerm
+                        nodesEdges = Pairs.first state
+                        visited = Pairs.second state
+                        nodes = Pairs.first nodesEdges
+                        edges = Pairs.second nodesEdges
+                        nextPath = Lists.cons step path
+                    in case currentTerm of
+                      Core.TermLet v0 ->
+                        let bindings = Core.letBindings v0
+                            env = Core.letBody v0
+                            bindingNames = Lists.map Core.bindingName bindings
+                            addBindingName =
+                                    \nodesVisitedIds -> \name ->
+                                      let currentNodesVisited = Pairs.first nodesVisitedIds
+                                          currentIds = Pairs.second nodesVisitedIds
+                                          currentNodes = Pairs.first currentNodesVisited
+                                          currentVisited = Pairs.second currentNodesVisited
+                                          rawLabel = Names.compactName namespaces name
+                                          uniqueLabel = Names.uniqueLabel currentVisited rawLabel
+                                          node =
+                                                  Paths.SubtermNode {
+                                                    Paths.subtermNodeName = name,
+                                                    Paths.subtermNodeLabel = rawLabel,
+                                                    Paths.subtermNodeId = uniqueLabel}
+                                          newVisited = Sets.insert uniqueLabel currentVisited
+                                          newNodes = Lists.cons node currentNodes
+                                          newIds = Maps.insert name node currentIds
+                                      in ((newNodes, newVisited), newIds)
+                            nodesVisitedIds1 = Lists.foldl addBindingName (([], visited), ids) bindingNames
+                            nodes1 = Pairs.first (Pairs.first nodesVisitedIds1)
+                            visited1 = Pairs.second (Pairs.first nodesVisitedIds1)
+                            ids1 = Pairs.second nodesVisitedIds1
+                            addBindingTerm =
+                                    \currentState -> \nodeBinding ->
+                                      let root = Pairs.first nodeBinding
+                                          binding = Pairs.second nodeBinding
+                                          term1 = Core.bindingTerm binding
+                                      in (helper ids1 (Just root) [] currentState (dontCareStep, term1))
+                            nodeBindingPairs = Lists.zip nodes1 bindings
+                            stateAfterBindings = Lists.foldl addBindingTerm ((Lists.concat2 nodes1 nodes, edges), visited1) nodeBindingPairs
+                        in (helper ids1 mroot nextPath stateAfterBindings (Paths.SubtermStepLetBody, env))
+                      Core.TermVariable v0 -> Maybes.maybe state (\root -> Maybes.maybe state (\node ->
+                        let edge =
+                                Paths.SubtermEdge {
+                                  Paths.subtermEdgeSource = root,
+                                  Paths.subtermEdgePath = (Paths.SubtermPath (Lists.reverse nextPath)),
+                                  Paths.subtermEdgeTarget = node}
+                            newEdges = Lists.cons edge edges
+                        in ((nodes, newEdges), visited)) (Maps.lookup v0 ids)) mroot
+                      _ -> Lists.foldl (helper ids mroot nextPath) state (Rewriting.subtermsWithSteps currentTerm)
+          initialState = (([], []), Sets.empty)
+          result = helper Maps.empty Nothing [] initialState (dontCareStep, term)
+          finalNodesEdges = Pairs.first result
+          finalNodes = Pairs.first finalNodesEdges
+          finalEdges = Pairs.second finalNodesEdges
+      in Paths.SubtermGraph {
+        Paths.subtermGraphNodes = finalNodes,
+        Paths.subtermGraphEdges = finalEdges}
diff --git a/src/gen-main/haskell/Hydra/Show/Typing.hs b/src/gen-main/haskell/Hydra/Show/Typing.hs
--- a/src/gen-main/haskell/Hydra/Show/Typing.hs
+++ b/src/gen-main/haskell/Hydra/Show/Typing.hs
@@ -19,29 +19,32 @@
 import qualified Data.Set as S
 
 -- | Show a type constraint as a string
-typeConstraint :: (Typing.TypeConstraint -> String)
-typeConstraint tc =  
-  let ltyp = (Typing.typeConstraintLeft tc) 
-      rtyp = (Typing.typeConstraintRight tc)
-  in (Strings.cat [
-    Core_.type_ ltyp,
-    "\8801",
-    (Core_.type_ rtyp)])
+typeConstraint :: Typing.TypeConstraint -> String
+typeConstraint tc =
 
+      let ltyp = Typing.typeConstraintLeft tc
+          rtyp = Typing.typeConstraintRight tc
+      in (Strings.cat [
+        Core_.type_ ltyp,
+        "\8801",
+        (Core_.type_ rtyp)])
+
 -- | Show a type substitution as a string
-typeSubst :: (Typing.TypeSubst -> String)
-typeSubst ts =  
-  let subst = (Typing.unTypeSubst ts) 
-      pairs = (Maps.toList subst)
-      showPair = (\pair ->  
-              let name = (Core.unName (Pairs.first pair)) 
-                  typ = (Pairs.second pair)
-              in (Strings.cat [
-                name,
-                "\8614",
-                (Core_.type_ typ)]))
-      pairStrs = (Lists.map showPair pairs)
-  in (Strings.cat [
-    "{",
-    (Strings.intercalate "," pairStrs),
-    "}"])
+typeSubst :: Typing.TypeSubst -> String
+typeSubst ts =
+
+      let subst = Typing.unTypeSubst ts
+          pairs = Maps.toList subst
+          showPair =
+                  \pair ->
+                    let name = Core.unName (Pairs.first pair)
+                        typ = Pairs.second pair
+                    in (Strings.cat [
+                      name,
+                      "\8614",
+                      (Core_.type_ typ)])
+          pairStrs = Lists.map showPair pairs
+      in (Strings.cat [
+        "{",
+        (Strings.intercalate "," pairStrs),
+        "}"])
diff --git a/src/gen-main/haskell/Hydra/Show/Util.hs b/src/gen-main/haskell/Hydra/Show/Util.hs
--- a/src/gen-main/haskell/Hydra/Show/Util.hs
+++ b/src/gen-main/haskell/Hydra/Show/Util.hs
@@ -13,9 +13,10 @@
 import qualified Data.Set as S
 
 -- | Show a case convention as a string
-caseConvention :: (Util.CaseConvention -> String)
-caseConvention c = ((\x -> case x of
-  Util.CaseConventionLowerSnake -> "lower_snake_case"
-  Util.CaseConventionUpperSnake -> "UPPER_SNAKE_CASE"
-  Util.CaseConventionCamel -> "camelCase"
-  Util.CaseConventionPascal -> "PascalCase") c)
+caseConvention :: Util.CaseConvention -> String
+caseConvention c =
+    case c of
+      Util.CaseConventionLowerSnake -> "lower_snake_case"
+      Util.CaseConventionUpperSnake -> "UPPER_SNAKE_CASE"
+      Util.CaseConventionCamel -> "camelCase"
+      Util.CaseConventionPascal -> "PascalCase"
diff --git a/src/gen-main/haskell/Hydra/Sorting.hs b/src/gen-main/haskell/Hydra/Sorting.hs
--- a/src/gen-main/haskell/Hydra/Sorting.hs
+++ b/src/gen-main/haskell/Hydra/Sorting.hs
@@ -1,17 +1,18 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- | Utilities for sorting.
+-- | Utilities for sorting. This module includes an implementation of Tarjan's algorithm, originally based on GraphSCC by Iavor S. Diatchki: https://hackage.haskell.org/package/GraphSCC.
 
 module Hydra.Sorting where
 
+import qualified Hydra.Constants as Constants
 import qualified Hydra.Lib.Equality as Equality
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Math as Math
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Pairs as Pairs
 import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Tarjan as Tarjan
 import qualified Hydra.Topology as Topology
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -22,73 +23,201 @@
 
 -- | Convert an adjacency list to a map, concatenating values for duplicate keys
 adjacencyListToMap :: Ord t0 => ([(t0, [t1])] -> M.Map t0 [t1])
-adjacencyListToMap pairs = (Lists.foldl (\mp -> \p ->  
-  let k = (Pairs.first p)
-  in  
-    let vs = (Pairs.second p)
-    in  
-      let existing = (Maybes.maybe [] Equality.identity (Maps.lookup k mp))
-      in (Maps.insert k (Lists.concat2 existing vs) mp)) Maps.empty pairs)
+adjacencyListToMap pairs =
+    Lists.foldl (\mp -> \p ->
+      let k = Pairs.first p
+          vs = Pairs.second p
+          existing = Maybes.maybe [] Equality.identity (Maps.lookup k mp)
+      in (Maps.insert k (Lists.concat2 existing vs) mp)) Maps.empty pairs
 
+-- | Given a list of adjacency lists represented as (key, [key]) pairs, construct a graph along with a function mapping each vertex (an Int) back to its original key.
+adjacencyListsToGraph :: Ord t0 => ([(t0, [t0])] -> (M.Map Int [Int], (Int -> t0)))
+adjacencyListsToGraph edges0 =
+
+      let sortedEdges = Lists.sortOn Pairs.first edges0
+          indexedEdges = Lists.zip (Math.range 0 (Lists.length sortedEdges)) sortedEdges
+          keyToVertex =
+                  Maps.fromList (Lists.map (\vkNeighbors ->
+                    let v = Pairs.first vkNeighbors
+                        kNeighbors = Pairs.second vkNeighbors
+                        k = Pairs.first kNeighbors
+                    in (k, v)) indexedEdges)
+          vertexMap =
+                  Maps.fromList (Lists.map (\vkNeighbors ->
+                    let v = Pairs.first vkNeighbors
+                        kNeighbors = Pairs.second vkNeighbors
+                        k = Pairs.first kNeighbors
+                    in (v, k)) indexedEdges)
+          graph =
+                  Maps.fromList (Lists.map (\vkNeighbors ->
+                    let v = Pairs.first vkNeighbors
+                        kNeighbors = Pairs.second vkNeighbors
+                        neighbors = Pairs.second kNeighbors
+                    in (v, (Maybes.mapMaybe (\k -> Maps.lookup k keyToVertex) neighbors))) indexedEdges)
+          vertexToKey = \v -> Maybes.fromJust (Maps.lookup v vertexMap)
+      in (graph, vertexToKey)
+
 createOrderingIsomorphism :: Ord t0 => ([t0] -> [t0] -> Topology.OrderingIsomorphism t1)
-createOrderingIsomorphism sourceOrd targetOrd =  
-  let sourceToTargetMapping = (\els ->  
-          let mp = (Maps.fromList (Lists.zip sourceOrd els))
-          in (Maybes.cat (Lists.map (\n -> Maps.lookup n mp) targetOrd)))
-  in  
-    let targetToSourceMapping = (\els ->  
-            let mp = (Maps.fromList (Lists.zip targetOrd els))
-            in (Maybes.cat (Lists.map (\n -> Maps.lookup n mp) sourceOrd)))
-    in Topology.OrderingIsomorphism {
-      Topology.orderingIsomorphismEncode = sourceToTargetMapping,
-      Topology.orderingIsomorphismDecode = targetToSourceMapping}
+createOrderingIsomorphism sourceOrd targetOrd =
 
+      let sourceToTargetMapping =
+              \els ->
+                let mp = Maps.fromList (Lists.zip sourceOrd els)
+                in (Maybes.cat (Lists.map (\n -> Maps.lookup n mp) targetOrd))
+          targetToSourceMapping =
+                  \els ->
+                    let mp = Maps.fromList (Lists.zip targetOrd els)
+                    in (Maybes.cat (Lists.map (\n -> Maps.lookup n mp) sourceOrd))
+      in Topology.OrderingIsomorphism {
+        Topology.orderingIsomorphismEncode = sourceToTargetMapping,
+        Topology.orderingIsomorphismDecode = targetToSourceMapping}
+
 -- | Given an adjacency function and a distinguished root node, find all reachable nodes (including the root node)
 findReachableNodes :: Ord t0 => ((t0 -> S.Set t0) -> t0 -> S.Set t0)
-findReachableNodes adj root =  
-  let visit = (\visited -> \node ->  
-          let toVisit = (Sets.difference (adj node) visited)
-          in (Logic.ifElse (Sets.null toVisit) visited (Lists.foldl (\v -> \n -> visit (Sets.insert n v) n) visited (Sets.toList toVisit))))
-  in (visit (Sets.singleton root) root)
+findReachableNodes adj root =
 
+      let visit =
+              \visited -> \node ->
+                let toVisit = Sets.difference (adj node) visited
+                in (Logic.ifElse (Sets.null toVisit) visited (Lists.foldl (\v -> \n -> visit (Sets.insert n v) n) visited (Sets.toList toVisit)))
+      in (visit (Sets.singleton root) root)
+
+-- | Initial state for Tarjan's algorithm
+initialState :: Topology.TarjanState
+initialState =
+    Topology.TarjanState {
+      Topology.tarjanStateCounter = 0,
+      Topology.tarjanStateIndices = Maps.empty,
+      Topology.tarjanStateLowLinks = Maps.empty,
+      Topology.tarjanStateStack = [],
+      Topology.tarjanStateOnStack = Sets.empty,
+      Topology.tarjanStateSccs = []}
+
+-- | Pop vertices off the stack until the given vertex is reached, collecting the current strongly connected component
+popStackUntil :: Int -> Topology.TarjanState -> ([Int], Topology.TarjanState)
+popStackUntil v st0 =
+
+      let go =
+              \acc -> \st ->
+                let x = Lists.head (Topology.tarjanStateStack st)
+                    xs = Lists.tail (Topology.tarjanStateStack st)
+                    newSt =
+                            Topology.TarjanState {
+                              Topology.tarjanStateCounter = (Topology.tarjanStateCounter st),
+                              Topology.tarjanStateIndices = (Topology.tarjanStateIndices st),
+                              Topology.tarjanStateLowLinks = (Topology.tarjanStateLowLinks st),
+                              Topology.tarjanStateStack = xs,
+                              Topology.tarjanStateOnStack = (Topology.tarjanStateOnStack st),
+                              Topology.tarjanStateSccs = (Topology.tarjanStateSccs st)}
+                    newSt2 =
+                            Topology.TarjanState {
+                              Topology.tarjanStateCounter = (Topology.tarjanStateCounter newSt),
+                              Topology.tarjanStateIndices = (Topology.tarjanStateIndices newSt),
+                              Topology.tarjanStateLowLinks = (Topology.tarjanStateLowLinks newSt),
+                              Topology.tarjanStateStack = (Topology.tarjanStateStack newSt),
+                              Topology.tarjanStateOnStack = (Sets.delete x (Topology.tarjanStateOnStack st)),
+                              Topology.tarjanStateSccs = (Topology.tarjanStateSccs newSt)}
+                    acc_ = Lists.cons x acc
+                in (Logic.ifElse (Equality.equal x v) (Lists.reverse acc_, newSt2) (go acc_ newSt2))
+      in (go [] st0)
+
 -- | Given a graph as an adjacency list of edges and a list of explicit tags per node, compute the full set of tags for each node by propagating tags through edges. If there is an edge from n1 to n2 and n2 has tag t, then n1 also has tag t. Note: pairs in the output are not ordered.
 propagateTags :: (Ord t0, Ord t1) => ([(t0, [t0])] -> [(t0, [t1])] -> [(t0, (S.Set t1))])
-propagateTags edges nodeTags =  
-  let adjMap = (adjacencyListToMap edges)
-  in  
-    let tagMap = (Maps.map Sets.fromList (adjacencyListToMap nodeTags))
-    in  
-      let allNodes = (Sets.toList (Sets.fromList (Lists.concat2 (Lists.map Pairs.first edges) (Lists.map Pairs.first nodeTags))))
-      in  
-        let getTagsForNode = (\node ->  
-                let reachable = (findReachableNodes (\n -> Sets.fromList (Maybes.maybe [] Equality.identity (Maps.lookup n adjMap))) node)
-                in (Sets.unions (Lists.map (\n -> Maybes.maybe Sets.empty Equality.identity (Maps.lookup n tagMap)) (Sets.toList reachable))))
-        in (Lists.map (\n -> (n, (getTagsForNode n))) allNodes)
+propagateTags edges nodeTags =
 
+      let adjMap = adjacencyListToMap edges
+          tagMap = Maps.map Sets.fromList (adjacencyListToMap nodeTags)
+          allNodes = Sets.toList (Sets.fromList (Lists.concat2 (Lists.map Pairs.first edges) (Lists.map Pairs.first nodeTags)))
+          getTagsForNode =
+                  \node ->
+                    let reachable = findReachableNodes (\n -> Sets.fromList (Maybes.maybe [] Equality.identity (Maps.lookup n adjMap))) node
+                    in (Sets.unions (Lists.map (\n -> Maybes.maybe Sets.empty Equality.identity (Maps.lookup n tagMap)) (Sets.toList reachable)))
+      in (Lists.map (\n -> (n, (getTagsForNode n))) allNodes)
+
+-- | Visit a vertex and recursively explore its successors
+strongConnect :: M.Map Int [Int] -> Int -> Topology.TarjanState -> Topology.TarjanState
+strongConnect graph v st =
+
+      let i = Topology.tarjanStateCounter st
+          newSt =
+                  Topology.TarjanState {
+                    Topology.tarjanStateCounter = (Math.add i 1),
+                    Topology.tarjanStateIndices = (Maps.insert v i (Topology.tarjanStateIndices st)),
+                    Topology.tarjanStateLowLinks = (Maps.insert v i (Topology.tarjanStateLowLinks st)),
+                    Topology.tarjanStateStack = (Lists.cons v (Topology.tarjanStateStack st)),
+                    Topology.tarjanStateOnStack = (Sets.insert v (Topology.tarjanStateOnStack st)),
+                    Topology.tarjanStateSccs = (Topology.tarjanStateSccs st)}
+          neighbors = Maps.findWithDefault [] v graph
+          processNeighbor =
+                  \st_ -> \w ->
+                    let lowLink =
+                            \s ->
+                              let lowV1 = Maps.findWithDefault Constants.maxInt32 v (Topology.tarjanStateLowLinks s)
+                                  idx_w = Maps.findWithDefault Constants.maxInt32 w (Topology.tarjanStateIndices s)
+                              in Topology.TarjanState {
+                                Topology.tarjanStateCounter = (Topology.tarjanStateCounter s),
+                                Topology.tarjanStateIndices = (Topology.tarjanStateIndices s),
+                                Topology.tarjanStateLowLinks = (Maps.insert v (Equality.min lowV1 idx_w) (Topology.tarjanStateLowLinks s)),
+                                Topology.tarjanStateStack = (Topology.tarjanStateStack s),
+                                Topology.tarjanStateOnStack = (Topology.tarjanStateOnStack s),
+                                Topology.tarjanStateSccs = (Topology.tarjanStateSccs s)}
+                    in (Logic.ifElse (Logic.not (Maps.member w (Topology.tarjanStateIndices st_))) (
+                      let stAfter = strongConnect graph w st_
+                          lowV2 = Maps.findWithDefault Constants.maxInt32 v (Topology.tarjanStateLowLinks stAfter)
+                          low_w = Maps.findWithDefault Constants.maxInt32 w (Topology.tarjanStateLowLinks stAfter)
+                      in Topology.TarjanState {
+                        Topology.tarjanStateCounter = (Topology.tarjanStateCounter stAfter),
+                        Topology.tarjanStateIndices = (Topology.tarjanStateIndices stAfter),
+                        Topology.tarjanStateLowLinks = (Maps.insert v (Equality.min lowV2 low_w) (Topology.tarjanStateLowLinks stAfter)),
+                        Topology.tarjanStateStack = (Topology.tarjanStateStack stAfter),
+                        Topology.tarjanStateOnStack = (Topology.tarjanStateOnStack stAfter),
+                        Topology.tarjanStateSccs = (Topology.tarjanStateSccs stAfter)}) (Logic.ifElse (Sets.member w (Topology.tarjanStateOnStack st_)) (lowLink st_) st_))
+          stAfterNeighbors = Lists.foldl processNeighbor newSt neighbors
+          low_v = Maps.findWithDefault Constants.maxInt32 v (Topology.tarjanStateLowLinks stAfterNeighbors)
+          idx_v = Maps.findWithDefault Constants.maxInt32 v (Topology.tarjanStateIndices stAfterNeighbors)
+      in (Logic.ifElse (Equality.equal low_v idx_v) (
+        let compResult = popStackUntil v stAfterNeighbors
+            comp = Pairs.first compResult
+            stPopped = Pairs.second compResult
+        in Topology.TarjanState {
+          Topology.tarjanStateCounter = (Topology.tarjanStateCounter stPopped),
+          Topology.tarjanStateIndices = (Topology.tarjanStateIndices stPopped),
+          Topology.tarjanStateLowLinks = (Topology.tarjanStateLowLinks stPopped),
+          Topology.tarjanStateStack = (Topology.tarjanStateStack stPopped),
+          Topology.tarjanStateOnStack = (Topology.tarjanStateOnStack stPopped),
+          Topology.tarjanStateSccs = (Lists.cons comp (Topology.tarjanStateSccs stPopped))}) stAfterNeighbors)
+
+-- | Compute the strongly connected components of the given graph. The components are returned in reverse topological order
+stronglyConnectedComponents :: M.Map Int [Int] -> [[Int]]
+stronglyConnectedComponents graph =
+
+      let verts = Maps.keys graph
+          finalState =
+                  Lists.foldl (\st -> \v -> Logic.ifElse (Maps.member v (Topology.tarjanStateIndices st)) st (strongConnect graph v st)) initialState verts
+      in (Lists.reverse (Lists.map Lists.sort (Topology.tarjanStateSccs finalState)))
+
 -- | Sort a directed acyclic graph (DAG) based on an adjacency list. Yields a list of nontrivial strongly connected components if the graph has cycles, otherwise a simple list.
 topologicalSort :: Ord t0 => ([(t0, [t0])] -> Either [[t0]] [t0])
-topologicalSort pairs =  
-  let sccs = (topologicalSortComponents pairs)
-  in  
-    let isCycle = (\scc -> Logic.not (Lists.null (Lists.tail scc)))
-    in  
-      let withCycles = (Lists.filter isCycle sccs)
+topologicalSort pairs =
+
+      let sccs = topologicalSortComponents pairs
+          isCycle = \scc -> Logic.not (Lists.null (Lists.tail scc))
+          withCycles = Lists.filter isCycle sccs
       in (Logic.ifElse (Lists.null withCycles) (Right (Lists.concat sccs)) (Left withCycles))
 
 -- | Find the strongly connected components (including cycles and isolated vertices) of a graph, in (reverse) topological order, i.e. dependencies before dependents
 topologicalSortComponents :: Ord t0 => ([(t0, [t0])] -> [[t0]])
-topologicalSortComponents pairs =  
-  let graphResult = (Tarjan.adjacencyListsToGraph pairs)
-  in  
-    let g = (Pairs.first graphResult)
-    in (Lists.map (\comp -> Lists.map (Pairs.second graphResult) comp) (Tarjan.stronglyConnectedComponents g))
+topologicalSortComponents pairs =
 
+      let graphResult = adjacencyListsToGraph pairs
+          g = Pairs.first graphResult
+      in (Lists.map (\comp -> Lists.map (Pairs.second graphResult) comp) (stronglyConnectedComponents g))
+
 -- | Sort a directed acyclic graph (DAG) of nodes using two helper functions: one for node keys, and one for the adjacency list of connected node keys. The result is a list of strongly-connected components (cycles), in which singleton lists represent acyclic nodes.
 topologicalSortNodes :: Ord t1 => ((t0 -> t1) -> (t0 -> [t1]) -> [t0] -> [[t0]])
-topologicalSortNodes getKey getAdj nodes =  
-  let nodesByKey = (Maps.fromList (Lists.map (\n -> (getKey n, n)) nodes))
-  in  
-    let pairs = (Lists.map (\n -> (getKey n, (getAdj n))) nodes)
-    in  
-      let comps = (topologicalSortComponents pairs)
+topologicalSortNodes getKey getAdj nodes =
+
+      let nodesByKey = Maps.fromList (Lists.map (\n -> (getKey n, n)) nodes)
+          pairs = Lists.map (\n -> (getKey n, (getAdj n))) nodes
+          comps = topologicalSortComponents pairs
       in (Lists.map (\c -> Maybes.cat (Lists.map (\k -> Maps.lookup k nodesByKey) c)) comps)
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Accessors.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Accessors.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Accessors.hs
+++ /dev/null
@@ -1,1352 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.decode.accessors
-
-module Hydra.Sources.Decode.Accessors where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.accessors"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.accessors.accessorEdge"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.accessors.AccessorEdge"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "source"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.accessors.accessorNode"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_source"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "path"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.accessors.accessorPath"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_path"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "target"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.accessors.accessorNode"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_target"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.accessors.AccessorEdge"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "source"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_source"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "path"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_path"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "target"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_target"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.accessors.AccessorEdge"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.accessors.accessorGraph"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.accessors.AccessorGraph"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "nodes"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.accessors.accessorNode"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_nodes"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "edges"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.accessors.accessorEdge"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_edges"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.accessors.AccessorGraph"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "nodes"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_nodes"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "edges"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_edges"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.accessors.AccessorGraph"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.accessors.accessorNode"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.accessors.AccessorNode"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "label"))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "cx"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "raw"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "err"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "stripped"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "literal"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "v"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                  Core.caseStatementCases = [
-                                                                    Core.Field {
-                                                                      Core.fieldName = (Core.Name "string"),
-                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                        Core.lambdaParameter = (Core.Name "s"),
-                                                                        Core.lambdaDomain = Nothing,
-                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_label"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "id"))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "string"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                            Core.lambdaParameter = (Core.Name "s"),
-                                                                            Core.lambdaDomain = Nothing,
-                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_id"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.accessors.AccessorNode"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "name"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "label"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_label"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "id"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_id"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.accessors.AccessorNode"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.accessors.accessorPath"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.accessors.AccessorPath"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.accessors.AccessorPath"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.accessors.termAccessor"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.accessors.AccessorPath"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.accessors.termAccessor"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.accessors.TermAccessor"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotatedBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "annotatedBody"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationFunction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "applicationFunction"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationArgument"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "applicationArgument"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambdaBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lambdaBody"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionCasesDefault"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "unionCasesDefault"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionCasesBranch"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "unionCasesBranch"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "letBody"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letBinding"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "letBinding"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "listElement"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "listElement"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapKey"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "mapKey"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapValue"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "mapValue"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybeTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "maybeTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "productTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "productTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "recordField"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "recordField"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "setElement"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "setElement"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sumTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "sumTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambdaBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeLambdaBody"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplicationTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeApplicationTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "injectionTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "injectionTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrappedTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "wrappedTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.accessors.TermAccessor"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.accessors",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.accessors")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Ast.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Ast.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Ast.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Ast.hs
@@ -14,2104 +14,2180 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.ast"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.associativity"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.ast.Associativity"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "none"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "none"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "left"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "right"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "both"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "both"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Associativity"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.blockStyle"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.ast.BlockStyle"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "indent"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "cx"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "raw"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "err"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "stripped"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                      Core.caseStatementCases = [
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "literal"),
-                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "v"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                Core.caseStatementCases = [
-                                                                  Core.Field {
-                                                                    Core.fieldName = (Core.Name "string"),
-                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                      Core.lambdaParameter = (Core.Name "s"),
-                                                                      Core.lambdaDomain = Nothing,
-                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_indent"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "newlineBeforeContent"))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "cx"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "raw"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "err"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "stripped"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "literal"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "v"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
-                                                                  Core.caseStatementCases = [
-                                                                    Core.Field {
-                                                                      Core.fieldName = (Core.Name "boolean"),
-                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                        Core.lambdaParameter = (Core.Name "b"),
-                                                                        Core.lambdaDomain = Nothing,
-                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_newlineBeforeContent"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "newlineAfterContent"))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "boolean"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                            Core.lambdaParameter = (Core.Name "b"),
-                                                                            Core.lambdaDomain = Nothing,
-                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_newlineAfterContent"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.ast.BlockStyle"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "indent"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_indent"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "newlineBeforeContent"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_newlineBeforeContent"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "newlineAfterContent"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_newlineAfterContent"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.BlockStyle"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.bracketExpr"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.ast.BracketExpr"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "brackets"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.brackets"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_brackets"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "enclosed"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_enclosed"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "style"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.blockStyle"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_style"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.ast.BracketExpr"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "brackets"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_brackets"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "enclosed"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_enclosed"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "style"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_style"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.BracketExpr"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.brackets"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.ast.Brackets"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "open"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.symbol"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_open"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "close"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.symbol"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_close"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.ast.Brackets"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "open"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_open"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "close"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_close"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Brackets"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.expr"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.ast.Expr"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "const"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "const"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.symbol")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "indent"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "indent"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.indentedExpression")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "op"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "op"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.opExpr")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "brackets"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "brackets"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.bracketExpr")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Expr"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.indentedExpression"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.ast.IndentedExpression"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "style"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.indentStyle"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_style"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expr"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_expr"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.ast.IndentedExpression"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "style"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_style"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "expr"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_expr"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.IndentedExpression"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.indentStyle"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.ast.IndentStyle"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "allLines"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "allLines"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subsequentLines"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "subsequentLines"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.IndentStyle"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.op"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.ast.Op"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "symbol"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.symbol"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_symbol"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "padding"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.padding"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_padding"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "precedence"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.precedence"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_precedence"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "associativity"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.associativity"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_associativity"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.ast.Op"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "symbol"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_symbol"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "padding"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_padding"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "precedence"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_precedence"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "associativity"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_associativity"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Op"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.opExpr"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.ast.OpExpr"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "op"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.op"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_op"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "lhs"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_lhs"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "rhs"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_rhs"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.ast.OpExpr"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "op"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_op"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "lhs"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_lhs"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "rhs"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_rhs"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.OpExpr"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.padding"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.ast.Padding"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.ws"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_left"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.ws"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_right"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.ast.Padding"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "left"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "right"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Padding"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.precedence"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.ast.Precedence"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.ast.Precedence"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "integer"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                              Core.caseStatementCases = [
-                                                                Core.Field {
-                                                                  Core.fieldName = (Core.Name "int32"),
-                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                    Core.lambdaParameter = (Core.Name "i"),
-                                                                    Core.lambdaDomain = Nothing,
-                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Precedence"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.symbol"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.ast.Symbol"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.ast.Symbol"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Symbol"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.ast.ws"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.ast.Ws"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "none"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "none"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "space"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "space"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "break"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "break"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "breakAndIndent"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "breakAndIndent"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "doubleBreak"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "doubleBreak"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Ws"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.ast",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.ast")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.ast"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.associativity"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "none"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "none"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "left"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "right"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "both"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Associativity"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "both"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Associativity"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.blockStyle"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "indent"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "cx"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "raw"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "err"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "stripped"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                          Core.caseStatementCases = [
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "literal"),
+                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "v"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                    Core.caseStatementCases = [
+                                                                      Core.Field {
+                                                                        Core.fieldName = (Core.Name "string"),
+                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                          Core.lambdaParameter = (Core.Name "s"),
+                                                                          Core.lambdaDomain = Nothing,
+                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_indent"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "newlineBeforeContent"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "boolean"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "b"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_newlineBeforeContent"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "newlineAfterContent"))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "boolean"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "b"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_newlineAfterContent"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.ast.BlockStyle"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "indent"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_indent"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "newlineBeforeContent"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_newlineBeforeContent"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "newlineAfterContent"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_newlineAfterContent"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.BlockStyle"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.bracketExpr"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "brackets"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.brackets"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_brackets"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "enclosed"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_enclosed"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "style"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.blockStyle"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_style"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.ast.BracketExpr"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "brackets"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_brackets"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "enclosed"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_enclosed"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "style"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_style"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.BracketExpr"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.brackets"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "open"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.symbol"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_open"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "close"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.symbol"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_close"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.ast.Brackets"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "open"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_open"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "close"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_close"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Brackets"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.expr"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "const"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "const"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.symbol")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "indent"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "indent"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.indentedExpression")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "op"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "op"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.opExpr")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "brackets"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "brackets"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.bracketExpr")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "seq"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Expr"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "seq"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.ast.seqExpr")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Expr"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.indentedExpression"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "style"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.indentStyle"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_style"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expr"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_expr"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "style"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_style"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "expr"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expr"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.IndentedExpression"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.indentStyle"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "allLines"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "allLines"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "string"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "s"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subsequentLines"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.IndentStyle"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "subsequentLines"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "string"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "s"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.IndentStyle"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.op"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "symbol"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.symbol"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_symbol"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "padding"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.padding"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_padding"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "precedence"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.precedence"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_precedence"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "associativity"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.associativity"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_associativity"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.ast.Op"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "symbol"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_symbol"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "padding"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_padding"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "precedence"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_precedence"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "associativity"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_associativity"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Op"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.opExpr"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "op"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.op"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_op"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "lhs"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_lhs"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "rhs"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_rhs"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.ast.OpExpr"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "op"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_op"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "lhs"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_lhs"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "rhs"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_rhs"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.OpExpr"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.padding"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.ws"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_left"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.ws"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_right"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.ast.Padding"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "left"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "right"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Padding"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.precedence"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.ast.Precedence"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "integer"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "int32"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                        Core.lambdaParameter = (Core.Name "i"),
+                                                                        Core.lambdaDomain = Nothing,
+                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Precedence"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.seqExpr"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "op"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.op"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_op"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "elements"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_elements"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.ast.SeqExpr"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "op"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_op"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "elements"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_elements"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.SeqExpr"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.symbol"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.ast.Symbol"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Symbol"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.ast.ws"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "none"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "none"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "space"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "space"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "break"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "break"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "breakAndIndent"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "breakAndIndent"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "string"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "s"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "doubleBreak"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.ast.Ws"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "doubleBreak"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.ast.Ws"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.ast",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.ast")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Classes.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Classes.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Classes.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Classes.hs
@@ -14,174 +14,164 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.classes"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.classes.typeClass"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.classes.TypeClass"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equality"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "equality"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "ordering"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.classes"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.classes.typeClass"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equality"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "equality"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "ordering"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "ordering"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
                                       Core.lambdaDomain = Nothing,
                                       Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.classes.TypeClass"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "ordering"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.classes.TypeClass"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.classes",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.classes")}
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.classes.TypeClass"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.classes",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.classes")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Coders.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Coders.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Coders.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Coders.hs
@@ -14,453 +14,432 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.coders"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.coders.coderDirection"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.coders.CoderDirection"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "encode"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.coders"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.coders.coderDirection"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "encode"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "encode"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "decode"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "decode"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
                                       Core.lambdaDomain = Nothing,
                                       Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "encode"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "decode"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.coders.languageName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.coders.LanguageName"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
                                       Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.coders.CoderDirection"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "decode"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.coders.LanguageName"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.coders.traversalOrder"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
                                       Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.coders.languageName"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.coders.LanguageName"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.coders.LanguageName"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pre"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
                                           Core.lambdaDomain = Nothing,
                                           Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.coders.LanguageName"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.coders.traversalOrder"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.coders.TraversalOrder"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pre"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "pre"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "post"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "pre"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "post"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "post"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
                                       Core.lambdaDomain = Nothing,
                                       Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.coders.TraversalOrder"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "post"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.coders.TraversalOrder"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core"),
-    (Module.Namespace "hydra.decode.graph"),
-    (Module.Namespace "hydra.decode.compute"),
-    (Module.Namespace "hydra.decode.variants")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.coders",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.coders")}
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.coders.TraversalOrder"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.graph"),
+        (Module.Namespace "hydra.decode.util"),
+        (Module.Namespace "hydra.decode.variants")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.coders",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.coders")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Compute.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Compute.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Compute.hs
+++ /dev/null
@@ -1,394 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.decode.compute
-
-module Hydra.Sources.Decode.Compute where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.compute"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.compute.flowState"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "s"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "v"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "cx"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "raw"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "err"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "stripped"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.compute.FlowState"))}))))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "record"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "record"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermLet (Core.Let {
-                                Core.letBindings = [
-                                  Core.Binding {
-                                    Core.bindingName = (Core.Name "fieldMap"),
-                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                    Core.bindingType = Nothing}],
-                                Core.letBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "value"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_value"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "state"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_state"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "trace"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.compute.trace"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_trace"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "value"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_value"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "state"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_state"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "trace"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_trace"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "s",
-          (Core.Name "v")],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "s"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                  Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.FlowState")),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s"))}))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.compute.trace"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.compute.Trace"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "stack"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "cx"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "raw"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "err"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "stripped"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                      Core.caseStatementCases = [
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "literal"),
-                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "v"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                Core.caseStatementCases = [
-                                                                  Core.Field {
-                                                                    Core.fieldName = (Core.Name "string"),
-                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                      Core.lambdaParameter = (Core.Name "s"),
-                                                                      Core.lambdaDomain = Nothing,
-                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_stack"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "messages"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_messages"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "other"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_other"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "stack"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_stack"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "messages"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_messages"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "other"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_other"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.compute.Trace"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.compute",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.compute")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Constraints.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Constraints.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Constraints.hs
+++ /dev/null
@@ -1,221 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.decode.constraints
-
-module Hydra.Sources.Decode.Constraints where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.constraints"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.constraints.pathEquation"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.constraints.PathEquation"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.path"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_left"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.path"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_right"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.constraints.PathEquation"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "left"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "right"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.constraints.PathEquation"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.constraints.patternImplication"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.constraints.PatternImplication"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "antecedent"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_antecedent"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "consequent"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_consequent"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.constraints.PatternImplication"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "antecedent"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_antecedent"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "consequent"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_consequent"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.constraints.PatternImplication"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core"),
-    (Module.Namespace "hydra.decode.query")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.constraints",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.constraints")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Context.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Context.hs
@@ -0,0 +1,361 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.decode.context
+
+module Hydra.Sources.Decode.Context where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.context"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.context.context"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "trace"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "cx"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "raw"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "err"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "stripped"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                          Core.caseStatementCases = [
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "literal"),
+                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "v"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                    Core.caseStatementCases = [
+                                                                      Core.Field {
+                                                                        Core.fieldName = (Core.Name "string"),
+                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                          Core.lambdaParameter = (Core.Name "s"),
+                                                                          Core.lambdaDomain = Nothing,
+                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_trace"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "messages"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "string"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "s"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_messages"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "other"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_other"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.context.Context"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "trace"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_trace"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "messages"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_messages"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "other"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_other"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.context.Context"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.context.inContext"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "e"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "object"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "e"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "field_object"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "context"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.context.context"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_context"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.context.InContext"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "object"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_object"))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "context"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_context"))}]}))))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "e"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "e"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.context.InContext")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "e"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.context",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.context")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Core.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Core.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Core.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Core.hs
@@ -14,6206 +14,5928 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.core"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.annotatedTerm"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.AnnotatedTerm"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_body"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "annotation"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_annotation"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "body"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "annotation"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_annotation"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedTerm"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.annotatedType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.AnnotatedType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_body"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "annotation"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_annotation"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "body"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "annotation"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_annotation"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.application"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.Application"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "function"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_function"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "argument"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_argument"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.Application"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "function"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_function"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "argument"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_argument"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Application"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.applicationType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.ApplicationType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "function"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_function"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "argument"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_argument"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.ApplicationType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "function"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_function"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "argument"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_argument"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.ApplicationType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.binding"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.Binding"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_term"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_type"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.core.Binding"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "name"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "term"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "type"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Binding"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.caseStatement"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.CaseStatement"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_typeName"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_default"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "cases"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.field"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_cases"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.core.CaseStatement"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "typeName"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "default"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_default"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "cases"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_cases"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.CaseStatement"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.eitherType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.EitherType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_left"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_right"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.EitherType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "left"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "right"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.EitherType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.pairType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.PairType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "first"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_first"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "second"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_second"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.PairType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "first"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_first"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "second"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_second"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.PairType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.elimination"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.Elimination"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "record"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.projection")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "union"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.caseStatement")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "wrap"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Elimination"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.field"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.Field"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_term"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "name"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "term"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Field"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.fieldType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.FieldType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_type"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.FieldType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "name"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "type"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.FieldType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.floatType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.FloatType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigfloat"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "bigfloat"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "float32"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "float64"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.FloatType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.floatValue"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.FloatValue"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigfloat"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "bigfloat"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigfloat literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "float"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigfloat value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "bigfloat"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "f"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "float32"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected float32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "float"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected float32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "float32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "f"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "float64"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected float64 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "float"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected float64 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "float64"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "f"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.FloatValue"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.forallType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.ForallType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "parameter"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_parameter"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_body"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.ForallType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "parameter"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_parameter"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "body"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.ForallType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.function"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.Function"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elimination"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Function"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "elimination"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.elimination")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Function"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lambda"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.lambda")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitive"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Function"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "primitive"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Function"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.functionType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.FunctionType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "domain"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_domain"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "codomain"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_codomain"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.FunctionType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "domain"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_domain"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "codomain"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_codomain"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.FunctionType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.injection"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.Injection"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_typeName"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "field"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.field"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_field"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "typeName"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "field"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_field"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Injection"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.integerType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.IntegerType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigint"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "bigint"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int8"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "int8"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int16"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "int16"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "int32"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "int64"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint8"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "uint8"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint16"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "uint16"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "uint32"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "uint64"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.IntegerType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.integerValue"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.IntegerValue"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigint"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "bigint"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigint literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigint value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "bigint"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int8"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "int8"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int8 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int8 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int8"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int16"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "int16"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int16 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int16 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int16"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "int32"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "int64"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int64 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int64 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int64"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint8"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "uint8"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint8 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint8 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "uint8"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint16"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "uint16"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint16 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint16 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "uint16"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "uint32"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "uint32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "uint64"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint64 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint64 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "uint64"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.IntegerValue"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.lambda"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.Lambda"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "parameter"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_parameter"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "domain"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_domain"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_body"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.core.Lambda"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "parameter"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_parameter"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "domain"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_domain"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "body"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Lambda"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.let"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.Let"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bindings"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.binding"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_bindings"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_body"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.Let"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "bindings"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_bindings"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "body"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Let"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.literal"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.Literal"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "binary"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected binary literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "binary"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "b"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "boolean"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "boolean"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "b"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "float"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.floatValue")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "integer"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.integerValue")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Literal"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.literalType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.LiteralType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "binary"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "boolean"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "float"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.floatType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "integer"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.integerType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.LiteralType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.mapType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.MapType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keys"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_keys"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "values"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_values"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.MapType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "keys"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_keys"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "values"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_values"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.MapType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.name"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.core.Name"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Name"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.projection"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.Projection"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_typeName"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "field"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_field"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.Projection"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "typeName"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "field"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_field"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Projection"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.record"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.Record"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_typeName"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fields"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.field"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_fields"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "typeName"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "fields"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_fields"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Record"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.rowType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.RowType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_typeName"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fields"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.fieldType"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_fields"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.RowType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "typeName"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "fields"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_fields"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.RowType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.term"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.Term"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "annotated"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.annotatedTerm")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "application"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.application")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "either"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "function"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.function")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "let"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "let"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.let")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "list"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "literal"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.literal")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "map"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "maybe"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "pair"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "record"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.record")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "set"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplication"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeApplication"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.typeApplicationTerm")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeLambda"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.typeLambda")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "union"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.injection")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "unit"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "variable"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "wrap"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.wrappedTerm")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.type"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.core.Type"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "annotated"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.annotatedType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "application"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.applicationType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "either"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.eitherType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forall"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "forall"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.forallType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "function"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.functionType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "list"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.type")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "literal"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.literalType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "map"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.mapType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "maybe"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.type")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "pair"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.pairType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "record"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.rowType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "set"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.type")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "union"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.rowType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "unit"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "variable"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Type"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "wrap"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.wrappedType")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Type"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.typeApplicationTerm"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.TypeApplicationTerm"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_body"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_type"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "body"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "type"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.TypeApplicationTerm"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.typeLambda"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.TypeLambda"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "parameter"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_parameter"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_body"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.TypeLambda"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "parameter"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_parameter"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "body"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.TypeLambda"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.typeScheme"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.TypeScheme"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "variables"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_variables"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_type"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "constraints"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeVariableMetadata"))}))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_constraints"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.core.TypeScheme"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "variables"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_variables"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "type"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "constraints"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_constraints"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.typeVariableMetadata"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.TypeVariableMetadata"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "classes"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_classes"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                  Core.recordTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
-                                  Core.recordFields = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "classes"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_classes"))}]}))))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.TypeVariableMetadata"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.wrappedTerm"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.WrappedTerm"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_typeName"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_body"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "typeName"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "body"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.WrappedTerm"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.core.wrappedType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.core.WrappedType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_typeName"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_body"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.core.WrappedType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "typeName"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "body"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.WrappedType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.core",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.core")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.core"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.annotatedTerm"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_body"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "annotation"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_annotation"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "body"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "annotation"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_annotation"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedTerm"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.annotatedType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_body"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "annotation"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_annotation"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.AnnotatedType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "body"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "annotation"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_annotation"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.application"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "function"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_function"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "argument"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_argument"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.Application"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "function"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_function"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "argument"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_argument"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Application"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.applicationType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "function"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_function"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "argument"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_argument"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.ApplicationType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "function"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_function"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "argument"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_argument"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.ApplicationType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.binding"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_term"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_type"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.core.Binding"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "name"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "term"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "type"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Binding"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.caseStatement"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_typeName"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_default"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "cases"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.field"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_cases"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.core.CaseStatement"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "typeName"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "default"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_default"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "cases"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_cases"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.CaseStatement"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.eitherType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_left"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_right"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.EitherType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "left"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "right"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.EitherType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.pairType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "first"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_first"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "second"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_second"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.PairType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "first"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_first"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "second"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_second"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.PairType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.elimination"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "record"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.projection")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "union"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.caseStatement")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Elimination"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wrap"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Elimination"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.field"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_term"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "term"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Field"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.fieldType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_type"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.FieldType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "type"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.FieldType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.floatType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigfloat"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "bigfloat"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "float32"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.FloatType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "float64"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.FloatType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.floatValue"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigfloat"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "bigfloat"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigfloat literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "float"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigfloat value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "bigfloat"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "f"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "float32"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected float32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "float"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected float32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "float32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "f"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "float64"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected float64 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "float"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected float64 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "float64"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "f"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.FloatValue"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.forallType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "parameter"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_parameter"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_body"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.ForallType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "parameter"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_parameter"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "body"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.ForallType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.function"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elimination"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "elimination"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.elimination")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lambda"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.lambda")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitive"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Function"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "primitive"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Function"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.functionType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "domain"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_domain"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "codomain"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_codomain"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.FunctionType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "domain"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_domain"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "codomain"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_codomain"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.FunctionType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.injection"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_typeName"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "field"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.field"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_field"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "typeName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "field"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_field"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Injection"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.integerType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigint"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "bigint"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int8"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "int8"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int16"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "int16"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "int32"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "int64"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint8"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "uint8"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint16"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "uint16"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "uint32"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "uint64"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.IntegerType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.integerValue"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigint"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "bigint"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigint literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigint value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "bigint"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int8"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "int8"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int8 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int8 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int8"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int16"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "int16"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int16 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int16 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int16"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "int32"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "int64"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int64 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int64 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int64"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint8"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "uint8"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint8 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint8 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "uint8"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint16"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "uint16"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint16 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint16 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "uint16"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "uint32"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "uint32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "uint64"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint64 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected uint64 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "uint64"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.IntegerValue"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.lambda"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "parameter"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_parameter"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "domain"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_domain"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_body"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.core.Lambda"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "parameter"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_parameter"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "domain"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_domain"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "body"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Lambda"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.let"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bindings"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.binding"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_bindings"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_body"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.Let"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "bindings"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_bindings"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "body"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Let"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.literal"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "binary"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected binary literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "binary"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "b"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "boolean"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "boolean"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "b"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "float"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.floatValue")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "integer"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.integerValue")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "string"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "s"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Literal"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.literalType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "binary"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "boolean"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "float"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.floatType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "integer"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.integerType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.LiteralType"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.LiteralType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.mapType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keys"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_keys"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "values"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_values"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.MapType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "keys"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_keys"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "values"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_values"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.MapType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.name"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Name"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.projection"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_typeName"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "field"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_field"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.Projection"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "typeName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "field"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_field"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Projection"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.record"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_typeName"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fields"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.field"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_fields"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "typeName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "fields"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_fields"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Record"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.term"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "annotated"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.annotatedTerm")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "application"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.application")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "either"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "function"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.function")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "let"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "let"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.let")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "list"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "literal"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.literal")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "map"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "maybe"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "pair"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "record"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.record")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "set"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplication"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeApplication"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.typeApplicationTerm")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeLambda"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.typeLambda")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "union"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.injection")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unit"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "variable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wrap"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.wrappedTerm")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.type"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "annotated"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.annotatedType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "application"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.applicationType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "either"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.eitherType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forall"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "forall"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.forallType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "function"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.functionType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "list"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.type")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "literal"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.literalType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "map"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.mapType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "maybe"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.type")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "pair"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.pairType")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "record"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.fieldType"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "set"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.type")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "union"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.fieldType"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unit"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "variable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "void"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "void"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Type"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wrap"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.type")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Type"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.typeApplicationTerm"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_body"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_type"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "body"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "type"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.TypeApplicationTerm"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.typeLambda"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "parameter"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_parameter"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_body"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.TypeLambda"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "parameter"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_parameter"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "body"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.TypeLambda"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.typeScheme"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "variables"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_variables"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_type"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "constraints"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeVariableMetadata"))}))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_constraints"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.core.TypeScheme"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "variables"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_variables"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "type"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "constraints"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_constraints"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.typeVariableMetadata"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "classes"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_classes"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "classes"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_classes"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.TypeVariableMetadata"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.core.wrappedTerm"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_typeName"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_body"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "typeName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "body"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.WrappedTerm"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.core",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.core")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Error/Checking.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Error/Checking.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Error/Checking.hs
@@ -0,0 +1,1409 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.decode.error.checking
+
+module Hydra.Sources.Decode.Error.Checking where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.error.checking"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.checkingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "incorrectUnification"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "incorrectUnification"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.incorrectUnificationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "notAForallType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "notAForallType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.notAForallTypeError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "notAFunctionType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "notAFunctionType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.notAFunctionTypeError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeArityMismatch"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeArityMismatch"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.typeArityMismatchError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeMismatch"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeMismatch"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.typeMismatchError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unboundTypeVariables"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unboundTypeVariables"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.unboundTypeVariablesError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unequalTypes"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unequalTypes"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.unequalTypesError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unsupportedTermVariant"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unsupportedTermVariant"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.unsupportedTermVariantError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "untypedLambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "untypedLambda"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.untypedLambdaError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "untypedLetBinding"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "untypedLetBinding"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.untypedLetBindingError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.CheckingError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.incorrectUnificationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "substitution"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.typing.typeSubst"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_substitution"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.checking.IncorrectUnificationError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "substitution"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_substitution"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.IncorrectUnificationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.notAForallTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_type"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeArguments"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_typeArguments"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "type"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "typeArguments"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeArguments"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.NotAForallTypeError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.notAFunctionTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_type"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.checking.NotAFunctionTypeError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "type"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.NotAFunctionTypeError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.typeArityMismatchError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_type"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expectedArity"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "integer"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                            Core.caseStatementCases = [
+                                                                              Core.Field {
+                                                                                Core.fieldName = (Core.Name "int32"),
+                                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                  Core.lambdaParameter = (Core.Name "i"),
+                                                                                  Core.lambdaDomain = Nothing,
+                                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_expectedArity"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "actualArity"))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "integer"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                                Core.caseStatementCases = [
+                                                                                  Core.Field {
+                                                                                    Core.fieldName = (Core.Name "int32"),
+                                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                      Core.lambdaParameter = (Core.Name "i"),
+                                                                                      Core.lambdaDomain = Nothing,
+                                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_actualArity"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeArguments"))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_typeArguments"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "type"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "expectedArity"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_expectedArity"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "actualArity"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_actualArity"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "typeArguments"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeArguments"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.TypeArityMismatchError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.typeMismatchError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expectedType"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_expectedType"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "actualType"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_actualType"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "expectedType"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expectedType"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "actualType"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_actualType"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.TypeMismatchError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.unboundTypeVariablesError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "variables"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_variables"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_type"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "variables"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_variables"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "type"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.UnboundTypeVariablesError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.unequalTypesError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "types"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_types"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "description"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "string"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "s"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_description"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "types"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_types"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "description"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_description"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.UnequalTypesError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.unsupportedTermVariantError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "termVariant"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.variants.termVariant"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_termVariant"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.checking.UnsupportedTermVariantError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "termVariant"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_termVariant"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.UnsupportedTermVariantError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.untypedLambdaError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                  Core.recordTypeName = (Core.Name "hydra.error.checking.UntypedLambdaError"),
+                                  Core.recordFields = []}))))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.UntypedLambdaError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.checking.untypedLetBindingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "binding"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.binding"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_binding"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.checking.UntypedLetBindingError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "binding"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_binding"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.checking.UntypedLetBindingError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.typing"),
+        (Module.Namespace "hydra.decode.variants")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.error.checking",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.error.checking")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Error/Core.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Error/Core.hs
@@ -0,0 +1,4613 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.decode.error.core
+
+module Hydra.Sources.Decode.Error.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.error.core"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.duplicateBindingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateBindingError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.duplicateFieldError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateFieldError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.undefinedFieldError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fieldName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_fieldName"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_typeName"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "fieldName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_fieldName"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "typeName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedFieldError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.unexpectedTermVariantError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expectedVariant"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.variants.termVariant"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_expectedVariant"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "actualTerm"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_actualTerm"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "expectedVariant"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expectedVariant"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "actualTerm"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_actualTerm"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UnexpectedTermVariantError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.unexpectedTypeVariantError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expectedVariant"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.variants.typeVariant"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_expectedVariant"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "actualType"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_actualType"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "expectedVariant"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expectedVariant"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "actualType"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_actualType"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UnexpectedTypeVariantError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.constantConditionError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "value"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "boolean"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "b"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_value"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "value"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_value"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.ConstantConditionError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.emptyCaseStatementError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_typeName"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "typeName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyCaseStatementError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.emptyLetBindingsError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyLetBindingsError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyLetBindingsError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.emptyTermAnnotationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTermAnnotationError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyTermAnnotationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.emptyTypeNameInTermError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTypeNameInTermError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyTypeNameInTermError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.invalidLambdaParameterNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.invalidLetBindingNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidLetBindingNameError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.invalidTypeLambdaParameterNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.nestedTermAnnotationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.NestedTermAnnotationError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.NestedTermAnnotationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.redundantWrapUnwrapError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_typeName"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "typeName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.RedundantWrapUnwrapError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.selfApplicationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.SelfApplicationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.termVariableShadowingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.TermVariableShadowingError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.typeVariableShadowingInTypeLambdaError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.undefinedTermVariableError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTermVariableError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.undefinedTypeVariableInBindingTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.undefinedTypeVariableInLambdaDomainError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.undefinedTypeVariableInTypeApplicationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.unknownPrimitiveNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UnknownPrimitiveNameError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.unnecessaryIdentityApplicationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.untypedTermVariableError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UntypedTermVariableError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.invalidTermError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "constantCondition"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "constantCondition"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.constantConditionError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateBinding"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "duplicateBinding"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.duplicateBindingError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateField"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "duplicateField"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.duplicateFieldError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyCaseStatement"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "emptyCaseStatement"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.emptyCaseStatementError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyLetBindings"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "emptyLetBindings"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.emptyLetBindingsError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyTermAnnotation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "emptyTermAnnotation"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.emptyTermAnnotationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyTypeNameInTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "emptyTypeNameInTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.emptyTypeNameInTermError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidLambdaParameterName"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "invalidLambdaParameterName"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.invalidLambdaParameterNameError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidLetBindingName"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "invalidLetBindingName"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.invalidLetBindingNameError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidTypeLambdaParameterName"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "invalidTypeLambdaParameterName"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.invalidTypeLambdaParameterNameError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nestedTermAnnotation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "nestedTermAnnotation"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.nestedTermAnnotationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "redundantWrapUnwrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "redundantWrapUnwrap"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.redundantWrapUnwrapError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "selfApplication"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "selfApplication"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.selfApplicationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "termVariableShadowing"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "termVariableShadowing"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.termVariableShadowingError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeVariableShadowingInTypeLambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeVariableShadowingInTypeLambda"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.typeVariableShadowingInTypeLambdaError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTermVariable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "undefinedTermVariable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.undefinedTermVariableError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTypeVariableInBindingType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "undefinedTypeVariableInBindingType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.undefinedTypeVariableInBindingTypeError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTypeVariableInLambdaDomain"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "undefinedTypeVariableInLambdaDomain"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.undefinedTypeVariableInLambdaDomainError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTypeVariableInTypeApplication"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "undefinedTypeVariableInTypeApplication"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.undefinedTypeVariableInTypeApplicationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unknownPrimitiveName"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unknownPrimitiveName"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.unknownPrimitiveNameError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unnecessaryIdentityApplication"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unnecessaryIdentityApplication"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.unnecessaryIdentityApplicationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "untypedTermVariable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "untypedTermVariable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.untypedTermVariableError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidTermError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.duplicateRecordTypeFieldNamesError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.duplicateUnionTypeFieldNamesError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.emptyRecordTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyRecordTypeError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyRecordTypeError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.emptyTypeAnnotationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyTypeAnnotationError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyTypeAnnotationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.emptyUnionTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.EmptyUnionTypeError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyUnionTypeError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.invalidForallParameterNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidForallParameterNameError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.invalidTypeSchemeVariableNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.nestedTypeAnnotationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.NestedTypeAnnotationError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.NestedTypeAnnotationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.nonComparableMapKeyTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keyType"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_keyType"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "keyType"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_keyType"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.nonComparableSetElementTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "elementType"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_elementType"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "elementType"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_elementType"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.NonComparableSetElementTypeError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.singleVariantUnionError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fieldName"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_fieldName"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "fieldName"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_fieldName"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.SingleVariantUnionError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.typeVariableShadowingInForallError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.undefinedTypeVariableError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "location"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTypeVariableError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.voidInNonBottomPositionError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "location"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_location"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.core.VoidInNonBottomPositionError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "location"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_location"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.VoidInNonBottomPositionError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.core.invalidTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateRecordTypeFieldNames"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "duplicateRecordTypeFieldNames"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.duplicateRecordTypeFieldNamesError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateUnionTypeFieldNames"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "duplicateUnionTypeFieldNames"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.duplicateUnionTypeFieldNamesError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyRecordType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "emptyRecordType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.emptyRecordTypeError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyTypeAnnotation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "emptyTypeAnnotation"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.emptyTypeAnnotationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyUnionType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "emptyUnionType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.emptyUnionTypeError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidForallParameterName"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "invalidForallParameterName"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.invalidForallParameterNameError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidTypeSchemeVariableName"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "invalidTypeSchemeVariableName"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.invalidTypeSchemeVariableNameError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nestedTypeAnnotation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "nestedTypeAnnotation"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.nestedTypeAnnotationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nonComparableMapKeyType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "nonComparableMapKeyType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.nonComparableMapKeyTypeError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nonComparableSetElementType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "nonComparableSetElementType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.nonComparableSetElementTypeError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "singleVariantUnion"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "singleVariantUnion"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.singleVariantUnionError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeVariableShadowingInForall"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeVariableShadowingInForall"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.typeVariableShadowingInForallError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTypeVariable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "undefinedTypeVariable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.undefinedTypeVariableError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "voidInNonBottomPosition"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "voidInNonBottomPosition"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.voidInNonBottomPositionError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidTypeError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.paths"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.variants")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.error.core",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.error.core")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Error/Packaging.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Error/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Error/Packaging.hs
@@ -0,0 +1,866 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.decode.error.packaging
+
+module Hydra.Sources.Decode.Error.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.error.packaging"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.packaging.conflictingModuleNamespaceError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "first"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_first"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "second"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_second"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "first"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_first"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "second"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_second"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.packaging.conflictingVariantNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "namespace"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_namespace"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_typeName"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "variantName"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_variantName"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "conflictingName"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_conflictingName"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "namespace"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_namespace"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "typeName"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "variantName"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_variantName"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "conflictingName"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_conflictingName"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.packaging.ConflictingVariantNameError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.packaging.definitionNotInModuleNamespaceError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "namespace"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_namespace"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "namespace"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_namespace"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.packaging.duplicateDefinitionNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "namespace"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_namespace"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_name"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "namespace"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_namespace"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.packaging.duplicateModuleNamespaceError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "namespace"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_namespace"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.error.packaging.DuplicateModuleNamespaceError"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "namespace"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_namespace"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.packaging.DuplicateModuleNamespaceError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.packaging.invalidModuleError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conflictingVariantName"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidModuleError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "conflictingVariantName"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.packaging.conflictingVariantNameError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "definitionNotInModuleNamespace"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidModuleError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "definitionNotInModuleNamespace"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.packaging.definitionNotInModuleNamespaceError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateDefinitionName"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidModuleError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "duplicateDefinitionName"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.packaging.duplicateDefinitionNameError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.packaging.InvalidModuleError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.error.packaging.invalidPackageError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conflictingModuleNamespace"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidPackageError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "conflictingModuleNamespace"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.packaging.conflictingModuleNamespaceError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateModuleNamespace"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidPackageError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "duplicateModuleNamespace"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.packaging.duplicateModuleNamespaceError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidModule"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.error.packaging.InvalidPackageError"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "invalidModule"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.packaging.invalidModuleError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.error.packaging.InvalidPackageError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.module")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.error.packaging",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.error.packaging")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Errors.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Errors.hs
@@ -0,0 +1,769 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.decode.errors
+
+module Hydra.Sources.Decode.Errors where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.errors"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.errors.decodingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.errors.error"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "checking"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "checking"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.checking.checkingError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "decoding"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "decoding"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.errors.decodingError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateBinding"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "duplicateBinding"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.duplicateBindingError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateField"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "duplicateField"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.duplicateFieldError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "other"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "other"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.errors.otherError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedField"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "undefinedField"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.undefinedFieldError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTermVariable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "undefinedTermVariable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.undefinedTermVariableError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "untypedTermVariable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "untypedTermVariable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.untypedTermVariableError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unexpectedTermVariant"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unexpectedTermVariant"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.unexpectedTermVariantError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unexpectedTypeVariant"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unexpectedTypeVariant"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.error.core.unexpectedTypeVariantError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unification"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.errors.Error"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unification"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.errors.unificationError")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.errors.Error"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.errors.otherError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.OtherError"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.errors.OtherError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.errors.unificationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "leftType"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_leftType"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "rightType"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_rightType"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "message"))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "string"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "s"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_message"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.errors.UnificationError"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "leftType"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_leftType"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "rightType"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_rightType"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "message"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_message"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.errors.UnificationError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.context"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.error.checking"),
+        (Module.Namespace "hydra.decode.error.core"),
+        (Module.Namespace "hydra.decode.typing"),
+        (Module.Namespace "hydra.decode.variants")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.errors",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.errors")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Grammar.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Grammar.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Grammar.hs
+++ /dev/null
@@ -1,1109 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.decode.grammar
-
-module Hydra.Sources.Decode.Grammar where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.grammar"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.grammar.constant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.grammar.Constant"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Constant"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.grammar.Constant"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.grammar.grammar"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.grammar.Grammar"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Grammar"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.grammar.production"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.grammar.Grammar"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.grammar.label"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.grammar.Label"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Label"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.grammar.Label"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.grammar.labeledPattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.grammar.LabeledPattern"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "label"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.grammar.label"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_label"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "pattern"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.grammar.pattern"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_pattern"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.grammar.LabeledPattern"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "label"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_label"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "pattern"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_pattern"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.grammar.LabeledPattern"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.grammar.pattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.grammar.Pattern"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "alternatives"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "alternatives"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.grammar.pattern"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "constant"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "constant"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.grammar.constant")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "ignored"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "ignored"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.grammar.pattern")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "labeled"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "labeled"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.grammar.labeledPattern")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nil"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "nil"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nonterminal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "nonterminal"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.grammar.symbol")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "option"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "option"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.grammar.pattern")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "plus"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "plus"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.grammar.pattern")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "regex"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "regex"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.grammar.regex")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sequence"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "sequence"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.grammar.pattern"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "star"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.grammar.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "star"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.grammar.pattern")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.grammar.Pattern"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.grammar.production"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.grammar.Production"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "symbol"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.grammar.symbol"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_symbol"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "pattern"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.grammar.pattern"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_pattern"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.grammar.Production"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "symbol"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_symbol"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "pattern"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_pattern"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.grammar.Production"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.grammar.regex"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.grammar.Regex"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Regex"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.grammar.Regex"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.grammar.symbol"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.grammar.Symbol"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.grammar.Symbol"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.grammar.Symbol"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.grammar",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.grammar")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Json/Model.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Json/Model.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Json/Model.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Json/Model.hs
@@ -14,297 +14,362 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.json.model"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.json.model.value"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.json.model.Value"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "array"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "array"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.json.model"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.json.model.value"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "array"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "boolean"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
                                                 Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "boolean"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "b"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "null"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "null"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "number"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "number"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "array"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
                                                 Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "boolean"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "boolean"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "b"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "null"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "null"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "number"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "number"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigfloat literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "float"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigfloat value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "bigfloat"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "f"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "object"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "object"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
                                                     Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
+                                                      Core.lambdaParameter = (Core.Name "cx"),
                                                       Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
+                                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "raw"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "err"),
                                                                 Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigfloat literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "float"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected bigfloat value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "bigfloat"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "f"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "f"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "object"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "object"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "literal"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                                        Core.lambdaDomain = Nothing,
+                                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                            Core.caseStatementCases = [
+                                                                              Core.Field {
+                                                                                Core.fieldName = (Core.Name "string"),
+                                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                                  Core.lambdaDomain = Nothing,
+                                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
                                               Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
                                                   Core.lambdaParameter = (Core.Name "cx"),
                                                   Core.lambdaDomain = Nothing,
                                                   Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
@@ -318,7 +383,7 @@
                                                             Core.lambdaParameter = (Core.Name "err"),
                                                             Core.lambdaDomain = Nothing,
                                                             Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                               Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
                                                         Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
                                                           Core.lambdaParameter = (Core.Name "stripped"),
@@ -327,7 +392,7 @@
                                                             Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
                                                               Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
                                                               Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                                 Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
                                                               Core.caseStatementCases = [
                                                                 Core.Field {
@@ -339,7 +404,7 @@
                                                                       Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
                                                                         Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
                                                                         Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                                           Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
                                                                         Core.caseStatementCases = [
                                                                           Core.Field {
@@ -354,132 +419,57 @@
                                                         Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                           Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
                                                           Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
                                       Core.lambdaDomain = Nothing,
                                       Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.json.model.Value"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.json.model.Value"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.json.model",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.json.model")}
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.json.model.Value"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.json.model",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.json.model")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Module.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Module.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Module.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Module.hs
@@ -14,1093 +14,1085 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.module"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.module.definition"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.module.Definition"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "term"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.module.termDefinition")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "type"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.module.typeDefinition")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.Definition"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.module.fileExtension"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.module.FileExtension"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.module.FileExtension"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.FileExtension"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.module.module"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.module.Module"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "namespace"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_namespace"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "elements"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.binding"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_elements"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "termDependencies"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_termDependencies"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeDependencies"))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))}))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_typeDependencies"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "description"))})),
-                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "cx"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "raw"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                    Core.lambdaParameter = (Core.Name "err"),
-                                                                    Core.lambdaDomain = Nothing,
-                                                                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "stripped"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "literal"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                            Core.lambdaParameter = (Core.Name "v"),
-                                                                            Core.lambdaDomain = Nothing,
-                                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                                Core.caseStatementCases = [
-                                                                                  Core.Field {
-                                                                                    Core.fieldName = (Core.Name "string"),
-                                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                      Core.lambdaParameter = (Core.Name "s"),
-                                                                                      Core.lambdaDomain = Nothing,
-                                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "field_description"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                                  Core.recordTypeName = (Core.Name "hydra.module.Module"),
-                                                  Core.recordFields = [
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "namespace"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_namespace"))},
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "elements"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_elements"))},
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "termDependencies"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_termDependencies"))},
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "typeDependencies"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeDependencies"))},
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "description"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_description"))}]}))))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.Module"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.module.namespace"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.module.Namespace"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.module.Namespace"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.Namespace"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.module.namespaces"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "n"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.module.Namespaces"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "focus"))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "n"))}))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_focus"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "mapping"))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "n"))}))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_mapping"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.module.Namespaces"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "focus"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_focus"))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "mapping"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_mapping"))}]}))))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "n"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "n"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.module.Namespaces")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "n"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.module.qualifiedName"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.module.QualifiedName"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "namespace"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_namespace"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "local"))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "cx"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "raw"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "err"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "stripped"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "literal"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "v"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                  Core.caseStatementCases = [
-                                                                    Core.Field {
-                                                                      Core.fieldName = (Core.Name "string"),
-                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                        Core.lambdaParameter = (Core.Name "s"),
-                                                                        Core.lambdaDomain = Nothing,
-                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_local"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.module.QualifiedName"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "namespace"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_namespace"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "local"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_local"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.QualifiedName"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.module.termDefinition"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.module.TermDefinition"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_term"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_type"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.module.TermDefinition"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "name"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "term"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "type"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.TermDefinition"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.module.typeDefinition"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.module.TypeDefinition"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_type"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.module.TypeDefinition"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "name"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "type"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.TypeDefinition"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core"),
-    (Module.Namespace "hydra.decode.graph")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.module",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.module")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.module"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.module.definition"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "term"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.module.termDefinition")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.module.Definition"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "type"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.module.typeDefinition")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.Definition"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.module.fileExtension"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.module.FileExtension"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.FileExtension"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.module.module"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "namespace"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_namespace"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "definitions"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.definition"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_definitions"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "termDependencies"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_termDependencies"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeDependencies"))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))}))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_typeDependencies"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "description"))})),
+                                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "cx"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "raw"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                        Core.lambdaParameter = (Core.Name "err"),
+                                                                        Core.lambdaDomain = Nothing,
+                                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "stripped"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "literal"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "v"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                                    Core.caseStatementCases = [
+                                                                                      Core.Field {
+                                                                                        Core.fieldName = (Core.Name "string"),
+                                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                          Core.lambdaParameter = (Core.Name "s"),
+                                                                                          Core.lambdaDomain = Nothing,
+                                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "field_description"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                      Core.recordTypeName = (Core.Name "hydra.module.Module"),
+                                                      Core.recordFields = [
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "namespace"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_namespace"))},
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "definitions"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_definitions"))},
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "termDependencies"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_termDependencies"))},
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "typeDependencies"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeDependencies"))},
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "description"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_description"))}]}))))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.Module"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.module.namespace"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.module.Namespace"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.Namespace"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.module.namespaces"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "n"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "focus"))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "n"))}))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "field_focus"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "mapping"))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "n"))}))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_mapping"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.module.Namespaces"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "focus"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_focus"))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "mapping"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_mapping"))}]}))))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "n"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "n"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.module.Namespaces")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "n"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.module.qualifiedName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "namespace"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.namespace"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_namespace"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "local"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "string"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "s"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_local"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.module.QualifiedName"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "namespace"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_namespace"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "local"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_local"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.QualifiedName"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.module.termDefinition"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_term"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_type"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.module.TermDefinition"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "name"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "term"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "type"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.TermDefinition"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.module.typeDefinition"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_type"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.module.TypeDefinition"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "type"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.module.TypeDefinition"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.graph")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.module",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.module")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Packaging.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Packaging.hs
@@ -0,0 +1,334 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.decode.packaging
+
+module Hydra.Sources.Decode.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.packaging"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.packaging.package"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.packaging.packageName"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "modules"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.module"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_modules"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "dependencies"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.packaging.packageName"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_dependencies"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "description"))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "cx"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "raw"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "err"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "stripped"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "literal"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "v"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                                Core.caseStatementCases = [
+                                                                                  Core.Field {
+                                                                                    Core.fieldName = (Core.Name "string"),
+                                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                      Core.lambdaParameter = (Core.Name "s"),
+                                                                                      Core.lambdaDomain = Nothing,
+                                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_description"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.packaging.Package"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "name"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "modules"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_modules"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "dependencies"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_dependencies"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "description"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_description"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.packaging.Package"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.packaging.packageName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.packaging.PackageName"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.packaging.PackageName"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.module")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.packaging",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.packaging")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Parsing.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Parsing.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Parsing.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Parsing.hs
@@ -14,116 +14,52 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.parsing"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.parsing.parseError"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.parsing.ParseError"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "message"))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "cx"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "raw"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "err"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "stripped"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                    Core.caseStatementCases = [
-                                                      Core.Field {
-                                                        Core.fieldName = (Core.Name "literal"),
-                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "v"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                              Core.caseStatementCases = [
-                                                                Core.Field {
-                                                                  Core.fieldName = (Core.Name "string"),
-                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                    Core.lambdaParameter = (Core.Name "s"),
-                                                                    Core.lambdaDomain = Nothing,
-                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_message"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.parsing"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.parsing.parseError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
                                     Core.applicationArgument = (Core.TermApplication (Core.Application {
@@ -131,7 +67,7 @@
                                         Core.applicationFunction = (Core.TermApplication (Core.Application {
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "remainder"))})),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "message"))})),
                                           Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
                                             Core.lambdaParameter = (Core.Name "cx"),
                                             Core.lambdaDomain = Nothing,
@@ -146,7 +82,7 @@
                                                       Core.lambdaParameter = (Core.Name "err"),
                                                       Core.lambdaDomain = Nothing,
                                                       Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                         Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
                                                   Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
                                                     Core.lambdaParameter = (Core.Name "stripped"),
@@ -155,7 +91,7 @@
                                                       Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
                                                         Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
                                                         Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                           Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
                                                         Core.caseStatementCases = [
                                                           Core.Field {
@@ -167,7 +103,7 @@
                                                                 Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
                                                                   Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
                                                                   Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                                     Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
                                                                   Core.caseStatementCases = [
                                                                     Core.Field {
@@ -186,268 +122,307 @@
                                         Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                       Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                   Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_remainder"),
+                                    Core.lambdaParameter = (Core.Name "field_message"),
                                     Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.parsing.ParseError"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "message"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_message"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "remainder"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_remainder"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.parsing.ParseError"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.parsing.parseResult"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.parsing.ParseResult"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "union"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "inj"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "tname"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                      Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                      Core.projectionField = (Core.Name "typeName")})))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                  Core.bindingType = Nothing},
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "field"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                      Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                      Core.projectionField = (Core.Name "field")})))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                  Core.bindingType = Nothing},
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fname"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                      Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                      Core.projectionField = (Core.Name "name")})))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                  Core.bindingType = Nothing},
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fterm"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                      Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                      Core.projectionField = (Core.Name "term")})))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                  Core.bindingType = Nothing},
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "variantMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                    Core.applicationArgument = (Core.TermList [
-                                      Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "success"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "input"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "t"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
-                                                Core.injectionField = Core.Field {
-                                                  Core.fieldName = (Core.Name "success"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermApplication (Core.Application {
                                               Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.parsing.parseSuccess")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                      (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "failure"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "input"),
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "remainder"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "string"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "s"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_remainder"),
                                         Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "t"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
-                                                Core.injectionField = Core.Field {
-                                                  Core.fieldName = (Core.Name "failure"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.parsing.parseError")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                    Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                      Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                        Core.applicationArgument = (Core.TermList [
-                                          Core.TermLiteral (Core.LiteralString "no such field "),
-                                          (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                          (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                          (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "f"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "a"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.parsing.ParseResult")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.parsing.parseSuccess"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.parsing.ParseError"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "message"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_message"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "remainder"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_remainder"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.parsing.ParseError"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.parsing.parseResult"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
             Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.parsing.ParseSuccess"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "union"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "inj"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "field"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                          Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                          Core.projectionField = (Core.Name "field")})))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                      Core.bindingType = Nothing},
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fname"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                          Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                          Core.projectionField = (Core.Name "name")})))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                      Core.bindingType = Nothing},
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fterm"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                          Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                          Core.projectionField = (Core.Name "term")})))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                      Core.bindingType = Nothing},
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "variantMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                        Core.applicationArgument = (Core.TermList [
+                                          Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "success"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "input"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "t"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                    Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
+                                                    Core.injectionField = Core.Field {
+                                                      Core.fieldName = (Core.Name "success"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.parsing.parseSuccess")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                          (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "failure"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "input"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "t"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                    Core.injectionTypeName = (Core.Name "hydra.parsing.ParseResult"),
+                                                    Core.injectionField = Core.Field {
+                                                      Core.fieldName = (Core.Name "failure"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.parsing.parseError")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermApplication (Core.Application {
                                       Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "value"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_value"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                        Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                          Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                            Core.applicationArgument = (Core.TermList [
+                                              Core.TermLiteral (Core.LiteralString "no such field "),
+                                              (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                              (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "f"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.parsing.ParseResult")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.parsing.parseSuccess"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermApplication (Core.Application {
                                       Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
                                       Core.applicationArgument = (Core.TermApplication (Core.Application {
@@ -455,105 +430,120 @@
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermApplication (Core.Application {
                                               Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "remainder"))})),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "value"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
                                           Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                         Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                     Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_remainder"),
+                                      Core.lambdaParameter = (Core.Name "field_value"),
                                       Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "value"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_value"))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "remainder"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_remainder"))}]}))))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "a"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.parsing.ParseSuccess")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.parsing",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.parsing")}
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "remainder"))})),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "string"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "s"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_remainder"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "value"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_value"))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "remainder"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_remainder"))}]}))))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.parsing.ParseSuccess")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.parsing",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.parsing")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Paths.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Paths.hs
@@ -0,0 +1,2323 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.decode.paths
+
+module Hydra.Sources.Decode.Paths where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.paths"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtermEdge"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "source"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermNode"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_source"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "path"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermPath"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_path"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "target"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermNode"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_target"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "source"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_source"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "path"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_path"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "target"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_target"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtermEdge"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtermGraph"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "nodes"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermNode"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_nodes"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "edges"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermEdge"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_edges"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "nodes"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_nodes"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "edges"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_edges"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtermGraph"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtermNode"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "label"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "string"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "s"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_label"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "id"))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "string"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "s"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_id"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.paths.SubtermNode"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "name"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "label"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_label"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "id"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_id"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtermNode"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtermPath"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.paths.SubtermPath"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtermStep"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtermPath"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtermStep"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotatedBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "annotatedBody"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationFunction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "applicationFunction"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationArgument"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "applicationArgument"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambdaBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lambdaBody"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionCasesDefault"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unionCasesDefault"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionCasesBranch"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unionCasesBranch"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "letBody"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letBinding"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "letBinding"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "listElement"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "listElement"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapKey"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "mapKey"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapValue"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "mapValue"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybeTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "maybeTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "productTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "productTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "recordField"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "recordField"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "setElement"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "setElement"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sumTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "sumTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambdaBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeLambdaBody"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplicationTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeApplicationTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "injectionTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "injectionTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrappedTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtermStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wrappedTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtermStep"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtypeEdge"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "source"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtypeNode"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_source"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "path"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtypePath"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_path"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "target"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtypeNode"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_target"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "source"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_source"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "path"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_path"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "target"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_target"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtypeEdge"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtypeGraph"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "nodes"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtypeNode"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_nodes"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "edges"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtypeEdge"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_edges"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "nodes"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_nodes"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "edges"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_edges"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtypeGraph"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtypeNode"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "label"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "string"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "s"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_label"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "id"))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "string"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "s"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_id"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "name"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "label"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_label"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "id"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_id"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtypeNode"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtypePath"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.paths.SubtypePath"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.paths.subtypeStep"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtypePath"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.paths.subtypeStep"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotatedBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "annotatedBody"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationFunction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "applicationFunction"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationArgument"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "applicationArgument"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "eitherLeft"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "eitherLeft"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "eitherRight"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "eitherRight"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forallBody"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "forallBody"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "functionDomain"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "functionDomain"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "functionCodomain"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "functionCodomain"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "listElement"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "listElement"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapKeys"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "mapKeys"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapValues"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "mapValues"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybeElement"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "maybeElement"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pairFirst"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "pairFirst"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pairSecond"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "pairSecond"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "recordField"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "recordField"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "setElement"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "setElement"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionField"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unionField"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.name")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrappedType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wrappedType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.paths.SubtypeStep"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.paths",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.paths")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Phantoms.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Phantoms.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Phantoms.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Phantoms.hs
@@ -14,69 +14,55 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.phantoms"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.phantoms.tBinding"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.phantoms"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.phantoms.tBinding"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
             Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.phantoms.TBinding"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_name"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermApplication (Core.Application {
                                       Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
                                       Core.applicationArgument = (Core.TermApplication (Core.Application {
@@ -84,138 +70,153 @@
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermApplication (Core.Application {
                                               Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.phantoms.tTerm")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))})),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
                                           Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                         Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                     Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_term"),
+                                      Core.lambdaParameter = (Core.Name "field_name"),
                                       Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.phantoms.TBinding"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "name"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "term"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))}]}))))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "a"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TBinding")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.phantoms.tTerm"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.phantoms.tTerm")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_term"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.phantoms.TBinding"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "name"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "term"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))}]}))))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TBinding")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.phantoms.tTerm"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
             Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.phantoms.TTerm"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "wrap"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
-                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.term")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                    Core.projectionField = (Core.Name "body")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "a"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.phantoms",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.phantoms")}
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "wrap"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.phantoms.TTerm"),
+                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.term")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                        Core.projectionField = (Core.Name "body")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.phantoms",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.phantoms")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Query.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Query.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Query.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Query.hs
@@ -14,2259 +14,2386 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.query"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.comparisonConstraint"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.query.ComparisonConstraint"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "equal"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "notEqual"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "notEqual"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThan"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lessThan"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThan"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "greaterThan"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThanOrEqual"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lessThanOrEqual"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThanOrEqual"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "greaterThanOrEqual"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.ComparisonConstraint"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.edge"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.query.Edge"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_type"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "out"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_out"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "in"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_in"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.query.Edge"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "type"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "out"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_out"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "in"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_in"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Edge"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.graphPattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.query.GraphPattern"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "graph"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_graph"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "patterns"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_patterns"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.query.GraphPattern"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "graph"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_graph"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "patterns"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_patterns"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.GraphPattern"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.node"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.query.Node"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Node"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "term"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.term")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Node"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "variable"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.variable")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wildcard"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Node"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "wildcard"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Node"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.path"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.query.Path"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "step"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Path"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "step"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.step")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "regex"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Path"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "regex"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.regexSequence")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inverse"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Path"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "inverse"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.path")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Path"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.pattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.query.Pattern"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "triple"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "triple"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.triplePattern")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "negation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "negation"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.pattern")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conjunction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "conjunction"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "disjunction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "disjunction"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "graph"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "graph"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.graphPattern")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Pattern"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.query"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.query.Query"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "variables"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.variable"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_variables"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "patterns"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_patterns"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.query.Query"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "variables"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_variables"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "patterns"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_patterns"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Query"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.range"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.query.Range"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "min"))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "cx"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "raw"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "err"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "stripped"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                    Core.caseStatementCases = [
-                                                      Core.Field {
-                                                        Core.fieldName = (Core.Name "literal"),
-                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "v"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                              Core.caseStatementCases = [
-                                                                Core.Field {
-                                                                  Core.fieldName = (Core.Name "integer"),
-                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "int32"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "i"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_min"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "max"))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "cx"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "raw"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "err"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "stripped"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "literal"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "v"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                  Core.caseStatementCases = [
-                                                                    Core.Field {
-                                                                      Core.fieldName = (Core.Name "integer"),
-                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                        Core.caseStatementCases = [
-                                                                          Core.Field {
-                                                                            Core.fieldName = (Core.Name "int32"),
-                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                              Core.lambdaParameter = (Core.Name "i"),
-                                                                              Core.lambdaDomain = Nothing,
-                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_max"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.query.Range"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "min"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_min"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "max"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_max"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Range"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.regexQuantifier"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.query.RegexQuantifier"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "one"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "zeroOrOne"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "zeroOrOne"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "zeroOrMore"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "zeroOrMore"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "oneOrMore"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "oneOrMore"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "exactly"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "exactly"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "atLeast"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "atLeast"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "range"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "range"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.range")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.RegexQuantifier"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.regexSequence"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.query.RegexSequence"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "path"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.path"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_path"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "quantifier"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.regexQuantifier"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_quantifier"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.query.RegexSequence"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "path"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_path"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "quantifier"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_quantifier"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.RegexSequence"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.step"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.query.Step"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "edge"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Step"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "edge"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.edge")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "project"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Step"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "project"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.projection")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "compare"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.query.Step"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "compare"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.comparisonConstraint")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Step"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.triplePattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.query.TriplePattern"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "subject"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.node"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_subject"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "predicate"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.path"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_predicate"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "object"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.node"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_object"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.query.TriplePattern"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "subject"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_subject"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "predicate"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_predicate"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "object"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_object"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.TriplePattern"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.query.variable"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.query.Variable"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.query.Variable"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Variable"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.query",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.query")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.query"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.comparisonConstraint"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "equal"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "notEqual"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "notEqual"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThan"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lessThan"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThan"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "greaterThan"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThanOrEqual"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lessThanOrEqual"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThanOrEqual"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "greaterThanOrEqual"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.ComparisonConstraint"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.edge"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_type"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "out"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_out"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "in"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_in"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.query.Edge"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "type"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "out"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_out"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "in"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_in"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Edge"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.graphPattern"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "graph"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_graph"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "patterns"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_patterns"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.query.GraphPattern"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "graph"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_graph"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "patterns"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_patterns"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.GraphPattern"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.node"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "term"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.term")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "variable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.variable")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wildcard"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Node"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wildcard"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Node"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.path"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "step"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "step"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.step")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "regex"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "regex"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.regexSequence")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inverse"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Path"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "inverse"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.path")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Path"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.pathEquation"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.path"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_left"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.path"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_right"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.query.PathEquation"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "left"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "right"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.PathEquation"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.pattern"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "triple"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "triple"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.triplePattern")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "negation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "negation"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.pattern")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conjunction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "conjunction"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "disjunction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "disjunction"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "graph"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Pattern"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "graph"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.graphPattern")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Pattern"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.patternImplication"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "antecedent"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_antecedent"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "consequent"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_consequent"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.query.PatternImplication"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "antecedent"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_antecedent"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "consequent"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_consequent"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.PatternImplication"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.query"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "variables"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.variable"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_variables"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "patterns"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.pattern"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_patterns"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.query.Query"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "variables"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_variables"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "patterns"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_patterns"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Query"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.range"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "min"))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "cx"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "raw"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "err"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "stripped"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                        Core.caseStatementCases = [
+                                                          Core.Field {
+                                                            Core.fieldName = (Core.Name "literal"),
+                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "v"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "integer"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "int32"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "i"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_min"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "max"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "integer"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                            Core.caseStatementCases = [
+                                                                              Core.Field {
+                                                                                Core.fieldName = (Core.Name "int32"),
+                                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                  Core.lambdaParameter = (Core.Name "i"),
+                                                                                  Core.lambdaDomain = Nothing,
+                                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_max"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.query.Range"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "min"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_min"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "max"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_max"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Range"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.regexQuantifier"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "one"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "zeroOrOne"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "zeroOrOne"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "zeroOrMore"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "zeroOrMore"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "oneOrMore"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "oneOrMore"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "exactly"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "exactly"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "atLeast"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "atLeast"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "range"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "range"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.range")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.RegexQuantifier"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.regexSequence"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "path"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.path"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_path"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "quantifier"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.regexQuantifier"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_quantifier"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.query.RegexSequence"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "path"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_path"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "quantifier"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_quantifier"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.RegexSequence"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.step"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "edge"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "edge"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.edge")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "project"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "project"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.core.projection")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "compare"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.query.Step"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "compare"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.query.comparisonConstraint")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Step"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.triplePattern"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "subject"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.node"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_subject"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "predicate"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.path"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_predicate"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "object"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.query.node"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_object"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.query.TriplePattern"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "subject"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_subject"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "predicate"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_predicate"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "object"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_object"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.TriplePattern"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.query.variable"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.query.Variable"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.query.Variable"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.query",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.query")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Relational.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Relational.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Relational.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Relational.hs
@@ -14,940 +14,941 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.relational"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.columnName"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.relational.ColumnName"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.relational.ColumnName"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.relational.ColumnName"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.columnSchema"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "t"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.relational.ColumnSchema"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_name"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "domain"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "t"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_domain"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.relational.ColumnSchema"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "name"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "domain"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_domain"))}]}))))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "t"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.ColumnSchema")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.foreignKey"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.relational.ForeignKey"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foreignRelation"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.relationName"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_foreignRelation"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keys"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_keys"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.relational.ForeignKey"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "foreignRelation"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_foreignRelation"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "keys"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_keys"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.relational.ForeignKey"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.primaryKey"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.relational.PrimaryKey"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.relational.PrimaryKey"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.relational.PrimaryKey"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.relation"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.relational.Relation"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "wrap"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relation"),
-                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.relational.row")),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                    Core.projectionField = (Core.Name "body")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "v"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Relation")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.relationName"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.relational.RelationName"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.relational.RelationName"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.relational.RelationName"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.relationSchema"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "t"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.relational.RelationSchema"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.relationName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_name"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "columns"))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.relational.columnSchema")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_columns"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "primaryKeys"))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.primaryKey"))}))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "field_primaryKeys"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foreignKeys"))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.foreignKey"))}))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "field_foreignKeys"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                                Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
-                                                Core.recordFields = [
-                                                  Core.Field {
-                                                    Core.fieldName = (Core.Name "name"),
-                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                                  Core.Field {
-                                                    Core.fieldName = (Core.Name "columns"),
-                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_columns"))},
-                                                  Core.Field {
-                                                    Core.fieldName = (Core.Name "primaryKeys"),
-                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_primaryKeys"))},
-                                                  Core.Field {
-                                                    Core.fieldName = (Core.Name "foreignKeys"),
-                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_foreignKeys"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "t"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.RelationSchema")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.relationship"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.relational.Relationship"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "wrap"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relationship"),
-                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                    Core.projectionField = (Core.Name "body")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "v"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Relationship")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
-        Core.typeSchemeConstraints = (Just (M.fromList [
-          (Core.Name "v", Core.TypeVariableMetadata {
-            Core.typeVariableMetadataClasses = (S.fromList [
-              Core.Name "ordering"])})]))}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.relational.row"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.relational.Row"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "wrap"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.relational.Row"),
-                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                    Core.projectionField = (Core.Name "body")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "v"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Row")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.relational",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.relational")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.relational"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.columnName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.relational.ColumnName"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.relational.ColumnName"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.columnSchema"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "t"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "field_name"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "domain"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "t"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_domain"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "name"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "domain"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_domain"))}]}))))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "t"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.ColumnSchema")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.foreignKey"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foreignRelation"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.relationName"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_foreignRelation"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keys"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_keys"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.relational.ForeignKey"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "foreignRelation"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_foreignRelation"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "keys"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_keys"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.relational.ForeignKey"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.primaryKey"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.relational.PrimaryKey"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.relational.PrimaryKey"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.relation"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "wrap"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relation"),
+                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.relational.row")),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                        Core.projectionField = (Core.Name "body")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Relation")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.relationName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.relational.RelationName"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.relational.RelationName"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.relationSchema"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "t"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.relationName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "field_name"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "columns"))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.relational.columnSchema")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_columns"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "primaryKeys"))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.primaryKey"))}))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "field_primaryKeys"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foreignKeys"))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.foreignKey"))}))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "field_foreignKeys"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                    Core.recordTypeName = (Core.Name "hydra.relational.RelationSchema"),
+                                                    Core.recordFields = [
+                                                      Core.Field {
+                                                        Core.fieldName = (Core.Name "name"),
+                                                        Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                                      Core.Field {
+                                                        Core.fieldName = (Core.Name "columns"),
+                                                        Core.fieldTerm = (Core.TermVariable (Core.Name "field_columns"))},
+                                                      Core.Field {
+                                                        Core.fieldName = (Core.Name "primaryKeys"),
+                                                        Core.fieldTerm = (Core.TermVariable (Core.Name "field_primaryKeys"))},
+                                                      Core.Field {
+                                                        Core.fieldName = (Core.Name "foreignKeys"),
+                                                        Core.fieldTerm = (Core.TermVariable (Core.Name "field_foreignKeys"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "t"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.RelationSchema")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.relationship"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "wrap"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.relational.Relationship"),
+                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                        Core.projectionField = (Core.Name "body")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Relationship")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
+            Core.typeSchemeConstraints = (Just (M.fromList [
+              (Core.Name "v", Core.TypeVariableMetadata {
+                Core.typeVariableMetadataClasses = (S.fromList [
+                  Core.Name "ordering"])})]))}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.relational.row"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "wrap"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.relational.Row"),
+                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                        Core.projectionField = (Core.Name "body")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Row")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.relational",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.relational")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Tabular.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Tabular.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Tabular.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Tabular.hs
@@ -14,66 +14,52 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.tabular"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.tabular.columnType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.tabular.ColumnType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.tabular"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.tabular.columnType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
                                     Core.applicationArgument = (Core.TermApplication (Core.Application {
@@ -81,304 +67,302 @@
                                         Core.applicationFunction = (Core.TermApplication (Core.Application {
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.columnName"))})),
                                         Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                       Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                   Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_type"),
+                                    Core.lambdaParameter = (Core.Name "field_name"),
                                     Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.tabular.ColumnType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "name"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "type"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.tabular.ColumnType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.tabular.dataRow"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_type"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.tabular.ColumnType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "type"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.tabular.ColumnType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.tabular.dataRow"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
             Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.tabular.DataRow"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "wrap"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.tabular.DataRow"),
-                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                    Core.projectionField = (Core.Name "body")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "v"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.tabular.DataRow")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.tabular.headerRow"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
                 Core.lambdaDomain = Nothing,
                 Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.tabular.HeaderRow"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "wrap"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "wrappedTerm"),
                                 Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.tabular.HeaderRow"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "cx"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "raw"),
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
                                       Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "err"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "stripped"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                Core.caseStatementCases = [
-                                                  Core.Field {
-                                                    Core.fieldName = (Core.Name "literal"),
-                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "v"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "string"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "s"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                      Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.tabular.DataRow"),
+                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
                                         Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.tabular.HeaderRow"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.tabular.table"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
+                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                        Core.projectionField = (Core.Name "body")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.tabular.DataRow")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.tabular.headerRow"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
             Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
                 Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
                   Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
+                    Core.lambdaParameter = (Core.Name "stripped"),
                     Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.tabular.Table"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
                                 Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.tabular.HeaderRow"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "header"))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.tabular.headerRow"))}))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_header"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "cx"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "raw"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "err"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "stripped"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                    Core.caseStatementCases = [
+                                                      Core.Field {
+                                                        Core.fieldName = (Core.Name "literal"),
+                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "v"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "string"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "s"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.tabular.HeaderRow"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.tabular.table"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermApplication (Core.Application {
                                       Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
                                       Core.applicationArgument = (Core.TermApplication (Core.Application {
@@ -386,110 +370,112 @@
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermApplication (Core.Application {
                                               Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "data"))})),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "header"))})),
                                             Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.tabular.dataRow")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))}))})),
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.tabular.headerRow"))}))})),
                                           Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                         Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                     Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_data"),
+                                      Core.lambdaParameter = (Core.Name "field_header"),
                                       Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.tabular.Table"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "header"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_header"))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "data"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_data"))}]}))))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "data"))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.tabular.dataRow")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))}))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_data"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.tabular.Table"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "header"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_header"))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "data"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_data"))}]}))))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.tabular.Table")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.tabular.tableType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
                 Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "v"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "v"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.tabular.Table")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.tabular.tableType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.tabular.TableType"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.relationName"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
                                     Core.applicationArgument = (Core.TermApplication (Core.Application {
@@ -497,47 +483,62 @@
                                         Core.applicationFunction = (Core.TermApplication (Core.Application {
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "columns"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.tabular.columnType"))}))})),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.relational.relationName"))})),
                                         Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                       Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                   Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_columns"),
+                                    Core.lambdaParameter = (Core.Name "field_name"),
                                     Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.tabular.TableType"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "name"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "columns"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_columns"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.tabular.TableType"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core"),
-    (Module.Namespace "hydra.decode.relational")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.tabular",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.tabular")}
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "columns"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.tabular.columnType"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_columns"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.tabular.TableType"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "name"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "columns"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_columns"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.tabular.TableType"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.relational")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.tabular",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.tabular")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Testing.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Testing.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Testing.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Testing.hs
@@ -14,7412 +14,7399 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.testing"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.alphaConversionTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.AlphaConversionTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_term"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "oldVariable"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_oldVariable"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "newVariable"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_newVariable"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "result"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_result"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "term"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "oldVariable"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_oldVariable"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "newVariable"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_newVariable"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "result"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_result"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.AlphaConversionTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.evaluationStyle"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.testing.EvaluationStyle"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "eager"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "eager"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lazy"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lazy"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.EvaluationStyle"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.caseConversionTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.CaseConversionTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fromConvention"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.util.caseConvention"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_fromConvention"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "toConvention"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.util.caseConvention"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_toConvention"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fromString"))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "string"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                            Core.lambdaParameter = (Core.Name "s"),
-                                                                            Core.lambdaDomain = Nothing,
-                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_fromString"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "toString"))})),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "cx"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "raw"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "err"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "stripped"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                                Core.caseStatementCases = [
-                                                                  Core.Field {
-                                                                    Core.fieldName = (Core.Name "literal"),
-                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                      Core.lambdaParameter = (Core.Name "v"),
-                                                                      Core.lambdaDomain = Nothing,
-                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "string"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "s"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_toString"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "fromConvention"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_fromConvention"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "toConvention"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_toConvention"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "fromString"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_fromString"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "toString"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_toString"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.CaseConversionTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.delegatedEvaluationTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.DelegatedEvaluationTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.DelegatedEvaluationTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.etaExpansionTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.EtaExpansionTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.EtaExpansionTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.deannotateTermTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.DeannotateTermTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.DeannotateTermTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.deannotateTypeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.DeannotateTypeTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.DeannotateTypeTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.flattenLetTermsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.FlattenLetTermsTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.FlattenLetTermsTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.foldOperation"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.testing.FoldOperation"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sumInt32Literals"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "sumInt32Literals"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "collectListLengths"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "collectListLengths"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "collectLabels"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "collectLabels"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.FoldOperation"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.foldOverTermTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.FoldOverTermTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "traversalOrder"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.coders.traversalOrder"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_traversalOrder"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "operation"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.foldOperation"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_operation"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_output"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "input"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "traversalOrder"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_traversalOrder"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "operation"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_operation"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "output"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.FoldOverTermTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.freeVariablesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.FreeVariablesTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.FreeVariablesTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.hoistPredicate"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.testing.HoistPredicate"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "caseStatements"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "caseStatements"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applications"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "applications"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lists"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lists"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nothing"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "nothing"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistPredicate"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.hoistLetBindingsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.HoistLetBindingsTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.let"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.let"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistLetBindingsTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.hoistPolymorphicLetBindingsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.HoistPolymorphicLetBindingsTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.let"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.let"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.hoistSubtermsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.HoistSubtermsTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "predicate"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistPredicate"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_predicate"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_input"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_output"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "predicate"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_predicate"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "input"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "output"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistSubtermsTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.hoistCaseStatementsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.HoistCaseStatementsTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistCaseStatementsTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.termRewriter"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.testing.TermRewriter"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceFooWithBar"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "replaceFooWithBar"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceInt32WithInt64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "replaceInt32WithInt64"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TermRewriter"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.rewriteTermTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.RewriteTermTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "rewriter"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.termRewriter"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_rewriter"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_output"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "input"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "rewriter"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_rewriter"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "output"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.RewriteTermTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.typeRewriter"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.testing.TypeRewriter"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceStringWithInt32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TypeRewriter"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "replaceStringWithInt32"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TypeRewriter"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.rewriteTypeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.RewriteTypeTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "rewriter"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.typeRewriter"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_rewriter"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_output"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "input"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "rewriter"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_rewriter"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "output"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.RewriteTypeTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.evaluationTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.EvaluationTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "evaluationStyle"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.evaluationStyle"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_evaluationStyle"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_input"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_output"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "evaluationStyle"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_evaluationStyle"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "input"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "output"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.EvaluationTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.inferenceFailureTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.InferenceFailureTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                  Core.recordTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
-                                  Core.recordFields = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "input"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))}]}))))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.InferenceFailureTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.inferenceTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.InferenceTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.InferenceTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.jsonCoderTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.JsonCoderTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_type"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_term"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "json"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_json"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.JsonCoderTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "type"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "term"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "json"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_json"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JsonCoderTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.jsonDecodeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.JsonDecodeTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_type"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "json"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_json"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "cx"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "raw"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "err"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "stripped"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                                Core.caseStatementCases = [
-                                                                  Core.Field {
-                                                                    Core.fieldName = (Core.Name "literal"),
-                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                      Core.lambdaParameter = (Core.Name "v"),
-                                                                      Core.lambdaDomain = Nothing,
-                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "string"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "s"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_expected"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "type"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "json"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_json"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "expected"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JsonDecodeTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.jsonEncodeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.JsonEncodeTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_term"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "string"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                            Core.lambdaParameter = (Core.Name "s"),
-                                                                            Core.lambdaDomain = Nothing,
-                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_expected"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "term"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "expected"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JsonEncodeTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.jsonParserTestCase"),
-      Core.bindingTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.parserTestCase")),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.ParserTestCase")),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.json.model.Value"))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.jsonRoundtripTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.JsonRoundtripTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_type"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_term"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "type"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "term"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JsonRoundtripTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.liftLambdaAboveLetTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.LiftLambdaAboveLetTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.jsonWriterTestCase"),
-      Core.bindingTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.writerTestCase")),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.WriterTestCase")),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.json.model.Value"))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.parserTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.ParserTestCase"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "cx"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "raw"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "err"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "stripped"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                      Core.caseStatementCases = [
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "literal"),
-                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "v"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                Core.caseStatementCases = [
-                                                                  Core.Field {
-                                                                    Core.fieldName = (Core.Name "string"),
-                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                      Core.lambdaParameter = (Core.Name "s"),
-                                                                      Core.lambdaDomain = Nothing,
-                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_input"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.parsing.parseResult")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_output"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.testing.ParserTestCase"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "input"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "output"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "a"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.ParserTestCase")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.tag"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.testing.Tag"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.testing.Tag"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.Tag"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.testCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.testing.TestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "alphaConversion"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "alphaConversion"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.alphaConversionTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "caseConversion"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "caseConversion"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.caseConversionTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "deannotateTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "deannotateTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.deannotateTermTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "deannotateType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "deannotateType"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.deannotateTypeTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "delegatedEvaluation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "delegatedEvaluation"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.delegatedEvaluationTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "etaExpansion"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "etaExpansion"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.etaExpansionTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "flattenLetTerms"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "flattenLetTerms"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.flattenLetTermsTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "freeVariables"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "freeVariables"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.freeVariablesTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "evaluation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "evaluation"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.evaluationTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inference"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "inference"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.inferenceTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inferenceFailure"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "inferenceFailure"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.inferenceFailureTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonCoder"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "jsonCoder"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonCoderTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonDecode"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "jsonDecode"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonDecodeTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonEncode"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "jsonEncode"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonEncodeTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonParser"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "jsonParser"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonParserTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonRoundtrip"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "jsonRoundtrip"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonRoundtripTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonWriter"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "jsonWriter"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonWriterTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "liftLambdaAboveLet"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "liftLambdaAboveLet"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.liftLambdaAboveLetTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "serialization"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "serialization"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.serializationTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "simplifyTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "simplifyTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.simplifyTermTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSort"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "topologicalSort"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.topologicalSortTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSortBindings"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "topologicalSortBindings"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.topologicalSortBindingsTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSortSCC"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "topologicalSortSCC"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.topologicalSortSCCTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeChecking"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeChecking"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.typeCheckingTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeCheckingFailure"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeCheckingFailure"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.typeCheckingFailureTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeReduction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeReduction"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.typeReductionTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "normalizeTypeVariables"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "normalizeTypeVariables"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.normalizeTypeVariablesTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foldOverTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "foldOverTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.foldOverTermTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriteTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "rewriteTerm"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.rewriteTermTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriteType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "rewriteType"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.rewriteTypeTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistSubterms"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "hoistSubterms"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistSubtermsTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistCaseStatements"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "hoistCaseStatements"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistCaseStatementsTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistLetBindings"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "hoistLetBindings"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistLetBindingsTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistPolymorphicLetBindings"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "hoistPolymorphicLetBindings"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistPolymorphicLetBindingsTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "substInType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "substInType"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.substInTypeTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variableOccursInType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "variableOccursInType"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.variableOccursInTypeTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unifyTypes"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "unifyTypes"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.unifyTypesTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "joinTypes"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "joinTypes"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.joinTypesTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unshadowVariables"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "unshadowVariables"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.unshadowVariablesTestCase")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.testCaseWithMetadata"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.TestCaseWithMetadata"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "cx"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "raw"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "err"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "stripped"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                    Core.caseStatementCases = [
-                                                      Core.Field {
-                                                        Core.fieldName = (Core.Name "literal"),
-                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "v"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                              Core.caseStatementCases = [
-                                                                Core.Field {
-                                                                  Core.fieldName = (Core.Name "string"),
-                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                    Core.lambdaParameter = (Core.Name "s"),
-                                                                    Core.lambdaDomain = Nothing,
-                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "case"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.testCase"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_case"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "description"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "cx"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "raw"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "err"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                              Core.caseStatementCases = [
-                                                                Core.Field {
-                                                                  Core.fieldName = (Core.Name "literal"),
-                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                                    Core.lambdaDomain = Nothing,
-                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                        Core.caseStatementCases = [
-                                                                          Core.Field {
-                                                                            Core.fieldName = (Core.Name "string"),
-                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                                              Core.lambdaDomain = Nothing,
-                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_description"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "tags"))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.tag"))}))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_tags"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "name"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "case"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_case"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "description"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_description"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "tags"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_tags"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TestCaseWithMetadata"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.testGroup"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.TestGroup"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "cx"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "raw"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "err"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "stripped"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                    Core.caseStatementCases = [
-                                                      Core.Field {
-                                                        Core.fieldName = (Core.Name "literal"),
-                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "v"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                              Core.caseStatementCases = [
-                                                                Core.Field {
-                                                                  Core.fieldName = (Core.Name "string"),
-                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                    Core.lambdaParameter = (Core.Name "s"),
-                                                                    Core.lambdaDomain = Nothing,
-                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "description"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_description"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "subgroups"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.testGroup"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_subgroups"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "cases"))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.testCaseWithMetadata"))}))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_cases"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "name"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "description"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_description"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "subgroups"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_subgroups"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "cases"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_cases"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TestGroup"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.typeCheckingTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.TypeCheckingTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "outputTerm"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_outputTerm"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "outputType"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_outputType"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "input"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "outputTerm"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_outputTerm"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "outputType"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_outputType"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TypeCheckingTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.typeCheckingFailureTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.TypeCheckingFailureTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                  Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
-                                  Core.recordFields = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "input"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))}]}))))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TypeCheckingFailureTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.topologicalSortBindingsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.TopologicalSortBindingsTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bindings"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_bindings"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))}))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_expected"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "bindings"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_bindings"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "expected"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.topologicalSortTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.TopologicalSortTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "adjacencyList"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_adjacencyList"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "cx"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "raw"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "err"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "stripped"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                                Core.caseStatementCases = [
-                                                                  Core.Field {
-                                                                    Core.fieldName = (Core.Name "literal"),
-                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                      Core.lambdaParameter = (Core.Name "v"),
-                                                                      Core.lambdaDomain = Nothing,
-                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "integer"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                                Core.caseStatementCases = [
-                                                                                  Core.Field {
-                                                                                    Core.fieldName = (Core.Name "int32"),
-                                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                      Core.lambdaParameter = (Core.Name "i"),
-                                                                                      Core.lambdaDomain = Nothing,
-                                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "integer"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                            Core.caseStatementCases = [
-                                                                              Core.Field {
-                                                                                Core.fieldName = (Core.Name "int32"),
-                                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                  Core.lambdaParameter = (Core.Name "i"),
-                                                                                  Core.lambdaDomain = Nothing,
-                                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_expected"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "adjacencyList"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_adjacencyList"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "expected"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.topologicalSortSCCTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.TopologicalSortSCCTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "adjacencyList"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_adjacencyList"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "integer"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                            Core.caseStatementCases = [
-                                                                              Core.Field {
-                                                                                Core.fieldName = (Core.Name "int32"),
-                                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                  Core.lambdaParameter = (Core.Name "i"),
-                                                                                  Core.lambdaDomain = Nothing,
-                                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_expected"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "adjacencyList"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_adjacencyList"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "expected"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortSCCTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.serializationTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.SerializationTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "cx"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "raw"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "err"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "stripped"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "literal"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "v"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                  Core.caseStatementCases = [
-                                                                    Core.Field {
-                                                                      Core.fieldName = (Core.Name "string"),
-                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                        Core.lambdaParameter = (Core.Name "s"),
-                                                                        Core.lambdaDomain = Nothing,
-                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.SerializationTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.simplifyTermTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.SimplifyTermTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.SimplifyTermTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.normalizeTypeVariablesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.NormalizeTypeVariablesTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.typeReductionTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.TypeReductionTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TypeReductionTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.writerTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.WriterTestCase"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_input"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_output"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.testing.WriterTestCase"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "input"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "output"),
-                                            Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "a"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.WriterTestCase")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.substInTypeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.SubstInTypeTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "substitution"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_substitution"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_input"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_output"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "substitution"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_substitution"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "input"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "output"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.SubstInTypeTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.variableOccursInTypeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.VariableOccursInTypeTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "variable"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_variable"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_type"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "boolean"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                            Core.lambdaParameter = (Core.Name "b"),
-                                                                            Core.lambdaDomain = Nothing,
-                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_expected"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "variable"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_variable"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "type"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "expected"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.VariableOccursInTypeTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.unshadowVariablesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.UnshadowVariablesTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_input"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_output"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "input"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "output"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.UnshadowVariablesTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.unifyTypesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.UnifyTypesTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "schemaTypes"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_schemaTypes"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_left"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_right"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "cx"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "raw"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "err"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "stripped"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "literal"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "v"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                              Core.caseStatementCases = [
-                                                                                Core.Field {
-                                                                                  Core.fieldName = (Core.Name "string"),
-                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                    Core.lambdaParameter = (Core.Name "s"),
-                                                                                    Core.lambdaDomain = Nothing,
-                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.typing.typeSubst"))}))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_expected"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "schemaTypes"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_schemaTypes"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "left"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "right"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "expected"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.UnifyTypesTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.testing.joinTypesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.testing.JoinTypesTestCase"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_left"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_right"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit"))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.typing.typeConstraint"))}))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_expected"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "left"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "right"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "expected"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JoinTypesTestCase"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core"),
-    (Module.Namespace "hydra.decode.ast"),
-    (Module.Namespace "hydra.decode.coders"),
-    (Module.Namespace "hydra.decode.compute"),
-    (Module.Namespace "hydra.decode.graph"),
-    (Module.Namespace "hydra.decode.json.model"),
-    (Module.Namespace "hydra.decode.module"),
-    (Module.Namespace "hydra.decode.parsing"),
-    (Module.Namespace "hydra.decode.typing"),
-    (Module.Namespace "hydra.decode.util")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.testing",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.testing")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.testing"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.alphaConversionTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_term"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "oldVariable"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_oldVariable"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "newVariable"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_newVariable"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "result"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_result"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "term"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "oldVariable"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_oldVariable"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "newVariable"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_newVariable"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "result"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_result"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.AlphaConversionTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.evaluationStyle"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "eager"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "eager"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lazy"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lazy"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.EvaluationStyle"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.caseConversionTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fromConvention"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.util.caseConvention"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_fromConvention"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "toConvention"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.util.caseConvention"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_toConvention"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "fromString"))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "string"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "s"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_fromString"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "toString"))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "cx"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "raw"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "err"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "stripped"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                    Core.caseStatementCases = [
+                                                                      Core.Field {
+                                                                        Core.fieldName = (Core.Name "literal"),
+                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                          Core.lambdaParameter = (Core.Name "v"),
+                                                                          Core.lambdaDomain = Nothing,
+                                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "string"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "s"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_toString"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "fromConvention"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_fromConvention"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "toConvention"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_toConvention"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "fromString"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_fromString"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "toString"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_toString"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.CaseConversionTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.delegatedEvaluationTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.DelegatedEvaluationTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.etaExpansionTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.EtaExpansionTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.deannotateTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.DeannotateTermTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.deannotateTypeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.DeannotateTypeTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.flattenLetTermsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.FlattenLetTermsTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.foldOperation"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sumInt32Literals"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "sumInt32Literals"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "collectListLengths"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "collectListLengths"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "collectLabels"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.FoldOperation"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "collectLabels"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.FoldOperation"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.foldOverTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "traversalOrder"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.coders.traversalOrder"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_traversalOrder"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "operation"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.foldOperation"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_operation"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_output"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "input"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "traversalOrder"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_traversalOrder"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "operation"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_operation"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "output"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.FoldOverTermTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.freeVariablesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.FreeVariablesTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.hoistPredicate"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "caseStatements"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "caseStatements"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applications"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "applications"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lists"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lists"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nothing"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "nothing"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistPredicate"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.hoistLetBindingsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.let"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.let"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistLetBindingsTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.hoistPolymorphicLetBindingsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.let"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.let"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.hoistSubtermsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "predicate"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistPredicate"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_predicate"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_input"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_output"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "predicate"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_predicate"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "input"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "output"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistSubtermsTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.hoistCaseStatementsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.HoistCaseStatementsTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.termRewriter"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceFooWithBar"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "replaceFooWithBar"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceInt32WithInt64"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TermRewriter"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "replaceInt32WithInt64"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TermRewriter"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.rewriteTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "rewriter"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.termRewriter"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_rewriter"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_output"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "input"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "rewriter"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_rewriter"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "output"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.RewriteTermTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.typeRewriter"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceStringWithInt32"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TypeRewriter"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "replaceStringWithInt32"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TypeRewriter"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.rewriteTypeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "rewriter"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.typeRewriter"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_rewriter"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_output"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "input"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "rewriter"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_rewriter"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "output"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.RewriteTypeTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.evaluationTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "evaluationStyle"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.evaluationStyle"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_evaluationStyle"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_input"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_output"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "evaluationStyle"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_evaluationStyle"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "input"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "output"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.EvaluationTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.inferenceFailureTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "input"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.InferenceFailureTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.inferenceTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.InferenceTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.jsonDecodeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_type"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "json"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_json"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "cx"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "raw"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "err"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "stripped"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                    Core.caseStatementCases = [
+                                                                      Core.Field {
+                                                                        Core.fieldName = (Core.Name "literal"),
+                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                          Core.lambdaParameter = (Core.Name "v"),
+                                                                          Core.lambdaDomain = Nothing,
+                                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "string"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "s"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_expected"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "type"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "json"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_json"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "expected"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JsonDecodeTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.jsonEncodeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_term"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "string"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "s"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_expected"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "term"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "expected"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JsonEncodeTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.jsonParserTestCase"),
+          Module.termDefinitionTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.parserTestCase")),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.ParserTestCase")),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.json.model.Value"))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.jsonRoundtripTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_type"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_term"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "type"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "term"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JsonRoundtripTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.liftLambdaAboveLetTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.jsonWriterTestCase"),
+          Module.termDefinitionTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.writerTestCase")),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.json.model.value"))})),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.WriterTestCase")),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.json.model.Value"))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.parserTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "cx"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "raw"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "err"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "stripped"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                          Core.caseStatementCases = [
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "literal"),
+                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "v"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                    Core.caseStatementCases = [
+                                                                      Core.Field {
+                                                                        Core.fieldName = (Core.Name "string"),
+                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                          Core.lambdaParameter = (Core.Name "s"),
+                                                                          Core.lambdaDomain = Nothing,
+                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "field_input"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.parsing.parseResult")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_output"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "input"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "output"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.ParserTestCase")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.tag"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.testing.Tag"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "cx"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "raw"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "err"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                  Core.caseStatementCases = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "string"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.Tag"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.testCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "alphaConversion"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "alphaConversion"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.alphaConversionTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "caseConversion"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "caseConversion"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.caseConversionTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "deannotateTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "deannotateTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.deannotateTermTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "deannotateType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "deannotateType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.deannotateTypeTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "delegatedEvaluation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "delegatedEvaluation"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.delegatedEvaluationTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "etaExpansion"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "etaExpansion"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.etaExpansionTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "flattenLetTerms"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "flattenLetTerms"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.flattenLetTermsTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "freeVariables"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "freeVariables"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.freeVariablesTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "evaluation"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "evaluation"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.evaluationTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inference"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "inference"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.inferenceTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inferenceFailure"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "inferenceFailure"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.inferenceFailureTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonDecode"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "jsonDecode"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonDecodeTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonEncode"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "jsonEncode"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonEncodeTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonParser"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "jsonParser"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonParserTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonRoundtrip"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "jsonRoundtrip"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonRoundtripTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonWriter"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "jsonWriter"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.jsonWriterTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "liftLambdaAboveLet"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "liftLambdaAboveLet"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.liftLambdaAboveLetTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "serialization"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "serialization"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.serializationTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "simplifyTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "simplifyTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.simplifyTermTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSort"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "topologicalSort"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.topologicalSortTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSortBindings"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "topologicalSortBindings"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.topologicalSortBindingsTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSortSCC"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "topologicalSortSCC"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.topologicalSortSCCTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeChecking"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeChecking"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.typeCheckingTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeCheckingFailure"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeCheckingFailure"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.typeCheckingFailureTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeReduction"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeReduction"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.typeReductionTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "normalizeTypeVariables"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "normalizeTypeVariables"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.normalizeTypeVariablesTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foldOverTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "foldOverTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.foldOverTermTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriteTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "rewriteTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.rewriteTermTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriteType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "rewriteType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.rewriteTypeTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistSubterms"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "hoistSubterms"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistSubtermsTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistCaseStatements"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "hoistCaseStatements"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistCaseStatementsTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistLetBindings"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "hoistLetBindings"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistLetBindingsTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistPolymorphicLetBindings"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "hoistPolymorphicLetBindings"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.hoistPolymorphicLetBindingsTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "substInType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "substInType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.substInTypeTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variableOccursInType"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "variableOccursInType"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.variableOccursInTypeTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unifyTypes"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unifyTypes"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.unifyTypesTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "joinTypes"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "joinTypes"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.joinTypesTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unshadowVariables"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unshadowVariables"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.unshadowVariablesTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "validateCoreTerm"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.testing.TestCase"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "validateCoreTerm"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.testing.validateCoreTermTestCase")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.testCaseWithMetadata"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "cx"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "raw"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "err"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "stripped"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                        Core.caseStatementCases = [
+                                                          Core.Field {
+                                                            Core.fieldName = (Core.Name "literal"),
+                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "v"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "string"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                        Core.lambdaParameter = (Core.Name "s"),
+                                                                        Core.lambdaDomain = Nothing,
+                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "case"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.testCase"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_case"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "description"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "cx"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "raw"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "err"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "literal"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                                        Core.lambdaDomain = Nothing,
+                                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                            Core.caseStatementCases = [
+                                                                              Core.Field {
+                                                                                Core.fieldName = (Core.Name "string"),
+                                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                  Core.lambdaParameter = (Core.Name "s"),
+                                                                                  Core.lambdaDomain = Nothing,
+                                                                                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_description"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "tags"))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.tag"))}))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_tags"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "name"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "case"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_case"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "description"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_description"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "tags"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_tags"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TestCaseWithMetadata"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.testGroup"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "cx"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "raw"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "err"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "stripped"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                        Core.caseStatementCases = [
+                                                          Core.Field {
+                                                            Core.fieldName = (Core.Name "literal"),
+                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "v"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "string"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                        Core.lambdaParameter = (Core.Name "s"),
+                                                                        Core.lambdaDomain = Nothing,
+                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_name"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "description"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "string"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "s"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_description"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "subgroups"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.testGroup"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_subgroups"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "cases"))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.testing.testCaseWithMetadata"))}))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_cases"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.testing.TestGroup"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "name"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "description"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_description"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "subgroups"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_subgroups"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "cases"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_cases"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TestGroup"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.typeCheckingTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "outputTerm"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_outputTerm"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "outputType"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_outputType"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "input"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "outputTerm"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_outputTerm"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "outputType"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_outputType"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TypeCheckingTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.typeCheckingFailureTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                      Core.recordTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
+                                      Core.recordFields = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "input"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))}]}))))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TypeCheckingFailureTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.topologicalSortBindingsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bindings"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_bindings"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))}))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_expected"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "bindings"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_bindings"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "expected"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.topologicalSortTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "adjacencyList"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_adjacencyList"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "cx"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "raw"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "err"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "stripped"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                    Core.caseStatementCases = [
+                                                                      Core.Field {
+                                                                        Core.fieldName = (Core.Name "literal"),
+                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                          Core.lambdaParameter = (Core.Name "v"),
+                                                                          Core.lambdaDomain = Nothing,
+                                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "integer"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                                    Core.caseStatementCases = [
+                                                                                      Core.Field {
+                                                                                        Core.fieldName = (Core.Name "int32"),
+                                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                          Core.lambdaParameter = (Core.Name "i"),
+                                                                                          Core.lambdaDomain = Nothing,
+                                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "integer"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                                Core.caseStatementCases = [
+                                                                                  Core.Field {
+                                                                                    Core.fieldName = (Core.Name "int32"),
+                                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                      Core.lambdaParameter = (Core.Name "i"),
+                                                                                      Core.lambdaDomain = Nothing,
+                                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_expected"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "adjacencyList"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_adjacencyList"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "expected"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.topologicalSortSCCTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "adjacencyList"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_adjacencyList"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "integer"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                                Core.caseStatementCases = [
+                                                                                  Core.Field {
+                                                                                    Core.fieldName = (Core.Name "int32"),
+                                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                      Core.lambdaParameter = (Core.Name "i"),
+                                                                                      Core.lambdaDomain = Nothing,
+                                                                                      Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))}))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_expected"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "adjacencyList"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_adjacencyList"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "expected"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortSCCTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.serializationTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.ast.expr"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "cx"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "raw"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "err"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "stripped"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                            Core.caseStatementCases = [
+                                                              Core.Field {
+                                                                Core.fieldName = (Core.Name "literal"),
+                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "v"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                      Core.caseStatementCases = [
+                                                                        Core.Field {
+                                                                          Core.fieldName = (Core.Name "string"),
+                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                            Core.lambdaParameter = (Core.Name "s"),
+                                                                            Core.lambdaDomain = Nothing,
+                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.SerializationTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.simplifyTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.SimplifyTermTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.normalizeTypeVariablesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.typeReductionTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.TypeReductionTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.writerTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "field_input"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "string"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "s"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_output"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "input"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "output"),
+                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.WriterTestCase")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.substInTypeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "substitution"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodePair")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_substitution"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_input"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_output"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "substitution"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_substitution"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "input"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "output"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.SubstInTypeTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.variableOccursInTypeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "variable"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_variable"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_type"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "boolean"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "b"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_expected"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "variable"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_variable"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "type"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "expected"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.VariableOccursInTypeTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.unshadowVariablesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_input"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_output"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                          Core.recordTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+                                          Core.recordFields = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "input"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "output"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.UnshadowVariablesTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.unifyTypesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "schemaTypes"))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_schemaTypes"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_left"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_right"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "cx"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "raw"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "err"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "stripped"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "literal"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "v"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                                  Core.caseStatementCases = [
+                                                                                    Core.Field {
+                                                                                      Core.fieldName = (Core.Name "string"),
+                                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                        Core.lambdaParameter = (Core.Name "s"),
+                                                                                        Core.lambdaDomain = Nothing,
+                                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.typing.typeSubst"))}))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_expected"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                  Core.recordTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+                                                  Core.recordFields = [
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "schemaTypes"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_schemaTypes"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "left"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "right"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))},
+                                                    Core.Field {
+                                                      Core.fieldName = (Core.Name "expected"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.UnifyTypesTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.joinTypesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_left"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_right"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "expected"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeEither")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit"))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.typing.typeConstraint"))}))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_expected"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "left"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "right"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "expected"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_expected"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.JoinTypesTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.testing.validateCoreTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typed"))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "cx"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "raw"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "err"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "stripped"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                        Core.caseStatementCases = [
+                                                          Core.Field {
+                                                            Core.fieldName = (Core.Name "literal"),
+                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "v"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "boolean"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                        Core.lambdaParameter = (Core.Name "b"),
+                                                                        Core.lambdaDomain = Nothing,
+                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_typed"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "input"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_input"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "output"))})),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.error.core.invalidTermError"))}))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_output"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "typed"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_typed"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "input"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_input"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "output"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_output"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.testing.ValidateCoreTermTestCase"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.ast"),
+        (Module.Namespace "hydra.decode.coders"),
+        (Module.Namespace "hydra.decode.error.core"),
+        (Module.Namespace "hydra.decode.graph"),
+        (Module.Namespace "hydra.decode.json.model"),
+        (Module.Namespace "hydra.decode.module"),
+        (Module.Namespace "hydra.decode.parsing"),
+        (Module.Namespace "hydra.decode.typing"),
+        (Module.Namespace "hydra.decode.util")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.testing",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.testing")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Topology.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Topology.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Topology.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Topology.hs
@@ -14,145 +14,73 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.topology"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.topology.graph"),
-      Core.bindingTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))})),
-        Core.applicationArgument = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))}))})),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeMap (Core.MapType {
-                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.topology.Vertex")),
-                Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.topology.Vertex")))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.topology.tarjanState"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.topology"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.topology.graph"),
+          Module.termDefinitionTerm = (Core.TermApplication (Core.Application {
             Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.topology.TarjanState"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "counter"))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "cx"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "raw"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "err"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "stripped"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                    Core.caseStatementCases = [
-                                                      Core.Field {
-                                                        Core.fieldName = (Core.Name "literal"),
-                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "v"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                              Core.caseStatementCases = [
-                                                                Core.Field {
-                                                                  Core.fieldName = (Core.Name "integer"),
-                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "int32"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "i"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_counter"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))})),
+            Core.applicationArgument = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))}))})),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.topology.Vertex")),
+                    Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.topology.Vertex")))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.topology.tarjanState"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
                                     Core.applicationArgument = (Core.TermApplication (Core.Application {
@@ -160,74 +88,70 @@
                                         Core.applicationFunction = (Core.TermApplication (Core.Application {
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "indices"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))})),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "counter"))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "cx"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "raw"),
                                               Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
                                                     Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
+                                                      Core.lambdaParameter = (Core.Name "err"),
                                                       Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
+                                                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "stripped"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                        Core.caseStatementCases = [
+                                                          Core.Field {
+                                                            Core.fieldName = (Core.Name "literal"),
+                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "v"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "integer"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "int32"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                              Core.lambdaParameter = (Core.Name "i"),
+                                                                              Core.lambdaDomain = Nothing,
+                                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
                                         Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                       Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                   Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_indices"),
+                                    Core.lambdaParameter = (Core.Name "field_counter"),
                                     Core.lambdaDomain = Nothing,
                                     Core.lambdaBody = (Core.TermApplication (Core.Application {
                                       Core.applicationFunction = (Core.TermApplication (Core.Application {
@@ -237,7 +161,7 @@
                                             Core.applicationFunction = (Core.TermApplication (Core.Application {
                                               Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                 Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "lowLinks"))})),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "indices"))})),
                                               Core.applicationArgument = (Core.TermApplication (Core.Application {
                                                 Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                   Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
@@ -256,7 +180,7 @@
                                                             Core.lambdaParameter = (Core.Name "err"),
                                                             Core.lambdaDomain = Nothing,
                                                             Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                               Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
                                                         Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
                                                           Core.lambdaParameter = (Core.Name "stripped"),
@@ -265,7 +189,7 @@
                                                             Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
                                                               Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
                                                               Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                                 Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
                                                               Core.caseStatementCases = [
                                                                 Core.Field {
@@ -277,7 +201,7 @@
                                                                       Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
                                                                         Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
                                                                         Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                                           Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
                                                                         Core.caseStatementCases = [
                                                                           Core.Field {
@@ -285,7 +209,7 @@
                                                                             Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
                                                                               Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
                                                                               Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
                                                                                 Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
                                                                               Core.caseStatementCases = [
                                                                                 Core.Field {
@@ -304,7 +228,7 @@
                                             Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                           Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                       Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_lowLinks"),
+                                        Core.lambdaParameter = (Core.Name "field_indices"),
                                         Core.lambdaDomain = Nothing,
                                         Core.lambdaBody = (Core.TermApplication (Core.Application {
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
@@ -314,14 +238,74 @@
                                                 Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                     Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "stack"))})),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "lowLinks"))})),
                                                   Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))}))})),
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))})),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "cx"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "raw"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "err"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "stripped"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                  Core.caseStatementCases = [
+                                                                    Core.Field {
+                                                                      Core.fieldName = (Core.Name "literal"),
+                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                        Core.lambdaParameter = (Core.Name "v"),
+                                                                        Core.lambdaDomain = Nothing,
+                                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                            Core.caseStatementCases = [
+                                                                              Core.Field {
+                                                                                Core.fieldName = (Core.Name "integer"),
+                                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                                  Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                                  Core.caseStatementCases = [
+                                                                                    Core.Field {
+                                                                                      Core.fieldName = (Core.Name "int32"),
+                                                                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                        Core.lambdaParameter = (Core.Name "i"),
+                                                                                        Core.lambdaDomain = Nothing,
+                                                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))})),
                                                 Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                               Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                           Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_stack"),
+                                            Core.lambdaParameter = (Core.Name "field_lowLinks"),
                                             Core.lambdaDomain = Nothing,
                                             Core.lambdaBody = (Core.TermApplication (Core.Application {
                                               Core.applicationFunction = (Core.TermApplication (Core.Application {
@@ -331,14 +315,14 @@
                                                     Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                       Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                         Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "onStack"))})),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "stack"))})),
                                                       Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
                                                         Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))}))})),
                                                     Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                                   Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                               Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "field_onStack"),
+                                                Core.lambdaParameter = (Core.Name "field_stack"),
                                                 Core.lambdaDomain = Nothing,
                                                 Core.lambdaBody = (Core.TermApplication (Core.Application {
                                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
@@ -348,131 +332,148 @@
                                                         Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                                             Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "sccs"))})),
+                                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "onStack"))})),
                                                           Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))}))}))})),
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))}))})),
                                                         Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
                                                       Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
                                                   Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "field_sccs"),
+                                                    Core.lambdaParameter = (Core.Name "field_onStack"),
                                                     Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                                      Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
-                                                      Core.recordFields = [
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "counter"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_counter"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "indices"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_indices"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "lowLinks"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_lowLinks"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "stack"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_stack"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "onStack"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_onStack"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "sccs"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_sccs"))}]}))))})))}))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.topology.TarjanState"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.topology.vertex"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "literal"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "v"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                              Core.caseStatementCases = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "integer"),
-                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                    Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                    Core.caseStatementCases = [
-                                      Core.Field {
-                                        Core.fieldName = (Core.Name "int32"),
-                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "i"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Literal"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.topology",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.topology")}
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "sccs"))})),
+                                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.topology.vertex"))}))}))})),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "field_sccs"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                          Core.recordTypeName = (Core.Name "hydra.topology.TarjanState"),
+                                                          Core.recordFields = [
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "counter"),
+                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_counter"))},
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "indices"),
+                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_indices"))},
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "lowLinks"),
+                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_lowLinks"))},
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "stack"),
+                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_stack"))},
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "onStack"),
+                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_onStack"))},
+                                                            Core.Field {
+                                                              Core.fieldName = (Core.Name "sccs"),
+                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_sccs"))}]}))))})))}))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.topology.TarjanState"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.topology.vertex"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "literal"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "v"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                  Core.caseStatementCases = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "integer"),
+                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                        Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                        Core.caseStatementCases = [
+                                          Core.Field {
+                                            Core.fieldName = (Core.Name "int32"),
+                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "i"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.core.Literal"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.topology",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.topology")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Typing.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Typing.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Typing.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Typing.hs
@@ -14,1065 +14,687 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.typing"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.typing.functionStructure"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "env"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "cx"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "raw"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "err"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "stripped"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.typing.FunctionStructure"))}))))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "record"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "record"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "fieldMap"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeParams"))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "field_typeParams"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "params"))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "field_params"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bindings"))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.binding"))}))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "field_bindings"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "field_body"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "domains"))})),
-                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "field_domains"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "codomain"))})),
-                                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "field_codomain"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "environment"))})),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "env"))})),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "field_environment"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                                            Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-                                                            Core.recordFields = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "typeParams"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeParams"))},
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "params"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_params"))},
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "bindings"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_bindings"))},
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "body"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))},
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "domains"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_domains"))},
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "codomain"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_codomain"))},
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "environment"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "field_environment"))}]}))))})))}))})))}))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [
-          Core.Name "env"],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "env"))}))}))})),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-                Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.typing.FunctionStructure")),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "env"))}))}))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.typing.inferenceContext"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.typing.InferenceContext"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "schemaTypes"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_schemaTypes"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "primitiveTypes"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_primitiveTypes"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "dataTypes"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeScheme"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_dataTypes"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "classConstraints"))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeVariableMetadata"))}))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_classConstraints"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "debug"))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "cx"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "raw"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "err"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "stripped"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "literal"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "v"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected boolean literal"))}))))),
-                                                                              Core.caseStatementCases = [
-                                                                                Core.Field {
-                                                                                  Core.fieldName = (Core.Name "boolean"),
-                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                    Core.lambdaParameter = (Core.Name "b"),
-                                                                                    Core.lambdaDomain = Nothing,
-                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "b"))))})))}]})))),
-                                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "field_debug"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                                  Core.recordTypeName = (Core.Name "hydra.typing.InferenceContext"),
-                                                  Core.recordFields = [
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "schemaTypes"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_schemaTypes"))},
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "primitiveTypes"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_primitiveTypes"))},
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "dataTypes"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_dataTypes"))},
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "classConstraints"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_classConstraints"))},
-                                                    Core.Field {
-                                                      Core.fieldName = (Core.Name "debug"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "field_debug"))}]}))))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.InferenceContext"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.typing.inferenceResult"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.typing.InferenceResult"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_term"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_type"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "subst"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.typing.typeSubst"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_subst"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "classConstraints"))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeVariableMetadata"))}))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_classConstraints"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "term"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "type"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "subst"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_subst"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "classConstraints"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_classConstraints"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.InferenceResult"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.typing.termSubst"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.typing.TermSubst"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.typing.TermSubst"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.TermSubst"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.typing.typeConstraint"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.typing.TypeConstraint"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_left"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_right"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "comment"))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "string"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                            Core.lambdaParameter = (Core.Name "s"),
-                                                                            Core.lambdaDomain = Nothing,
-                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_comment"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                          Core.recordTypeName = (Core.Name "hydra.typing.TypeConstraint"),
-                                          Core.recordFields = [
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "left"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "right"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))},
-                                            Core.Field {
-                                              Core.fieldName = (Core.Name "comment"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "field_comment"))}]}))))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.TypeConstraint"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.typing.typeContext"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.typing.TypeContext"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "types"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_types"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "metadata"))})),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))}))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_metadata"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeVariables"))})),
-                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_typeVariables"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "lambdaVariables"))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_lambdaVariables"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "letVariables"))})),
-                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeSet")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "field_letVariables"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "inferenceContext"))})),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.typing.inferenceContext"))})),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "field_inferenceContext"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                                      Core.recordTypeName = (Core.Name "hydra.typing.TypeContext"),
-                                                      Core.recordFields = [
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "types"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_types"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "metadata"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_metadata"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "typeVariables"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeVariables"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "lambdaVariables"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_lambdaVariables"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "letVariables"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_letVariables"))},
-                                                        Core.Field {
-                                                          Core.fieldName = (Core.Name "inferenceContext"),
-                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_inferenceContext"))}]}))))})))}))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.TypeContext"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.typing.typeSubst"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.typing.TypeSubst"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.typing.TypeSubst"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.TypeSubst"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.typing",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.typing")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.typing"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.typing.functionStructure"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "env"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "cx"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "raw"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "err"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "stripped"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "record"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "record"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "fieldMap"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeParams"))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "field_typeParams"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "params"))})),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))}))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "field_params"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bindings"))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.binding"))}))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "field_bindings"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "body"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "field_body"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "domains"))})),
+                                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "field_domains"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "codomain"))})),
+                                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMaybe")),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))}))})),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "field_codomain"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "environment"))})),
+                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "env"))})),
+                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "field_environment"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                                Core.recordTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+                                                                Core.recordFields = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "typeParams"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeParams"))},
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "params"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_params"))},
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "bindings"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_bindings"))},
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "body"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_body"))},
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "domains"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_domains"))},
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "codomain"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_codomain"))},
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "environment"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "field_environment"))}]}))))})))}))})))}))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "env"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "env"))}))}))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                    Core.eitherTypeRight = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.typing.FunctionStructure")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "env"))}))}))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.typing.inferenceResult"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "term"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_term"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "type"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_type"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "subst"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.typing.typeSubst"))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_subst"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "classConstraints"))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.typeVariableMetadata"))}))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "field_classConstraints"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "context"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.context.context"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "field_context"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                                      Core.recordTypeName = (Core.Name "hydra.typing.InferenceResult"),
+                                                      Core.recordFields = [
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "term"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_term"))},
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "type"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_type"))},
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "subst"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_subst"))},
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "classConstraints"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_classConstraints"))},
+                                                        Core.Field {
+                                                          Core.fieldName = (Core.Name "context"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_context"))}]}))))})))}))})))}))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.InferenceResult"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.typing.termSubst"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.typing.TermSubst"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.term"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.TermSubst"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.typing.typeConstraint"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "record"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "record"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fieldMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "left"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "field_left"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "right"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "field_right"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
+                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "comment"))})),
+                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "cx"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "raw"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                              Core.lambdaParameter = (Core.Name "err"),
+                                                              Core.lambdaDomain = Nothing,
+                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "stripped"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                                Core.caseStatementCases = [
+                                                                  Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                      Core.lambdaParameter = (Core.Name "v"),
+                                                                      Core.lambdaDomain = Nothing,
+                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
+                                                                          Core.caseStatementCases = [
+                                                                            Core.Field {
+                                                                              Core.fieldName = (Core.Name "string"),
+                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                Core.lambdaParameter = (Core.Name "s"),
+                                                                                Core.lambdaDomain = Nothing,
+                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
+                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "field_comment"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                                              Core.recordTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+                                              Core.recordFields = [
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "left"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_left"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "right"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_right"))},
+                                                Core.Field {
+                                                  Core.fieldName = (Core.Name "comment"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_comment"))}]}))))})))}))})))}))})))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.TypeConstraint"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.typing.typeSubst"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "wrap"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "wrappedTerm"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.typing.TypeSubst"),
+                                      Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeMap")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.type"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.typing.TypeSubst"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.context")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.typing",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.typing")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Util.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Util.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Util.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Util.hs
@@ -14,730 +14,583 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.util"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.util.caseConvention"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.util.CaseConvention"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "camel"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "camel"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pascal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "pascal"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lowerSnake"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lowerSnake"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "upperSnake"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "upperSnake"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.util.CaseConvention"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.util.comparison"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.util.Comparison"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThan"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lessThan"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equalTo"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "equalTo"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThan"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "greaterThan"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.util.Comparison"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.util.decodingError"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected wrapped type hydra.util.DecodingError"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "wrap"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "wrappedTerm"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                  Core.wrappedTermBody = (Core.TermVariable (Core.Name "b"))}))})))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "cx"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "raw"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "err"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "stripped"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                              Core.caseStatementCases = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "v"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                        Core.caseStatementCases = [
-                                                          Core.Field {
-                                                            Core.fieldName = (Core.Name "string"),
-                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "s"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedTerm"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.util.DecodingError"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.util.precision"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.util.Precision"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "arbitrary"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "arbitrary"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bits"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "bits"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "integer"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "int32"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "i"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.util.Precision"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.util",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.util")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.util"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.util.caseConvention"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "camel"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "camel"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pascal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "pascal"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lowerSnake"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lowerSnake"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "upperSnake"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "upperSnake"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.util.CaseConvention"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.util.comparison"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThan"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lessThan"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equalTo"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "equalTo"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThan"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "greaterThan"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.util.Comparison"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.util.precision"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "arbitrary"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "arbitrary"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bits"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.util.Precision"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "bits"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "cx"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                    Core.lambdaParameter = (Core.Name "raw"),
+                                                    Core.lambdaDomain = Nothing,
+                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                            Core.lambdaParameter = (Core.Name "err"),
+                                                            Core.lambdaDomain = Nothing,
+                                                            Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                              Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                              Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                          Core.lambdaParameter = (Core.Name "stripped"),
+                                                          Core.lambdaDomain = Nothing,
+                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
+                                                              Core.caseStatementCases = [
+                                                                Core.Field {
+                                                                  Core.fieldName = (Core.Name "literal"),
+                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                    Core.lambdaParameter = (Core.Name "v"),
+                                                                    Core.lambdaDomain = Nothing,
+                                                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 literal"))}))))),
+                                                                        Core.caseStatementCases = [
+                                                                          Core.Field {
+                                                                            Core.fieldName = (Core.Name "integer"),
+                                                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                                                                Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected int32 value"))}))))),
+                                                                              Core.caseStatementCases = [
+                                                                                Core.Field {
+                                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                                    Core.lambdaParameter = (Core.Name "i"),
+                                                                                    Core.lambdaDomain = Nothing,
+                                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "i"))))})))}]}))))}]})))),
+                                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.util.Precision"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.context"),
+        (Module.Namespace "hydra.decode.core"),
+        (Module.Namespace "hydra.decode.errors")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.util",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.util")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Variants.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Variants.hs
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Variants.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Decode/Variants.hs
@@ -14,1545 +14,1512 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.variants"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.variants.eliminationVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.variants.EliminationVariant"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "record"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "union"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "wrap"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.EliminationVariant"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.variants.functionVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.variants.FunctionVariant"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elimination"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "elimination"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "lambda"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitive"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "primitive"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.FunctionVariant"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.variants.literalVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.variants.LiteralVariant"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "binary"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "boolean"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "float"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "integer"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.LiteralVariant"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.variants.termVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.variants.TermVariant"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "annotated"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "application"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "either"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "function"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "let"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "let"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "list"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "literal"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "map"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "maybe"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "pair"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "record"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "set"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplication"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeApplication"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "typeLambda"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "union"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "unit"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "variable"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "wrap"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.TermVariant"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.variants.typeVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.variants.TypeVariant"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "annotated"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "application"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "either"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forall"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "forall"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "function"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "list"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "literal"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "map"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "maybe"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "pair"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "record"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "set"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "union"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "unit"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "variable"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "wrap"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.TypeVariant"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.variants",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.variants")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.decode.variants"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.variants.eliminationVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "record"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "union"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wrap"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.EliminationVariant"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.variants.functionVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elimination"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "elimination"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "lambda"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitive"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "primitive"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.FunctionVariant"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.variants.literalVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "binary"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "boolean"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "float"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "integer"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.LiteralVariant"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.variants.termVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "annotated"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "application"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "either"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "function"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "let"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "let"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "list"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "literal"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "map"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "maybe"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "pair"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "record"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "set"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplication"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeApplication"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambda"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "typeLambda"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "union"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unit"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "variable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TermVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wrap"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.TermVariant"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.decode.variants.typeVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "cx"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "raw"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "err"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                        Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "stripped"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+                        Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union"))}))))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "union"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "inj"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "field"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                        Core.projectionField = (Core.Name "field")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fname"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "name")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "fterm"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                        Core.projectionField = (Core.Name "term")})))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
+                                    Core.bindingType = Nothing},
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "variantMap"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                                      Core.applicationArgument = (Core.TermList [
+                                        Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "annotated"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "application"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "either"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forall"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "forall"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "function"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "list"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "literal"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "map"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "maybe"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "pair"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "record"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "set"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "union"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "unit"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "variable"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "void"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "void"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
+                                        (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "input"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "t"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.variants.TypeVariant"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "wrap"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                      Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.errors.DecodingError"),
+                                        Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                          Core.applicationArgument = (Core.TermList [
+                                            Core.TermLiteral (Core.LiteralString "no such field "),
+                                            (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                            (Core.TermLiteral (Core.LiteralString " in union"))])}))}))))})),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "f"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.variants.TypeVariant"))}))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.extract.helpers",
+        (Module.Namespace "hydra.lexical"),
+        (Module.Namespace "hydra.rewriting"),
+        (Module.Namespace "hydra.decode.core")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.variants",
+        (Module.Namespace "hydra.util")],
+      Module.moduleDescription = (Just "Term decoders for hydra.variants")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Decode/Workflow.hs b/src/gen-main/haskell/Hydra/Sources/Decode/Workflow.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Decode/Workflow.hs
+++ /dev/null
@@ -1,641 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.decode.workflow
-
-module Hydra.Sources.Decode.Workflow where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.decode.workflow"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.workflow.hydraSchemaSpec"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.workflow.HydraSchemaSpec"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "modules"))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeList")),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.module.module"))}))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_modules"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "typeName"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.core.name"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_typeName"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                      Core.recordTypeName = (Core.Name "hydra.workflow.HydraSchemaSpec"),
-                                      Core.recordFields = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "modules"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_modules"))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "typeName"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "field_typeName"))}]}))))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.workflow.HydraSchemaSpec"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.workflow.schemaSpec"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected union of type hydra.workflow.SchemaSpec"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "union"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "inj"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "tname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "typeName")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "field"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                    Core.projectionField = (Core.Name "field")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "inj"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fname"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "name")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fterm"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                    Core.projectionField = (Core.Name "term")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "field"))})),
-                                Core.bindingType = Nothing},
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "variantMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.workflow.SchemaSpec"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "hydra"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.decode.workflow.hydraSchemaSpec")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "file"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.workflow.SchemaSpec"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "file"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "cx"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "raw"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "err"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                          Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                          Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "stripped"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                          Core.caseStatementCases = [
-                                                            Core.Field {
-                                                              Core.fieldName = (Core.Name "literal"),
-                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                Core.lambdaParameter = (Core.Name "v"),
-                                                                Core.lambdaDomain = Nothing,
-                                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                    Core.caseStatementCases = [
-                                                                      Core.Field {
-                                                                        Core.fieldName = (Core.Name "string"),
-                                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                          Core.lambdaParameter = (Core.Name "s"),
-                                                                          Core.lambdaDomain = Nothing,
-                                                                          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))}))))),
-                                    (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "provided"))}), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "input"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "t"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.workflow.SchemaSpec"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "provided"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "t"))}}))})))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.decodeUnit")),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "input"))}))}))})))))])})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                                  Core.applicationArgument = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                    Core.wrappedTermBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                      Core.applicationArgument = (Core.TermList [
-                                        Core.TermLiteral (Core.LiteralString "no such field "),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                        (Core.TermLiteral (Core.LiteralString " in union type ")),
-                                        (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "tname"))}))])}))}))))})),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "f"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fterm"))}))})))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "fname"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "variantMap"))}))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.workflow.SchemaSpec"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.decode.workflow.transformWorkflow"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "cx"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "raw"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "err"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "stripped"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected record of type hydra.workflow.TransformWorkflow"))}))))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "record"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "record"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "fieldMap"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.toFieldMap")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "record"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "name"))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "cx"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "raw"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "err"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                    Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "stripped"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                    Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                      Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                    Core.caseStatementCases = [
-                                                      Core.Field {
-                                                        Core.fieldName = (Core.Name "literal"),
-                                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "v"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                              Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                              Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                              Core.caseStatementCases = [
-                                                                Core.Field {
-                                                                  Core.fieldName = (Core.Name "string"),
-                                                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                    Core.lambdaParameter = (Core.Name "s"),
-                                                                    Core.lambdaDomain = Nothing,
-                                                                    Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "field_name"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "schemaSpec"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.decode.workflow.schemaSpec"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "field_schemaSpec"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "srcDir"))})),
-                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                Core.lambdaParameter = (Core.Name "cx"),
-                                                Core.lambdaDomain = Nothing,
-                                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "raw"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                          Core.lambdaParameter = (Core.Name "err"),
-                                                          Core.lambdaDomain = Nothing,
-                                                          Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                            Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                        Core.lambdaParameter = (Core.Name "stripped"),
-                                                        Core.lambdaDomain = Nothing,
-                                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                            Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                              Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                            Core.caseStatementCases = [
-                                                              Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                  Core.lambdaParameter = (Core.Name "v"),
-                                                                  Core.lambdaDomain = Nothing,
-                                                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                      Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                      Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                        Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                      Core.caseStatementCases = [
-                                                                        Core.Field {
-                                                                          Core.fieldName = (Core.Name "string"),
-                                                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                            Core.lambdaParameter = (Core.Name "s"),
-                                                                            Core.lambdaDomain = Nothing,
-                                                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "field_srcDir"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.extract.helpers.requireField")),
-                                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "destDir"))})),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "cx"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                      Core.lambdaParameter = (Core.Name "raw"),
-                                                      Core.lambdaDomain = Nothing,
-                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "err"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                Core.wrappedTermBody = (Core.TermVariable (Core.Name "err"))}))))})))})),
-                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "stripped"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-                                                                Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                  Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected literal"))}))))),
-                                                                Core.caseStatementCases = [
-                                                                  Core.Field {
-                                                                    Core.fieldName = (Core.Name "literal"),
-                                                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                      Core.lambdaParameter = (Core.Name "v"),
-                                                                      Core.lambdaDomain = Nothing,
-                                                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                                                          Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-                                                                          Core.caseStatementDefault = (Just (Core.TermEither (Left (Core.TermWrap (Core.WrappedTerm {
-                                                                            Core.wrappedTermTypeName = (Core.Name "hydra.util.DecodingError"),
-                                                                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected string literal"))}))))),
-                                                                          Core.caseStatementCases = [
-                                                                            Core.Field {
-                                                                              Core.fieldName = (Core.Name "string"),
-                                                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                                                Core.lambdaParameter = (Core.Name "s"),
-                                                                                Core.lambdaDomain = Nothing,
-                                                                                Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "s"))))})))}]})))),
-                                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}]})))),
-                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-                                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))})))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "fieldMap"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))}))})),
-                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "field_destDir"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                                              Core.recordTypeName = (Core.Name "hydra.workflow.TransformWorkflow"),
-                                              Core.recordFields = [
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "name"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_name"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "schemaSpec"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_schemaSpec"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "srcDir"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_srcDir"))},
-                                                Core.Field {
-                                                  Core.fieldName = (Core.Name "destDir"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "field_destDir"))}]}))))})))}))})))}))})))}))})))}))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "stripped"))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.lexical.stripAndDereferenceTermEither")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "raw"))}))}))})))}))),
-      Core.bindingType = (Just (Core.TypeScheme {
-        Core.typeSchemeVariables = [],
-        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.graph.Graph")),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
-            Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "hydra.util.DecodingError")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "hydra.workflow.TransformWorkflow"))}))}))})),
-        Core.typeSchemeConstraints = Nothing}))}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.extract.helpers",
-    (Module.Namespace "hydra.lexical"),
-    (Module.Namespace "hydra.rewriting"),
-    (Module.Namespace "hydra.decode.core"),
-    (Module.Namespace "hydra.decode.compute"),
-    (Module.Namespace "hydra.decode.graph"),
-    (Module.Namespace "hydra.decode.module")],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.workflow",
-    (Module.Namespace "hydra.util")],
-  Module.moduleDescription = (Just "Term decoders for hydra.workflow")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Accessors.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Accessors.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Accessors.hs
+++ /dev/null
@@ -1,1109 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.encode.accessors
-
-module Hydra.Sources.Encode.Accessors where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.accessors"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.accessors.accessorEdge"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.AccessorEdge"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "source"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.accessors.accessorNode")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.accessors.AccessorEdge"),
-                                Core.projectionField = (Core.Name "source")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "path"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.accessors.accessorPath")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.accessors.AccessorEdge"),
-                                Core.projectionField = (Core.Name "path")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "target"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.accessors.accessorNode")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.accessors.AccessorEdge"),
-                                Core.projectionField = (Core.Name "target")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.accessors.accessorGraph"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.AccessorGraph"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nodes"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.accessors.accessorNode"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.accessors.AccessorGraph"),
-                                Core.projectionField = (Core.Name "nodes")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "edges"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.accessors.accessorEdge"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.accessors.AccessorGraph"),
-                                Core.projectionField = (Core.Name "edges")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.accessors.accessorNode"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.AccessorNode"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.accessors.AccessorNode"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "label"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.accessors.AccessorNode"),
-                                Core.projectionField = (Core.Name "label")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "id"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.accessors.AccessorNode"),
-                                Core.projectionField = (Core.Name "id")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.accessors.accessorPath"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.AccessorPath"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "xs"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "list"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.accessors.termAccessor"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.accessors.AccessorPath")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.accessors.termAccessor"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.accessors.TermAccessor"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "annotatedBody"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotatedBody"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "applicationFunction"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationFunction"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "applicationArgument"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationArgument"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "lambdaBody"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambdaBody"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "unionCasesDefault"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionCasesDefault"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "unionCasesBranch"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionCasesBranch"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "letBody"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letBody"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "letBinding"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letBinding"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "listElement"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "listElement"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "mapKey"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapKey"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "mapValue"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapValue"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "maybeTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybeTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "productTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "productTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "recordField"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "recordField"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "setElement"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "setElement"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "sumTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sumTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeLambdaBody"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambdaBody"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeApplicationTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplicationTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "injectionTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "injectionTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "wrappedTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.accessors.TermAccessor"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrappedTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.accessors"],
-  Module.moduleDescription = (Just "Term encoders for hydra.accessors")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Ast.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Ast.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Ast.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Ast.hs
@@ -14,1198 +14,1367 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.ast"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.associativity"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.ast.Associativity"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "none"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Associativity"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "none"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "left"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Associativity"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "right"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Associativity"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "both"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Associativity"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "both"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.blockStyle"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.BlockStyle"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "indent"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "x"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "literal"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
-                                Core.projectionField = (Core.Name "indent")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "newlineBeforeContent"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "boolean"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
-                                Core.projectionField = (Core.Name "newlineBeforeContent")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "newlineAfterContent"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "boolean"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
-                                Core.projectionField = (Core.Name "newlineAfterContent")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.bracketExpr"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.BracketExpr"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "brackets"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.brackets")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
-                                Core.projectionField = (Core.Name "brackets")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "enclosed"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
-                                Core.projectionField = (Core.Name "enclosed")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "style"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.blockStyle")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
-                                Core.projectionField = (Core.Name "style")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.brackets"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Brackets"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "open"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.symbol")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.Brackets"),
-                                Core.projectionField = (Core.Name "open")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "close"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.symbol")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.Brackets"),
-                                Core.projectionField = (Core.Name "close")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.expr"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.ast.Expr"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "const"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "const"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.symbol")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "indent"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "indent"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.indentedExpression")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "op"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "op"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.opExpr")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "brackets"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "brackets"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.bracketExpr")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.indentedExpression"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.IndentedExpression"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "style"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.indentStyle")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.IndentedExpression"),
-                                Core.projectionField = (Core.Name "style")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expr"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.IndentedExpression"),
-                                Core.projectionField = (Core.Name "expr")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.indentStyle"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.ast.IndentStyle"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "allLines"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.IndentStyle"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "allLines"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "string"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "subsequentLines"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.IndentStyle"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subsequentLines"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "string"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.op"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Op"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "symbol"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.symbol")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
-                                Core.projectionField = (Core.Name "symbol")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "padding"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.padding")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
-                                Core.projectionField = (Core.Name "padding")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "precedence"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.precedence")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
-                                Core.projectionField = (Core.Name "precedence")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "associativity"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.associativity")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
-                                Core.projectionField = (Core.Name "associativity")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.opExpr"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.OpExpr"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "op"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.op")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
-                                Core.projectionField = (Core.Name "op")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lhs"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
-                                Core.projectionField = (Core.Name "lhs")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rhs"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
-                                Core.projectionField = (Core.Name "rhs")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.padding"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Padding"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.ws")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.Padding"),
-                                Core.projectionField = (Core.Name "left")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.ws")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.ast.Padding"),
-                                Core.projectionField = (Core.Name "right")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.precedence"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Precedence"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ast.Precedence")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.symbol"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Symbol"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ast.Symbol")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.ast.ws"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.ast.Ws"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "none"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "none"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "space"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "space"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "break"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "break"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "breakAndIndent"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "breakAndIndent"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "string"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "doubleBreak"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "doubleBreak"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.ast"],
-  Module.moduleDescription = (Just "Term encoders for hydra.ast")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.ast"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.associativity"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.ast.Associativity"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "none"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Associativity"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "none"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "left"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Associativity"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "right"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Associativity"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "both"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Associativity"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "both"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.Associativity")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.blockStyle"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.BlockStyle"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "indent"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "literal"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+                                    Core.projectionField = (Core.Name "indent")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "newlineBeforeContent"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "boolean"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+                                    Core.projectionField = (Core.Name "newlineBeforeContent")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "newlineAfterContent"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "boolean"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.BlockStyle"),
+                                    Core.projectionField = (Core.Name "newlineAfterContent")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.BlockStyle")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.bracketExpr"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.BracketExpr"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "brackets"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.brackets")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+                                    Core.projectionField = (Core.Name "brackets")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "enclosed"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+                                    Core.projectionField = (Core.Name "enclosed")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "style"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.blockStyle")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.BracketExpr"),
+                                    Core.projectionField = (Core.Name "style")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.BracketExpr")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.brackets"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Brackets"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "open"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.symbol")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.Brackets"),
+                                    Core.projectionField = (Core.Name "open")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "close"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.symbol")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.Brackets"),
+                                    Core.projectionField = (Core.Name "close")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.Brackets")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.expr"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.ast.Expr"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "const"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "const"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.symbol")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "indent"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "indent"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.indentedExpression")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "op"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "op"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.opExpr")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "brackets"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "brackets"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.bracketExpr")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "seq"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Expr"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "seq"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.seqExpr")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.Expr")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.indentedExpression"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.IndentedExpression"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "style"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.indentStyle")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+                                    Core.projectionField = (Core.Name "style")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expr"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.IndentedExpression"),
+                                    Core.projectionField = (Core.Name "expr")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.IndentedExpression")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.indentStyle"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.ast.IndentStyle"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "allLines"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.IndentStyle"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "allLines"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "string"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "subsequentLines"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.IndentStyle"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subsequentLines"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "string"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.IndentStyle")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.op"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Op"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "symbol"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.symbol")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+                                    Core.projectionField = (Core.Name "symbol")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "padding"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.padding")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+                                    Core.projectionField = (Core.Name "padding")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "precedence"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.precedence")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+                                    Core.projectionField = (Core.Name "precedence")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "associativity"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.associativity")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.Op"),
+                                    Core.projectionField = (Core.Name "associativity")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.Op")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.opExpr"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.OpExpr"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "op"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.op")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+                                    Core.projectionField = (Core.Name "op")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lhs"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+                                    Core.projectionField = (Core.Name "lhs")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rhs"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.OpExpr"),
+                                    Core.projectionField = (Core.Name "rhs")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.OpExpr")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.padding"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Padding"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.ws")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.Padding"),
+                                    Core.projectionField = (Core.Name "left")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.ws")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.Padding"),
+                                    Core.projectionField = (Core.Name "right")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.Padding")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.precedence"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Precedence"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ast.Precedence")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.Precedence")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.seqExpr"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.SeqExpr"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "op"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.op")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.SeqExpr"),
+                                    Core.projectionField = (Core.Name "op")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elements"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.ast.expr"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.ast.SeqExpr"),
+                                    Core.projectionField = (Core.Name "elements")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.SeqExpr")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.symbol"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Symbol"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.ast.Symbol")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.Symbol")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.ast.ws"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.ast.Ws"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "none"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "none"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "space"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "space"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "break"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "break"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "breakAndIndent"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "breakAndIndent"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "string"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "doubleBreak"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.ast.Ws"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "doubleBreak"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.ast.Ws")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.ast"],
+      Module.moduleDescription = (Just "Term encoders for hydra.ast")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Classes.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Classes.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Classes.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Classes.hs
@@ -14,96 +14,102 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.classes"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.classes.typeClass"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.classes.TypeClass"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "equality"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.classes.TypeClass"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equality"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "ordering"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.classes.TypeClass"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "ordering"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.classes"],
-  Module.moduleDescription = (Just "Term encoders for hydra.classes")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.classes"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.classes.typeClass"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.classes.TypeClass"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "equality"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.classes.TypeClass"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equality"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "ordering"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.classes.TypeClass"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "ordering"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.classes.TypeClass")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.classes"],
+      Module.moduleDescription = (Just "Term encoders for hydra.classes")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Coders.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Coders.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Coders.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Coders.hs
@@ -14,217 +14,236 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.coders"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.coders.coderDirection"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "encode"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.CoderDirection"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "encode"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "decode"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.CoderDirection"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "decode"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.coders.languageName"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.LanguageName"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.coders"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.coders.coderDirection"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "encode"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.CoderDirection"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "encode"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "decode"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.CoderDirection"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "decode"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.coders.languageName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.LanguageName"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                             Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.coders.LanguageName")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.coders.traversalOrder"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.coders.TraversalOrder"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "pre"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.TraversalOrder"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pre"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "post"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.TraversalOrder"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "post"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.coders"],
-  Module.moduleDescription = (Just "Term encoders for hydra.coders")}
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.coders.LanguageName")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.coders.LanguageName")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.coders.traversalOrder"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.coders.TraversalOrder"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "pre"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.TraversalOrder"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pre"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "post"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.coders.TraversalOrder"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "post"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.coders.TraversalOrder")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core",
+        (Module.Namespace "hydra.encode.graph"),
+        (Module.Namespace "hydra.encode.util"),
+        (Module.Namespace "hydra.encode.variants")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.coders"],
+      Module.moduleDescription = (Just "Term encoders for hydra.coders")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Compute.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Compute.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Compute.hs
+++ /dev/null
@@ -1,242 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.encode.compute
-
-module Hydra.Sources.Encode.Compute where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.compute"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.compute.flowState"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "s"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "v"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "record"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "typeName"),
-                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.compute.FlowState"))}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "fields"),
-                      Core.fieldTerm = (Core.TermList [
-                        Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "value"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "opt"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "maybe"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                                    Core.projectionField = (Core.Name "value")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                        (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "state"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "s")),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                                    Core.projectionField = (Core.Name "state")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                        (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "trace"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.compute.trace")),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                    Core.projectionTypeName = (Core.Name "hydra.compute.FlowState"),
-                                    Core.projectionField = (Core.Name "trace")})))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.compute.trace"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.compute.Trace"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "stack"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "x"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "literal"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.compute.Trace"),
-                                Core.projectionField = (Core.Name "stack")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "messages"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "x"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "literal"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.compute.Trace"),
-                                Core.projectionField = (Core.Name "messages")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "other"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.compute.Trace"),
-                                Core.projectionField = (Core.Name "other")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.compute"],
-  Module.moduleDescription = (Just "Term encoders for hydra.compute")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Constraints.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Constraints.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Constraints.hs
+++ /dev/null
@@ -1,134 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.encode.constraints
-
-module Hydra.Sources.Encode.Constraints where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.constraints"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.constraints.pathEquation"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.constraints.PathEquation"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.constraints.PathEquation"),
-                                Core.projectionField = (Core.Name "left")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.constraints.PathEquation"),
-                                Core.projectionField = (Core.Name "right")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.constraints.patternImplication"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.constraints.PatternImplication"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "antecedent"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.pattern")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.constraints.PatternImplication"),
-                                Core.projectionField = (Core.Name "antecedent")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "consequent"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.pattern")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.constraints.PatternImplication"),
-                                Core.projectionField = (Core.Name "consequent")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.constraints"],
-  Module.moduleDescription = (Just "Term encoders for hydra.constraints")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Context.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Context.hs
@@ -0,0 +1,229 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.encode.context
+
+module Hydra.Sources.Encode.Context where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.context"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.context.context"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.context.Context"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "trace"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "literal"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+                                    Core.projectionField = (Core.Name "trace")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "messages"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "literal"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+                                    Core.projectionField = (Core.Name "messages")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "other"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "m"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "map"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.context.Context"),
+                                    Core.projectionField = (Core.Name "other")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.context.Context")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.context.inContext"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "e"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.context.InContext"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "object"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "e")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.context.InContext"),
+                                      Core.projectionField = (Core.Name "object")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "context"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.context.context")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.context.InContext"),
+                                      Core.projectionField = (Core.Name "context")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "e"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "e")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.context.InContext")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "e"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.context"],
+      Module.moduleDescription = (Just "Term encoders for hydra.context")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Core.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Core.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Core.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Core.hs
@@ -14,4464 +14,4575 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.core"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.annotatedTerm"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.AnnotatedTerm"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotation"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                                Core.projectionField = (Core.Name "annotation")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.annotatedType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.AnnotatedType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedType"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotation"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedType"),
-                                Core.projectionField = (Core.Name "annotation")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.application"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Application"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Application"),
-                                Core.projectionField = (Core.Name "function")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "argument"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Application"),
-                                Core.projectionField = (Core.Name "argument")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.applicationType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.ApplicationType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.ApplicationType"),
-                                Core.projectionField = (Core.Name "function")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "argument"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.ApplicationType"),
-                                Core.projectionField = (Core.Name "argument")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.binding"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Binding"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
-                                Core.projectionField = (Core.Name "term")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.caseStatement"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.CaseStatement"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
-                                Core.projectionField = (Core.Name "typeName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "default"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
-                                Core.projectionField = (Core.Name "default")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "cases"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.field"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
-                                Core.projectionField = (Core.Name "cases")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.eitherType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.EitherType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.EitherType"),
-                                Core.projectionField = (Core.Name "left")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.EitherType"),
-                                Core.projectionField = (Core.Name "right")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.pairType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.PairType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.PairType"),
-                                Core.projectionField = (Core.Name "first")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "second"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.PairType"),
-                                Core.projectionField = (Core.Name "second")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.elimination"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.Elimination"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Elimination"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.projection")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "union"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Elimination"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.caseStatement")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Elimination"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.field"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Field"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Field"),
-                                Core.projectionField = (Core.Name "term")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.fieldType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FieldType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.FieldType"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.FieldType"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.floatType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.FloatType"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "bigfloat"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigfloat"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "float32"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float32"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "float64"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float64"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.floatValue"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "bigfloat"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigfloat"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "float"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "bigfloat"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "float32"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float32"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "float"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "float32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "float64"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float64"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "float"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "float64"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.forallType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.ForallType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "parameter"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
-                                Core.projectionField = (Core.Name "parameter")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.function"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.Function"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "elimination"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Function"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elimination"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.elimination")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "lambda"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Function"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambda"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.lambda")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "primitive"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Function"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitive"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.functionType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FunctionType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "domain"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.FunctionType"),
-                                Core.projectionField = (Core.Name "domain")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "codomain"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.FunctionType"),
-                                Core.projectionField = (Core.Name "codomain")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.injection"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Injection"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                Core.projectionField = (Core.Name "typeName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "field"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.field")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
-                                Core.projectionField = (Core.Name "field")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.integerType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerType"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "bigint"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigint"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "int8"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int8"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "int16"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int16"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "int32"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int32"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "int64"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int64"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "uint8"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint8"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "uint16"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint16"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "uint32"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint32"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "uint64"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint64"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.integerValue"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "bigint"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigint"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "bigint"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "int8"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int8"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int8"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "int16"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int16"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int16"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "int32"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int32"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "int64"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int64"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int64"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "uint8"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint8"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "uint8"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "uint16"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint16"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "uint16"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "uint32"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint32"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "uint32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "uint64"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint64"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "uint64"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.lambda"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Lambda"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "parameter"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
-                                Core.projectionField = (Core.Name "parameter")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "domain"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
-                                Core.projectionField = (Core.Name "domain")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.let"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Let"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bindings"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.binding"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Let"),
-                                Core.projectionField = (Core.Name "bindings")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Let"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.literal"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "binary"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "binary"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "boolean"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "boolean"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "float"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.floatValue")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "integer"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.integerValue")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "string"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "string"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.literalType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.LiteralType"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "binary"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "boolean"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "float"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.floatType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "integer"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.integerType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "string"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.mapType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.MapType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "keys"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.MapType"),
-                                Core.projectionField = (Core.Name "keys")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "values"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.MapType"),
-                                Core.projectionField = (Core.Name "values")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.name"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Name"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.projection"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Projection"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Projection"),
-                                Core.projectionField = (Core.Name "typeName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "field"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Projection"),
-                                Core.projectionField = (Core.Name "field")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.record"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Record"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Record"),
-                                Core.projectionField = (Core.Name "typeName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fields"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.field"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.Record"),
-                                Core.projectionField = (Core.Name "fields")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.rowType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.RowType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.RowType"),
-                                Core.projectionField = (Core.Name "typeName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fields"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.fieldType"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.RowType"),
-                                Core.projectionField = (Core.Name "fields")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.term"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "annotated"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.annotatedTerm")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "application"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.application")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "either"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "e"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "either"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "function"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.function")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "let"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "let"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "list"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "xs"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "list"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "literal"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.literal")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "map"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "m"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "map"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "maybe"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "opt"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "maybe"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "pair"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "p"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "pair"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.record")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "set"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "s"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "set"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeApplication"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplication"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.typeApplicationTerm")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeLambda"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambda"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.typeLambda")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "union"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.injection")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "unit"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "variable"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.wrappedTerm")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.type"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.core.Type"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "annotated"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.annotatedType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "application"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.applicationType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "either"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.eitherType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "forall"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forall"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.forallType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "function"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.functionType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "list"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "literal"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.literalType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "map"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.mapType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "maybe"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "pair"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.pairType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.rowType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "set"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "union"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.rowType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "unit"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "variable"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.wrappedType")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.typeApplicationTerm"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.TypeApplicationTerm"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.typeLambda"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.TypeLambda"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "parameter"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.TypeLambda"),
-                                Core.projectionField = (Core.Name "parameter")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.TypeLambda"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.typeScheme"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.TypeScheme"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variables"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
-                                Core.projectionField = (Core.Name "variables")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "constraints"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "m"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "map"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeVariableMetadata"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
-                                Core.projectionField = (Core.Name "constraints")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.typeVariableMetadata"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.TypeVariableMetadata"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "classes"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "s"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "set"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
-                                Core.projectionField = (Core.Name "classes")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.wrappedTerm"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.WrappedTerm"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                Core.projectionField = (Core.Name "typeName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.core.wrappedType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.WrappedType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.WrappedType"),
-                                Core.projectionField = (Core.Name "typeName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.core.WrappedType"),
-                                Core.projectionField = (Core.Name "body")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.core"],
-  Module.moduleDescription = (Just "Term encoders for hydra.core")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.core"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.annotatedTerm"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.AnnotatedTerm"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                    Core.projectionField = (Core.Name "body")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotation"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "m"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "map"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                    Core.projectionField = (Core.Name "annotation")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedTerm")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.annotatedType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.AnnotatedType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedType"),
+                                    Core.projectionField = (Core.Name "body")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotation"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "m"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "map"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.AnnotatedType"),
+                                    Core.projectionField = (Core.Name "annotation")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.AnnotatedType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.application"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Application"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Application"),
+                                    Core.projectionField = (Core.Name "function")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "argument"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Application"),
+                                    Core.projectionField = (Core.Name "argument")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Application")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.applicationType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.ApplicationType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.ApplicationType"),
+                                    Core.projectionField = (Core.Name "function")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "argument"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.ApplicationType"),
+                                    Core.projectionField = (Core.Name "argument")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.ApplicationType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.binding"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Binding"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+                                    Core.projectionField = (Core.Name "term")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Binding"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Binding")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.caseStatement"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.CaseStatement"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "default"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+                                    Core.projectionField = (Core.Name "default")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "cases"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.field"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.CaseStatement"),
+                                    Core.projectionField = (Core.Name "cases")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.CaseStatement")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.eitherType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.EitherType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.EitherType"),
+                                    Core.projectionField = (Core.Name "left")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.EitherType"),
+                                    Core.projectionField = (Core.Name "right")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.EitherType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.pairType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.PairType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.PairType"),
+                                    Core.projectionField = (Core.Name "first")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "second"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.PairType"),
+                                    Core.projectionField = (Core.Name "second")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.PairType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.elimination"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.Elimination"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Elimination"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.projection")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "union"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Elimination"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.caseStatement")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Elimination"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Elimination")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.field"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Field"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Field"),
+                                    Core.projectionField = (Core.Name "term")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Field")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.fieldType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FieldType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.FieldType"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.FieldType"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.FieldType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.floatType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.FloatType"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "bigfloat"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigfloat"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "float32"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float32"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "float64"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float64"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.FloatType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.floatValue"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.FloatValue"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "bigfloat"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigfloat"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "float"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "bigfloat"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "float32"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float32"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "float"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "float32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "float64"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FloatValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float64"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "float"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "float64"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.FloatValue")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.forallType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.ForallType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "parameter"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
+                                    Core.projectionField = (Core.Name "parameter")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
+                                    Core.projectionField = (Core.Name "body")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.ForallType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.function"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.Function"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "elimination"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Function"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elimination"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.elimination")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "lambda"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Function"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambda"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.lambda")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "primitive"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Function"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitive"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Function")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.functionType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.FunctionType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "domain"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.FunctionType"),
+                                    Core.projectionField = (Core.Name "domain")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "codomain"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.FunctionType"),
+                                    Core.projectionField = (Core.Name "codomain")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.FunctionType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.injection"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Injection"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "field"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.field")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Injection"),
+                                    Core.projectionField = (Core.Name "field")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Injection")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.integerType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerType"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "bigint"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigint"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "int8"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int8"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "int16"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int16"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "int32"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int32"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "int64"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int64"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "uint8"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint8"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "uint16"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint16"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "uint32"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint32"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "uint64"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint64"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.IntegerType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.integerValue"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.IntegerValue"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "bigint"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bigint"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "bigint"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "int8"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int8"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int8"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "int16"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int16"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int16"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "int32"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int32"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "int64"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "int64"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int64"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "uint8"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint8"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "uint8"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "uint16"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint16"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "uint16"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "uint32"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint32"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "uint32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "uint64"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.IntegerValue"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "uint64"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "uint64"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.IntegerValue")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.lambda"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Lambda"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "parameter"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+                                    Core.projectionField = (Core.Name "parameter")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "domain"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+                                    Core.projectionField = (Core.Name "domain")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Lambda"),
+                                    Core.projectionField = (Core.Name "body")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Lambda")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.let"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Let"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bindings"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.binding"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Let"),
+                                    Core.projectionField = (Core.Name "bindings")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Let"),
+                                    Core.projectionField = (Core.Name "body")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Let")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.literal"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.Literal"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "binary"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "binary"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "boolean"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "boolean"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "float"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.floatValue")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "integer"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.integerValue")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "string"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Literal"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "string"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Literal")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.literalType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.LiteralType"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "binary"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "boolean"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "float"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.floatType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "integer"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.integerType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "string"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.LiteralType"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.LiteralType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.mapType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.MapType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "keys"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.MapType"),
+                                    Core.projectionField = (Core.Name "keys")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "values"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.MapType"),
+                                    Core.projectionField = (Core.Name "values")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.MapType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.name"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Name"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.core.Name")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.projection"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Projection"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Projection"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "field"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Projection"),
+                                    Core.projectionField = (Core.Name "field")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Projection")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.record"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Record"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Record"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fields"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.field"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.Record"),
+                                    Core.projectionField = (Core.Name "fields")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Record")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.term"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.Term"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "annotated"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.annotatedTerm")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "application"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.application")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "either"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "e"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "either"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "function"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.function")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "let"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "let"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "list"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "xs"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "list"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "literal"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.literal")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "map"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "m"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "map"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "maybe"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "opt"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "maybe"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "pair"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "p"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "pair"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.record")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "set"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "s"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "set"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeApplication"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplication"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.typeApplicationTerm")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeLambda"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambda"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.typeLambda")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "union"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.injection")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unit"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "variable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Term"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.wrappedTerm")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Term")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.type"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.core.Type"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "annotated"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.annotatedType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "application"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.applicationType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "either"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.eitherType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "forall"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forall"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.forallType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "function"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.functionType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "list"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "literal"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.literalType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "map"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.mapType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "maybe"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "pair"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.pairType")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "xs"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "list"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.fieldType"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "set"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "union"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "xs"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "list"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.fieldType"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unit"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "variable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "void"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "void"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.Type"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.typeApplicationTerm"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.TypeApplicationTerm"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+                                    Core.projectionField = (Core.Name "body")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.TypeApplicationTerm"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.TypeApplicationTerm")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.typeLambda"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.TypeLambda"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "parameter"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.TypeLambda"),
+                                    Core.projectionField = (Core.Name "parameter")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.TypeLambda"),
+                                    Core.projectionField = (Core.Name "body")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.TypeLambda")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.typeScheme"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.TypeScheme"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variables"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+                                    Core.projectionField = (Core.Name "variables")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "constraints"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "m"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "map"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeVariableMetadata"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.TypeScheme"),
+                                    Core.projectionField = (Core.Name "constraints")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.TypeScheme")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.typeVariableMetadata"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.TypeVariableMetadata"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "classes"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "s"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "set"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.TypeVariableMetadata"),
+                                    Core.projectionField = (Core.Name "classes")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.TypeVariableMetadata")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.core.wrappedTerm"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.core.WrappedTerm"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                                    Core.projectionField = (Core.Name "body")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.WrappedTerm")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.core"],
+      Module.moduleDescription = (Just "Term encoders for hydra.core")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Error/Checking.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Error/Checking.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Error/Checking.hs
@@ -0,0 +1,976 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.encode.error.checking
+
+module Hydra.Sources.Encode.Error.Checking where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.error.checking"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.checkingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.error.checking.CheckingError"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "incorrectUnification"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "incorrectUnification"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.incorrectUnificationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "notAForallType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "notAForallType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.notAForallTypeError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "notAFunctionType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "notAFunctionType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.notAFunctionTypeError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeArityMismatch"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeArityMismatch"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.typeArityMismatchError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeMismatch"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeMismatch"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.typeMismatchError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unboundTypeVariables"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unboundTypeVariables"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.unboundTypeVariablesError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unequalTypes"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unequalTypes"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.unequalTypesError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unsupportedTermVariant"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unsupportedTermVariant"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.unsupportedTermVariantError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "untypedLambda"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "untypedLambda"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.untypedLambdaError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "untypedLetBinding"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.CheckingError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "untypedLetBinding"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.untypedLetBindingError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.CheckingError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.incorrectUnificationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.IncorrectUnificationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "substitution"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.typing.typeSubst")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.IncorrectUnificationError"),
+                                    Core.projectionField = (Core.Name "substitution")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.IncorrectUnificationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.notAForallTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.NotAForallTypeError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeArguments"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.NotAForallTypeError"),
+                                    Core.projectionField = (Core.Name "typeArguments")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.NotAForallTypeError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.notAFunctionTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.NotAFunctionTypeError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.NotAFunctionTypeError"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.NotAFunctionTypeError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.typeArityMismatchError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.TypeArityMismatchError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expectedArity"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "integer"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "int32"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+                                    Core.projectionField = (Core.Name "expectedArity")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "actualArity"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "integer"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "int32"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+                                    Core.projectionField = (Core.Name "actualArity")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeArguments"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeArityMismatchError"),
+                                    Core.projectionField = (Core.Name "typeArguments")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.TypeArityMismatchError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.typeMismatchError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.TypeMismatchError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expectedType"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+                                    Core.projectionField = (Core.Name "expectedType")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "actualType"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.TypeMismatchError"),
+                                    Core.projectionField = (Core.Name "actualType")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.TypeMismatchError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.unboundTypeVariablesError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.UnboundTypeVariablesError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variables"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "s"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "set"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+                                    Core.projectionField = (Core.Name "variables")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.UnboundTypeVariablesError"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.UnboundTypeVariablesError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.unequalTypesError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.UnequalTypesError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "types"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+                                    Core.projectionField = (Core.Name "types")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.UnequalTypesError"),
+                                    Core.projectionField = (Core.Name "description")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.UnequalTypesError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.unsupportedTermVariantError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.UnsupportedTermVariantError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "termVariant"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.variants.termVariant")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.UnsupportedTermVariantError"),
+                                    Core.projectionField = (Core.Name "termVariant")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.UnsupportedTermVariantError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.untypedLambdaError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.UntypedLambdaError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.UntypedLambdaError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.checking.untypedLetBindingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.checking.UntypedLetBindingError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binding"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.binding")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.checking.UntypedLetBindingError"),
+                                    Core.projectionField = (Core.Name "binding")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.checking.UntypedLetBindingError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core",
+        (Module.Namespace "hydra.encode.typing"),
+        (Module.Namespace "hydra.encode.variants")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.error.checking"],
+      Module.moduleDescription = (Just "Term encoders for hydra.error.checking")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Error/Core.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Error/Core.hs
@@ -0,0 +1,3384 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.encode.error.core
+
+module Hydra.Sources.Encode.Error.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.error.core"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.duplicateBindingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.DuplicateBindingError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateBindingError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateBindingError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.duplicateFieldError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.DuplicateFieldError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateFieldError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateFieldError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.undefinedFieldError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UndefinedFieldError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fieldName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+                                    Core.projectionField = (Core.Name "fieldName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedFieldError"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedFieldError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.unexpectedTermVariantError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UnexpectedTermVariantError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expectedVariant"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.variants.termVariant")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+                                    Core.projectionField = (Core.Name "expectedVariant")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "actualTerm"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTermVariantError"),
+                                    Core.projectionField = (Core.Name "actualTerm")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UnexpectedTermVariantError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.unexpectedTypeVariantError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UnexpectedTypeVariantError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expectedVariant"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.variants.typeVariant")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+                                    Core.projectionField = (Core.Name "expectedVariant")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "actualType"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UnexpectedTypeVariantError"),
+                                    Core.projectionField = (Core.Name "actualType")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UnexpectedTypeVariantError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.constantConditionError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.ConstantConditionError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "value"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "boolean"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.ConstantConditionError"),
+                                    Core.projectionField = (Core.Name "value")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.ConstantConditionError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.emptyCaseStatementError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.EmptyCaseStatementError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyCaseStatementError"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyCaseStatementError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.emptyLetBindingsError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.EmptyLetBindingsError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyLetBindingsError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyLetBindingsError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.emptyTermAnnotationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.EmptyTermAnnotationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyTermAnnotationError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyTermAnnotationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.emptyTypeNameInTermError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.EmptyTypeNameInTermError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyTypeNameInTermError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyTypeNameInTermError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.invalidLambdaParameterNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidLambdaParameterNameError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLambdaParameterNameError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidLambdaParameterNameError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.invalidLetBindingNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidLetBindingNameError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidLetBindingNameError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidLetBindingNameError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.invalidTypeLambdaParameterNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeLambdaParameterNameError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidTypeLambdaParameterNameError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.nestedTermAnnotationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.NestedTermAnnotationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.NestedTermAnnotationError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.NestedTermAnnotationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.redundantWrapUnwrapError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.RedundantWrapUnwrapError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.RedundantWrapUnwrapError"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.RedundantWrapUnwrapError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.selfApplicationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.SelfApplicationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.SelfApplicationError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.SelfApplicationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.termVariableShadowingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.TermVariableShadowingError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.TermVariableShadowingError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.TermVariableShadowingError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.typeVariableShadowingInTypeLambdaError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.TypeVariableShadowingInTypeLambdaError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.TypeVariableShadowingInTypeLambdaError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.undefinedTermVariableError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UndefinedTermVariableError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTermVariableError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTermVariableError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.undefinedTypeVariableInBindingTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UndefinedTypeVariableInBindingTypeError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTypeVariableInBindingTypeError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.undefinedTypeVariableInLambdaDomainError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTypeVariableInLambdaDomainError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.undefinedTypeVariableInTypeApplicationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTypeVariableInTypeApplicationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.unknownPrimitiveNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UnknownPrimitiveNameError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UnknownPrimitiveNameError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UnknownPrimitiveNameError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.unnecessaryIdentityApplicationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UnnecessaryIdentityApplicationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UnnecessaryIdentityApplicationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.untypedTermVariableError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UntypedTermVariableError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UntypedTermVariableError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UntypedTermVariableError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.invalidTermError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.error.core.InvalidTermError"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "constantCondition"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "constantCondition"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.constantConditionError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "duplicateBinding"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateBinding"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.duplicateBindingError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "duplicateField"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateField"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.duplicateFieldError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "emptyCaseStatement"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyCaseStatement"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.emptyCaseStatementError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "emptyLetBindings"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyLetBindings"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.emptyLetBindingsError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "emptyTermAnnotation"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyTermAnnotation"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.emptyTermAnnotationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "emptyTypeNameInTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyTypeNameInTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.emptyTypeNameInTermError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "invalidLambdaParameterName"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidLambdaParameterName"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.invalidLambdaParameterNameError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "invalidLetBindingName"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidLetBindingName"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.invalidLetBindingNameError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "invalidTypeLambdaParameterName"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidTypeLambdaParameterName"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.invalidTypeLambdaParameterNameError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "nestedTermAnnotation"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nestedTermAnnotation"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.nestedTermAnnotationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "redundantWrapUnwrap"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "redundantWrapUnwrap"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.redundantWrapUnwrapError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "selfApplication"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "selfApplication"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.selfApplicationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "termVariableShadowing"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "termVariableShadowing"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.termVariableShadowingError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeVariableShadowingInTypeLambda"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeVariableShadowingInTypeLambda"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.typeVariableShadowingInTypeLambdaError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "undefinedTermVariable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTermVariable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.undefinedTermVariableError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "undefinedTypeVariableInBindingType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTypeVariableInBindingType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.undefinedTypeVariableInBindingTypeError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "undefinedTypeVariableInLambdaDomain"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTypeVariableInLambdaDomain"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.undefinedTypeVariableInLambdaDomainError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "undefinedTypeVariableInTypeApplication"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTypeVariableInTypeApplication"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.undefinedTypeVariableInTypeApplicationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unknownPrimitiveName"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unknownPrimitiveName"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.unknownPrimitiveNameError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unnecessaryIdentityApplication"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unnecessaryIdentityApplication"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.unnecessaryIdentityApplicationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "untypedTermVariable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTermError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "untypedTermVariable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.untypedTermVariableError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidTermError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.duplicateRecordTypeFieldNamesError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.DuplicateRecordTypeFieldNamesError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateRecordTypeFieldNamesError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.duplicateUnionTypeFieldNamesError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.DuplicateUnionTypeFieldNamesError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.DuplicateUnionTypeFieldNamesError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.emptyRecordTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.EmptyRecordTypeError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyRecordTypeError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyRecordTypeError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.emptyTypeAnnotationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.EmptyTypeAnnotationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyTypeAnnotationError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyTypeAnnotationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.emptyUnionTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.EmptyUnionTypeError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.EmptyUnionTypeError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.EmptyUnionTypeError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.invalidForallParameterNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidForallParameterNameError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidForallParameterNameError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidForallParameterNameError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.invalidTypeSchemeVariableNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeSchemeVariableNameError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidTypeSchemeVariableNameError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.nestedTypeAnnotationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.NestedTypeAnnotationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.NestedTypeAnnotationError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.NestedTypeAnnotationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.nonComparableMapKeyTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.NonComparableMapKeyTypeError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "keyType"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableMapKeyTypeError"),
+                                    Core.projectionField = (Core.Name "keyType")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.NonComparableMapKeyTypeError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.nonComparableSetElementTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.NonComparableSetElementTypeError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elementType"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.NonComparableSetElementTypeError"),
+                                    Core.projectionField = (Core.Name "elementType")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.NonComparableSetElementTypeError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.singleVariantUnionError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.SingleVariantUnionError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fieldName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.SingleVariantUnionError"),
+                                    Core.projectionField = (Core.Name "fieldName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.SingleVariantUnionError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.typeVariableShadowingInForallError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.TypeVariableShadowingInForallError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.TypeVariableShadowingInForallError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.TypeVariableShadowingInForallError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.undefinedTypeVariableError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.UndefinedTypeVariableError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.UndefinedTypeVariableError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.UndefinedTypeVariableError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.voidInNonBottomPositionError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.VoidInNonBottomPositionError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "location"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.core.VoidInNonBottomPositionError"),
+                                    Core.projectionField = (Core.Name "location")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.VoidInNonBottomPositionError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.core.invalidTypeError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.error.core.InvalidTypeError"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "duplicateRecordTypeFieldNames"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateRecordTypeFieldNames"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.duplicateRecordTypeFieldNamesError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "duplicateUnionTypeFieldNames"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateUnionTypeFieldNames"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.duplicateUnionTypeFieldNamesError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "emptyRecordType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyRecordType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.emptyRecordTypeError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "emptyTypeAnnotation"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyTypeAnnotation"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.emptyTypeAnnotationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "emptyUnionType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "emptyUnionType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.emptyUnionTypeError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "invalidForallParameterName"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidForallParameterName"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.invalidForallParameterNameError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "invalidTypeSchemeVariableName"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidTypeSchemeVariableName"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.invalidTypeSchemeVariableNameError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "nestedTypeAnnotation"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nestedTypeAnnotation"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.nestedTypeAnnotationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "nonComparableMapKeyType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nonComparableMapKeyType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.nonComparableMapKeyTypeError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "nonComparableSetElementType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nonComparableSetElementType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.nonComparableSetElementTypeError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "singleVariantUnion"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "singleVariantUnion"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.singleVariantUnionError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeVariableShadowingInForall"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeVariableShadowingInForall"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.typeVariableShadowingInForallError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "undefinedTypeVariable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTypeVariable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.undefinedTypeVariableError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "voidInNonBottomPosition"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.core.InvalidTypeError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "voidInNonBottomPosition"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.voidInNonBottomPositionError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.core.InvalidTypeError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.paths",
+        (Module.Namespace "hydra.encode.core"),
+        (Module.Namespace "hydra.encode.variants")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.error.core"],
+      Module.moduleDescription = (Just "Term encoders for hydra.error.core")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Error/Packaging.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Error/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Error/Packaging.hs
@@ -0,0 +1,559 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.encode.error.packaging
+
+module Hydra.Sources.Encode.Error.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.error.packaging"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.packaging.conflictingModuleNamespaceError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.ConflictingModuleNamespaceError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.namespace")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+                                    Core.projectionField = (Core.Name "first")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "second"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.namespace")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError"),
+                                    Core.projectionField = (Core.Name "second")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.packaging.ConflictingModuleNamespaceError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.packaging.conflictingVariantNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.ConflictingVariantNameError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "namespace"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.namespace")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+                                    Core.projectionField = (Core.Name "namespace")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+                                    Core.projectionField = (Core.Name "typeName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variantName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+                                    Core.projectionField = (Core.Name "variantName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conflictingName"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.ConflictingVariantNameError"),
+                                    Core.projectionField = (Core.Name "conflictingName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.packaging.ConflictingVariantNameError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.packaging.definitionNotInModuleNamespaceError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.DefinitionNotInModuleNamespaceError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "namespace"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.namespace")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+                                    Core.projectionField = (Core.Name "namespace")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.packaging.DefinitionNotInModuleNamespaceError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.packaging.duplicateDefinitionNameError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.DuplicateDefinitionNameError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "namespace"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.namespace")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+                                    Core.projectionField = (Core.Name "namespace")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.packaging.DuplicateDefinitionNameError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.packaging.duplicateModuleNamespaceError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.DuplicateModuleNamespaceError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "namespace"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.namespace")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.error.packaging.DuplicateModuleNamespaceError"),
+                                    Core.projectionField = (Core.Name "namespace")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.packaging.DuplicateModuleNamespaceError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.packaging.invalidModuleError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.error.packaging.InvalidModuleError"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "conflictingVariantName"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.InvalidModuleError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conflictingVariantName"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.packaging.conflictingVariantNameError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "definitionNotInModuleNamespace"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.InvalidModuleError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "definitionNotInModuleNamespace"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.packaging.definitionNotInModuleNamespaceError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "duplicateDefinitionName"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.InvalidModuleError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateDefinitionName"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.packaging.duplicateDefinitionNameError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.packaging.InvalidModuleError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.error.packaging.invalidPackageError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.error.packaging.InvalidPackageError"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "conflictingModuleNamespace"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.InvalidPackageError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conflictingModuleNamespace"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.packaging.conflictingModuleNamespaceError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "duplicateModuleNamespace"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.InvalidPackageError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateModuleNamespace"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.packaging.duplicateModuleNamespaceError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "invalidModule"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.error.packaging.InvalidPackageError"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "invalidModule"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.packaging.invalidModuleError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.error.packaging.InvalidPackageError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core",
+        (Module.Namespace "hydra.encode.module")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.error.packaging"],
+      Module.moduleDescription = (Just "Term encoders for hydra.error.packaging")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Errors.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Errors.hs
@@ -0,0 +1,564 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.encode.errors
+
+module Hydra.Sources.Encode.Errors where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.errors"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.errors.decodingError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.DecodingError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.errors.DecodingError")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.errors.DecodingError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.errors.error"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.errors.Error"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "checking"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "checking"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.checking.checkingError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "decoding"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "decoding"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.errors.decodingError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "duplicateBinding"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateBinding"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.duplicateBindingError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "duplicateField"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "duplicateField"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.duplicateFieldError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "other"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "other"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.errors.otherError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "undefinedField"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedField"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.undefinedFieldError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "undefinedTermVariable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "undefinedTermVariable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.undefinedTermVariableError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "untypedTermVariable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "untypedTermVariable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.untypedTermVariableError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unexpectedTermVariant"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unexpectedTermVariant"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.unexpectedTermVariantError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unexpectedTypeVariant"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unexpectedTypeVariant"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.error.core.unexpectedTypeVariantError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unification"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.Error"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unification"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.errors.unificationError")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.errors.Error")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.errors.otherError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.OtherError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.errors.OtherError")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.errors.OtherError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.errors.unificationError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.errors.UnificationError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "leftType"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+                                    Core.projectionField = (Core.Name "leftType")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rightType"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+                                    Core.projectionField = (Core.Name "rightType")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "message"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.errors.UnificationError"),
+                                    Core.projectionField = (Core.Name "message")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.errors.UnificationError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.context",
+        (Module.Namespace "hydra.encode.core"),
+        (Module.Namespace "hydra.encode.error.checking"),
+        (Module.Namespace "hydra.encode.error.core"),
+        (Module.Namespace "hydra.encode.typing"),
+        (Module.Namespace "hydra.encode.variants")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.errors"],
+      Module.moduleDescription = (Just "Term encoders for hydra.errors")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Grammar.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Grammar.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Grammar.hs
+++ /dev/null
@@ -1,702 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.encode.grammar
-
-module Hydra.Sources.Encode.Grammar where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.grammar"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.grammar.constant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Constant"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.grammar.Constant")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.grammar.grammar"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Grammar"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "xs"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "list"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.grammar.production"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.grammar.Grammar")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.grammar.label"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Label"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.grammar.Label")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.grammar.labeledPattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.LabeledPattern"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "label"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.label")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.grammar.LabeledPattern"),
-                                Core.projectionField = (Core.Name "label")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pattern"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.pattern")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.grammar.LabeledPattern"),
-                                Core.projectionField = (Core.Name "pattern")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.grammar.pattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.grammar.Pattern"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "alternatives"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "alternatives"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "xs"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "list"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.grammar.pattern"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "constant"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "constant"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.constant")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "ignored"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "ignored"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.pattern")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "labeled"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "labeled"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.labeledPattern")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "nil"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nil"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "nonterminal"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nonterminal"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.symbol")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "option"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "option"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.pattern")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "plus"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "plus"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.pattern")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "regex"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "regex"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.regex")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "sequence"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sequence"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "xs"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "list"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.grammar.pattern"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "star"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "star"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.pattern")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.grammar.production"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Production"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "symbol"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.symbol")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.grammar.Production"),
-                                Core.projectionField = (Core.Name "symbol")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pattern"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.grammar.pattern")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.grammar.Production"),
-                                Core.projectionField = (Core.Name "pattern")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.grammar.regex"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Regex"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.grammar.Regex")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.grammar.symbol"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.grammar.Symbol"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.grammar.Symbol")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.grammar"],
-  Module.moduleDescription = (Just "Term encoders for hydra.grammar")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Json/Model.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Json/Model.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Json/Model.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Json/Model.hs
@@ -14,289 +14,295 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.json.model"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.json.model.value"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.json.model.Value"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "array"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "array"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "xs"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "list"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "boolean"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.json.model"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.json.model.value"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.json.model.Value"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "array"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "array"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "xs"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                         Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "boolean"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "null"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "null"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "number"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "number"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                          Core.fieldName = (Core.Name "list"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "boolean"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                         Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "float"),
+                                          Core.fieldName = (Core.Name "literal"),
                                           Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
                                             Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "bigfloat"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "object"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "object"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "m"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "map"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                              Core.lambdaParameter = (Core.Name "x"),
-                                              Core.lambdaDomain = Nothing,
-                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.fieldName = (Core.Name "boolean"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "null"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "null"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "number"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "number"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "float"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.FloatValue"),
                                                 Core.injectionField = Core.Field {
-                                                  Core.fieldName = (Core.Name "literal"),
-                                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.fieldName = (Core.Name "bigfloat"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "object"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "object"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "m"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "map"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                  Core.lambdaParameter = (Core.Name "x"),
+                                                  Core.lambdaDomain = Nothing,
+                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                                     Core.injectionField = Core.Field {
-                                                      Core.fieldName = (Core.Name "string"),
-                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "string"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                      Core.fieldName = (Core.Name "literal"),
+                                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                        Core.injectionField = Core.Field {
+                                                          Core.fieldName = (Core.Name "string"),
+                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "string"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.json.model.Value"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                         Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "string"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.json.model"],
-  Module.moduleDescription = (Just "Term encoders for hydra.json.model")}
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "string"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.json.model.Value")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.json.model"],
+      Module.moduleDescription = (Just "Term encoders for hydra.json.model")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Module.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Module.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Module.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Module.hs
@@ -14,603 +14,663 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.module"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.module.definition"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.module.Definition"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "term"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Definition"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.termDefinition")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "type"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Definition"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.typeDefinition")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.module.fileExtension"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.FileExtension"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.module.FileExtension")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.module.module"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Module"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "namespace"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.namespace")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.Module"),
-                                Core.projectionField = (Core.Name "namespace")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elements"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.binding"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.Module"),
-                                Core.projectionField = (Core.Name "elements")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "termDependencies"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.Module"),
-                                Core.projectionField = (Core.Name "termDependencies")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeDependencies"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.Module"),
-                                Core.projectionField = (Core.Name "typeDependencies")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "x"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "literal"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.Module"),
-                                Core.projectionField = (Core.Name "description")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.module.namespace"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Namespace"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.module.Namespace")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.module.namespaces"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "n"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Namespaces"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "focus"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "p"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "pair"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.module.Namespaces"),
-                                  Core.projectionField = (Core.Name "focus")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapping"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "m"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "map"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.module.Namespaces"),
-                                  Core.projectionField = (Core.Name "mapping")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.module.qualifiedName"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.QualifiedName"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "namespace"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.QualifiedName"),
-                                Core.projectionField = (Core.Name "namespace")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "local"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.QualifiedName"),
-                                Core.projectionField = (Core.Name "local")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.module.termDefinition"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.TermDefinition"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
-                                Core.projectionField = (Core.Name "term")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.module.typeDefinition"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.TypeDefinition"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.TypeDefinition"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.module.TypeDefinition"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.module"],
-  Module.moduleDescription = (Just "Term encoders for hydra.module")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.module"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.module.definition"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.module.Definition"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "term"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Definition"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.termDefinition")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "type"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Definition"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.typeDefinition")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.module.Definition")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.module.fileExtension"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.FileExtension"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.module.FileExtension")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.module.FileExtension")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.module.module"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Module"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "namespace"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.module.namespace")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+                                    Core.projectionField = (Core.Name "namespace")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "definitions"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.definition"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+                                    Core.projectionField = (Core.Name "definitions")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "termDependencies"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+                                    Core.projectionField = (Core.Name "termDependencies")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeDependencies"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+                                    Core.projectionField = (Core.Name "typeDependencies")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "literal"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.Module"),
+                                    Core.projectionField = (Core.Name "description")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.module.Module")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.module.namespace"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Namespace"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.module.Namespace")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.module.Namespace")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.module.namespaces"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "n"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.Namespaces"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "focus"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "p"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "pair"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.module.Namespaces"),
+                                      Core.projectionField = (Core.Name "focus")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapping"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "m"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "map"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.module.Namespaces"),
+                                      Core.projectionField = (Core.Name "mapping")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "n"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "n")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.module.Namespaces")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "n"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.module.qualifiedName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.QualifiedName"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "namespace"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.namespace"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.QualifiedName"),
+                                    Core.projectionField = (Core.Name "namespace")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "local"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.QualifiedName"),
+                                    Core.projectionField = (Core.Name "local")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.module.QualifiedName")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.module.termDefinition"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.TermDefinition"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+                                    Core.projectionField = (Core.Name "term")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.TermDefinition"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.module.TermDefinition")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.module.typeDefinition"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.module.TypeDefinition"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.TypeDefinition"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.module.TypeDefinition"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.module.TypeDefinition")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core",
+        (Module.Namespace "hydra.encode.graph")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.module"],
+      Module.moduleDescription = (Just "Term encoders for hydra.module")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Packaging.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Packaging.hs
@@ -0,0 +1,204 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.encode.packaging
+
+module Hydra.Sources.Encode.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.packaging"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.packaging.package"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.packaging.Package"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.packaging.packageName")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "modules"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.module"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+                                    Core.projectionField = (Core.Name "modules")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "dependencies"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.packaging.packageName"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+                                    Core.projectionField = (Core.Name "dependencies")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "literal"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.packaging.Package"),
+                                    Core.projectionField = (Core.Name "description")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.packaging.Package")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.packaging.packageName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.packaging.PackageName"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.packaging.PackageName")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.packaging.PackageName")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.module"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.packaging"],
+      Module.moduleDescription = (Just "Term encoders for hydra.packaging")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Parsing.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Parsing.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Parsing.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Parsing.hs
@@ -14,233 +14,263 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.parsing"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.parsing.parseError"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.parsing.ParseError"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "message"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.parsing"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.parsing.parseError"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.parsing.ParseError"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "message"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                     Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.parsing.ParseError"),
-                                Core.projectionField = (Core.Name "message")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "remainder"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.parsing.ParseError"),
+                                    Core.projectionField = (Core.Name "message")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "remainder"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                     Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.parsing.ParseError"),
-                                Core.projectionField = (Core.Name "remainder")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.parsing.parseResult"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = (Core.Name "hydra.parsing.ParseResult"),
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "success"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "union"),
-                    Core.fieldTerm = (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "typeName"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.parsing.ParseResult"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "field"),
-                          Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.parsing.ParseError"),
+                                    Core.projectionField = (Core.Name "remainder")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.parsing.ParseError")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.parsing.parseResult"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = (Core.Name "hydra.parsing.ParseResult"),
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "success"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "union"),
+                        Core.fieldTerm = (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "typeName"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.parsing.ParseResult"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "field"),
+                              Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                                Core.recordFields = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "name"),
+                                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "success"))}))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "term"),
+                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.parsing.parseSuccess")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "failure"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "union"),
+                        Core.fieldTerm = (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "typeName"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.parsing.ParseResult"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "field"),
+                              Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                                Core.recordFields = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "name"),
+                                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "failure"))}))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "term"),
+                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.parsing.parseError")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]}))))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.parsing.ParseResult")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.parsing.parseSuccess"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.parsing.ParseSuccess"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
                             Core.recordTypeName = (Core.Name "hydra.core.Field"),
                             Core.recordFields = [
                               Core.Field {
                                 Core.fieldName = (Core.Name "name"),
                                 Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
                                   Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "success"))}))},
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "value"))}))},
                               Core.Field {
                                 Core.fieldName = (Core.Name "term"),
                                 Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.parsing.parseSuccess")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "failure"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "union"),
-                    Core.fieldTerm = (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "typeName"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.parsing.ParseResult"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "field"),
-                          Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+                                      Core.projectionField = (Core.Name "value")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
                             Core.recordTypeName = (Core.Name "hydra.core.Field"),
                             Core.recordFields = [
                               Core.Field {
                                 Core.fieldName = (Core.Name "name"),
                                 Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
                                   Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "failure"))}))},
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "remainder"))}))},
                               Core.Field {
                                 Core.fieldName = (Core.Name "term"),
                                 Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.parsing.parseError")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]}))))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.parsing.parseSuccess"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.parsing.ParseSuccess"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "value"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
-                                  Core.projectionField = (Core.Name "value")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "remainder"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "x"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "literal"),
-                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "x"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                       Core.injectionField = Core.Field {
-                                        Core.fieldName = (Core.Name "string"),
-                                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
-                                  Core.projectionField = (Core.Name "remainder")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.parsing"],
-  Module.moduleDescription = (Just "Term encoders for hydra.parsing")}
+                                        Core.fieldName = (Core.Name "literal"),
+                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                          Core.injectionField = Core.Field {
+                                            Core.fieldName = (Core.Name "string"),
+                                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.parsing.ParseSuccess"),
+                                      Core.projectionField = (Core.Name "remainder")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.parsing.ParseSuccess")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.parsing"],
+      Module.moduleDescription = (Just "Term encoders for hydra.parsing")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Paths.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Paths.hs
@@ -0,0 +1,2134 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Source module for hydra.encode.paths
+
+module Hydra.Sources.Encode.Paths where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Module as Module
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+module_ :: Module.Module
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.paths"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtermEdge"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermEdge"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "source"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermNode")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+                                    Core.projectionField = (Core.Name "source")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "path"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermPath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+                                    Core.projectionField = (Core.Name "path")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "target"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermNode")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtermEdge"),
+                                    Core.projectionField = (Core.Name "target")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtermEdge")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtermGraph"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermGraph"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nodes"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermNode"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+                                    Core.projectionField = (Core.Name "nodes")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "edges"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermEdge"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtermGraph"),
+                                    Core.projectionField = (Core.Name "edges")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtermGraph")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtermNode"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermNode"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "label"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+                                    Core.projectionField = (Core.Name "label")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "id"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtermNode"),
+                                    Core.projectionField = (Core.Name "id")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtermNode")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtermPath"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermPath"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "xs"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "list"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.paths.subtermStep"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.paths.SubtermPath")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtermPath")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtermStep"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.paths.SubtermStep"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "annotatedBody"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotatedBody"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "applicationFunction"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationFunction"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "applicationArgument"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationArgument"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "lambdaBody"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambdaBody"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unionCasesDefault"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionCasesDefault"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unionCasesBranch"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionCasesBranch"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "letBody"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letBody"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "letBinding"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letBinding"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "listElement"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "listElement"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "mapKey"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapKey"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "mapValue"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapValue"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "maybeTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybeTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "productTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "productTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "recordField"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "recordField"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "setElement"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "setElement"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "sumTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sumTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeLambdaBody"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambdaBody"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeApplicationTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplicationTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "injectionTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "injectionTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wrappedTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtermStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrappedTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtermStep")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtypeEdge"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeEdge"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "source"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtypeNode")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+                                    Core.projectionField = (Core.Name "source")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "path"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtypePath")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+                                    Core.projectionField = (Core.Name "path")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "target"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.paths.subtypeNode")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeEdge"),
+                                    Core.projectionField = (Core.Name "target")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtypeEdge")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtypeGraph"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeGraph"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nodes"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.paths.subtypeNode"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+                                    Core.projectionField = (Core.Name "nodes")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "edges"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.paths.subtypeEdge"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeGraph"),
+                                    Core.projectionField = (Core.Name "edges")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtypeGraph")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtypeNode"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeNode"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "label"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+                                    Core.projectionField = (Core.Name "label")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "id"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.paths.SubtypeNode"),
+                                    Core.projectionField = (Core.Name "id")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtypeNode")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtypePath"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypePath"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "xs"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "list"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.paths.subtypeStep"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.paths.SubtypePath")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtypePath")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.paths.subtypeStep"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.paths.SubtypeStep"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "annotatedBody"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotatedBody"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "applicationFunction"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationFunction"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "applicationArgument"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applicationArgument"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "eitherLeft"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "eitherLeft"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "eitherRight"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "eitherRight"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "forallBody"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forallBody"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "functionDomain"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "functionDomain"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "functionCodomain"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "functionCodomain"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "listElement"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "listElement"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "mapKeys"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapKeys"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "mapValues"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "mapValues"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "maybeElement"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybeElement"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "pairFirst"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pairFirst"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "pairSecond"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pairSecond"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "recordField"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "recordField"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "setElement"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "setElement"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unionField"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unionField"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wrappedType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.paths.SubtypeStep"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrappedType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.paths.SubtypeStep")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.paths"],
+      Module.moduleDescription = (Just "Term encoders for hydra.paths")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Phantoms.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Phantoms.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Phantoms.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Phantoms.hs
@@ -14,99 +14,124 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.phantoms"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.phantoms.tBinding"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.phantoms.TBinding"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.phantoms.TBinding"),
-                                  Core.projectionField = (Core.Name "name")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.phantoms.tTerm")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.phantoms.TBinding"),
-                                  Core.projectionField = (Core.Name "term")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.phantoms.tTerm"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "wrap"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.phantoms.TTerm"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "body"),
-                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.phantoms"],
-  Module.moduleDescription = (Just "Term encoders for hydra.phantoms")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.phantoms"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.phantoms.tBinding"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.phantoms.TBinding"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.phantoms.TBinding"),
+                                      Core.projectionField = (Core.Name "name")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.phantoms.tTerm")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.phantoms.TBinding"),
+                                      Core.projectionField = (Core.Name "term")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TBinding")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.phantoms.tTerm"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "wrap"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.phantoms.TTerm"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "body"),
+                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.phantoms.TTerm")))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.phantoms.TTerm")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.phantoms"],
+      Module.moduleDescription = (Just "Term encoders for hydra.phantoms")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Query.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Query.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Query.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Query.hs
@@ -14,1531 +14,1717 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.query"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.comparisonConstraint"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "equal"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equal"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "notEqual"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "notEqual"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "lessThan"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThan"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "greaterThan"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThan"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "lessThanOrEqual"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThanOrEqual"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "greaterThanOrEqual"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThanOrEqual"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.edge"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Edge"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "out"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
-                                Core.projectionField = (Core.Name "out")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "in"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
-                                Core.projectionField = (Core.Name "in")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.graphPattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.GraphPattern"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "graph"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.GraphPattern"),
-                                Core.projectionField = (Core.Name "graph")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "patterns"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.pattern"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.GraphPattern"),
-                                Core.projectionField = (Core.Name "patterns")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.node"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.query.Node"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "term"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Node"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "variable"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Node"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.variable")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "wildcard"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Node"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wildcard"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.path"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.query.Path"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "step"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Path"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "step"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.step")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "regex"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Path"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "regex"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.regexSequence")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "inverse"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Path"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inverse"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.pattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.query.Pattern"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "triple"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "triple"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.triplePattern")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "negation"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "negation"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.pattern")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "conjunction"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conjunction"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "xs"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "list"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.pattern"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "disjunction"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "disjunction"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "xs"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "list"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.pattern"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "graph"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "graph"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.graphPattern")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.query"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Query"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variables"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.variable"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.Query"),
-                                Core.projectionField = (Core.Name "variables")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "patterns"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.pattern"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.Query"),
-                                Core.projectionField = (Core.Name "patterns")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.range"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Range"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "min"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "integer"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "int32"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.Range"),
-                                Core.projectionField = (Core.Name "min")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "max"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "integer"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "int32"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.Range"),
-                                Core.projectionField = (Core.Name "max")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.regexQuantifier"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.query.RegexQuantifier"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "one"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "zeroOrOne"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "zeroOrOne"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "zeroOrMore"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "zeroOrMore"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "oneOrMore"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "oneOrMore"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "exactly"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "exactly"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "atLeast"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "atLeast"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "range"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "range"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.range")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.regexSequence"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexSequence"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "path"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.RegexSequence"),
-                                Core.projectionField = (Core.Name "path")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "quantifier"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.regexQuantifier")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.RegexSequence"),
-                                Core.projectionField = (Core.Name "quantifier")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.step"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.query.Step"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "edge"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Step"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "edge"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.edge")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "project"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Step"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "project"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.projection")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "compare"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Step"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "compare"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.comparisonConstraint")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.triplePattern"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.TriplePattern"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subject"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.node")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
-                                Core.projectionField = (Core.Name "subject")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "predicate"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
-                                Core.projectionField = (Core.Name "predicate")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "object"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.node")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
-                                Core.projectionField = (Core.Name "object")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.query.variable"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Variable"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.query.Variable")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.query"],
-  Module.moduleDescription = (Just "Term encoders for hydra.query")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.query"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.comparisonConstraint"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.query.ComparisonConstraint"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "equal"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equal"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "notEqual"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "notEqual"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "lessThan"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThan"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "greaterThan"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThan"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "lessThanOrEqual"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThanOrEqual"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "greaterThanOrEqual"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.ComparisonConstraint"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThanOrEqual"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.ComparisonConstraint")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.edge"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Edge"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "out"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+                                    Core.projectionField = (Core.Name "out")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "in"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.Edge"),
+                                    Core.projectionField = (Core.Name "in")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.Edge")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.graphPattern"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.GraphPattern"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "graph"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.GraphPattern"),
+                                    Core.projectionField = (Core.Name "graph")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "patterns"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.pattern"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.GraphPattern"),
+                                    Core.projectionField = (Core.Name "patterns")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.GraphPattern")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.node"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.query.Node"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "term"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Node"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "variable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Node"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.variable")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wildcard"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Node"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wildcard"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.Node")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.path"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.query.Path"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "step"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Path"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "step"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.step")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "regex"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Path"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "regex"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.regexSequence")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "inverse"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Path"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inverse"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.Path")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.pathEquation"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.PathEquation"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.PathEquation"),
+                                    Core.projectionField = (Core.Name "left")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.PathEquation"),
+                                    Core.projectionField = (Core.Name "right")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.PathEquation")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.pattern"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.query.Pattern"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "triple"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "triple"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.triplePattern")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "negation"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "negation"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.pattern")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "conjunction"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "conjunction"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "xs"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "list"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.pattern"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "disjunction"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "disjunction"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "xs"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "list"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.pattern"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "graph"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Pattern"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "graph"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.graphPattern")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.Pattern")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.patternImplication"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.PatternImplication"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "antecedent"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.pattern")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.PatternImplication"),
+                                    Core.projectionField = (Core.Name "antecedent")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "consequent"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.pattern")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.PatternImplication"),
+                                    Core.projectionField = (Core.Name "consequent")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.PatternImplication")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.query"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Query"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variables"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.variable"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.Query"),
+                                    Core.projectionField = (Core.Name "variables")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "patterns"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.query.pattern"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.Query"),
+                                    Core.projectionField = (Core.Name "patterns")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.Query")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.range"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Range"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "min"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "integer"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "int32"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.Range"),
+                                    Core.projectionField = (Core.Name "min")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "max"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "integer"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "int32"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.Range"),
+                                    Core.projectionField = (Core.Name "max")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.Range")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.regexQuantifier"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.query.RegexQuantifier"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "one"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "zeroOrOne"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "zeroOrOne"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "zeroOrMore"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "zeroOrMore"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "oneOrMore"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "oneOrMore"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "exactly"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "exactly"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "atLeast"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "atLeast"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "range"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexQuantifier"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "range"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.range")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.RegexQuantifier")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.regexSequence"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.RegexSequence"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "path"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.RegexSequence"),
+                                    Core.projectionField = (Core.Name "path")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "quantifier"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.regexQuantifier")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.RegexSequence"),
+                                    Core.projectionField = (Core.Name "quantifier")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.RegexSequence")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.step"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.query.Step"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "edge"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Step"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "edge"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.edge")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "project"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Step"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "project"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.projection")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "compare"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Step"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "compare"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.comparisonConstraint")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.Step")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.triplePattern"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.TriplePattern"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subject"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.node")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+                                    Core.projectionField = (Core.Name "subject")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "predicate"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.path")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+                                    Core.projectionField = (Core.Name "predicate")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "object"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.query.node")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.query.TriplePattern"),
+                                    Core.projectionField = (Core.Name "object")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.TriplePattern")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.query.variable"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.query.Variable"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.query.Variable")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.query.Variable")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.query"],
+      Module.moduleDescription = (Just "Term encoders for hydra.query")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Relational.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Relational.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Relational.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Relational.hs
@@ -14,504 +14,588 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.relational"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.columnName"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.ColumnName"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.ColumnName")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.columnSchema"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "t"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.ColumnSchema"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.relational.ColumnSchema"),
-                                  Core.projectionField = (Core.Name "name")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "domain"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "t")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.relational.ColumnSchema"),
-                                  Core.projectionField = (Core.Name "domain")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.foreignKey"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.ForeignKey"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foreignRelation"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.relationName")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.relational.ForeignKey"),
-                                Core.projectionField = (Core.Name "foreignRelation")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "keys"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.relational.ForeignKey"),
-                                Core.projectionField = (Core.Name "keys")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.primaryKey"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.PrimaryKey"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "xs"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "list"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.PrimaryKey")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.relation"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "wrap"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.Relation"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "body"),
-                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "xs"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "list"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.row")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Relation")))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.relationName"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.RelationName"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.RelationName")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.relationSchema"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "t"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.RelationSchema"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.relationName")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
-                                  Core.projectionField = (Core.Name "name")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "columns"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "xs"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "list"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.columnSchema")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
-                                  Core.projectionField = (Core.Name "columns")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primaryKeys"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "xs"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "list"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.primaryKey"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
-                                  Core.projectionField = (Core.Name "primaryKeys")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foreignKeys"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "xs"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "list"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.foreignKey"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
-                                  Core.projectionField = (Core.Name "foreignKeys")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.relationship"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "wrap"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.Relationship"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "body"),
-                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "s"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "set"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "m"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "map"),
-                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName"))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))})))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Relationship")))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.relational.row"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "wrap"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.Row"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "body"),
-                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "xs"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "list"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Row")))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.relational"],
-  Module.moduleDescription = (Just "Term encoders for hydra.relational")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.relational"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.columnName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.ColumnName"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.ColumnName")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.relational.ColumnName")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.columnSchema"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "t"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.ColumnSchema"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+                                      Core.projectionField = (Core.Name "name")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "domain"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "t")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.relational.ColumnSchema"),
+                                      Core.projectionField = (Core.Name "domain")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "t"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.ColumnSchema")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.foreignKey"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.ForeignKey"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foreignRelation"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.relationName")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.relational.ForeignKey"),
+                                    Core.projectionField = (Core.Name "foreignRelation")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "keys"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "m"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "map"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.relational.ForeignKey"),
+                                    Core.projectionField = (Core.Name "keys")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.relational.ForeignKey")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.primaryKey"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.PrimaryKey"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "xs"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "list"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.PrimaryKey")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.relational.PrimaryKey")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.relation"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "wrap"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.Relation"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "body"),
+                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "xs"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "list"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.row")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Relation")))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Relation")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.relationName"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.RelationName"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.RelationName")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.relational.RelationName")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.relationSchema"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "t"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.RelationSchema"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.relationName")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+                                      Core.projectionField = (Core.Name "name")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "columns"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "xs"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "list"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.columnSchema")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+                                      Core.projectionField = (Core.Name "columns")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primaryKeys"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "xs"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "list"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.primaryKey"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+                                      Core.projectionField = (Core.Name "primaryKeys")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foreignKeys"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "xs"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "list"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.foreignKey"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.relational.RelationSchema"),
+                                      Core.projectionField = (Core.Name "foreignKeys")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "t"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.RelationSchema")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.relationship"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "wrap"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.Relationship"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "body"),
+                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "s"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "set"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "m"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "map"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName"))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))})))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Relationship")))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Relationship")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = (Just (M.fromList [
+              (Core.Name "v", Core.TypeVariableMetadata {
+                Core.typeVariableMetadataClasses = (S.fromList [
+                  Core.Name "ordering"])})]))}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.relational.row"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "wrap"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.relational.Row"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "body"),
+                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "xs"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "list"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.relational.Row")))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.relational.Row")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.relational"],
+      Module.moduleDescription = (Just "Term encoders for hydra.relational")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Tabular.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Tabular.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Tabular.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Tabular.hs
@@ -14,311 +14,352 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.tabular"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.tabular.columnType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.ColumnType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.tabular.ColumnType"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.tabular.ColumnType"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.tabular.dataRow"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "wrap"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.DataRow"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "body"),
-                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "xs"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "list"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "opt"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.tabular"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.tabular.columnType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.ColumnType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.columnName")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.tabular.ColumnType"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.tabular.ColumnType"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.tabular.ColumnType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.tabular.dataRow"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "wrap"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.DataRow"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "body"),
+                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "xs"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "list"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "opt"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "maybe"),
+                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))})))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.tabular.DataRow")))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.tabular.DataRow")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.tabular.headerRow"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.HeaderRow"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "xs"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "list"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "x"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "literal"),
+                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                          Core.injectionField = Core.Field {
+                                            Core.fieldName = (Core.Name "string"),
+                                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.tabular.HeaderRow")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.tabular.HeaderRow")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.tabular.table"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "v"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.Table"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "header"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "opt"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "maybe"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.tabular.headerRow"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.tabular.Table"),
+                                      Core.projectionField = (Core.Name "header")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "data"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "xs"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "list"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.tabular.dataRow")),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.tabular.Table"),
+                                      Core.projectionField = (Core.Name "data")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "v"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.tabular.Table")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.tabular.tableType"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.TableType"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.relationName")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.tabular.TableType"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "columns"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
                                   Core.lambdaDomain = Nothing,
                                   Core.lambdaBody = (Core.TermUnion (Core.Injection {
                                     Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                     Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldName = (Core.Name "list"),
                                       Core.fieldTerm = (Core.TermApplication (Core.Application {
                                         Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))})))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.tabular.DataRow")))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.tabular.headerRow"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.HeaderRow"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "xs"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "list"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "x"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "literal"),
-                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                      Core.injectionField = Core.Field {
-                                        Core.fieldName = (Core.Name "string"),
-                                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.tabular.HeaderRow")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.tabular.table"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "v"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.Table"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "header"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "opt"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "maybe"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.tabular.headerRow"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.tabular.Table"),
-                                  Core.projectionField = (Core.Name "header")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "data"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "xs"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "list"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.tabular.dataRow")),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.tabular.Table"),
-                                  Core.projectionField = (Core.Name "data")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.tabular.tableType"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.tabular.TableType"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.relational.relationName")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.tabular.TableType"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "columns"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.tabular.columnType"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.tabular.TableType"),
-                                Core.projectionField = (Core.Name "columns")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.tabular"],
-  Module.moduleDescription = (Just "Term encoders for hydra.tabular")}
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.tabular.columnType"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.tabular.TableType"),
+                                    Core.projectionField = (Core.Name "columns")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.tabular.TableType")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core",
+        (Module.Namespace "hydra.encode.relational")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.tabular"],
+      Module.moduleDescription = (Just "Term encoders for hydra.tabular")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Testing.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Testing.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Testing.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Testing.hs
@@ -14,5036 +14,5336 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.testing"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.alphaConversionTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.AlphaConversionTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
-                                Core.projectionField = (Core.Name "term")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "oldVariable"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
-                                Core.projectionField = (Core.Name "oldVariable")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "newVariable"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
-                                Core.projectionField = (Core.Name "newVariable")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "result"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
-                                Core.projectionField = (Core.Name "result")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.evaluationStyle"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "eager"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.EvaluationStyle"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "eager"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "lazy"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.EvaluationStyle"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lazy"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.caseConversionTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.CaseConversionTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fromConvention"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.util.caseConvention")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
-                                Core.projectionField = (Core.Name "fromConvention")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "toConvention"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.util.caseConvention")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
-                                Core.projectionField = (Core.Name "toConvention")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fromString"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
-                                Core.projectionField = (Core.Name "fromString")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "toString"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
-                                Core.projectionField = (Core.Name "toString")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.delegatedEvaluationTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.DelegatedEvaluationTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.etaExpansionTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.EtaExpansionTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.deannotateTermTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.DeannotateTermTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.deannotateTypeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.DeannotateTypeTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.flattenLetTermsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FlattenLetTermsTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.foldOperation"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.testing.FoldOperation"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "sumInt32Literals"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FoldOperation"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sumInt32Literals"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "collectListLengths"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FoldOperation"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "collectListLengths"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "collectLabels"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FoldOperation"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "collectLabels"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.foldOverTermTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FoldOverTermTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "traversalOrder"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.coders.traversalOrder")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
-                                Core.projectionField = (Core.Name "traversalOrder")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "operation"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.foldOperation")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
-                                Core.projectionField = (Core.Name "operation")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.freeVariablesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FreeVariablesTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "s"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "set"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.hoistPredicate"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.testing.HoistPredicate"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "caseStatements"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPredicate"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "caseStatements"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "applications"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPredicate"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applications"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "lists"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPredicate"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lists"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "nothing"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPredicate"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nothing"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.hoistLetBindingsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistLetBindingsTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.hoistPolymorphicLetBindingsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPolymorphicLetBindingsTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.hoistSubtermsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistSubtermsTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "predicate"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistPredicate")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
-                                Core.projectionField = (Core.Name "predicate")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.hoistCaseStatementsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistCaseStatementsTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.termRewriter"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.testing.TermRewriter"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "replaceFooWithBar"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TermRewriter"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceFooWithBar"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "replaceInt32WithInt64"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TermRewriter"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceInt32WithInt64"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.rewriteTermTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.RewriteTermTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriter"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.termRewriter")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
-                                Core.projectionField = (Core.Name "rewriter")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.typeRewriter"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.testing.TypeRewriter"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "replaceStringWithInt32"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TypeRewriter"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceStringWithInt32"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.rewriteTypeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.RewriteTypeTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriter"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.typeRewriter")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
-                                Core.projectionField = (Core.Name "rewriter")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.evaluationTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.EvaluationTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "evaluationStyle"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.evaluationStyle")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
-                                Core.projectionField = (Core.Name "evaluationStyle")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.inferenceFailureTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.InferenceFailureTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.inferenceTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.InferenceTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.jsonCoderTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JsonCoderTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonCoderTestCase"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonCoderTestCase"),
-                                Core.projectionField = (Core.Name "term")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "json"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.json.model.value")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonCoderTestCase"),
-                                Core.projectionField = (Core.Name "json")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.jsonDecodeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JsonDecodeTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "json"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.json.model.value")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
-                                Core.projectionField = (Core.Name "json")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "e"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "either"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "x"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "literal"),
-                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                Core.injectionField = Core.Field {
-                                                  Core.fieldName = (Core.Name "string"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
-                                Core.projectionField = (Core.Name "expected")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.jsonEncodeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JsonEncodeTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
-                                Core.projectionField = (Core.Name "term")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "e"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "either"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "x"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "literal"),
-                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                Core.injectionField = Core.Field {
-                                                  Core.fieldName = (Core.Name "string"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
-                                Core.projectionField = (Core.Name "expected")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.jsonParserTestCase"),
-      Core.bindingTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.parserTestCase")),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.jsonRoundtripTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JsonRoundtripTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
-                                Core.projectionField = (Core.Name "term")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.liftLambdaAboveLetTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.LiftLambdaAboveLetTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.jsonWriterTestCase"),
-      Core.bindingTerm = (Core.TermApplication (Core.Application {
-        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.writerTestCase")),
-        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.parserTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.ParserTestCase"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "x"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "literal"),
-                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                      Core.injectionField = Core.Field {
-                                        Core.fieldName = (Core.Name "string"),
-                                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.testing.ParserTestCase"),
-                                  Core.projectionField = (Core.Name "input")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.parsing.parseResult")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.testing.ParserTestCase"),
-                                  Core.projectionField = (Core.Name "output")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.tag"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.Tag"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.testing.Tag")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.testCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.testing.TestCase"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "alphaConversion"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "alphaConversion"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.alphaConversionTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "caseConversion"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "caseConversion"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.caseConversionTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "deannotateTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "deannotateTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.deannotateTermTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "deannotateType"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "deannotateType"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.deannotateTypeTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "delegatedEvaluation"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "delegatedEvaluation"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.delegatedEvaluationTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "etaExpansion"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "etaExpansion"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.etaExpansionTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "flattenLetTerms"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "flattenLetTerms"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.flattenLetTermsTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "freeVariables"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "freeVariables"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.freeVariablesTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "evaluation"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "evaluation"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.evaluationTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "inference"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inference"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.inferenceTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "inferenceFailure"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inferenceFailure"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.inferenceFailureTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "jsonCoder"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonCoder"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonCoderTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "jsonDecode"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonDecode"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonDecodeTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "jsonEncode"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonEncode"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonEncodeTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "jsonParser"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonParser"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonParserTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "jsonRoundtrip"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonRoundtrip"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonRoundtripTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "jsonWriter"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonWriter"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonWriterTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "liftLambdaAboveLet"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "liftLambdaAboveLet"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.liftLambdaAboveLetTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "serialization"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "serialization"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.serializationTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "simplifyTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "simplifyTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.simplifyTermTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "topologicalSort"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSort"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.topologicalSortTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "topologicalSortBindings"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSortBindings"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.topologicalSortBindingsTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "topologicalSortSCC"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSortSCC"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.topologicalSortSCCTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeChecking"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeChecking"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.typeCheckingTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeCheckingFailure"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeCheckingFailure"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.typeCheckingFailureTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeReduction"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeReduction"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.typeReductionTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "normalizeTypeVariables"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "normalizeTypeVariables"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.normalizeTypeVariablesTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "foldOverTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foldOverTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.foldOverTermTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "rewriteTerm"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriteTerm"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.rewriteTermTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "rewriteType"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriteType"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.rewriteTypeTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "hoistSubterms"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistSubterms"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistSubtermsTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "hoistCaseStatements"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistCaseStatements"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistCaseStatementsTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "hoistLetBindings"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistLetBindings"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistLetBindingsTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "hoistPolymorphicLetBindings"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistPolymorphicLetBindings"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistPolymorphicLetBindingsTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "substInType"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "substInType"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.substInTypeTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "variableOccursInType"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variableOccursInType"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.variableOccursInTypeTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "unifyTypes"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unifyTypes"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.unifyTypesTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "joinTypes"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "joinTypes"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.joinTypesTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "unshadowVariables"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unshadowVariables"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.unshadowVariablesTestCase")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.testCaseWithMetadata"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCaseWithMetadata"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "case"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.testCase")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
-                                Core.projectionField = (Core.Name "case")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "x"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "literal"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
-                                Core.projectionField = (Core.Name "description")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "tags"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.testing.tag"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
-                                Core.projectionField = (Core.Name "tags")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.testGroup"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestGroup"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "opt"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "maybe"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "x"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "literal"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "string"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
-                                Core.projectionField = (Core.Name "description")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subgroups"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.testing.testGroup"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
-                                Core.projectionField = (Core.Name "subgroups")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "cases"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.testing.testCaseWithMetadata"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
-                                Core.projectionField = (Core.Name "cases")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.typeCheckingTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TypeCheckingTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "outputTerm"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
-                                Core.projectionField = (Core.Name "outputTerm")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "outputType"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
-                                Core.projectionField = (Core.Name "outputType")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.typeCheckingFailureTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TypeCheckingFailureTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.topologicalSortBindingsTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TopologicalSortBindingsTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bindings"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "p"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "pair"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
-                                Core.projectionField = (Core.Name "bindings")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "xs"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "list"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "p"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.injectionField = Core.Field {
-                                                      Core.fieldName = (Core.Name "pair"),
-                                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
-                                Core.projectionField = (Core.Name "expected")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.topologicalSortTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TopologicalSortTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "adjacencyList"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "p"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "pair"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "x"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                      Core.injectionField = Core.Field {
-                                                        Core.fieldName = (Core.Name "literal"),
-                                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                          Core.injectionField = Core.Field {
-                                                            Core.fieldName = (Core.Name "integer"),
-                                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                              Core.injectionField = Core.Field {
-                                                                Core.fieldName = (Core.Name "int32"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "xs"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.injectionField = Core.Field {
-                                                      Core.fieldName = (Core.Name "list"),
-                                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "x"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                              Core.injectionField = Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                                  Core.injectionField = Core.Field {
-                                                                    Core.fieldName = (Core.Name "integer"),
-                                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                      Core.injectionField = Core.Field {
-                                                                        Core.fieldName = (Core.Name "int32"),
-                                                                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
-                                Core.projectionField = (Core.Name "adjacencyList")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "e"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "either"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "xs"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "list"),
-                                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "xs"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                      Core.injectionField = Core.Field {
-                                                        Core.fieldName = (Core.Name "list"),
-                                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                              Core.lambdaParameter = (Core.Name "x"),
-                                                              Core.lambdaDomain = Nothing,
-                                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                                Core.injectionField = Core.Field {
-                                                                  Core.fieldName = (Core.Name "literal"),
-                                                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                                    Core.injectionField = Core.Field {
-                                                                      Core.fieldName = (Core.Name "integer"),
-                                                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                                        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                        Core.injectionField = Core.Field {
-                                                                          Core.fieldName = (Core.Name "int32"),
-                                                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "xs"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "list"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "x"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.injectionField = Core.Field {
-                                                      Core.fieldName = (Core.Name "literal"),
-                                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.injectionField = Core.Field {
-                                                          Core.fieldName = (Core.Name "integer"),
-                                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                            Core.injectionField = Core.Field {
-                                                              Core.fieldName = (Core.Name "int32"),
-                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
-                                Core.projectionField = (Core.Name "expected")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.topologicalSortSCCTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TopologicalSortSCCTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "adjacencyList"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "p"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "pair"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                                                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                    Core.lambdaParameter = (Core.Name "x"),
-                                                    Core.lambdaDomain = Nothing,
-                                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                      Core.injectionField = Core.Field {
-                                                        Core.fieldName = (Core.Name "literal"),
-                                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                          Core.injectionField = Core.Field {
-                                                            Core.fieldName = (Core.Name "integer"),
-                                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                              Core.injectionField = Core.Field {
-                                                                Core.fieldName = (Core.Name "int32"),
-                                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "xs"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.injectionField = Core.Field {
-                                                      Core.fieldName = (Core.Name "list"),
-                                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                            Core.lambdaParameter = (Core.Name "x"),
-                                                            Core.lambdaDomain = Nothing,
-                                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                              Core.injectionField = Core.Field {
-                                                                Core.fieldName = (Core.Name "literal"),
-                                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                                  Core.injectionField = Core.Field {
-                                                                    Core.fieldName = (Core.Name "integer"),
-                                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                                      Core.injectionField = Core.Field {
-                                                                        Core.fieldName = (Core.Name "int32"),
-                                                                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
-                                Core.projectionField = (Core.Name "adjacencyList")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "xs"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "list"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                                  Core.lambdaParameter = (Core.Name "x"),
-                                                  Core.lambdaDomain = Nothing,
-                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                                    Core.injectionField = Core.Field {
-                                                      Core.fieldName = (Core.Name "literal"),
-                                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                        Core.injectionField = Core.Field {
-                                                          Core.fieldName = (Core.Name "integer"),
-                                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                            Core.injectionField = Core.Field {
-                                                              Core.fieldName = (Core.Name "int32"),
-                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
-                                Core.projectionField = (Core.Name "expected")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.serializationTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.SerializationTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.simplifyTermTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.SimplifyTermTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.normalizeTypeVariablesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.NormalizeTypeVariablesTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.typeReductionTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TypeReductionTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.writerTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "a"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.WriterTestCase"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.testing.WriterTestCase"),
-                                  Core.projectionField = (Core.Name "input")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "x"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "literal"),
-                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                      Core.injectionField = Core.Field {
-                                        Core.fieldName = (Core.Name "string"),
-                                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.testing.WriterTestCase"),
-                                  Core.projectionField = (Core.Name "output")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.substInTypeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.SubstInTypeTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "substitution"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "p"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "pair"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
-                                Core.projectionField = (Core.Name "substitution")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.variableOccursInTypeTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.VariableOccursInTypeTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
-                                Core.projectionField = (Core.Name "variable")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "boolean"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
-                                Core.projectionField = (Core.Name "expected")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.unshadowVariablesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.UnshadowVariablesTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
-                                Core.projectionField = (Core.Name "input")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
-                                Core.projectionField = (Core.Name "output")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.unifyTypesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.UnifyTypesTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "schemaTypes"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
-                                Core.projectionField = (Core.Name "schemaTypes")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
-                                Core.projectionField = (Core.Name "left")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
-                                Core.projectionField = (Core.Name "right")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "e"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "either"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "x"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "literal"),
-                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                Core.injectionField = Core.Field {
-                                                  Core.fieldName = (Core.Name "string"),
-                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.typing.typeSubst"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
-                                Core.projectionField = (Core.Name "expected")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.testing.joinTypesTestCase"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JoinTypesTestCase"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
-                                Core.projectionField = (Core.Name "left")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
-                                Core.projectionField = (Core.Name "right")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "e"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "either"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-                                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "_"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "unit"),
-                                              Core.fieldTerm = Core.TermUnit}}))})))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "xs"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "list"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.typing.typeConstraint"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
-                                Core.projectionField = (Core.Name "expected")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.testing"],
-  Module.moduleDescription = (Just "Term encoders for hydra.testing")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.testing"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.alphaConversionTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.AlphaConversionTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+                                    Core.projectionField = (Core.Name "term")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "oldVariable"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+                                    Core.projectionField = (Core.Name "oldVariable")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "newVariable"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+                                    Core.projectionField = (Core.Name "newVariable")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "result"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.AlphaConversionTestCase"),
+                                    Core.projectionField = (Core.Name "result")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.AlphaConversionTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.evaluationStyle"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.testing.EvaluationStyle"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "eager"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.EvaluationStyle"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "eager"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "lazy"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.EvaluationStyle"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lazy"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.EvaluationStyle")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.caseConversionTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.CaseConversionTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fromConvention"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.util.caseConvention")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+                                    Core.projectionField = (Core.Name "fromConvention")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "toConvention"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.util.caseConvention")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+                                    Core.projectionField = (Core.Name "toConvention")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "fromString"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+                                    Core.projectionField = (Core.Name "fromString")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "toString"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.CaseConversionTestCase"),
+                                    Core.projectionField = (Core.Name "toString")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.CaseConversionTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.delegatedEvaluationTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.DelegatedEvaluationTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.DelegatedEvaluationTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.DelegatedEvaluationTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.etaExpansionTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.EtaExpansionTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.EtaExpansionTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.EtaExpansionTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.deannotateTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.DeannotateTermTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTermTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.DeannotateTermTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.deannotateTypeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.DeannotateTypeTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.DeannotateTypeTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.DeannotateTypeTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.flattenLetTermsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FlattenLetTermsTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.FlattenLetTermsTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.FlattenLetTermsTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.foldOperation"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.testing.FoldOperation"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "sumInt32Literals"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FoldOperation"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sumInt32Literals"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "collectListLengths"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FoldOperation"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "collectListLengths"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "collectLabels"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FoldOperation"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "collectLabels"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.FoldOperation")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.foldOverTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FoldOverTermTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "traversalOrder"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.coders.traversalOrder")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+                                    Core.projectionField = (Core.Name "traversalOrder")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "operation"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.foldOperation")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+                                    Core.projectionField = (Core.Name "operation")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.FoldOverTermTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.FoldOverTermTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.freeVariablesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.FreeVariablesTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "s"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "set"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.FreeVariablesTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.FreeVariablesTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.hoistPredicate"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.testing.HoistPredicate"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "caseStatements"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPredicate"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "caseStatements"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "applications"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPredicate"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "applications"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "lists"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPredicate"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lists"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "nothing"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPredicate"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nothing"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.HoistPredicate")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.hoistLetBindingsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistLetBindingsTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistLetBindingsTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.HoistLetBindingsTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.hoistPolymorphicLetBindingsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistPolymorphicLetBindingsTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.let")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.hoistSubtermsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistSubtermsTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "predicate"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistPredicate")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+                                    Core.projectionField = (Core.Name "predicate")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistSubtermsTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.HoistSubtermsTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.hoistCaseStatementsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.HoistCaseStatementsTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.HoistCaseStatementsTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.HoistCaseStatementsTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.termRewriter"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.testing.TermRewriter"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "replaceFooWithBar"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TermRewriter"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceFooWithBar"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "replaceInt32WithInt64"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TermRewriter"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceInt32WithInt64"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TermRewriter")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.rewriteTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.RewriteTermTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriter"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.termRewriter")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+                                    Core.projectionField = (Core.Name "rewriter")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTermTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.RewriteTermTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.typeRewriter"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.testing.TypeRewriter"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "replaceStringWithInt32"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TypeRewriter"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "replaceStringWithInt32"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TypeRewriter")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.rewriteTypeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.RewriteTypeTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriter"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.typeRewriter")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+                                    Core.projectionField = (Core.Name "rewriter")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.RewriteTypeTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.RewriteTypeTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.evaluationTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.EvaluationTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "evaluationStyle"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.evaluationStyle")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+                                    Core.projectionField = (Core.Name "evaluationStyle")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.EvaluationTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.EvaluationTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.inferenceFailureTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.InferenceFailureTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.InferenceFailureTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.InferenceFailureTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.inferenceTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.InferenceTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.InferenceTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.InferenceTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.jsonDecodeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JsonDecodeTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "json"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.json.model.value")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+                                    Core.projectionField = (Core.Name "json")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "e"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "either"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "x"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "literal"),
+                                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                    Core.injectionField = Core.Field {
+                                                      Core.fieldName = (Core.Name "string"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JsonDecodeTestCase"),
+                                    Core.projectionField = (Core.Name "expected")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.JsonDecodeTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.jsonEncodeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JsonEncodeTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+                                    Core.projectionField = (Core.Name "term")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "e"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "either"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "x"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "literal"),
+                                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                    Core.injectionField = Core.Field {
+                                                      Core.fieldName = (Core.Name "string"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JsonEncodeTestCase"),
+                                    Core.projectionField = (Core.Name "expected")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.JsonEncodeTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.jsonParserTestCase"),
+          Module.termDefinitionTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.parserTestCase")),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.ParserTestCase")),
+                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.json.model.Value"))})),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.jsonRoundtripTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JsonRoundtripTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JsonRoundtripTestCase"),
+                                    Core.projectionField = (Core.Name "term")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.JsonRoundtripTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.liftLambdaAboveLetTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.LiftLambdaAboveLetTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.jsonWriterTestCase"),
+          Module.termDefinitionTerm = (Core.TermApplication (Core.Application {
+            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.writerTestCase")),
+            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.json.model.value"))})),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.WriterTestCase")),
+                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.json.model.Value"))})),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.parserTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.ParserTestCase"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "x"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "literal"),
+                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                          Core.injectionField = Core.Field {
+                                            Core.fieldName = (Core.Name "string"),
+                                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+                                      Core.projectionField = (Core.Name "input")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.parsing.parseResult")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.testing.ParserTestCase"),
+                                      Core.projectionField = (Core.Name "output")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.ParserTestCase")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.tag"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.Tag"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.testing.Tag")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.Tag")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.testCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.testing.TestCase"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "alphaConversion"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "alphaConversion"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.alphaConversionTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "caseConversion"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "caseConversion"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.caseConversionTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "deannotateTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "deannotateTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.deannotateTermTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "deannotateType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "deannotateType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.deannotateTypeTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "delegatedEvaluation"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "delegatedEvaluation"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.delegatedEvaluationTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "etaExpansion"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "etaExpansion"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.etaExpansionTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "flattenLetTerms"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "flattenLetTerms"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.flattenLetTermsTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "freeVariables"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "freeVariables"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.freeVariablesTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "evaluation"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "evaluation"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.evaluationTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "inference"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inference"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.inferenceTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "inferenceFailure"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inferenceFailure"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.inferenceFailureTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "jsonDecode"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonDecode"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonDecodeTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "jsonEncode"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonEncode"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonEncodeTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "jsonParser"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonParser"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonParserTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "jsonRoundtrip"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonRoundtrip"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonRoundtripTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "jsonWriter"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "jsonWriter"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.jsonWriterTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "liftLambdaAboveLet"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "liftLambdaAboveLet"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.liftLambdaAboveLetTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "serialization"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "serialization"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.serializationTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "simplifyTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "simplifyTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.simplifyTermTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "topologicalSort"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSort"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.topologicalSortTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "topologicalSortBindings"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSortBindings"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.topologicalSortBindingsTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "topologicalSortSCC"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "topologicalSortSCC"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.topologicalSortSCCTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeChecking"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeChecking"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.typeCheckingTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeCheckingFailure"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeCheckingFailure"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.typeCheckingFailureTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeReduction"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeReduction"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.typeReductionTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "normalizeTypeVariables"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "normalizeTypeVariables"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.normalizeTypeVariablesTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "foldOverTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foldOverTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.foldOverTermTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "rewriteTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriteTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.rewriteTermTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "rewriteType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "rewriteType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.rewriteTypeTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "hoistSubterms"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistSubterms"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistSubtermsTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "hoistCaseStatements"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistCaseStatements"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistCaseStatementsTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "hoistLetBindings"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistLetBindings"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistLetBindingsTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "hoistPolymorphicLetBindings"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hoistPolymorphicLetBindings"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.hoistPolymorphicLetBindingsTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "substInType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "substInType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.substInTypeTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "variableOccursInType"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variableOccursInType"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.variableOccursInTypeTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unifyTypes"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unifyTypes"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.unifyTypesTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "joinTypes"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "joinTypes"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.joinTypesTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unshadowVariables"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unshadowVariables"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.unshadowVariablesTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "validateCoreTerm"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCase"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "validateCoreTerm"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.validateCoreTermTestCase")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.testCaseWithMetadata"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestCaseWithMetadata"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "case"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.testing.testCase")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+                                    Core.projectionField = (Core.Name "case")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "literal"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+                                    Core.projectionField = (Core.Name "description")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "tags"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.testing.tag"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TestCaseWithMetadata"),
+                                    Core.projectionField = (Core.Name "tags")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TestCaseWithMetadata")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.testGroup"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TestGroup"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+                                    Core.projectionField = (Core.Name "name")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "literal"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "string"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+                                    Core.projectionField = (Core.Name "description")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subgroups"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.testing.testGroup"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+                                    Core.projectionField = (Core.Name "subgroups")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "cases"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.testing.testCaseWithMetadata"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TestGroup"),
+                                    Core.projectionField = (Core.Name "cases")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TestGroup")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.typeCheckingTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TypeCheckingTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "outputTerm"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+                                    Core.projectionField = (Core.Name "outputTerm")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "outputType"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingTestCase"),
+                                    Core.projectionField = (Core.Name "outputType")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TypeCheckingTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.typeCheckingFailureTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TypeCheckingFailureTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TypeCheckingFailureTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TypeCheckingFailureTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.topologicalSortBindingsTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TopologicalSortBindingsTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bindings"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "p"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "pair"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+                                    Core.projectionField = (Core.Name "bindings")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "xs"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "list"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "p"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.injectionField = Core.Field {
+                                                          Core.fieldName = (Core.Name "pair"),
+                                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase"),
+                                    Core.projectionField = (Core.Name "expected")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortBindingsTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.topologicalSortTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TopologicalSortTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "adjacencyList"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "p"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "pair"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "x"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                          Core.injectionField = Core.Field {
+                                                            Core.fieldName = (Core.Name "literal"),
+                                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                              Core.injectionField = Core.Field {
+                                                                Core.fieldName = (Core.Name "integer"),
+                                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                  Core.injectionField = Core.Field {
+                                                                    Core.fieldName = (Core.Name "int32"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "xs"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.injectionField = Core.Field {
+                                                          Core.fieldName = (Core.Name "list"),
+                                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "x"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                                  Core.injectionField = Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.injectionField = Core.Field {
+                                                                        Core.fieldName = (Core.Name "integer"),
+                                                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                          Core.injectionField = Core.Field {
+                                                                            Core.fieldName = (Core.Name "int32"),
+                                                                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+                                    Core.projectionField = (Core.Name "adjacencyList")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "e"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "either"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "xs"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "list"),
+                                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "xs"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                          Core.injectionField = Core.Field {
+                                                            Core.fieldName = (Core.Name "list"),
+                                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                  Core.lambdaParameter = (Core.Name "x"),
+                                                                  Core.lambdaDomain = Nothing,
+                                                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                                    Core.injectionField = Core.Field {
+                                                                      Core.fieldName = (Core.Name "literal"),
+                                                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                                        Core.injectionField = Core.Field {
+                                                                          Core.fieldName = (Core.Name "integer"),
+                                                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                            Core.injectionField = Core.Field {
+                                                                              Core.fieldName = (Core.Name "int32"),
+                                                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "xs"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "list"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "x"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.injectionField = Core.Field {
+                                                          Core.fieldName = (Core.Name "literal"),
+                                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.injectionField = Core.Field {
+                                                              Core.fieldName = (Core.Name "integer"),
+                                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                Core.injectionField = Core.Field {
+                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortTestCase"),
+                                    Core.projectionField = (Core.Name "expected")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.topologicalSortSCCTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TopologicalSortSCCTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "adjacencyList"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "p"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "pair"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                        Core.lambdaParameter = (Core.Name "x"),
+                                                        Core.lambdaDomain = Nothing,
+                                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                          Core.injectionField = Core.Field {
+                                                            Core.fieldName = (Core.Name "literal"),
+                                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                              Core.injectionField = Core.Field {
+                                                                Core.fieldName = (Core.Name "integer"),
+                                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                  Core.injectionField = Core.Field {
+                                                                    Core.fieldName = (Core.Name "int32"),
+                                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "xs"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.injectionField = Core.Field {
+                                                          Core.fieldName = (Core.Name "list"),
+                                                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                                Core.lambdaParameter = (Core.Name "x"),
+                                                                Core.lambdaDomain = Nothing,
+                                                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                                  Core.injectionField = Core.Field {
+                                                                    Core.fieldName = (Core.Name "literal"),
+                                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                                      Core.injectionField = Core.Field {
+                                                                        Core.fieldName = (Core.Name "integer"),
+                                                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                          Core.injectionField = Core.Field {
+                                                                            Core.fieldName = (Core.Name "int32"),
+                                                                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+                                    Core.projectionField = (Core.Name "adjacencyList")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "xs"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "list"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                      Core.lambdaParameter = (Core.Name "x"),
+                                                      Core.lambdaDomain = Nothing,
+                                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                        Core.injectionField = Core.Field {
+                                                          Core.fieldName = (Core.Name "literal"),
+                                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                            Core.injectionField = Core.Field {
+                                                              Core.fieldName = (Core.Name "integer"),
+                                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                                Core.injectionField = Core.Field {
+                                                                  Core.fieldName = (Core.Name "int32"),
+                                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TopologicalSortSCCTestCase"),
+                                    Core.projectionField = (Core.Name "expected")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TopologicalSortSCCTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.serializationTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.SerializationTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.ast.expr")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.SerializationTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.SerializationTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.simplifyTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.SimplifyTermTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.SimplifyTermTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.SimplifyTermTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.normalizeTypeVariablesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.NormalizeTypeVariablesTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.typeReductionTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.TypeReductionTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.TypeReductionTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.TypeReductionTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.writerTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "a"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.WriterTestCase"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+                                      Core.projectionField = (Core.Name "input")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "x"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "literal"),
+                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                          Core.injectionField = Core.Field {
+                                            Core.fieldName = (Core.Name "string"),
+                                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.testing.WriterTestCase"),
+                                      Core.projectionField = (Core.Name "output")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "a"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.testing.WriterTestCase")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.substInTypeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.SubstInTypeTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "substitution"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "p"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "pair"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+                                    Core.projectionField = (Core.Name "substitution")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.SubstInTypeTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.SubstInTypeTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.variableOccursInTypeTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.VariableOccursInTypeTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+                                    Core.projectionField = (Core.Name "variable")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "boolean"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.VariableOccursInTypeTestCase"),
+                                    Core.projectionField = (Core.Name "expected")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.VariableOccursInTypeTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.unshadowVariablesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.UnshadowVariablesTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.UnshadowVariablesTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.UnshadowVariablesTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.unifyTypesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.UnifyTypesTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "schemaTypes"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+                                    Core.projectionField = (Core.Name "schemaTypes")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+                                    Core.projectionField = (Core.Name "left")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+                                    Core.projectionField = (Core.Name "right")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "e"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "either"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "x"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "literal"),
+                                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                    Core.injectionField = Core.Field {
+                                                      Core.fieldName = (Core.Name "string"),
+                                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))})))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.typing.typeSubst"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.UnifyTypesTestCase"),
+                                    Core.projectionField = (Core.Name "expected")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.UnifyTypesTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.joinTypesTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.JoinTypesTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+                                    Core.projectionField = (Core.Name "left")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+                                    Core.projectionField = (Core.Name "right")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "expected"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "e"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "either"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "_"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "unit"),
+                                                  Core.fieldTerm = Core.TermUnit}}))})))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "xs"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "list"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.typing.typeConstraint"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.JoinTypesTestCase"),
+                                    Core.projectionField = (Core.Name "expected")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.JoinTypesTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.testing.validateCoreTermTestCase"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.testing.ValidateCoreTermTestCase"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typed"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "boolean"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+                                    Core.projectionField = (Core.Name "typed")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "input"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+                                    Core.projectionField = (Core.Name "input")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "output"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "opt"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "maybe"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.error.core.invalidTermError"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.testing.ValidateCoreTermTestCase"),
+                                    Core.projectionField = (Core.Name "output")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.testing.ValidateCoreTermTestCase")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core",
+        (Module.Namespace "hydra.encode.ast"),
+        (Module.Namespace "hydra.encode.coders"),
+        (Module.Namespace "hydra.encode.error.core"),
+        (Module.Namespace "hydra.encode.graph"),
+        (Module.Namespace "hydra.encode.json.model"),
+        (Module.Namespace "hydra.encode.module"),
+        (Module.Namespace "hydra.encode.parsing"),
+        (Module.Namespace "hydra.encode.typing"),
+        (Module.Namespace "hydra.encode.util")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.testing"],
+      Module.moduleDescription = (Just "Term encoders for hydra.testing")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Topology.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Topology.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Topology.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Topology.hs
@@ -14,296 +14,314 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.topology"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.topology.graph"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "m"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "map"),
-            Core.fieldTerm = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "xs"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "list"),
-                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.topology.tarjanState"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.topology.TarjanState"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "counter"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.topology"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.topology.graph"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "m"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "map"),
+                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "xs"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "list"),
                           Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.topology.Vertex")),
+                Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "hydra.topology.Vertex")))})),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.topology.tarjanState"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.topology.TarjanState"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "counter"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                     Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "integer"),
+                                      Core.fieldName = (Core.Name "literal"),
                                       Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
                                         Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "int32"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
-                                Core.projectionField = (Core.Name "counter")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "indices"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "x"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "literal"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                          Core.fieldName = (Core.Name "integer"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "int32"),
+                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+                                    Core.projectionField = (Core.Name "counter")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "indices"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "m"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "map"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                               Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "integer"),
+                                                Core.fieldName = (Core.Name "literal"),
                                                 Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
                                                   Core.injectionField = Core.Field {
-                                                    Core.fieldName = (Core.Name "int32"),
-                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
-                                Core.projectionField = (Core.Name "indices")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lowLinks"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "x"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "literal"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                    Core.fieldName = (Core.Name "integer"),
+                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                      Core.injectionField = Core.Field {
+                                                        Core.fieldName = (Core.Name "int32"),
+                                                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+                                    Core.projectionField = (Core.Name "indices")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lowLinks"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "m"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "map"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "x"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                               Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "integer"),
+                                                Core.fieldName = (Core.Name "literal"),
                                                 Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
                                                   Core.injectionField = Core.Field {
-                                                    Core.fieldName = (Core.Name "int32"),
-                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
-                                Core.projectionField = (Core.Name "lowLinks")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "stack"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
-                                Core.projectionField = (Core.Name "stack")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "onStack"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "s"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "set"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
-                                Core.projectionField = (Core.Name "onStack")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sccs"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "xs"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                          Core.injectionField = Core.Field {
-                                            Core.fieldName = (Core.Name "list"),
-                                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
-                                Core.projectionField = (Core.Name "sccs")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.topology.vertex"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "literal"),
-            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                    Core.fieldName = (Core.Name "integer"),
+                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                      Core.injectionField = Core.Field {
+                                                        Core.fieldName = (Core.Name "int32"),
+                                                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+                                    Core.projectionField = (Core.Name "lowLinks")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "stack"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+                                    Core.projectionField = (Core.Name "stack")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "onStack"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "s"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "set"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+                                    Core.projectionField = (Core.Name "onStack")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "sccs"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "xs"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "list"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "xs"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                              Core.injectionField = Core.Field {
+                                                Core.fieldName = (Core.Name "list"),
+                                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.topology.vertex"))})),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))})))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.topology.TarjanState"),
+                                    Core.projectionField = (Core.Name "sccs")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.topology.TarjanState")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.topology.vertex"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
               Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "integer"),
+                Core.fieldName = (Core.Name "literal"),
                 Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
                   Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "int32"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.topology"],
-  Module.moduleDescription = (Just "Term encoders for hydra.topology")}
+                    Core.fieldName = (Core.Name "integer"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "int32"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Literal")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.topology"],
+      Module.moduleDescription = (Just "Term encoders for hydra.topology")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Typing.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Typing.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Typing.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Typing.hs
@@ -14,821 +14,521 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.typing"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.typing.functionStructure"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "env"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "record"),
-              Core.fieldTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.core.Record"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "typeName"),
-                    Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.FunctionStructure"))}))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fields"),
-                    Core.fieldTerm = (Core.TermList [
-                      Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeParams"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "xs"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "list"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-                                  Core.projectionField = (Core.Name "typeParams")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "params"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "xs"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "list"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-                                  Core.projectionField = (Core.Name "params")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bindings"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "xs"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "list"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.binding"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-                                  Core.projectionField = (Core.Name "bindings")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-                                  Core.projectionField = (Core.Name "body")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "domains"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "xs"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "list"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-                                  Core.projectionField = (Core.Name "domains")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "codomain"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "opt"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "maybe"),
-                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-                                  Core.projectionField = (Core.Name "codomain")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                      (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "name"),
-                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "environment"))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "term"),
-                            Core.fieldTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "env")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
-                                  Core.projectionField = (Core.Name "environment")})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.typing.inferenceContext"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.InferenceContext"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "schemaTypes"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceContext"),
-                                Core.projectionField = (Core.Name "schemaTypes")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitiveTypes"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceContext"),
-                                Core.projectionField = (Core.Name "primitiveTypes")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "dataTypes"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeScheme"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceContext"),
-                                Core.projectionField = (Core.Name "dataTypes")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "classConstraints"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeVariableMetadata"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceContext"),
-                                Core.projectionField = (Core.Name "classConstraints")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "debug"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "boolean"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceContext"),
-                                Core.projectionField = (Core.Name "debug")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.typing.inferenceResult"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.InferenceResult"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
-                                Core.projectionField = (Core.Name "term")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
-                                Core.projectionField = (Core.Name "type")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subst"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.typing.typeSubst")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
-                                Core.projectionField = (Core.Name "subst")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "classConstraints"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeVariableMetadata"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
-                                Core.projectionField = (Core.Name "classConstraints")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.typing.termSubst"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.TermSubst"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "m"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "map"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.typing.TermSubst")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.typing.typeConstraint"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.TypeConstraint"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
-                                Core.projectionField = (Core.Name "left")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
-                                Core.projectionField = (Core.Name "right")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "comment"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
-                                Core.projectionField = (Core.Name "comment")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.typing.typeContext"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.TypeContext"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "types"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeContext"),
-                                Core.projectionField = (Core.Name "types")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "metadata"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "m"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "map"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeContext"),
-                                Core.projectionField = (Core.Name "metadata")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeVariables"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "s"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "set"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeContext"),
-                                Core.projectionField = (Core.Name "typeVariables")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambdaVariables"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "s"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "set"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeContext"),
-                                Core.projectionField = (Core.Name "lambdaVariables")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "letVariables"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "s"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "set"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeContext"),
-                                Core.projectionField = (Core.Name "letVariables")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "inferenceContext"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.typing.inferenceContext")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.typing.TypeContext"),
-                                Core.projectionField = (Core.Name "inferenceContext")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.typing.typeSubst"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.TypeSubst"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "m"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "map"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.typing.TypeSubst")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.typing"],
-  Module.moduleDescription = (Just "Term encoders for hydra.typing")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.typing"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.typing.functionStructure"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "env"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "record"),
+                  Core.fieldTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "typeName"),
+                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.FunctionStructure"))}))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fields"),
+                        Core.fieldTerm = (Core.TermList [
+                          Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeParams"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "xs"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "list"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+                                      Core.projectionField = (Core.Name "typeParams")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "params"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "xs"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "list"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+                                      Core.projectionField = (Core.Name "params")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bindings"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "xs"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "list"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.binding"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+                                      Core.projectionField = (Core.Name "bindings")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "body"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+                                      Core.projectionField = (Core.Name "body")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "domains"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "xs"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "list"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+                                      Core.projectionField = (Core.Name "domains")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "codomain"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "opt"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "maybe"),
+                                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "opt"))}))}}))}))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+                                      Core.projectionField = (Core.Name "codomain")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                          (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "name"),
+                                Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "environment"))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "term"),
+                                Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "env")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = (Core.Name "hydra.typing.FunctionStructure"),
+                                      Core.projectionField = (Core.Name "environment")})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))})))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [
+              Core.Name "env"],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "env")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.typing.FunctionStructure")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "env"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))}))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.typing.inferenceResult"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.InferenceResult"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "term"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.term")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+                                    Core.projectionField = (Core.Name "term")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "type"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+                                    Core.projectionField = (Core.Name "type")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "subst"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.typing.typeSubst")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+                                    Core.projectionField = (Core.Name "subst")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "classConstraints"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "m"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "map"),
+                                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.typeVariableMetadata"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+                                    Core.projectionField = (Core.Name "classConstraints")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "context"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.context.context")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.typing.InferenceResult"),
+                                    Core.projectionField = (Core.Name "context")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.typing.InferenceResult")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.typing.termSubst"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.TermSubst"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "m"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "map"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.term"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.typing.TermSubst")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.typing.TermSubst")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.typing.typeConstraint"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.Record"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.TypeConstraint"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "fields"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "left"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+                                    Core.projectionField = (Core.Name "left")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "right"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.type")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+                                    Core.projectionField = (Core.Name "right")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
+                        (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "name"),
+                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "comment"))}))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "term"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "literal"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "string"),
+                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = (Core.Name "hydra.typing.TypeConstraint"),
+                                    Core.projectionField = (Core.Name "comment")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.typing.TypeConstraint")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.typing.typeSubst"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+            Core.lambdaParameter = (Core.Name "x"),
+            Core.lambdaDomain = Nothing,
+            Core.lambdaBody = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "typeName"),
+                      Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.typing.TypeSubst"))}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "body"),
+                      Core.fieldTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "m"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "map"),
+                              Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.name"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.core.type"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}}))}))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.typing.TypeSubst")))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.typing.TypeSubst")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core",
+        (Module.Namespace "hydra.encode.context")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.typing"],
+      Module.moduleDescription = (Just "Term encoders for hydra.typing")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Util.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Util.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Util.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Util.hs
@@ -14,427 +14,409 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.util"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.util.caseConvention"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.util.CaseConvention"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "camel"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.CaseConvention"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "camel"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "pascal"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.CaseConvention"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pascal"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "lowerSnake"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.CaseConvention"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lowerSnake"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "upperSnake"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.CaseConvention"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "upperSnake"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.util.comparison"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.util.Comparison"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "lessThan"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Comparison"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThan"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "equalTo"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Comparison"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equalTo"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "greaterThan"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Comparison"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThan"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.util.decodingError"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.WrappedTerm"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.DecodingError"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "body"),
-                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.util.DecodingError")))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.util.precision"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.util.Precision"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "arbitrary"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Precision"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "arbitrary"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "bits"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Precision"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bits"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.util"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.util.caseConvention"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.util.CaseConvention"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "camel"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.CaseConvention"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "camel"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
                                         Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "pascal"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.CaseConvention"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pascal"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "lowerSnake"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.CaseConvention"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lowerSnake"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "upperSnake"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.CaseConvention"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "upperSnake"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.util.CaseConvention")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.util.comparison"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.util.Comparison"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "lessThan"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Comparison"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lessThan"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "equalTo"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Comparison"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "equalTo"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "greaterThan"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Comparison"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "greaterThan"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.util.Comparison")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.util.precision"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.util.Precision"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "arbitrary"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Precision"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "arbitrary"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "bits"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.util.Precision"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bits"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "x"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
                                           Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
                                             Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.util"],
-  Module.moduleDescription = (Just "Term encoders for hydra.util")}
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.util.Precision")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.context",
+        (Module.Namespace "hydra.encode.core"),
+        (Module.Namespace "hydra.encode.errors")],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.util"],
+      Module.moduleDescription = (Just "Term encoders for hydra.util")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Variants.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Variants.hs
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Variants.hs
+++ b/src/gen-main/haskell/Hydra/Sources/Encode/Variants.hs
@@ -14,1801 +14,1866 @@
 import qualified Data.Set as S
 
 module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.variants"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.variants.eliminationVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.variants.EliminationVariant"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.EliminationVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "union"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.EliminationVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.EliminationVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.variants.functionVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.variants.FunctionVariant"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "elimination"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.FunctionVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elimination"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "lambda"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.FunctionVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambda"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "primitive"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.FunctionVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitive"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.variants.literalVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.variants.LiteralVariant"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "binary"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "boolean"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "float"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "integer"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "string"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.variants.termVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.variants.TermVariant"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "annotated"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "application"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "either"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "function"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "let"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "let"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "list"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "literal"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "map"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "maybe"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "pair"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "set"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeApplication"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplication"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "typeLambda"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambda"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "union"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "unit"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "variable"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.variants.typeVariant"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.variants.TypeVariant"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "annotated"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "application"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "either"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "forall"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forall"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "function"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "list"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "literal"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "map"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "maybe"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "pair"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "set"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "union"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "unit"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "variable"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "wrap"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.variants"],
-  Module.moduleDescription = (Just "Term encoders for hydra.variants")}
+module_ =
+    Module.Module {
+      Module.moduleNamespace = (Module.Namespace "hydra.encode.variants"),
+      Module.moduleDefinitions = [
+        Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.variants.eliminationVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.variants.EliminationVariant"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.EliminationVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "union"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.EliminationVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.EliminationVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.variants.EliminationVariant")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.variants.functionVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.variants.FunctionVariant"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "elimination"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.FunctionVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "elimination"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "lambda"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.FunctionVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "lambda"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "primitive"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.FunctionVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "primitive"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.variants.FunctionVariant")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.variants.literalVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.variants.LiteralVariant"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "binary"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "binary"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "boolean"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "boolean"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "float"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "float"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "integer"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "integer"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "string"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.LiteralVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "string"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.variants.LiteralVariant")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.variants.termVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.variants.TermVariant"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "annotated"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "application"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "either"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "function"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "let"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "let"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "list"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "literal"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "map"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "maybe"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "pair"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "set"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeApplication"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeApplication"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "typeLambda"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeLambda"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "union"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unit"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "variable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TermVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.variants.TermVariant")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))})),
+        (Module.DefinitionTerm (Module.TermDefinition {
+          Module.termDefinitionName = (Core.Name "hydra.encode.variants.typeVariant"),
+          Module.termDefinitionTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+            Core.caseStatementTypeName = (Core.Name "hydra.variants.TypeVariant"),
+            Core.caseStatementDefault = Nothing,
+            Core.caseStatementCases = [
+              Core.Field {
+                Core.fieldName = (Core.Name "annotated"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "annotated"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "application"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "application"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "either"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "either"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "forall"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "forall"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "function"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "function"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "list"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "list"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "literal"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "literal"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "map"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "map"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "maybe"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "maybe"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "pair"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "pair"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "record"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "record"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "set"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "set"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "union"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "union"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "unit"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "unit"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "variable"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "variable"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "void"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "void"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
+              Core.Field {
+                Core.fieldName = (Core.Name "wrap"),
+                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "union"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.Injection"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "typeName"),
+                            Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.variants.TypeVariant"))}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "field"),
+                            Core.fieldTerm = (Core.TermRecord (Core.Record {
+                              Core.recordTypeName = (Core.Name "hydra.core.Field"),
+                              Core.recordFields = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "name"),
+                                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
+                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrap"))}))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "term"),
+                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "_"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "unit"),
+                                          Core.fieldTerm = Core.TermUnit}}))}))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
+          Module.termDefinitionType = (Just (Core.TypeScheme {
+            Core.typeSchemeVariables = [],
+            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.variants.TypeVariant")),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.core.Term"))})),
+            Core.typeSchemeConstraints = Nothing}))}))],
+      Module.moduleTermDependencies = [
+        Module.Namespace "hydra.encode.core"],
+      Module.moduleTypeDependencies = [
+        Module.Namespace "hydra.variants"],
+      Module.moduleDescription = (Just "Term encoders for hydra.variants")}
diff --git a/src/gen-main/haskell/Hydra/Sources/Encode/Workflow.hs b/src/gen-main/haskell/Hydra/Sources/Encode/Workflow.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Sources/Encode/Workflow.hs
+++ /dev/null
@@ -1,333 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Source module for hydra.encode.workflow
-
-module Hydra.Sources.Encode.Workflow where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-module_ :: Module.Module
-module_ = Module.Module {
-  Module.moduleNamespace = (Module.Namespace "hydra.encode.workflow"),
-  Module.moduleElements = [
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.workflow.hydraSchemaSpec"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.workflow.HydraSchemaSpec"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "modules"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "xs"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "list"),
-                                  Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.encode.module.module"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.workflow.HydraSchemaSpec"),
-                                Core.projectionField = (Core.Name "modules")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "typeName"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.core.name")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.workflow.HydraSchemaSpec"),
-                                Core.projectionField = (Core.Name "typeName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.workflow.schemaSpec"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-        Core.caseStatementTypeName = (Core.Name "hydra.workflow.SchemaSpec"),
-        Core.caseStatementDefault = Nothing,
-        Core.caseStatementCases = [
-          Core.Field {
-            Core.fieldName = (Core.Name "hydra"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.workflow.SchemaSpec"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.workflow.hydraSchemaSpec")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "file"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.workflow.SchemaSpec"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "file"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "x"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "string"),
-                                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))},
-          Core.Field {
-            Core.fieldName = (Core.Name "provided"),
-            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "union"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.Injection"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "typeName"),
-                        Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.workflow.SchemaSpec"))}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "field"),
-                        Core.fieldTerm = (Core.TermRecord (Core.Record {
-                          Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                          Core.recordFields = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "name"),
-                              Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                                Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "provided"))}))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "term"),
-                              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "_"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "unit"),
-                                      Core.fieldTerm = Core.TermUnit}}))}))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}]}))}]}))}}))})))}]})))),
-      Core.bindingType = Nothing},
-    Core.Binding {
-      Core.bindingName = (Core.Name "hydra.encode.workflow.transformWorkflow"),
-      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-        Core.lambdaParameter = (Core.Name "x"),
-        Core.lambdaDomain = Nothing,
-        Core.lambdaBody = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "record"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.core.Record"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "typeName"),
-                  Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hydra.workflow.TransformWorkflow"))}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "fields"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "name"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.workflow.TransformWorkflow"),
-                                Core.projectionField = (Core.Name "name")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "schemaSpec"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.encode.workflow.schemaSpec")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.workflow.TransformWorkflow"),
-                                Core.projectionField = (Core.Name "schemaSpec")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "srcDir"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.workflow.TransformWorkflow"),
-                                Core.projectionField = (Core.Name "srcDir")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]})),
-                    (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = (Core.Name "hydra.core.Field"),
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "name"),
-                          Core.fieldTerm = (Core.TermWrap (Core.WrappedTerm {
-                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "destDir"))}))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "term"),
-                          Core.fieldTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "literal"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "string"),
-                                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}}))}))),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = (Core.Name "hydra.workflow.TransformWorkflow"),
-                                Core.projectionField = (Core.Name "destDir")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}]}))])}]}))}}))}))),
-      Core.bindingType = Nothing}],
-  Module.moduleTermDependencies = [
-    Module.Namespace "hydra.encode.core"],
-  Module.moduleTypeDependencies = [
-    Module.Namespace "hydra.workflow"],
-  Module.moduleDescription = (Just "Term encoders for hydra.workflow")}
diff --git a/src/gen-main/haskell/Hydra/Substitution.hs b/src/gen-main/haskell/Hydra/Substitution.hs
--- a/src/gen-main/haskell/Hydra/Substitution.hs
+++ b/src/gen-main/haskell/Hydra/Substitution.hs
@@ -5,6 +5,7 @@
 module Hydra.Substitution where
 
 import qualified Hydra.Core as Core
+import qualified Hydra.Graph as Graph
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Maps as Maps
@@ -21,165 +22,199 @@
 import qualified Data.Set as S
 
 -- | Compose two type substitutions
-composeTypeSubst :: (Typing.TypeSubst -> Typing.TypeSubst -> Typing.TypeSubst)
-composeTypeSubst s1 s2 = (Logic.ifElse (Maps.null (Typing.unTypeSubst s1)) s2 (Logic.ifElse (Maps.null (Typing.unTypeSubst s2)) s1 (composeTypeSubstNonEmpty s1 s2)))
+composeTypeSubst :: Typing.TypeSubst -> Typing.TypeSubst -> Typing.TypeSubst
+composeTypeSubst s1 s2 =
+    Logic.ifElse (Maps.null (Typing.unTypeSubst s1)) s2 (Logic.ifElse (Maps.null (Typing.unTypeSubst s2)) s1 (composeTypeSubstNonEmpty s1 s2))
 
+-- | Compose a list of type substitutions
+composeTypeSubstList :: [Typing.TypeSubst] -> Typing.TypeSubst
+composeTypeSubstList = Lists.foldl composeTypeSubst idTypeSubst
+
 -- | Compose two non-empty type substitutions (internal helper)
-composeTypeSubstNonEmpty :: (Typing.TypeSubst -> Typing.TypeSubst -> Typing.TypeSubst)
-composeTypeSubstNonEmpty s1 s2 =  
-  let isExtra = (\k -> \v -> Maybes.isNothing (Maps.lookup k (Typing.unTypeSubst s1))) 
-      withExtra = (Maps.filterWithKey isExtra (Typing.unTypeSubst s2))
-  in (Typing.TypeSubst (Maps.union withExtra (Maps.map (substInType s2) (Typing.unTypeSubst s1))))
+composeTypeSubstNonEmpty :: Typing.TypeSubst -> Typing.TypeSubst -> Typing.TypeSubst
+composeTypeSubstNonEmpty s1 s2 =
 
--- | Compose a list of type substitutions
-composeTypeSubstList :: ([Typing.TypeSubst] -> Typing.TypeSubst)
-composeTypeSubstList = (Lists.foldl composeTypeSubst idTypeSubst)
+      let isExtra = \k -> \v -> Maybes.isNothing (Maps.lookup k (Typing.unTypeSubst s1))
+          withExtra = Maps.filterWithKey isExtra (Typing.unTypeSubst s2)
+      in (Typing.TypeSubst (Maps.union withExtra (Maps.map (substInType s2) (Typing.unTypeSubst s1))))
 
 -- | The identity type substitution
 idTypeSubst :: Typing.TypeSubst
-idTypeSubst = (Typing.TypeSubst Maps.empty)
+idTypeSubst = Typing.TypeSubst Maps.empty
 
 -- | Create a type substitution with a single variable mapping
-singletonTypeSubst :: (Core.Name -> Core.Type -> Typing.TypeSubst)
-singletonTypeSubst v t = (Typing.TypeSubst (Maps.singleton v t))
-
--- | Apply a term substitution to a binding
-substituteInBinding :: (Typing.TermSubst -> Core.Binding -> Core.Binding)
-substituteInBinding subst b = Core.Binding {
-  Core.bindingName = (Core.bindingName b),
-  Core.bindingTerm = (substituteInTerm subst (Core.bindingTerm b)),
-  Core.bindingType = (Core.bindingType b)}
-
--- | Apply a type substitution to a type constraint
-substituteInConstraint :: (Typing.TypeSubst -> Typing.TypeConstraint -> Typing.TypeConstraint)
-substituteInConstraint subst c = Typing.TypeConstraint {
-  Typing.typeConstraintLeft = (substInType subst (Typing.typeConstraintLeft c)),
-  Typing.typeConstraintRight = (substInType subst (Typing.typeConstraintRight c)),
-  Typing.typeConstraintComment = (Typing.typeConstraintComment c)}
-
--- | Apply a type substitution to a list of type constraints
-substituteInConstraints :: (Typing.TypeSubst -> [Typing.TypeConstraint] -> [Typing.TypeConstraint])
-substituteInConstraints subst cs = (Lists.map (substituteInConstraint subst) cs)
+singletonTypeSubst :: Core.Name -> Core.Type -> Typing.TypeSubst
+singletonTypeSubst v t = Typing.TypeSubst (Maps.singleton v t)
 
 -- | Apply a type substitution to class constraints, propagating to free variables
-substInClassConstraints :: (Typing.TypeSubst -> M.Map Core.Name Core.TypeVariableMetadata -> M.Map Core.Name Core.TypeVariableMetadata)
-substInClassConstraints subst constraints =  
-  let substMap = (Typing.unTypeSubst subst)
-  in  
-    let insertOrMerge = (\varName -> \metadata -> \acc -> Maybes.maybe (Maps.insert varName metadata acc) (\existing ->  
-            let merged = Core.TypeVariableMetadata {
-                    Core.typeVariableMetadataClasses = (Sets.union (Core.typeVariableMetadataClasses existing) (Core.typeVariableMetadataClasses metadata))}
-            in (Maps.insert varName merged acc)) (Maps.lookup varName acc))
-    in (Lists.foldl (\acc -> \pair ->  
-      let varName = (Pairs.first pair)
-      in  
-        let metadata = (Pairs.second pair)
-        in (Maybes.maybe (insertOrMerge varName metadata acc) (\targetType ->  
-          let freeVars = (Sets.toList (Rewriting.freeVariablesInType targetType))
+substInClassConstraints :: Typing.TypeSubst -> M.Map Core.Name Core.TypeVariableMetadata -> M.Map Core.Name Core.TypeVariableMetadata
+substInClassConstraints subst constraints =
+
+      let substMap = Typing.unTypeSubst subst
+          insertOrMerge =
+                  \varName -> \metadata -> \acc -> Maybes.maybe (Maps.insert varName metadata acc) (\existing ->
+                    let merged =
+                            Core.TypeVariableMetadata {
+                              Core.typeVariableMetadataClasses = (Sets.union (Core.typeVariableMetadataClasses existing) (Core.typeVariableMetadataClasses metadata))}
+                    in (Maps.insert varName merged acc)) (Maps.lookup varName acc)
+      in (Lists.foldl (\acc -> \pair ->
+        let varName = Pairs.first pair
+            metadata = Pairs.second pair
+        in (Maybes.maybe (insertOrMerge varName metadata acc) (\targetType ->
+          let freeVars = Sets.toList (Rewriting.freeVariablesInType targetType)
           in (Lists.foldl (\acc2 -> \freeVar -> insertOrMerge freeVar metadata acc2) acc freeVars)) (Maps.lookup varName substMap))) Maps.empty (Maps.toList constraints))
 
--- | Apply a type substitution to an inference context
-substInContext :: (Typing.TypeSubst -> Typing.InferenceContext -> Typing.InferenceContext)
-substInContext subst cx =  
-  let newDataTypes = (Maps.map (substInTypeScheme subst) (Typing.inferenceContextDataTypes cx))
-  in  
-    let newClassConstraints = (substInClassConstraints subst (Typing.inferenceContextClassConstraints cx))
-    in Typing.InferenceContext {
-      Typing.inferenceContextSchemaTypes = (Typing.inferenceContextSchemaTypes cx),
-      Typing.inferenceContextPrimitiveTypes = (Typing.inferenceContextPrimitiveTypes cx),
-      Typing.inferenceContextDataTypes = newDataTypes,
-      Typing.inferenceContextClassConstraints = newClassConstraints,
-      Typing.inferenceContextDebug = (Typing.inferenceContextDebug cx)}
+-- | Apply a type substitution to a graph's bound types and class constraints
+substInContext :: Typing.TypeSubst -> Graph.Graph -> Graph.Graph
+substInContext subst cx =
 
--- | Apply a term substitution to a term
-substituteInTerm :: (Typing.TermSubst -> Core.Term -> Core.Term)
-substituteInTerm subst term0 =  
-  let s = (Typing.unTermSubst subst) 
-      rewrite = (\recurse -> \term ->  
-              let withLambda = (\l ->  
-                      let v = (Core.lambdaParameter l) 
-                          subst2 = (Typing.TermSubst (Maps.delete v s))
-                      in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = v,
-                        Core.lambdaDomain = (Core.lambdaDomain l),
-                        Core.lambdaBody = (substituteInTerm subst2 (Core.lambdaBody l))})))) 
-                  withLet = (\lt ->  
-                          let bindings = (Core.letBindings lt) 
-                              names = (Sets.fromList (Lists.map Core.bindingName bindings))
-                              subst2 = (Typing.TermSubst (Maps.filterWithKey (\k -> \v -> Logic.not (Sets.member k names)) s))
-                              rewriteBinding = (\b -> Core.Binding {
-                                      Core.bindingName = (Core.bindingName b),
-                                      Core.bindingTerm = (substituteInTerm subst2 (Core.bindingTerm b)),
-                                      Core.bindingType = (Core.bindingType b)})
-                          in (Core.TermLet (Core.Let {
-                            Core.letBindings = (Lists.map rewriteBinding bindings),
-                            Core.letBody = (substituteInTerm subst2 (Core.letBody lt))})))
-              in ((\x -> case x of
-                Core.TermFunction v1 -> ((\x -> case x of
-                  Core.FunctionLambda v2 -> (withLambda v2)
-                  _ -> (recurse term)) v1)
-                Core.TermLet v1 -> (withLet v1)
-                Core.TermVariable v1 -> (Maybes.maybe (recurse term) (\sterm -> sterm) (Maps.lookup v1 s))
-                _ -> (recurse term)) term))
-  in (Rewriting.rewriteTerm rewrite term0)
+      let newBoundTypes = Maps.map (substInTypeScheme subst) (Graph.graphBoundTypes cx)
+          newClassConstraints = substInClassConstraints subst (Graph.graphClassConstraints cx)
+          cx2 =
+                  Graph.Graph {
+                    Graph.graphBoundTerms = (Graph.graphBoundTerms cx),
+                    Graph.graphBoundTypes = newBoundTypes,
+                    Graph.graphClassConstraints = (Graph.graphClassConstraints cx),
+                    Graph.graphLambdaVariables = (Graph.graphLambdaVariables cx),
+                    Graph.graphMetadata = (Graph.graphMetadata cx),
+                    Graph.graphPrimitives = (Graph.graphPrimitives cx),
+                    Graph.graphSchemaTypes = (Graph.graphSchemaTypes cx),
+                    Graph.graphTypeVariables = (Graph.graphTypeVariables cx)}
+      in Graph.Graph {
+        Graph.graphBoundTerms = (Graph.graphBoundTerms cx2),
+        Graph.graphBoundTypes = (Graph.graphBoundTypes cx2),
+        Graph.graphClassConstraints = newClassConstraints,
+        Graph.graphLambdaVariables = (Graph.graphLambdaVariables cx2),
+        Graph.graphMetadata = (Graph.graphMetadata cx2),
+        Graph.graphPrimitives = (Graph.graphPrimitives cx2),
+        Graph.graphSchemaTypes = (Graph.graphSchemaTypes cx2),
+        Graph.graphTypeVariables = (Graph.graphTypeVariables cx2)}
 
 -- | Apply a type substitution to a type
-substInType :: (Typing.TypeSubst -> Core.Type -> Core.Type)
-substInType subst typ0 = (Logic.ifElse (Maps.null (Typing.unTypeSubst subst)) typ0 (substInTypeNonEmpty subst typ0))
+substInType :: Typing.TypeSubst -> Core.Type -> Core.Type
+substInType subst typ0 = Logic.ifElse (Maps.null (Typing.unTypeSubst subst)) typ0 (substInTypeNonEmpty subst typ0)
 
 -- | Apply a non-empty type substitution to a type (internal helper)
-substInTypeNonEmpty :: (Typing.TypeSubst -> Core.Type -> Core.Type)
-substInTypeNonEmpty subst typ0 =  
-  let rewrite = (\recurse -> \typ -> (\x -> case x of
-          Core.TypeForall v1 -> (Maybes.maybe (recurse typ) (\styp -> Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.forallTypeParameter v1),
-            Core.forallTypeBody = (substInType (removeVar (Core.forallTypeParameter v1)) (Core.forallTypeBody v1))})) (Maps.lookup (Core.forallTypeParameter v1) (Typing.unTypeSubst subst)))
-          Core.TypeVariable v1 -> (Maybes.maybe typ (\styp -> styp) (Maps.lookup v1 (Typing.unTypeSubst subst)))
-          _ -> (recurse typ)) typ) 
-      removeVar = (\v -> Typing.TypeSubst (Maps.delete v (Typing.unTypeSubst subst)))
-  in (Rewriting.rewriteType rewrite typ0)
+substInTypeNonEmpty :: Typing.TypeSubst -> Core.Type -> Core.Type
+substInTypeNonEmpty subst typ0 =
 
+      let rewrite =
+              \recurse -> \typ -> case typ of
+                Core.TypeForall v0 -> Maybes.maybe (recurse typ) (\styp -> Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.forallTypeParameter v0),
+                  Core.forallTypeBody = (substInType (removeVar (Core.forallTypeParameter v0)) (Core.forallTypeBody v0))})) (Maps.lookup (Core.forallTypeParameter v0) (Typing.unTypeSubst subst))
+                Core.TypeVariable v0 -> Maybes.maybe typ (\styp -> styp) (Maps.lookup v0 (Typing.unTypeSubst subst))
+                _ -> recurse typ
+          removeVar = \v -> Typing.TypeSubst (Maps.delete v (Typing.unTypeSubst subst))
+      in (Rewriting.rewriteType rewrite typ0)
+
 -- | Apply a type substitution to a type scheme
-substInTypeScheme :: (Typing.TypeSubst -> Core.TypeScheme -> Core.TypeScheme)
-substInTypeScheme subst ts = Core.TypeScheme {
-  Core.typeSchemeVariables = (Core.typeSchemeVariables ts),
-  Core.typeSchemeType = (substInType subst (Core.typeSchemeType ts)),
-  Core.typeSchemeConstraints = (Maybes.map (substInClassConstraints subst) (Core.typeSchemeConstraints ts))}
+substInTypeScheme :: Typing.TypeSubst -> Core.TypeScheme -> Core.TypeScheme
+substInTypeScheme subst ts =
+    Core.TypeScheme {
+      Core.typeSchemeVariables = (Core.typeSchemeVariables ts),
+      Core.typeSchemeType = (substInType subst (Core.typeSchemeType ts)),
+      Core.typeSchemeConstraints = (Maybes.map (substInClassConstraints subst) (Core.typeSchemeConstraints ts))}
 
 -- | Apply a type substitution to the type annotations within a term
-substTypesInTerm :: (Typing.TypeSubst -> Core.Term -> Core.Term)
-substTypesInTerm subst term0 =  
-  let rewrite = (\recurse -> \term ->  
-          let dflt = (recurse term) 
-              forFunction = (\f -> (\x -> case x of
-                      Core.FunctionElimination _ -> dflt
-                      Core.FunctionLambda v1 -> (forLambda v1)
-                      _ -> dflt) f)
-              forLambda = (\l -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.lambdaParameter l),
-                      Core.lambdaDomain = (Maybes.map (substInType subst) (Core.lambdaDomain l)),
-                      Core.lambdaBody = (substTypesInTerm subst (Core.lambdaBody l))})))
-              forLet = (\l ->  
-                      let rewriteBinding = (\b -> Core.Binding {
-                              Core.bindingName = (Core.bindingName b),
-                              Core.bindingTerm = (substTypesInTerm subst (Core.bindingTerm b)),
-                              Core.bindingType = (Maybes.map (substInTypeScheme subst) (Core.bindingType b))})
-                      in (Core.TermLet (Core.Let {
-                        Core.letBindings = (Lists.map rewriteBinding (Core.letBindings l)),
-                        Core.letBody = (substTypesInTerm subst (Core.letBody l))})))
-              forTypeApplication = (\tt -> Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (substTypesInTerm subst (Core.typeApplicationTermBody tt)),
-                      Core.typeApplicationTermType = (substInType subst (Core.typeApplicationTermType tt))}))
-              forTypeLambda = (\ta ->  
-                      let param = (Core.typeLambdaParameter ta) 
-                          subst2 = (Typing.TypeSubst (Maps.delete param (Typing.unTypeSubst subst)))
-                      in (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = param,
-                        Core.typeLambdaBody = (substTypesInTerm subst2 (Core.typeLambdaBody ta))})))
-          in ((\x -> case x of
-            Core.TermFunction v1 -> (forFunction v1)
-            Core.TermLet v1 -> (forLet v1)
-            Core.TermTypeApplication v1 -> (forTypeApplication v1)
-            Core.TermTypeLambda v1 -> (forTypeLambda v1)
-            _ -> dflt) term))
-  in (Rewriting.rewriteTerm rewrite term0)
+substTypesInTerm :: Typing.TypeSubst -> Core.Term -> Core.Term
+substTypesInTerm subst term0 =
+
+      let rewrite =
+              \recurse -> \term ->
+                let dflt = recurse term
+                    forFunction =
+                            \f -> case f of
+                              Core.FunctionElimination _ -> dflt
+                              Core.FunctionLambda v0 -> forLambda v0
+                              _ -> dflt
+                    forLambda =
+                            \l -> Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.lambdaParameter l),
+                              Core.lambdaDomain = (Maybes.map (substInType subst) (Core.lambdaDomain l)),
+                              Core.lambdaBody = (substTypesInTerm subst (Core.lambdaBody l))}))
+                    forLet =
+                            \l ->
+                              let rewriteBinding =
+                                      \b -> Core.Binding {
+                                        Core.bindingName = (Core.bindingName b),
+                                        Core.bindingTerm = (substTypesInTerm subst (Core.bindingTerm b)),
+                                        Core.bindingType = (Maybes.map (substInTypeScheme subst) (Core.bindingType b))}
+                              in (Core.TermLet (Core.Let {
+                                Core.letBindings = (Lists.map rewriteBinding (Core.letBindings l)),
+                                Core.letBody = (substTypesInTerm subst (Core.letBody l))}))
+                    forTypeApplication =
+                            \tt -> Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (substTypesInTerm subst (Core.typeApplicationTermBody tt)),
+                              Core.typeApplicationTermType = (substInType subst (Core.typeApplicationTermType tt))})
+                    forTypeLambda =
+                            \ta ->
+                              let param = Core.typeLambdaParameter ta
+                                  subst2 = Typing.TypeSubst (Maps.delete param (Typing.unTypeSubst subst))
+                              in (Core.TermTypeLambda (Core.TypeLambda {
+                                Core.typeLambdaParameter = param,
+                                Core.typeLambdaBody = (substTypesInTerm subst2 (Core.typeLambdaBody ta))}))
+                in case term of
+                  Core.TermFunction v0 -> forFunction v0
+                  Core.TermLet v0 -> forLet v0
+                  Core.TermTypeApplication v0 -> forTypeApplication v0
+                  Core.TermTypeLambda v0 -> forTypeLambda v0
+                  _ -> dflt
+      in (Rewriting.rewriteTerm rewrite term0)
+
+-- | Apply a term substitution to a binding
+substituteInBinding :: Typing.TermSubst -> Core.Binding -> Core.Binding
+substituteInBinding subst b =
+    Core.Binding {
+      Core.bindingName = (Core.bindingName b),
+      Core.bindingTerm = (substituteInTerm subst (Core.bindingTerm b)),
+      Core.bindingType = (Core.bindingType b)}
+
+-- | Apply a type substitution to a type constraint
+substituteInConstraint :: Typing.TypeSubst -> Typing.TypeConstraint -> Typing.TypeConstraint
+substituteInConstraint subst c =
+    Typing.TypeConstraint {
+      Typing.typeConstraintLeft = (substInType subst (Typing.typeConstraintLeft c)),
+      Typing.typeConstraintRight = (substInType subst (Typing.typeConstraintRight c)),
+      Typing.typeConstraintComment = (Typing.typeConstraintComment c)}
+
+-- | Apply a type substitution to a list of type constraints
+substituteInConstraints :: Typing.TypeSubst -> [Typing.TypeConstraint] -> [Typing.TypeConstraint]
+substituteInConstraints subst cs = Lists.map (substituteInConstraint subst) cs
+
+-- | Apply a term substitution to a term
+substituteInTerm :: Typing.TermSubst -> Core.Term -> Core.Term
+substituteInTerm subst term0 =
+
+      let s = Typing.unTermSubst subst
+          rewrite =
+                  \recurse -> \term ->
+                    let withLambda =
+                            \l ->
+                              let v = Core.lambdaParameter l
+                                  subst2 = Typing.TermSubst (Maps.delete v s)
+                              in (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = v,
+                                Core.lambdaDomain = (Core.lambdaDomain l),
+                                Core.lambdaBody = (substituteInTerm subst2 (Core.lambdaBody l))})))
+                        withLet =
+                                \lt ->
+                                  let bindings = Core.letBindings lt
+                                      names = Sets.fromList (Lists.map Core.bindingName bindings)
+                                      subst2 = Typing.TermSubst (Maps.filterWithKey (\k -> \v -> Logic.not (Sets.member k names)) s)
+                                      rewriteBinding =
+                                              \b -> Core.Binding {
+                                                Core.bindingName = (Core.bindingName b),
+                                                Core.bindingTerm = (substituteInTerm subst2 (Core.bindingTerm b)),
+                                                Core.bindingType = (Core.bindingType b)}
+                                  in (Core.TermLet (Core.Let {
+                                    Core.letBindings = (Lists.map rewriteBinding bindings),
+                                    Core.letBody = (substituteInTerm subst2 (Core.letBody lt))}))
+                    in case term of
+                      Core.TermFunction v0 -> case v0 of
+                        Core.FunctionLambda v1 -> withLambda v1
+                        _ -> recurse term
+                      Core.TermLet v0 -> withLet v0
+                      Core.TermVariable v0 -> Maybes.maybe (recurse term) (\sterm -> sterm) (Maps.lookup v0 s)
+                      _ -> recurse term
+      in (Rewriting.rewriteTerm rewrite term0)
diff --git a/src/gen-main/haskell/Hydra/Tabular.hs b/src/gen-main/haskell/Hydra/Tabular.hs
--- a/src/gen-main/haskell/Hydra/Tabular.hs
+++ b/src/gen-main/haskell/Hydra/Tabular.hs
@@ -14,36 +14,36 @@
 import qualified Data.Set as S
 
 -- | A column type, consisting of a name and a value type
-data ColumnType = 
+data ColumnType =
   ColumnType {
     columnTypeName :: Relational.ColumnName,
     columnTypeType :: Core.Type}
   deriving (Eq, Ord, Read, Show)
 
-_ColumnType = (Core.Name "hydra.tabular.ColumnType")
+_ColumnType = Core.Name "hydra.tabular.ColumnType"
 
-_ColumnType_name = (Core.Name "name")
+_ColumnType_name = Core.Name "name"
 
-_ColumnType_type = (Core.Name "type")
+_ColumnType_type = Core.Name "type"
 
 -- | A data row, containing optional-valued cells; one per column
-newtype DataRow v = 
+newtype DataRow v =
   DataRow {
     unDataRow :: [Maybe v]}
   deriving (Eq, Ord, Read, Show)
 
-_DataRow = (Core.Name "hydra.tabular.DataRow")
+_DataRow = Core.Name "hydra.tabular.DataRow"
 
 -- | A header row, containing column names (but no types or data)
-newtype HeaderRow = 
+newtype HeaderRow =
   HeaderRow {
     unHeaderRow :: [String]}
   deriving (Eq, Ord, Read, Show)
 
-_HeaderRow = (Core.Name "hydra.tabular.HeaderRow")
+_HeaderRow = Core.Name "hydra.tabular.HeaderRow"
 
 -- | A simple table as in a CSV file, having an optional header row and any number of data rows
-data Table v = 
+data Table v =
   Table {
     -- | The optional header row of the table. If present, the header must have the same number of cells as each data row.
     tableHeader :: (Maybe HeaderRow),
@@ -51,21 +51,21 @@
     tableData :: [DataRow v]}
   deriving (Eq, Ord, Read, Show)
 
-_Table = (Core.Name "hydra.tabular.Table")
+_Table = Core.Name "hydra.tabular.Table"
 
-_Table_header = (Core.Name "header")
+_Table_header = Core.Name "header"
 
-_Table_data = (Core.Name "data")
+_Table_data = Core.Name "data"
 
 -- | A type definition for a table, including column names and types
-data TableType = 
+data TableType =
   TableType {
     tableTypeName :: Relational.RelationName,
     tableTypeColumns :: [ColumnType]}
   deriving (Eq, Ord, Read, Show)
 
-_TableType = (Core.Name "hydra.tabular.TableType")
+_TableType = Core.Name "hydra.tabular.TableType"
 
-_TableType_name = (Core.Name "name")
+_TableType_name = Core.Name "name"
 
-_TableType_columns = (Core.Name "columns")
+_TableType_columns = Core.Name "columns"
diff --git a/src/gen-main/haskell/Hydra/Tarjan.hs b/src/gen-main/haskell/Hydra/Tarjan.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Tarjan.hs
+++ /dev/null
@@ -1,159 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | This implementation of Tarjan's algorithm was originally based on GraphSCC by Iavor S. Diatchki: https://hackage.haskell.org/package/GraphSCC.
-
-module Hydra.Tarjan where
-
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Constants as Constants
-import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Lists as Lists
-import qualified Hydra.Lib.Logic as Logic
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Math as Math
-import qualified Hydra.Lib.Maybes as Maybes
-import qualified Hydra.Lib.Pairs as Pairs
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Topology as Topology
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Given a list of adjacency lists represented as (key, [key]) pairs, construct a graph along with a function mapping each vertex (an Int) back to its original key.
-adjacencyListsToGraph :: Ord t0 => ([(t0, [t0])] -> (M.Map Int [Int], (Int -> t0)))
-adjacencyListsToGraph edges0 =  
-  let sortedEdges = (Lists.sortOn Pairs.first edges0)
-  in  
-    let indexedEdges = (Lists.zip (Math.range 0 (Lists.length sortedEdges)) sortedEdges)
-    in  
-      let keyToVertex = (Maps.fromList (Lists.map (\vkNeighbors ->  
-              let v = (Pairs.first vkNeighbors)
-              in  
-                let kNeighbors = (Pairs.second vkNeighbors)
-                in  
-                  let k = (Pairs.first kNeighbors)
-                  in (k, v)) indexedEdges))
-      in  
-        let vertexMap = (Maps.fromList (Lists.map (\vkNeighbors ->  
-                let v = (Pairs.first vkNeighbors)
-                in  
-                  let kNeighbors = (Pairs.second vkNeighbors)
-                  in  
-                    let k = (Pairs.first kNeighbors)
-                    in (v, k)) indexedEdges))
-        in  
-          let graph = (Maps.fromList (Lists.map (\vkNeighbors ->  
-                  let v = (Pairs.first vkNeighbors)
-                  in  
-                    let kNeighbors = (Pairs.second vkNeighbors)
-                    in  
-                      let neighbors = (Pairs.second kNeighbors)
-                      in (v, (Maybes.mapMaybe (\k -> Maps.lookup k keyToVertex) neighbors))) indexedEdges))
-          in  
-            let vertexToKey = (\v -> Maybes.fromJust (Maps.lookup v vertexMap))
-            in (graph, vertexToKey)
-
--- | Compute the strongly connected components of the given graph. The components are returned in reverse topological order
-stronglyConnectedComponents :: (M.Map Int [Int] -> [[Int]])
-stronglyConnectedComponents graph =  
-  let verts = (Maps.keys graph)
-  in  
-    let processVertex = (\v -> Flows.bind (Flows.map (\st -> Maps.member v (Topology.tarjanStateIndices st)) Monads.getState) (\visited -> Logic.ifElse (Logic.not visited) (strongConnect graph v) (Flows.pure ())))
-    in  
-      let finalState = (Monads.exec (Flows.mapList processVertex verts) initialState)
-      in (Lists.reverse (Lists.map Lists.sort (Topology.tarjanStateSccs finalState)))
-
--- | Initial state for Tarjan's algorithm
-initialState :: Topology.TarjanState
-initialState = Topology.TarjanState {
-  Topology.tarjanStateCounter = 0,
-  Topology.tarjanStateIndices = Maps.empty,
-  Topology.tarjanStateLowLinks = Maps.empty,
-  Topology.tarjanStateStack = [],
-  Topology.tarjanStateOnStack = Sets.empty,
-  Topology.tarjanStateSccs = []}
-
--- | Pop vertices off the stack until the given vertex is reached, collecting the current strongly connected component
-popStackUntil :: (Int -> Compute.Flow Topology.TarjanState [Int])
-popStackUntil v =  
-  let go = (\acc ->  
-          let succeed = (\st ->  
-                  let x = (Lists.head (Topology.tarjanStateStack st))
-                  in  
-                    let xs = (Lists.tail (Topology.tarjanStateStack st))
-                    in  
-                      let newSt = Topology.TarjanState {
-                              Topology.tarjanStateCounter = (Topology.tarjanStateCounter st),
-                              Topology.tarjanStateIndices = (Topology.tarjanStateIndices st),
-                              Topology.tarjanStateLowLinks = (Topology.tarjanStateLowLinks st),
-                              Topology.tarjanStateStack = xs,
-                              Topology.tarjanStateOnStack = (Topology.tarjanStateOnStack st),
-                              Topology.tarjanStateSccs = (Topology.tarjanStateSccs st)}
-                      in  
-                        let newSt2 = Topology.TarjanState {
-                                Topology.tarjanStateCounter = (Topology.tarjanStateCounter newSt),
-                                Topology.tarjanStateIndices = (Topology.tarjanStateIndices newSt),
-                                Topology.tarjanStateLowLinks = (Topology.tarjanStateLowLinks newSt),
-                                Topology.tarjanStateStack = (Topology.tarjanStateStack newSt),
-                                Topology.tarjanStateOnStack = (Sets.delete x (Topology.tarjanStateOnStack st)),
-                                Topology.tarjanStateSccs = (Topology.tarjanStateSccs newSt)}
-                        in  
-                          let acc_ = (Lists.cons x acc)
-                          in (Flows.bind (Monads.putState newSt2) (\_ -> Logic.ifElse (Equality.equal x v) (Flows.pure (Lists.reverse acc_)) (go acc_))))
-          in (Flows.bind Monads.getState (\st -> Logic.ifElse (Lists.null (Topology.tarjanStateStack st)) (Flows.fail "popStackUntil: empty stack") (succeed st))))
-  in (go [])
-
--- | Visit a vertex and recursively explore its successors
-strongConnect :: (M.Map Int [Int] -> Int -> Compute.Flow Topology.TarjanState ())
-strongConnect graph v = (Flows.bind Monads.getState (\st ->  
-  let i = (Topology.tarjanStateCounter st)
-  in  
-    let newSt = Topology.TarjanState {
-            Topology.tarjanStateCounter = (Math.add i 1),
-            Topology.tarjanStateIndices = (Maps.insert v i (Topology.tarjanStateIndices st)),
-            Topology.tarjanStateLowLinks = (Maps.insert v i (Topology.tarjanStateLowLinks st)),
-            Topology.tarjanStateStack = (Lists.cons v (Topology.tarjanStateStack st)),
-            Topology.tarjanStateOnStack = (Sets.insert v (Topology.tarjanStateOnStack st)),
-            Topology.tarjanStateSccs = (Topology.tarjanStateSccs st)}
-    in  
-      let neighbors = (Maps.findWithDefault [] v graph)
-      in  
-        let processNeighbor = (\w ->  
-                let lowLink = (\st_ ->  
-                        let low_v = (Maps.findWithDefault Constants.maxInt32 v (Topology.tarjanStateLowLinks st_))
-                        in  
-                          let idx_w = (Maps.findWithDefault Constants.maxInt32 w (Topology.tarjanStateIndices st_))
-                          in (Flows.bind (Monads.modify (\s -> Topology.TarjanState {
-                            Topology.tarjanStateCounter = (Topology.tarjanStateCounter s),
-                            Topology.tarjanStateIndices = (Topology.tarjanStateIndices s),
-                            Topology.tarjanStateLowLinks = (Maps.insert v (Equality.min low_v idx_w) (Topology.tarjanStateLowLinks s)),
-                            Topology.tarjanStateStack = (Topology.tarjanStateStack s),
-                            Topology.tarjanStateOnStack = (Topology.tarjanStateOnStack s),
-                            Topology.tarjanStateSccs = (Topology.tarjanStateSccs s)})) (\_ -> Flows.pure ())))
-                in (Flows.bind Monads.getState (\st_ -> Logic.ifElse (Logic.not (Maps.member w (Topology.tarjanStateIndices st_))) (Flows.bind (strongConnect graph w) (\_ -> Flows.bind Monads.getState (\stAfter ->  
-                  let low_v = (Maps.findWithDefault Constants.maxInt32 v (Topology.tarjanStateLowLinks stAfter))
-                  in  
-                    let low_w = (Maps.findWithDefault Constants.maxInt32 w (Topology.tarjanStateLowLinks stAfter))
-                    in (Flows.bind (Monads.modify (\s -> Topology.TarjanState {
-                      Topology.tarjanStateCounter = (Topology.tarjanStateCounter s),
-                      Topology.tarjanStateIndices = (Topology.tarjanStateIndices s),
-                      Topology.tarjanStateLowLinks = (Maps.insert v (Equality.min low_v low_w) (Topology.tarjanStateLowLinks s)),
-                      Topology.tarjanStateStack = (Topology.tarjanStateStack s),
-                      Topology.tarjanStateOnStack = (Topology.tarjanStateOnStack s),
-                      Topology.tarjanStateSccs = (Topology.tarjanStateSccs s)})) (\_ -> Flows.pure ()))))) (Logic.ifElse (Sets.member w (Topology.tarjanStateOnStack st_)) (lowLink st_) (Flows.pure ())))))
-        in (Flows.bind (Monads.putState newSt) (\_ -> Flows.bind (Flows.mapList processNeighbor neighbors) (\_ -> Flows.bind Monads.getState (\stFinal ->  
-          let low_v = (Maps.findWithDefault Constants.maxInt32 v (Topology.tarjanStateLowLinks stFinal))
-          in  
-            let idx_v = (Maps.findWithDefault Constants.maxInt32 v (Topology.tarjanStateIndices stFinal))
-            in (Logic.ifElse (Equality.equal low_v idx_v) (Flows.bind (popStackUntil v) (\comp -> Flows.bind (Monads.modify (\s -> Topology.TarjanState {
-              Topology.tarjanStateCounter = (Topology.tarjanStateCounter s),
-              Topology.tarjanStateIndices = (Topology.tarjanStateIndices s),
-              Topology.tarjanStateLowLinks = (Topology.tarjanStateLowLinks s),
-              Topology.tarjanStateStack = (Topology.tarjanStateStack s),
-              Topology.tarjanStateOnStack = (Topology.tarjanStateOnStack s),
-              Topology.tarjanStateSccs = (Lists.cons comp (Topology.tarjanStateSccs s))})) (\_ -> Flows.pure ()))) (Flows.pure ()))))))))
diff --git a/src/gen-main/haskell/Hydra/Templates.hs b/src/gen-main/haskell/Hydra/Templates.hs
--- a/src/gen-main/haskell/Hydra/Templates.hs
+++ b/src/gen-main/haskell/Hydra/Templates.hs
@@ -4,19 +4,18 @@
 
 module Hydra.Templates where
 
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
 import qualified Hydra.Decode.Core as Core_
+import qualified Hydra.Errors as Errors
 import qualified Hydra.Graph as Graph
-import qualified Hydra.Lib.Flows as Flows
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Monads as Monads
 import qualified Hydra.Show.Core as Core__
-import qualified Hydra.Util as Util
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -24,75 +23,76 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
--- | Create a graph schema from a graph which contains nothing but encoded type definitions
-graphToSchema :: (Graph.Graph -> Compute.Flow Graph.Graph (M.Map Core.Name Core.Type))
-graphToSchema g =  
-  let toPair = (\el ->  
-          let name = (Core.bindingName el)
-          in (Flows.bind Monads.getState (\cx -> Flows.bind (Monads.withTrace "graph to schema" (Monads.eitherToFlow Util.unDecodingError (Core_.type_ cx (Core.bindingTerm el)))) (\t -> Flows.pure (name, t)))))
-  in (Flows.bind (Flows.mapList toPair (Graph.graphElements g)) (\pairs -> Flows.pure (Maps.fromList pairs)))
+-- | Decode a list of type-encoding bindings into a map of named types
+graphToSchema :: Context.Context -> Graph.Graph -> [Core.Binding] -> Either (Context.InContext Errors.DecodingError) (M.Map Core.Name Core.Type)
+graphToSchema cx graph els =
 
--- | Given a graph schema and a nonrecursive type, instantiate it with default values. If the minimal flag is set, the smallest possible term is produced; otherwise, exactly one subterm is produced for constructors which do not otherwise require one, e.g. in lists and optionals
-instantiateTemplate :: (Bool -> M.Map Core.Name Core.Type -> Core.Type -> Compute.Flow t0 Core.Term)
-instantiateTemplate minimal schema t =  
-  let inst = (instantiateTemplate minimal schema)
-  in  
-    let noPoly = (Flows.fail "Polymorphic and function types are not currently supported")
-    in  
-      let forFloat = (\ft -> (\x -> case x of
-              Core.FloatTypeBigfloat -> (Core.FloatValueBigfloat 0.0)
-              Core.FloatTypeFloat32 -> (Core.FloatValueFloat32 0.0)
-              Core.FloatTypeFloat64 -> (Core.FloatValueFloat64 0.0)) ft)
-      in  
-        let forInteger = (\it -> (\x -> case x of
-                Core.IntegerTypeBigint -> (Core.IntegerValueBigint 0)
-                Core.IntegerTypeInt8 -> (Core.IntegerValueInt8 0)
-                Core.IntegerTypeInt16 -> (Core.IntegerValueInt16 0)
-                Core.IntegerTypeInt32 -> (Core.IntegerValueInt32 0)
-                Core.IntegerTypeInt64 -> (Core.IntegerValueInt64 0)
-                Core.IntegerTypeUint8 -> (Core.IntegerValueUint8 0)
-                Core.IntegerTypeUint16 -> (Core.IntegerValueUint16 0)
-                Core.IntegerTypeUint32 -> (Core.IntegerValueUint32 0)
-                Core.IntegerTypeUint64 -> (Core.IntegerValueUint64 0)) it)
-        in  
-          let forLiteral = (\lt -> (\x -> case x of
-                  Core.LiteralTypeBinary -> (Core.LiteralString "")
-                  Core.LiteralTypeBoolean -> (Core.LiteralBoolean False)
-                  Core.LiteralTypeInteger v1 -> (Core.LiteralInteger (forInteger v1))
-                  Core.LiteralTypeFloat v1 -> (Core.LiteralFloat (forFloat v1))
-                  Core.LiteralTypeString -> (Core.LiteralString "")) lt)
-          in ((\x -> case x of
-            Core.TypeAnnotated v1 -> (inst (Core.annotatedTypeBody v1))
-            Core.TypeApplication _ -> noPoly
-            Core.TypeFunction _ -> noPoly
-            Core.TypeForall _ -> noPoly
-            Core.TypeList v1 -> (Logic.ifElse minimal (Flows.pure (Core.TermList [])) (Flows.bind (inst v1) (\e -> Flows.pure (Core.TermList [
-              e]))))
-            Core.TypeLiteral v1 -> (Flows.pure (Core.TermLiteral (forLiteral v1)))
-            Core.TypeMap v1 ->  
-              let kt = (Core.mapTypeKeys v1)
-              in  
-                let vt = (Core.mapTypeValues v1)
-                in (Logic.ifElse minimal (Flows.pure (Core.TermMap Maps.empty)) (Flows.bind (inst kt) (\ke -> Flows.bind (inst vt) (\ve -> Flows.pure (Core.TermMap (Maps.singleton ke ve))))))
-            Core.TypeMaybe v1 -> (Logic.ifElse minimal (Flows.pure (Core.TermMaybe Nothing)) (Flows.bind (inst v1) (\e -> Flows.pure (Core.TermMaybe (Just e)))))
-            Core.TypeRecord v1 ->  
-              let tname = (Core.rowTypeTypeName v1)
-              in  
-                let fields = (Core.rowTypeFields v1)
-                in  
-                  let toField = (\ft -> Flows.bind (inst (Core.fieldTypeType ft)) (\e -> Flows.pure (Core.Field {
-                          Core.fieldName = (Core.fieldTypeName ft),
-                          Core.fieldTerm = e})))
-                  in (Flows.bind (Flows.mapList toField fields) (\dfields -> Flows.pure (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = tname,
-                    Core.recordFields = dfields}))))
-            Core.TypeSet v1 -> (Logic.ifElse minimal (Flows.pure (Core.TermSet Sets.empty)) (Flows.bind (inst v1) (\e -> Flows.pure (Core.TermSet (Sets.fromList [
-              e])))))
-            Core.TypeVariable v1 -> (Maybes.maybe (Flows.fail (Strings.cat2 "Type variable " (Strings.cat2 (Core__.term (Core.TermVariable v1)) " not found in schema"))) inst (Maps.lookup v1 schema))
-            Core.TypeWrap v1 ->  
-              let tname = (Core.wrappedTypeTypeName v1)
-              in  
-                let t_ = (Core.wrappedTypeBody v1)
-                in (Flows.bind (inst t_) (\e -> Flows.pure (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = tname,
-                  Core.wrappedTermBody = e}))))) t)
+      let toPair =
+              \el ->
+                let name = Core.bindingName el
+                in (Eithers.bind (Eithers.bimap (\_wc_e -> Context.InContext {
+                  Context.inContextObject = _wc_e,
+                  Context.inContextContext = cx}) (\_wc_a -> _wc_a) (Core_.type_ graph (Core.bindingTerm el))) (\t -> Right (name, t)))
+      in (Eithers.bind (Eithers.mapList toPair els) (\pairs -> Right (Maps.fromList pairs)))
+
+-- | Given a graph schema and a nonrecursive type, instantiate it with default values. If the minimal flag is set, the smallest possible term is produced; otherwise, exactly one subterm is produced for constructors which do not otherwise require one, e.g. in lists and optionals. The name parameter provides the element name for nominal type construction.
+instantiateTemplate :: Context.Context -> Bool -> M.Map Core.Name Core.Type -> Core.Name -> Core.Type -> Either (Context.InContext Errors.Error) Core.Term
+instantiateTemplate cx minimal schema tname t =
+
+      let inst = \tn -> instantiateTemplate cx minimal schema tn
+          noPoly =
+                  Left (Context.InContext {
+                    Context.inContextObject = (Errors.ErrorOther (Errors.OtherError "Polymorphic and function types are not currently supported")),
+                    Context.inContextContext = cx})
+          forFloat =
+                  \ft -> case ft of
+                    Core.FloatTypeBigfloat -> Core.FloatValueBigfloat 0.0
+                    Core.FloatTypeFloat32 -> Core.FloatValueFloat32 0.0
+                    Core.FloatTypeFloat64 -> Core.FloatValueFloat64 0.0
+          forInteger =
+                  \it -> case it of
+                    Core.IntegerTypeBigint -> Core.IntegerValueBigint 0
+                    Core.IntegerTypeInt8 -> Core.IntegerValueInt8 0
+                    Core.IntegerTypeInt16 -> Core.IntegerValueInt16 0
+                    Core.IntegerTypeInt32 -> Core.IntegerValueInt32 0
+                    Core.IntegerTypeInt64 -> Core.IntegerValueInt64 0
+                    Core.IntegerTypeUint8 -> Core.IntegerValueUint8 0
+                    Core.IntegerTypeUint16 -> Core.IntegerValueUint16 0
+                    Core.IntegerTypeUint32 -> Core.IntegerValueUint32 0
+                    Core.IntegerTypeUint64 -> Core.IntegerValueUint64 0
+          forLiteral =
+                  \lt -> case lt of
+                    Core.LiteralTypeBinary -> Core.LiteralString ""
+                    Core.LiteralTypeBoolean -> Core.LiteralBoolean False
+                    Core.LiteralTypeInteger v0 -> Core.LiteralInteger (forInteger v0)
+                    Core.LiteralTypeFloat v0 -> Core.LiteralFloat (forFloat v0)
+                    Core.LiteralTypeString -> Core.LiteralString ""
+      in case t of
+        Core.TypeAnnotated v0 -> inst tname (Core.annotatedTypeBody v0)
+        Core.TypeApplication _ -> noPoly
+        Core.TypeFunction _ -> noPoly
+        Core.TypeForall _ -> noPoly
+        Core.TypeList v0 -> Logic.ifElse minimal (Right (Core.TermList [])) (Eithers.bind (inst tname v0) (\e -> Right (Core.TermList [
+          e])))
+        Core.TypeLiteral v0 -> Right (Core.TermLiteral (forLiteral v0))
+        Core.TypeMap v0 ->
+          let kt = Core.mapTypeKeys v0
+              vt = Core.mapTypeValues v0
+          in (Logic.ifElse minimal (Right (Core.TermMap Maps.empty)) (Eithers.bind (inst tname kt) (\ke -> Eithers.bind (inst tname vt) (\ve -> Right (Core.TermMap (Maps.singleton ke ve))))))
+        Core.TypeMaybe v0 -> Logic.ifElse minimal (Right (Core.TermMaybe Nothing)) (Eithers.bind (inst tname v0) (\e -> Right (Core.TermMaybe (Just e))))
+        Core.TypeRecord v0 ->
+          let toField =
+                  \ft -> Eithers.bind (inst tname (Core.fieldTypeType ft)) (\e -> Right (Core.Field {
+                    Core.fieldName = (Core.fieldTypeName ft),
+                    Core.fieldTerm = e}))
+          in (Eithers.bind (Eithers.mapList toField v0) (\dfields -> Right (Core.TermRecord (Core.Record {
+            Core.recordTypeName = tname,
+            Core.recordFields = dfields}))))
+        Core.TypeSet v0 -> Logic.ifElse minimal (Right (Core.TermSet Sets.empty)) (Eithers.bind (inst tname v0) (\e -> Right (Core.TermSet (Sets.fromList [
+          e]))))
+        Core.TypeVariable v0 -> Maybes.maybe (Left (Context.InContext {
+          Context.inContextObject = (Errors.ErrorOther (Errors.OtherError (Strings.cat2 "Type variable " (Strings.cat2 (Core__.term (Core.TermVariable v0)) " not found in schema")))),
+          Context.inContextContext = cx})) (inst v0) (Maps.lookup v0 schema)
+        Core.TypeWrap v0 -> Eithers.bind (inst tname v0) (\e -> Right (Core.TermWrap (Core.WrappedTerm {
+          Core.wrappedTermTypeName = tname,
+          Core.wrappedTermBody = e})))
diff --git a/src/gen-main/haskell/Hydra/Test/Transform.hs b/src/gen-main/haskell/Hydra/Test/Transform.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Test/Transform.hs
@@ -0,0 +1,172 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Transform test cases for code generation, filtering to tests that can be compiled to target languages
+
+module Hydra.Test.Transform where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Module as Module
+import qualified Hydra.Testing as Testing
+import qualified Hydra.Util as Util
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Add generation namespace prefix
+addGenerationPrefix :: Module.Namespace -> Module.Namespace
+addGenerationPrefix ns_ = Module.Namespace (Strings.cat2 "generation." (Module.unNamespace ns_))
+
+-- | Build a Term representing a convertCase function call
+buildConvertCaseCall :: Util.CaseConvention -> Util.CaseConvention -> String -> Core.Term
+buildConvertCaseCall fromConv toConv input_ =
+    Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermApplication (Core.Application {
+        Core.applicationFunction = (Core.TermApplication (Core.Application {
+          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.formatting.convertCase")),
+          Core.applicationArgument = (encodeCaseConvention fromConv)})),
+        Core.applicationArgument = (encodeCaseConvention toConv)})),
+      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString input_))})
+
+-- | Build a Term representing a topologicalSort function call
+buildTopologicalSortCall :: [(Int, [Int])] -> Core.Term
+buildTopologicalSortCall adjList =
+    Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.sorting.topologicalSort")),
+      Core.applicationArgument = (encodeAdjacencyList adjList)})
+
+-- | Build a Term representing a topologicalSortComponents function call
+buildTopologicalSortSCCCall :: [(Int, [Int])] -> Core.Term
+buildTopologicalSortSCCCall adjList =
+    Core.TermApplication (Core.Application {
+      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.sorting.topologicalSortComponents")),
+      Core.applicationArgument = (encodeAdjacencyList adjList)})
+
+-- | Collect all test cases from a test group (flattening hierarchy)
+collectTestCases :: Testing.TestGroup -> [Testing.TestCaseWithMetadata]
+collectTestCases tg =
+    Lists.concat2 (Testing.testGroupCases tg) (Lists.concat (Lists.map (\sg -> collectTestCases sg) (Testing.testGroupSubgroups tg)))
+
+-- | Encode an adjacency list as a Term
+encodeAdjacencyList :: [(Int, [Int])] -> Core.Term
+encodeAdjacencyList pairs =
+    Core.TermList (Lists.map (\p -> Core.TermPair (encodeInt (Pairs.first p), (Core.TermList (Lists.map (\d -> encodeInt d) (Pairs.second p))))) pairs)
+
+-- | Encode CaseConvention as a Term (unit variant)
+encodeCaseConvention :: Util.CaseConvention -> Core.Term
+encodeCaseConvention conv =
+    Core.TermUnion (Core.Injection {
+      Core.injectionTypeName = (Core.Name "hydra.util.CaseConvention"),
+      Core.injectionField = Core.Field {
+        Core.fieldName = case conv of
+          Util.CaseConventionLowerSnake -> Core.Name "lowerSnake"
+          Util.CaseConventionUpperSnake -> Core.Name "upperSnake"
+          Util.CaseConventionCamel -> Core.Name "camel"
+          Util.CaseConventionPascal -> Core.Name "pascal",
+        Core.fieldTerm = Core.TermUnit}})
+
+-- | Encode Either [[Int]] [Int] as a Term
+encodeEitherListList :: Either [[Int]] [Int] -> Core.Term
+encodeEitherListList e =
+    Core.TermEither (Eithers.bimap (\cycles -> encodeListList cycles) (\sorted -> encodeIntList sorted) e)
+
+-- | Encode an Int as a Term
+encodeInt :: Int -> Core.Term
+encodeInt n = Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 n))
+
+-- | Encode [Int] as a Term
+encodeIntList :: [Int] -> Core.Term
+encodeIntList ints = Core.TermList (Lists.map (\n -> encodeInt n) ints)
+
+-- | Encode [[Int]] as a Term
+encodeListList :: [[Int]] -> Core.Term
+encodeListList lists = Core.TermList (Lists.map (\l -> encodeIntList l) lists)
+
+-- | Transform module with generation namespace
+transformModule :: Module.Module -> Module.Module
+transformModule m =
+    Module.Module {
+      Module.moduleNamespace = (addGenerationPrefix (Module.moduleNamespace m)),
+      Module.moduleDefinitions = (Module.moduleDefinitions m),
+      Module.moduleTermDependencies = (Module.moduleTermDependencies m),
+      Module.moduleTypeDependencies = (Module.moduleTypeDependencies m),
+      Module.moduleDescription = (Module.moduleDescription m)}
+
+-- | Transform a test case to DelegatedEvaluationTestCase if applicable
+transformTestCase :: Testing.TestCaseWithMetadata -> Maybe Testing.TestCaseWithMetadata
+transformTestCase tcm =
+
+      let name_ = Testing.testCaseWithMetadataName tcm
+          tc = Testing.testCaseWithMetadataCase tcm
+          desc = Testing.testCaseWithMetadataDescription tcm
+          tags_ = Testing.testCaseWithMetadataTags tcm
+      in case tc of
+        Testing.TestCaseCaseConversion v0 ->
+          let fromConv = Testing.caseConversionTestCaseFromConvention v0
+              toConv = Testing.caseConversionTestCaseToConvention v0
+              fromStr = Testing.caseConversionTestCaseFromString v0
+              toStr = Testing.caseConversionTestCaseToString v0
+          in (Just (Testing.TestCaseWithMetadata {
+            Testing.testCaseWithMetadataName = name_,
+            Testing.testCaseWithMetadataCase = (Testing.TestCaseDelegatedEvaluation (Testing.DelegatedEvaluationTestCase {
+              Testing.delegatedEvaluationTestCaseInput = (buildConvertCaseCall fromConv toConv fromStr),
+              Testing.delegatedEvaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString toStr))})),
+            Testing.testCaseWithMetadataDescription = desc,
+            Testing.testCaseWithMetadataTags = tags_}))
+        Testing.TestCaseEvaluation v0 ->
+          let input_ = Testing.evaluationTestCaseInput v0
+              output_ = Testing.evaluationTestCaseOutput v0
+          in (Just (Testing.TestCaseWithMetadata {
+            Testing.testCaseWithMetadataName = name_,
+            Testing.testCaseWithMetadataCase = (Testing.TestCaseDelegatedEvaluation (Testing.DelegatedEvaluationTestCase {
+              Testing.delegatedEvaluationTestCaseInput = input_,
+              Testing.delegatedEvaluationTestCaseOutput = output_})),
+            Testing.testCaseWithMetadataDescription = desc,
+            Testing.testCaseWithMetadataTags = tags_}))
+        Testing.TestCaseDelegatedEvaluation _ -> Just tcm
+        Testing.TestCaseTopologicalSort v0 ->
+          let adjList = Testing.topologicalSortTestCaseAdjacencyList v0
+              expected = Testing.topologicalSortTestCaseExpected v0
+          in (Just (Testing.TestCaseWithMetadata {
+            Testing.testCaseWithMetadataName = name_,
+            Testing.testCaseWithMetadataCase = (Testing.TestCaseDelegatedEvaluation (Testing.DelegatedEvaluationTestCase {
+              Testing.delegatedEvaluationTestCaseInput = (buildTopologicalSortCall adjList),
+              Testing.delegatedEvaluationTestCaseOutput = (encodeEitherListList expected)})),
+            Testing.testCaseWithMetadataDescription = desc,
+            Testing.testCaseWithMetadataTags = tags_}))
+        Testing.TestCaseTopologicalSortSCC v0 ->
+          let adjList = Testing.topologicalSortSCCTestCaseAdjacencyList v0
+              expected = Testing.topologicalSortSCCTestCaseExpected v0
+          in (Just (Testing.TestCaseWithMetadata {
+            Testing.testCaseWithMetadataName = name_,
+            Testing.testCaseWithMetadataCase = (Testing.TestCaseDelegatedEvaluation (Testing.DelegatedEvaluationTestCase {
+              Testing.delegatedEvaluationTestCaseInput = (buildTopologicalSortSCCCall adjList),
+              Testing.delegatedEvaluationTestCaseOutput = (encodeListList expected)})),
+            Testing.testCaseWithMetadataDescription = desc,
+            Testing.testCaseWithMetadataTags = tags_}))
+        Testing.TestCaseValidateCoreTerm _ -> Just tcm
+        _ -> Nothing
+
+-- | Transform test group hierarchy to only include delegated evaluation tests
+transformToCompiledTests :: Testing.TestGroup -> Maybe Testing.TestGroup
+transformToCompiledTests tg =
+
+      let name_ = Testing.testGroupName tg
+          desc = Testing.testGroupDescription tg
+          subgroups = Testing.testGroupSubgroups tg
+          cases_ = Testing.testGroupCases tg
+          transformedCases = Maybes.cat (Lists.map (\tc -> transformTestCase tc) cases_)
+          transformedSubgroups = Maybes.cat (Lists.map (\sg -> transformToCompiledTests sg) subgroups)
+      in (Logic.ifElse (Logic.and (Lists.null transformedCases) (Lists.null transformedSubgroups)) Nothing (Just (Testing.TestGroup {
+        Testing.testGroupName = name_,
+        Testing.testGroupDescription = desc,
+        Testing.testGroupSubgroups = transformedSubgroups,
+        Testing.testGroupCases = transformedCases})))
diff --git a/src/gen-main/haskell/Hydra/Test/Utils.hs b/src/gen-main/haskell/Hydra/Test/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Test/Utils.hs
@@ -0,0 +1,61 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Shared utility functions for test code generation codecs
+
+module Hydra.Test.Utils where
+
+import qualified Hydra.Context as Context
+import qualified Hydra.Core as Core
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Inference as Inference
+import qualified Hydra.Lexical as Lexical
+import qualified Hydra.Lib.Eithers as Eithers
+import qualified Hydra.Show.Errors as Errors
+import qualified Hydra.Testing as Testing
+import qualified Hydra.Typing as Typing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Run type inference on a single term
+inferTerm :: Graph.Graph -> Core.Term -> Either String Core.Term
+inferTerm g term =
+    Eithers.bimap (\ic -> Errors.error (Context.inContextObject ic)) (\x -> Typing.inferenceResultTerm x) (Inference.inferInGraphContext Lexical.emptyContext g term)
+
+-- | Run type inference on the terms in a test case
+inferTestCase :: Graph.Graph -> Testing.TestCaseWithMetadata -> Either String Testing.TestCaseWithMetadata
+inferTestCase g tcm =
+
+      let name_ = Testing.testCaseWithMetadataName tcm
+          tcase = Testing.testCaseWithMetadataCase tcm
+          desc = Testing.testCaseWithMetadataDescription tcm
+          tags_ = Testing.testCaseWithMetadataTags tcm
+      in (Eithers.map (\inferredCase -> Testing.TestCaseWithMetadata {
+        Testing.testCaseWithMetadataName = name_,
+        Testing.testCaseWithMetadataCase = inferredCase,
+        Testing.testCaseWithMetadataDescription = desc,
+        Testing.testCaseWithMetadataTags = tags_}) (case tcase of
+        Testing.TestCaseDelegatedEvaluation v0 ->
+          let input_ = Testing.delegatedEvaluationTestCaseInput v0
+              output_ = Testing.delegatedEvaluationTestCaseOutput v0
+          in (Eithers.bind (inferTerm g input_) (\inferredInput -> Eithers.map (\inferredOutput -> Testing.TestCaseDelegatedEvaluation (Testing.DelegatedEvaluationTestCase {
+            Testing.delegatedEvaluationTestCaseInput = inferredInput,
+            Testing.delegatedEvaluationTestCaseOutput = inferredOutput})) (inferTerm g output_)))
+        _ -> Right tcase))
+
+-- | Run type inference on all terms in a TestGroup to ensure lambdas have domain types
+inferTestGroupTerms :: Graph.Graph -> Testing.TestGroup -> Either String Testing.TestGroup
+inferTestGroupTerms g tg =
+
+      let name_ = Testing.testGroupName tg
+          desc = Testing.testGroupDescription tg
+          subgroups = Testing.testGroupSubgroups tg
+          cases_ = Testing.testGroupCases tg
+      in (Eithers.bind (Eithers.mapList (\sg -> inferTestGroupTerms g sg) subgroups) (\inferredSubgroups -> Eithers.map (\inferredCases -> Testing.TestGroup {
+        Testing.testGroupName = name_,
+        Testing.testGroupDescription = desc,
+        Testing.testGroupSubgroups = inferredSubgroups,
+        Testing.testGroupCases = inferredCases}) (Eithers.mapList (\tc -> inferTestCase g tc) cases_)))
diff --git a/src/gen-main/haskell/Hydra/Testing.hs b/src/gen-main/haskell/Hydra/Testing.hs
--- a/src/gen-main/haskell/Hydra/Testing.hs
+++ b/src/gen-main/haskell/Hydra/Testing.hs
@@ -6,8 +6,8 @@
 
 import qualified Hydra.Ast as Ast
 import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Core as Core
+import qualified Hydra.Error.Core as Core_
 import qualified Hydra.Graph as Graph
 import qualified Hydra.Json.Model as Model
 import qualified Hydra.Module as Module
@@ -22,7 +22,7 @@
 import qualified Data.Set as S
 
 -- | A test case which performs alpha conversion (variable renaming) on a term and compares the result with the expected term
-data AlphaConversionTestCase = 
+data AlphaConversionTestCase =
   AlphaConversionTestCase {
     -- | The term on which to perform alpha conversion
     alphaConversionTestCaseTerm :: Core.Term,
@@ -34,30 +34,30 @@
     alphaConversionTestCaseResult :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_AlphaConversionTestCase = (Core.Name "hydra.testing.AlphaConversionTestCase")
+_AlphaConversionTestCase = Core.Name "hydra.testing.AlphaConversionTestCase"
 
-_AlphaConversionTestCase_term = (Core.Name "term")
+_AlphaConversionTestCase_term = Core.Name "term"
 
-_AlphaConversionTestCase_oldVariable = (Core.Name "oldVariable")
+_AlphaConversionTestCase_oldVariable = Core.Name "oldVariable"
 
-_AlphaConversionTestCase_newVariable = (Core.Name "newVariable")
+_AlphaConversionTestCase_newVariable = Core.Name "newVariable"
 
-_AlphaConversionTestCase_result = (Core.Name "result")
+_AlphaConversionTestCase_result = Core.Name "result"
 
 -- | One of two evaluation styles: eager or lazy
-data EvaluationStyle = 
+data EvaluationStyle =
   EvaluationStyleEager  |
-  EvaluationStyleLazy 
+  EvaluationStyleLazy
   deriving (Eq, Ord, Read, Show)
 
-_EvaluationStyle = (Core.Name "hydra.testing.EvaluationStyle")
+_EvaluationStyle = Core.Name "hydra.testing.EvaluationStyle"
 
-_EvaluationStyle_eager = (Core.Name "eager")
+_EvaluationStyle_eager = Core.Name "eager"
 
-_EvaluationStyle_lazy = (Core.Name "lazy")
+_EvaluationStyle_lazy = Core.Name "lazy"
 
 -- | A test case which checks that strings are converted between different case conventions correctly
-data CaseConversionTestCase = 
+data CaseConversionTestCase =
   CaseConversionTestCase {
     -- | The source case convention
     caseConversionTestCaseFromConvention :: Util.CaseConvention,
@@ -69,18 +69,18 @@
     caseConversionTestCaseToString :: String}
   deriving (Eq, Ord, Read, Show)
 
-_CaseConversionTestCase = (Core.Name "hydra.testing.CaseConversionTestCase")
+_CaseConversionTestCase = Core.Name "hydra.testing.CaseConversionTestCase"
 
-_CaseConversionTestCase_fromConvention = (Core.Name "fromConvention")
+_CaseConversionTestCase_fromConvention = Core.Name "fromConvention"
 
-_CaseConversionTestCase_toConvention = (Core.Name "toConvention")
+_CaseConversionTestCase_toConvention = Core.Name "toConvention"
 
-_CaseConversionTestCase_fromString = (Core.Name "fromString")
+_CaseConversionTestCase_fromString = Core.Name "fromString"
 
-_CaseConversionTestCase_toString = (Core.Name "toString")
+_CaseConversionTestCase_toString = Core.Name "toString"
 
 -- | A test case in which we delegate evaluation of an input term and an expected output term to a target programming language like Haskell, Java, or Python, checking whether the term evaluates as expected when translated into that language
-data DelegatedEvaluationTestCase = 
+data DelegatedEvaluationTestCase =
   DelegatedEvaluationTestCase {
     -- | The first of two terms which should evaluate to the same expression
     delegatedEvaluationTestCaseInput :: Core.Term,
@@ -88,14 +88,14 @@
     delegatedEvaluationTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_DelegatedEvaluationTestCase = (Core.Name "hydra.testing.DelegatedEvaluationTestCase")
+_DelegatedEvaluationTestCase = Core.Name "hydra.testing.DelegatedEvaluationTestCase"
 
-_DelegatedEvaluationTestCase_input = (Core.Name "input")
+_DelegatedEvaluationTestCase_input = Core.Name "input"
 
-_DelegatedEvaluationTestCase_output = (Core.Name "output")
+_DelegatedEvaluationTestCase_output = Core.Name "output"
 
 -- | A test case which performs eta expansion (adding missing lambda abstractions) on a given term and compares the result with the expected result
-data EtaExpansionTestCase = 
+data EtaExpansionTestCase =
   EtaExpansionTestCase {
     -- | The term to eta expand
     etaExpansionTestCaseInput :: Core.Term,
@@ -103,14 +103,14 @@
     etaExpansionTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_EtaExpansionTestCase = (Core.Name "hydra.testing.EtaExpansionTestCase")
+_EtaExpansionTestCase = Core.Name "hydra.testing.EtaExpansionTestCase"
 
-_EtaExpansionTestCase_input = (Core.Name "input")
+_EtaExpansionTestCase_input = Core.Name "input"
 
-_EtaExpansionTestCase_output = (Core.Name "output")
+_EtaExpansionTestCase_output = Core.Name "output"
 
 -- | A test case which strips all annotations from a term and compares the result with the expected term
-data DeannotateTermTestCase = 
+data DeannotateTermTestCase =
   DeannotateTermTestCase {
     -- | The term to deannotate
     deannotateTermTestCaseInput :: Core.Term,
@@ -118,14 +118,14 @@
     deannotateTermTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_DeannotateTermTestCase = (Core.Name "hydra.testing.DeannotateTermTestCase")
+_DeannotateTermTestCase = Core.Name "hydra.testing.DeannotateTermTestCase"
 
-_DeannotateTermTestCase_input = (Core.Name "input")
+_DeannotateTermTestCase_input = Core.Name "input"
 
-_DeannotateTermTestCase_output = (Core.Name "output")
+_DeannotateTermTestCase_output = Core.Name "output"
 
 -- | A test case which strips all annotations from a type and compares the result with the expected type
-data DeannotateTypeTestCase = 
+data DeannotateTypeTestCase =
   DeannotateTypeTestCase {
     -- | The type to deannotate
     deannotateTypeTestCaseInput :: Core.Type,
@@ -133,14 +133,14 @@
     deannotateTypeTestCaseOutput :: Core.Type}
   deriving (Eq, Ord, Read, Show)
 
-_DeannotateTypeTestCase = (Core.Name "hydra.testing.DeannotateTypeTestCase")
+_DeannotateTypeTestCase = Core.Name "hydra.testing.DeannotateTypeTestCase"
 
-_DeannotateTypeTestCase_input = (Core.Name "input")
+_DeannotateTypeTestCase_input = Core.Name "input"
 
-_DeannotateTypeTestCase_output = (Core.Name "output")
+_DeannotateTypeTestCase_output = Core.Name "output"
 
 -- | A test case which flattens nested let terms, lifting inner bindings to the outer let, and compares the result with the expected term
-data FlattenLetTermsTestCase = 
+data FlattenLetTermsTestCase =
   FlattenLetTermsTestCase {
     -- | The term to flatten
     flattenLetTermsTestCaseInput :: Core.Term,
@@ -148,32 +148,32 @@
     flattenLetTermsTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_FlattenLetTermsTestCase = (Core.Name "hydra.testing.FlattenLetTermsTestCase")
+_FlattenLetTermsTestCase = Core.Name "hydra.testing.FlattenLetTermsTestCase"
 
-_FlattenLetTermsTestCase_input = (Core.Name "input")
+_FlattenLetTermsTestCase_input = Core.Name "input"
 
-_FlattenLetTermsTestCase_output = (Core.Name "output")
+_FlattenLetTermsTestCase_output = Core.Name "output"
 
 -- | A predefined fold operation for testing foldOverTerm
-data FoldOperation = 
+data FoldOperation =
   -- | Sum all Int32 literals in a term
   FoldOperationSumInt32Literals  |
   -- | Collect the lengths of all list terms (returns list of integers in traversal order)
   FoldOperationCollectListLengths  |
   -- | Collect labels (first element of pairs where first is a string literal)
-  FoldOperationCollectLabels 
+  FoldOperationCollectLabels
   deriving (Eq, Ord, Read, Show)
 
-_FoldOperation = (Core.Name "hydra.testing.FoldOperation")
+_FoldOperation = Core.Name "hydra.testing.FoldOperation"
 
-_FoldOperation_sumInt32Literals = (Core.Name "sumInt32Literals")
+_FoldOperation_sumInt32Literals = Core.Name "sumInt32Literals"
 
-_FoldOperation_collectListLengths = (Core.Name "collectListLengths")
+_FoldOperation_collectListLengths = Core.Name "collectListLengths"
 
-_FoldOperation_collectLabels = (Core.Name "collectLabels")
+_FoldOperation_collectLabels = Core.Name "collectLabels"
 
 -- | A test case which applies a fold operation over a term and compares the result
-data FoldOverTermTestCase = 
+data FoldOverTermTestCase =
   FoldOverTermTestCase {
     -- | The term to fold over
     foldOverTermTestCaseInput :: Core.Term,
@@ -185,18 +185,18 @@
     foldOverTermTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_FoldOverTermTestCase = (Core.Name "hydra.testing.FoldOverTermTestCase")
+_FoldOverTermTestCase = Core.Name "hydra.testing.FoldOverTermTestCase"
 
-_FoldOverTermTestCase_input = (Core.Name "input")
+_FoldOverTermTestCase_input = Core.Name "input"
 
-_FoldOverTermTestCase_traversalOrder = (Core.Name "traversalOrder")
+_FoldOverTermTestCase_traversalOrder = Core.Name "traversalOrder"
 
-_FoldOverTermTestCase_operation = (Core.Name "operation")
+_FoldOverTermTestCase_operation = Core.Name "operation"
 
-_FoldOverTermTestCase_output = (Core.Name "output")
+_FoldOverTermTestCase_output = Core.Name "output"
 
 -- | A test case which computes the free variables of a term and compares the result with an expected set of names
-data FreeVariablesTestCase = 
+data FreeVariablesTestCase =
   FreeVariablesTestCase {
     -- | The term to analyze
     freeVariablesTestCaseInput :: Core.Term,
@@ -204,14 +204,14 @@
     freeVariablesTestCaseOutput :: (S.Set Core.Name)}
   deriving (Eq, Ord, Read, Show)
 
-_FreeVariablesTestCase = (Core.Name "hydra.testing.FreeVariablesTestCase")
+_FreeVariablesTestCase = Core.Name "hydra.testing.FreeVariablesTestCase"
 
-_FreeVariablesTestCase_input = (Core.Name "input")
+_FreeVariablesTestCase_input = Core.Name "input"
 
-_FreeVariablesTestCase_output = (Core.Name "output")
+_FreeVariablesTestCase_output = Core.Name "output"
 
 -- | A predefined predicate for testing hoistSubterms. Each predicate determines which subterms should be hoisted into let bindings.
-data HoistPredicate = 
+data HoistPredicate =
   -- | Hoist case statements (elimination unions) that appear in non-top-level positions
   HoistPredicateCaseStatements  |
   -- | Hoist function applications that appear in non-top-level positions
@@ -219,21 +219,21 @@
   -- | Hoist list terms that appear in non-top-level positions
   HoistPredicateLists  |
   -- | Never hoist anything (identity transformation for let terms)
-  HoistPredicateNothing 
+  HoistPredicateNothing
   deriving (Eq, Ord, Read, Show)
 
-_HoistPredicate = (Core.Name "hydra.testing.HoistPredicate")
+_HoistPredicate = Core.Name "hydra.testing.HoistPredicate"
 
-_HoistPredicate_caseStatements = (Core.Name "caseStatements")
+_HoistPredicate_caseStatements = Core.Name "caseStatements"
 
-_HoistPredicate_applications = (Core.Name "applications")
+_HoistPredicate_applications = Core.Name "applications"
 
-_HoistPredicate_lists = (Core.Name "lists")
+_HoistPredicate_lists = Core.Name "lists"
 
-_HoistPredicate_nothing = (Core.Name "nothing")
+_HoistPredicate_nothing = Core.Name "nothing"
 
 -- | A test case for hoistLetBindings with hoistAll=True, which hoists ALL nested let bindings to the top level of a let term, not just polymorphic ones. This is used for targets like Java that cannot have let expressions in arbitrary positions.
-data HoistLetBindingsTestCase = 
+data HoistLetBindingsTestCase =
   HoistLetBindingsTestCase {
     -- | The input let term
     hoistLetBindingsTestCaseInput :: Core.Let,
@@ -241,14 +241,14 @@
     hoistLetBindingsTestCaseOutput :: Core.Let}
   deriving (Eq, Ord, Read, Show)
 
-_HoistLetBindingsTestCase = (Core.Name "hydra.testing.HoistLetBindingsTestCase")
+_HoistLetBindingsTestCase = Core.Name "hydra.testing.HoistLetBindingsTestCase"
 
-_HoistLetBindingsTestCase_input = (Core.Name "input")
+_HoistLetBindingsTestCase_input = Core.Name "input"
 
-_HoistLetBindingsTestCase_output = (Core.Name "output")
+_HoistLetBindingsTestCase_output = Core.Name "output"
 
 -- | A test case for the hoistPolymorphicLetBindings function, which hoists polymorphic let bindings to the top level of a let term. This is used for targets like Java which don't support polymorphic lambdas.
-data HoistPolymorphicLetBindingsTestCase = 
+data HoistPolymorphicLetBindingsTestCase =
   HoistPolymorphicLetBindingsTestCase {
     -- | The input let term
     hoistPolymorphicLetBindingsTestCaseInput :: Core.Let,
@@ -256,14 +256,14 @@
     hoistPolymorphicLetBindingsTestCaseOutput :: Core.Let}
   deriving (Eq, Ord, Read, Show)
 
-_HoistPolymorphicLetBindingsTestCase = (Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase")
+_HoistPolymorphicLetBindingsTestCase = Core.Name "hydra.testing.HoistPolymorphicLetBindingsTestCase"
 
-_HoistPolymorphicLetBindingsTestCase_input = (Core.Name "input")
+_HoistPolymorphicLetBindingsTestCase_input = Core.Name "input"
 
-_HoistPolymorphicLetBindingsTestCase_output = (Core.Name "output")
+_HoistPolymorphicLetBindingsTestCase_output = Core.Name "output"
 
 -- | A test case which hoists subterms into let bindings based on a predicate, and compares the result with the expected term. The predicate decides which subterms at which positions should be extracted into new bindings.
-data HoistSubtermsTestCase = 
+data HoistSubtermsTestCase =
   HoistSubtermsTestCase {
     -- | The predicate that determines which subterms to hoist
     hoistSubtermsTestCasePredicate :: HoistPredicate,
@@ -273,16 +273,16 @@
     hoistSubtermsTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_HoistSubtermsTestCase = (Core.Name "hydra.testing.HoistSubtermsTestCase")
+_HoistSubtermsTestCase = Core.Name "hydra.testing.HoistSubtermsTestCase"
 
-_HoistSubtermsTestCase_predicate = (Core.Name "predicate")
+_HoistSubtermsTestCase_predicate = Core.Name "predicate"
 
-_HoistSubtermsTestCase_input = (Core.Name "input")
+_HoistSubtermsTestCase_input = Core.Name "input"
 
-_HoistSubtermsTestCase_output = (Core.Name "output")
+_HoistSubtermsTestCase_output = Core.Name "output"
 
 -- | A test case for the hoistCaseStatements function, which hoists case statements into let bindings, but only when they appear inside a lambda body. This is used for targets like Python which don't support inline match expressions.
-data HoistCaseStatementsTestCase = 
+data HoistCaseStatementsTestCase =
   HoistCaseStatementsTestCase {
     -- | The input term
     hoistCaseStatementsTestCaseInput :: Core.Term,
@@ -290,28 +290,28 @@
     hoistCaseStatementsTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_HoistCaseStatementsTestCase = (Core.Name "hydra.testing.HoistCaseStatementsTestCase")
+_HoistCaseStatementsTestCase = Core.Name "hydra.testing.HoistCaseStatementsTestCase"
 
-_HoistCaseStatementsTestCase_input = (Core.Name "input")
+_HoistCaseStatementsTestCase_input = Core.Name "input"
 
-_HoistCaseStatementsTestCase_output = (Core.Name "output")
+_HoistCaseStatementsTestCase_output = Core.Name "output"
 
 -- | A predefined term rewriter for testing rewriteTerm
-data TermRewriter = 
+data TermRewriter =
   -- | Replace all string literal 'foo' with 'bar'
   TermRewriterReplaceFooWithBar  |
   -- | Replace all Int32 literals with Int64 literals of the same value
-  TermRewriterReplaceInt32WithInt64 
+  TermRewriterReplaceInt32WithInt64
   deriving (Eq, Ord, Read, Show)
 
-_TermRewriter = (Core.Name "hydra.testing.TermRewriter")
+_TermRewriter = Core.Name "hydra.testing.TermRewriter"
 
-_TermRewriter_replaceFooWithBar = (Core.Name "replaceFooWithBar")
+_TermRewriter_replaceFooWithBar = Core.Name "replaceFooWithBar"
 
-_TermRewriter_replaceInt32WithInt64 = (Core.Name "replaceInt32WithInt64")
+_TermRewriter_replaceInt32WithInt64 = Core.Name "replaceInt32WithInt64"
 
 -- | A test case which applies a term rewriter and compares the result
-data RewriteTermTestCase = 
+data RewriteTermTestCase =
   RewriteTermTestCase {
     -- | The term to rewrite
     rewriteTermTestCaseInput :: Core.Term,
@@ -321,26 +321,26 @@
     rewriteTermTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_RewriteTermTestCase = (Core.Name "hydra.testing.RewriteTermTestCase")
+_RewriteTermTestCase = Core.Name "hydra.testing.RewriteTermTestCase"
 
-_RewriteTermTestCase_input = (Core.Name "input")
+_RewriteTermTestCase_input = Core.Name "input"
 
-_RewriteTermTestCase_rewriter = (Core.Name "rewriter")
+_RewriteTermTestCase_rewriter = Core.Name "rewriter"
 
-_RewriteTermTestCase_output = (Core.Name "output")
+_RewriteTermTestCase_output = Core.Name "output"
 
 -- | A predefined type rewriter for testing rewriteType
-data TypeRewriter = 
+data TypeRewriter =
   -- | Replace all String types with Int32 types
-  TypeRewriterReplaceStringWithInt32 
+  TypeRewriterReplaceStringWithInt32
   deriving (Eq, Ord, Read, Show)
 
-_TypeRewriter = (Core.Name "hydra.testing.TypeRewriter")
+_TypeRewriter = Core.Name "hydra.testing.TypeRewriter"
 
-_TypeRewriter_replaceStringWithInt32 = (Core.Name "replaceStringWithInt32")
+_TypeRewriter_replaceStringWithInt32 = Core.Name "replaceStringWithInt32"
 
 -- | A test case which applies a type rewriter and compares the result
-data RewriteTypeTestCase = 
+data RewriteTypeTestCase =
   RewriteTypeTestCase {
     -- | The type to rewrite
     rewriteTypeTestCaseInput :: Core.Type,
@@ -350,16 +350,16 @@
     rewriteTypeTestCaseOutput :: Core.Type}
   deriving (Eq, Ord, Read, Show)
 
-_RewriteTypeTestCase = (Core.Name "hydra.testing.RewriteTypeTestCase")
+_RewriteTypeTestCase = Core.Name "hydra.testing.RewriteTypeTestCase"
 
-_RewriteTypeTestCase_input = (Core.Name "input")
+_RewriteTypeTestCase_input = Core.Name "input"
 
-_RewriteTypeTestCase_rewriter = (Core.Name "rewriter")
+_RewriteTypeTestCase_rewriter = Core.Name "rewriter"
 
-_RewriteTypeTestCase_output = (Core.Name "output")
+_RewriteTypeTestCase_output = Core.Name "output"
 
 -- | A test case which evaluates (reduces) a given term and compares it with the expected result
-data EvaluationTestCase = 
+data EvaluationTestCase =
   EvaluationTestCase {
     -- | The evaluation style (eager or lazy)
     evaluationTestCaseEvaluationStyle :: EvaluationStyle,
@@ -369,27 +369,27 @@
     evaluationTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_EvaluationTestCase = (Core.Name "hydra.testing.EvaluationTestCase")
+_EvaluationTestCase = Core.Name "hydra.testing.EvaluationTestCase"
 
-_EvaluationTestCase_evaluationStyle = (Core.Name "evaluationStyle")
+_EvaluationTestCase_evaluationStyle = Core.Name "evaluationStyle"
 
-_EvaluationTestCase_input = (Core.Name "input")
+_EvaluationTestCase_input = Core.Name "input"
 
-_EvaluationTestCase_output = (Core.Name "output")
+_EvaluationTestCase_output = Core.Name "output"
 
 -- | A test case providing a term for which type inference is expected to fail
-data InferenceFailureTestCase = 
+data InferenceFailureTestCase =
   InferenceFailureTestCase {
     -- | The term for which inference should fail
     inferenceFailureTestCaseInput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_InferenceFailureTestCase = (Core.Name "hydra.testing.InferenceFailureTestCase")
+_InferenceFailureTestCase = Core.Name "hydra.testing.InferenceFailureTestCase"
 
-_InferenceFailureTestCase_input = (Core.Name "input")
+_InferenceFailureTestCase_input = Core.Name "input"
 
 -- | A test case which performs type inference on a given term and compares the result with an expected type scheme
-data InferenceTestCase = 
+data InferenceTestCase =
   InferenceTestCase {
     -- | The term to infer
     inferenceTestCaseInput :: Core.Term,
@@ -397,33 +397,14 @@
     inferenceTestCaseOutput :: Core.TypeScheme}
   deriving (Eq, Ord, Read, Show)
 
-_InferenceTestCase = (Core.Name "hydra.testing.InferenceTestCase")
-
-_InferenceTestCase_input = (Core.Name "input")
-
-_InferenceTestCase_output = (Core.Name "output")
-
--- | A test case which encodes a Hydra term to JSON using a type-directed coder, and verifies that decoding produces the original term (round-trip)
-data JsonCoderTestCase = 
-  JsonCoderTestCase {
-    -- | The Hydra type that determines how the term is encoded/decoded
-    jsonCoderTestCaseType :: Core.Type,
-    -- | The Hydra term to encode
-    jsonCoderTestCaseTerm :: Core.Term,
-    -- | The expected JSON value
-    jsonCoderTestCaseJson :: Model.Value}
-  deriving (Eq, Ord, Read, Show)
-
-_JsonCoderTestCase = (Core.Name "hydra.testing.JsonCoderTestCase")
-
-_JsonCoderTestCase_type = (Core.Name "type")
+_InferenceTestCase = Core.Name "hydra.testing.InferenceTestCase"
 
-_JsonCoderTestCase_term = (Core.Name "term")
+_InferenceTestCase_input = Core.Name "input"
 
-_JsonCoderTestCase_json = (Core.Name "json")
+_InferenceTestCase_output = Core.Name "output"
 
 -- | A test case for the Either-based JSON decoder. Takes a type, input JSON, and expected result (Either String Term).
-data JsonDecodeTestCase = 
+data JsonDecodeTestCase =
   JsonDecodeTestCase {
     -- | The Hydra type to decode into
     jsonDecodeTestCaseType :: Core.Type,
@@ -433,16 +414,16 @@
     jsonDecodeTestCaseExpected :: (Either String Core.Term)}
   deriving (Eq, Ord, Read, Show)
 
-_JsonDecodeTestCase = (Core.Name "hydra.testing.JsonDecodeTestCase")
+_JsonDecodeTestCase = Core.Name "hydra.testing.JsonDecodeTestCase"
 
-_JsonDecodeTestCase_type = (Core.Name "type")
+_JsonDecodeTestCase_type = Core.Name "type"
 
-_JsonDecodeTestCase_json = (Core.Name "json")
+_JsonDecodeTestCase_json = Core.Name "json"
 
-_JsonDecodeTestCase_expected = (Core.Name "expected")
+_JsonDecodeTestCase_expected = Core.Name "expected"
 
 -- | A test case for the Either-based JSON encoder. Takes an input term and expected result (Either String Value).
-data JsonEncodeTestCase = 
+data JsonEncodeTestCase =
   JsonEncodeTestCase {
     -- | The Hydra term to encode
     jsonEncodeTestCaseTerm :: Core.Term,
@@ -450,19 +431,19 @@
     jsonEncodeTestCaseExpected :: (Either String Model.Value)}
   deriving (Eq, Ord, Read, Show)
 
-_JsonEncodeTestCase = (Core.Name "hydra.testing.JsonEncodeTestCase")
+_JsonEncodeTestCase = Core.Name "hydra.testing.JsonEncodeTestCase"
 
-_JsonEncodeTestCase_term = (Core.Name "term")
+_JsonEncodeTestCase_term = Core.Name "term"
 
-_JsonEncodeTestCase_expected = (Core.Name "expected")
+_JsonEncodeTestCase_expected = Core.Name "expected"
 
 -- | A test case which parses a JSON string and compares the result with an expected JSON value
 type JsonParserTestCase = (ParserTestCase Model.Value)
 
-_JsonParserTestCase = (Core.Name "hydra.testing.JsonParserTestCase")
+_JsonParserTestCase = Core.Name "hydra.testing.JsonParserTestCase"
 
 -- | A test case for round-trip encoding/decoding using the Either-based JSON functions. Encodes a term, then decodes it back, verifying the result equals the original.
-data JsonRoundtripTestCase = 
+data JsonRoundtripTestCase =
   JsonRoundtripTestCase {
     -- | The Hydra type for encoding/decoding
     jsonRoundtripTestCaseType :: Core.Type,
@@ -470,14 +451,14 @@
     jsonRoundtripTestCaseTerm :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_JsonRoundtripTestCase = (Core.Name "hydra.testing.JsonRoundtripTestCase")
+_JsonRoundtripTestCase = Core.Name "hydra.testing.JsonRoundtripTestCase"
 
-_JsonRoundtripTestCase_type = (Core.Name "type")
+_JsonRoundtripTestCase_type = Core.Name "type"
 
-_JsonRoundtripTestCase_term = (Core.Name "term")
+_JsonRoundtripTestCase_term = Core.Name "term"
 
 -- | A test case which lifts lambda abstractions above let expressions and compares the result with the expected term
-data LiftLambdaAboveLetTestCase = 
+data LiftLambdaAboveLetTestCase =
   LiftLambdaAboveLetTestCase {
     -- | The term to transform
     liftLambdaAboveLetTestCaseInput :: Core.Term,
@@ -485,19 +466,19 @@
     liftLambdaAboveLetTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_LiftLambdaAboveLetTestCase = (Core.Name "hydra.testing.LiftLambdaAboveLetTestCase")
+_LiftLambdaAboveLetTestCase = Core.Name "hydra.testing.LiftLambdaAboveLetTestCase"
 
-_LiftLambdaAboveLetTestCase_input = (Core.Name "input")
+_LiftLambdaAboveLetTestCase_input = Core.Name "input"
 
-_LiftLambdaAboveLetTestCase_output = (Core.Name "output")
+_LiftLambdaAboveLetTestCase_output = Core.Name "output"
 
 -- | A test case which serializes a JSON value to a string and compares it to the expected string
 type JsonWriterTestCase = (WriterTestCase Model.Value)
 
-_JsonWriterTestCase = (Core.Name "hydra.testing.JsonWriterTestCase")
+_JsonWriterTestCase = Core.Name "hydra.testing.JsonWriterTestCase"
 
 -- | A test case which parses an input string and compares the result with an expected value
-data ParserTestCase a = 
+data ParserTestCase a =
   ParserTestCase {
     -- | The input string to parse
     parserTestCaseInput :: String,
@@ -505,31 +486,31 @@
     parserTestCaseOutput :: (Parsing.ParseResult a)}
   deriving (Eq, Ord, Read, Show)
 
-_ParserTestCase = (Core.Name "hydra.testing.ParserTestCase")
+_ParserTestCase = Core.Name "hydra.testing.ParserTestCase"
 
-_ParserTestCase_input = (Core.Name "input")
+_ParserTestCase_input = Core.Name "input"
 
-_ParserTestCase_output = (Core.Name "output")
+_ParserTestCase_output = Core.Name "output"
 
 -- | A tag for categorizing test cases
-newtype Tag = 
+newtype Tag =
   Tag {
     unTag :: String}
   deriving (Eq, Ord, Read, Show)
 
-_Tag = (Core.Name "hydra.testing.Tag")
+_Tag = Core.Name "hydra.testing.Tag"
 
 -- | A codec for generating compiled test files from test groups into a target programming language
-data TestCodec = 
+data TestCodec =
   TestCodec {
     -- | The name of the target programming language
     testCodecLanguage :: Coders.LanguageName,
     -- | The file extension for test files (e.g., 'hs', 'java', 'py')
     testCodecFileExtension :: Module.FileExtension,
     -- | A function for encoding Hydra terms into the target language
-    testCodecEncodeTerm :: (Core.Term -> Compute.Flow Graph.Graph String),
+    testCodecEncodeTerm :: (Core.Term -> Graph.Graph -> Either String String),
     -- | A function for encoding Hydra types into the target language
-    testCodecEncodeType :: (Core.Type -> Compute.Flow Graph.Graph String),
+    testCodecEncodeType :: (Core.Type -> Graph.Graph -> Either String String),
     -- | A function for formatting test case names according to the target language's conventions
     testCodecFormatTestName :: (String -> String),
     -- | A function for formatting module names according to the target language's conventions
@@ -545,32 +526,54 @@
     -- | A function that determines the necessary imports for a given set of dependencies
     testCodecFindImports :: (S.Set Core.Name -> [String])}
 
-_TestCodec = (Core.Name "hydra.testing.TestCodec")
+_TestCodec = Core.Name "hydra.testing.TestCodec"
 
-_TestCodec_language = (Core.Name "language")
+_TestCodec_language = Core.Name "language"
 
-_TestCodec_fileExtension = (Core.Name "fileExtension")
+_TestCodec_fileExtension = Core.Name "fileExtension"
 
-_TestCodec_encodeTerm = (Core.Name "encodeTerm")
+_TestCodec_encodeTerm = Core.Name "encodeTerm"
 
-_TestCodec_encodeType = (Core.Name "encodeType")
+_TestCodec_encodeType = Core.Name "encodeType"
 
-_TestCodec_formatTestName = (Core.Name "formatTestName")
+_TestCodec_formatTestName = Core.Name "formatTestName"
 
-_TestCodec_formatModuleName = (Core.Name "formatModuleName")
+_TestCodec_formatModuleName = Core.Name "formatModuleName"
 
-_TestCodec_testCaseTemplate = (Core.Name "testCaseTemplate")
+_TestCodec_testCaseTemplate = Core.Name "testCaseTemplate"
 
-_TestCodec_testGroupTemplate = (Core.Name "testGroupTemplate")
+_TestCodec_testGroupTemplate = Core.Name "testGroupTemplate"
 
-_TestCodec_moduleTemplate = (Core.Name "moduleTemplate")
+_TestCodec_moduleTemplate = Core.Name "moduleTemplate"
 
-_TestCodec_importTemplate = (Core.Name "importTemplate")
+_TestCodec_importTemplate = Core.Name "importTemplate"
 
-_TestCodec_findImports = (Core.Name "findImports")
+_TestCodec_findImports = Core.Name "findImports"
 
+-- | A language-agnostic test generator abstraction, parameterized by the namespace/module name type
+data TestGenerator a =
+  TestGenerator {
+    -- | Build namespaces for a module, resolving all imports and primitives
+    testGeneratorNamespacesForModule :: (Module.Module -> Graph.Graph -> Either String (Module.Namespaces a)),
+    -- | Create a test codec from resolved namespaces
+    testGeneratorCreateCodec :: (Module.Namespaces a -> TestCodec),
+    -- | Generate a complete test file for a module and test group
+    testGeneratorGenerateTestFile :: (Module.Module -> TestGroup -> Graph.Graph -> Either String (String, String)),
+    -- | Generate an aggregator file (e.g., Spec.hs for Haskell, conftest.py for Python). Takes base directory and list of modules, returns (filepath, content) or Nothing if not needed
+    testGeneratorAggregatorFile :: (Maybe (String -> [Module.Module] -> (String, String)))}
+
+_TestGenerator = Core.Name "hydra.testing.TestGenerator"
+
+_TestGenerator_namespacesForModule = Core.Name "namespacesForModule"
+
+_TestGenerator_createCodec = Core.Name "createCodec"
+
+_TestGenerator_generateTestFile = Core.Name "generateTestFile"
+
+_TestGenerator_aggregatorFile = Core.Name "aggregatorFile"
+
 -- | A simple test case with an input and an expected output
-data TestCase = 
+data TestCase =
   -- | An alpha conversion test
   TestCaseAlphaConversion AlphaConversionTestCase |
   -- | A case conversion test
@@ -593,8 +596,6 @@
   TestCaseInference InferenceTestCase |
   -- | A type inference failure test
   TestCaseInferenceFailure InferenceFailureTestCase |
-  -- | A JSON coder (round-trip) test using Flow-based coder
-  TestCaseJsonCoder JsonCoderTestCase |
   -- | A JSON decode test using Either-based decoder
   TestCaseJsonDecode JsonDecodeTestCase |
   -- | A JSON encode test using Either-based encoder
@@ -648,91 +649,93 @@
   -- | A join types test (produce type constraints)
   TestCaseJoinTypes JoinTypesTestCase |
   -- | An unshadow variables test
-  TestCaseUnshadowVariables UnshadowVariablesTestCase
+  TestCaseUnshadowVariables UnshadowVariablesTestCase |
+  -- | A core term validation test
+  TestCaseValidateCoreTerm ValidateCoreTermTestCase
   deriving (Eq, Ord, Read, Show)
 
-_TestCase = (Core.Name "hydra.testing.TestCase")
+_TestCase = Core.Name "hydra.testing.TestCase"
 
-_TestCase_alphaConversion = (Core.Name "alphaConversion")
+_TestCase_alphaConversion = Core.Name "alphaConversion"
 
-_TestCase_caseConversion = (Core.Name "caseConversion")
+_TestCase_caseConversion = Core.Name "caseConversion"
 
-_TestCase_deannotateTerm = (Core.Name "deannotateTerm")
+_TestCase_deannotateTerm = Core.Name "deannotateTerm"
 
-_TestCase_deannotateType = (Core.Name "deannotateType")
+_TestCase_deannotateType = Core.Name "deannotateType"
 
-_TestCase_delegatedEvaluation = (Core.Name "delegatedEvaluation")
+_TestCase_delegatedEvaluation = Core.Name "delegatedEvaluation"
 
-_TestCase_etaExpansion = (Core.Name "etaExpansion")
+_TestCase_etaExpansion = Core.Name "etaExpansion"
 
-_TestCase_flattenLetTerms = (Core.Name "flattenLetTerms")
+_TestCase_flattenLetTerms = Core.Name "flattenLetTerms"
 
-_TestCase_freeVariables = (Core.Name "freeVariables")
+_TestCase_freeVariables = Core.Name "freeVariables"
 
-_TestCase_evaluation = (Core.Name "evaluation")
+_TestCase_evaluation = Core.Name "evaluation"
 
-_TestCase_inference = (Core.Name "inference")
+_TestCase_inference = Core.Name "inference"
 
-_TestCase_inferenceFailure = (Core.Name "inferenceFailure")
+_TestCase_inferenceFailure = Core.Name "inferenceFailure"
 
-_TestCase_jsonCoder = (Core.Name "jsonCoder")
+_TestCase_jsonDecode = Core.Name "jsonDecode"
 
-_TestCase_jsonDecode = (Core.Name "jsonDecode")
+_TestCase_jsonEncode = Core.Name "jsonEncode"
 
-_TestCase_jsonEncode = (Core.Name "jsonEncode")
+_TestCase_jsonParser = Core.Name "jsonParser"
 
-_TestCase_jsonParser = (Core.Name "jsonParser")
+_TestCase_jsonRoundtrip = Core.Name "jsonRoundtrip"
 
-_TestCase_jsonRoundtrip = (Core.Name "jsonRoundtrip")
+_TestCase_jsonWriter = Core.Name "jsonWriter"
 
-_TestCase_jsonWriter = (Core.Name "jsonWriter")
+_TestCase_liftLambdaAboveLet = Core.Name "liftLambdaAboveLet"
 
-_TestCase_liftLambdaAboveLet = (Core.Name "liftLambdaAboveLet")
+_TestCase_serialization = Core.Name "serialization"
 
-_TestCase_serialization = (Core.Name "serialization")
+_TestCase_simplifyTerm = Core.Name "simplifyTerm"
 
-_TestCase_simplifyTerm = (Core.Name "simplifyTerm")
+_TestCase_topologicalSort = Core.Name "topologicalSort"
 
-_TestCase_topologicalSort = (Core.Name "topologicalSort")
+_TestCase_topologicalSortBindings = Core.Name "topologicalSortBindings"
 
-_TestCase_topologicalSortBindings = (Core.Name "topologicalSortBindings")
+_TestCase_topologicalSortSCC = Core.Name "topologicalSortSCC"
 
-_TestCase_topologicalSortSCC = (Core.Name "topologicalSortSCC")
+_TestCase_typeChecking = Core.Name "typeChecking"
 
-_TestCase_typeChecking = (Core.Name "typeChecking")
+_TestCase_typeCheckingFailure = Core.Name "typeCheckingFailure"
 
-_TestCase_typeCheckingFailure = (Core.Name "typeCheckingFailure")
+_TestCase_typeReduction = Core.Name "typeReduction"
 
-_TestCase_typeReduction = (Core.Name "typeReduction")
+_TestCase_normalizeTypeVariables = Core.Name "normalizeTypeVariables"
 
-_TestCase_normalizeTypeVariables = (Core.Name "normalizeTypeVariables")
+_TestCase_foldOverTerm = Core.Name "foldOverTerm"
 
-_TestCase_foldOverTerm = (Core.Name "foldOverTerm")
+_TestCase_rewriteTerm = Core.Name "rewriteTerm"
 
-_TestCase_rewriteTerm = (Core.Name "rewriteTerm")
+_TestCase_rewriteType = Core.Name "rewriteType"
 
-_TestCase_rewriteType = (Core.Name "rewriteType")
+_TestCase_hoistSubterms = Core.Name "hoistSubterms"
 
-_TestCase_hoistSubterms = (Core.Name "hoistSubterms")
+_TestCase_hoistCaseStatements = Core.Name "hoistCaseStatements"
 
-_TestCase_hoistCaseStatements = (Core.Name "hoistCaseStatements")
+_TestCase_hoistLetBindings = Core.Name "hoistLetBindings"
 
-_TestCase_hoistLetBindings = (Core.Name "hoistLetBindings")
+_TestCase_hoistPolymorphicLetBindings = Core.Name "hoistPolymorphicLetBindings"
 
-_TestCase_hoistPolymorphicLetBindings = (Core.Name "hoistPolymorphicLetBindings")
+_TestCase_substInType = Core.Name "substInType"
 
-_TestCase_substInType = (Core.Name "substInType")
+_TestCase_variableOccursInType = Core.Name "variableOccursInType"
 
-_TestCase_variableOccursInType = (Core.Name "variableOccursInType")
+_TestCase_unifyTypes = Core.Name "unifyTypes"
 
-_TestCase_unifyTypes = (Core.Name "unifyTypes")
+_TestCase_joinTypes = Core.Name "joinTypes"
 
-_TestCase_joinTypes = (Core.Name "joinTypes")
+_TestCase_unshadowVariables = Core.Name "unshadowVariables"
 
-_TestCase_unshadowVariables = (Core.Name "unshadowVariables")
+_TestCase_validateCoreTerm = Core.Name "validateCoreTerm"
 
 -- | One of a number of test case variants, together with metadata including a test name, an optional description, and optional tags
-data TestCaseWithMetadata = 
+data TestCaseWithMetadata =
   TestCaseWithMetadata {
     -- | The name of the test case
     testCaseWithMetadataName :: String,
@@ -744,18 +747,18 @@
     testCaseWithMetadataTags :: [Tag]}
   deriving (Eq, Ord, Read, Show)
 
-_TestCaseWithMetadata = (Core.Name "hydra.testing.TestCaseWithMetadata")
+_TestCaseWithMetadata = Core.Name "hydra.testing.TestCaseWithMetadata"
 
-_TestCaseWithMetadata_name = (Core.Name "name")
+_TestCaseWithMetadata_name = Core.Name "name"
 
-_TestCaseWithMetadata_case = (Core.Name "case")
+_TestCaseWithMetadata_case = Core.Name "case"
 
-_TestCaseWithMetadata_description = (Core.Name "description")
+_TestCaseWithMetadata_description = Core.Name "description"
 
-_TestCaseWithMetadata_tags = (Core.Name "tags")
+_TestCaseWithMetadata_tags = Core.Name "tags"
 
 -- | A collection of test cases with a name and optional description
-data TestGroup = 
+data TestGroup =
   TestGroup {
     -- | The name of the test group
     testGroupName :: String,
@@ -767,18 +770,18 @@
     testGroupCases :: [TestCaseWithMetadata]}
   deriving (Eq, Ord, Read, Show)
 
-_TestGroup = (Core.Name "hydra.testing.TestGroup")
+_TestGroup = Core.Name "hydra.testing.TestGroup"
 
-_TestGroup_name = (Core.Name "name")
+_TestGroup_name = Core.Name "name"
 
-_TestGroup_description = (Core.Name "description")
+_TestGroup_description = Core.Name "description"
 
-_TestGroup_subgroups = (Core.Name "subgroups")
+_TestGroup_subgroups = Core.Name "subgroups"
 
-_TestGroup_cases = (Core.Name "cases")
+_TestGroup_cases = Core.Name "cases"
 
 -- | A test case which performs type checking on a given term and compares the result with an expected annotated term and type
-data TypeCheckingTestCase = 
+data TypeCheckingTestCase =
   TypeCheckingTestCase {
     -- | An untyped term on which to perform inference, then type check
     typeCheckingTestCaseInput :: Core.Term,
@@ -788,27 +791,27 @@
     typeCheckingTestCaseOutputType :: Core.Type}
   deriving (Eq, Ord, Read, Show)
 
-_TypeCheckingTestCase = (Core.Name "hydra.testing.TypeCheckingTestCase")
+_TypeCheckingTestCase = Core.Name "hydra.testing.TypeCheckingTestCase"
 
-_TypeCheckingTestCase_input = (Core.Name "input")
+_TypeCheckingTestCase_input = Core.Name "input"
 
-_TypeCheckingTestCase_outputTerm = (Core.Name "outputTerm")
+_TypeCheckingTestCase_outputTerm = Core.Name "outputTerm"
 
-_TypeCheckingTestCase_outputType = (Core.Name "outputType")
+_TypeCheckingTestCase_outputType = Core.Name "outputType"
 
 -- | A test case providing a term for which type checking is expected to fail. Note: there are currently no such test cases.
-data TypeCheckingFailureTestCase = 
+data TypeCheckingFailureTestCase =
   TypeCheckingFailureTestCase {
     -- | The term for which type checking should fail
     typeCheckingFailureTestCaseInput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_TypeCheckingFailureTestCase = (Core.Name "hydra.testing.TypeCheckingFailureTestCase")
+_TypeCheckingFailureTestCase = Core.Name "hydra.testing.TypeCheckingFailureTestCase"
 
-_TypeCheckingFailureTestCase_input = (Core.Name "input")
+_TypeCheckingFailureTestCase_input = Core.Name "input"
 
 -- | A test case which performs topological sort on a map of bindings (name -> term) and compares the result with expected groups of bindings in topological order
-data TopologicalSortBindingsTestCase = 
+data TopologicalSortBindingsTestCase =
   TopologicalSortBindingsTestCase {
     -- | The bindings as a list of (name, term) pairs
     topologicalSortBindingsTestCaseBindings :: [(Core.Name, Core.Term)],
@@ -816,14 +819,14 @@
     topologicalSortBindingsTestCaseExpected :: [[(Core.Name, Core.Term)]]}
   deriving (Eq, Ord, Read, Show)
 
-_TopologicalSortBindingsTestCase = (Core.Name "hydra.testing.TopologicalSortBindingsTestCase")
+_TopologicalSortBindingsTestCase = Core.Name "hydra.testing.TopologicalSortBindingsTestCase"
 
-_TopologicalSortBindingsTestCase_bindings = (Core.Name "bindings")
+_TopologicalSortBindingsTestCase_bindings = Core.Name "bindings"
 
-_TopologicalSortBindingsTestCase_expected = (Core.Name "expected")
+_TopologicalSortBindingsTestCase_expected = Core.Name "expected"
 
 -- | A test case which performs topological sort on a directed graph and compares the result with either an expected sorted list or expected cycles
-data TopologicalSortTestCase = 
+data TopologicalSortTestCase =
   TopologicalSortTestCase {
     -- | The directed graph as an adjacency list (node to list of dependencies)
     topologicalSortTestCaseAdjacencyList :: [(Int, [Int])],
@@ -831,14 +834,14 @@
     topologicalSortTestCaseExpected :: (Either [[Int]] [Int])}
   deriving (Eq, Ord, Read, Show)
 
-_TopologicalSortTestCase = (Core.Name "hydra.testing.TopologicalSortTestCase")
+_TopologicalSortTestCase = Core.Name "hydra.testing.TopologicalSortTestCase"
 
-_TopologicalSortTestCase_adjacencyList = (Core.Name "adjacencyList")
+_TopologicalSortTestCase_adjacencyList = Core.Name "adjacencyList"
 
-_TopologicalSortTestCase_expected = (Core.Name "expected")
+_TopologicalSortTestCase_expected = Core.Name "expected"
 
 -- | A test case which performs topological sort with strongly connected component detection and compares the result with expected components
-data TopologicalSortSCCTestCase = 
+data TopologicalSortSCCTestCase =
   TopologicalSortSCCTestCase {
     -- | The directed graph as an adjacency list
     topologicalSortSCCTestCaseAdjacencyList :: [(Int, [Int])],
@@ -846,14 +849,14 @@
     topologicalSortSCCTestCaseExpected :: [[Int]]}
   deriving (Eq, Ord, Read, Show)
 
-_TopologicalSortSCCTestCase = (Core.Name "hydra.testing.TopologicalSortSCCTestCase")
+_TopologicalSortSCCTestCase = Core.Name "hydra.testing.TopologicalSortSCCTestCase"
 
-_TopologicalSortSCCTestCase_adjacencyList = (Core.Name "adjacencyList")
+_TopologicalSortSCCTestCase_adjacencyList = Core.Name "adjacencyList"
 
-_TopologicalSortSCCTestCase_expected = (Core.Name "expected")
+_TopologicalSortSCCTestCase_expected = Core.Name "expected"
 
 -- | A test case which serializes an AST expression to a string and compares it with the expected output
-data SerializationTestCase = 
+data SerializationTestCase =
   SerializationTestCase {
     -- | The AST expression to serialize
     serializationTestCaseInput :: Ast.Expr,
@@ -861,14 +864,14 @@
     serializationTestCaseOutput :: String}
   deriving (Eq, Ord, Read, Show)
 
-_SerializationTestCase = (Core.Name "hydra.testing.SerializationTestCase")
+_SerializationTestCase = Core.Name "hydra.testing.SerializationTestCase"
 
-_SerializationTestCase_input = (Core.Name "input")
+_SerializationTestCase_input = Core.Name "input"
 
-_SerializationTestCase_output = (Core.Name "output")
+_SerializationTestCase_output = Core.Name "output"
 
 -- | A test case which performs term simplification (beta reduction and optimization) and compares the result with the expected term
-data SimplifyTermTestCase = 
+data SimplifyTermTestCase =
   SimplifyTermTestCase {
     -- | The term to simplify
     simplifyTermTestCaseInput :: Core.Term,
@@ -876,14 +879,14 @@
     simplifyTermTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_SimplifyTermTestCase = (Core.Name "hydra.testing.SimplifyTermTestCase")
+_SimplifyTermTestCase = Core.Name "hydra.testing.SimplifyTermTestCase"
 
-_SimplifyTermTestCase_input = (Core.Name "input")
+_SimplifyTermTestCase_input = Core.Name "input"
 
-_SimplifyTermTestCase_output = (Core.Name "output")
+_SimplifyTermTestCase_output = Core.Name "output"
 
 -- | A test case which normalizes type variables in a term (renaming them to t0, t1, t2, etc.) and compares the result with the expected term
-data NormalizeTypeVariablesTestCase = 
+data NormalizeTypeVariablesTestCase =
   NormalizeTypeVariablesTestCase {
     -- | The term with type annotations to normalize
     normalizeTypeVariablesTestCaseInput :: Core.Term,
@@ -891,14 +894,14 @@
     normalizeTypeVariablesTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_NormalizeTypeVariablesTestCase = (Core.Name "hydra.testing.NormalizeTypeVariablesTestCase")
+_NormalizeTypeVariablesTestCase = Core.Name "hydra.testing.NormalizeTypeVariablesTestCase"
 
-_NormalizeTypeVariablesTestCase_input = (Core.Name "input")
+_NormalizeTypeVariablesTestCase_input = Core.Name "input"
 
-_NormalizeTypeVariablesTestCase_output = (Core.Name "output")
+_NormalizeTypeVariablesTestCase_output = Core.Name "output"
 
 -- | A test case which performs beta reduction on a type (reducing type applications) and compares the result with the expected type
-data TypeReductionTestCase = 
+data TypeReductionTestCase =
   TypeReductionTestCase {
     -- | The type to reduce
     typeReductionTestCaseInput :: Core.Type,
@@ -906,14 +909,14 @@
     typeReductionTestCaseOutput :: Core.Type}
   deriving (Eq, Ord, Read, Show)
 
-_TypeReductionTestCase = (Core.Name "hydra.testing.TypeReductionTestCase")
+_TypeReductionTestCase = Core.Name "hydra.testing.TypeReductionTestCase"
 
-_TypeReductionTestCase_input = (Core.Name "input")
+_TypeReductionTestCase_input = Core.Name "input"
 
-_TypeReductionTestCase_output = (Core.Name "output")
+_TypeReductionTestCase_output = Core.Name "output"
 
 -- | A test case which writes a value to a string and compares it to the expected string
-data WriterTestCase a = 
+data WriterTestCase a =
   WriterTestCase {
     -- | The input value to write
     writerTestCaseInput :: a,
@@ -921,14 +924,14 @@
     writerTestCaseOutput :: String}
   deriving (Eq, Ord, Read, Show)
 
-_WriterTestCase = (Core.Name "hydra.testing.WriterTestCase")
+_WriterTestCase = Core.Name "hydra.testing.WriterTestCase"
 
-_WriterTestCase_input = (Core.Name "input")
+_WriterTestCase_input = Core.Name "input"
 
-_WriterTestCase_output = (Core.Name "output")
+_WriterTestCase_output = Core.Name "output"
 
 -- | A test case which applies a type substitution to a type and compares the result. The substitution is provided as a list of (variable name, replacement type) pairs.
-data SubstInTypeTestCase = 
+data SubstInTypeTestCase =
   SubstInTypeTestCase {
     -- | The type substitution as a list of (name, type) pairs
     substInTypeTestCaseSubstitution :: [(Core.Name, Core.Type)],
@@ -938,16 +941,16 @@
     substInTypeTestCaseOutput :: Core.Type}
   deriving (Eq, Ord, Read, Show)
 
-_SubstInTypeTestCase = (Core.Name "hydra.testing.SubstInTypeTestCase")
+_SubstInTypeTestCase = Core.Name "hydra.testing.SubstInTypeTestCase"
 
-_SubstInTypeTestCase_substitution = (Core.Name "substitution")
+_SubstInTypeTestCase_substitution = Core.Name "substitution"
 
-_SubstInTypeTestCase_input = (Core.Name "input")
+_SubstInTypeTestCase_input = Core.Name "input"
 
-_SubstInTypeTestCase_output = (Core.Name "output")
+_SubstInTypeTestCase_output = Core.Name "output"
 
 -- | A test case which checks whether a type variable occurs in a type expression. This is the occur check used in type unification.
-data VariableOccursInTypeTestCase = 
+data VariableOccursInTypeTestCase =
   VariableOccursInTypeTestCase {
     -- | The variable name to search for
     variableOccursInTypeTestCaseVariable :: Core.Name,
@@ -957,16 +960,16 @@
     variableOccursInTypeTestCaseExpected :: Bool}
   deriving (Eq, Ord, Read, Show)
 
-_VariableOccursInTypeTestCase = (Core.Name "hydra.testing.VariableOccursInTypeTestCase")
+_VariableOccursInTypeTestCase = Core.Name "hydra.testing.VariableOccursInTypeTestCase"
 
-_VariableOccursInTypeTestCase_variable = (Core.Name "variable")
+_VariableOccursInTypeTestCase_variable = Core.Name "variable"
 
-_VariableOccursInTypeTestCase_type = (Core.Name "type")
+_VariableOccursInTypeTestCase_type = Core.Name "type"
 
-_VariableOccursInTypeTestCase_expected = (Core.Name "expected")
+_VariableOccursInTypeTestCase_expected = Core.Name "expected"
 
 -- | A test case which renames shadowed variables in a term and compares the result with the expected term
-data UnshadowVariablesTestCase = 
+data UnshadowVariablesTestCase =
   UnshadowVariablesTestCase {
     -- | The term with potentially shadowed variables
     unshadowVariablesTestCaseInput :: Core.Term,
@@ -974,14 +977,14 @@
     unshadowVariablesTestCaseOutput :: Core.Term}
   deriving (Eq, Ord, Read, Show)
 
-_UnshadowVariablesTestCase = (Core.Name "hydra.testing.UnshadowVariablesTestCase")
+_UnshadowVariablesTestCase = Core.Name "hydra.testing.UnshadowVariablesTestCase"
 
-_UnshadowVariablesTestCase_input = (Core.Name "input")
+_UnshadowVariablesTestCase_input = Core.Name "input"
 
-_UnshadowVariablesTestCase_output = (Core.Name "output")
+_UnshadowVariablesTestCase_output = Core.Name "output"
 
 -- | A test case which attempts to unify two types and compares the result. The expected result is either Left (failure message substring) or Right (substitution).
-data UnifyTypesTestCase = 
+data UnifyTypesTestCase =
   UnifyTypesTestCase {
     -- | The schema types map (type variable names that should not be bound)
     unifyTypesTestCaseSchemaTypes :: [Core.Name],
@@ -993,18 +996,18 @@
     unifyTypesTestCaseExpected :: (Either String Typing.TypeSubst)}
   deriving (Eq, Ord, Read, Show)
 
-_UnifyTypesTestCase = (Core.Name "hydra.testing.UnifyTypesTestCase")
+_UnifyTypesTestCase = Core.Name "hydra.testing.UnifyTypesTestCase"
 
-_UnifyTypesTestCase_schemaTypes = (Core.Name "schemaTypes")
+_UnifyTypesTestCase_schemaTypes = Core.Name "schemaTypes"
 
-_UnifyTypesTestCase_left = (Core.Name "left")
+_UnifyTypesTestCase_left = Core.Name "left"
 
-_UnifyTypesTestCase_right = (Core.Name "right")
+_UnifyTypesTestCase_right = Core.Name "right"
 
-_UnifyTypesTestCase_expected = (Core.Name "expected")
+_UnifyTypesTestCase_expected = Core.Name "expected"
 
 -- | A test case which joins two types (producing type constraints or failing). The expected result is either Left (failure) or Right (list of constraints).
-data JoinTypesTestCase = 
+data JoinTypesTestCase =
   JoinTypesTestCase {
     -- | The left type to join
     joinTypesTestCaseLeft :: Core.Type,
@@ -1014,10 +1017,29 @@
     joinTypesTestCaseExpected :: (Either () [Typing.TypeConstraint])}
   deriving (Eq, Ord, Read, Show)
 
-_JoinTypesTestCase = (Core.Name "hydra.testing.JoinTypesTestCase")
+_JoinTypesTestCase = Core.Name "hydra.testing.JoinTypesTestCase"
 
-_JoinTypesTestCase_left = (Core.Name "left")
+_JoinTypesTestCase_left = Core.Name "left"
 
-_JoinTypesTestCase_right = (Core.Name "right")
+_JoinTypesTestCase_right = Core.Name "right"
 
-_JoinTypesTestCase_expected = (Core.Name "expected")
+_JoinTypesTestCase_expected = Core.Name "expected"
+
+-- | A test case which validates a term and compares the result with an expected Maybe InvalidTermError
+data ValidateCoreTermTestCase =
+  ValidateCoreTermTestCase {
+    -- | Whether to expect System F (typed) terms. When true, type variable binding checks and UntypedTermVariableError are active.
+    validateCoreTermTestCaseTyped :: Bool,
+    -- | The term to validate
+    validateCoreTermTestCaseInput :: Core.Term,
+    -- | The expected validation result (Nothing if valid, Just error if invalid)
+    validateCoreTermTestCaseOutput :: (Maybe Core_.InvalidTermError)}
+  deriving (Eq, Ord, Read, Show)
+
+_ValidateCoreTermTestCase = Core.Name "hydra.testing.ValidateCoreTermTestCase"
+
+_ValidateCoreTermTestCase_typed = Core.Name "typed"
+
+_ValidateCoreTermTestCase_input = Core.Name "input"
+
+_ValidateCoreTermTestCase_output = Core.Name "output"
diff --git a/src/gen-main/haskell/Hydra/Topology.hs b/src/gen-main/haskell/Hydra/Topology.hs
--- a/src/gen-main/haskell/Hydra/Topology.hs
+++ b/src/gen-main/haskell/Hydra/Topology.hs
@@ -15,22 +15,22 @@
 -- | A directed graph represented as an adjacency list mapping vertices to their outgoing neighbors
 type Graph = (M.Map Vertex [Vertex])
 
-_Graph = (Core.Name "hydra.topology.Graph")
+_Graph = Core.Name "hydra.topology.Graph"
 
-data OrderingIsomorphism a = 
+data OrderingIsomorphism a =
   OrderingIsomorphism {
     -- | Mapping from source ordering to target ordering
     orderingIsomorphismEncode :: ([a] -> [a]),
     -- | Mapping from target ordering to source ordering
     orderingIsomorphismDecode :: ([a] -> [a])}
 
-_OrderingIsomorphism = (Core.Name "hydra.topology.OrderingIsomorphism")
+_OrderingIsomorphism = Core.Name "hydra.topology.OrderingIsomorphism"
 
-_OrderingIsomorphism_encode = (Core.Name "encode")
+_OrderingIsomorphism_encode = Core.Name "encode"
 
-_OrderingIsomorphism_decode = (Core.Name "decode")
+_OrderingIsomorphism_decode = Core.Name "decode"
 
-data TarjanState = 
+data TarjanState =
   TarjanState {
     -- | Next available index for vertices in the DFS traversal
     tarjanStateCounter :: Int,
@@ -46,21 +46,21 @@
     tarjanStateSccs :: [[Vertex]]}
   deriving (Eq, Ord, Read, Show)
 
-_TarjanState = (Core.Name "hydra.topology.TarjanState")
+_TarjanState = Core.Name "hydra.topology.TarjanState"
 
-_TarjanState_counter = (Core.Name "counter")
+_TarjanState_counter = Core.Name "counter"
 
-_TarjanState_indices = (Core.Name "indices")
+_TarjanState_indices = Core.Name "indices"
 
-_TarjanState_lowLinks = (Core.Name "lowLinks")
+_TarjanState_lowLinks = Core.Name "lowLinks"
 
-_TarjanState_stack = (Core.Name "stack")
+_TarjanState_stack = Core.Name "stack"
 
-_TarjanState_onStack = (Core.Name "onStack")
+_TarjanState_onStack = Core.Name "onStack"
 
-_TarjanState_sccs = (Core.Name "sccs")
+_TarjanState_sccs = Core.Name "sccs"
 
 -- | A graph vertex, represented as a 32-bit integer identifier
 type Vertex = Int
 
-_Vertex = (Core.Name "hydra.topology.Vertex")
+_Vertex = Core.Name "hydra.topology.Vertex"
diff --git a/src/gen-main/haskell/Hydra/Typing.hs b/src/gen-main/haskell/Hydra/Typing.hs
--- a/src/gen-main/haskell/Hydra/Typing.hs
+++ b/src/gen-main/haskell/Hydra/Typing.hs
@@ -4,6 +4,7 @@
 
 module Hydra.Typing where
 
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -13,7 +14,7 @@
 import qualified Data.Set as S
 
 -- | A structured representation of a function term's components, replacing ad-hoc tuples. This captures all the information extracted from peeling lambdas, type lambdas, lets, and type applications from a term.
-data FunctionStructure env = 
+data FunctionStructure env =
   FunctionStructure {
     -- | Type parameters (from type lambdas)
     functionStructureTypeParams :: [Core.Name],
@@ -31,51 +32,24 @@
     functionStructureEnvironment :: env}
   deriving (Eq, Ord, Read, Show)
 
-_FunctionStructure = (Core.Name "hydra.typing.FunctionStructure")
-
-_FunctionStructure_typeParams = (Core.Name "typeParams")
-
-_FunctionStructure_params = (Core.Name "params")
-
-_FunctionStructure_bindings = (Core.Name "bindings")
-
-_FunctionStructure_body = (Core.Name "body")
-
-_FunctionStructure_domains = (Core.Name "domains")
-
-_FunctionStructure_codomain = (Core.Name "codomain")
-
-_FunctionStructure_environment = (Core.Name "environment")
+_FunctionStructure = Core.Name "hydra.typing.FunctionStructure"
 
--- | The context provided to type inference, including various typing environments.
-data InferenceContext = 
-  InferenceContext {
-    -- | A fixed typing environment which is derived from the schema of the graph.
-    inferenceContextSchemaTypes :: (M.Map Core.Name Core.TypeScheme),
-    -- | A fixed typing environment which is derived from the set of primitives in the graph.
-    inferenceContextPrimitiveTypes :: (M.Map Core.Name Core.TypeScheme),
-    -- | A mutable typing environment which is specific to the current graph being processed. This environment is (usually) smaller than the schema and primitive typing environments, and is subject to global substitutions.
-    inferenceContextDataTypes :: (M.Map Core.Name Core.TypeScheme),
-    -- | A mutable map from type variable names to their accumulated class constraints. This is populated during type inference when operations requiring Eq or Ord are encountered.
-    inferenceContextClassConstraints :: (M.Map Core.Name Core.TypeVariableMetadata),
-    -- | Whether to enable debug output during type inference
-    inferenceContextDebug :: Bool}
-  deriving (Eq, Ord, Read, Show)
+_FunctionStructure_typeParams = Core.Name "typeParams"
 
-_InferenceContext = (Core.Name "hydra.typing.InferenceContext")
+_FunctionStructure_params = Core.Name "params"
 
-_InferenceContext_schemaTypes = (Core.Name "schemaTypes")
+_FunctionStructure_bindings = Core.Name "bindings"
 
-_InferenceContext_primitiveTypes = (Core.Name "primitiveTypes")
+_FunctionStructure_body = Core.Name "body"
 
-_InferenceContext_dataTypes = (Core.Name "dataTypes")
+_FunctionStructure_domains = Core.Name "domains"
 
-_InferenceContext_classConstraints = (Core.Name "classConstraints")
+_FunctionStructure_codomain = Core.Name "codomain"
 
-_InferenceContext_debug = (Core.Name "debug")
+_FunctionStructure_environment = Core.Name "environment"
 
 -- | The result of applying inference rules to a term.
-data InferenceResult = 
+data InferenceResult =
   InferenceResult {
     -- | The term which was inferred
     inferenceResultTerm :: Core.Term,
@@ -84,29 +58,33 @@
     -- | The type substitution resulting from unification
     inferenceResultSubst :: TypeSubst,
     -- | Class constraints discovered during inference (e.g., Ord constraints from Map.lookup)
-    inferenceResultClassConstraints :: (M.Map Core.Name Core.TypeVariableMetadata)}
+    inferenceResultClassConstraints :: (M.Map Core.Name Core.TypeVariableMetadata),
+    -- | The updated context after inference (carries fresh variable state)
+    inferenceResultContext :: Context.Context}
   deriving (Eq, Ord, Read, Show)
 
-_InferenceResult = (Core.Name "hydra.typing.InferenceResult")
+_InferenceResult = Core.Name "hydra.typing.InferenceResult"
 
-_InferenceResult_term = (Core.Name "term")
+_InferenceResult_term = Core.Name "term"
 
-_InferenceResult_type = (Core.Name "type")
+_InferenceResult_type = Core.Name "type"
 
-_InferenceResult_subst = (Core.Name "subst")
+_InferenceResult_subst = Core.Name "subst"
 
-_InferenceResult_classConstraints = (Core.Name "classConstraints")
+_InferenceResult_classConstraints = Core.Name "classConstraints"
 
+_InferenceResult_context = Core.Name "context"
+
 -- | A substitution of term variables for terms
-newtype TermSubst = 
+newtype TermSubst =
   TermSubst {
     unTermSubst :: (M.Map Core.Name Core.Term)}
   deriving (Eq, Ord, Read, Show)
 
-_TermSubst = (Core.Name "hydra.typing.TermSubst")
+_TermSubst = Core.Name "hydra.typing.TermSubst"
 
 -- | An assertion that two types can be unified into a single type
-data TypeConstraint = 
+data TypeConstraint =
   TypeConstraint {
     -- | The left-hand side of the constraint
     typeConstraintLeft :: Core.Type,
@@ -116,49 +94,18 @@
     typeConstraintComment :: String}
   deriving (Eq, Ord, Read, Show)
 
-_TypeConstraint = (Core.Name "hydra.typing.TypeConstraint")
-
-_TypeConstraint_left = (Core.Name "left")
-
-_TypeConstraint_right = (Core.Name "right")
-
-_TypeConstraint_comment = (Core.Name "comment")
-
--- | A typing environment used for type reconstruction (typeOf) over System F terms
-data TypeContext = 
-  TypeContext {
-    -- | A mapping of lambda- and let-bound variables to their types
-    typeContextTypes :: (M.Map Core.Name Core.Type),
-    -- | Any additional metadata about lambda- and let-bound variables
-    typeContextMetadata :: (M.Map Core.Name Core.Term),
-    -- | The set of type variables introduced by enclosing type lambdas
-    typeContextTypeVariables :: (S.Set Core.Name),
-    -- | The set of term variables introduced by lambdas (even if untyped)
-    typeContextLambdaVariables :: (S.Set Core.Name),
-    -- | The set of term variables introduced by let bindings (even if untyped)
-    typeContextLetVariables :: (S.Set Core.Name),
-    -- | The schema types, primitive types, and data types of the graph
-    typeContextInferenceContext :: InferenceContext}
-  deriving (Eq, Ord, Read, Show)
-
-_TypeContext = (Core.Name "hydra.typing.TypeContext")
-
-_TypeContext_types = (Core.Name "types")
-
-_TypeContext_metadata = (Core.Name "metadata")
-
-_TypeContext_typeVariables = (Core.Name "typeVariables")
+_TypeConstraint = Core.Name "hydra.typing.TypeConstraint"
 
-_TypeContext_lambdaVariables = (Core.Name "lambdaVariables")
+_TypeConstraint_left = Core.Name "left"
 
-_TypeContext_letVariables = (Core.Name "letVariables")
+_TypeConstraint_right = Core.Name "right"
 
-_TypeContext_inferenceContext = (Core.Name "inferenceContext")
+_TypeConstraint_comment = Core.Name "comment"
 
 -- | A substitution of type variables for types
-newtype TypeSubst = 
+newtype TypeSubst =
   TypeSubst {
     unTypeSubst :: (M.Map Core.Name Core.Type)}
   deriving (Eq, Ord, Read, Show)
 
-_TypeSubst = (Core.Name "hydra.typing.TypeSubst")
+_TypeSubst = Core.Name "hydra.typing.TypeSubst"
diff --git a/src/gen-main/haskell/Hydra/Unification.hs b/src/gen-main/haskell/Hydra/Unification.hs
--- a/src/gen-main/haskell/Hydra/Unification.hs
+++ b/src/gen-main/haskell/Hydra/Unification.hs
@@ -5,10 +5,11 @@
 module Hydra.Unification where
 
 import qualified Hydra.Coders as Coders
-import qualified Hydra.Compute as Compute
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Maps as Maps
@@ -26,134 +27,155 @@
 import qualified Data.Set as S
 
 -- | Join two types, producing a list of type constraints.The comment is used to provide context for the constraints.
-joinTypes :: (Core.Type -> Core.Type -> String -> Compute.Flow t0 [Typing.TypeConstraint])
-joinTypes left right comment =  
-  let sleft = (Rewriting.deannotateType left)
-  in  
-    let sright = (Rewriting.deannotateType right)
-    in  
-      let joinOne = (\l -> \r -> Typing.TypeConstraint {
-              Typing.typeConstraintLeft = l,
-              Typing.typeConstraintRight = r,
-              Typing.typeConstraintComment = (Strings.cat2 "join types; " comment)})
-      in  
-        let cannotUnify = (Flows.fail (Strings.cat2 (Strings.cat2 (Strings.cat2 "cannot unify " (Core_.type_ sleft)) " with ") (Core_.type_ sright)))
-        in  
-          let assertEqual = (Logic.ifElse (Equality.equal sleft sright) (Flows.pure []) cannotUnify)
-          in  
-            let joinList = (\lefts -> \rights -> Logic.ifElse (Equality.equal (Lists.length lefts) (Lists.length rights)) (Flows.pure (Lists.zipWith joinOne lefts rights)) cannotUnify)
-            in  
-              let joinRowTypes = (\left -> \right -> Logic.ifElse (Logic.and (Equality.equal (Core.unName (Core.rowTypeTypeName left)) (Core.unName (Core.rowTypeTypeName right))) (Logic.and (Equality.equal (Lists.length (Lists.map Core.fieldTypeName (Core.rowTypeFields left))) (Lists.length (Lists.map Core.fieldTypeName (Core.rowTypeFields right)))) (Lists.foldl Logic.and True (Lists.zipWith (\left -> \right -> Equality.equal (Core.unName left) (Core.unName right)) (Lists.map Core.fieldTypeName (Core.rowTypeFields left)) (Lists.map Core.fieldTypeName (Core.rowTypeFields right)))))) (joinList (Lists.map Core.fieldTypeType (Core.rowTypeFields left)) (Lists.map Core.fieldTypeType (Core.rowTypeFields right))) cannotUnify)
-              in ((\x -> case x of
-                Core.TypeApplication v1 -> ((\x -> case x of
-                  Core.TypeApplication v2 -> (Flows.pure [
-                    joinOne (Core.applicationTypeFunction v1) (Core.applicationTypeFunction v2),
-                    (joinOne (Core.applicationTypeArgument v1) (Core.applicationTypeArgument v2))])
-                  _ -> cannotUnify) sright)
-                Core.TypeEither v1 -> ((\x -> case x of
-                  Core.TypeEither v2 -> (Flows.pure [
-                    joinOne (Core.eitherTypeLeft v1) (Core.eitherTypeLeft v2),
-                    (joinOne (Core.eitherTypeRight v1) (Core.eitherTypeRight v2))])
-                  _ -> cannotUnify) sright)
-                Core.TypeFunction v1 -> ((\x -> case x of
-                  Core.TypeFunction v2 -> (Flows.pure [
-                    joinOne (Core.functionTypeDomain v1) (Core.functionTypeDomain v2),
-                    (joinOne (Core.functionTypeCodomain v1) (Core.functionTypeCodomain v2))])
-                  _ -> cannotUnify) sright)
-                Core.TypeList v1 -> ((\x -> case x of
-                  Core.TypeList v2 -> (Flows.pure [
-                    joinOne v1 v2])
-                  _ -> cannotUnify) sright)
-                Core.TypeLiteral _ -> assertEqual
-                Core.TypeMap v1 -> ((\x -> case x of
-                  Core.TypeMap v2 -> (Flows.pure [
-                    joinOne (Core.mapTypeKeys v1) (Core.mapTypeKeys v2),
-                    (joinOne (Core.mapTypeValues v1) (Core.mapTypeValues v2))])
-                  _ -> cannotUnify) sright)
-                Core.TypeMaybe v1 -> ((\x -> case x of
-                  Core.TypeMaybe v2 -> (Flows.pure [
-                    joinOne v1 v2])
-                  _ -> cannotUnify) sright)
-                Core.TypePair v1 -> ((\x -> case x of
-                  Core.TypePair v2 -> (Flows.pure [
-                    joinOne (Core.pairTypeFirst v1) (Core.pairTypeFirst v2),
-                    (joinOne (Core.pairTypeSecond v1) (Core.pairTypeSecond v2))])
-                  _ -> cannotUnify) sright)
-                Core.TypeRecord v1 -> ((\x -> case x of
-                  Core.TypeRecord v2 -> (joinRowTypes v1 v2)
-                  _ -> cannotUnify) sright)
-                Core.TypeSet v1 -> ((\x -> case x of
-                  Core.TypeSet v2 -> (Flows.pure [
-                    joinOne v1 v2])
-                  _ -> cannotUnify) sright)
-                Core.TypeUnion v1 -> ((\x -> case x of
-                  Core.TypeUnion v2 -> (joinRowTypes v1 v2)
-                  _ -> cannotUnify) sright)
-                Core.TypeUnit -> ((\x -> case x of
-                  Core.TypeUnit -> (Flows.pure [])
-                  _ -> cannotUnify) sright)
-                Core.TypeWrap v1 -> ((\x -> case x of
-                  Core.TypeWrap v2 -> (Logic.ifElse (Equality.equal (Core.unName (Core.wrappedTypeTypeName v1)) (Core.unName (Core.wrappedTypeTypeName v2))) (Flows.pure [
-                    joinOne (Core.wrappedTypeBody v1) (Core.wrappedTypeBody v2)]) cannotUnify)
-                  _ -> cannotUnify) sright)
-                _ -> cannotUnify) sleft)
+joinTypes :: Context.Context -> Core.Type -> Core.Type -> String -> Either (Context.InContext Errors.UnificationError) [Typing.TypeConstraint]
+joinTypes cx left right comment =
 
+      let sleft = Rewriting.deannotateType left
+          sright = Rewriting.deannotateType right
+          joinOne =
+                  \l -> \r -> Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = l,
+                    Typing.typeConstraintRight = r,
+                    Typing.typeConstraintComment = (Strings.cat2 "join types; " comment)}
+          cannotUnify =
+                  Left (Context.InContext {
+                    Context.inContextObject = Errors.UnificationError {
+                      Errors.unificationErrorLeftType = sleft,
+                      Errors.unificationErrorRightType = sright,
+                      Errors.unificationErrorMessage = (Strings.cat2 (Strings.cat2 (Strings.cat2 "cannot unify " (Core_.type_ sleft)) " with ") (Core_.type_ sright))},
+                    Context.inContextContext = cx})
+          assertEqual = Logic.ifElse (Equality.equal sleft sright) (Right []) cannotUnify
+          joinList =
+                  \lefts -> \rights -> Logic.ifElse (Equality.equal (Lists.length lefts) (Lists.length rights)) (Right (Lists.zipWith joinOne lefts rights)) cannotUnify
+          joinRowTypes =
+                  \left -> \right -> Logic.ifElse (Logic.and (Equality.equal (Lists.length (Lists.map Core.fieldTypeName left)) (Lists.length (Lists.map Core.fieldTypeName right))) (Lists.foldl Logic.and True (Lists.zipWith (\left -> \right -> Equality.equal (Core.unName left) (Core.unName right)) (Lists.map Core.fieldTypeName left) (Lists.map Core.fieldTypeName right)))) (joinList (Lists.map Core.fieldTypeType left) (Lists.map Core.fieldTypeType right)) cannotUnify
+      in case sleft of
+        Core.TypeApplication v0 -> case sright of
+          Core.TypeApplication v1 -> Right [
+            joinOne (Core.applicationTypeFunction v0) (Core.applicationTypeFunction v1),
+            (joinOne (Core.applicationTypeArgument v0) (Core.applicationTypeArgument v1))]
+          _ -> cannotUnify
+        Core.TypeEither v0 -> case sright of
+          Core.TypeEither v1 -> Right [
+            joinOne (Core.eitherTypeLeft v0) (Core.eitherTypeLeft v1),
+            (joinOne (Core.eitherTypeRight v0) (Core.eitherTypeRight v1))]
+          _ -> cannotUnify
+        Core.TypeFunction v0 -> case sright of
+          Core.TypeFunction v1 -> Right [
+            joinOne (Core.functionTypeDomain v0) (Core.functionTypeDomain v1),
+            (joinOne (Core.functionTypeCodomain v0) (Core.functionTypeCodomain v1))]
+          _ -> cannotUnify
+        Core.TypeList v0 -> case sright of
+          Core.TypeList v1 -> Right [
+            joinOne v0 v1]
+          _ -> cannotUnify
+        Core.TypeLiteral _ -> assertEqual
+        Core.TypeMap v0 -> case sright of
+          Core.TypeMap v1 -> Right [
+            joinOne (Core.mapTypeKeys v0) (Core.mapTypeKeys v1),
+            (joinOne (Core.mapTypeValues v0) (Core.mapTypeValues v1))]
+          _ -> cannotUnify
+        Core.TypeMaybe v0 -> case sright of
+          Core.TypeMaybe v1 -> Right [
+            joinOne v0 v1]
+          _ -> cannotUnify
+        Core.TypePair v0 -> case sright of
+          Core.TypePair v1 -> Right [
+            joinOne (Core.pairTypeFirst v0) (Core.pairTypeFirst v1),
+            (joinOne (Core.pairTypeSecond v0) (Core.pairTypeSecond v1))]
+          _ -> cannotUnify
+        Core.TypeRecord v0 -> case sright of
+          Core.TypeRecord v1 -> joinRowTypes v0 v1
+          _ -> cannotUnify
+        Core.TypeSet v0 -> case sright of
+          Core.TypeSet v1 -> Right [
+            joinOne v0 v1]
+          _ -> cannotUnify
+        Core.TypeUnion v0 -> case sright of
+          Core.TypeUnion v1 -> joinRowTypes v0 v1
+          _ -> cannotUnify
+        Core.TypeUnit -> case sright of
+          Core.TypeUnit -> Right []
+          _ -> cannotUnify
+        Core.TypeVoid -> case sright of
+          Core.TypeVoid -> Right []
+          _ -> cannotUnify
+        Core.TypeWrap v0 -> case sright of
+          Core.TypeWrap v1 -> Right [
+            joinOne v0 v1]
+          _ -> cannotUnify
+        _ -> cannotUnify
+
 -- | Robinson's algorithm, following https://www.cs.cornell.edu/courses/cs6110/2017sp/lectures/lec23.pdf
 -- | Specifically this is an implementation of the following rules:
 -- |   * Unify({(x, t)} ∪ E) = {t/x} Unify(E{t/x}) if x ∉ FV(t)
 -- |   * Unify(∅) = I (the identity substitution x ↦ x)
 -- |   * Unify({(x, x)} ∪ E) = Unify(E)
 -- |   * Unify({(f(s1, ..., sn), f(t1, ..., tn))} ∪ E) = Unify({(s1, t1), ..., (sn, tn)} ∪ E))
-unifyTypeConstraints :: (M.Map Core.Name t0 -> [Typing.TypeConstraint] -> Compute.Flow t1 Typing.TypeSubst)
-unifyTypeConstraints schemaTypes constraints =  
-  let withConstraint = (\c -> \rest ->  
-          let sleft = (Rewriting.deannotateType (Typing.typeConstraintLeft c))
-          in  
-            let sright = (Rewriting.deannotateType (Typing.typeConstraintRight c))
-            in  
-              let comment = (Typing.typeConstraintComment c)
-              in  
-                let bind = (\v -> \t ->  
-                        let subst = (Substitution.singletonTypeSubst v t)
-                        in  
-                          let withResult = (\s -> Substitution.composeTypeSubst subst s)
-                          in (Flows.map withResult (unifyTypeConstraints schemaTypes (Substitution.substituteInConstraints subst rest))))
-                in  
-                  let tryBinding = (\v -> \t -> Logic.ifElse (variableOccursInType v t) (Flows.fail (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "Variable " (Core.unName v)) " appears free in type ") (Core_.type_ t)) " (") comment) ")")) (bind v t))
-                  in  
-                    let noVars =  
-                            let withConstraints = (\constraints2 -> unifyTypeConstraints schemaTypes (Lists.concat2 constraints2 rest))
-                            in (Flows.bind (joinTypes sleft sright comment) withConstraints)
-                    in  
-                      let dflt = ((\x -> case x of
-                              Core.TypeVariable v1 -> (tryBinding v1 sleft)
-                              _ -> noVars) sright)
-                      in ((\x -> case x of
-                        Core.TypeVariable v1 -> ((\x -> case x of
-                          Core.TypeVariable v2 -> (Logic.ifElse (Equality.equal (Core.unName v1) (Core.unName v2)) (unifyTypeConstraints schemaTypes rest) (Logic.ifElse (Maybes.isJust (Maps.lookup v1 schemaTypes)) (Logic.ifElse (Maybes.isJust (Maps.lookup v2 schemaTypes)) (Flows.fail (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "Attempted to unify schema names " (Core.unName v1)) " and ") (Core.unName v2)) " (") comment) ")")) (bind v2 sleft)) (bind v1 sright)))
-                          _ -> (tryBinding v1 sright)) sright)
-                        _ -> dflt) sleft))
-  in (Logic.ifElse (Lists.null constraints) (Flows.pure Substitution.idTypeSubst) (withConstraint (Lists.head constraints) (Lists.tail constraints)))
+unifyTypeConstraints :: Context.Context -> M.Map Core.Name t0 -> [Typing.TypeConstraint] -> Either (Context.InContext Errors.UnificationError) Typing.TypeSubst
+unifyTypeConstraints cx schemaTypes constraints =
 
-unifyTypeLists :: (M.Map Core.Name t0 -> [Core.Type] -> [Core.Type] -> String -> Compute.Flow t1 Typing.TypeSubst)
-unifyTypeLists schemaTypes l r comment =  
-  let toConstraint = (\l -> \r -> Typing.TypeConstraint {
-          Typing.typeConstraintLeft = l,
-          Typing.typeConstraintRight = r,
-          Typing.typeConstraintComment = comment})
-  in (unifyTypeConstraints schemaTypes (Lists.zipWith toConstraint l r))
+      let withConstraint =
+              \c -> \rest ->
+                let sleft = Rewriting.deannotateType (Typing.typeConstraintLeft c)
+                    sright = Rewriting.deannotateType (Typing.typeConstraintRight c)
+                    comment = Typing.typeConstraintComment c
+                    bind =
+                            \v -> \t ->
+                              let subst = Substitution.singletonTypeSubst v t
+                                  withResult = \s -> Substitution.composeTypeSubst subst s
+                              in (Eithers.map withResult (unifyTypeConstraints cx schemaTypes (Substitution.substituteInConstraints subst rest)))
+                    tryBinding =
+                            \v -> \t -> Logic.ifElse (variableOccursInType v t) (Left (Context.InContext {
+                              Context.inContextObject = Errors.UnificationError {
+                                Errors.unificationErrorLeftType = sleft,
+                                Errors.unificationErrorRightType = sright,
+                                Errors.unificationErrorMessage = (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "Variable " (Core.unName v)) " appears free in type ") (Core_.type_ t)) " (") comment) ")")},
+                              Context.inContextContext = cx})) (bind v t)
+                    noVars =
 
-unifyTypes :: (M.Map Core.Name t0 -> Core.Type -> Core.Type -> String -> Compute.Flow t1 Typing.TypeSubst)
-unifyTypes schemaTypes l r comment = (unifyTypeConstraints schemaTypes [
-  Typing.TypeConstraint {
-    Typing.typeConstraintLeft = l,
-    Typing.typeConstraintRight = r,
-    Typing.typeConstraintComment = comment}])
+                              let withConstraints = \constraints2 -> unifyTypeConstraints cx schemaTypes (Lists.concat2 constraints2 rest)
+                              in (Eithers.bind (joinTypes cx sleft sright comment) withConstraints)
+                    dflt =
+                            case sright of
+                              Core.TypeVariable v0 -> tryBinding v0 sleft
+                              _ -> noVars
+                in case sleft of
+                  Core.TypeVariable v0 -> case sright of
+                    Core.TypeVariable v1 -> Logic.ifElse (Equality.equal (Core.unName v0) (Core.unName v1)) (unifyTypeConstraints cx schemaTypes rest) (Logic.ifElse (Maybes.isJust (Maps.lookup v0 schemaTypes)) (Logic.ifElse (Maybes.isJust (Maps.lookup v1 schemaTypes)) (Left (Context.InContext {
+                      Context.inContextObject = Errors.UnificationError {
+                        Errors.unificationErrorLeftType = sleft,
+                        Errors.unificationErrorRightType = sright,
+                        Errors.unificationErrorMessage = (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 (Strings.cat2 "Attempted to unify schema names " (Core.unName v0)) " and ") (Core.unName v1)) " (") comment) ")")},
+                      Context.inContextContext = cx})) (bind v1 sleft)) (bind v0 sright))
+                    _ -> tryBinding v0 sright
+                  _ -> dflt
+      in (Logic.ifElse (Lists.null constraints) (Right Substitution.idTypeSubst) (withConstraint (Lists.head constraints) (Lists.tail constraints)))
 
+unifyTypeLists :: Context.Context -> M.Map Core.Name t0 -> [Core.Type] -> [Core.Type] -> String -> Either (Context.InContext Errors.UnificationError) Typing.TypeSubst
+unifyTypeLists cx schemaTypes l r comment =
+
+      let toConstraint =
+              \l -> \r -> Typing.TypeConstraint {
+                Typing.typeConstraintLeft = l,
+                Typing.typeConstraintRight = r,
+                Typing.typeConstraintComment = comment}
+      in (unifyTypeConstraints cx schemaTypes (Lists.zipWith toConstraint l r))
+
+unifyTypes :: Context.Context -> M.Map Core.Name t0 -> Core.Type -> Core.Type -> String -> Either (Context.InContext Errors.UnificationError) Typing.TypeSubst
+unifyTypes cx schemaTypes l r comment =
+    unifyTypeConstraints cx schemaTypes [
+      Typing.TypeConstraint {
+        Typing.typeConstraintLeft = l,
+        Typing.typeConstraintRight = r,
+        Typing.typeConstraintComment = comment}]
+
 -- | Determine whether a type variable appears within a type expression.No distinction is made between free and bound type variables.
-variableOccursInType :: (Core.Name -> Core.Type -> Bool)
-variableOccursInType var typ0 =  
-  let tryType = (\b -> \typ -> (\x -> case x of
-          Core.TypeVariable v1 -> (Logic.or b (Equality.equal (Core.unName v1) (Core.unName var)))
-          _ -> b) typ)
-  in (Rewriting.foldOverType Coders.TraversalOrderPre tryType False typ0)
+variableOccursInType :: Core.Name -> Core.Type -> Bool
+variableOccursInType var typ0 =
+
+      let tryType =
+              \b -> \typ -> case typ of
+                Core.TypeVariable v0 -> Logic.or b (Equality.equal (Core.unName v0) (Core.unName var))
+                _ -> b
+      in (Rewriting.foldOverType Coders.TraversalOrderPre tryType False typ0)
diff --git a/src/gen-main/haskell/Hydra/Util.hs b/src/gen-main/haskell/Hydra/Util.hs
--- a/src/gen-main/haskell/Hydra/Util.hs
+++ b/src/gen-main/haskell/Hydra/Util.hs
@@ -4,7 +4,9 @@
 
 module Hydra.Util where
 
+import qualified Hydra.Context as Context
 import qualified Hydra.Core as Core
+import qualified Hydra.Errors as Errors
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
 import qualified Data.Int as I
@@ -12,57 +14,99 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
+-- | A two-level bidirectional encoder which adapts types to types and terms to terms
+data Adapter t1 t2 v1 v2 =
+  Adapter {
+    -- | Whether information may be lost in the course of this adaptation
+    adapterIsLossy :: Bool,
+    -- | The source type
+    adapterSource :: t1,
+    -- | The target type
+    adapterTarget :: t2,
+    -- | The coder for transforming instances of the source type to instances of the target type
+    adapterCoder :: (Coder v1 v2)}
+
+_Adapter = Core.Name "hydra.util.Adapter"
+
+_Adapter_isLossy = Core.Name "isLossy"
+
+_Adapter_source = Core.Name "source"
+
+_Adapter_target = Core.Name "target"
+
+_Adapter_coder = Core.Name "coder"
+
+-- | A two-level encoder and decoder, operating both at a type level and an instance (data) level
+data Bicoder t1 t2 v1 v2 =
+  Bicoder {
+    -- | A function from source types to adapters
+    bicoderEncode :: (t1 -> Adapter t1 t2 v1 v2),
+    -- | A function from target types to adapters
+    bicoderDecode :: (t2 -> Adapter t2 t1 v2 v1)}
+
+_Bicoder = Core.Name "hydra.util.Bicoder"
+
+_Bicoder_encode = Core.Name "encode"
+
+_Bicoder_decode = Core.Name "decode"
+
 -- | A naming convention for symbols, such as camelCase or snake_case
-data CaseConvention = 
+data CaseConvention =
   CaseConventionCamel  |
   CaseConventionPascal  |
   CaseConventionLowerSnake  |
-  CaseConventionUpperSnake 
+  CaseConventionUpperSnake
   deriving (Eq, Ord, Read, Show)
 
-_CaseConvention = (Core.Name "hydra.util.CaseConvention")
+_CaseConvention = Core.Name "hydra.util.CaseConvention"
 
-_CaseConvention_camel = (Core.Name "camel")
+_CaseConvention_camel = Core.Name "camel"
 
-_CaseConvention_pascal = (Core.Name "pascal")
+_CaseConvention_pascal = Core.Name "pascal"
 
-_CaseConvention_lowerSnake = (Core.Name "lowerSnake")
+_CaseConvention_lowerSnake = Core.Name "lowerSnake"
 
-_CaseConvention_upperSnake = (Core.Name "upperSnake")
+_CaseConvention_upperSnake = Core.Name "upperSnake"
 
+-- | An encoder and decoder; a bidirectional transformation between two types
+data Coder v1 v2 =
+  Coder {
+    -- | A function which encodes source values as target values in a given context
+    coderEncode :: (Context.Context -> v1 -> Either (Context.InContext Errors.Error) v2),
+    -- | A function which decodes target values as source values in a given context
+    coderDecode :: (Context.Context -> v2 -> Either (Context.InContext Errors.Error) v1)}
+
+_Coder = Core.Name "hydra.util.Coder"
+
+_Coder_encode = Core.Name "encode"
+
+_Coder_decode = Core.Name "decode"
+
 -- | An equality judgement: less than, equal to, or greater than
-data Comparison = 
+data Comparison =
   ComparisonLessThan  |
   ComparisonEqualTo  |
-  ComparisonGreaterThan 
+  ComparisonGreaterThan
   deriving (Eq, Ord, Read, Show)
 
-_Comparison = (Core.Name "hydra.util.Comparison")
-
-_Comparison_lessThan = (Core.Name "lessThan")
-
-_Comparison_equalTo = (Core.Name "equalTo")
+_Comparison = Core.Name "hydra.util.Comparison"
 
-_Comparison_greaterThan = (Core.Name "greaterThan")
+_Comparison_lessThan = Core.Name "lessThan"
 
--- | An error that occurred during decoding of a term
-newtype DecodingError = 
-  DecodingError {
-    unDecodingError :: String}
-  deriving (Eq, Ord, Read, Show)
+_Comparison_equalTo = Core.Name "equalTo"
 
-_DecodingError = (Core.Name "hydra.util.DecodingError")
+_Comparison_greaterThan = Core.Name "greaterThan"
 
 -- | Numeric precision: arbitrary precision, or precision to a specified number of bits
-data Precision = 
+data Precision =
   -- | Arbitrary precision
   PrecisionArbitrary  |
   -- | Precision to a specified number of bits
   PrecisionBits Int
   deriving (Eq, Ord, Read, Show)
 
-_Precision = (Core.Name "hydra.util.Precision")
+_Precision = Core.Name "hydra.util.Precision"
 
-_Precision_arbitrary = (Core.Name "arbitrary")
+_Precision_arbitrary = Core.Name "arbitrary"
 
-_Precision_bits = (Core.Name "bits")
+_Precision_bits = Core.Name "bits"
diff --git a/src/gen-main/haskell/Hydra/Validate/Core.hs b/src/gen-main/haskell/Hydra/Validate/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Validate/Core.hs
@@ -0,0 +1,375 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Validation functions for core terms and types
+
+module Hydra.Validate.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Core as Core_
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Rewriting as Rewriting
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Check for duplicate binding names in a list of bindings
+checkDuplicateBindings :: Paths.SubtermPath -> [Core.Binding] -> Maybe Core_.InvalidTermError
+checkDuplicateBindings path bindings =
+
+      let names = Lists.map Core.bindingName bindings
+          dup = findDuplicate names
+      in (Maybes.map (\name -> Core_.InvalidTermErrorDuplicateBinding (Core_.DuplicateBindingError {
+        Core_.duplicateBindingErrorLocation = path,
+        Core_.duplicateBindingErrorName = name})) dup)
+
+-- | Check for duplicate field names in a list of field types
+checkDuplicateFieldTypes :: [Core.FieldType] -> (Core.Name -> Maybe t0) -> Maybe t0
+checkDuplicateFieldTypes fields mkError =
+
+      let names = Lists.map Core.fieldTypeName fields
+          dup = findDuplicateFieldType names
+      in (Maybes.cases dup Nothing (\name -> mkError name))
+
+-- | Check for duplicate field names in a list of fields
+checkDuplicateFields :: Paths.SubtermPath -> [Core.Name] -> Maybe Core_.InvalidTermError
+checkDuplicateFields path names =
+
+      let dup = findDuplicate names
+      in (Maybes.map (\name -> Core_.InvalidTermErrorDuplicateField (Core_.DuplicateFieldError {
+        Core_.duplicateFieldErrorLocation = path,
+        Core_.duplicateFieldErrorName = name})) dup)
+
+-- | Check if any name in a list shadows a variable already in scope
+checkShadowing :: Paths.SubtermPath -> Graph.Graph -> [Core.Name] -> Maybe Core_.InvalidTermError
+checkShadowing path cx names =
+
+      let result =
+              Lists.foldl (\acc -> \name -> Maybes.cases acc (Logic.ifElse (Logic.or (Maybes.isJust (Maps.lookup name (Graph.graphBoundTerms cx))) (Sets.member name (Graph.graphLambdaVariables cx))) (Just (Core_.InvalidTermErrorTermVariableShadowing (Core_.TermVariableShadowingError {
+                Core_.termVariableShadowingErrorLocation = path,
+                Core_.termVariableShadowingErrorName = name}))) Nothing) (\_ -> acc)) Nothing names
+      in result
+
+-- | Check a single term node for validation errors
+checkTerm :: Bool -> Paths.SubtermPath -> Graph.Graph -> Core.Term -> Maybe Core_.InvalidTermError
+checkTerm typed path cx term =
+    case term of
+      Core.TermAnnotated v0 ->
+        let body = Core.annotatedTermBody v0
+            annMap = Core.annotatedTermAnnotation v0
+        in (firstError [
+          Logic.ifElse (Maps.null annMap) (Just (Core_.InvalidTermErrorEmptyTermAnnotation (Core_.EmptyTermAnnotationError {
+            Core_.emptyTermAnnotationErrorLocation = path}))) Nothing,
+          case body of
+            Core.TermAnnotated _ -> Just (Core_.InvalidTermErrorNestedTermAnnotation (Core_.NestedTermAnnotationError {
+              Core_.nestedTermAnnotationErrorLocation = path}))
+            _ -> Nothing])
+      Core.TermApplication v0 ->
+        let fun = Core.applicationFunction v0
+            arg = Core.applicationArgument v0
+        in (firstError [
+          case fun of
+            Core.TermFunction v1 -> case v1 of
+              Core.FunctionPrimitive v2 -> Logic.ifElse (Equality.equal (Core.unName v2) "hydra.lib.logic.ifElse") (case arg of
+                Core.TermLiteral v3 -> case v3 of
+                  Core.LiteralBoolean v4 -> Just (Core_.InvalidTermErrorConstantCondition (Core_.ConstantConditionError {
+                    Core_.constantConditionErrorLocation = path,
+                    Core_.constantConditionErrorValue = v4}))
+                  _ -> Nothing
+                _ -> Nothing) Nothing
+              _ -> Nothing
+            _ -> Nothing,
+          case fun of
+            Core.TermVariable v1 -> case arg of
+              Core.TermVariable v2 -> Logic.ifElse (Equality.equal v1 v2) (Just (Core_.InvalidTermErrorSelfApplication (Core_.SelfApplicationError {
+                Core_.selfApplicationErrorLocation = path,
+                Core_.selfApplicationErrorName = v1}))) Nothing
+              _ -> Nothing
+            _ -> Nothing,
+          case fun of
+            Core.TermFunction v1 -> case v1 of
+              Core.FunctionLambda v2 ->
+                let param = Core.lambdaParameter v2
+                    body = Core.lambdaBody v2
+                in case body of
+                  Core.TermVariable v3 -> Logic.ifElse (Equality.equal param v3) (Just (Core_.InvalidTermErrorUnnecessaryIdentityApplication (Core_.UnnecessaryIdentityApplicationError {
+                    Core_.unnecessaryIdentityApplicationErrorLocation = path}))) Nothing
+                  _ -> Nothing
+              _ -> Nothing
+            _ -> Nothing,
+          case fun of
+            Core.TermFunction v1 -> case v1 of
+              Core.FunctionElimination v2 -> case v2 of
+                Core.EliminationWrap v3 -> case arg of
+                  Core.TermWrap v4 ->
+                    let wrapName = Core.wrappedTermTypeName v4
+                    in (Logic.ifElse (Equality.equal v3 wrapName) (Just (Core_.InvalidTermErrorRedundantWrapUnwrap (Core_.RedundantWrapUnwrapError {
+                      Core_.redundantWrapUnwrapErrorLocation = path,
+                      Core_.redundantWrapUnwrapErrorTypeName = v3}))) Nothing)
+                  _ -> Nothing
+                _ -> Nothing
+              _ -> Nothing
+            _ -> Nothing])
+      Core.TermRecord v0 ->
+        let tname = Core.recordTypeName v0
+            flds = Core.recordFields v0
+        in (firstError [
+          Logic.ifElse (Equality.equal (Core.unName tname) "") (Just (Core_.InvalidTermErrorEmptyTypeNameInTerm (Core_.EmptyTypeNameInTermError {
+            Core_.emptyTypeNameInTermErrorLocation = path}))) Nothing,
+          (checkDuplicateFields path (Lists.map Core.fieldName flds))])
+      Core.TermLet v0 ->
+        let bindings = Core.letBindings v0
+            names = Lists.map Core.bindingName bindings
+        in (firstError [
+          Logic.ifElse (Lists.null bindings) (Just (Core_.InvalidTermErrorEmptyLetBindings (Core_.EmptyLetBindingsError {
+            Core_.emptyLetBindingsErrorLocation = path}))) Nothing,
+          (checkDuplicateBindings path bindings),
+          Nothing,
+          (firstError (Lists.map (\bname -> Logic.ifElse (isValidName bname) Nothing (Just (Core_.InvalidTermErrorInvalidLetBindingName (Core_.InvalidLetBindingNameError {
+            Core_.invalidLetBindingNameErrorLocation = path,
+            Core_.invalidLetBindingNameErrorName = bname})))) names)),
+          (Logic.ifElse typed (firstError (Lists.map (\b -> Maybes.cases (Core.bindingType b) Nothing (\ts -> checkUndefinedTypeVariablesInTypeScheme path cx ts (\uvName -> Just (Core_.InvalidTermErrorUndefinedTypeVariableInBindingType (Core_.UndefinedTypeVariableInBindingTypeError {
+            Core_.undefinedTypeVariableInBindingTypeErrorLocation = path,
+            Core_.undefinedTypeVariableInBindingTypeErrorName = uvName}))))) bindings)) Nothing)])
+      Core.TermUnion v0 ->
+        let tname = Core.injectionTypeName v0
+        in (Logic.ifElse (Equality.equal (Core.unName tname) "") (Just (Core_.InvalidTermErrorEmptyTypeNameInTerm (Core_.EmptyTypeNameInTermError {
+          Core_.emptyTypeNameInTermErrorLocation = path}))) Nothing)
+      Core.TermFunction v0 -> case v0 of
+        Core.FunctionLambda v1 ->
+          let paramName = Core.lambdaParameter v1
+          in (firstError [
+            Logic.ifElse (Maybes.isJust (Maps.lookup paramName (Graph.graphBoundTerms cx))) (Just (Core_.InvalidTermErrorTermVariableShadowing (Core_.TermVariableShadowingError {
+              Core_.termVariableShadowingErrorLocation = path,
+              Core_.termVariableShadowingErrorName = paramName}))) Nothing,
+            (Logic.ifElse (isValidName paramName) Nothing (Just (Core_.InvalidTermErrorInvalidLambdaParameterName (Core_.InvalidLambdaParameterNameError {
+              Core_.invalidLambdaParameterNameErrorLocation = path,
+              Core_.invalidLambdaParameterNameErrorName = paramName})))),
+            (Logic.ifElse typed (Maybes.cases (Core.lambdaDomain v1) Nothing (\dom -> checkUndefinedTypeVariablesInType path cx dom (\uvName -> Just (Core_.InvalidTermErrorUndefinedTypeVariableInLambdaDomain (Core_.UndefinedTypeVariableInLambdaDomainError {
+              Core_.undefinedTypeVariableInLambdaDomainErrorLocation = path,
+              Core_.undefinedTypeVariableInLambdaDomainErrorName = uvName}))))) Nothing)])
+        Core.FunctionPrimitive v1 -> Logic.ifElse (Maybes.isJust (Maps.lookup v1 (Graph.graphPrimitives cx))) Nothing (Just (Core_.InvalidTermErrorUnknownPrimitiveName (Core_.UnknownPrimitiveNameError {
+          Core_.unknownPrimitiveNameErrorLocation = path,
+          Core_.unknownPrimitiveNameErrorName = v1})))
+        Core.FunctionElimination v1 -> case v1 of
+          Core.EliminationRecord v2 ->
+            let tname = Core.projectionTypeName v2
+            in (Logic.ifElse (Equality.equal (Core.unName tname) "") (Just (Core_.InvalidTermErrorEmptyTypeNameInTerm (Core_.EmptyTypeNameInTermError {
+              Core_.emptyTypeNameInTermErrorLocation = path}))) Nothing)
+          Core.EliminationUnion v2 ->
+            let tname = Core.caseStatementTypeName v2
+                csDefault = Core.caseStatementDefault v2
+                csCases = Core.caseStatementCases v2
+            in (firstError [
+              Logic.ifElse (Equality.equal (Core.unName tname) "") (Just (Core_.InvalidTermErrorEmptyTypeNameInTerm (Core_.EmptyTypeNameInTermError {
+                Core_.emptyTypeNameInTermErrorLocation = path}))) Nothing,
+              (Logic.ifElse (Logic.and (Lists.null csCases) (Maybes.isNothing csDefault)) (Just (Core_.InvalidTermErrorEmptyCaseStatement (Core_.EmptyCaseStatementError {
+                Core_.emptyCaseStatementErrorLocation = path,
+                Core_.emptyCaseStatementErrorTypeName = tname}))) Nothing),
+              (checkDuplicateFields path (Lists.map Core.fieldName csCases))])
+          _ -> Nothing
+        _ -> Nothing
+      Core.TermTypeApplication v0 -> Logic.ifElse typed (checkUndefinedTypeVariablesInType path cx (Core.typeApplicationTermType v0) (\uvName -> Just (Core_.InvalidTermErrorUndefinedTypeVariableInTypeApplication (Core_.UndefinedTypeVariableInTypeApplicationError {
+        Core_.undefinedTypeVariableInTypeApplicationErrorLocation = path,
+        Core_.undefinedTypeVariableInTypeApplicationErrorName = uvName})))) Nothing
+      Core.TermTypeLambda v0 ->
+        let tvName = Core.typeLambdaParameter v0
+        in (firstError [
+          Logic.ifElse (Sets.member tvName (Sets.delete tvName (Graph.graphTypeVariables cx))) (Just (Core_.InvalidTermErrorTypeVariableShadowingInTypeLambda (Core_.TypeVariableShadowingInTypeLambdaError {
+            Core_.typeVariableShadowingInTypeLambdaErrorLocation = path,
+            Core_.typeVariableShadowingInTypeLambdaErrorName = tvName}))) Nothing,
+          (Logic.ifElse (isValidName tvName) Nothing (Just (Core_.InvalidTermErrorInvalidTypeLambdaParameterName (Core_.InvalidTypeLambdaParameterNameError {
+            Core_.invalidTypeLambdaParameterNameErrorLocation = path,
+            Core_.invalidTypeLambdaParameterNameErrorName = tvName}))))])
+      Core.TermVariable v0 -> Logic.ifElse (Logic.or (Maybes.isJust (Maps.lookup v0 (Graph.graphBoundTerms cx))) (Logic.or (Sets.member v0 (Graph.graphLambdaVariables cx)) (Maybes.isJust (Maps.lookup v0 (Graph.graphPrimitives cx))))) Nothing (Just (Core_.InvalidTermErrorUndefinedTermVariable (Core_.UndefinedTermVariableError {
+        Core_.undefinedTermVariableErrorLocation = path,
+        Core_.undefinedTermVariableErrorName = v0})))
+      Core.TermWrap v0 ->
+        let tname = Core.wrappedTermTypeName v0
+        in (Logic.ifElse (Equality.equal (Core.unName tname) "") (Just (Core_.InvalidTermErrorEmptyTypeNameInTerm (Core_.EmptyTypeNameInTermError {
+          Core_.emptyTypeNameInTermErrorLocation = path}))) Nothing)
+      _ -> Nothing
+
+-- | Check a type for type variables not bound in the current scope
+checkUndefinedTypeVariablesInType :: t0 -> Graph.Graph -> Core.Type -> (Core.Name -> Maybe t1) -> Maybe t1
+checkUndefinedTypeVariablesInType path cx typ mkError =
+
+      let freeVars = Rewriting.freeVariablesInType typ
+          undefined = Sets.difference freeVars (Graph.graphTypeVariables cx)
+      in (Logic.ifElse (Sets.null undefined) Nothing (
+        let firstUndefined = Lists.head (Sets.toList undefined)
+        in (mkError firstUndefined)))
+
+-- | Check a type scheme for type variables not bound by the scheme or the current scope
+checkUndefinedTypeVariablesInTypeScheme :: t0 -> Graph.Graph -> Core.TypeScheme -> (Core.Name -> Maybe t1) -> Maybe t1
+checkUndefinedTypeVariablesInTypeScheme path cx ts mkError =
+
+      let freeVars = Rewriting.freeVariablesInTypeScheme ts
+          undefined = Sets.difference freeVars (Graph.graphTypeVariables cx)
+      in (Logic.ifElse (Sets.null undefined) Nothing (
+        let firstUndefined = Lists.head (Sets.toList undefined)
+        in (mkError firstUndefined)))
+
+-- | Return an error if the given type is TypeVoid
+checkVoid :: Core.Type -> Maybe Core_.InvalidTypeError
+checkVoid typ =
+    case typ of
+      Core.TypeVoid -> Just (Core_.InvalidTypeErrorVoidInNonBottomPosition (Core_.VoidInNonBottomPositionError {
+        Core_.voidInNonBottomPositionErrorLocation = (Paths.SubtermPath [])}))
+      _ -> Nothing
+
+-- | Find the first duplicate name in a list
+findDuplicate :: Ord t0 => ([t0] -> Maybe t0)
+findDuplicate names =
+
+      let result =
+              Lists.foldl (\acc -> \name ->
+                let seen = Pairs.first acc
+                    dup = Pairs.second acc
+                in (Maybes.cases dup (Logic.ifElse (Sets.member name seen) (seen, (Just name)) (Sets.insert name seen, Nothing)) (\_ -> acc))) (Sets.empty, Nothing) names
+      in (Pairs.second result)
+
+-- | Find the first duplicate name in a list (for field type validation)
+findDuplicateFieldType :: Ord t0 => ([t0] -> Maybe t0)
+findDuplicateFieldType names =
+
+      let result =
+              Lists.foldl (\acc -> \name ->
+                let seen = Pairs.first acc
+                    dup = Pairs.second acc
+                in (Maybes.cases dup (Logic.ifElse (Sets.member name seen) (seen, (Just name)) (Sets.insert name seen, Nothing)) (\_ -> acc))) (Sets.empty, Nothing) names
+      in (Pairs.second result)
+
+-- | Return the first error from a list of optional errors, or nothing if all are valid
+firstError :: [Maybe t0] -> Maybe t0
+firstError checks = Lists.foldl (\acc -> \check -> Maybes.cases acc check (\_ -> acc)) Nothing checks
+
+-- | Return the first type error from a list of optional errors, or nothing if all are valid
+firstTypeError :: [Maybe t0] -> Maybe t0
+firstTypeError checks = Lists.foldl (\acc -> \check -> Maybes.cases acc check (\_ -> acc)) Nothing checks
+
+-- | Check whether a name is valid at an introduction site. Currently rejects empty strings.
+isValidName :: Core.Name -> Bool
+isValidName name = Logic.not (Equality.equal (Core.unName name) "")
+
+-- | Validate a term, returning the first error found or nothing if valid. The 'typed' parameter indicates whether to expect System F (typed) terms; when true, type variable binding checks and UntypedTermVariableError are active.
+term :: Bool -> Graph.Graph -> Core.Term -> Maybe Core_.InvalidTermError
+term typed g t =
+    Rewriting.foldTermWithGraphAndPath (\recurse -> \path -> \cx -> \acc -> \trm -> Maybes.cases acc (
+      let checkResult = checkTerm typed (Paths.SubtermPath path) cx trm
+      in (Maybes.cases checkResult (recurse Nothing trm) (\err -> Just err))) (\_ -> acc)) g Nothing t
+
+-- | Validate a type, returning the first error found or nothing if valid. The first argument is the set of type variables already in scope.
+type_ :: S.Set Core.Name -> Core.Type -> Maybe Core_.InvalidTypeError
+type_ boundVars typ =
+
+      let checkResult = validateTypeNode boundVars typ
+      in (Maybes.cases checkResult (case typ of
+        Core.TypeForall v0 ->
+          let newBound = Sets.insert (Core.forallTypeParameter v0) boundVars
+          in (type_ newBound (Core.forallTypeBody v0))
+        Core.TypeAnnotated v0 -> type_ boundVars (Core.annotatedTypeBody v0)
+        Core.TypeApplication v0 -> firstTypeError [
+          type_ boundVars (Core.applicationTypeFunction v0),
+          (type_ boundVars (Core.applicationTypeArgument v0))]
+        Core.TypeEither v0 -> firstTypeError [
+          type_ boundVars (Core.eitherTypeLeft v0),
+          (type_ boundVars (Core.eitherTypeRight v0))]
+        Core.TypeFunction v0 -> firstTypeError [
+          type_ boundVars (Core.functionTypeDomain v0),
+          (type_ boundVars (Core.functionTypeCodomain v0))]
+        Core.TypeList v0 -> type_ boundVars v0
+        Core.TypeMap v0 -> firstTypeError [
+          type_ boundVars (Core.mapTypeKeys v0),
+          (type_ boundVars (Core.mapTypeValues v0))]
+        Core.TypeMaybe v0 -> type_ boundVars v0
+        Core.TypePair v0 -> firstTypeError [
+          type_ boundVars (Core.pairTypeFirst v0),
+          (type_ boundVars (Core.pairTypeSecond v0))]
+        Core.TypeRecord v0 -> firstTypeError (Lists.map (\f -> type_ boundVars (Core.fieldTypeType f)) v0)
+        Core.TypeSet v0 -> type_ boundVars v0
+        Core.TypeUnion v0 -> firstTypeError (Lists.map (\f -> type_ boundVars (Core.fieldTypeType f)) v0)
+        Core.TypeWrap v0 -> type_ boundVars v0
+        _ -> Nothing) (\err -> Just err))
+
+-- | Check a single type node for validation errors
+validateTypeNode :: S.Set Core.Name -> Core.Type -> Maybe Core_.InvalidTypeError
+validateTypeNode boundVars typ =
+    case typ of
+      Core.TypeAnnotated v0 ->
+        let body = Core.annotatedTypeBody v0
+            annMap = Core.annotatedTypeAnnotation v0
+        in (firstTypeError [
+          Logic.ifElse (Maps.null annMap) (Just (Core_.InvalidTypeErrorEmptyTypeAnnotation (Core_.EmptyTypeAnnotationError {
+            Core_.emptyTypeAnnotationErrorLocation = (Paths.SubtermPath [])}))) Nothing,
+          case body of
+            Core.TypeAnnotated _ -> Just (Core_.InvalidTypeErrorNestedTypeAnnotation (Core_.NestedTypeAnnotationError {
+              Core_.nestedTypeAnnotationErrorLocation = (Paths.SubtermPath [])}))
+            _ -> Nothing])
+      Core.TypeEither v0 -> firstTypeError [
+        checkVoid (Core.eitherTypeLeft v0),
+        (checkVoid (Core.eitherTypeRight v0))]
+      Core.TypeForall v0 ->
+        let paramName = Core.forallTypeParameter v0
+        in (firstTypeError [
+          Logic.ifElse (Sets.member paramName boundVars) (Just (Core_.InvalidTypeErrorTypeVariableShadowingInForall (Core_.TypeVariableShadowingInForallError {
+            Core_.typeVariableShadowingInForallErrorLocation = (Paths.SubtermPath []),
+            Core_.typeVariableShadowingInForallErrorName = paramName}))) Nothing,
+          (Logic.ifElse (isValidName paramName) Nothing (Just (Core_.InvalidTypeErrorInvalidForallParameterName (Core_.InvalidForallParameterNameError {
+            Core_.invalidForallParameterNameErrorLocation = (Paths.SubtermPath []),
+            Core_.invalidForallParameterNameErrorName = paramName}))))])
+      Core.TypeFunction v0 -> checkVoid (Core.functionTypeCodomain v0)
+      Core.TypeList v0 -> checkVoid v0
+      Core.TypeMap v0 ->
+        let keyType = Core.mapTypeKeys v0
+        in (firstTypeError [
+          case keyType of
+            Core.TypeFunction _ -> Just (Core_.InvalidTypeErrorNonComparableMapKeyType (Core_.NonComparableMapKeyTypeError {
+              Core_.nonComparableMapKeyTypeErrorLocation = (Paths.SubtermPath []),
+              Core_.nonComparableMapKeyTypeErrorKeyType = keyType}))
+            _ -> Nothing,
+          (checkVoid keyType),
+          (checkVoid (Core.mapTypeValues v0))])
+      Core.TypePair v0 -> firstTypeError [
+        checkVoid (Core.pairTypeFirst v0),
+        (checkVoid (Core.pairTypeSecond v0))]
+      Core.TypeRecord v0 -> firstTypeError [
+        Logic.ifElse (Lists.null v0) (Just (Core_.InvalidTypeErrorEmptyRecordType (Core_.EmptyRecordTypeError {
+          Core_.emptyRecordTypeErrorLocation = (Paths.SubtermPath [])}))) Nothing,
+        (checkDuplicateFieldTypes v0 (\dupName -> Just (Core_.InvalidTypeErrorDuplicateRecordTypeFieldNames (Core_.DuplicateRecordTypeFieldNamesError {
+          Core_.duplicateRecordTypeFieldNamesErrorLocation = (Paths.SubtermPath []),
+          Core_.duplicateRecordTypeFieldNamesErrorName = dupName})))),
+        (firstTypeError (Lists.map (\f -> checkVoid (Core.fieldTypeType f)) v0))]
+      Core.TypeSet v0 -> firstTypeError [
+        case v0 of
+          Core.TypeFunction _ -> Just (Core_.InvalidTypeErrorNonComparableSetElementType (Core_.NonComparableSetElementTypeError {
+            Core_.nonComparableSetElementTypeErrorLocation = (Paths.SubtermPath []),
+            Core_.nonComparableSetElementTypeErrorElementType = v0}))
+          _ -> Nothing,
+        (checkVoid v0)]
+      Core.TypeUnion v0 -> firstTypeError [
+        Logic.ifElse (Lists.null v0) (Just (Core_.InvalidTypeErrorEmptyUnionType (Core_.EmptyUnionTypeError {
+          Core_.emptyUnionTypeErrorLocation = (Paths.SubtermPath [])}))) Nothing,
+        (Logic.ifElse (Equality.equal (Lists.length v0) 1) (
+          let singleField = Lists.head v0
+          in (Just (Core_.InvalidTypeErrorSingleVariantUnion (Core_.SingleVariantUnionError {
+            Core_.singleVariantUnionErrorLocation = (Paths.SubtermPath []),
+            Core_.singleVariantUnionErrorFieldName = (Core.fieldTypeName singleField)})))) Nothing),
+        (checkDuplicateFieldTypes v0 (\dupName -> Just (Core_.InvalidTypeErrorDuplicateUnionTypeFieldNames (Core_.DuplicateUnionTypeFieldNamesError {
+          Core_.duplicateUnionTypeFieldNamesErrorLocation = (Paths.SubtermPath []),
+          Core_.duplicateUnionTypeFieldNamesErrorName = dupName})))),
+        (firstTypeError (Lists.map (\f -> checkVoid (Core.fieldTypeType f)) v0))]
+      Core.TypeVariable v0 -> Logic.ifElse (Sets.member v0 boundVars) Nothing (Just (Core_.InvalidTypeErrorUndefinedTypeVariable (Core_.UndefinedTypeVariableError {
+        Core_.undefinedTypeVariableErrorLocation = (Paths.SubtermPath []),
+        Core_.undefinedTypeVariableErrorName = v0})))
+      _ -> Nothing
diff --git a/src/gen-main/haskell/Hydra/Validate/Packaging.hs b/src/gen-main/haskell/Hydra/Validate/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-main/haskell/Hydra/Validate/Packaging.hs
@@ -0,0 +1,138 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Validation functions for modules and packages
+
+module Hydra.Validate.Packaging where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Packaging as Packaging
+import qualified Hydra.Formatting as Formatting
+import qualified Hydra.Lib.Equality as Equality
+import qualified Hydra.Lib.Lists as Lists
+import qualified Hydra.Lib.Logic as Logic
+import qualified Hydra.Lib.Maps as Maps
+import qualified Hydra.Lib.Maybes as Maybes
+import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Sets as Sets
+import qualified Hydra.Lib.Strings as Strings
+import qualified Hydra.Module as Module
+import qualified Hydra.Names as Names
+import qualified Hydra.Packaging as Packaging_
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Check for module namespaces that conflict when mapped to target language paths
+checkConflictingModuleNamespaces :: Packaging_.Package -> Maybe Packaging.InvalidPackageError
+checkConflictingModuleNamespaces pkg =
+
+      let result =
+              Lists.foldl (\acc -> \mod ->
+                let seen = Pairs.first acc
+                    err = Pairs.second acc
+                in (Maybes.cases err (
+                  let ns = Module.moduleNamespace mod
+                      key = Strings.toLower (Module.unNamespace ns)
+                      existing = Maps.lookup key seen
+                  in (Maybes.cases existing (Maps.insert key ns seen, Nothing) (\first -> (seen, (Just (Packaging.InvalidPackageErrorConflictingModuleNamespace (Packaging.ConflictingModuleNamespaceError {
+                    Packaging.conflictingModuleNamespaceErrorFirst = first,
+                    Packaging.conflictingModuleNamespaceErrorSecond = ns}))))))) (\_ -> acc))) (Maps.empty, Nothing) (Packaging_.packageModules pkg)
+      in (Pairs.second result)
+
+-- | Check for union variant names that, when mapped to constructor names, conflict with other type definitions
+checkConflictingVariantNames :: Module.Module -> Maybe Packaging.InvalidModuleError
+checkConflictingVariantNames mod =
+
+      let ns = Module.moduleNamespace mod
+          defs = Module.moduleDefinitions mod
+          defNames = Lists.foldl (\acc -> \def -> Sets.insert (Names.localNameOf (definitionName def)) acc) Sets.empty defs
+      in (Lists.foldl (\acc -> \def -> Maybes.cases acc (case def of
+        Module.DefinitionType v0 ->
+          let typeName = Module.typeDefinitionName v0
+              localTypeName = Names.localNameOf typeName
+              typ = Module.typeDefinitionType v0
+          in case typ of
+            Core.TypeUnion v1 -> Lists.foldl (\innerAcc -> \field -> Maybes.cases innerAcc (
+              let fieldName = Core.fieldTypeName field
+                  localFieldName = Names.localNameOf fieldName
+                  constructorName = Strings.cat2 (Formatting.capitalize localTypeName) (Formatting.capitalize localFieldName)
+              in (Logic.ifElse (Sets.member constructorName defNames) (Just (Packaging.InvalidModuleErrorConflictingVariantName (Packaging.ConflictingVariantNameError {
+                Packaging.conflictingVariantNameErrorNamespace = ns,
+                Packaging.conflictingVariantNameErrorTypeName = typeName,
+                Packaging.conflictingVariantNameErrorVariantName = fieldName,
+                Packaging.conflictingVariantNameErrorConflictingName = (Core.Name constructorName)}))) Nothing)) (\_ -> innerAcc)) Nothing v1
+            _ -> Nothing
+        _ -> Nothing) (\_ -> acc)) Nothing defs)
+
+-- | Check that all definition names in a module have the module's namespace as a prefix
+checkDefinitionNamespaces :: Module.Module -> Maybe Packaging.InvalidModuleError
+checkDefinitionNamespaces mod =
+
+      let ns = Module.moduleNamespace mod
+          prefix = Strings.cat2 (Module.unNamespace ns) "."
+          prefixLen = Strings.length prefix
+      in (Lists.foldl (\acc -> \def -> Maybes.cases acc (
+        let name = definitionName def
+            nameStr = Core.unName name
+            namePrefix = Lists.take prefixLen (Strings.toList nameStr)
+        in (Logic.ifElse (Equality.equal (Strings.fromList namePrefix) prefix) Nothing (Just (Packaging.InvalidModuleErrorDefinitionNotInModuleNamespace (Packaging.DefinitionNotInModuleNamespaceError {
+          Packaging.definitionNotInModuleNamespaceErrorNamespace = ns,
+          Packaging.definitionNotInModuleNamespaceErrorName = name}))))) (\_ -> acc)) Nothing (Module.moduleDefinitions mod))
+
+-- | Check for duplicate definition names in a module
+checkDuplicateDefinitionNames :: Module.Module -> Maybe Packaging.InvalidModuleError
+checkDuplicateDefinitionNames mod =
+
+      let ns = Module.moduleNamespace mod
+          result =
+                  Lists.foldl (\acc -> \def ->
+                    let seen = Pairs.first acc
+                        err = Pairs.second acc
+                    in (Maybes.cases err (
+                      let name = definitionName def
+                      in (Logic.ifElse (Sets.member name seen) (seen, (Just (Packaging.InvalidModuleErrorDuplicateDefinitionName (Packaging.DuplicateDefinitionNameError {
+                        Packaging.duplicateDefinitionNameErrorNamespace = ns,
+                        Packaging.duplicateDefinitionNameErrorName = name})))) (Sets.insert name seen, Nothing))) (\_ -> acc))) (Sets.empty, Nothing) (Module.moduleDefinitions mod)
+      in (Pairs.second result)
+
+-- | Check for duplicate module namespaces in a package
+checkDuplicateModuleNamespaces :: Packaging_.Package -> Maybe Packaging.InvalidPackageError
+checkDuplicateModuleNamespaces pkg =
+
+      let result =
+              Lists.foldl (\acc -> \mod ->
+                let seen = Pairs.first acc
+                    err = Pairs.second acc
+                in (Maybes.cases err (
+                  let ns = Module.moduleNamespace mod
+                  in (Logic.ifElse (Sets.member ns seen) (seen, (Just (Packaging.InvalidPackageErrorDuplicateModuleNamespace (Packaging.DuplicateModuleNamespaceError {
+                    Packaging.duplicateModuleNamespaceErrorNamespace = ns})))) (Sets.insert ns seen, Nothing))) (\_ -> acc))) (Sets.empty, Nothing) (Packaging_.packageModules pkg)
+      in (Pairs.second result)
+
+-- | Extract the name from a definition
+definitionName :: Module.Definition -> Core.Name
+definitionName def =
+    case def of
+      Module.DefinitionTerm v0 -> Module.termDefinitionName v0
+      Module.DefinitionType v0 -> Module.typeDefinitionName v0
+
+-- | Validate a module, returning the first error found or nothing if valid
+module_ :: Module.Module -> Maybe Packaging.InvalidModuleError
+module_ mod =
+
+      let r1 = checkDefinitionNamespaces mod
+      in (Maybes.cases r1 (
+        let r2 = checkDuplicateDefinitionNames mod
+        in (Maybes.cases r2 (checkConflictingVariantNames mod) (\_ -> r2))) (\_ -> r1))
+
+-- | Validate a package, returning the first error found or nothing if valid
+package :: Packaging_.Package -> Maybe Packaging.InvalidPackageError
+package pkg =
+
+      let r1 = checkDuplicateModuleNamespaces pkg
+      in (Maybes.cases r1 (
+        let r2 = checkConflictingModuleNamespaces pkg
+        in (Maybes.cases r2 (Lists.foldl (\acc -> \mod -> Maybes.cases acc (Maybes.map (\err -> Packaging.InvalidPackageErrorInvalidModule err) (module_ mod)) (\_ -> acc)) Nothing (Packaging_.packageModules pkg)) (\_ -> r2))) (\_ -> r1))
diff --git a/src/gen-main/haskell/Hydra/Variants.hs b/src/gen-main/haskell/Hydra/Variants.hs
--- a/src/gen-main/haskell/Hydra/Variants.hs
+++ b/src/gen-main/haskell/Hydra/Variants.hs
@@ -13,58 +13,58 @@
 import qualified Data.Set as S
 
 -- | The identifier of an elimination constructor
-data EliminationVariant = 
+data EliminationVariant =
   EliminationVariantRecord  |
   EliminationVariantUnion  |
-  EliminationVariantWrap 
+  EliminationVariantWrap
   deriving (Eq, Ord, Read, Show)
 
-_EliminationVariant = (Core.Name "hydra.variants.EliminationVariant")
+_EliminationVariant = Core.Name "hydra.variants.EliminationVariant"
 
-_EliminationVariant_record = (Core.Name "record")
+_EliminationVariant_record = Core.Name "record"
 
-_EliminationVariant_union = (Core.Name "union")
+_EliminationVariant_union = Core.Name "union"
 
-_EliminationVariant_wrap = (Core.Name "wrap")
+_EliminationVariant_wrap = Core.Name "wrap"
 
 -- | The identifier of a function constructor
-data FunctionVariant = 
+data FunctionVariant =
   FunctionVariantElimination  |
   FunctionVariantLambda  |
-  FunctionVariantPrimitive 
+  FunctionVariantPrimitive
   deriving (Eq, Ord, Read, Show)
 
-_FunctionVariant = (Core.Name "hydra.variants.FunctionVariant")
+_FunctionVariant = Core.Name "hydra.variants.FunctionVariant"
 
-_FunctionVariant_elimination = (Core.Name "elimination")
+_FunctionVariant_elimination = Core.Name "elimination"
 
-_FunctionVariant_lambda = (Core.Name "lambda")
+_FunctionVariant_lambda = Core.Name "lambda"
 
-_FunctionVariant_primitive = (Core.Name "primitive")
+_FunctionVariant_primitive = Core.Name "primitive"
 
 -- | The identifier of a literal constructor
-data LiteralVariant = 
+data LiteralVariant =
   LiteralVariantBinary  |
   LiteralVariantBoolean  |
   LiteralVariantFloat  |
   LiteralVariantInteger  |
-  LiteralVariantString 
+  LiteralVariantString
   deriving (Eq, Ord, Read, Show)
 
-_LiteralVariant = (Core.Name "hydra.variants.LiteralVariant")
+_LiteralVariant = Core.Name "hydra.variants.LiteralVariant"
 
-_LiteralVariant_binary = (Core.Name "binary")
+_LiteralVariant_binary = Core.Name "binary"
 
-_LiteralVariant_boolean = (Core.Name "boolean")
+_LiteralVariant_boolean = Core.Name "boolean"
 
-_LiteralVariant_float = (Core.Name "float")
+_LiteralVariant_float = Core.Name "float"
 
-_LiteralVariant_integer = (Core.Name "integer")
+_LiteralVariant_integer = Core.Name "integer"
 
-_LiteralVariant_string = (Core.Name "string")
+_LiteralVariant_string = Core.Name "string"
 
 -- | The identifier of a term expression constructor
-data TermVariant = 
+data TermVariant =
   TermVariantAnnotated  |
   TermVariantApplication  |
   TermVariantEither  |
@@ -82,49 +82,49 @@
   TermVariantUnion  |
   TermVariantUnit  |
   TermVariantVariable  |
-  TermVariantWrap 
+  TermVariantWrap
   deriving (Eq, Ord, Read, Show)
 
-_TermVariant = (Core.Name "hydra.variants.TermVariant")
+_TermVariant = Core.Name "hydra.variants.TermVariant"
 
-_TermVariant_annotated = (Core.Name "annotated")
+_TermVariant_annotated = Core.Name "annotated"
 
-_TermVariant_application = (Core.Name "application")
+_TermVariant_application = Core.Name "application"
 
-_TermVariant_either = (Core.Name "either")
+_TermVariant_either = Core.Name "either"
 
-_TermVariant_function = (Core.Name "function")
+_TermVariant_function = Core.Name "function"
 
-_TermVariant_let = (Core.Name "let")
+_TermVariant_let = Core.Name "let"
 
-_TermVariant_list = (Core.Name "list")
+_TermVariant_list = Core.Name "list"
 
-_TermVariant_literal = (Core.Name "literal")
+_TermVariant_literal = Core.Name "literal"
 
-_TermVariant_map = (Core.Name "map")
+_TermVariant_map = Core.Name "map"
 
-_TermVariant_maybe = (Core.Name "maybe")
+_TermVariant_maybe = Core.Name "maybe"
 
-_TermVariant_pair = (Core.Name "pair")
+_TermVariant_pair = Core.Name "pair"
 
-_TermVariant_record = (Core.Name "record")
+_TermVariant_record = Core.Name "record"
 
-_TermVariant_set = (Core.Name "set")
+_TermVariant_set = Core.Name "set"
 
-_TermVariant_typeApplication = (Core.Name "typeApplication")
+_TermVariant_typeApplication = Core.Name "typeApplication"
 
-_TermVariant_typeLambda = (Core.Name "typeLambda")
+_TermVariant_typeLambda = Core.Name "typeLambda"
 
-_TermVariant_union = (Core.Name "union")
+_TermVariant_union = Core.Name "union"
 
-_TermVariant_unit = (Core.Name "unit")
+_TermVariant_unit = Core.Name "unit"
 
-_TermVariant_variable = (Core.Name "variable")
+_TermVariant_variable = Core.Name "variable"
 
-_TermVariant_wrap = (Core.Name "wrap")
+_TermVariant_wrap = Core.Name "wrap"
 
 -- | The identifier of a type constructor
-data TypeVariant = 
+data TypeVariant =
   TypeVariantAnnotated  |
   TypeVariantApplication  |
   TypeVariantEither  |
@@ -140,39 +140,42 @@
   TypeVariantUnion  |
   TypeVariantUnit  |
   TypeVariantVariable  |
-  TypeVariantWrap 
+  TypeVariantVoid  |
+  TypeVariantWrap
   deriving (Eq, Ord, Read, Show)
 
-_TypeVariant = (Core.Name "hydra.variants.TypeVariant")
+_TypeVariant = Core.Name "hydra.variants.TypeVariant"
 
-_TypeVariant_annotated = (Core.Name "annotated")
+_TypeVariant_annotated = Core.Name "annotated"
 
-_TypeVariant_application = (Core.Name "application")
+_TypeVariant_application = Core.Name "application"
 
-_TypeVariant_either = (Core.Name "either")
+_TypeVariant_either = Core.Name "either"
 
-_TypeVariant_forall = (Core.Name "forall")
+_TypeVariant_forall = Core.Name "forall"
 
-_TypeVariant_function = (Core.Name "function")
+_TypeVariant_function = Core.Name "function"
 
-_TypeVariant_list = (Core.Name "list")
+_TypeVariant_list = Core.Name "list"
 
-_TypeVariant_literal = (Core.Name "literal")
+_TypeVariant_literal = Core.Name "literal"
 
-_TypeVariant_map = (Core.Name "map")
+_TypeVariant_map = Core.Name "map"
 
-_TypeVariant_maybe = (Core.Name "maybe")
+_TypeVariant_maybe = Core.Name "maybe"
 
-_TypeVariant_pair = (Core.Name "pair")
+_TypeVariant_pair = Core.Name "pair"
 
-_TypeVariant_record = (Core.Name "record")
+_TypeVariant_record = Core.Name "record"
 
-_TypeVariant_set = (Core.Name "set")
+_TypeVariant_set = Core.Name "set"
 
-_TypeVariant_union = (Core.Name "union")
+_TypeVariant_union = Core.Name "union"
 
-_TypeVariant_unit = (Core.Name "unit")
+_TypeVariant_unit = Core.Name "unit"
 
-_TypeVariant_variable = (Core.Name "variable")
+_TypeVariant_variable = Core.Name "variable"
 
-_TypeVariant_wrap = (Core.Name "wrap")
+_TypeVariant_void = Core.Name "void"
+
+_TypeVariant_wrap = Core.Name "wrap"
diff --git a/src/gen-main/haskell/Hydra/Workflow.hs b/src/gen-main/haskell/Hydra/Workflow.hs
deleted file mode 100644
--- a/src/gen-main/haskell/Hydra/Workflow.hs
+++ /dev/null
@@ -1,90 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | A model for Hydra transformation workflows
-
-module Hydra.Workflow where
-
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Module as Module
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | The specification of a Hydra schema, provided as a set of modules and a distinguished type
-data HydraSchemaSpec = 
-  HydraSchemaSpec {
-    -- | The modules to include in the schema graph
-    hydraSchemaSpecModules :: [Module.Module],
-    -- | The name of the top-level type; all data which passes through the workflow will be instances of this type
-    hydraSchemaSpecTypeName :: Core.Name}
-  deriving (Eq, Ord, Read, Show)
-
-_HydraSchemaSpec = (Core.Name "hydra.workflow.HydraSchemaSpec")
-
-_HydraSchemaSpec_modules = (Core.Name "modules")
-
-_HydraSchemaSpec_typeName = (Core.Name "typeName")
-
--- | The last mile of a transformation, which encodes and serializes terms to a file
-data LastMile s a = 
-  LastMile {
-    -- | An encoder for terms to a list of output objects
-    lastMileEncoder :: (Core.Type -> Compute.Flow s (Core.Term -> Graph.Graph -> Compute.Flow s [a])),
-    -- | A function which serializes a list of output objects to a string representation
-    lastMileSerializer :: ([a] -> Compute.Flow s String),
-    -- | A file extension for the generated file(s)
-    lastMileFileExtension :: String}
-
-_LastMile = (Core.Name "hydra.workflow.LastMile")
-
-_LastMile_encoder = (Core.Name "encoder")
-
-_LastMile_serializer = (Core.Name "serializer")
-
-_LastMile_fileExtension = (Core.Name "fileExtension")
-
--- | The specification of a schema at the source end of a workflow
-data SchemaSpec = 
-  -- | A native Hydra schema
-  SchemaSpecHydra HydraSchemaSpec |
-  -- | A schema provided as a file, available at the given file path
-  SchemaSpecFile String |
-  -- | A schema which will be provided within the workflow
-  SchemaSpecProvided 
-  deriving (Eq, Ord, Read, Show)
-
-_SchemaSpec = (Core.Name "hydra.workflow.SchemaSpec")
-
-_SchemaSpec_hydra = (Core.Name "hydra")
-
-_SchemaSpec_file = (Core.Name "file")
-
-_SchemaSpec_provided = (Core.Name "provided")
-
--- | The specification of a workflow which takes a schema specification, reads data from a directory, and writes data to another directory
-data TransformWorkflow = 
-  TransformWorkflow {
-    -- | A descriptive name for the workflow
-    transformWorkflowName :: String,
-    -- | The schema specification
-    transformWorkflowSchemaSpec :: SchemaSpec,
-    -- | The source directory
-    transformWorkflowSrcDir :: String,
-    -- | The destination directory
-    transformWorkflowDestDir :: String}
-  deriving (Eq, Ord, Read, Show)
-
-_TransformWorkflow = (Core.Name "hydra.workflow.TransformWorkflow")
-
-_TransformWorkflow_name = (Core.Name "name")
-
-_TransformWorkflow_schemaSpec = (Core.Name "schemaSpec")
-
-_TransformWorkflow_srcDir = (Core.Name "srcDir")
-
-_TransformWorkflow_destDir = (Core.Name "destDir")
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/AnnotationsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/AnnotationsSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/AnnotationsSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/AnnotationsSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.annotations"},ModuleName {unModuleName = "Annotations"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.annotations"},ModuleName {unModuleName = "Annotations"}),(Namespace {unNamespace = "hydra.compute"},ModuleName {unModuleName = "Compute"}),(Namespace {unNamespace = "hydra.core"},ModuleName {unModuleName = "Core"}),(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.monads"},ModuleName {unModuleName = "Monads"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.AnnotationsSpec where
 
@@ -13,10 +12,8 @@
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
 import qualified Hydra.Annotations as Annotations
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Core as Core
 import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Monads as Monads
 
 spec :: H.Spec
 spec = H.describe "annotations" $ do
@@ -127,23 +124,23 @@
           Core.annotatedTermAnnotation = (M.fromList [
             (Core.Name "description", (Core.TermLiteral (Core.LiteralString "A longer description with spaces")))])}))
     H.it "get existing description #1" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Annotations.getTermDescription (Annotations.setTermDescription (Just "hello") (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))) Lexical.emptyGraph Monads.emptyTrace))
-      (Just (Just "hello"))
+      (Annotations.getTermDescription Lexical.emptyContext Lexical.emptyGraph (Annotations.setTermDescription (Just "hello") (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))
+      (Right (Just "hello") :: Either (InContext Error) (Maybe String))
     H.it "get existing description #2" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Annotations.getTermDescription (Annotations.setTermDescription (Just "") (Core.TermLiteral (Core.LiteralString "test")))) Lexical.emptyGraph Monads.emptyTrace))
-      (Just (Just ""))
+      (Annotations.getTermDescription Lexical.emptyContext Lexical.emptyGraph (Annotations.setTermDescription (Just "") (Core.TermLiteral (Core.LiteralString "test"))))
+      (Right (Just "") :: Either (InContext Error) (Maybe String))
     H.it "get existing description #3" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Annotations.getTermDescription (Annotations.setTermDescription (Just "desc") (Core.TermLiteral (Core.LiteralBoolean False)))) Lexical.emptyGraph Monads.emptyTrace))
-      (Just (Just "desc"))
+      (Annotations.getTermDescription Lexical.emptyContext Lexical.emptyGraph (Annotations.setTermDescription (Just "desc") (Core.TermLiteral (Core.LiteralBoolean False))))
+      (Right (Just "desc") :: Either (InContext Error) (Maybe String))
     H.it "get missing description #1" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Annotations.getTermDescription (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 42)))) Lexical.emptyGraph Monads.emptyTrace))
-      (Just Nothing)
+      (Annotations.getTermDescription Lexical.emptyContext Lexical.emptyGraph (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 42))))
+      (Right Nothing :: Either (InContext Error) (Maybe String))
     H.it "get missing description #2" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Annotations.getTermDescription (Core.TermLiteral (Core.LiteralString "no description here"))) Lexical.emptyGraph Monads.emptyTrace))
-      (Just Nothing)
+      (Annotations.getTermDescription Lexical.emptyContext Lexical.emptyGraph (Core.TermLiteral (Core.LiteralString "no description here")))
+      (Right Nothing :: Either (InContext Error) (Maybe String))
     H.it "get missing description #3" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Annotations.getTermDescription (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))) Lexical.emptyGraph Monads.emptyTrace))
-      (Just Nothing)
+      (Annotations.getTermDescription Lexical.emptyContext Lexical.emptyGraph (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))))
+      (Right Nothing :: Either (InContext Error) (Maybe String))
     H.it "outer description overrides inner #1" $ H.shouldBe
       (Annotations.setTermDescription (Just "outer") (Annotations.setTermDescription (Just "inner") (Core.TermLiteral (Core.LiteralString "bar"))))
       (Core.TermAnnotated (Core.AnnotatedTerm {
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/FormattingSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/FormattingSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/FormattingSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/FormattingSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.formatting"},ModuleName {unModuleName = "Formatting"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.formatting"},ModuleName {unModuleName = "Formatting"}),(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.util"},ModuleName {unModuleName = "Util"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.FormattingSpec where
 
@@ -13,7 +12,6 @@
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
 import qualified Hydra.Formatting as Formatting
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Util as Util
 
 spec :: H.Spec
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/CharsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/CharsSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/CharsSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/CharsSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.chars"},ModuleName {unModuleName = "Chars"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.chars"},ModuleName {unModuleName = "Chars"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.CharsSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Chars as Chars
 
 spec :: H.Spec
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/EithersSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/EithersSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/EithersSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/EithersSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.eithers"},ModuleName {unModuleName = "Eithers"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.eithers"},ModuleName {unModuleName = "Eithers"}),(Namespace {unNamespace = "hydra.lib.equality"},ModuleName {unModuleName = "Equality"}),(Namespace {unNamespace = "hydra.lib.logic"},ModuleName {unModuleName = "Logic"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.lib.strings"},ModuleName {unModuleName = "Strings"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.EithersSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
 import qualified Hydra.Lib.Logic as Logic
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/EqualitySpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/EqualitySpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/EqualitySpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/EqualitySpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.equality"},ModuleName {unModuleName = "Equality"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.equality"},ModuleName {unModuleName = "Equality"}),(Namespace {unNamespace = "hydra.util"},ModuleName {unModuleName = "Util"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.EqualitySpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Equality as Equality
 import qualified Hydra.Util as Util
 
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/FlowsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/FlowsSpec.hs
deleted file mode 100644
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/FlowsSpec.hs
+++ /dev/null
@@ -1,183 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.flows"},ModuleName {unModuleName = "Flows"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.compute"},ModuleName {unModuleName = "Compute"}),(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.flows"},ModuleName {unModuleName = "Flows"}),(Namespace {unNamespace = "hydra.lib.maps"},ModuleName {unModuleName = "Maps"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.lib.sets"},ModuleName {unModuleName = "Sets"}),(Namespace {unNamespace = "hydra.monads"},ModuleName {unModuleName = "Monads"})]
-
-module Generation.Hydra.Test.Lib.FlowsSpec where
-
-import Hydra.Kernel
-import qualified Test.Hspec as H
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-import qualified Data.Maybe as Y
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Flows as Flows
-import qualified Hydra.Lib.Maps as Maps
-import qualified Hydra.Lib.Math as Math
-import qualified Hydra.Lib.Sets as Sets
-import qualified Hydra.Monads as Monads
-
-spec :: H.Spec
-spec = H.describe "hydra.lib.flows primitives" $ do
-  H.describe "apply" $ do
-    H.it "apply add" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure (Math.add 3)) (\f -> Monads.bind (Monads.pure 5) (\x -> Monads.pure (f x)))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 8)
-  H.describe "bind" $ do
-    H.it "bind add" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure 5) (\n -> Monads.pure (Math.add n 5))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 10)
-    H.it "bind multiply" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure 3) (\n -> Monads.pure (Math.mul n 4))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 12)
-  H.describe "fail" $ do
-    H.it "fail with message" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.fail "test error message") Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Nothing :: Maybe Int)
-  H.describe "foldl" $ do
-    H.it "foldl sum" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure 0) (\a0 -> Monads.bind (Monads.pure (Math.add a0 1)) (\a1 -> Monads.bind (Monads.pure (Math.add a1 2)) (\a2 -> Monads.pure (Math.add a2 3))))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 6)
-  H.describe "map" $ do
-    H.it "map negate" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Flows.map Math.negate (Monads.pure 5)) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just (-5))
-    H.it "map abs" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Flows.map Math.abs (Monads.pure (-3))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 3)
-  H.describe "mapElems" $ do
-    H.it "mapElems add one" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure (Math.add 1 1)) (\v1 -> Monads.bind (Monads.pure (Math.add 2 1)) (\v2 -> Monads.pure (Maps.fromList [
-          ("a", v1),
-          ("b", v2)])))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just (M.fromList [
-          ("a", 2),
-          ("b", 3)]))
-  H.describe "mapKeys" $ do
-    H.it "mapKeys add one" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure (Math.add 1 1)) (\k1 -> Monads.bind (Monads.pure (Math.add 2 1)) (\k2 -> Monads.pure (Maps.fromList [
-          (k1, "a"),
-          (k2, "b")])))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just (M.fromList [
-          (2, "a"),
-          (3, "b")]))
-  H.describe "mapList" $ do
-    H.it "mapList add one" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure (Math.add 1 1)) (\y1 -> Monads.bind (Monads.pure (Math.add 2 1)) (\y2 -> Monads.bind (Monads.pure (Math.add 3 1)) (\y3 -> Monads.pure [
-          y1,
-          y2,
-          y3])))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just [
-          2,
-          3,
-          4])
-  H.describe "mapMaybe" $ do
-    H.it "mapMaybe just" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure (Math.add 5 1)) (\y -> Monads.pure (Just y))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just (Just 6))
-    H.it "mapMaybe nothing" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.pure Nothing) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just Nothing :: Maybe (Maybe Int))
-  H.describe "mapSet" $ do
-    H.it "mapSet add one" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure (Math.add 1 1)) (\y1 -> Monads.bind (Monads.pure (Math.add 2 1)) (\y2 -> Monads.bind (Monads.pure (Math.add 3 1)) (\y3 -> Monads.pure (Sets.fromList [
-          y1,
-          y2,
-          y3]))))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just (S.fromList [
-          2,
-          3,
-          4]))
-  H.describe "pure" $ do
-    H.it "pure integer" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.pure 42) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 42)
-    H.it "pure zero" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.pure 0) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 0)
-    H.it "pure negative" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.pure (-5)) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just (-5))
-    H.it "pure string" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.pure "hello") Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just "hello")
-  H.describe "sequence" $ do
-    H.it "sequence pure list" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure 1) (\x1 -> Monads.bind (Monads.pure 2) (\x2 -> Monads.bind (Monads.pure 3) (\x3 -> Monads.pure [
-          x1,
-          x2,
-          x3])))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just [
-          1,
-          2,
-          3])
-  H.describe "withDefault" $ do
-    H.it "withDefault on success returns original" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Flows.withDefault 0 (Monads.pure 42)) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 42)
-    H.it "withDefault on failure returns fallback" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Flows.withDefault 99 (Monads.fail "error")) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 99)
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/ListsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/ListsSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/ListsSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/ListsSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.lists"},ModuleName {unModuleName = "Lists"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.equality"},ModuleName {unModuleName = "Equality"}),(Namespace {unNamespace = "hydra.lib.lists"},ModuleName {unModuleName = "Lists"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.lib.strings"},ModuleName {unModuleName = "Strings"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.ListsSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Equality as Equality
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Math as Math
@@ -446,6 +444,33 @@
           2,
           3])
       (4)
+  H.describe "foldr" $ do
+    H.it "subtraction fold right" $ H.shouldBe
+      (Lists.foldr Math.sub 0 [
+          1,
+          2,
+          3])
+      (2)
+    H.it "empty list" $ H.shouldBe
+      (Lists.foldr Math.add 5 [])
+      (5)
+    H.it "single element" $ H.shouldBe
+      (Lists.foldr Math.add 10 [
+          5])
+      (15)
+    H.it "sum with addition" $ H.shouldBe
+      (Lists.foldr Math.add 0 [
+          1,
+          2,
+          3,
+          4])
+      (10)
+    H.it "subtraction vs foldl" $ H.shouldBe
+      (Lists.foldr Math.sub 10 [
+          1,
+          2,
+          3])
+      ((-8))
   H.describe "group" $ do
     H.it "consecutive duplicates" $ H.shouldBe
       (Lists.group [
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/LiteralsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/LiteralsSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/LiteralsSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/LiteralsSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.literals"},ModuleName {unModuleName = "Literals"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.literals"},ModuleName {unModuleName = "Literals"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.LiteralsSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Literals as Literals
 
 spec :: H.Spec
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/LogicSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/LogicSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/LogicSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/LogicSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.logic"},ModuleName {unModuleName = "Logic"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.logic"},ModuleName {unModuleName = "Logic"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.LogicSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Logic as Logic
 
 spec :: H.Spec
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/MapsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/MapsSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/MapsSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/MapsSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.maps"},ModuleName {unModuleName = "Maps"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.equality"},ModuleName {unModuleName = "Equality"}),(Namespace {unNamespace = "hydra.lib.maps"},ModuleName {unModuleName = "Maps"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.lib.strings"},ModuleName {unModuleName = "Strings"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.MapsSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Equality as Equality
 import qualified Hydra.Lib.Maps as Maps
 import qualified Hydra.Lib.Math as Math
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/MathSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/MathSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/MathSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/MathSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.math"},ModuleName {unModuleName = "Math"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.MathSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Math as Math
 
 spec :: H.Spec
@@ -246,135 +244,195 @@
       ((-4))
   H.describe "e" $ do
     H.it "Euler's number" $ H.shouldBe
-      (Math.e)
-      (2.718281828459045)
+      (Math.roundFloat64 12 Math.e)
+      (2.71828182846)
   H.describe "pi" $ do
     H.it "pi constant" $ H.shouldBe
-      (Math.pi)
-      (3.141592653589793)
+      (Math.roundFloat64 12 Math.pi)
+      (3.14159265359)
   H.describe "sin" $ do
     H.it "sin 0" $ H.shouldBe
       (Math.sin 0.0)
       (0.0)
     H.it "sin pi/2" $ H.shouldBe
-      (Math.sin 1.5707963267948966)
+      (Math.roundFloat64 12 (Math.sin 1.5707963267948966))
       (1.0)
     H.it "sin pi" $ H.shouldBe
-      (Math.sin 3.141592653589793)
-      (1.2246467991473532e-16)
+      (Math.roundFloat64 12 (Math.sin 3.141592653589793))
+      (1.22464679915e-16)
+    H.it "sin 1" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.sin 1.0))
+      (0.841470984808)
+    H.it "sin 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.sin 0.5))
+      (0.479425538604)
   H.describe "cos" $ do
     H.it "cos 0" $ H.shouldBe
       (Math.cos 0.0)
       (1.0)
     H.it "cos pi/2" $ H.shouldBe
-      (Math.cos 1.5707963267948966)
-      (6.123233995736766e-17)
+      (Math.roundFloat64 12 (Math.cos 1.5707963267948966))
+      (6.12323399574e-17)
     H.it "cos pi" $ H.shouldBe
       (Math.cos 3.141592653589793)
       ((-1.0))
+    H.it "cos 1" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.cos 1.0))
+      (0.540302305868)
+    H.it "cos 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.cos 0.5))
+      (0.87758256189)
   H.describe "tan" $ do
     H.it "tan 0" $ H.shouldBe
       (Math.tan 0.0)
       (0.0)
     H.it "tan pi/4" $ H.shouldBe
-      (Math.tan 0.7853981633974483)
-      (0.9999999999999999)
+      (Math.roundFloat64 12 (Math.tan 0.7853981633974483))
+      (1.0)
+    H.it "tan 1" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.tan 1.0))
+      (1.55740772465)
+    H.it "tan 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.tan 0.5))
+      (0.546302489844)
   H.describe "asin" $ do
     H.it "asin 0" $ H.shouldBe
       (Math.asin 0.0)
       (0.0)
     H.it "asin 1" $ H.shouldBe
-      (Math.asin 1.0)
-      (1.5707963267948966)
+      (Math.roundFloat64 12 (Math.asin 1.0))
+      (1.57079632679)
     H.it "asin -1" $ H.shouldBe
-      (Math.asin (-1.0))
-      ((-1.5707963267948966))
+      (Math.roundFloat64 12 (Math.asin (-1.0)))
+      ((-1.57079632679))
+    H.it "asin 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.asin 0.5))
+      (0.523598775598)
   H.describe "acos" $ do
     H.it "acos 1" $ H.shouldBe
       (Math.acos 1.0)
       (0.0)
     H.it "acos 0" $ H.shouldBe
-      (Math.acos 0.0)
-      (1.5707963267948966)
+      (Math.roundFloat64 12 (Math.acos 0.0))
+      (1.57079632679)
     H.it "acos -1" $ H.shouldBe
-      (Math.acos (-1.0))
-      (3.141592653589793)
+      (Math.roundFloat64 12 (Math.acos (-1.0)))
+      (3.14159265359)
+    H.it "acos 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.acos 0.5))
+      (1.0471975512)
   H.describe "atan" $ do
     H.it "atan 0" $ H.shouldBe
       (Math.atan 0.0)
       (0.0)
     H.it "atan 1" $ H.shouldBe
-      (Math.atan 1.0)
-      (0.7853981633974483)
+      (Math.roundFloat64 12 (Math.atan 1.0))
+      (0.785398163397)
+    H.it "atan 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.atan 0.5))
+      (0.463647609001)
   H.describe "atan2" $ do
     H.it "atan2 1 1" $ H.shouldBe
-      (Math.atan2 1.0 1.0)
-      (0.7853981633974483)
+      (Math.roundFloat64 12 (Math.atan2 1.0 1.0))
+      (0.785398163397)
     H.it "atan2 1 0" $ H.shouldBe
-      (Math.atan2 1.0 0.0)
-      (1.5707963267948966)
+      (Math.roundFloat64 12 (Math.atan2 1.0 0.0))
+      (1.57079632679)
     H.it "atan2 0 1" $ H.shouldBe
       (Math.atan2 0.0 1.0)
       (0.0)
+    H.it "atan2 3 4" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.atan2 3.0 4.0))
+      (0.643501108793)
   H.describe "sinh" $ do
     H.it "sinh 0" $ H.shouldBe
       (Math.sinh 0.0)
       (0.0)
     H.it "sinh 1" $ H.shouldBe
-      (Math.sinh 1.0)
-      (1.1752011936438014)
+      (Math.roundFloat64 12 (Math.sinh 1.0))
+      (1.17520119364)
+    H.it "sinh 2" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.sinh 2.0))
+      (3.62686040785)
   H.describe "cosh" $ do
     H.it "cosh 0" $ H.shouldBe
       (Math.cosh 0.0)
       (1.0)
     H.it "cosh 1" $ H.shouldBe
-      (Math.cosh 1.0)
-      (1.5430806348152437)
+      (Math.roundFloat64 12 (Math.cosh 1.0))
+      (1.54308063482)
+    H.it "cosh 2" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.cosh 2.0))
+      (3.76219569108)
   H.describe "tanh" $ do
     H.it "tanh 0" $ H.shouldBe
       (Math.tanh 0.0)
       (0.0)
     H.it "tanh 1" $ H.shouldBe
-      (Math.tanh 1.0)
-      (0.7615941559557649)
+      (Math.roundFloat64 12 (Math.tanh 1.0))
+      (0.761594155956)
+    H.it "tanh 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.tanh 0.5))
+      (0.46211715726)
   H.describe "asinh" $ do
     H.it "asinh 0" $ H.shouldBe
       (Math.asinh 0.0)
       (0.0)
     H.it "asinh 1" $ H.shouldBe
-      (Math.asinh 1.0)
-      (0.881373587019543)
+      (Math.roundFloat64 12 (Math.asinh 1.0))
+      (0.88137358702)
+    H.it "asinh 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.asinh 0.5))
+      (0.48121182506)
   H.describe "acosh" $ do
     H.it "acosh 1" $ H.shouldBe
       (Math.acosh 1.0)
       (0.0)
     H.it "acosh 2" $ H.shouldBe
-      (Math.acosh 2.0)
-      (1.3169578969248166)
+      (Math.roundFloat64 12 (Math.acosh 2.0))
+      (1.31695789692)
+    H.it "acosh 3" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.acosh 3.0))
+      (1.76274717404)
   H.describe "atanh" $ do
     H.it "atanh 0" $ H.shouldBe
       (Math.atanh 0.0)
       (0.0)
     H.it "atanh 0.5" $ H.shouldBe
-      (Math.atanh 0.5)
-      (0.5493061443340549)
+      (Math.roundFloat64 12 (Math.atanh 0.5))
+      (0.549306144334)
+    H.it "atanh 0.1" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.atanh 0.1))
+      (0.100335347731)
   H.describe "exp" $ do
     H.it "exp 0" $ H.shouldBe
       (Math.exp 0.0)
       (1.0)
     H.it "exp 1" $ H.shouldBe
-      (Math.exp 1.0)
-      (2.718281828459045)
+      (Math.roundFloat64 12 (Math.exp 1.0))
+      (2.71828182846)
     H.it "exp -1" $ H.shouldBe
-      (Math.exp (-1.0))
-      (0.36787944117144233)
+      (Math.roundFloat64 12 (Math.exp (-1.0)))
+      (0.367879441171)
+    H.it "exp 2" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.exp 2.0))
+      (7.38905609893)
+    H.it "exp 0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.exp 0.5))
+      (1.6487212707)
   H.describe "log" $ do
     H.it "log 1" $ H.shouldBe
       (Math.log 1.0)
       (0.0)
     H.it "log e" $ H.shouldBe
-      (Math.log 2.718281828459045)
+      (Math.roundFloat64 12 (Math.log 2.718281828459045))
       (1.0)
+    H.it "log 2" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.log 2.0))
+      (0.69314718056)
+    H.it "log 10" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.log 10.0))
+      (2.30258509299)
   H.describe "logBase" $ do
     H.it "log10 1" $ H.shouldBe
       (Math.logBase 10.0 1.0)
@@ -388,6 +446,9 @@
     H.it "log2 8" $ H.shouldBe
       (Math.logBase 2.0 8.0)
       (3.0)
+    H.it "log2 10" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.logBase 2.0 10.0))
+      (3.32192809489)
   H.describe "pow" $ do
     H.it "2^3" $ H.shouldBe
       (Math.pow 2.0 3.0)
@@ -398,6 +459,9 @@
     H.it "2^-1" $ H.shouldBe
       (Math.pow 2.0 (-1.0))
       (0.5)
+    H.it "2^0.5" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.pow 2.0 0.5))
+      (1.41421356237)
   H.describe "sqrt" $ do
     H.it "sqrt 4" $ H.shouldBe
       (Math.sqrt 4.0)
@@ -411,6 +475,9 @@
     H.it "sqrt 0" $ H.shouldBe
       (Math.sqrt 0.0)
       (0.0)
+    H.it "sqrt 3" $ H.shouldBe
+      (Math.roundFloat64 12 (Math.sqrt 3.0))
+      (1.73205080757)
   H.describe "ceiling" $ do
     H.it "ceiling 3.2" $ H.shouldBe
       (Math.ceiling 3.2)
@@ -453,6 +520,57 @@
     H.it "round -3.5" $ H.shouldBe
       (Math.round (-3.5))
       ((-4))
+  H.describe "roundBigfloat" $ do
+    H.it "zero" $ H.shouldBe
+      (Math.roundBigfloat 5 0.0)
+      (0.0)
+    H.it "round pi to 4 digits" $ H.shouldBe
+      (Math.roundBigfloat 4 3.141592653589793)
+      (3.142)
+    H.it "round 1234.5 to 3 digits" $ H.shouldBe
+      (Math.roundBigfloat 3 1234.5)
+      (1230.0)
+    H.it "round 0.001234 to 2 digits" $ H.shouldBe
+      (Math.roundBigfloat 2 1.234e-3)
+      (1.2e-3)
+    H.it "negative" $ H.shouldBe
+      (Math.roundBigfloat 3 (-1234.5))
+      ((-1230.0))
+  H.describe "roundFloat32" $ do
+    H.it "zero" $ H.shouldBe
+      (Math.roundFloat32 5 0.0)
+      (0.0)
+    H.it "round pi to 4 digits" $ H.shouldBe
+      (Math.roundFloat32 4 3.1415927)
+      (3.142)
+    H.it "round 1234.5 to 3 digits" $ H.shouldBe
+      (Math.roundFloat32 3 1234.5)
+      (1230.0)
+    H.it "negative" $ H.shouldBe
+      (Math.roundFloat32 3 (-1234.5))
+      ((-1230.0))
+  H.describe "roundFloat64" $ do
+    H.it "zero" $ H.shouldBe
+      (Math.roundFloat64 5 0.0)
+      (0.0)
+    H.it "round pi to 4 digits" $ H.shouldBe
+      (Math.roundFloat64 4 3.141592653589793)
+      (3.142)
+    H.it "round pi to 10 digits" $ H.shouldBe
+      (Math.roundFloat64 10 3.141592653589793)
+      (3.141592654)
+    H.it "round 1234.5 to 3 digits" $ H.shouldBe
+      (Math.roundFloat64 3 1234.5)
+      (1230.0)
+    H.it "round 0.001234 to 2 digits" $ H.shouldBe
+      (Math.roundFloat64 2 1.234e-3)
+      (1.2e-3)
+    H.it "negative" $ H.shouldBe
+      (Math.roundFloat64 3 (-1234.5))
+      ((-1230.0))
+    H.it "round 1 digit" $ H.shouldBe
+      (Math.roundFloat64 1 9.876)
+      (10.0)
   H.describe "truncate" $ do
     H.it "truncate 3.8" $ H.shouldBe
       (Math.truncate 3.8)
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/MaybesSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/MaybesSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/MaybesSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/MaybesSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.maybes"},ModuleName {unModuleName = "Maybes"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.equality"},ModuleName {unModuleName = "Equality"}),(Namespace {unNamespace = "hydra.lib.logic"},ModuleName {unModuleName = "Logic"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.lib.maybes"},ModuleName {unModuleName = "Maybes"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.MaybesSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Equality as Equality
 import qualified Hydra.Lib.Logic as Logic
 import qualified Hydra.Lib.Math as Math
@@ -144,3 +142,11 @@
     H.it "wraps string" $ H.shouldBe
       (Maybes.pure "hello")
       (Just "hello")
+  H.describe "toList" $ do
+    H.it "just value" $ H.shouldBe
+      (Maybes.toList (Just 42))
+      ([
+          42])
+    H.it "nothing" $ H.shouldBe
+      (Maybes.toList Nothing)
+      ([] :: [Int])
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/PairsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/PairsSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/PairsSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/PairsSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.pairs"},ModuleName {unModuleName = "Pairs"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.lib.pairs"},ModuleName {unModuleName = "Pairs"}),(Namespace {unNamespace = "hydra.lib.strings"},ModuleName {unModuleName = "Strings"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.PairsSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Math as Math
 import qualified Hydra.Lib.Pairs as Pairs
 import qualified Hydra.Lib.Strings as Strings
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/RegexSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/RegexSpec.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/RegexSpec.hs
@@ -0,0 +1,151 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
+
+module Generation.Hydra.Test.Lib.RegexSpec where
+
+import Hydra.Kernel
+import qualified Test.Hspec as H
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+import qualified Data.Maybe as Y
+import qualified Hydra.Lib.Regex as Regex
+
+spec :: H.Spec
+spec = H.describe "hydra.lib.regex primitives" $ do
+  H.describe "matches" $ do
+    H.it "exact match" $ H.shouldBe
+      (Regex.matches "hello" "hello")
+      (True)
+    H.it "pattern match" $ H.shouldBe
+      (Regex.matches "[a-z]+" "hello")
+      (True)
+    H.it "no match" $ H.shouldBe
+      (Regex.matches "[0-9]+" "hello")
+      (False)
+    H.it "partial content does not match" $ H.shouldBe
+      (Regex.matches "[a-z]+" "hello123")
+      (False)
+    H.it "digit pattern" $ H.shouldBe
+      (Regex.matches "[0-9]+" "12345")
+      (True)
+    H.it "mixed pattern" $ H.shouldBe
+      (Regex.matches "[a-z]+[0-9]+" "hello123")
+      (True)
+    H.it "empty pattern matches empty" $ H.shouldBe
+      (Regex.matches "" "")
+      (True)
+    H.it "empty pattern does not match non-empty" $ H.shouldBe
+      (Regex.matches "" "hello")
+      (False)
+    H.it "star matches empty" $ H.shouldBe
+      (Regex.matches "a*" "")
+      (True)
+    H.it "alternation" $ H.shouldBe
+      (Regex.matches "cat|dog" "cat")
+      (True)
+    H.it "alternation second" $ H.shouldBe
+      (Regex.matches "cat|dog" "dog")
+      (True)
+    H.it "alternation no match" $ H.shouldBe
+      (Regex.matches "cat|dog" "bird")
+      (False)
+    H.it "quantifier" $ H.shouldBe
+      (Regex.matches "ab?c" "ac")
+      (True)
+    H.it "quantifier with optional" $ H.shouldBe
+      (Regex.matches "ab?c" "abc")
+      (True)
+  H.describe "find" $ do
+    H.it "simple find" $ H.shouldBe
+      (Regex.find "[0-9]+" "abc123def")
+      (Just "123")
+    H.it "no match" $ H.shouldBe
+      (Regex.find "[0-9]+" "abcdef")
+      (Nothing)
+    H.it "find first" $ H.shouldBe
+      (Regex.find "[a-z]+" "123abc456def")
+      (Just "abc")
+    H.it "empty input" $ H.shouldBe
+      (Regex.find "[0-9]+" "")
+      (Nothing)
+    H.it "full match" $ H.shouldBe
+      (Regex.find ".*" "hello")
+      (Just "hello")
+  H.describe "findAll" $ do
+    H.it "multiple matches" $ H.shouldBe
+      (Regex.findAll "[0-9]+" "a1b2c3")
+      ([
+          "1",
+          "2",
+          "3"])
+    H.it "no matches" $ H.shouldBe
+      (Regex.findAll "[0-9]+" "abc")
+      ([])
+    H.it "overlapping words" $ H.shouldBe
+      (Regex.findAll "[a-z]+" "abc def ghi")
+      ([
+          "abc",
+          "def",
+          "ghi"])
+    H.it "single match" $ H.shouldBe
+      (Regex.findAll "hello" "say hello world")
+      ([
+          "hello"])
+  H.describe "replace" $ do
+    H.it "basic replace" $ H.shouldBe
+      (Regex.replace "[0-9]+" "X" "abc123def456")
+      ("abcXdef456")
+    H.it "no match" $ H.shouldBe
+      (Regex.replace "[0-9]+" "X" "abcdef")
+      ("abcdef")
+    H.it "replace at start" $ H.shouldBe
+      (Regex.replace "^[a-z]+" "X" "abc123")
+      ("X123")
+    H.it "empty replacement" $ H.shouldBe
+      (Regex.replace "[0-9]+" "" "abc123def")
+      ("abcdef")
+  H.describe "replaceAll" $ do
+    H.it "replace all digits" $ H.shouldBe
+      (Regex.replaceAll "[0-9]+" "X" "a1b2c3")
+      ("aXbXcX")
+    H.it "no match" $ H.shouldBe
+      (Regex.replaceAll "[0-9]+" "X" "abc")
+      ("abc")
+    H.it "replace all words" $ H.shouldBe
+      (Regex.replaceAll "[a-z]+" "X" "abc 123 def")
+      ("X 123 X")
+    H.it "empty replacement" $ H.shouldBe
+      (Regex.replaceAll "[0-9]+" "" "a1b2c3")
+      ("abc")
+  H.describe "split" $ do
+    H.it "split on comma" $ H.shouldBe
+      (Regex.split "," "a,b,c")
+      ([
+          "a",
+          "b",
+          "c"])
+    H.it "split on spaces" $ H.shouldBe
+      (Regex.split " +" "a b  c")
+      ([
+          "a",
+          "b",
+          "c"])
+    H.it "no match" $ H.shouldBe
+      (Regex.split "," "abc")
+      ([
+          "abc"])
+    H.it "split on digits" $ H.shouldBe
+      (Regex.split "[0-9]+" "a1b2c")
+      ([
+          "a",
+          "b",
+          "c"])
+    H.it "trailing delimiter" $ H.shouldBe
+      (Regex.split "," "a,b,")
+      ([
+          "a",
+          "b",
+          ""])
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/SetsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/SetsSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/SetsSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/SetsSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.sets"},ModuleName {unModuleName = "Sets"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.lib.sets"},ModuleName {unModuleName = "Sets"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.SetsSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Math as Math
 import qualified Hydra.Lib.Sets as Sets
 
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/Lib/StringsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/Lib/StringsSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/Lib/StringsSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/Lib/StringsSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.lib.strings"},ModuleName {unModuleName = "Strings"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.strings"},ModuleName {unModuleName = "Strings"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.Lib.StringsSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Strings as Strings
 
 spec :: H.Spec
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/MonadsSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/MonadsSpec.hs
deleted file mode 100644
--- a/src/gen-test/haskell/Generation/Hydra/Test/MonadsSpec.hs
+++ /dev/null
@@ -1,67 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.monads"},ModuleName {unModuleName = "Monads"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.compute"},ModuleName {unModuleName = "Compute"}),(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.monads"},ModuleName {unModuleName = "Monads"})]
-
-module Generation.Hydra.Test.MonadsSpec where
-
-import Hydra.Kernel
-import qualified Test.Hspec as H
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-import qualified Data.Maybe as Y
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Lexical as Lexical
-import qualified Hydra.Lib.Math as Math
-import qualified Hydra.Monads as Monads
-
-spec :: H.Spec
-spec = H.describe "monads" $ do
-  H.describe "pure" $ do
-    H.it "integer" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.pure 42) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 42)
-    H.it "string" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.pure "hello") Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just "hello")
-  H.describe "map" $ do
-    H.it "map negate" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.map Math.negate (Monads.pure 5)) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just (-5))
-    H.it "map absolute" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.map Math.abs (Monads.pure (-3))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 3)
-  H.describe "bind" $ do
-    H.it "bind add" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure 10) (\n -> Monads.pure (Math.add n 5))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 15)
-    H.it "bind multiply" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.bind (Monads.pure 3) (\n -> Monads.pure (Math.mul n 4))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Just 12)
-  H.describe "error traces" $ do
-    H.it "Error traces are in the right order" $ H.shouldBe
-      (Compute.flowStateValue (Compute.unFlow (Monads.withTrace "one" (Monads.withTrace "two" (Monads.fail "oops"))) Lexical.emptyGraph (Compute.Trace {
-          Compute.traceStack = [],
-          Compute.traceMessages = [],
-          Compute.traceOther = M.empty})))
-      (Nothing :: Maybe Int)
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/ReductionSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/ReductionSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/ReductionSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/ReductionSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.reduction"},ModuleName {unModuleName = "Reduction"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.lib.lists"},ModuleName {unModuleName = "Lists"}),(Namespace {unNamespace = "hydra.lib.math"},ModuleName {unModuleName = "Math"}),(Namespace {unNamespace = "hydra.lib.sets"},ModuleName {unModuleName = "Sets"}),(Namespace {unNamespace = "hydra.lib.strings"},ModuleName {unModuleName = "Strings"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.ReductionSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Math as Math
 import qualified Hydra.Lib.Sets as Sets
diff --git a/src/gen-test/haskell/Generation/Hydra/Test/SortingSpec.hs b/src/gen-test/haskell/Generation/Hydra/Test/SortingSpec.hs
--- a/src/gen-test/haskell/Generation/Hydra/Test/SortingSpec.hs
+++ b/src/gen-test/haskell/Generation/Hydra/Test/SortingSpec.hs
@@ -1,8 +1,7 @@
 -- Note: this is an automatically generated file. Do not edit.
 
--- DEBUG: Focus namespace = (Namespace {unNamespace = "generation.hydra.test.sorting"},ModuleName {unModuleName = "Sorting"})
--- DEBUG: Namespace mappings:
--- [(Namespace {unNamespace = "hydra.lexical"},ModuleName {unModuleName = "Lexical"}),(Namespace {unNamespace = "hydra.sorting"},ModuleName {unModuleName = "Sorting"})]
+-- DEBUG: Focus namespace = (see generated module)
+-- DEBUG: Namespace mappings: (see generated module)
 
 module Generation.Hydra.Test.SortingSpec where
 
@@ -12,7 +11,6 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.Maybe as Y
-import qualified Hydra.Lexical as Lexical
 import qualified Hydra.Sorting as Sorting
 
 spec :: H.Spec
diff --git a/src/gen-test/haskell/Generation/Spec.hs b/src/gen-test/haskell/Generation/Spec.hs
--- a/src/gen-test/haskell/Generation/Spec.hs
+++ b/src/gen-test/haskell/Generation/Spec.hs
@@ -6,7 +6,6 @@
 import qualified Generation.Hydra.Test.Lib.CharsSpec as Generation_Hydra_Test_Lib_CharsSpec
 import qualified Generation.Hydra.Test.Lib.EithersSpec as Generation_Hydra_Test_Lib_EithersSpec
 import qualified Generation.Hydra.Test.Lib.EqualitySpec as Generation_Hydra_Test_Lib_EqualitySpec
-import qualified Generation.Hydra.Test.Lib.FlowsSpec as Generation_Hydra_Test_Lib_FlowsSpec
 import qualified Generation.Hydra.Test.Lib.ListsSpec as Generation_Hydra_Test_Lib_ListsSpec
 import qualified Generation.Hydra.Test.Lib.LiteralsSpec as Generation_Hydra_Test_Lib_LiteralsSpec
 import qualified Generation.Hydra.Test.Lib.LogicSpec as Generation_Hydra_Test_Lib_LogicSpec
@@ -14,11 +13,11 @@
 import qualified Generation.Hydra.Test.Lib.MathSpec as Generation_Hydra_Test_Lib_MathSpec
 import qualified Generation.Hydra.Test.Lib.MaybesSpec as Generation_Hydra_Test_Lib_MaybesSpec
 import qualified Generation.Hydra.Test.Lib.PairsSpec as Generation_Hydra_Test_Lib_PairsSpec
+import qualified Generation.Hydra.Test.Lib.RegexSpec as Generation_Hydra_Test_Lib_RegexSpec
 import qualified Generation.Hydra.Test.Lib.SetsSpec as Generation_Hydra_Test_Lib_SetsSpec
 import qualified Generation.Hydra.Test.Lib.StringsSpec as Generation_Hydra_Test_Lib_StringsSpec
 import qualified Generation.Hydra.Test.AnnotationsSpec as Generation_Hydra_Test_AnnotationsSpec
 import qualified Generation.Hydra.Test.FormattingSpec as Generation_Hydra_Test_FormattingSpec
-import qualified Generation.Hydra.Test.MonadsSpec as Generation_Hydra_Test_MonadsSpec
 import qualified Generation.Hydra.Test.ReductionSpec as Generation_Hydra_Test_ReductionSpec
 import qualified Generation.Hydra.Test.SortingSpec as Generation_Hydra_Test_SortingSpec
 
@@ -27,7 +26,6 @@
     Generation_Hydra_Test_Lib_CharsSpec.spec
     Generation_Hydra_Test_Lib_EithersSpec.spec
     Generation_Hydra_Test_Lib_EqualitySpec.spec
-    Generation_Hydra_Test_Lib_FlowsSpec.spec
     Generation_Hydra_Test_Lib_ListsSpec.spec
     Generation_Hydra_Test_Lib_LiteralsSpec.spec
     Generation_Hydra_Test_Lib_LogicSpec.spec
@@ -35,10 +33,10 @@
     Generation_Hydra_Test_Lib_MathSpec.spec
     Generation_Hydra_Test_Lib_MaybesSpec.spec
     Generation_Hydra_Test_Lib_PairsSpec.spec
+    Generation_Hydra_Test_Lib_RegexSpec.spec
     Generation_Hydra_Test_Lib_SetsSpec.spec
     Generation_Hydra_Test_Lib_StringsSpec.spec
     Generation_Hydra_Test_AnnotationsSpec.spec
     Generation_Hydra_Test_FormattingSpec.spec
-    Generation_Hydra_Test_MonadsSpec.spec
     Generation_Hydra_Test_ReductionSpec.spec
     Generation_Hydra_Test_SortingSpec.spec
diff --git a/src/gen-test/haskell/Hydra/Test/Annotations.hs b/src/gen-test/haskell/Hydra/Test/Annotations.hs
--- a/src/gen-test/haskell/Hydra/Test/Annotations.hs
+++ b/src/gen-test/haskell/Hydra/Test/Annotations.hs
@@ -16,2347 +16,2252 @@
 
 -- | Test cases for hydra.annotations functions
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "annotations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "arbitrary annotations",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set single annotation #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "string"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set single annotation #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "myKey"))}))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17))))}}))}}))}}))))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "string"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "myKey"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17))))}}))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set single annotation #3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}}))}}))))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "integer"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "int32"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get existing annotation #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "value"))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "string"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "value"))}}))}}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get existing annotation #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString ""))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "string"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString ""))}}))}}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get existing annotation #3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))}))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "integer"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "int32"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)))}}))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "integer"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "int32"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)))}}))}}))}}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get missing annotation #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "integer"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "int16"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 42)))}}))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get missing annotation #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nonexistent"))}))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "string"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get missing annotation #3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "integer"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "int32"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set multiple annotations #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))}))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200)))}}))}}))}}))))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "boolean"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "boolean"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.fromList [
-                        (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}), (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "string"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))}}))}}))),
-                        (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))}), (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200)))}}))}}))}})))]))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set multiple annotations #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "b"))}))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}}))))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "a"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "integer"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "int32"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))}}))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.fromList [
-                        (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "a"))}), (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))}}))}}))}}))),
-                        (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "b"))}), (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}})))]))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "outer annotation overrides inner #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "outer"))}}))}}))))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "inner"))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "outer"))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "outer annotation overrides inner #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "new"))}}))}}))))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "old"))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "new"))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "outer annotation overrides inner #3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))}))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}}))}}))}}))))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "integer"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "int32"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "boolean"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean False))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "boolean"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean False))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}}))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unset single annotation #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int64"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "integer"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "int64"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unset single annotation #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "integer"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "int32"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "string"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unset one of multiple annotations #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "integer"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "int32"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200)))}}))}}))}}))))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
-                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "literal"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "string"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))}}))}}))))})),
-                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "integer"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "int64"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int64"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200)))}}))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unset one of multiple annotations #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "b"))}))})),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "b"))}))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "integer"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "int32"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
-                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "a"))}))})),
-                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "literal"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "integer"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "int32"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
-                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "literal"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "x"))}}))}}))}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "x"))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "a"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "descriptions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set description #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "my description"))))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "string"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "my description"))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set description #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString ""))))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "integer"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "int32"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString ""))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set description #3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "A longer description with spaces"))))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "boolean"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "boolean"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "A longer description with spaces"))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get existing description #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
-                      Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))}))}))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get existing description #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString ""))))})),
-                      Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))}))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString ""))))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get existing description #3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "desc"))))})),
-                      Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "boolean"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean False))}}))}}))}))}))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "desc"))))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get missing description #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
-                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "literal"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "integer"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "int16"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 42)))}}))}}))}}))}))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMaybe Nothing)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get missing description #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
-                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "literal"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "string"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "no description here"))}}))}}))}))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMaybe Nothing)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get missing description #3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
-                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "literal"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "integer"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "int32"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}}))}))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMaybe Nothing)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "hydra.monads.emptyTrace"))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "outer description overrides inner #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "outer"))))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "inner"))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "outer"))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "outer description overrides inner #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "new"))))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "old"))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int32"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "annotated"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "body"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "integer"),
-                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "int32"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "annotation"),
-                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "literal"),
-                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "new"))}}))}}))))}]}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unset description #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "desc"))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "integer"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "int64"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "integer"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "int64"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unset description #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "to be removed"))))})),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "literal"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "string"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "layered annotations",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get annotation from unannotated term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "literal"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "integer"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "int32"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get annotation from singly annotated term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "annotated"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "body"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "annotation"),
-                        Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "integer"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "int32"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get inner annotation from doubly annotated term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "annotated"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "body"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "annotated"),
-                            Core.fieldTerm = (Core.TermRecord (Core.Record {
-                              Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                              Core.recordFields = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "body"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "annotation"),
-                                  Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "annotation"),
-                        Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))})) (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))}]}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "integer"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "int32"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get outer annotation from doubly annotated term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))}))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "annotated"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "body"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "annotated"),
-                            Core.fieldTerm = (Core.TermRecord (Core.Record {
-                              Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                              Core.recordFields = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "body"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "annotation"),
-                                  Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "annotation"),
-                        Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))})) (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))}]}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "integer"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "int32"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get non-overridden annotation from triply annotated term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))}))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "annotated"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "body"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "annotated"),
-                            Core.fieldTerm = (Core.TermRecord (Core.Record {
-                              Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                              Core.recordFields = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "body"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "annotated"),
-                                      Core.fieldTerm = (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "body"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "literal"),
-                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                  Core.injectionField = Core.Field {
-                                                    Core.fieldName = (Core.Name "integer"),
-                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                      Core.injectionField = Core.Field {
-                                                        Core.fieldName = (Core.Name "int32"),
-                                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "annotation"),
-                                            Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "literal"),
-                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                  Core.injectionField = Core.Field {
-                                                    Core.fieldName = (Core.Name "integer"),
-                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                      Core.injectionField = Core.Field {
-                                                        Core.fieldName = (Core.Name "int32"),
-                                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))},
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "annotation"),
-                                  Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))})) (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))}]}))}}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "annotation"),
-                        Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))))}]}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "integer"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "int32"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "outer annotation overrides inner in layered term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
-                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))})),
-              Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "annotated"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "body"),
-                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "annotated"),
-                            Core.fieldTerm = (Core.TermRecord (Core.Record {
-                              Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                              Core.recordFields = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "body"),
-                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "annotated"),
-                                      Core.fieldTerm = (Core.TermRecord (Core.Record {
-                                        Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
-                                        Core.recordFields = [
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "body"),
-                                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "literal"),
-                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                  Core.injectionField = Core.Field {
-                                                    Core.fieldName = (Core.Name "integer"),
-                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                      Core.injectionField = Core.Field {
-                                                        Core.fieldName = (Core.Name "int32"),
-                                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
-                                          Core.Field {
-                                            Core.fieldName = (Core.Name "annotation"),
-                                            Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "literal"),
-                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                                  Core.injectionField = Core.Field {
-                                                    Core.fieldName = (Core.Name "integer"),
-                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                                      Core.injectionField = Core.Field {
-                                                        Core.fieldName = (Core.Name "int32"),
-                                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))},
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "annotation"),
-                                  Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                                    Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))})) (Core.TermUnion (Core.Injection {
-                                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                                    Core.injectionField = Core.Field {
-                                      Core.fieldName = (Core.Name "literal"),
-                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                                        Core.injectionField = Core.Field {
-                                          Core.fieldName = (Core.Name "integer"),
-                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                            Core.injectionField = Core.Field {
-                                              Core.fieldName = (Core.Name "int32"),
-                                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))}]}))}}))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "annotation"),
-                        Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
-                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "literal"),
-                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                              Core.injectionField = Core.Field {
-                                Core.fieldName = (Core.Name "integer"),
-                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                                  Core.injectionField = Core.Field {
-                                    Core.fieldName = (Core.Name "int32"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))))}]}))}}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "literal"),
-                Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "integer"),
-                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
-                      Core.injectionField = Core.Field {
-                        Core.fieldName = (Core.Name "int32"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "requiresFlowDecoding"]}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "annotations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "arbitrary annotations",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set single annotation #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set single annotation #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "myKey"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17))))}}))}}))}}))))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "myKey"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17))))}}))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set single annotation #3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}}))}}))))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "integer"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "int32"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get existing annotation #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "value"))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "string"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "value"))}}))}}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get existing annotation #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString ""))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "string"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString ""))}}))}}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get existing annotation #3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))}))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "integer"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "int32"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)))}}))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "integer"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "int32"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)))}}))}}))}}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get missing annotation #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "integer"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "int16"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 42)))}}))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get missing annotation #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "nonexistent"))}))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get missing annotation #3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "integer"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "int32"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set multiple annotations #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200)))}}))}}))}}))))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "boolean"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "boolean"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.fromList [
+                            (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}), (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "string"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))}}))}}))),
+                            (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))}), (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200)))}}))}}))}})))]))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set multiple annotations #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "b"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}}))))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "a"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "integer"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "int32"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))}}))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.fromList [
+                            (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "a"))}), (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))}}))}}))}}))),
+                            (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "b"))}), (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}})))]))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "outer annotation overrides inner #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "outer"))}}))}}))))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "inner"))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "outer"))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "outer annotation overrides inner #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "new"))}}))}}))))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "old"))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "new"))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "outer annotation overrides inner #3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}}))}}))}}))))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "integer"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "int32"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "boolean"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean False))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "boolean"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean False))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "key"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}}))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unset single annotation #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int64"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "integer"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "int64"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unset single annotation #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "x"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "integer"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "int32"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "string"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unset one of multiple annotations #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "integer"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "int32"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200)))}}))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                          Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k1"))}))})),
+                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "literal"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "string"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))}}))}}))))})),
+                      Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "integer"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "int64"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int64"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "k2"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200)))}}))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unset one of multiple annotations #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                      Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "b"))}))})),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                        Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                          Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "b"))}))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "integer"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "int32"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))})),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermAnnotation")),
+                          Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "a"))}))})),
+                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "literal"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "integer"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "int32"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
+                      Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "literal"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "x"))}}))}}))}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "x"))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "a"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "descriptions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set description #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "my description"))))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "my description"))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set description #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString ""))))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "integer"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "int32"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString ""))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set description #3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "A longer description with spaces"))))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "boolean"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "boolean"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "A longer description with spaces"))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get existing description #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyContext"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get existing description #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyContext"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString ""))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString ""))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get existing description #3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyContext"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "desc"))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "boolean"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean False))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "desc"))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get missing description #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyContext"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "integer"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "int16"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 42)))}}))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe Nothing)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get missing description #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyContext"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "no description here"))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe Nothing)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get missing description #3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermDescription")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyContext"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "hydra.lexical.emptyGraph"))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "integer"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "int32"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}}))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe Nothing)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "outer description overrides inner #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "outer"))))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "inner"))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "outer"))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "outer description overrides inner #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "new"))))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "old"))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int32"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "annotated"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "body"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "integer"),
+                                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "int32"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "annotation"),
+                          Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "description"))})) (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "literal"),
+                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "new"))}}))}}))))}]}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unset description #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "desc"))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "integer"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "int64"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "integer"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "int64"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 137)))}}))}}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unset description #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.setTermDescription")),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "to be removed"))))})),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "literal"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "string"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "layered annotations",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get annotation from unannotated term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "literal"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "integer"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "int32"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get annotation from singly annotated term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "annotated"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "body"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "annotation"),
+                            Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "integer"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "int32"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get inner annotation from doubly annotated term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "annotated"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "body"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "annotated"),
+                                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                  Core.recordFields = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "body"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "annotation"),
+                                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "annotation"),
+                            Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))})) (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))}]}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "integer"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "int32"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get outer annotation from doubly annotated term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))}))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "annotated"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "body"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "annotated"),
+                                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                  Core.recordFields = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "body"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "annotation"),
+                                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "annotation"),
+                            Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))})) (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))}]}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "integer"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "int32"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get non-overridden annotation from triply annotated term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))}))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "annotated"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "body"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "annotated"),
+                                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                  Core.recordFields = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "body"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "annotated"),
+                                          Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "body"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "literal"),
+                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                      Core.injectionField = Core.Field {
+                                                        Core.fieldName = (Core.Name "integer"),
+                                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                          Core.injectionField = Core.Field {
+                                                            Core.fieldName = (Core.Name "int32"),
+                                                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "annotation"),
+                                                Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "literal"),
+                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                      Core.injectionField = Core.Field {
+                                                        Core.fieldName = (Core.Name "integer"),
+                                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                          Core.injectionField = Core.Field {
+                                                            Core.fieldName = (Core.Name "int32"),
+                                                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))},
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "annotation"),
+                                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))})) (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))}]}))}}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "annotation"),
+                            Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))))}]}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "integer"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "int32"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "outer annotation overrides inner in layered term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.annotations.getTermAnnotation")),
+                    Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                      Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                      Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))}))})),
+                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "annotated"),
+                      Core.fieldTerm = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "body"),
+                            Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "annotated"),
+                                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                  Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                  Core.recordFields = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "body"),
+                                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "annotated"),
+                                          Core.fieldTerm = (Core.TermRecord (Core.Record {
+                                            Core.recordTypeName = (Core.Name "hydra.core.AnnotatedTerm"),
+                                            Core.recordFields = [
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "body"),
+                                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "literal"),
+                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                      Core.injectionField = Core.Field {
+                                                        Core.fieldName = (Core.Name "integer"),
+                                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                          Core.injectionField = Core.Field {
+                                                            Core.fieldName = (Core.Name "int32"),
+                                                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))}}))}}))},
+                                              Core.Field {
+                                                Core.fieldName = (Core.Name "annotation"),
+                                                Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "literal"),
+                                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                                      Core.injectionField = Core.Field {
+                                                        Core.fieldName = (Core.Name "integer"),
+                                                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                          Core.injectionField = Core.Field {
+                                                            Core.fieldName = (Core.Name "int32"),
+                                                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}))}}))}}))))}]}))}}))},
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "annotation"),
+                                      Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                                        Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                        Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "two"))})) (Core.TermUnion (Core.Injection {
+                                        Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                                        Core.injectionField = Core.Field {
+                                          Core.fieldName = (Core.Name "literal"),
+                                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                            Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                            Core.injectionField = Core.Field {
+                                              Core.fieldName = (Core.Name "integer"),
+                                              Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                                Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                                Core.injectionField = Core.Field {
+                                                  Core.fieldName = (Core.Name "int32"),
+                                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}}))}}))}}))))}]}))}}))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "annotation"),
+                            Core.fieldTerm = (Core.TermMap (Maps.singleton (Core.TermWrap (Core.WrappedTerm {
+                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "one"))})) (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "literal"),
+                                Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                  Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                                  Core.injectionField = Core.Field {
+                                    Core.fieldName = (Core.Name "integer"),
+                                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                                      Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                                      Core.injectionField = Core.Field {
+                                        Core.fieldName = (Core.Name "int32"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))))}]}))}}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.core.Term"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "literal"),
+                    Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = (Core.Name "hydra.core.Literal"),
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "integer"),
+                        Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                          Core.injectionTypeName = (Core.Name "hydra.core.IntegerValue"),
+                          Core.injectionField = Core.Field {
+                            Core.fieldName = (Core.Name "int32"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))}}))}}))}}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Checking/Advanced.hs b/src/gen-test/haskell/Hydra/Test/Checking/Advanced.hs
--- a/src/gen-test/haskell/Hydra/Test/Checking/Advanced.hs
+++ b/src/gen-test/haskell/Hydra/Test/Checking/Advanced.hs
@@ -16,507 +16,336 @@
 
 -- | Advanced type checking test cases
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Advanced",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    annotatedTermsTests,
-    flowsTests],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Advanced",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        annotatedTermsTests],
+      Testing.testGroupCases = []}
 
 annotatedTermsTests :: Testing.TestGroup
-annotatedTermsTests = Testing.TestGroup {
-  Testing.testGroupName = "Annotated terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    topLevelAnnotationsTests,
-    nestedAnnotationsTests,
-    annotationsInComplexContextsTests],
-  Testing.testGroupCases = []}
+annotatedTermsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Annotated terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        topLevelAnnotationsTests,
+        nestedAnnotationsTests,
+        annotationsInComplexContextsTests],
+      Testing.testGroupCases = []}
 
-topLevelAnnotationsTests :: Testing.TestGroup
-topLevelAnnotationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Top-level annotations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated literal",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "a"),
-            (Core.TermLiteral (Core.LiteralString "b"))]),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "a"),
-            (Core.TermLiteral (Core.LiteralString "b"))]),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t0"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
+annotationsInComplexContextsTests :: Testing.TestGroup
+annotationsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Annotations in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                    Core.annotatedTermAnnotation = M.empty})),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "world")),
+                    Core.annotatedTermAnnotation = M.empty})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                Core.annotatedTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                Core.annotatedTermAnnotation = M.empty}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                    Core.annotatedTermAnnotation = M.empty})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "world")),
+                    Core.annotatedTermAnnotation = M.empty})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                Core.annotatedTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.annotatedTermAnnotation = M.empty}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated record fields",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "Alice")),
+                    Core.annotatedTermAnnotation = M.empty}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "Smith")),
+                    Core.annotatedTermAnnotation = M.empty}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30))),
+                    Core.annotatedTermAnnotation = M.empty}))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "Alice")),
+                    Core.annotatedTermAnnotation = M.empty}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "Smith")),
+                    Core.annotatedTermAnnotation = M.empty}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30))),
+                    Core.annotatedTermAnnotation = M.empty}))}]})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated function in application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "add"),
+                  Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.annotatedTermAnnotation = M.empty})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "add")),
+                  Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
+                    Core.annotatedTermAnnotation = M.empty}))})),
+                Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
+                  Core.annotatedTermAnnotation = M.empty}))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "add"),
+                  Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.annotatedTermAnnotation = M.empty})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "add")),
+                  Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
+                    Core.annotatedTermAnnotation = M.empty}))})),
+                Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
+                  Core.annotatedTermAnnotation = M.empty}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
 
 nestedAnnotationsTests :: Testing.TestGroup
-nestedAnnotationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested annotations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotation within annotation",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100))),
-            Core.annotatedTermAnnotation = M.empty})),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100))),
-            Core.annotatedTermAnnotation = M.empty})),
-          Core.annotatedTermAnnotation = M.empty})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated terms in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-          Core.annotatedTermAnnotation = M.empty}), (Core.TermAnnotated (Core.AnnotatedTerm {
-          Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "hello")),
-          Core.annotatedTermAnnotation = M.empty})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermAnnotated (Core.AnnotatedTerm {
+nestedAnnotationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested annotations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotation within annotation",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100))),
+                Core.annotatedTermAnnotation = M.empty})),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100))),
+                Core.annotatedTermAnnotation = M.empty})),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated terms in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermAnnotated (Core.AnnotatedTerm {
               Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
               Core.annotatedTermAnnotation = M.empty}), (Core.TermAnnotated (Core.AnnotatedTerm {
               Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "hello")),
               Core.annotatedTermAnnotation = M.empty})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated term in function application",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-            Core.annotatedTermAnnotation = M.empty})),
-          Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Core.annotatedTermAnnotation = M.empty}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-            Core.annotatedTermAnnotation = M.empty})),
-          Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Core.annotatedTermAnnotation = M.empty}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-annotationsInComplexContextsTests :: Testing.TestGroup
-annotationsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Annotations in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                Core.annotatedTermAnnotation = M.empty})),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "world")),
-                Core.annotatedTermAnnotation = M.empty})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
-            Core.annotatedTermAnnotation = M.empty}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                Core.annotatedTermAnnotation = M.empty})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "world")),
-                Core.annotatedTermAnnotation = M.empty})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-            Core.annotatedTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
               Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.annotatedTermAnnotation = M.empty}), (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "hello")),
+                  Core.annotatedTermAnnotation = M.empty})))),
                 Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
               Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.annotatedTermAnnotation = M.empty}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated record fields",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "Alice")),
-                Core.annotatedTermAnnotation = M.empty}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "Smith")),
-                Core.annotatedTermAnnotation = M.empty}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30))),
-                Core.annotatedTermAnnotation = M.empty}))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "Alice")),
-                Core.annotatedTermAnnotation = M.empty}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "Smith")),
-                Core.annotatedTermAnnotation = M.empty}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30))),
-                Core.annotatedTermAnnotation = M.empty}))}]})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "annotated function in application",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "add"),
-              Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated term in function application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermAnnotated (Core.AnnotatedTerm {
+                Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
                 Core.annotatedTermAnnotation = M.empty})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "add")),
               Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
+                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
                 Core.annotatedTermAnnotation = M.empty}))})),
-            Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
-              Core.annotatedTermAnnotation = M.empty}))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "add"),
-              Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermAnnotated (Core.AnnotatedTerm {
+                Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
                 Core.annotatedTermAnnotation = M.empty})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "add")),
               Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
+                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
                 Core.annotatedTermAnnotation = M.empty}))})),
-            Core.applicationArgument = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
-              Core.annotatedTermAnnotation = M.empty}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-flowsTests :: Testing.TestGroup
-flowsTests = Testing.TestGroup {
-  Testing.testGroupName = "Flows",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    flowsWithFailureAcrossLetBindingsTests],
-  Testing.testGroupCases = []}
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
 
-flowsWithFailureAcrossLetBindingsTests :: Testing.TestGroup
-flowsWithFailureAcrossLetBindingsTests = Testing.TestGroup {
-  Testing.testGroupName = "Flows with failure across let bindings",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "mutually referential failure functions with Flow monad",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "conditionalUnexpected"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "s"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "b"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "ignored"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "unexpected")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "oops"))}))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "unexpected")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))})))})))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "unexpected"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "s"),
+topLevelAnnotationsTests :: Testing.TestGroup
+topLevelAnnotationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Top-level annotations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated literal",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "a"),
+                (Core.TermLiteral (Core.LiteralString "b"))]),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "a"),
+                (Core.TermLiteral (Core.LiteralString "b"))]),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "annotated lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
                 Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.fail"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "conditionalUnexpected"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t2"),
-              Core.typeLambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "conditionalUnexpected"),
-                    Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t3"),
-                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "t4"),
-                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                          Core.typeLambdaParameter = (Core.Name "t5"),
-                          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "s"),
-                            Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "b"),
-                              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
-                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "ignored"),
-                                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t3"))),
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                                        Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Flow")),
-                                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))})),
-                                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t5"))}))})),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "unexpected")),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t4"))})),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t5"))})),
-                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "oops"))}))})),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "unexpected")),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t4"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t5"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))})))})))})))}))}))})),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [
-                        Core.Name "t3",
-                        (Core.Name "t4"),
-                        (Core.Name "t5")],
-                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t3")),
-                            Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Flow")),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))})),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t5"))}))}))}))})),
-                      Core.typeSchemeConstraints = Nothing}))},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "unexpected"),
-                    Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t3"),
-                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "t4"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.fail"))),
-                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
-                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t4"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}))})),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [
-                        Core.Name "t3",
-                        (Core.Name "t4")],
-                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Flow")),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))})),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))}))})),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "conditionalUnexpected")),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))}))}))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "t2"),
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+              Core.annotatedTermBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t0"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+              Core.annotatedTermAnnotation = M.empty})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
               Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                    Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Flow")),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))}))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForPython"]}]}
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
diff --git a/src/gen-test/haskell/Hydra/Test/Checking/AlgebraicTypes.hs b/src/gen-test/haskell/Hydra/Test/Checking/AlgebraicTypes.hs
--- a/src/gen-test/haskell/Hydra/Test/Checking/AlgebraicTypes.hs
+++ b/src/gen-test/haskell/Hydra/Test/Checking/AlgebraicTypes.hs
@@ -15,1308 +15,1331 @@
 import qualified Data.Set as S
 
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Algebraic types",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    unitTests,
-    pairsTests,
-    eithersTests,
-    optionalsTests],
-  Testing.testGroupCases = []}
-
-unitTests :: Testing.TestGroup
-unitTests = Testing.TestGroup {
-  Testing.testGroupName = "Unit",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    unitTermTests,
-    unitTermInPolymorphicContextTests],
-  Testing.testGroupCases = []}
-
-unitTermTests :: Testing.TestGroup
-unitTermTests = Testing.TestGroup {
-  Testing.testGroupName = "Unit term",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unit literal",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = Core.TermUnit,
-        Testing.typeCheckingTestCaseOutputTerm = Core.TermUnit,
-        Testing.typeCheckingTestCaseOutputType = Core.TypeUnit})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unitTermInPolymorphicContextTests :: Testing.TestGroup
-unitTermInPolymorphicContextTests = Testing.TestGroup {
-  Testing.testGroupName = "Unit term in polymorphic context",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unit from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = Core.TermUnit}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = Core.TermUnit})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = Core.TypeUnit}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-pairsTests :: Testing.TestGroup
-pairsTests = Testing.TestGroup {
-  Testing.testGroupName = "Pairs",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    basicPairsTests,
-    polymorphicPairsTests,
-    pairsInComplexContextsTests,
-    nestedPairsTests,
-    pairsWithComplexTypesTests],
-  Testing.testGroupCases = []}
-
-basicPairsTests :: Testing.TestGroup
-basicPairsTests = Testing.TestGroup {
-  Testing.testGroupName = "Basic pairs",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair of int and string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello")))),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair of string and boolean",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "test"), (Core.TermLiteral (Core.LiteralBoolean True)))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "test"), (Core.TermLiteral (Core.LiteralBoolean True)))),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair of boolean and int",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean False), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean False), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100))))),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
-          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicPairsTests :: Testing.TestGroup
-polymorphicPairsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic pairs",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair from lambda (first element)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralString "constant"))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralString "constant")))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair from lambda (second element)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "constant"), (Core.TermVariable (Core.Name "x"))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "constant"), (Core.TermVariable (Core.Name "x")))),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair from two lambdas",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair with repeated variable",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x"))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x")))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-pairsInComplexContextsTests :: Testing.TestGroup
-pairsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Pairs in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one"))),
-          (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "two"))))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "two")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "result"),
-              Core.bindingTerm = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "answer")))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "result"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "result"),
-              Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "answer")))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "result"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedPairsTests :: Testing.TestGroup
-nestedPairsTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested pairs",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair of pairs",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one"))), (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one")))),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))),
-            Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair with list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermLiteral (Core.LiteralString "numbers")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermLiteral (Core.LiteralString "numbers")))),
-            Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "list of pairs",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-          (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-pairsWithComplexTypesTests :: Testing.TestGroup
-pairsWithComplexTypesTests = Testing.TestGroup {
-  Testing.testGroupName = "Pairs with complex types",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair with record on first",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "Person"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Person"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "Person"))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "Person")),
-          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair with record on second",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "name"), (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "Person"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "name"), (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Person"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "Person"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "Person"))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-eithersTests :: Testing.TestGroup
-eithersTests = Testing.TestGroup {
-  Testing.testGroupName = "Eithers",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    leftValuesTests,
-    rightValuesTests,
-    polymorphicEithersTests,
-    eithersInComplexContextsTests,
-    nestedEithersTests,
-    eithersWithComplexTypesTests],
-  Testing.testGroupCases = []}
-
-leftValuesTests :: Testing.TestGroup
-leftValuesTests = Testing.TestGroup {
-  Testing.testGroupName = "Left values",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "left int",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "left string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "left boolean",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralBoolean False)))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralBoolean False)))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-rightValuesTests :: Testing.TestGroup
-rightValuesTests = Testing.TestGroup {
-  Testing.testGroupName = "Right values",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "right int",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-            Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "right string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "success")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "success")))),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-            Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "right boolean",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-            Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicEithersTests :: Testing.TestGroup
-polymorphicEithersTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic eithers",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "left from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "x"))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "x")))),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "right from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "x"))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "x")))),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t1")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either from two lambdas",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "flag"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))})),
-                Core.applicationArgument = (Core.TermEither (Left (Core.TermVariable (Core.Name "x"))))})),
-              Core.applicationArgument = (Core.TermEither (Right (Core.TermVariable (Core.Name "x"))))}))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "flag"),
-            Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.typeApplicationTermType = (Core.TypeEither (Core.EitherType {
-                        Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-                        Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))})),
-                  Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "x")))),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-                Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "x")))),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-eithersInComplexContextsTests :: Testing.TestGroup
-eithersInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Eithers in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))),
-          (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeEither (Core.EitherType {
-          Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "result"),
-              Core.bindingTerm = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "result"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "result"),
-                Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [
-                    Core.Name "t1"],
-                  Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
-                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t1")),
-                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "result")),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-            Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedEithersTests :: Testing.TestGroup
-nestedEithersTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested eithers",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either of either (left left)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})))),
-                Core.typeApplicationTermType = (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either of either (left right)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "nested")))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "nested")))),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})))),
-                Core.typeApplicationTermType = (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-                  Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-                Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either of either (right)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-            Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either of list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))),
-              Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "list of eithers",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "a"))),
-          (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
-          (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "b"))))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "a")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "b")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeEither (Core.EitherType {
-          Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-eithersWithComplexTypesTests :: Testing.TestGroup
-eithersWithComplexTypesTests = Testing.TestGroup {
-  Testing.testGroupName = "Eithers with complex types",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either with record on left",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypePersonName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "firstName"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lastName"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "age"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})))),
-              Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeVariable TestTypes.testTypePersonName),
-            Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either with record on right",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypePersonName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "firstName"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lastName"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "age"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypePersonName)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
-            Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-            Core.eitherTypeRight = (Core.TypeVariable TestTypes.testTypePersonName)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-optionalsTests :: Testing.TestGroup
-optionalsTests = Testing.TestGroup {
-  Testing.testGroupName = "Optionals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    monomorphicOptionalsTests,
-    polymorphicOptionalsTests,
-    optionalsInComplexContextsTests,
-    nestedOptionalsTests,
-    optionalsWithComplexTypesTests],
-  Testing.testGroupCases = []}
-
-monomorphicOptionalsTests :: Testing.TestGroup
-monomorphicOptionalsTests = Testing.TestGroup {
-  Testing.testGroupName = "Monomorphic optionals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nothing",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMaybe Nothing),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "just int",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "just string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello")))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "just boolean",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralBoolean True)))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralBoolean True)))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeBoolean))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicOptionalsTests :: Testing.TestGroup
-polymorphicOptionalsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic optionals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "optional from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nothing from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermMaybe Nothing)}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "conditional optional",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "flag"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))})),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})),
-              Core.applicationArgument = (Core.TermMaybe Nothing)}))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "flag"),
-              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))})),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})),
-                Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-              Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-optionalsInComplexContextsTests :: Testing.TestGroup
-optionalsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Optionals in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "optional in record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypeBuddyListAName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "head"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "tail"),
-              Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeBuddyListBName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "second"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypeBuddyListAName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "head"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "tail"),
-                Core.fieldTerm = (Core.TermMaybe (Just (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = TestTypes.testTypeBuddyListBName,
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "head"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "second"))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "tail"),
-                        Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                          Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-                            Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))}]})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))))}]})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "optional in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "maybeValue"),
-              Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "maybeValue"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "maybeValue"),
-              Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "maybeValue"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedOptionalsTests :: Testing.TestGroup
-nestedOptionalsTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested optionals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "optional of optional",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "nested")))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "nested")))))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "optional of list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "list of optionals",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "a"))),
-          (Core.TermMaybe Nothing),
-          (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "b"))))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "a"))),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-          (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "b"))))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-optionalsWithComplexTypesTests :: Testing.TestGroup
-optionalsWithComplexTypesTests = Testing.TestGroup {
-  Testing.testGroupName = "Optionals with complex types",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "optional map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Algebraic types",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        unitTests,
+        pairsTests,
+        eithersTests,
+        optionalsTests],
+      Testing.testGroupCases = []}
+
+basicPairsTests :: Testing.TestGroup
+basicPairsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Basic pairs",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair of int and string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello")))),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair of string and boolean",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "test"), (Core.TermLiteral (Core.LiteralBoolean True)))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "test"), (Core.TermLiteral (Core.LiteralBoolean True)))),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair of boolean and int",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean False), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean False), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100))))),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
+              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+eithersInComplexContextsTests :: Testing.TestGroup
+eithersInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Eithers in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))),
+              (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeEither (Core.EitherType {
+              Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "result"),
+                  Core.bindingTerm = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "result"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "result"),
+                    Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [
+                        Core.Name "t1"],
+                      Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
+                        Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t1")),
+                        Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "result")),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+eithersTests :: Testing.TestGroup
+eithersTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Eithers",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        leftValuesTests,
+        rightValuesTests,
+        polymorphicEithersTests,
+        eithersInComplexContextsTests,
+        nestedEithersTests,
+        eithersWithComplexTypesTests],
+      Testing.testGroupCases = []}
+
+eithersWithComplexTypesTests :: Testing.TestGroup
+eithersWithComplexTypesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Eithers with complex types",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either with record on left",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypePersonName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "firstName"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lastName"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "age"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})))),
+                  Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeVariable TestTypes.testTypePersonName),
+                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either with record on right",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypePersonName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "firstName"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lastName"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "age"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypePersonName)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                Core.eitherTypeRight = (Core.TypeVariable TestTypes.testTypePersonName)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+leftValuesTests :: Testing.TestGroup
+leftValuesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Left values",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "left int",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "left string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "left boolean",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralBoolean False)))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralBoolean False)))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+monomorphicOptionalsTests :: Testing.TestGroup
+monomorphicOptionalsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Monomorphic optionals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nothing",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMaybe Nothing),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "just int",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "just string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello")))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "just boolean",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralBoolean True)))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralBoolean True)))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeBoolean))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedEithersTests :: Testing.TestGroup
+nestedEithersTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested eithers",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either of either (left left)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})))),
+                    Core.typeApplicationTermType = (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either of either (left right)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "nested")))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "nested")))),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})))),
+                    Core.typeApplicationTermType = (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                      Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                    Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either of either (right)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either of list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Left (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))),
+                  Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "list of eithers",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "a"))),
+              (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
+              (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "b"))))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "a")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "b")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeEither (Core.EitherType {
+              Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedOptionalsTests :: Testing.TestGroup
+nestedOptionalsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested optionals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "optional of optional",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "nested")))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "nested")))))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "optional of list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "list of optionals",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "a"))),
+              (Core.TermMaybe Nothing),
+              (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "b"))))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "a"))),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+              (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "b"))))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedPairsTests :: Testing.TestGroup
+nestedPairsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested pairs",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair of pairs",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one"))), (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one")))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))),
+                Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair with list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermLiteral (Core.LiteralString "numbers")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermLiteral (Core.LiteralString "numbers")))),
+                Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "list of pairs",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+optionalsInComplexContextsTests :: Testing.TestGroup
+optionalsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Optionals in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "optional in record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypeBuddyListAName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "head"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "tail"),
+                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeBuddyListBName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "second"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypeBuddyListAName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "head"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "tail"),
+                    Core.fieldTerm = (Core.TermMaybe (Just (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = TestTypes.testTypeBuddyListBName,
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "head"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "second"))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "tail"),
+                            Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                              Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                                Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))}]})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))))}]})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "optional in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "maybeValue"),
+                  Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "maybeValue"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "maybeValue"),
+                  Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "maybeValue"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+optionalsTests :: Testing.TestGroup
+optionalsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Optionals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        monomorphicOptionalsTests,
+        polymorphicOptionalsTests,
+        optionalsInComplexContextsTests,
+        nestedOptionalsTests,
+        optionalsWithComplexTypesTests],
+      Testing.testGroupCases = []}
+
+optionalsWithComplexTypesTests :: Testing.TestGroup
+optionalsWithComplexTypesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Optionals with complex types",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "optional map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+pairsInComplexContextsTests :: Testing.TestGroup
+pairsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Pairs in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one"))),
+              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "two"))))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "two")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "result"),
+                  Core.bindingTerm = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "answer")))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "result"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "result"),
+                  Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "answer")))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "result"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+pairsTests :: Testing.TestGroup
+pairsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Pairs",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        basicPairsTests,
+        polymorphicPairsTests,
+        pairsInComplexContextsTests,
+        nestedPairsTests,
+        pairsWithComplexTypesTests],
+      Testing.testGroupCases = []}
+
+pairsWithComplexTypesTests :: Testing.TestGroup
+pairsWithComplexTypesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Pairs with complex types",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair with record on first",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Person"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Person"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "Person"))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "Person")),
+              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair with record on second",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "name"), (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Person"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "name"), (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Person"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "Person"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "Person"))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicEithersTests :: Testing.TestGroup
+polymorphicEithersTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic eithers",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "left from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "x"))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "x")))),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "right from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "x"))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "x")))),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t1")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either from two lambdas",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "flag"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))})),
+                    Core.applicationArgument = (Core.TermEither (Left (Core.TermVariable (Core.Name "x"))))})),
+                  Core.applicationArgument = (Core.TermEither (Right (Core.TermVariable (Core.Name "x"))))}))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "flag"),
+                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.typeApplicationTermType = (Core.TypeEither (Core.EitherType {
+                            Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                            Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))})),
+                      Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "x")))),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+                    Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "x")))),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicOptionalsTests :: Testing.TestGroup
+polymorphicOptionalsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic optionals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "optional from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nothing from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermMaybe Nothing)}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "conditional optional",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "flag"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))})),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)}))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "flag"),
+                  Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))})),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})),
+                    Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                  Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicPairsTests :: Testing.TestGroup
+polymorphicPairsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic pairs",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair from lambda (first element)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralString "constant"))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralString "constant")))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair from lambda (second element)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "constant"), (Core.TermVariable (Core.Name "x"))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "constant"), (Core.TermVariable (Core.Name "x")))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair from two lambdas",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair with repeated variable",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x"))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x")))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+rightValuesTests :: Testing.TestGroup
+rightValuesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Right values",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "right int",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "right string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "success")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "success")))),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "right boolean",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeEither (Core.EitherType {
+                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unitTermInPolymorphicContextTests :: Testing.TestGroup
+unitTermInPolymorphicContextTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unit term in polymorphic context",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unit from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = Core.TermUnit}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = Core.TermUnit})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = Core.TypeUnit}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unitTermTests :: Testing.TestGroup
+unitTermTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unit term",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unit literal",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = Core.TermUnit,
+            Testing.typeCheckingTestCaseOutputTerm = Core.TermUnit,
+            Testing.typeCheckingTestCaseOutputType = Core.TypeUnit})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unitTests :: Testing.TestGroup
+unitTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unit",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        unitTermTests,
+        unitTermInPolymorphicContextTests],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Checking/All.hs b/src/gen-test/haskell/Hydra/Test/Checking/All.hs
--- a/src/gen-test/haskell/Hydra/Test/Checking/All.hs
+++ b/src/gen-test/haskell/Hydra/Test/Checking/All.hs
@@ -20,14 +20,15 @@
 
 -- | The group of all type checking tests
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "checking",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Advanced.allTests,
-    AlgebraicTypes.allTests,
-    Collections.allTests,
-    Failures.allTests,
-    Fundamentals.allTests,
-    NominalTypes.allTests],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "checking",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Advanced.allTests,
+        AlgebraicTypes.allTests,
+        Collections.allTests,
+        Failures.allTests,
+        Fundamentals.allTests,
+        NominalTypes.allTests],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Checking/Collections.hs b/src/gen-test/haskell/Hydra/Test/Checking/Collections.hs
--- a/src/gen-test/haskell/Hydra/Test/Checking/Collections.hs
+++ b/src/gen-test/haskell/Hydra/Test/Checking/Collections.hs
@@ -15,1014 +15,1032 @@
 import qualified Data.Set as S
 
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Collections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    listsTests,
-    setsTests,
-    mapsTests],
-  Testing.testGroupCases = []}
-
-listsTests :: Testing.TestGroup
-listsTests = Testing.TestGroup {
-  Testing.testGroupName = "Lists",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    listsOfLiteralsTests,
-    emptyListsTests,
-    polymorphicListsTests,
-    nestedListsTests,
-    listsInComplexContextsTests],
-  Testing.testGroupCases = []}
-
-listsOfLiteralsTests :: Testing.TestGroup
-listsOfLiteralsTests = Testing.TestGroup {
-  Testing.testGroupName = "Lists of literals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "int list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "string list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermLiteral (Core.LiteralString "hello"),
-          (Core.TermLiteral (Core.LiteralString "world"))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermLiteral (Core.LiteralString "hello"),
-          (Core.TermLiteral (Core.LiteralString "world"))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "single element list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "mixed numeric types",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0)),
-          (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5))),
-          (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0)),
-          (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5))),
-          (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-emptyListsTests :: Testing.TestGroup
-emptyListsTests = Testing.TestGroup {
-  Testing.testGroupName = "Empty lists",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList []),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermList []),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "pair of empty lists",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermList []))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermList []),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermList []),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})))),
-                Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-              Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty list in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermLiteral (Core.LiteralString "context")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermList []),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}), (Core.TermLiteral (Core.LiteralString "context")))),
-              Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-            Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicListsTests :: Testing.TestGroup
-polymorphicListsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic lists",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "list from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermList [
-            Core.TermVariable (Core.Name "x")])}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermList [
-              Core.TermVariable (Core.Name "x")])})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "list with repeated var",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermList [
-            Core.TermVariable (Core.Name "x"),
-            (Core.TermVariable (Core.Name "x"))])}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermList [
-              Core.TermVariable (Core.Name "x"),
-              (Core.TermVariable (Core.Name "x"))])})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "list from two lambdas",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermList [
-              Core.TermVariable (Core.Name "x"),
-              (Core.TermVariable (Core.Name "y"))])})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermVariable (Core.Name "y"))])})))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedListsTests :: Testing.TestGroup
-nestedListsTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested lists",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "list of lists",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermList [
-            Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
-          (Core.TermList [
-            Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-            (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermList [
-            Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
-          (Core.TermList [
-            Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-            (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty nested lists",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermList [],
-          (Core.TermList [])]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermList [
-            Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermList []),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}),
-            (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermList []),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))])})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0"))))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nested polymorphic",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermList [
-            Core.TermList [
-              Core.TermVariable (Core.Name "x")]])}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermList [
-              Core.TermList [
-                Core.TermVariable (Core.Name "x")]])})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0"))))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-listsInComplexContextsTests :: Testing.TestGroup
-listsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Lists in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "multiple lists in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [
-          Core.TermLiteral (Core.LiteralString "a"),
-          (Core.TermLiteral (Core.LiteralString "b"))]))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))]))),
-            Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-          Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-mapsTests :: Testing.TestGroup
-mapsTests = Testing.TestGroup {
-  Testing.testGroupName = "Maps",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    monomorphicMapsTests,
-    polymorphicMapsTests,
-    mapsInComplexContextsTests,
-    mapsWithComplexTypesTests],
-  Testing.testGroupCases = []}
-
-monomorphicMapsTests :: Testing.TestGroup
-monomorphicMapsTests = Testing.TestGroup {
-  Testing.testGroupName = "Monomorphic maps",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMap M.empty),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermMap M.empty),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "int to string map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one"))),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "two")))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one"))),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "two")))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "string to int map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-          (Core.TermLiteral (Core.LiteralString "b"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-          (Core.TermLiteral (Core.LiteralString "b"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "single entry map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)), (Core.TermLiteral (Core.LiteralBoolean True)))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)), (Core.TermLiteral (Core.LiteralBoolean True)))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint)),
-          Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicMapsTests :: Testing.TestGroup
-polymorphicMapsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic maps",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map from lambda keys",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "k"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermMap (M.fromList [
-            (Core.TermVariable (Core.Name "k"), (Core.TermLiteral (Core.LiteralString "value")))]))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "k"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermMap (M.fromList [
-              (Core.TermVariable (Core.Name "k"), (Core.TermLiteral (Core.LiteralString "value")))]))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-              Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map from lambda values",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "v"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermMap (M.fromList [
-            (Core.TermLiteral (Core.LiteralString "key"), (Core.TermVariable (Core.Name "v")))]))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "v"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralString "key"), (Core.TermVariable (Core.Name "v")))]))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map from lambda both",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "k"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "v"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermMap (M.fromList [
-              (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "k"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "v"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermMap (M.fromList [
-                  (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map with repeated variables",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermMap (M.fromList [
-            (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x")))]))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermMap (M.fromList [
-              (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x")))]))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-mapsInComplexContextsTests :: Testing.TestGroup
-mapsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Maps in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one")))]), (Core.TermLiteral (Core.LiteralString "context")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one")))]), (Core.TermLiteral (Core.LiteralString "context")))),
-            Core.typeApplicationTermType = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeMap (Core.MapType {
-            Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nested maps",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "outer"), (Core.TermMap (M.fromList [
-            (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralBoolean True)))])))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "outer"), (Core.TermMap (M.fromList [
-            (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralBoolean True)))])))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.mapTypeValues = (Core.TypeMap (Core.MapType {
-            Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "lookup"),
-              Core.bindingTerm = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralString "key1"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))),
-                (Core.TermLiteral (Core.LiteralString "key2"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200))))])),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "lookup"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "lookup"),
-              Core.bindingTerm = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralString "key1"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))),
-                (Core.TermLiteral (Core.LiteralString "key2"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200))))])),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "lookup"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-mapsWithComplexTypesTests :: Testing.TestGroup
-mapsWithComplexTypesTests = Testing.TestGroup {
-  Testing.testGroupName = "Maps with complex types",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map of records",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "person1"), (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "person1"), (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.mapTypeValues = (Core.TypeVariable TestTypes.testTypePersonName)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map of lists",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "a"),
-            (Core.TermLiteral (Core.LiteralString "b"))])),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "c"),
-            (Core.TermLiteral (Core.LiteralString "d"))]))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "a"),
-            (Core.TermLiteral (Core.LiteralString "b"))])),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "c"),
-            (Core.TermLiteral (Core.LiteralString "d"))]))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.mapTypeValues = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map of tuples",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "coords"), (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))))))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "coords"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.mapTypeValues = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-setsTests :: Testing.TestGroup
-setsTests = Testing.TestGroup {
-  Testing.testGroupName = "Sets",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    monomorphicSetsTests,
-    polymorphicSetsTests,
-    setsInComplexContextsTests,
-    nestedSetsTests,
-    setsWithComplexTypesTests],
-  Testing.testGroupCases = []}
-
-monomorphicSetsTests :: Testing.TestGroup
-monomorphicSetsTests = Testing.TestGroup {
-  Testing.testGroupName = "Monomorphic sets",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty set",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet S.empty),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermSet S.empty),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "int set",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "string set",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermLiteral (Core.LiteralString "apple"),
-          (Core.TermLiteral (Core.LiteralString "banana")),
-          (Core.TermLiteral (Core.LiteralString "cherry"))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermLiteral (Core.LiteralString "apple"),
-          (Core.TermLiteral (Core.LiteralString "banana")),
-          (Core.TermLiteral (Core.LiteralString "cherry"))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "single element set",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermLiteral (Core.LiteralBoolean True)])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermLiteral (Core.LiteralBoolean True)])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeBoolean))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicSetsTests :: Testing.TestGroup
-polymorphicSetsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic sets",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermSet (S.fromList [
-            Core.TermVariable (Core.Name "x")]))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermSet (S.fromList [
-              Core.TermVariable (Core.Name "x")]))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set with repeated variable",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermSet (S.fromList [
-            Core.TermVariable (Core.Name "x")]))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermSet (S.fromList [
-              Core.TermVariable (Core.Name "x")]))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set from two variables",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermSet (S.fromList [
-              Core.TermVariable (Core.Name "x"),
-              (Core.TermVariable (Core.Name "y"))]))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermSet (S.fromList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermVariable (Core.Name "y"))]))})))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-setsInComplexContextsTests :: Testing.TestGroup
-setsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Sets in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermSet (S.fromList [
-          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]), (Core.TermLiteral (Core.LiteralString "context")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]), (Core.TermLiteral (Core.LiteralString "context")))),
-            Core.typeApplicationTermType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "numbers"),
-              Core.bindingTerm = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))])),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "numbers"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "numbers"),
-              Core.bindingTerm = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))])),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "numbers"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedSetsTests :: Testing.TestGroup
-nestedSetsTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested sets",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set of lists",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermList [
-            Core.TermLiteral (Core.LiteralString "a"),
-            (Core.TermLiteral (Core.LiteralString "b"))],
-          (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "c"),
-            (Core.TermLiteral (Core.LiteralString "d"))])])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermList [
-            Core.TermLiteral (Core.LiteralString "a"),
-            (Core.TermLiteral (Core.LiteralString "b"))],
-          (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "c"),
-            (Core.TermLiteral (Core.LiteralString "d"))])])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set of tuples",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))),
-          (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))))])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set of sets",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermSet (S.fromList [
-            Core.TermLiteral (Core.LiteralString "nested")])])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermSet (S.fromList [
-            Core.TermLiteral (Core.LiteralString "nested")])])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-setsWithComplexTypesTests :: Testing.TestGroup
-setsWithComplexTypesTests = Testing.TestGroup {
-  Testing.testGroupName = "Sets with complex types",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set of records",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeVariable TestTypes.testTypePersonName))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set of optionals",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))),
-          (Core.TermMaybe Nothing)])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "set of maps",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermMap (M.fromList [
-            (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])])),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
-          Core.TermMap (M.fromList [
-            (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])])),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeMap (Core.MapType {
-          Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Collections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        listsTests,
+        setsTests,
+        mapsTests],
+      Testing.testGroupCases = []}
+
+emptyListsTests :: Testing.TestGroup
+emptyListsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Empty lists",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList []),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermList []),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "pair of empty lists",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermList []))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermList []),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermList []),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})))),
+                    Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                  Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty list in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermLiteral (Core.LiteralString "context")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermList []),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}), (Core.TermLiteral (Core.LiteralString "context")))),
+                  Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+listsInComplexContextsTests :: Testing.TestGroup
+listsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Lists in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "multiple lists in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [
+              Core.TermLiteral (Core.LiteralString "a"),
+              (Core.TermLiteral (Core.LiteralString "b"))]))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))]))),
+                Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+              Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+listsOfLiteralsTests :: Testing.TestGroup
+listsOfLiteralsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Lists of literals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "int list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "string list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermLiteral (Core.LiteralString "hello"),
+              (Core.TermLiteral (Core.LiteralString "world"))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermLiteral (Core.LiteralString "hello"),
+              (Core.TermLiteral (Core.LiteralString "world"))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "single element list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "mixed numeric types",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0)),
+              (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5))),
+              (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0)),
+              (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5))),
+              (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+listsTests :: Testing.TestGroup
+listsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Lists",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        listsOfLiteralsTests,
+        emptyListsTests,
+        polymorphicListsTests,
+        nestedListsTests,
+        listsInComplexContextsTests],
+      Testing.testGroupCases = []}
+
+mapsInComplexContextsTests :: Testing.TestGroup
+mapsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Maps in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one")))]), (Core.TermLiteral (Core.LiteralString "context")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one")))]), (Core.TermLiteral (Core.LiteralString "context")))),
+                Core.typeApplicationTermType = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nested maps",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "outer"), (Core.TermMap (M.fromList [
+                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralBoolean True)))])))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "outer"), (Core.TermMap (M.fromList [
+                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralBoolean True)))])))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.mapTypeValues = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "lookup"),
+                  Core.bindingTerm = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralString "key1"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))),
+                    (Core.TermLiteral (Core.LiteralString "key2"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200))))])),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "lookup"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "lookup"),
+                  Core.bindingTerm = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralString "key1"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))),
+                    (Core.TermLiteral (Core.LiteralString "key2"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 200))))])),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "lookup"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+mapsTests :: Testing.TestGroup
+mapsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Maps",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        monomorphicMapsTests,
+        polymorphicMapsTests,
+        mapsInComplexContextsTests,
+        mapsWithComplexTypesTests],
+      Testing.testGroupCases = []}
+
+mapsWithComplexTypesTests :: Testing.TestGroup
+mapsWithComplexTypesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Maps with complex types",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map of records",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "person1"), (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "person1"), (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]})))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.mapTypeValues = (Core.TypeVariable TestTypes.testTypePersonName)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map of lists",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "a"),
+                (Core.TermLiteral (Core.LiteralString "b"))])),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "c"),
+                (Core.TermLiteral (Core.LiteralString "d"))]))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "a"),
+                (Core.TermLiteral (Core.LiteralString "b"))])),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "c"),
+                (Core.TermLiteral (Core.LiteralString "d"))]))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.mapTypeValues = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map of tuples",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "coords"), (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))))))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "coords"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.mapTypeValues = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+monomorphicMapsTests :: Testing.TestGroup
+monomorphicMapsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Monomorphic maps",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMap M.empty),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermMap M.empty),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "int to string map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one"))),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "two")))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "one"))),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "two")))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "string to int map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+              (Core.TermLiteral (Core.LiteralString "b"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+              (Core.TermLiteral (Core.LiteralString "b"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "single entry map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)), (Core.TermLiteral (Core.LiteralBoolean True)))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)), (Core.TermLiteral (Core.LiteralBoolean True)))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint)),
+              Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+monomorphicSetsTests :: Testing.TestGroup
+monomorphicSetsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Monomorphic sets",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty set",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet S.empty),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermSet S.empty),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "int set",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "string set",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermLiteral (Core.LiteralString "apple"),
+              (Core.TermLiteral (Core.LiteralString "banana")),
+              (Core.TermLiteral (Core.LiteralString "cherry"))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermLiteral (Core.LiteralString "apple"),
+              (Core.TermLiteral (Core.LiteralString "banana")),
+              (Core.TermLiteral (Core.LiteralString "cherry"))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "single element set",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermLiteral (Core.LiteralBoolean True)])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermLiteral (Core.LiteralBoolean True)])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeBoolean))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedListsTests :: Testing.TestGroup
+nestedListsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested lists",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "list of lists",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermList [
+                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
+              (Core.TermList [
+                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermList [
+                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
+              (Core.TermList [
+                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty nested lists",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermList [],
+              (Core.TermList [])]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermList [
+                Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermList []),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}),
+                (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermList []),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))])})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0"))))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nested polymorphic",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermList [
+                Core.TermList [
+                  Core.TermVariable (Core.Name "x")]])}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermList [
+                  Core.TermList [
+                    Core.TermVariable (Core.Name "x")]])})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0"))))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedSetsTests :: Testing.TestGroup
+nestedSetsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested sets",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set of lists",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermList [
+                Core.TermLiteral (Core.LiteralString "a"),
+                (Core.TermLiteral (Core.LiteralString "b"))],
+              (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "c"),
+                (Core.TermLiteral (Core.LiteralString "d"))])])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermList [
+                Core.TermLiteral (Core.LiteralString "a"),
+                (Core.TermLiteral (Core.LiteralString "b"))],
+              (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "c"),
+                (Core.TermLiteral (Core.LiteralString "d"))])])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set of tuples",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))),
+              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))))])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set of sets",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermSet (S.fromList [
+                Core.TermLiteral (Core.LiteralString "nested")])])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermSet (S.fromList [
+                Core.TermLiteral (Core.LiteralString "nested")])])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicListsTests :: Testing.TestGroup
+polymorphicListsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic lists",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "list from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermList [
+                Core.TermVariable (Core.Name "x")])}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermList [
+                  Core.TermVariable (Core.Name "x")])})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "list with repeated var",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermList [
+                Core.TermVariable (Core.Name "x"),
+                (Core.TermVariable (Core.Name "x"))])}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermList [
+                  Core.TermVariable (Core.Name "x"),
+                  (Core.TermVariable (Core.Name "x"))])})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "list from two lambdas",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermList [
+                  Core.TermVariable (Core.Name "x"),
+                  (Core.TermVariable (Core.Name "y"))])})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermVariable (Core.Name "y"))])})))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicMapsTests :: Testing.TestGroup
+polymorphicMapsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic maps",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map from lambda keys",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "k"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermMap (M.fromList [
+                (Core.TermVariable (Core.Name "k"), (Core.TermLiteral (Core.LiteralString "value")))]))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "k"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermMap (M.fromList [
+                  (Core.TermVariable (Core.Name "k"), (Core.TermLiteral (Core.LiteralString "value")))]))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                  Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map from lambda values",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "v"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermMap (M.fromList [
+                (Core.TermLiteral (Core.LiteralString "key"), (Core.TermVariable (Core.Name "v")))]))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "v"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralString "key"), (Core.TermVariable (Core.Name "v")))]))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map from lambda both",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "k"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "v"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermMap (M.fromList [
+                  (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "k"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "v"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermMap (M.fromList [
+                      (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map with repeated variables",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermMap (M.fromList [
+                (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x")))]))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermMap (M.fromList [
+                  (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x")))]))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicSetsTests :: Testing.TestGroup
+polymorphicSetsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic sets",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermSet (S.fromList [
+                Core.TermVariable (Core.Name "x")]))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermSet (S.fromList [
+                  Core.TermVariable (Core.Name "x")]))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set with repeated variable",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermSet (S.fromList [
+                Core.TermVariable (Core.Name "x")]))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermSet (S.fromList [
+                  Core.TermVariable (Core.Name "x")]))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set from two variables",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermSet (S.fromList [
+                  Core.TermVariable (Core.Name "x"),
+                  (Core.TermVariable (Core.Name "y"))]))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermSet (S.fromList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermVariable (Core.Name "y"))]))})))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+setsInComplexContextsTests :: Testing.TestGroup
+setsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Sets in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermSet (S.fromList [
+              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]), (Core.TermLiteral (Core.LiteralString "context")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]), (Core.TermLiteral (Core.LiteralString "context")))),
+                Core.typeApplicationTermType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "numbers"),
+                  Core.bindingTerm = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))])),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "numbers"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "numbers"),
+                  Core.bindingTerm = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))])),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "numbers"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+setsTests :: Testing.TestGroup
+setsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Sets",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        monomorphicSetsTests,
+        polymorphicSetsTests,
+        setsInComplexContextsTests,
+        nestedSetsTests,
+        setsWithComplexTypesTests],
+      Testing.testGroupCases = []}
+
+setsWithComplexTypesTests :: Testing.TestGroup
+setsWithComplexTypesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Sets with complex types",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set of records",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeVariable TestTypes.testTypePersonName))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set of optionals",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))),
+              (Core.TermMaybe Nothing)])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "set of maps",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermMap (M.fromList [
+                (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])])),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermSet (S.fromList [
+              Core.TermMap (M.fromList [
+                (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])])),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeSet (Core.TypeMap (Core.MapType {
+              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
diff --git a/src/gen-test/haskell/Hydra/Test/Checking/Failures.hs b/src/gen-test/haskell/Hydra/Test/Checking/Failures.hs
--- a/src/gen-test/haskell/Hydra/Test/Checking/Failures.hs
+++ b/src/gen-test/haskell/Hydra/Test/Checking/Failures.hs
@@ -14,24 +14,27 @@
 
 -- | Type checking failure test cases
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Failures",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    failOnUntypedTests],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Failures",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        failOnUntypedTests],
+      Testing.testGroupCases = []}
 
 failOnUntypedTests :: Testing.TestGroup
-failOnUntypedTests = Testing.TestGroup {
-  Testing.testGroupName = "Fail on untyped (pre-inference) terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    untypedLambdasTests],
-  Testing.testGroupCases = []}
+failOnUntypedTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Fail on untyped (pre-inference) terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        untypedLambdasTests],
+      Testing.testGroupCases = []}
 
 untypedLambdasTests :: Testing.TestGroup
-untypedLambdasTests = Testing.TestGroup {
-  Testing.testGroupName = "Untyped lambdas",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = []}
+untypedLambdasTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Untyped lambdas",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Checking/Fundamentals.hs b/src/gen-test/haskell/Hydra/Test/Checking/Fundamentals.hs
--- a/src/gen-test/haskell/Hydra/Test/Checking/Fundamentals.hs
+++ b/src/gen-test/haskell/Hydra/Test/Checking/Fundamentals.hs
@@ -15,4040 +15,4082 @@
 import qualified Data.Set as S
 
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Fundamentals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    literalsTests,
-    variablesTests,
-    lambdasTests,
-    applicationsTests,
-    letTermsTests,
-    primitivesTests],
-  Testing.testGroupCases = []}
-
-applicationsTests :: Testing.TestGroup
-applicationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Applications",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    simpleFunctionApplicationsTests,
-    partialApplicationsTests,
-    higherOrderApplicationsTests,
-    polymorphicApplicationsTests,
-    applicationsInComplexContextsTests,
-    applicationsWithComplexArgumentsTests],
-  Testing.testGroupCases = []}
-
-simpleFunctionApplicationsTests :: Testing.TestGroup
-simpleFunctionApplicationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Simple function applications",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "identity application",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "primitive application",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "string concatenation",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-partialApplicationsTests :: Testing.TestGroup
-partialApplicationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Partial applications",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "partially applied add",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "partially applied string cat",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "prefix"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "prefix"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-higherOrderApplicationsTests :: Testing.TestGroup
-higherOrderApplicationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Higher-order applications",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "apply function to function",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "apply"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "double"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "apply")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "apply"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0",
-                  (Core.Name "t1")],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "double"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "apply")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "function composition",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "compose"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "g"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "add1"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "mul2"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "compose")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "add1"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "mul2"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "compose"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t2"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "f"),
-                      Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "g"),
-                        Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))})))}))}))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0",
-                  (Core.Name "t1"),
-                  (Core.Name "t2")],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "add1"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "mul2"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "compose")),
-                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "add1"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "mul2"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicApplicationsTests :: Testing.TestGroup
-polymorphicApplicationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic applications",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic identity",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0"],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic const",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "const"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "const")),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keep"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "const"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0",
-                  (Core.Name "t1")],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "const")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keep"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic flip",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "flip"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "flip")),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2")))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "flip"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t2"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "f"),
-                      Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))}))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "y"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})))}))}))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0",
-                  (Core.Name "t1"),
-                  (Core.Name "t2")],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))})),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))}))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "flip")),
-                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2")))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-applicationsInComplexContextsTests :: Testing.TestGroup
-applicationsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Applications in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "application in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}), (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "b"))})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}), (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "b"))})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "application in record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "John"))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ny"))}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "John"))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ny"))}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}]})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "application in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "result"),
-              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "result"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "result"),
-              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "result"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nested applications",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))}))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))}))})),
-          Core.applicationArgument = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-applicationsWithComplexArgumentsTests :: Testing.TestGroup
-applicationsWithComplexArgumentsTests = Testing.TestGroup {
-  Testing.testGroupName = "Applications with complex arguments",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "application with record argument",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "getName"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "person"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = TestTypes.testTypePersonName,
-                    Core.projectionField = (Core.Name "firstName")})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "getName")),
-            Core.applicationArgument = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "getName"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "person"),
-                Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = TestTypes.testTypePersonName,
-                    Core.projectionField = (Core.Name "firstName")})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypePersonName),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "getName")),
-            Core.applicationArgument = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "application with list argument",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "head"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "xs"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "head")),
-            Core.applicationArgument = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "first"),
-              (Core.TermLiteral (Core.LiteralString "second"))])}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "head"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "xs"),
-                  Core.lambdaDomain = (Just (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))})))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0"],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "head")),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.applicationArgument = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "first"),
-              (Core.TermLiteral (Core.LiteralString "second"))])}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-lambdasTests :: Testing.TestGroup
-lambdasTests = Testing.TestGroup {
-  Testing.testGroupName = "Lambdas",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    simpleLambdasTests,
-    multiParameterLambdasTests,
-    lambdasWithOperationsTests,
-    nestedLambdasTests,
-    lambdasInComplexContextsTests,
-    higherOrderLambdasTests],
-  Testing.testGroupCases = []}
-
-simpleLambdasTests :: Testing.TestGroup
-simpleLambdasTests = Testing.TestGroup {
-  Testing.testGroupName = "Simple lambdas",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "identity function",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "constant function",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multiParameterLambdasTests :: Testing.TestGroup
-multiParameterLambdasTests = Testing.TestGroup {
-  Testing.testGroupName = "Multi-parameter lambdas",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "two parameters",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "three parameters",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "z"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t2"),
-              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "z"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})))})))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "t2"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "parameter reuse",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})))),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                  Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-lambdasWithOperationsTests :: Testing.TestGroup
-lambdasWithOperationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Lambdas with operations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda with primitive",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda with application",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "f"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "f"),
-              Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda with construction",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedLambdasTests :: Testing.TestGroup
-nestedLambdasTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested lambdas",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda returning lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "z"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t2"),
-              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "z"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "t2"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda with let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermVariable (Core.Name "y"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "y"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda with inner lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "outer"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "inner"),
-                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "inner")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "outer"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "inner"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t1"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t1"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "inner")),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))}))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-lambdasInComplexContextsTests :: Testing.TestGroup
-lambdasInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Lambdas in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-              Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
-          (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
-          (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda in record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "name"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "name"),
-          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.functionTypeCodomain = (Core.TypeVariable TestTypes.testTypePersonName)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-higherOrderLambdasTests :: Testing.TestGroup
-higherOrderLambdasTests = Testing.TestGroup {
-  Testing.testGroupName = "Higher-order lambdas",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "function composition",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "f"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "g"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t2"),
-              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "g"),
-                  Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))),
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))})))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "t2"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "function application",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "f"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "f"),
-              Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "curried function",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "z"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "z"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})))})))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-letTermsTests :: Testing.TestGroup
-letTermsTests = Testing.TestGroup {
-  Testing.testGroupName = "Let terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    simpleLetBindingsTests,
-    letTermsWithShadowingTests,
-    recursiveBindingsTests,
-    mutualRecursionTests,
-    nestedLetTermsTests,
-    letWithComplexExpressionsTests],
-  Testing.testGroupCases = []}
-
-simpleLetBindingsTests :: Testing.TestGroup
-simpleLetBindingsTests = Testing.TestGroup {
-  Testing.testGroupName = "Simple let bindings",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "single binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "multiple bindings",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-letTermsWithShadowingTests :: Testing.TestGroup
-letTermsWithShadowingTests = Testing.TestGroup {
-  Testing.testGroupName = "Let terms with shadowing",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda parameter shadowing let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "x"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nested lambda shadowing",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [],
-                      Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t1")),
-                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "multiple levels of let shadowing",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "x"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "second")),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralBoolean True)),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "x"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "second")),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralBoolean True)),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "let shadowing with lambda and reference to outer binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "z"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "z"))))}))})))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "x"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.typeSchemeConstraints = Nothing}))},
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "z"),
-                    Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [],
-                      Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "z")))),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recursiveBindingsTests :: Testing.TestGroup
-recursiveBindingsTests = Testing.TestGroup {
-  Testing.testGroupName = "Recursive bindings",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "simple arithmetic recursion",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "double"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "n"))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "double")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "double"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "n"))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "double")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-mutualRecursionTests :: Testing.TestGroup
-mutualRecursionTests = Testing.TestGroup {
-  Testing.testGroupName = "Mutual recursion",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "mutually recursive data",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "listA"),
-              Core.bindingTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeBuddyListAName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "listB"))))}]})),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "listB"),
-              Core.bindingTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeBuddyListBName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermMaybe Nothing)}]})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "listA"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "listA"),
-              Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeBuddyListAName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "head"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "tail"),
-                      Core.fieldTerm = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "listB"))))}]})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "listB"),
-              Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeBuddyListBName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "head"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "tail"),
-                      Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                        Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-                          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}]})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "listA"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "(monomorphic) mutually recursive functions",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "g"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "g"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedLetTermsTests :: Testing.TestGroup
-nestedLetTermsTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested let terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "monomorphic nesting",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "z"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "z"))}))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "z"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "z"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic nesting",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "apply"),
-                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "f"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "apply")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "id"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test"))}))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0"],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "apply"),
-                Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t0"),
-                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t1"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "f"),
-                      Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [
-                    Core.Name "t0",
-                    (Core.Name "t1")],
-                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "apply")),
-                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "variable capture avoidance",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "y"))}))})))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "x"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [],
-                      Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermVariable (Core.Name "y"))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "simple let in lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "z"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermVariable (Core.Name "z")),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermVariable (Core.Name "y"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "z"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "z")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "y"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-letWithComplexExpressionsTests :: Testing.TestGroup
-letWithComplexExpressionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Let with complex expressions",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "let in record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "first"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "John")),
-                    Core.bindingType = Nothing},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "middle"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "Q")),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "first"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "middle"))}))}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "first"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "John")),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [],
-                      Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                      Core.typeSchemeConstraints = Nothing}))},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "middle"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "Q")),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [],
-                      Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "first"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "middle"))}))}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "let in function application",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0"],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "composition",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "compose"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "g"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "add1"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "double"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "compose")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "add1"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "compose"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t2"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "f"),
-                      Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "g"),
-                        Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))})))}))}))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0",
-                  (Core.Name "t1"),
-                  (Core.Name "t2")],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "add1"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "double"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "n"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "compose")),
-                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "add1"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-literalsTests :: Testing.TestGroup
-literalsTests = Testing.TestGroup {
-  Testing.testGroupName = "Literals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    booleanLiteralsTests,
-    stringLiteralsTests,
-    integerLiteralsTests,
-    floatLiteralsTests,
-    literalsInComplexContextsTests],
-  Testing.testGroupCases = []}
-
-booleanLiteralsTests :: Testing.TestGroup
-booleanLiteralsTests = Testing.TestGroup {
-  Testing.testGroupName = "Boolean literals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "true",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean True)),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralBoolean True)),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "false",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean False)),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralBoolean False)),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-stringLiteralsTests :: Testing.TestGroup
-stringLiteralsTests = Testing.TestGroup {
-  Testing.testGroupName = "String literals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "simple string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralString "hello")),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralString "")),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralString "")),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unicode string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralString "caf\233")),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralString "caf\233")),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-integerLiteralsTests :: Testing.TestGroup
-integerLiteralsTests = Testing.TestGroup {
-  Testing.testGroupName = "Integer literals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "bigint",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "int8",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "int16",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 32767))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 32767))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "int32",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2147483647))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2147483647))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "int64",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 9223372036854775807))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 9223372036854775807))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "uint8",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint8))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "uint16",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 65535))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 65535))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint16))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "uint32",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 4294967295))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 4294967295))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "uint64",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 18446744073709551615))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 18446744073709551615))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-floatLiteralsTests :: Testing.TestGroup
-floatLiteralsTests = Testing.TestGroup {
-  Testing.testGroupName = "Float literals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "bigfloat",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeBigfloat))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "float32",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.71828))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.71828))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "float64",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.41421))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.41421))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-literalsInComplexContextsTests :: Testing.TestGroup
-literalsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Literals in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "literals in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermPair (Core.TermLiteral (Core.LiteralString "test"), (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14))))))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "test"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14))))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})))),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-          Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
-          Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "literals in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermLiteral (Core.LiteralString "one"),
-          (Core.TermLiteral (Core.LiteralString "two")),
-          (Core.TermLiteral (Core.LiteralString "three"))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermLiteral (Core.LiteralString "one"),
-          (Core.TermLiteral (Core.LiteralString "two")),
-          (Core.TermLiteral (Core.LiteralString "three"))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-primitivesTests :: Testing.TestGroup
-primitivesTests = Testing.TestGroup {
-  Testing.testGroupName = "Primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    nullaryPrimitivesTests,
-    unaryPrimitivesTests,
-    binaryPrimitivesTests,
-    ternaryPrimitivesTests,
-    monomorphicVsPolymorphicTests,
-    higherOrderPrimitivesTests,
-    primitivesInComplexContextsTests],
-  Testing.testGroupCases = []}
-
-nullaryPrimitivesTests :: Testing.TestGroup
-nullaryPrimitivesTests = Testing.TestGroup {
-  Testing.testGroupName = "Nullary primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty set",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty"))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unaryPrimitivesTests :: Testing.TestGroup
-unaryPrimitivesTests = Testing.TestGroup {
-  Testing.testGroupName = "Unary primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lists head",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "math neg",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "logic not",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-binaryPrimitivesTests :: Testing.TestGroup
-binaryPrimitivesTests = Testing.TestGroup {
-  Testing.testGroupName = "Binary primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "math add",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lists cons",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-              Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "maps insert",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
-                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                    Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                    Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-ternaryPrimitivesTests :: Testing.TestGroup
-ternaryPrimitivesTests = Testing.TestGroup {
-  Testing.testGroupName = "Ternary primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "logic ifElse",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lists foldl",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t1"))),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-monomorphicVsPolymorphicTests :: Testing.TestGroup
-monomorphicVsPolymorphicTests = Testing.TestGroup {
-  Testing.testGroupName = "Monomorphic vs polymorphic",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "monomorphic math",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic identity",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity"))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-higherOrderPrimitivesTests :: Testing.TestGroup
-higherOrderPrimitivesTests = Testing.TestGroup {
-  Testing.testGroupName = "Higher-order primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lists map function",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-          Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lists filter",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-              Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "optionals maybe",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1"))),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-primitivesInComplexContextsTests :: Testing.TestGroup
-primitivesInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Primitives in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "primitive composition",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "double"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "increment"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "increment"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "double"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "increment"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "increment"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nested higher-order",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
-            (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-              Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
-            (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])])})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-variablesTests :: Testing.TestGroup
-variablesTests = Testing.TestGroup {
-  Testing.testGroupName = "Variables",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    simpleVariableLookupTests,
-    variableScopingTests,
-    polymorphicVariablesTests,
-    variablesInComplexContextsTests,
-    recursiveVariablesTests],
-  Testing.testGroupCases = []}
-
-simpleVariableLookupTests :: Testing.TestGroup
-simpleVariableLookupTests = Testing.TestGroup {
-  Testing.testGroupName = "Simple variable lookup",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "int variable",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "variable in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "multiple variables",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "y"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-variableScopingTests :: Testing.TestGroup
-variableScopingTests = Testing.TestGroup {
-  Testing.testGroupName = "Variable scoping",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda parameter",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "let binding scope",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "variable shadowing",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "x"),
-              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "x"),
-                Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [],
-                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nested scoping",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "y"),
-                Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                Core.bindingType = Nothing}],
-            Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "z"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermPair (Core.TermVariable (Core.Name "y"), (Core.TermVariable (Core.Name "z"))))))})))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [],
-                      Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "z"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "y"), (Core.TermVariable (Core.Name "z")))),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})))),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
-                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                  Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicVariablesTests :: Testing.TestGroup
-polymorphicVariablesTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic variables",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic function",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "id"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "id"),
-                Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [
-                    Core.Name "t1"],
-                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic application",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test"))}))))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "id"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0"],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test"))})))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "higher order polymorphic",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "apply"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "apply"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "apply"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t2"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t3"),
-                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "f"),
-                        Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))}))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t2",
-                      (Core.Name "t3")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))})),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "apply")),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-variablesInComplexContextsTests :: Testing.TestGroup
-variablesInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Variables in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "variable in record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "name"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "name"),
-          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypePersonName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.functionTypeCodomain = (Core.TypeVariable TestTypes.testTypePersonName)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "variable in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermList [
-            Core.TermVariable (Core.Name "x"),
-            (Core.TermVariable (Core.Name "x"))])}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermList [
-              Core.TermVariable (Core.Name "x"),
-              (Core.TermVariable (Core.Name "x"))])})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "variable in map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "key"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "value"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermMap (M.fromList [
-              (Core.TermVariable (Core.Name "key"), (Core.TermVariable (Core.Name "value")))]))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "key"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "value"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermMap (M.fromList [
-                  (Core.TermVariable (Core.Name "key"), (Core.TermVariable (Core.Name "value")))]))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "variable in optional",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recursiveVariablesTests :: Testing.TestGroup
-recursiveVariablesTests = Testing.TestGroup {
-  Testing.testGroupName = "Recursive variables",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "simple recursion",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "mutual recursion",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "g"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "g"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Fundamentals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        literalsTests,
+        variablesTests,
+        lambdasTests,
+        applicationsTests,
+        letTermsTests,
+        primitivesTests],
+      Testing.testGroupCases = []}
+
+applicationsInComplexContextsTests :: Testing.TestGroup
+applicationsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Applications in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "application in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}), (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "b"))})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}), (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "b"))})))),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "application in record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "John"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ny"))}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "John"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ny"))}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}]})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "application in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "result"),
+                  Core.bindingTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "result"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "result"),
+                  Core.bindingTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "result"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nested applications",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))}))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))}))})),
+              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+applicationsTests :: Testing.TestGroup
+applicationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Applications",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        simpleFunctionApplicationsTests,
+        partialApplicationsTests,
+        higherOrderApplicationsTests,
+        polymorphicApplicationsTests,
+        applicationsInComplexContextsTests,
+        applicationsWithComplexArgumentsTests],
+      Testing.testGroupCases = []}
+
+applicationsWithComplexArgumentsTests :: Testing.TestGroup
+applicationsWithComplexArgumentsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Applications with complex arguments",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "application with record argument",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "getName"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "person"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                        Core.projectionTypeName = TestTypes.testTypePersonName,
+                        Core.projectionField = (Core.Name "firstName")})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "getName")),
+                Core.applicationArgument = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "getName"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "person"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                        Core.projectionTypeName = TestTypes.testTypePersonName,
+                        Core.projectionField = (Core.Name "firstName")})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypePersonName),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "getName")),
+                Core.applicationArgument = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "application with list argument",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "head"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "xs"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "head")),
+                Core.applicationArgument = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "first"),
+                  (Core.TermLiteral (Core.LiteralString "second"))])}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "head"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "xs"),
+                      Core.lambdaDomain = (Just (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))})))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0"],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "head")),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.applicationArgument = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "first"),
+                  (Core.TermLiteral (Core.LiteralString "second"))])}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+binaryPrimitivesTests :: Testing.TestGroup
+binaryPrimitivesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Binary primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "math add",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lists cons",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                  Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "maps insert",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+booleanLiteralsTests :: Testing.TestGroup
+booleanLiteralsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Boolean literals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "true",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean True)),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralBoolean True)),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "false",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean False)),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralBoolean False)),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+floatLiteralsTests :: Testing.TestGroup
+floatLiteralsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Float literals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "bigfloat",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeBigfloat))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "float32",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.71828))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.71828))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "float64",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.41421))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.41421))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+higherOrderApplicationsTests :: Testing.TestGroup
+higherOrderApplicationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Higher-order applications",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "apply function to function",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "apply"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "double"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "apply")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "apply"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0",
+                      (Core.Name "t1")],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "double"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "apply")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "function composition",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "compose"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "g"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "add1"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "mul2"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "compose")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "add1"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "mul2"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "compose"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t2"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "f"),
+                          Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "g"),
+                            Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))})))}))}))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0",
+                      (Core.Name "t1"),
+                      (Core.Name "t2")],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "add1"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "mul2"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "compose")),
+                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "add1"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "mul2"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+higherOrderLambdasTests :: Testing.TestGroup
+higherOrderLambdasTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Higher-order lambdas",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "function composition",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "f"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "g"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t2"),
+                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "g"),
+                      Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))),
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))})))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "t2"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "function application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "f"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "f"),
+                  Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "curried function",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "z"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "z"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})))})))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+higherOrderPrimitivesTests :: Testing.TestGroup
+higherOrderPrimitivesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Higher-order primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lists map function",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+              Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lists filter",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                  Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "optionals maybe",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1"))),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+integerLiteralsTests :: Testing.TestGroup
+integerLiteralsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Integer literals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "bigint",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "int8",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "int16",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 32767))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 32767))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "int32",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2147483647))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2147483647))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "int64",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 9223372036854775807))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 9223372036854775807))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "uint8",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint8))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "uint16",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 65535))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 65535))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint16))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "uint32",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 4294967295))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 4294967295))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "uint64",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 18446744073709551615))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 18446744073709551615))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+lambdasInComplexContextsTests :: Testing.TestGroup
+lambdasInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Lambdas in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                  Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
+              (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
+              (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda in record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "name"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "name"),
+              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.functionTypeCodomain = (Core.TypeVariable TestTypes.testTypePersonName)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+lambdasTests :: Testing.TestGroup
+lambdasTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Lambdas",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        simpleLambdasTests,
+        multiParameterLambdasTests,
+        lambdasWithOperationsTests,
+        nestedLambdasTests,
+        lambdasInComplexContextsTests,
+        higherOrderLambdasTests],
+      Testing.testGroupCases = []}
+
+lambdasWithOperationsTests :: Testing.TestGroup
+lambdasWithOperationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Lambdas with operations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda with primitive",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda with application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "f"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "f"),
+                  Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda with construction",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+letTermsTests :: Testing.TestGroup
+letTermsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Let terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        simpleLetBindingsTests,
+        letTermsWithShadowingTests,
+        recursiveBindingsTests,
+        mutualRecursionTests,
+        nestedLetTermsTests,
+        letWithComplexExpressionsTests],
+      Testing.testGroupCases = []}
+
+letTermsWithShadowingTests :: Testing.TestGroup
+letTermsWithShadowingTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Let terms with shadowing",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda parameter shadowing let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "x"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nested lambda shadowing",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [],
+                          Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                      Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t1")),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "multiple levels of let shadowing",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "x"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "second")),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralBoolean True)),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "x"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "second")),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralBoolean True)),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "let shadowing with lambda and reference to outer binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "z"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "z"))))}))})))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "x"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.typeSchemeConstraints = Nothing}))},
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "z"),
+                        Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [],
+                          Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "z")))),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                  Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+letWithComplexExpressionsTests :: Testing.TestGroup
+letWithComplexExpressionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Let with complex expressions",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "let in record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "first"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "John")),
+                        Core.bindingType = Nothing},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "middle"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "Q")),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "first"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "middle"))}))}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "first"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "John")),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [],
+                          Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                          Core.typeSchemeConstraints = Nothing}))},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "middle"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "Q")),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [],
+                          Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "first"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "middle"))}))}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "let in function application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0"],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "composition",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "compose"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "g"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "add1"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "double"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "compose")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "add1"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "compose"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t2"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "f"),
+                          Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "g"),
+                            Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))})))}))}))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0",
+                      (Core.Name "t1"),
+                      (Core.Name "t2")],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "add1"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "double"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "compose")),
+                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "add1"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+literalsInComplexContextsTests :: Testing.TestGroup
+literalsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Literals in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "literals in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermPair (Core.TermLiteral (Core.LiteralString "test"), (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14))))))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralString "test"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14))))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})))),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+              Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
+              Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "literals in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermLiteral (Core.LiteralString "one"),
+              (Core.TermLiteral (Core.LiteralString "two")),
+              (Core.TermLiteral (Core.LiteralString "three"))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermLiteral (Core.LiteralString "one"),
+              (Core.TermLiteral (Core.LiteralString "two")),
+              (Core.TermLiteral (Core.LiteralString "three"))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+literalsTests :: Testing.TestGroup
+literalsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Literals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        booleanLiteralsTests,
+        stringLiteralsTests,
+        integerLiteralsTests,
+        floatLiteralsTests,
+        literalsInComplexContextsTests],
+      Testing.testGroupCases = []}
+
+monomorphicVsPolymorphicTests :: Testing.TestGroup
+monomorphicVsPolymorphicTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Monomorphic vs polymorphic",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "monomorphic math",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic identity",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity"))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multiParameterLambdasTests :: Testing.TestGroup
+multiParameterLambdasTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multi-parameter lambdas",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "two parameters",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "three parameters",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "z"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t2"),
+                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "z"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})))})))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "t2"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "parameter reuse",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})))),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+mutualRecursionTests :: Testing.TestGroup
+mutualRecursionTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Mutual recursion",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "mutually recursive data",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "listA"),
+                  Core.bindingTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeBuddyListAName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "listB"))))}]})),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "listB"),
+                  Core.bindingTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeBuddyListBName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermMaybe Nothing)}]})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "listA"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "listA"),
+                  Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeBuddyListAName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "head"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "tail"),
+                          Core.fieldTerm = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "listB"))))}]})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                      Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "listB"),
+                  Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeBuddyListBName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "head"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "tail"),
+                          Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                            Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}]})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                      Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "listA"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "(monomorphic) mutually recursive functions",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "g"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "g"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedLambdasTests :: Testing.TestGroup
+nestedLambdasTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested lambdas",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda returning lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "z"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t2"),
+                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "z"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "t2"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda with let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermVariable (Core.Name "y"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "y"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda with inner lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "outer"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "inner"),
+                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "inner")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "outer"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "inner"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t1"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t1"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "inner")),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))}))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedLetTermsTests :: Testing.TestGroup
+nestedLetTermsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested let terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "monomorphic nesting",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "z"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "z"))}))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "z"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "z"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic nesting",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "apply"),
+                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "f"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "apply")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "id"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test"))}))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0"],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "apply"),
+                    Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t0"),
+                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t1"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "f"),
+                          Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [
+                        Core.Name "t0",
+                        (Core.Name "t1")],
+                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "apply")),
+                        Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "variable capture avoidance",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "y"))}))})))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "x"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [],
+                          Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermVariable (Core.Name "y"))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "simple let in lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "z"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermVariable (Core.Name "z")),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermVariable (Core.Name "y"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "z"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "z")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "y"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nullaryPrimitivesTests :: Testing.TestGroup
+nullaryPrimitivesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nullary primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty set",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty"))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+partialApplicationsTests :: Testing.TestGroup
+partialApplicationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Partial applications",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "partially applied add",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "partially applied string cat",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "prefix"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "prefix"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicApplicationsTests :: Testing.TestGroup
+polymorphicApplicationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic applications",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic identity",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0"],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic const",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "const"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "const")),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keep"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "const"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0",
+                      (Core.Name "t1")],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "const")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "keep"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic flip",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "flip"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "flip")),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2")))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "flip"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t2"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "f"),
+                          Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))}))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "y"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})))}))}))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0",
+                      (Core.Name "t1"),
+                      (Core.Name "t2")],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))})),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))}))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "flip")),
+                          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                        Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2")))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicVariablesTests :: Testing.TestGroup
+polymorphicVariablesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic variables",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic function",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "id"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "id"),
+                    Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [
+                        Core.Name "t1"],
+                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test"))}))))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "id"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0"],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test"))})))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "higher order polymorphic",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "apply"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "apply"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "apply"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t2"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "t3"),
+                          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "f"),
+                            Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))}))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t2",
+                          (Core.Name "t3")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))})),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "apply")),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+primitivesInComplexContextsTests :: Testing.TestGroup
+primitivesInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Primitives in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "primitive composition",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "double"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "increment"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "increment"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "double"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "increment"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "double"))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "increment"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nested higher-order",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
+                (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                  Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
+                (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])])})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+primitivesTests :: Testing.TestGroup
+primitivesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        nullaryPrimitivesTests,
+        unaryPrimitivesTests,
+        binaryPrimitivesTests,
+        ternaryPrimitivesTests,
+        monomorphicVsPolymorphicTests,
+        higherOrderPrimitivesTests,
+        primitivesInComplexContextsTests],
+      Testing.testGroupCases = []}
+
+recursiveBindingsTests :: Testing.TestGroup
+recursiveBindingsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Recursive bindings",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "simple arithmetic recursion",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "double"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "n"))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "double")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "double"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "n"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "n"))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "double")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+recursiveVariablesTests :: Testing.TestGroup
+recursiveVariablesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Recursive variables",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "simple recursion",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "mutual recursion",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "g"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "g"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+simpleFunctionApplicationsTests :: Testing.TestGroup
+simpleFunctionApplicationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Simple function applications",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "identity application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "primitive application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "string concatenation",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+simpleLambdasTests :: Testing.TestGroup
+simpleLambdasTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Simple lambdas",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "identity function",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "constant function",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+simpleLetBindingsTests :: Testing.TestGroup
+simpleLetBindingsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Simple let bindings",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "single binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "multiple bindings",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+simpleVariableLookupTests :: Testing.TestGroup
+simpleVariableLookupTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Simple variable lookup",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "int variable",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "variable in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "multiple variables",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y")))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+stringLiteralsTests :: Testing.TestGroup
+stringLiteralsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "String literals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "simple string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralString "hello")),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralString "")),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralString "")),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unicode string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLiteral (Core.LiteralString "caf\233")),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLiteral (Core.LiteralString "caf\233")),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+ternaryPrimitivesTests :: Testing.TestGroup
+ternaryPrimitivesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Ternary primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "logic ifElse",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lists foldl",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t1"))),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unaryPrimitivesTests :: Testing.TestGroup
+unaryPrimitivesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unary primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lists head",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "math neg",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "logic not",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+variableScopingTests :: Testing.TestGroup
+variableScopingTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Variable scoping",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda parameter",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "let binding scope",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "variable shadowing",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "x"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [],
+                      Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nested scoping",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "z"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermPair (Core.TermVariable (Core.Name "y"), (Core.TermVariable (Core.Name "z"))))))})))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [],
+                          Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "z"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                      Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermPair (Core.TermVariable (Core.Name "y"), (Core.TermVariable (Core.Name "z")))),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})))),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
+                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+variablesInComplexContextsTests :: Testing.TestGroup
+variablesInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Variables in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "variable in record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "name"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "name"),
+              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypePersonName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.functionTypeCodomain = (Core.TypeVariable TestTypes.testTypePersonName)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "variable in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermList [
+                Core.TermVariable (Core.Name "x"),
+                (Core.TermVariable (Core.Name "x"))])}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermList [
+                  Core.TermVariable (Core.Name "x"),
+                  (Core.TermVariable (Core.Name "x"))])})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "variable in map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "key"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "value"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermMap (M.fromList [
+                  (Core.TermVariable (Core.Name "key"), (Core.TermVariable (Core.Name "value")))]))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "key"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "value"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermMap (M.fromList [
+                      (Core.TermVariable (Core.Name "key"), (Core.TermVariable (Core.Name "value")))]))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "variable in optional",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "x"))))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+variablesTests :: Testing.TestGroup
+variablesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Variables",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        simpleVariableLookupTests,
+        variableScopingTests,
+        polymorphicVariablesTests,
+        variablesInComplexContextsTests,
+        recursiveVariablesTests],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Checking/NominalTypes.hs b/src/gen-test/haskell/Hydra/Test/Checking/NominalTypes.hs
--- a/src/gen-test/haskell/Hydra/Test/Checking/NominalTypes.hs
+++ b/src/gen-test/haskell/Hydra/Test/Checking/NominalTypes.hs
@@ -15,6280 +15,6317 @@
 import qualified Data.Set as S
 
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Nominal types",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    recordsTests,
-    unionsTests,
-    wrappedTermsTests,
-    eliminationsTests],
-  Testing.testGroupCases = []}
-
-recordsTests :: Testing.TestGroup
-recordsTests = Testing.TestGroup {
-  Testing.testGroupName = "Records",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    monomorphicRecordsTests,
-    polymorphicRecordsTests,
-    recordsInComplexContextsTests,
-    multiParameterPolymorphicRecordsTests],
-  Testing.testGroupCases = []}
-
-monomorphicRecordsTests :: Testing.TestGroup
-monomorphicRecordsTests = Testing.TestGroup {
-  Testing.testGroupName = "Monomorphic records",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "latlon record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "LatLon"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lat"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lon"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-155.6659))))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "LatLon"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lat"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lon"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-155.6659))))}]})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable (Core.Name "LatLon"))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "latlon with variable",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLon"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLon"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
-          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "LatLon"))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "person record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "Person"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "Person"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable (Core.Name "Person"))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "empty record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "Unit"),
-          Core.recordFields = []})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "Unit"),
-          Core.recordFields = []})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable (Core.Name "Unit"))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "person with variables",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "name"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "age"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Person"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "age"))}]}))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "name"),
-          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "age"),
-            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Core.lambdaBody = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Person"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "age"))}]}))})))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "Person"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicRecordsTests :: Testing.TestGroup
-polymorphicRecordsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic records",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "latlon poly float",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "LatLonPoly"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lat"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lon"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-155.6659))))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLonPoly"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-155.6659))))}]})),
-          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "latlon poly int64",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "LatLonPoly"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lat"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 195429)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lon"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1556659))))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLonPoly"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 195429)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1556659))))}]})),
-          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "latlon poly variable",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLonPoly"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "LatLonPoly"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lat"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lon"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "buddylist string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "BuddyListA"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "head"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "tail"),
-              Core.fieldTerm = (Core.TermMaybe Nothing)}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "BuddyListA"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "head"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "tail"),
-                Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                  Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
-                    Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))}]})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
-          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "buddylist variable",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "BuddyListA"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "head"),
-                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "tail"),
-                Core.fieldTerm = (Core.TermMaybe Nothing)}]}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "BuddyListA"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                      Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}]})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recordsInComplexContextsTests :: Testing.TestGroup
-recordsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Records in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "records in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "Person"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}), (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "LatLon"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lat"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lon"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.0)))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Person"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}), (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "LatLon"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lat"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lon"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.0)))}]})))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "Person"))})),
-          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "LatLon"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "Person")),
-          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "LatLon"))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "poly records in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "LatLonPoly"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lat"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lon"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]}), (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "BuddyListA"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "head"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "tail"),
-              Core.fieldTerm = (Core.TermMaybe Nothing)}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "LatLonPoly"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lat"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lon"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "BuddyListA"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                      Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
-                        Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))}]})),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})))),
-            Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
-            Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.pairTypeSecond = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
-            Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "recursive record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "IntList"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "head"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "tail"),
-              Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "IntList"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 43)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "IntList"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "head"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "tail"),
-              Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "IntList"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 43)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "IntList"))}))}]}))))}]})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable (Core.Name "IntList"))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multiParameterPolymorphicRecordsTests :: Testing.TestGroup
-multiParameterPolymorphicRecordsTests = Testing.TestGroup {
-  Testing.testGroupName = "Multi-parameter polymorphic records",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "triple with three monomorphic types",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = (Core.Name "Triple"),
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "first"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-            Core.Field {
-              Core.fieldName = (Core.Name "second"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "third"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "Triple"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "first"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "second"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "third"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}]})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "Triple")),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "triple with PersonOrSomething containing map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "k"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "v"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Triple"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "first"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "prefix"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "second"),
-                  Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "other"),
-                      Core.fieldTerm = (Core.TermMap (M.fromList [
-                        (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))}}))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "third"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}]}))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "k"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "v"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = (Core.Name "Triple"),
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "first"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "prefix"))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "second"),
-                            Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                                Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-                                Core.injectionField = Core.Field {
-                                  Core.fieldName = (Core.Name "other"),
-                                  Core.fieldTerm = (Core.TermMap (M.fromList [
-                                    (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))}})),
-                              Core.typeApplicationTermType = (Core.TypeMap (Core.MapType {
-                                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                                Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "third"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}]})),
-                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                    Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "PersonOrSomething")),
-                      Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
-                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "Triple")),
-                      Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-                    Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "PersonOrSomething")),
-                      Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
-                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recordEliminationsTests :: Testing.TestGroup
-recordEliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Record eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    simpleRecordProjectionsTests,
-    recordProjectionsAppliedToRecordsTests,
-    polymorphicRecordProjectionsTests,
-    polymorphicRecordProjectionsAppliedTests,
-    recordProjectionsWithVariablesTests,
-    recordProjectionsInComplexContextsTests,
-    multiParameterPolymorphicProjectionsTests,
-    higherOrderRecordProjectionsTests,
-    recursiveRecordProjectionsTests,
-    recordProjectionsWithMutualRecursionTests,
-    projectionsWithVariablesTests],
-  Testing.testGroupCases = []}
-
-simpleRecordProjectionsTests :: Testing.TestGroup
-simpleRecordProjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Simple record projections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project firstName from Person",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypePersonName,
-          Core.projectionField = (Core.Name "firstName")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypePersonName,
-          Core.projectionField = (Core.Name "firstName")})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project lastName from Person",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypePersonName,
-          Core.projectionField = (Core.Name "lastName")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypePersonName,
-          Core.projectionField = (Core.Name "lastName")})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project age from Person",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypePersonName,
-          Core.projectionField = (Core.Name "age")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypePersonName,
-          Core.projectionField = (Core.Name "age")})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project lat from LatLon",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeLatLonName,
-          Core.projectionField = (Core.Name "lat")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeLatLonName,
-          Core.projectionField = (Core.Name "lat")})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "LatLon")),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project lon from LatLon",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeLatLonName,
-          Core.projectionField = (Core.Name "lon")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeLatLonName,
-          Core.projectionField = (Core.Name "lon")})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "LatLon")),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recordProjectionsAppliedToRecordsTests :: Testing.TestGroup
-recordProjectionsAppliedToRecordsTests = Testing.TestGroup {
-  Testing.testGroupName = "Record projections applied to records",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project firstName applied to person record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypePersonName,
-            Core.projectionField = (Core.Name "firstName")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "Person"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypePersonName,
-            Core.projectionField = (Core.Name "firstName")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "Person"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project age applied to person record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypePersonName,
-            Core.projectionField = (Core.Name "age")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "Person"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypePersonName,
-            Core.projectionField = (Core.Name "age")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "Person"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "firstName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lastName"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "age"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project lat applied to LatLon record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypeLatLonName,
-            Core.projectionField = (Core.Name "lat")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLon"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 40.7128)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-74.006))))}]}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypeLatLonName,
-            Core.projectionField = (Core.Name "lat")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLon"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 40.7128)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-74.006))))}]}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicRecordProjectionsTests :: Testing.TestGroup
-polymorphicRecordProjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic record projections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project lat from polymorphic LatLonPoly",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-          Core.projectionField = (Core.Name "lat")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.projectionField = (Core.Name "lat")})))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project lon from polymorphic LatLonPoly",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-          Core.projectionField = (Core.Name "lon")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.projectionField = (Core.Name "lon")})))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project head from BuddyListA",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-          Core.projectionField = (Core.Name "head")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-              Core.projectionField = (Core.Name "head")})))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project tail from BuddyListA",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-          Core.projectionField = (Core.Name "tail")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-              Core.projectionField = (Core.Name "tail")})))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicRecordProjectionsAppliedTests :: Testing.TestGroup
-polymorphicRecordProjectionsAppliedTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic record projections applied",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project lat from LatLonPoly with int32",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-            Core.projectionField = (Core.Name "lat")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLonPoly"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.projectionField = (Core.Name "lat")})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "LatLonPoly"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lat"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lon"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project lon from LatLonPoly with float64",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-            Core.projectionField = (Core.Name "lon")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "LatLonPoly"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lat"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 40.7128)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "lon"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-74.006))))}]}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.projectionField = (Core.Name "lon")})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))})),
-          Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "LatLonPoly"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lat"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 40.7128)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lon"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-74.006))))}]})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project head from BuddyListA with string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-            Core.projectionField = (Core.Name "head")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = (Core.Name "BuddyListA"),
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "head"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "tail"),
-                Core.fieldTerm = (Core.TermMaybe Nothing)}]}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-              Core.projectionField = (Core.Name "head")})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "BuddyListA"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "head"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "tail"),
-                  Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                    Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
-                      Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))}]})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recordProjectionsWithVariablesTests :: Testing.TestGroup
-recordProjectionsWithVariablesTests = Testing.TestGroup {
-  Testing.testGroupName = "Record projections with variables",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project from lambda parameter",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "person"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "person"),
-          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "Person"))),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project from polymorphic lambda parameter",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "coords"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.projectionField = (Core.Name "lat")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "coords"),
-            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-                  Core.projectionField = (Core.Name "lat")})))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "multiple projections from same record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "person"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}), (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "lastName")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "person"),
-          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "Person"))),
-          Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = TestTypes.testTypePersonName,
-                  Core.projectionField = (Core.Name "firstName")})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}), (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = TestTypes.testTypePersonName,
-                  Core.projectionField = (Core.Name "lastName")})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))})))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recordProjectionsInComplexContextsTests :: Testing.TestGroup
-recordProjectionsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Record projections in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "projection in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "person"),
-              Core.bindingTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "Person"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "firstName"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Charlie"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lastName"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Brown"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "age"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 35)))}]})),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "getName"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypePersonName,
-                Core.projectionField = (Core.Name "firstName")})))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "getName")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "person"),
-              Core.bindingTerm = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "Person"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "firstName"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Charlie"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lastName"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Brown"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "age"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 35)))}]})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeVariable (Core.Name "Person")),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "getName"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypePersonName,
-                Core.projectionField = (Core.Name "firstName")})))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "getName")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "projection in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypePersonName,
-          Core.projectionField = (Core.Name "firstName")}))), (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypePersonName,
-          Core.projectionField = (Core.Name "age")})))))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")}))), (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "age")})))))),
-            Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "projection in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypePersonName,
-            Core.projectionField = (Core.Name "firstName")}))),
-          (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypePersonName,
-            Core.projectionField = (Core.Name "lastName")}))))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypePersonName,
-            Core.projectionField = (Core.Name "firstName")}))),
-          (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypePersonName,
-            Core.projectionField = (Core.Name "lastName")}))))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multiParameterPolymorphicProjectionsTests :: Testing.TestGroup
-multiParameterPolymorphicProjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Multi-parameter polymorphic projections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project first from Triple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeTripleName,
-          Core.projectionField = (Core.Name "first")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t2"),
-              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypeTripleName,
-                      Core.projectionField = (Core.Name "first")})))),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))}))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "t2"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project second from Triple applied",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-            Core.projectionTypeName = TestTypes.testTypeTripleName,
-            Core.projectionField = (Core.Name "second")})))),
-          Core.applicationArgument = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypeTripleName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "first"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "second"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "third"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}]}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = TestTypes.testTypeTripleName,
-                  Core.projectionField = (Core.Name "second")})))),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-          Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeTripleName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "first"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "second"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "third"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}]})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project from Triple and use second field, which is another polymorphic record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "triple"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "key"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "person"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "p"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermMaybe Nothing)})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "m"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "key"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))})))}]})))),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = TestTypes.testTypeTripleName,
-                  Core.projectionField = (Core.Name "second")})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "triple"))}))}))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t2"),
-              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t3"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "triple"),
-                  Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-                        Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
-                          Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
-                          Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))}))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))),
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "key"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "person"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "p"),
-                                Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
-                                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                  Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))}))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "other"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "m"),
-                                Core.lambdaDomain = (Just (Core.TypeMap (Core.MapType {
-                                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
-                                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))),
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "key"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))})))}]})))),
-                        Core.typeApplicationTermType = (Core.TypeMap (Core.MapType {
-                          Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
-                          Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = TestTypes.testTypeTripleName,
-                                Core.projectionField = (Core.Name "second")})))),
-                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                            Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-                              Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
-                                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
-                                Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))}))})),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "triple"))}))}))})))})))}))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "t2"),
-              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "t3"),
-                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-                        Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
-                          Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
-                          Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))}))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))})),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                    Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t2")))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-higherOrderRecordProjectionsTests :: Testing.TestGroup
-higherOrderRecordProjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Higher-order record projections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map projection over list of records",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")}))))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}),
-            (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")}))))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}),
-            (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))])})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map polymorphic projection",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.projectionField = (Core.Name "lat")}))))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lat"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lon"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]}),
-            (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lat"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 34)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lon"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-118))))}]}))])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-                Core.projectionField = (Core.Name "lat")})))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lat"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lon"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
-            (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lat"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 34)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lon"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-118))))}]})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))])})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "filter using projection",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "person"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypePersonName,
-                      Core.projectionField = (Core.Name "age")})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}))})))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 35)))}]}),
-            (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-              Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "person"),
-              Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypePersonName,
-                      Core.projectionField = (Core.Name "age")})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}))})))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 35)))}]}),
-            (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))])})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeVariable TestTypes.testTypePersonName))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recursiveRecordProjectionsTests :: Testing.TestGroup
-recursiveRecordProjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Recursive record projections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nested projection from recursive record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "intList"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypeIntListName,
-                Core.projectionField = (Core.Name "head")}))))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypeIntListName,
-                Core.projectionField = (Core.Name "tail")})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "intList"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "intList"),
-          Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeIntListName)),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeIntListName)})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypeIntListName,
-                Core.projectionField = (Core.Name "head")}))))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypeIntListName,
-                Core.projectionField = (Core.Name "tail")})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "intList"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeIntListName),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recordProjectionsWithMutualRecursionTests :: Testing.TestGroup
-recordProjectionsWithMutualRecursionTests = Testing.TestGroup {
-  Testing.testGroupName = "Record projections with mutual recursion",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project head from BuddyListA",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-          Core.projectionField = (Core.Name "head")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-              Core.projectionField = (Core.Name "head")})))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project tail from BuddyListB",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-          Core.projectionTypeName = TestTypes.testTypeBuddyListBName,
-          Core.projectionField = (Core.Name "tail")})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeBuddyListBName,
-              Core.projectionField = (Core.Name "tail")})))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "chained projections across mutual recursion",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "listA"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "listB"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                      Core.applicationArgument = (Core.TermMaybe Nothing)})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-                      Core.projectionField = (Core.Name "tail")}))))})),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypeBuddyListBName,
-                      Core.projectionField = (Core.Name "tail")})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "listB"))}))}))})))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-                Core.projectionField = (Core.Name "tail")})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "listA"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "listA"),
-            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                      Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))})),
-                    Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
-                  Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                    Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "listB"),
-                  Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                            Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))})),
-                          Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
-                        Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                          Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-                      Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                          Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-                          Core.projectionField = (Core.Name "tail")})))),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                          Core.projectionTypeName = TestTypes.testTypeBuddyListBName,
-                          Core.projectionField = (Core.Name "tail")})))),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "listB"))}))}))})))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
-                    Core.projectionField = (Core.Name "tail")})))),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "listA"))}))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unionsTests :: Testing.TestGroup
-unionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Unions",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    simpleUnionInjectionsTests,
-    unionInjectionsWithDataTests,
-    polymorphicUnionInjectionsTests,
-    polymorphicRecursiveUnionInjectionsTests,
-    polymorphicUnionsFromLambdaTests,
-    unionsInComplexContextsTests,
-    multiParameterPolymorphicInjectionsTests],
-  Testing.testGroupCases = []}
-
-simpleUnionInjectionsTests :: Testing.TestGroup
-simpleUnionInjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Simple union injections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject into Comparison lessThan variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeComparisonName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "lessThan"),
-            Core.fieldTerm = Core.TermUnit}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeComparisonName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "lessThan"),
-            Core.fieldTerm = Core.TermUnit}})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeComparisonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject into Comparison equalTo variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeComparisonName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "equalTo"),
-            Core.fieldTerm = Core.TermUnit}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeComparisonName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "equalTo"),
-            Core.fieldTerm = Core.TermUnit}})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeComparisonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject into Comparison greaterThan variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeComparisonName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "greaterThan"),
-            Core.fieldTerm = Core.TermUnit}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeComparisonName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "greaterThan"),
-            Core.fieldTerm = Core.TermUnit}})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeComparisonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unionInjectionsWithDataTests :: Testing.TestGroup
-unionInjectionsWithDataTests = Testing.TestGroup {
-  Testing.testGroupName = "Union injections with data",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject into Number int variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeNumberName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "int"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeNumberName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "int"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeNumberName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject into Number float variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeNumberName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "float"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeNumberName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "float"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))}})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeNumberName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject into Timestamp unixTimeMillis variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeTimestampName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "unixTimeMillis"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1609459200000)))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeTimestampName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "unixTimeMillis"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1609459200000)))}})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeTimestampName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject into Timestamp date variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeTimestampName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "date"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "2021-01-01"))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeTimestampName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "date"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "2021-01-01"))}})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeTimestampName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicUnionInjectionsTests :: Testing.TestGroup
-polymorphicUnionInjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic union injections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject person into PersonOrSomething",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "person"),
-            Core.fieldTerm = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypePersonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "firstName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lastName"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "age"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "person"),
-                Core.fieldTerm = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypePersonName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "firstName"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "lastName"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "age"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))}})),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject string into PersonOrSomething other variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "other"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "something else"))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "other"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "something else"))}})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject int into PersonOrSomething other variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "other"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "other"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicRecursiveUnionInjectionsTests :: Testing.TestGroup
-polymorphicRecursiveUnionInjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic recursive union injections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject boolean into UnionPolymorphicRecursive",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "bool"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "bool"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}})),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject string value into UnionPolymorphicRecursive",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "value"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "value"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "inject int value into UnionPolymorphicRecursive",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "value"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "value"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)))}})),
-          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicUnionsFromLambdaTests :: Testing.TestGroup
-polymorphicUnionsFromLambdaTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic unions from lambda",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda creating PersonOrSomething other variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "other"),
-              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "other"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "lambda creating UnionPolymorphicRecursive value variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "value"),
-              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unionsInComplexContextsTests :: Testing.TestGroup
-unionsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Unions in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "union in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeNumberName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "int"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}), (Core.TermLiteral (Core.LiteralString "context")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeNumberName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "int"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}), (Core.TermLiteral (Core.LiteralString "context")))),
-            Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeNumberName)})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeVariable TestTypes.testTypeNumberName),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "union in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeNumberName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}),
-          (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeNumberName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "float"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5)))}}))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeNumberName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}),
-          (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeNumberName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "float"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5)))}}))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeVariable TestTypes.testTypeNumberName))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic union in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "value"),
-              Core.bindingTerm = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "other"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "value"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "value"),
-              Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-                  Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "value"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multiParameterPolymorphicInjectionsTests :: Testing.TestGroup
-multiParameterPolymorphicInjectionsTests = Testing.TestGroup {
-  Testing.testGroupName = "Multi-parameter polymorphic injections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either left with int",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeEitherName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "left"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypeEitherName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "left"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either right with string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeEitherName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "right"),
-            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypeEitherName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "right"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either containing LatLonPoly in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
-          Core.injectionTypeName = TestTypes.testTypeEitherName,
-          Core.injectionField = Core.Field {
-            Core.fieldName = (Core.Name "right"),
-            Core.fieldTerm = (Core.TermList [
-              Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lat"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lon"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]})])}})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypeEitherName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "right"),
-                  Core.fieldTerm = (Core.TermList [
-                    Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "lat"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "lon"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]})),
-                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})])}})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.typeApplicationTermType = (Core.TypeList (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.applicationTypeArgument = (Core.TypeList (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "either in triple in map with shared type variables",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x0"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x1"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x2"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralString "key"), (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeTripleName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "first"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = TestTypes.testTypeEitherName,
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "left"),
-                          Core.fieldTerm = (Core.TermVariable (Core.Name "x0"))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "second"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = TestTypes.testTypeEitherName,
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "left"),
-                          Core.fieldTerm = (Core.TermVariable (Core.Name "x0"))}}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "third"),
-                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
-                        Core.injectionTypeName = TestTypes.testTypeEitherName,
-                        Core.injectionField = Core.Field {
-                          Core.fieldName = (Core.Name "right"),
-                          Core.fieldTerm = (Core.TermVariable (Core.Name "x1"))}}))}]})))]))})))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t2"),
-              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t3"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t4"),
-                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t5"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x0"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x1"),
-                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x2"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
-                          Core.lambdaBody = (Core.TermMap (M.fromList [
-                            (Core.TermLiteral (Core.LiteralString "key"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                                    Core.recordTypeName = TestTypes.testTypeTripleName,
-                                    Core.recordFields = [
-                                      Core.Field {
-                                        Core.fieldName = (Core.Name "first"),
-                                        Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                            Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = TestTypes.testTypeEitherName,
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "left"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x0"))}})),
-                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))}))},
-                                      Core.Field {
-                                        Core.fieldName = (Core.Name "second"),
-                                        Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                            Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = TestTypes.testTypeEitherName,
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "left"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x0"))}})),
-                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t4"))}))},
-                                      Core.Field {
-                                        Core.fieldName = (Core.Name "third"),
-                                        Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                            Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                                              Core.injectionTypeName = TestTypes.testTypeEitherName,
-                                              Core.injectionField = Core.Field {
-                                                Core.fieldName = (Core.Name "right"),
-                                                Core.fieldTerm = (Core.TermVariable (Core.Name "x1"))}})),
-                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t5"))})),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}]})),
-                                  Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))})),
-                                Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))}))})),
-                              Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t5"))})),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})))]))})))})))})))}))}))}))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "t2"),
-              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "t3"),
-                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                  Core.forallTypeParameter = (Core.Name "t4"),
-                  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                    Core.forallTypeParameter = (Core.Name "t5"),
-                    Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                          Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                            Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.mapTypeValues = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                                  Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))})),
-                                Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))}))})),
-                              Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t5"))})),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unionEliminationsTests :: Testing.TestGroup
-unionEliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Union eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    simpleUnitVariantEliminationsTests,
-    unionEliminationsWithDataTests,
-    polymorphicUnionEliminationsTests,
-    unionEliminationsWithDefaultsTests,
-    nestedUnionEliminationsTests,
-    unionEliminationsInComplexContextsTests,
-    multiParameterPolymorphicCaseStatementsTests,
-    higherOrderUnionEliminationsTests,
-    recursiveUnionEliminationsTests],
-  Testing.testGroupCases = []}
-
-simpleUnitVariantEliminationsTests :: Testing.TestGroup
-simpleUnitVariantEliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Simple unit inject eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match Comparison with all cases",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lessThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "greaterThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lessThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just Core.TypeUnit),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just Core.TypeUnit),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "greaterThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just Core.TypeUnit),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match Comparison returning int32",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lessThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "greaterThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lessThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just Core.TypeUnit),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just Core.TypeUnit),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "greaterThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just Core.TypeUnit),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match applied to Comparison variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-            Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-            Core.caseStatementDefault = Nothing,
-            Core.caseStatementCases = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "equalTo"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "greaterThan"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
-          Core.applicationArgument = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeComparisonName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = Core.TermUnit}}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-            Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-            Core.caseStatementDefault = Nothing,
-            Core.caseStatementCases = [
-              Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just Core.TypeUnit),
-                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "equalTo"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just Core.TypeUnit),
-                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "greaterThan"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just Core.TypeUnit),
-                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
-          Core.applicationArgument = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeComparisonName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = Core.TermUnit}}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unionEliminationsWithDataTests :: Testing.TestGroup
-unionEliminationsWithDataTests = Testing.TestGroup {
-  Testing.testGroupName = "Union eliminations with data",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match Number extracting int values",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "i"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "i"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "float"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "i"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermVariable (Core.Name "i"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "float"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeNumberName),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match Number converting to string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "i"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "float"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "i"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "float"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeNumberName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match Number applied to int variant",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-            Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-            Core.caseStatementDefault = Nothing,
-            Core.caseStatementCases = [
-              Core.Field {
-                Core.fieldName = (Core.Name "int"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "i"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "i"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "float"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "f"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
-          Core.applicationArgument = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeNumberName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-            Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-            Core.caseStatementDefault = Nothing,
-            Core.caseStatementCases = [
-              Core.Field {
-                Core.fieldName = (Core.Name "int"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "i"),
-                  Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "i"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "float"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "f"),
-                  Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
-                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
-          Core.applicationArgument = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeNumberName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match Timestamp with mixed data types",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeTimestampName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "unixTimeMillis"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "millis"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint64"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "millis"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "date"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "dateStr"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "dateStr"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeTimestampName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "unixTimeMillis"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "millis"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint64"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "millis"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "date"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "dateStr"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                Core.lambdaBody = (Core.TermVariable (Core.Name "dateStr"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeTimestampName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicUnionEliminationsTests :: Testing.TestGroup
-polymorphicUnionEliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic union eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    simplePolymorphicUnionTests,
-    usingUnionPolymorphicRecursiveTests,
-    usingKernelTypesTests],
-  Testing.testGroupCases = []}
-
-simplePolymorphicUnionTests :: Testing.TestGroup
-simplePolymorphicUnionTests = Testing.TestGroup {
-  Testing.testGroupName = "Simple polymorphic unions",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match PersonOrSomething with string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "person"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "p"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = TestTypes.testTypePersonName,
-                    Core.projectionField = (Core.Name "firstName")})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "other"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-            Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-            Core.caseStatementDefault = Nothing,
-            Core.caseStatementCases = [
-              Core.Field {
-                Core.fieldName = (Core.Name "person"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "p"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypePersonName,
-                      Core.projectionField = (Core.Name "firstName")})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "other"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-            Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match PersonOrSomething instantiated with string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-            Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-            Core.caseStatementDefault = Nothing,
-            Core.caseStatementCases = [
-              Core.Field {
-                Core.fieldName = (Core.Name "person"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "p"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypePersonName,
-                      Core.projectionField = (Core.Name "firstName")})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "other"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
-          Core.applicationArgument = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "other"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "person"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "p"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "other"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "other"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-usingUnionPolymorphicRecursiveTests :: Testing.TestGroup
-usingUnionPolymorphicRecursiveTests = Testing.TestGroup {
-  Testing.testGroupName = "using UnionPolymorphicRecursive",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "non-applied UnionPolymorphicRecursive",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "test"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "value"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "i"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "test"),
-              Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "i"),
-                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "applied UnionPolymorphicRecursive with int32",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "test"),
-              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "i"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "value"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "test"),
-              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                    Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "value"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "i"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "applied UnionPolymorphicRecursive with int32 in lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "test"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                    Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "value"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "i"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "test"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "value"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "i"),
-                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "applied generic UnionPolymorphicRecursive in lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "test"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                    Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "value"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "ignored"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermLet (Core.Let {
-            Core.letBindings = [
-              Core.Binding {
-                Core.bindingName = (Core.Name "test"),
-                Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "value"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "ignored"),
-                                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))}]})))),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-                Core.bindingType = (Just (Core.TypeScheme {
-                  Core.typeSchemeVariables = [
-                    Core.Name "t1"],
-                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                  Core.typeSchemeConstraints = Nothing}))}],
-            Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "test")),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-usingKernelTypesTests :: Testing.TestGroup
-usingKernelTypesTests = Testing.TestGroup {
-  Testing.testGroupName = "Using kernel types",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "case statement on CoderDirection applied to argument",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "dir"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "coder"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "encode"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "_"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v12"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                              Core.projectionTypeName = (Core.Name "hydra.compute.Coder"),
-                              Core.projectionField = (Core.Name "encode")})))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "decode"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "_"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v12"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                              Core.projectionTypeName = (Core.Name "hydra.compute.Coder"),
-                              Core.projectionField = (Core.Name "decode")})))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))}]})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "dir"))}))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "dir"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "coder"),
-                Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Coder")),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "encode"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "_"),
-                          Core.lambdaDomain = (Just Core.TypeUnit),
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "v12"),
-                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                          Core.projectionTypeName = (Core.Name "hydra.compute.Coder"),
-                                          Core.projectionField = (Core.Name "encode")})))),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "decode"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "_"),
-                          Core.lambdaDomain = (Just Core.TypeUnit),
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "v12"),
-                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                          Core.projectionTypeName = (Core.Name "hydra.compute.Coder"),
-                                          Core.projectionField = (Core.Name "decode")})))),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "dir"))}))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Coder")),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Flow")),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unionEliminationsWithDefaultsTests :: Testing.TestGroup
-unionEliminationsWithDefaultsTests = Testing.TestGroup {
-  Testing.testGroupName = "Union eliminations with defaults",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match Comparison with default case",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "unknown"))),
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lessThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "unknown"))),
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lessThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just Core.TypeUnit),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just Core.TypeUnit),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match Number with default case",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))),
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "i"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "i"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))),
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "i"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.lambdaBody = (Core.TermVariable (Core.Name "i"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeNumberName),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match UnionMonomorphic with default",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "fallback"))),
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "bool"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "b"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "string"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "s"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "fallback"))),
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "bool"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "b"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "string"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "s"),
-                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedUnionEliminationsTests :: Testing.TestGroup
-nestedUnionEliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested union eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "nested match statements",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "person"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "p"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = TestTypes.testTypePersonName,
-                    Core.projectionField = (Core.Name "firstName")})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "other"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "int"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "i"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "float"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "f"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-            Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-            Core.caseStatementDefault = Nothing,
-            Core.caseStatementCases = [
-              Core.Field {
-                Core.fieldName = (Core.Name "person"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "p"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypePersonName,
-                      Core.projectionField = (Core.Name "firstName")})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "other"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeNumberName)),
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "int"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "i"),
-                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "float"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "f"),
-                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}]})))),
-          Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeNumberName)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
-            Core.applicationTypeArgument = (Core.TypeVariable TestTypes.testTypeNumberName)})),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "lessThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "equalTo"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "greaterThan"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})))}]}))), (Core.TermLiteral (Core.LiteralString "context")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lessThan"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just Core.TypeUnit),
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "equalTo"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just Core.TypeUnit),
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "greaterThan"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just Core.TypeUnit),
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})))}]}))), (Core.TermLiteral (Core.LiteralString "context")))),
-            Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
-              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
-            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unionEliminationsInComplexContextsTests :: Testing.TestGroup
-unionEliminationsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Union eliminations in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "matcher"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lessThan"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "equalTo"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "greaterThan"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "matcher"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "matcher"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lessThan"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just Core.TypeUnit),
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "equalTo"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just Core.TypeUnit),
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "greaterThan"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just Core.TypeUnit),
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "matcher"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match in record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-                  Core.caseStatementDefault = Nothing,
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "person"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "p"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                            Core.projectionTypeName = TestTypes.testTypePersonName,
-                            Core.projectionField = (Core.Name "firstName")})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "other"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
-                Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))}}))}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "person"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "p"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                              Core.projectionTypeName = TestTypes.testTypePersonName,
-                              Core.projectionField = (Core.Name "firstName")})))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "other"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))}})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match with polymorphic result in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "person"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "p"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "age")})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "other"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
-            Core.applicationArgument = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "other"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}}))}),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "person"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "p"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                          Core.projectionTypeName = TestTypes.testTypePersonName,
-                          Core.projectionField = (Core.Name "age")})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "other"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}),
-          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multiParameterPolymorphicCaseStatementsTests :: Testing.TestGroup
-multiParameterPolymorphicCaseStatementsTests = Testing.TestGroup {
-  Testing.testGroupName = "Multi-parameter polymorphic case statements",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "case Either converting both to string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeEitherName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "left"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "right"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypeEitherName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "left"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "right"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}]})))),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "case Either applied to injection",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-            Core.caseStatementTypeName = TestTypes.testTypeEitherName,
-            Core.caseStatementDefault = Nothing,
-            Core.caseStatementCases = [
-              Core.Field {
-                Core.fieldName = (Core.Name "left"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "n"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))},
-              Core.Field {
-                Core.fieldName = (Core.Name "right"),
-                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}]})))),
-          Core.applicationArgument = (Core.TermUnion (Core.Injection {
-            Core.injectionTypeName = TestTypes.testTypeEitherName,
-            Core.injectionField = Core.Field {
-              Core.fieldName = (Core.Name "left"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypeEitherName,
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "left"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "n"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "right"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "s"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}]})))),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypeEitherName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "left"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "case Either with Triple and nested projections",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "triple"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypeEitherName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "left"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "coords"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-                        Core.projectionField = (Core.Name "lat")})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "right"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "t"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypeTripleName,
-                        Core.projectionField = (Core.Name "first")})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))}]})))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                Core.projectionTypeName = TestTypes.testTypeTripleName,
-                Core.projectionField = (Core.Name "second")})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "triple"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t2"),
-              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t3"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t4"),
-                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "triple"),
-                    Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                            Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
-                          Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))}))})),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))}))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = TestTypes.testTypeEitherName,
-                            Core.caseStatementDefault = Nothing,
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "left"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "coords"),
-                                  Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                        Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-                                        Core.projectionField = (Core.Name "lat")})))),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))})))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "right"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "t"),
-                                  Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))),
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                            Core.projectionTypeName = TestTypes.testTypeTripleName,
-                                            Core.projectionField = (Core.Name "first")})))),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))}]})))),
-                          Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
-                        Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = TestTypes.testTypeTripleName,
-                                Core.projectionField = (Core.Name "second")})))),
-                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                            Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                                Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
-                              Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))}))})),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t4"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "triple"))}))}))})))}))}))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "t2"),
-              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "t3"),
-                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                  Core.forallTypeParameter = (Core.Name "t4"),
-                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                            Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
-                          Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
-                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))}))})),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))})),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "case Either with polymorphic let bindings",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "makeLeft"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = TestTypes.testTypeEitherName,
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "left"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "makeRight"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                  Core.injectionTypeName = TestTypes.testTypeEitherName,
-                  Core.injectionField = Core.Field {
-                    Core.fieldName = (Core.Name "right"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "y"))}}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "flag"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypeEitherName,
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "left"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "n"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "makeRight")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "right"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "s"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "makeLeft")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))})))}]})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))}))})))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "makeLeft"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                    Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = TestTypes.testTypeEitherName,
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "left"),
-                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}})),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))}))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0",
-                  (Core.Name "t1")],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "makeRight"),
-              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t0"),
-                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t1"),
-                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                    Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = TestTypes.testTypeEitherName,
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "right"),
-                            Core.fieldTerm = (Core.TermVariable (Core.Name "y"))}})),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))}))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [
-                  Core.Name "t0",
-                  (Core.Name "t1")],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "flag"),
-            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))),
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeEitherName,
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "left"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "n"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "makeRight")),
-                                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "right"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "makeLeft")),
-                                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))})))}]})))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-higherOrderUnionEliminationsTests :: Testing.TestGroup
-higherOrderUnionEliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Higher-order union eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "map match over list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lessThan"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "equalTo"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "greaterThan"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]}))))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeComparisonName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = Core.TermUnit}}),
-            (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeComparisonName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "equalTo"),
-                Core.fieldTerm = Core.TermUnit}}))])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeComparisonName)})),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lessThan"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just Core.TypeUnit),
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "equalTo"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just Core.TypeUnit),
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "greaterThan"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just Core.TypeUnit),
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]}))))})),
-          Core.applicationArgument = (Core.TermList [
-            Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeComparisonName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = Core.TermUnit}}),
-            (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeComparisonName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "equalTo"),
-                Core.fieldTerm = Core.TermUnit}}))])})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "compose match with other functions",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "comp"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lessThan"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "equalTo"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "greaterThan"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "comp"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "comp"),
-          Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeComparisonName)),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lessThan"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just Core.TypeUnit),
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "equalTo"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just Core.TypeUnit),
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "greaterThan"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = (Just Core.TypeUnit),
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "comp"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match in lambda body",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "unionValue"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "int"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "i"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "i"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "float"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "unionValue"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "unionValue"),
-          Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeNumberName)),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = TestTypes.testTypeNumberName,
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "int"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "i"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "i"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "float"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "unionValue"))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeNumberName),
-          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-recursiveUnionEliminationsTests :: Testing.TestGroup
-recursiveUnionEliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Recursive union eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "match HydraType recursively",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeHydraTypeName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "literal"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "lit"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeHydraLiteralTypeName,
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "boolean"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "b"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "lit"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "list"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "nested"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "list"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeHydraTypeName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "literal"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "lit"),
-                Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeHydraLiteralTypeName)),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeHydraLiteralTypeName,
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "boolean"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "b"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "lit"))}))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "list"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "nested"),
-                Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeHydraTypeName)),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "list"))})))}]})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeHydraTypeName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-wrappedTermsTests :: Testing.TestGroup
-wrappedTermsTests = Testing.TestGroup {
-  Testing.testGroupName = "Wrapped terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    monomorphicWrappedTermsTests,
-    polymorphicWrappedTermsTests,
-    wrappedTermsInComplexContextsTests,
-    nestedWrappedTermsTests,
-    multipleWrappingLevelsTests,
-    multiParameterPolymorphicWrappersTests],
-  Testing.testGroupCases = []}
-
-monomorphicWrappedTermsTests :: Testing.TestGroup
-monomorphicWrappedTermsTests = Testing.TestGroup {
-  Testing.testGroupName = "Monomorphic wrapped terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "string alias",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hello"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hello"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped integer",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrapped"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrapped"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}), (Core.TermLiteral (Core.LiteralString "second")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}), (Core.TermLiteral (Core.LiteralString "second")))),
-            Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicWrappedTermsTests :: Testing.TestGroup
-polymorphicWrappedTermsTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic wrapped terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic wrapper with int",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-          Core.wrappedTermBody = (Core.TermList [
-            Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-            (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic wrapper with string",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-          Core.wrappedTermBody = (Core.TermList [
-            Core.TermLiteral (Core.LiteralString "a"),
-            (Core.TermLiteral (Core.LiteralString "b"))])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "polymorphic wrapper from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermVariable (Core.Name "x")])}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "x"),
-            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-            Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-                Core.wrappedTermBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x")])})),
-              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-wrappedTermsInComplexContextsTests :: Testing.TestGroup
-wrappedTermsInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Wrapped terms in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped in record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
-          Core.recordTypeName = TestTypes.testTypePersonName,
-          Core.recordFields = [
-            Core.Field {
-              Core.fieldName = (Core.Name "firstName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "lastName"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
-            Core.Field {
-              Core.fieldName = (Core.Name "age"),
-              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "alias"),
-              Core.bindingTerm = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "test"))})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "alias"))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "alias"),
-              Core.bindingTerm = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "test"))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermVariable (Core.Name "alias"))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped in list",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}),
-          (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "second"))}))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}),
-          (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "second"))}))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeVariable TestTypes.testTypeStringAliasName))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-nestedWrappedTermsTests :: Testing.TestGroup
-nestedWrappedTermsTests = Testing.TestGroup {
-  Testing.testGroupName = "Nested wrapped terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-          Core.wrappedTermBody = (Core.TermList [
-            Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})])})),
-          Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-          Core.applicationTypeArgument = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped optional",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-          Core.wrappedTermBody = (Core.TermList [
-            Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])})),
-          Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-          Core.applicationTypeArgument = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-          Core.wrappedTermBody = (Core.TermList [
-            Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])])})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])])})),
-          Core.typeApplicationTermType = (Core.TypeMap (Core.MapType {
-            Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-          Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
-            Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multipleWrappingLevelsTests :: Testing.TestGroup
-multipleWrappingLevelsTests = Testing.TestGroup {
-  Testing.testGroupName = "Multiple wrapping levels",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "wrapped in optional",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrapped"))})))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-          Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrapped"))})))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeVariable TestTypes.testTypeStringAliasName))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "list of wrapped polymorphic",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermList [
-          Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])}),
-          (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])}))]),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
-          Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-              Core.wrappedTermBody = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
-          (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-              Core.wrappedTermBody = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))]),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multiParameterPolymorphicWrappersTests :: Testing.TestGroup
-multiParameterPolymorphicWrappersTests = Testing.TestGroup {
-  Testing.testGroupName = "Multi-parameter polymorphic wrappers",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "symmetric triple wrapping simple types",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-          Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
-          Core.wrappedTermBody = (Core.TermRecord (Core.Record {
-            Core.recordTypeName = TestTypes.testTypeTripleName,
-            Core.recordFields = [
-              Core.Field {
-                Core.fieldName = (Core.Name "first"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-              Core.Field {
-                Core.fieldName = (Core.Name "second"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "edge"))},
-              Core.Field {
-                Core.fieldName = (Core.Name "third"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
-              Core.wrappedTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = TestTypes.testTypeTripleName,
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "first"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "second"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "edge"))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "third"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]})),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "symmetric triple from lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "v1"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "e"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "v2"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
-                Core.wrappedTermBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeTripleName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "first"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "v1"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "second"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "e"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "third"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "v2"))}]}))}))})))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "v1"),
-              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "e"),
-                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v2"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-                        Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
-                        Core.wrappedTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                                Core.recordTypeName = TestTypes.testTypeTripleName,
-                                Core.recordFields = [
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "first"),
-                                    Core.fieldTerm = (Core.TermVariable (Core.Name "v1"))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "second"),
-                                    Core.fieldTerm = (Core.TermVariable (Core.Name "e"))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "third"),
-                                    Core.fieldTerm = (Core.TermVariable (Core.Name "v2"))}]})),
-                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))})))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "symmetric triple with nested polymorphic types and foldl",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "sumList"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "lst"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "acc"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "lst"))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "nums1"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "nums2"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
-                Core.wrappedTermBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeTripleName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "first"),
-                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "sumList")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "nums1"))}))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "second"),
-                      Core.fieldTerm = (Core.TermList [
-                        Core.TermVariable (Core.Name "nums1"),
-                        (Core.TermVariable (Core.Name "nums2"))])},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "third"),
-                      Core.fieldTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "sumList")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "nums2"))}))}]}))}))})))})))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "sumList"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "lst"),
-                Core.lambdaDomain = (Just (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "acc"),
-                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "lst"))}))}))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "nums1"),
-            Core.lambdaDomain = (Just (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))),
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "nums2"),
-              Core.lambdaDomain = (Just (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))),
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-                    Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
-                    Core.wrappedTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                            Core.recordTypeName = TestTypes.testTypeTripleName,
-                            Core.recordFields = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "first"),
-                                Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "sumList")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "nums1"))}))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "second"),
-                                Core.fieldTerm = (Core.TermList [
-                                  Core.TermVariable (Core.Name "nums1"),
-                                  (Core.TermVariable (Core.Name "nums2"))])},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "third"),
-                                Core.fieldTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "sumList")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "nums2"))}))}]})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                        Core.typeApplicationTermType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
-                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))}))})))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationTypeArgument = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-wrapEliminationsTests :: Testing.TestGroup
-wrapEliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Wrap eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    monomorphicUnwrappingTests,
-    polymorphicUnwrappingTests,
-    unwrapEliminationsInApplicationsTests,
-    unwrapInComplexContextsTests,
-    multiParameterPolymorphicUnwrappersTests,
-    chainedUnwrappingTests,
-    multipleUnwrapOperationsTests],
-  Testing.testGroupCases = []}
-
-monomorphicUnwrappingTests :: Testing.TestGroup
-monomorphicUnwrappingTests = Testing.TestGroup {
-  Testing.testGroupName = "Monomorphic unwrapping",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap string alias",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-polymorphicUnwrappingTests :: Testing.TestGroup
-polymorphicUnwrappingTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphic unwrapping",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap polymorphic wrapper",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
-            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unwrapEliminationsInApplicationsTests :: Testing.TestGroup
-unwrapEliminationsInApplicationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Unwrap eliminations in applications",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap applied to wrapped term",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-          Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-          Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-            Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap polymorphic applied",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
-          Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-            Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-            Core.wrappedTermBody = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
-          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
-              Core.wrappedTermBody = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-unwrapInComplexContextsTests :: Testing.TestGroup
-unwrapInComplexContextsTests = Testing.TestGroup {
-  Testing.testGroupName = "Unwrap in complex contexts",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap in let binding",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "unwrapper"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "wrapped"),
-              Core.bindingTerm = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "test"))})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "unwrapper")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "unwrapper"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeSchemeConstraints = Nothing}))},
-            Core.Binding {
-              Core.bindingName = (Core.Name "wrapped"),
-              Core.bindingTerm = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "test"))})),
-              Core.bindingType = (Just (Core.TypeScheme {
-                Core.typeSchemeVariables = [],
-                Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-                Core.typeSchemeConstraints = Nothing}))}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "unwrapper")),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap in tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName)), (Core.TermLiteral (Core.LiteralString "context")))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName)), (Core.TermLiteral (Core.LiteralString "context")))),
-            Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
-          Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap in lambda",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "wrapped"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "wrapped"),
-          Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeStringAliasName)),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multiParameterPolymorphicUnwrappersTests :: Testing.TestGroup
-multiParameterPolymorphicUnwrappersTests = Testing.TestGroup {
-  Testing.testGroupName = "Multi-parameter polymorphic unwrappers",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap symmetric triple to tuple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "st"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeTripleName,
-              Core.projectionField = (Core.Name "first")})))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}), (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeTripleName,
-              Core.projectionField = (Core.Name "third")})))),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "st"),
-              Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                            Core.projectionTypeName = TestTypes.testTypeTripleName,
-                            Core.projectionField = (Core.Name "first")})))),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}), (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                            Core.projectionTypeName = TestTypes.testTypeTripleName,
-                            Core.projectionField = (Core.Name "third")})))),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))})))),
-                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap and collect edges in set",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "getEdge"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "st"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = TestTypes.testTypeTripleName,
-                    Core.projectionField = (Core.Name "second")})))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "triples"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "getEdge"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "triples"))}))})))})),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "getEdge"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t2"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t3"),
-                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "st"),
-                        Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                  Core.projectionTypeName = TestTypes.testTypeTripleName,
-                                  Core.projectionField = (Core.Name "second")})))),
-                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
-                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
-                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
-                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
-                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))})))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t2",
-                      (Core.Name "t3")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))})),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "triples"),
-                Core.lambdaDomain = (Just (Core.TypeSet (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})))),
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                        Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                    Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "getEdge")),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "triples"))}))})))}))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeSet (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-              Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap with maybe to handle optional symmetric triple",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "mst"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "st"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = TestTypes.testTypeTripleName,
-                    Core.projectionField = (Core.Name "second")})))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))))})))})),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "mst"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-            Core.typeLambdaParameter = (Core.Name "t1"),
-            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "mst"),
-              Core.lambdaDomain = (Just (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})))),
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                        Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))})),
-                      Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
-                    Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "st"),
-                    Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-                    Core.lambdaBody = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                              Core.projectionTypeName = TestTypes.testTypeTripleName,
-                              Core.projectionField = (Core.Name "second")})))),
-                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
-                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))))})))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "mst"))}))})))}))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-            Core.forallTypeParameter = (Core.Name "t1"),
-            Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-              Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-chainedUnwrappingTests :: Testing.TestGroup
-chainedUnwrappingTests = Testing.TestGroup {
-  Testing.testGroupName = "Chained unwrapping",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap then process",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "wrapped"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " suffix"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "wrapped"),
-          Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeStringAliasName)),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))})),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " suffix"))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap polymorphic then map",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "wrappedList"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedList"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "wrappedList"),
-          Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
-                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedList"))}))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-multipleUnwrapOperationsTests :: Testing.TestGroup
-multipleUnwrapOperationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Multiple unwrap operations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "unwrap different types",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "stringWrapped"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "listWrapped"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "stringWrapped"))}), (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "listWrapped"))}))))})))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "stringWrapped"),
-            Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeStringAliasName)),
-            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "listWrapped"),
-              Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stringWrapped"))}), (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "listWrapped"))})))),
-                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))})))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-eliminationsTests :: Testing.TestGroup
-eliminationsTests = Testing.TestGroup {
-  Testing.testGroupName = "Eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    recordEliminationsTests,
-    unionEliminationsTests,
-    wrapEliminationsTests],
-  Testing.testGroupCases = []}
-
-projectionsWithVariablesTests :: Testing.TestGroup
-projectionsWithVariablesTests = Testing.TestGroup {
-  Testing.testGroupName = "Projections with variables",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project from lambda parameter",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "person"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "person"),
-          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "Person"))),
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "project from polymorphic lambda parameter",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "coords"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.projectionField = (Core.Name "lat")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
-          Core.typeLambdaParameter = (Core.Name "t0"),
-          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "coords"),
-            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
-            Core.lambdaBody = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
-                  Core.projectionField = (Core.Name "lat")})))),
-                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))})))})),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
-          Core.forallTypeParameter = (Core.Name "t0"),
-          Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "multiple projections from same record",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
-        Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "person"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}), (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "lastName")})))),
-            Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))))}))),
-        Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "person"),
-          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "Person"))),
-          Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = TestTypes.testTypePersonName,
-                  Core.projectionField = (Core.Name "firstName")})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}), (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = TestTypes.testTypePersonName,
-                  Core.projectionField = (Core.Name "lastName")})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))})))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))),
-        Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
-          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nominal types",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        recordsTests,
+        unionsTests,
+        wrappedTermsTests,
+        eliminationsTests],
+      Testing.testGroupCases = []}
+
+chainedUnwrappingTests :: Testing.TestGroup
+chainedUnwrappingTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Chained unwrapping",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap then process",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "wrapped"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " suffix"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "wrapped"),
+              Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeStringAliasName)),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))})),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " suffix"))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap polymorphic then map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "wrappedList"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedList"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "wrappedList"),
+              Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "wrappedList"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+eliminationsTests :: Testing.TestGroup
+eliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        recordEliminationsTests,
+        unionEliminationsTests,
+        wrapEliminationsTests],
+      Testing.testGroupCases = []}
+
+higherOrderRecordProjectionsTests :: Testing.TestGroup
+higherOrderRecordProjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Higher-order record projections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map projection over list of records",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")}))))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}),
+                (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")}))))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}),
+                (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))])})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map polymorphic projection",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.projectionField = (Core.Name "lat")}))))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lat"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lon"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]}),
+                (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lat"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 34)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lon"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-118))))}]}))])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                      Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                    Core.projectionField = (Core.Name "lat")})))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lat"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lon"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
+                (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lat"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 34)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lon"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-118))))}]})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))])})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "filter using projection",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "person"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypePersonName,
+                          Core.projectionField = (Core.Name "age")})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}))})))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 35)))}]}),
+                (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+                  Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "person"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypePersonName,
+                          Core.projectionField = (Core.Name "age")})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}))})))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 35)))}]}),
+                (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))])})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeVariable TestTypes.testTypePersonName))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+higherOrderUnionEliminationsTests :: Testing.TestGroup
+higherOrderUnionEliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Higher-order union eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "map match over list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lessThan"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "equalTo"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "greaterThan"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]}))))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeComparisonName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = Core.TermUnit}}),
+                (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeComparisonName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "equalTo"),
+                    Core.fieldTerm = Core.TermUnit}}))])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeComparisonName)})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lessThan"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just Core.TypeUnit),
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "equalTo"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just Core.TypeUnit),
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "greaterThan"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just Core.TypeUnit),
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]}))))})),
+              Core.applicationArgument = (Core.TermList [
+                Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeComparisonName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = Core.TermUnit}}),
+                (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeComparisonName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "equalTo"),
+                    Core.fieldTerm = Core.TermUnit}}))])})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "compose match with other functions",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "comp"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lessThan"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "equalTo"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "greaterThan"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "comp"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "comp"),
+              Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeComparisonName)),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lessThan"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just Core.TypeUnit),
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "equalTo"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just Core.TypeUnit),
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "greaterThan"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just Core.TypeUnit),
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "comp"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match in lambda body",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "unionValue"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "int"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "i"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "i"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "float"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "unionValue"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "unionValue"),
+              Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeNumberName)),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "int"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "i"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "i"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "float"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "unionValue"))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeNumberName),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+monomorphicRecordsTests :: Testing.TestGroup
+monomorphicRecordsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Monomorphic records",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "latlon record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "LatLon"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lat"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lon"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-155.6659))))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "LatLon"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lat"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lon"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-155.6659))))}]})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable (Core.Name "LatLon"))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "latlon with variable",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLon"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLon"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
+              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "LatLon"))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "person record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Person"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Person"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable (Core.Name "Person"))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Unit"),
+              Core.recordFields = []})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Unit"),
+              Core.recordFields = []})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable (Core.Name "Unit"))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "person with variables",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "name"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "age"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Person"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermVariable (Core.Name "age"))}]}))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "name"),
+              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "age"),
+                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Core.lambdaBody = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Person"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermVariable (Core.Name "name"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermVariable (Core.Name "age"))}]}))})))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "Person"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+monomorphicUnwrappingTests :: Testing.TestGroup
+monomorphicUnwrappingTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Monomorphic unwrapping",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap string alias",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+monomorphicWrappedTermsTests :: Testing.TestGroup
+monomorphicWrappedTermsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Monomorphic wrapped terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "string alias",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hello"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hello"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped integer",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrapped"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrapped"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}), (Core.TermLiteral (Core.LiteralString "second")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}), (Core.TermLiteral (Core.LiteralString "second")))),
+                Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multiParameterPolymorphicCaseStatementsTests :: Testing.TestGroup
+multiParameterPolymorphicCaseStatementsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multi-parameter polymorphic case statements",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "case Either converting both to string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeEitherName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "left"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "right"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypeEitherName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "left"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "right"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}]})))),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "case Either applied to injection",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                Core.caseStatementTypeName = TestTypes.testTypeEitherName,
+                Core.caseStatementDefault = Nothing,
+                Core.caseStatementCases = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "left"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "n"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "right"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}]})))),
+              Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeEitherName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "left"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypeEitherName,
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "left"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "n"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "right"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "s"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}]})))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypeEitherName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "left"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "case Either with Triple and nested projections",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "triple"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypeEitherName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "left"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "coords"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                            Core.projectionField = (Core.Name "lat")})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "right"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "t"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypeTripleName,
+                            Core.projectionField = (Core.Name "first")})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))}]})))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypeTripleName,
+                    Core.projectionField = (Core.Name "second")})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "triple"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t2"),
+                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t3"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t4"),
+                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "triple"),
+                        Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                            Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
+                              Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))}))})),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))}))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = TestTypes.testTypeEitherName,
+                                Core.caseStatementDefault = Nothing,
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "left"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "coords"),
+                                      Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                            Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                                            Core.projectionField = (Core.Name "lat")})))),
+                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))})))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "right"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "t"),
+                                      Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))),
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                                Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                                Core.projectionField = (Core.Name "first")})))),
+                                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
+                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))}]})))),
+                              Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
+                            Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))})),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                    Core.projectionField = (Core.Name "second")})))),
+                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                    Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
+                                  Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))}))})),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t4"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "triple"))}))}))})))}))}))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "t2"),
+                  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.Name "t3"),
+                    Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                      Core.forallTypeParameter = (Core.Name "t4"),
+                      Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                            Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
+                              Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))}))})),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))})),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "case Either with polymorphic let bindings",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "makeLeft"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = TestTypes.testTypeEitherName,
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "left"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "makeRight"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = TestTypes.testTypeEitherName,
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "right"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "y"))}}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "flag"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypeEitherName,
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "left"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "n"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "makeRight")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "right"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "s"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "makeLeft")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))}))})))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "makeLeft"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                        Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = TestTypes.testTypeEitherName,
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "left"),
+                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}})),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))}))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0",
+                      (Core.Name "t1")],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "makeRight"),
+                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t0"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                        Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = TestTypes.testTypeEitherName,
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "right"),
+                                Core.fieldTerm = (Core.TermVariable (Core.Name "y"))}})),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))}))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [
+                      Core.Name "t0",
+                      (Core.Name "t1")],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "flag"),
+                Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))),
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeEitherName,
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "left"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "n"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "makeRight")),
+                                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "right"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "s"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "makeLeft")),
+                                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))})))}]})))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "flag"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multiParameterPolymorphicInjectionsTests :: Testing.TestGroup
+multiParameterPolymorphicInjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multi-parameter polymorphic injections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either left with int",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeEitherName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "left"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypeEitherName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "left"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either right with string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeEitherName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "right"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypeEitherName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "right"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "hello"))}})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either containing LatLonPoly in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeEitherName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "right"),
+                Core.fieldTerm = (Core.TermList [
+                  Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lat"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lon"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]})])}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypeEitherName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "right"),
+                      Core.fieldTerm = (Core.TermList [
+                        Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "lat"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "lon"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]})),
+                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})])}})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.typeApplicationTermType = (Core.TypeList (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.applicationTypeArgument = (Core.TypeList (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "either in triple in map with shared type variables",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x0"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x1"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x2"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralString "key"), (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeTripleName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "first"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = TestTypes.testTypeEitherName,
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "left"),
+                              Core.fieldTerm = (Core.TermVariable (Core.Name "x0"))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "second"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = TestTypes.testTypeEitherName,
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "left"),
+                              Core.fieldTerm = (Core.TermVariable (Core.Name "x0"))}}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "third"),
+                          Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                            Core.injectionTypeName = TestTypes.testTypeEitherName,
+                            Core.injectionField = Core.Field {
+                              Core.fieldName = (Core.Name "right"),
+                              Core.fieldTerm = (Core.TermVariable (Core.Name "x1"))}}))}]})))]))})))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t2"),
+                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t3"),
+                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t4"),
+                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t5"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x0"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x1"),
+                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x2"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
+                              Core.lambdaBody = (Core.TermMap (M.fromList [
+                                (Core.TermLiteral (Core.LiteralString "key"), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                      Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                                        Core.recordTypeName = TestTypes.testTypeTripleName,
+                                        Core.recordFields = [
+                                          Core.Field {
+                                            Core.fieldName = (Core.Name "first"),
+                                            Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                                Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = TestTypes.testTypeEitherName,
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "left"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x0"))}})),
+                                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))}))},
+                                          Core.Field {
+                                            Core.fieldName = (Core.Name "second"),
+                                            Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                                Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = TestTypes.testTypeEitherName,
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "left"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x0"))}})),
+                                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t4"))}))},
+                                          Core.Field {
+                                            Core.fieldName = (Core.Name "third"),
+                                            Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                                Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                                                  Core.injectionTypeName = TestTypes.testTypeEitherName,
+                                                  Core.injectionField = Core.Field {
+                                                    Core.fieldName = (Core.Name "right"),
+                                                    Core.fieldTerm = (Core.TermVariable (Core.Name "x1"))}})),
+                                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t5"))})),
+                                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))}]})),
+                                      Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))})),
+                                    Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))}))})),
+                                  Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t5"))})),
+                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})))]))})))})))})))}))}))}))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "t2"),
+                  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.Name "t3"),
+                    Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                      Core.forallTypeParameter = (Core.Name "t4"),
+                      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                        Core.forallTypeParameter = (Core.Name "t5"),
+                        Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                              Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                                Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.mapTypeValues = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                                      Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))})),
+                                    Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t4"))}))})),
+                                  Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeEitherName),
+                                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t5"))})),
+                                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multiParameterPolymorphicProjectionsTests :: Testing.TestGroup
+multiParameterPolymorphicProjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multi-parameter polymorphic projections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project first from Triple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeTripleName,
+              Core.projectionField = (Core.Name "first")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t2"),
+                  Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypeTripleName,
+                          Core.projectionField = (Core.Name "first")})))),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))}))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "t2"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project second from Triple applied",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypeTripleName,
+                Core.projectionField = (Core.Name "second")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypeTripleName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "first"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "second"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "third"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}]}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = TestTypes.testTypeTripleName,
+                      Core.projectionField = (Core.Name "second")})))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+              Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeTripleName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "first"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "second"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "third"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}]})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project from Triple and use second field, which is another polymorphic record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "triple"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "key"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "person"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "p"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermMaybe Nothing)})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "other"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "m"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "key"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))})))}]})))),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = TestTypes.testTypeTripleName,
+                      Core.projectionField = (Core.Name "second")})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "triple"))}))}))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t2"),
+                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "t3"),
+                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "triple"),
+                      Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+                            Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
+                              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
+                              Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))}))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))),
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "key"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "person"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "p"),
+                                    Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
+                                    Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                      Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))}))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "other"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "m"),
+                                    Core.lambdaDomain = (Just (Core.TypeMap (Core.MapType {
+                                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
+                                      Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))),
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "key"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))})))}]})))),
+                            Core.typeApplicationTermType = (Core.TypeMap (Core.MapType {
+                              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
+                              Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))})),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                    Core.projectionField = (Core.Name "second")})))),
+                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+                                  Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
+                                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
+                                    Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))}))})),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "triple"))}))}))})))})))}))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "t2"),
+                  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.Name "t3"),
+                    Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeTripleName),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+                            Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
+                              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t1")),
+                              Core.mapTypeValues = (Core.TypeVariable (Core.Name "t2"))}))}))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))})),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t2")))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multiParameterPolymorphicRecordsTests :: Testing.TestGroup
+multiParameterPolymorphicRecordsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multi-parameter polymorphic records",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "triple with three monomorphic types",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Triple"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "first"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "second"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "third"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "Triple"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "first"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "second"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "third"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}]})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "Triple")),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "triple with PersonOrSomething containing map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "k"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "v"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Triple"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "first"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "prefix"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "second"),
+                      Core.fieldTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "other"),
+                          Core.fieldTerm = (Core.TermMap (M.fromList [
+                            (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))}}))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "third"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}]}))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "k"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "v"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = (Core.Name "Triple"),
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "first"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "prefix"))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "second"),
+                                Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                                    Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                                    Core.injectionField = Core.Field {
+                                      Core.fieldName = (Core.Name "other"),
+                                      Core.fieldTerm = (Core.TermMap (M.fromList [
+                                        (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))}})),
+                                  Core.typeApplicationTermType = (Core.TypeMap (Core.MapType {
+                                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                                    Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "third"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}]})),
+                          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                        Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "PersonOrSomething")),
+                          Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
+                            Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                            Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "Triple")),
+                          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+                        Core.applicationTypeArgument = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "PersonOrSomething")),
+                          Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
+                            Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                            Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                      Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multiParameterPolymorphicUnwrappersTests :: Testing.TestGroup
+multiParameterPolymorphicUnwrappersTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multi-parameter polymorphic unwrappers",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap symmetric triple to tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "st"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeTripleName,
+                  Core.projectionField = (Core.Name "first")})))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}), (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeTripleName,
+                  Core.projectionField = (Core.Name "third")})))),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "st"),
+                  Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
+                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                Core.projectionField = (Core.Name "first")})))),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}), (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                Core.projectionField = (Core.Name "third")})))),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))})))),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap and collect edges in set",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "getEdge"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "st"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                        Core.projectionTypeName = TestTypes.testTypeTripleName,
+                        Core.projectionField = (Core.Name "second")})))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "triples"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "getEdge"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "triples"))}))})))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "getEdge"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t2"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "t3"),
+                          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "st"),
+                            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))}))),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                      Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                      Core.projectionField = (Core.Name "second")})))),
+                                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
+                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
+                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
+                                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t2"))})),
+                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t3"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))})))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t2",
+                          (Core.Name "t3")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t2"))})),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t3"))})),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "triples"),
+                    Core.lambdaDomain = (Just (Core.TypeSet (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                            Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                        Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "getEdge")),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "triples"))}))})))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeSet (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
+                  Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap with maybe to handle optional symmetric triple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "mst"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "st"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                        Core.projectionTypeName = TestTypes.testTypeTripleName,
+                        Core.projectionField = (Core.Name "second")})))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))))})))})),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "mst"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "mst"),
+                  Core.lambdaDomain = (Just (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})))),
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                            Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))})),
+                          Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))})),
+                        Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "st"),
+                        Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
+                        Core.lambdaBody = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                  Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                  Core.projectionField = (Core.Name "second")})))),
+                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeSymmetricTripleName))),
+                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "st"))}))}))))})))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "mst"))}))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
+                  Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multiParameterPolymorphicWrappersTests :: Testing.TestGroup
+multiParameterPolymorphicWrappersTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multi-parameter polymorphic wrappers",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "symmetric triple wrapping simple types",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
+              Core.wrappedTermBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = TestTypes.testTypeTripleName,
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "first"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "second"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "edge"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "third"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
+                  Core.wrappedTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = TestTypes.testTypeTripleName,
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "first"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "second"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "edge"))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "third"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]})),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "symmetric triple from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "v1"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "e"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "v2"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
+                    Core.wrappedTermBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeTripleName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "first"),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "v1"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "second"),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "e"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "third"),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "v2"))}]}))}))})))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                Core.typeLambdaParameter = (Core.Name "t1"),
+                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "v1"),
+                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "e"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v2"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                      Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                            Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
+                            Core.wrappedTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                                    Core.recordTypeName = TestTypes.testTypeTripleName,
+                                    Core.recordFields = [
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "first"),
+                                        Core.fieldTerm = (Core.TermVariable (Core.Name "v1"))},
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "second"),
+                                        Core.fieldTerm = (Core.TermVariable (Core.Name "e"))},
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "third"),
+                                        Core.fieldTerm = (Core.TermVariable (Core.Name "v2"))}]})),
+                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))}))})))})))})))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                Core.forallTypeParameter = (Core.Name "t1"),
+                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "symmetric triple with nested polymorphic types and foldl",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "sumList"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "lst"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "acc"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "lst"))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "nums1"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "nums2"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
+                    Core.wrappedTermBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeTripleName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "first"),
+                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "sumList")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "nums1"))}))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "second"),
+                          Core.fieldTerm = (Core.TermList [
+                            Core.TermVariable (Core.Name "nums1"),
+                            (Core.TermVariable (Core.Name "nums2"))])},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "third"),
+                          Core.fieldTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "sumList")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "nums2"))}))}]}))}))})))})))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "sumList"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "lst"),
+                    Core.lambdaDomain = (Just (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "acc"),
+                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "acc"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "lst"))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "nums1"),
+                Core.lambdaDomain = (Just (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))),
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "nums2"),
+                  Core.lambdaDomain = (Just (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))),
+                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                        Core.wrappedTermTypeName = TestTypes.testTypeSymmetricTripleName,
+                        Core.wrappedTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                                Core.recordTypeName = TestTypes.testTypeTripleName,
+                                Core.recordFields = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "first"),
+                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "sumList")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "nums1"))}))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "second"),
+                                    Core.fieldTerm = (Core.TermList [
+                                      Core.TermVariable (Core.Name "nums1"),
+                                      (Core.TermVariable (Core.Name "nums2"))])},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "third"),
+                                    Core.fieldTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "sumList")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "nums2"))}))}]})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                            Core.typeApplicationTermType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))})),
+                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))}))})))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeSymmetricTripleName),
+                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationTypeArgument = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multipleUnwrapOperationsTests :: Testing.TestGroup
+multipleUnwrapOperationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multiple unwrap operations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap different types",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "stringWrapped"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "listWrapped"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "stringWrapped"))}), (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "listWrapped"))}))))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "stringWrapped"),
+                Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeStringAliasName)),
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "listWrapped"),
+                  Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
+                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stringWrapped"))}), (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "listWrapped"))})))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))})))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+multipleWrappingLevelsTests :: Testing.TestGroup
+multipleWrappingLevelsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Multiple wrapping levels",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped in optional",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermMaybe (Just (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrapped"))})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermMaybe (Just (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "wrapped"))})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeMaybe (Core.TypeVariable TestTypes.testTypeStringAliasName))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "list of wrapped polymorphic",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])}),
+              (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])}))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                  Core.wrappedTermBody = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}),
+              (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                  Core.wrappedTermBody = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedUnionEliminationsTests :: Testing.TestGroup
+nestedUnionEliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested union eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nested match statements",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "person"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "p"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                        Core.projectionTypeName = TestTypes.testTypePersonName,
+                        Core.projectionField = (Core.Name "firstName")})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "other"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "int"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "i"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "float"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "f"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                Core.caseStatementDefault = Nothing,
+                Core.caseStatementCases = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "person"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "p"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypePersonName,
+                          Core.projectionField = (Core.Name "firstName")})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "other"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeNumberName)),
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "int"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "i"),
+                                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "float"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "f"),
+                                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}]})))),
+              Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeNumberName)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+                Core.applicationTypeArgument = (Core.TypeVariable TestTypes.testTypeNumberName)})),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lessThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "greaterThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})))}]}))), (Core.TermLiteral (Core.LiteralString "context")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lessThan"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just Core.TypeUnit),
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "equalTo"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just Core.TypeUnit),
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "greaterThan"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just Core.TypeUnit),
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})))}]}))), (Core.TermLiteral (Core.LiteralString "context")))),
+                Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
+                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
+                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+nestedWrappedTermsTests :: Testing.TestGroup
+nestedWrappedTermsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested wrapped terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+              Core.wrappedTermBody = (Core.TermList [
+                Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})])})),
+              Core.typeApplicationTermType = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+              Core.applicationTypeArgument = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped optional",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+              Core.wrappedTermBody = (Core.TermList [
+                Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])})),
+              Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+              Core.applicationTypeArgument = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped map",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+              Core.wrappedTermBody = (Core.TermList [
+                Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralString "key"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))])])})),
+              Core.typeApplicationTermType = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+              Core.applicationTypeArgument = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicRecordProjectionsAppliedTests :: Testing.TestGroup
+polymorphicRecordProjectionsAppliedTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic record projections applied",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project lat from LatLonPoly with int32",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                Core.projectionField = (Core.Name "lat")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLonPoly"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.projectionField = (Core.Name "lat")})))),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "LatLonPoly"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lat"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 40)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lon"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-74))))}]})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project lon from LatLonPoly with float64",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                Core.projectionField = (Core.Name "lon")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLonPoly"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 40.7128)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-74.006))))}]}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.projectionField = (Core.Name "lon")})))),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))})),
+              Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "LatLonPoly"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lat"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 40.7128)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lon"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-74.006))))}]})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project head from BuddyListA with string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                Core.projectionField = (Core.Name "head")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "BuddyListA"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "head"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "tail"),
+                    Core.fieldTerm = (Core.TermMaybe Nothing)}]}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                  Core.projectionField = (Core.Name "head")})))),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "BuddyListA"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "head"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "tail"),
+                      Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                        Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
+                          Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))}]})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicRecordProjectionsTests :: Testing.TestGroup
+polymorphicRecordProjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic record projections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project lat from polymorphic LatLonPoly",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+              Core.projectionField = (Core.Name "lat")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.projectionField = (Core.Name "lat")})))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project lon from polymorphic LatLonPoly",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+              Core.projectionField = (Core.Name "lon")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.projectionField = (Core.Name "lon")})))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project head from BuddyListA",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+              Core.projectionField = (Core.Name "head")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                  Core.projectionField = (Core.Name "head")})))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project tail from BuddyListA",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+              Core.projectionField = (Core.Name "tail")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                  Core.projectionField = (Core.Name "tail")})))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicRecordsTests :: Testing.TestGroup
+polymorphicRecordsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic records",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "latlon poly float",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "LatLonPoly"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lat"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lon"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-155.6659))))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLonPoly"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 19.5429)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-155.6659))))}]})),
+              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "latlon poly int64",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "LatLonPoly"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lat"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 195429)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lon"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1556659))))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLonPoly"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 195429)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1556659))))}]})),
+              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "latlon poly variable",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLonPoly"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "LatLonPoly"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lat"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lon"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "buddylist string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "BuddyListA"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "head"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "tail"),
+                  Core.fieldTerm = (Core.TermMaybe Nothing)}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "BuddyListA"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "head"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "first"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "tail"),
+                    Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                      Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
+                        Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))}]})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
+              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "buddylist variable",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "BuddyListA"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "head"),
+                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "tail"),
+                    Core.fieldTerm = (Core.TermMaybe Nothing)}]}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "BuddyListA"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                          Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}]})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicRecursiveUnionInjectionsTests :: Testing.TestGroup
+polymorphicRecursiveUnionInjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic recursive union injections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject boolean into UnionPolymorphicRecursive",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "bool"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "bool"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}})),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject string value into UnionPolymorphicRecursive",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "value"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "value"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject int value into UnionPolymorphicRecursive",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "value"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "value"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)))}})),
+              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicUnionEliminationsTests :: Testing.TestGroup
+polymorphicUnionEliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic union eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        simplePolymorphicUnionTests,
+        usingUnionPolymorphicRecursiveTests,
+        usingKernelTypesTests],
+      Testing.testGroupCases = []}
+
+polymorphicUnionInjectionsTests :: Testing.TestGroup
+polymorphicUnionInjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic union injections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject person into PersonOrSomething",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "person"),
+                Core.fieldTerm = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypePersonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "person"),
+                    Core.fieldTerm = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypePersonName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "firstName"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "lastName"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "age"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))}})),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject string into PersonOrSomething other variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "other"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "something else"))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "other"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "something else"))}})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject int into PersonOrSomething other variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "other"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "other"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicUnionsFromLambdaTests :: Testing.TestGroup
+polymorphicUnionsFromLambdaTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic unions from lambda",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda creating PersonOrSomething other variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "other"),
+                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "other"),
+                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda creating UnionPolymorphicRecursive value variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "value"),
+                  Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "value"),
+                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicUnwrappingTests :: Testing.TestGroup
+polymorphicUnwrappingTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic unwrapping",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap polymorphic wrapper",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+polymorphicWrappedTermsTests :: Testing.TestGroup
+polymorphicWrappedTermsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphic wrapped terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic wrapper with int",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+              Core.wrappedTermBody = (Core.TermList [
+                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic wrapper with string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+              Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+              Core.wrappedTermBody = (Core.TermList [
+                Core.TermLiteral (Core.LiteralString "a"),
+                (Core.TermLiteral (Core.LiteralString "b"))])})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic wrapper from lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermVariable (Core.Name "x")])}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                    Core.wrappedTermBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x")])})),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePolymorphicWrapperName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+projectionsWithVariablesTests :: Testing.TestGroup
+projectionsWithVariablesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Projections with variables",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project from lambda parameter",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "person"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "person"),
+              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "Person"))),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project from polymorphic lambda parameter",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "coords"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.projectionField = (Core.Name "lat")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "coords"),
+                Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                      Core.projectionField = (Core.Name "lat")})))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "multiple projections from same record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "person"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}), (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "lastName")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "person"),
+              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "Person"))),
+              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = TestTypes.testTypePersonName,
+                      Core.projectionField = (Core.Name "firstName")})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = TestTypes.testTypePersonName,
+                      Core.projectionField = (Core.Name "lastName")})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "person"))})))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+              Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+recordEliminationsTests :: Testing.TestGroup
+recordEliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Record eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        simpleRecordProjectionsTests,
+        recordProjectionsAppliedToRecordsTests,
+        polymorphicRecordProjectionsTests,
+        polymorphicRecordProjectionsAppliedTests,
+        recordProjectionsWithVariablesTests,
+        recordProjectionsInComplexContextsTests,
+        multiParameterPolymorphicProjectionsTests,
+        higherOrderRecordProjectionsTests,
+        recursiveRecordProjectionsTests,
+        recordProjectionsWithMutualRecursionTests,
+        projectionsWithVariablesTests],
+      Testing.testGroupCases = []}
+
+recordProjectionsAppliedToRecordsTests :: Testing.TestGroup
+recordProjectionsAppliedToRecordsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Record projections applied to records",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project firstName applied to person record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypePersonName,
+                Core.projectionField = (Core.Name "firstName")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "Person"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypePersonName,
+                Core.projectionField = (Core.Name "firstName")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "Person"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Alice"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Smith"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project age applied to person record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypePersonName,
+                Core.projectionField = (Core.Name "age")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "Person"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypePersonName,
+                Core.projectionField = (Core.Name "age")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "Person"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "firstName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lastName"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "age"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project lat applied to LatLon record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypeLatLonName,
+                Core.projectionField = (Core.Name "lat")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLon"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 40.7128)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-74.006))))}]}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypeLatLonName,
+                Core.projectionField = (Core.Name "lat")})))),
+              Core.applicationArgument = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "LatLon"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lat"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 40.7128)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lon"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-74.006))))}]}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+recordProjectionsInComplexContextsTests :: Testing.TestGroup
+recordProjectionsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Record projections in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "projection in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "person"),
+                  Core.bindingTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "Person"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "firstName"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Charlie"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lastName"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Brown"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "age"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 35)))}]})),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "getName"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypePersonName,
+                    Core.projectionField = (Core.Name "firstName")})))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "getName")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "person"),
+                  Core.bindingTerm = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "Person"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "firstName"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Charlie"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lastName"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Brown"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "age"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 35)))}]})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeVariable (Core.Name "Person")),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "getName"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypePersonName,
+                    Core.projectionField = (Core.Name "firstName")})))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "getName")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "projection in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypePersonName,
+              Core.projectionField = (Core.Name "firstName")}))), (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypePersonName,
+              Core.projectionField = (Core.Name "age")})))))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")}))), (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "age")})))))),
+                Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "projection in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypePersonName,
+                Core.projectionField = (Core.Name "firstName")}))),
+              (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypePersonName,
+                Core.projectionField = (Core.Name "lastName")}))))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypePersonName,
+                Core.projectionField = (Core.Name "firstName")}))),
+              (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                Core.projectionTypeName = TestTypes.testTypePersonName,
+                Core.projectionField = (Core.Name "lastName")}))))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+recordProjectionsWithMutualRecursionTests :: Testing.TestGroup
+recordProjectionsWithMutualRecursionTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Record projections with mutual recursion",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project head from BuddyListA",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+              Core.projectionField = (Core.Name "head")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                  Core.projectionField = (Core.Name "head")})))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project tail from BuddyListB",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeBuddyListBName,
+              Core.projectionField = (Core.Name "tail")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeBuddyListBName,
+                  Core.projectionField = (Core.Name "tail")})))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "chained projections across mutual recursion",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "listA"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "listB"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                          Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                          Core.projectionField = (Core.Name "tail")}))))})),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypeBuddyListBName,
+                          Core.projectionField = (Core.Name "tail")})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "listB"))}))}))})))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                    Core.projectionField = (Core.Name "tail")})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "listA"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "listA"),
+                Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                          Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))})),
+                        Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
+                      Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                        Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "listB"),
+                      Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                                Core.typeApplicationTermType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))})),
+                              Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
+                            Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                              Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+                          Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                              Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                              Core.projectionField = (Core.Name "tail")})))),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))})),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                              Core.projectionTypeName = TestTypes.testTypeBuddyListBName,
+                              Core.projectionField = (Core.Name "tail")})))),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "listB"))}))}))})))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                        Core.projectionTypeName = TestTypes.testTypeBuddyListAName,
+                        Core.projectionField = (Core.Name "tail")})))),
+                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "listA"))}))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListBName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+recordProjectionsWithVariablesTests :: Testing.TestGroup
+recordProjectionsWithVariablesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Record projections with variables",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project from lambda parameter",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "person"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "person"),
+              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "Person"))),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project from polymorphic lambda parameter",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "coords"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.projectionField = (Core.Name "lat")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "coords"),
+                Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = TestTypes.testTypeLatLonPolyName,
+                      Core.projectionField = (Core.Name "lat")})))),
+                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "coords"))}))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "multiple projections from same record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "person"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}), (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "lastName")})))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "person"),
+              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "Person"))),
+              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = TestTypes.testTypePersonName,
+                      Core.projectionField = (Core.Name "firstName")})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = TestTypes.testTypePersonName,
+                      Core.projectionField = (Core.Name "lastName")})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "person"))})))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+              Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+recordsInComplexContextsTests :: Testing.TestGroup
+recordsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Records in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "records in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Person"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}), (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "LatLon"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lat"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lon"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.0)))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Person"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "firstName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Bob"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lastName"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Jones"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "age"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}]}), (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "LatLon"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lat"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lon"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.0)))}]})))),
+                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "Person"))})),
+              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "LatLon"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "Person")),
+              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "LatLon"))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "poly records in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "LatLonPoly"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lat"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lon"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]}), (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "BuddyListA"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "head"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "tail"),
+                  Core.fieldTerm = (Core.TermMaybe Nothing)}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "LatLonPoly"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lat"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lon"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}), (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "BuddyListA"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                          Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListB")),
+                            Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))}]})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})))),
+                Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Core.typeApplicationTermType = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
+                Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "LatLonPoly")),
+                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.pairTypeSecond = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "BuddyListA")),
+                Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "recursive record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "IntList"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "head"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "tail"),
+                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "IntList"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 43)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "IntList"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "head"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "tail"),
+                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "IntList"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 43)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermMaybe Nothing),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "IntList"))}))}]}))))}]})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable (Core.Name "IntList"))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+recordsTests :: Testing.TestGroup
+recordsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Records",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        monomorphicRecordsTests,
+        polymorphicRecordsTests,
+        recordsInComplexContextsTests,
+        multiParameterPolymorphicRecordsTests],
+      Testing.testGroupCases = []}
+
+recursiveRecordProjectionsTests :: Testing.TestGroup
+recursiveRecordProjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Recursive record projections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "nested projection from recursive record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "intList"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypeIntListName,
+                    Core.projectionField = (Core.Name "head")}))))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypeIntListName,
+                    Core.projectionField = (Core.Name "tail")})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "intList"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "intList"),
+              Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeIntListName)),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeIntListName)})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypeIntListName,
+                    Core.projectionField = (Core.Name "head")}))))})),
+                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                    Core.projectionTypeName = TestTypes.testTypeIntListName,
+                    Core.projectionField = (Core.Name "tail")})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "intList"))}))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeIntListName),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+recursiveUnionEliminationsTests :: Testing.TestGroup
+recursiveUnionEliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Recursive union eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match HydraType recursively",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeHydraTypeName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "literal"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "lit"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeHydraLiteralTypeName,
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "boolean"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "b"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "s"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "lit"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "list"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "nested"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "list"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeHydraTypeName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "literal"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "lit"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeHydraLiteralTypeName)),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeHydraLiteralTypeName,
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "boolean"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "b"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "s"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "lit"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "list"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "nested"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeHydraTypeName)),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "list"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeHydraTypeName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+simplePolymorphicUnionTests :: Testing.TestGroup
+simplePolymorphicUnionTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Simple polymorphic unions",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match PersonOrSomething with string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "person"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "p"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                        Core.projectionTypeName = TestTypes.testTypePersonName,
+                        Core.projectionField = (Core.Name "firstName")})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "other"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                Core.caseStatementDefault = Nothing,
+                Core.caseStatementCases = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "person"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "p"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypePersonName,
+                          Core.projectionField = (Core.Name "firstName")})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "other"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+                Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match PersonOrSomething instantiated with string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                Core.caseStatementDefault = Nothing,
+                Core.caseStatementCases = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "person"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "p"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypePersonName,
+                          Core.projectionField = (Core.Name "firstName")})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "other"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
+              Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "other"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "person"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "p"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "other"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "other"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
+                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+simpleRecordProjectionsTests :: Testing.TestGroup
+simpleRecordProjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Simple record projections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project firstName from Person",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypePersonName,
+              Core.projectionField = (Core.Name "firstName")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypePersonName,
+              Core.projectionField = (Core.Name "firstName")})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project lastName from Person",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypePersonName,
+              Core.projectionField = (Core.Name "lastName")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypePersonName,
+              Core.projectionField = (Core.Name "lastName")})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project age from Person",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypePersonName,
+              Core.projectionField = (Core.Name "age")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypePersonName,
+              Core.projectionField = (Core.Name "age")})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project lat from LatLon",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeLatLonName,
+              Core.projectionField = (Core.Name "lat")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeLatLonName,
+              Core.projectionField = (Core.Name "lat")})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "LatLon")),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "project lon from LatLon",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeLatLonName,
+              Core.projectionField = (Core.Name "lon")})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+              Core.projectionTypeName = TestTypes.testTypeLatLonName,
+              Core.projectionField = (Core.Name "lon")})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "LatLon")),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+simpleUnionInjectionsTests :: Testing.TestGroup
+simpleUnionInjectionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Simple union injections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject into Comparison lessThan variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeComparisonName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "lessThan"),
+                Core.fieldTerm = Core.TermUnit}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeComparisonName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "lessThan"),
+                Core.fieldTerm = Core.TermUnit}})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeComparisonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject into Comparison equalTo variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeComparisonName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "equalTo"),
+                Core.fieldTerm = Core.TermUnit}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeComparisonName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "equalTo"),
+                Core.fieldTerm = Core.TermUnit}})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeComparisonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject into Comparison greaterThan variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeComparisonName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "greaterThan"),
+                Core.fieldTerm = Core.TermUnit}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeComparisonName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "greaterThan"),
+                Core.fieldTerm = Core.TermUnit}})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeComparisonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+simpleUnitVariantEliminationsTests :: Testing.TestGroup
+simpleUnitVariantEliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Simple unit inject eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match Comparison with all cases",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lessThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "greaterThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lessThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just Core.TypeUnit),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just Core.TypeUnit),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "greaterThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just Core.TypeUnit),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match Comparison returning int32",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lessThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "greaterThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lessThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just Core.TypeUnit),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just Core.TypeUnit),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "greaterThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just Core.TypeUnit),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match applied to Comparison variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                Core.caseStatementDefault = Nothing,
+                Core.caseStatementCases = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "equalTo"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "greaterThan"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
+              Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeComparisonName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = Core.TermUnit}}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                Core.caseStatementDefault = Nothing,
+                Core.caseStatementCases = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just Core.TypeUnit),
+                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "equalTo"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just Core.TypeUnit),
+                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "greaterThan"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just Core.TypeUnit),
+                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
+              Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeComparisonName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = Core.TermUnit}}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unionEliminationsInComplexContextsTests :: Testing.TestGroup
+unionEliminationsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Union eliminations in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "matcher"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lessThan"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "equalTo"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "greaterThan"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "matcher"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "matcher"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lessThan"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just Core.TypeUnit),
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "equalTo"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just Core.TypeUnit),
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "greaterThan"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just Core.TypeUnit),
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "greater"))})))}]})))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "matcher"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match in record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                      Core.caseStatementDefault = Nothing,
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "person"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "p"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                Core.projectionTypeName = TestTypes.testTypePersonName,
+                                Core.projectionField = (Core.Name "firstName")})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "other"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "other"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))}}))}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "person"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "p"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                                  Core.projectionField = (Core.Name "firstName")})))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "other"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "other"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))}})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match with polymorphic result in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "person"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "p"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "age")})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "other"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
+                Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "other"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}}))}),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypePersonOrSomethingName,
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "person"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "p"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypePersonName)),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                              Core.projectionTypeName = TestTypes.testTypePersonName,
+                              Core.projectionField = (Core.Name "age")})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "p"))}))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "other"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]})))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "other"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))}})),
+                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}),
+              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unionEliminationsTests :: Testing.TestGroup
+unionEliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Union eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        simpleUnitVariantEliminationsTests,
+        unionEliminationsWithDataTests,
+        polymorphicUnionEliminationsTests,
+        unionEliminationsWithDefaultsTests,
+        nestedUnionEliminationsTests,
+        unionEliminationsInComplexContextsTests,
+        multiParameterPolymorphicCaseStatementsTests,
+        higherOrderUnionEliminationsTests,
+        recursiveUnionEliminationsTests],
+      Testing.testGroupCases = []}
+
+unionEliminationsWithDataTests :: Testing.TestGroup
+unionEliminationsWithDataTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Union eliminations with data",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match Number extracting int values",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "i"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "i"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "float"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "i"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "i"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "float"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeNumberName),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match Number converting to string",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "i"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "float"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "i"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "float"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeNumberName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match Number applied to int variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+                Core.caseStatementDefault = Nothing,
+                Core.caseStatementCases = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "int"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "i"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "i"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "float"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "f"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
+              Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeNumberName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+                Core.caseStatementDefault = Nothing,
+                Core.caseStatementCases = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "int"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "i"),
+                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "i"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "float"),
+                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "f"),
+                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))),
+                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
+              Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeNumberName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match Timestamp with mixed data types",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeTimestampName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "unixTimeMillis"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "millis"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint64"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "millis"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "date"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "dateStr"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "dateStr"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeTimestampName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "unixTimeMillis"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "millis"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint64"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "millis"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "date"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "dateStr"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "dateStr"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeTimestampName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unionEliminationsWithDefaultsTests :: Testing.TestGroup
+unionEliminationsWithDefaultsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Union eliminations with defaults",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match Comparison with default case",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "unknown"))),
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lessThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeComparisonName,
+              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "unknown"))),
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "lessThan"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just Core.TypeUnit),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "less"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "equalTo"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just Core.TypeUnit),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "equal"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeComparisonName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match Number with default case",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))),
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "i"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "i"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeNumberName,
+              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))),
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "i"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "i"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeNumberName),
+              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "match UnionMonomorphic with default",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "fallback"))),
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "bool"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "b"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "string"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "s"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "fallback"))),
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "bool"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "b"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeBoolean)),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "string"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "s"),
+                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unionInjectionsWithDataTests :: Testing.TestGroup
+unionInjectionsWithDataTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Union injections with data",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject into Number int variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeNumberName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "int"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeNumberName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "int"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeNumberName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject into Number float variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeNumberName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "float"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeNumberName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "float"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))}})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeNumberName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject into Timestamp unixTimeMillis variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeTimestampName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "unixTimeMillis"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1609459200000)))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeTimestampName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "unixTimeMillis"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1609459200000)))}})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeTimestampName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "inject into Timestamp date variant",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeTimestampName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "date"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "2021-01-01"))}})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeTimestampName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "date"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "2021-01-01"))}})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeTimestampName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unionsInComplexContextsTests :: Testing.TestGroup
+unionsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unions in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "union in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermUnion (Core.Injection {
+              Core.injectionTypeName = TestTypes.testTypeNumberName,
+              Core.injectionField = Core.Field {
+                Core.fieldName = (Core.Name "int"),
+                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}), (Core.TermLiteral (Core.LiteralString "context")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeNumberName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "int"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}), (Core.TermLiteral (Core.LiteralString "context")))),
+                Core.typeApplicationTermType = (Core.TypeVariable TestTypes.testTypeNumberName)})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeVariable TestTypes.testTypeNumberName),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "union in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeNumberName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}),
+              (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeNumberName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "float"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5)))}}))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeNumberName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}}),
+              (Core.TermUnion (Core.Injection {
+                Core.injectionTypeName = TestTypes.testTypeNumberName,
+                Core.injectionField = Core.Field {
+                  Core.fieldName = (Core.Name "float"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5)))}}))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeVariable TestTypes.testTypeNumberName))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "polymorphic union in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "value"),
+                  Core.bindingTerm = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "other"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "value"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "value"),
+                  Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = TestTypes.testTypePersonOrSomethingName,
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "other"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "test"))}})),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+                      Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "value"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypePersonOrSomethingName),
+              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unionsTests :: Testing.TestGroup
+unionsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unions",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        simpleUnionInjectionsTests,
+        unionInjectionsWithDataTests,
+        polymorphicUnionInjectionsTests,
+        polymorphicRecursiveUnionInjectionsTests,
+        polymorphicUnionsFromLambdaTests,
+        unionsInComplexContextsTests,
+        multiParameterPolymorphicInjectionsTests],
+      Testing.testGroupCases = []}
+
+unwrapEliminationsInApplicationsTests :: Testing.TestGroup
+unwrapEliminationsInApplicationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unwrap eliminations in applications",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap applied to wrapped term",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+              Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+              Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap polymorphic applied",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
+              Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                Core.wrappedTermBody = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypePolymorphicWrapperName))),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = TestTypes.testTypePolymorphicWrapperName,
+                  Core.wrappedTermBody = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+unwrapInComplexContextsTests :: Testing.TestGroup
+unwrapInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unwrap in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "unwrapper"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "wrapped"),
+                  Core.bindingTerm = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "test"))})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "unwrapper")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "unwrapper"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeSchemeConstraints = Nothing}))},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "wrapped"),
+                  Core.bindingTerm = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "test"))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "unwrapper")),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap in tuple",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName)), (Core.TermLiteral (Core.LiteralString "context")))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                Core.typeApplicationTermBody = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName)), (Core.TermLiteral (Core.LiteralString "context")))),
+                Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypePair (Core.PairType {
+              Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "unwrap in lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "wrapped"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "wrapped"),
+              Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeStringAliasName)),
+              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                Core.applicationArgument = (Core.TermVariable (Core.Name "wrapped"))}))}))),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+usingKernelTypesTests :: Testing.TestGroup
+usingKernelTypesTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Using kernel types",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "case statement on CoderDirection applied to argument",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "dir"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "coder"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "encode"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "_"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v12"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                  Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+                                  Core.projectionField = (Core.Name "encode")})))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "decode"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "_"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v12"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                  Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+                                  Core.projectionField = (Core.Name "decode")})))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))}]})))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "dir"))}))})))}))),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "dir"),
+                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection"))),
+                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "coder"),
+                  Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Coder")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
+                      Core.caseStatementDefault = Nothing,
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "encode"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "_"),
+                            Core.lambdaDomain = (Just Core.TypeUnit),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "v12"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.context.Context"))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+                                        Core.projectionField = (Core.Name "encode")})))),
+                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "decode"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "_"),
+                            Core.lambdaDomain = (Just Core.TypeUnit),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "v12"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.context.Context"))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                        Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+                                        Core.projectionField = (Core.Name "decode")})))),
+                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))}]})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "dir"))}))})))})))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Coder")),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.context.Context")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                        Core.eitherTypeLeft = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.context.InContext")),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "hydra.errors.Error"))})),
+                        Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))}))}))}))}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+usingUnionPolymorphicRecursiveTests :: Testing.TestGroup
+usingUnionPolymorphicRecursiveTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "using UnionPolymorphicRecursive",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "non-applied UnionPolymorphicRecursive",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "test"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                    Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "value"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "i"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "test"),
+                  Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "value"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "i"),
+                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                        Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "applied UnionPolymorphicRecursive with int32",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "test"),
+                  Core.bindingTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "value"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "i"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                    Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                      Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                      Core.injectionField = Core.Field {
+                        Core.fieldName = (Core.Name "value"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}}))})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "test"),
+                  Core.bindingTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                        Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "value"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "i"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "value"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeLiteral Core.LiteralTypeString)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "applied UnionPolymorphicRecursive with int32 in lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "test"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                        Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "value"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "i"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "test"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                      Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "value"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "i"),
+                                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                        Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeFunction (Core.FunctionType {
+              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "applied generic UnionPolymorphicRecursive in lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "test"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                        Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "value"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "ignored"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))}]})))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermTypeLambda (Core.TypeLambda {
+              Core.typeLambdaParameter = (Core.Name "t0"),
+              Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "test"),
+                    Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t1"),
+                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "value"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "ignored"),
+                                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))}]})))),
+                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+                    Core.bindingType = (Just (Core.TypeScheme {
+                      Core.typeSchemeVariables = [
+                        Core.Name "t1"],
+                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                      Core.typeSchemeConstraints = Nothing}))}],
+                Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "test")),
+                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeForall (Core.ForallType {
+              Core.forallTypeParameter = (Core.Name "t0"),
+              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+wrapEliminationsTests :: Testing.TestGroup
+wrapEliminationsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Wrap eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        monomorphicUnwrappingTests,
+        polymorphicUnwrappingTests,
+        unwrapEliminationsInApplicationsTests,
+        unwrapInComplexContextsTests,
+        multiParameterPolymorphicUnwrappersTests,
+        chainedUnwrappingTests,
+        multipleUnwrapOperationsTests],
+      Testing.testGroupCases = []}
+
+wrappedTermsInComplexContextsTests :: Testing.TestGroup
+wrappedTermsInComplexContextsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Wrapped terms in complex contexts",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped in record",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = TestTypes.testTypePersonName,
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "firstName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "lastName"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "age"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))}]})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypePersonName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped in let binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "alias"),
+                  Core.bindingTerm = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "test"))})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "alias"))})),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "alias"),
+                  Core.bindingTerm = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "test"))})),
+                  Core.bindingType = (Just (Core.TypeScheme {
+                    Core.typeSchemeVariables = [],
+                    Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+                    Core.typeSchemeConstraints = Nothing}))}],
+              Core.letBody = (Core.TermVariable (Core.Name "alias"))})),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "wrapped in list",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeChecking (Testing.TypeCheckingTestCase {
+            Testing.typeCheckingTestCaseInput = (Core.TermList [
+              Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}),
+              (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "second"))}))]),
+            Testing.typeCheckingTestCaseOutputTerm = (Core.TermList [
+              Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "first"))}),
+              (Core.TermWrap (Core.WrappedTerm {
+                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "second"))}))]),
+            Testing.typeCheckingTestCaseOutputType = (Core.TypeList (Core.TypeVariable TestTypes.testTypeStringAliasName))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+wrappedTermsTests :: Testing.TestGroup
+wrappedTermsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Wrapped terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        monomorphicWrappedTermsTests,
+        polymorphicWrappedTermsTests,
+        wrappedTermsInComplexContextsTests,
+        nestedWrappedTermsTests,
+        multipleWrappingLevelsTests,
+        multiParameterPolymorphicWrappersTests],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/EtaExpansion.hs b/src/gen-test/haskell/Hydra/Test/EtaExpansion.hs
--- a/src/gen-test/haskell/Hydra/Test/EtaExpansion.hs
+++ b/src/gen-test/haskell/Hydra/Test/EtaExpansion.hs
@@ -16,2240 +16,2221 @@
 
 -- | Test cases for eta expansion of terms
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "eta expansion",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Partial application of primitives",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [
-        Testing.TestGroup {
-          Testing.testGroupName = "Bare primitives are not expanded",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "unary primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "binary primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]},
-        Testing.TestGroup {
-          Testing.testGroupName = "Partially applied primitives expand with lambdas",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "binary primitive with one argument",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v1"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "ternary primitive with one argument",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v1"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v2"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "v2"))}))})))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]},
-        Testing.TestGroup {
-          Testing.testGroupName = "Fully applied primitives are not expanded",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "unary primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "FOO"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "FOO"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "binary primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a,b,c"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a,b,c"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]},
-        Testing.TestGroup {
-          Testing.testGroupName = "Record projections",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [
-            Testing.TestGroup {
-              Testing.testGroupName = "Bare projections expand with a lambda",
-              Testing.testGroupDescription = Nothing,
-              Testing.testGroupSubgroups = [],
-              Testing.testGroupCases = [
-                Testing.TestCaseWithMetadata {
-                  Testing.testCaseWithMetadataName = "projection without argument",
-                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypePersonName,
-                      Core.projectionField = (Core.Name "firstName")})))),
-                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                          Core.projectionTypeName = TestTypes.testTypePersonName,
-                          Core.projectionField = (Core.Name "firstName")})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
-                  Testing.testCaseWithMetadataDescription = Nothing,
-                  Testing.testCaseWithMetadataTags = []}]},
-            Testing.TestGroup {
-              Testing.testGroupName = "Applied projections are not expanded",
-              Testing.testGroupDescription = Nothing,
-              Testing.testGroupSubgroups = [],
-              Testing.testGroupCases = [
-                Testing.TestCaseWithMetadata {
-                  Testing.testCaseWithMetadataName = "projection with argument",
-                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                    Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "person"))})),
-                    Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
-                  Testing.testCaseWithMetadataDescription = Nothing,
-                  Testing.testCaseWithMetadataTags = []},
-                Testing.TestCaseWithMetadata {
-                  Testing.testCaseWithMetadataName = "projection applied to a record",
-                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                    Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")})))),
-                      Core.applicationArgument = (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = TestTypes.testTypePersonName,
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "firstName"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "lastName"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))}]}))})),
-                    Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")})))),
-                      Core.applicationArgument = (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = TestTypes.testTypePersonName,
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "firstName"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "lastName"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))}]}))}))})),
-                  Testing.testCaseWithMetadataDescription = Nothing,
-                  Testing.testCaseWithMetadataTags = []}]},
-            Testing.TestGroup {
-              Testing.testGroupName = "Projections nested in other structures",
-              Testing.testGroupDescription = Nothing,
-              Testing.testGroupSubgroups = [],
-              Testing.testGroupCases = [
-                Testing.TestCaseWithMetadata {
-                  Testing.testCaseWithMetadataName = "projection in a list",
-                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                    Testing.etaExpansionTestCaseInput = (Core.TermList [
-                      Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")}))),
-                      (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))]),
-                    Testing.etaExpansionTestCaseOutput = (Core.TermList [
-                      Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                            Core.projectionTypeName = TestTypes.testTypePersonName,
-                            Core.projectionField = (Core.Name "firstName")})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})),
-                      (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))])})),
-                  Testing.testCaseWithMetadataDescription = Nothing,
-                  Testing.testCaseWithMetadataTags = []},
-                Testing.TestCaseWithMetadata {
-                  Testing.testCaseWithMetadataName = "projection in a tuple",
-                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                    Testing.etaExpansionTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypePersonName,
-                      Core.projectionField = (Core.Name "firstName")}))), (Core.TermLiteral (Core.LiteralString "default")))),
-                    Testing.etaExpansionTestCaseOutput = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                          Core.projectionTypeName = TestTypes.testTypePersonName,
-                          Core.projectionField = (Core.Name "firstName")})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})), (Core.TermLiteral (Core.LiteralString "default"))))})),
-                  Testing.testCaseWithMetadataDescription = Nothing,
-                  Testing.testCaseWithMetadataTags = []},
-                Testing.TestCaseWithMetadata {
-                  Testing.testCaseWithMetadataName = "projection in let binding",
-                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "getter"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                            Core.projectionTypeName = TestTypes.testTypePersonName,
-                            Core.projectionField = (Core.Name "firstName")})))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermVariable (Core.Name "getter"))})),
-                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "getter"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "v1"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = TestTypes.testTypePersonName,
-                                Core.projectionField = (Core.Name "firstName")})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermVariable (Core.Name "getter"))}))})),
-                  Testing.testCaseWithMetadataDescription = Nothing,
-                  Testing.testCaseWithMetadataTags = []},
-                Testing.TestCaseWithMetadata {
-                  Testing.testCaseWithMetadataName = "projection in lambda body",
-                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")}))))}))),
-                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                            Core.projectionTypeName = TestTypes.testTypePersonName,
-                            Core.projectionField = (Core.Name "firstName")})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})),
-                  Testing.testCaseWithMetadataDescription = Nothing,
-                  Testing.testCaseWithMetadataTags = []}]},
-            Testing.TestGroup {
-              Testing.testGroupName = "Function-valued projections",
-              Testing.testGroupDescription = Nothing,
-              Testing.testGroupSubgroups = [],
-              Testing.testGroupCases = [
-                Testing.TestCaseWithMetadata {
-                  Testing.testCaseWithMetadataName = "projection of function-valued field applied to arguments should not be expanded",
-                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                    Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = TestTypes.testTypeTripleName,
-                                Core.projectionField = (Core.Name "first")})))),
-                              Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                                Core.recordTypeName = TestTypes.testTypeTripleName,
-                                Core.recordFields = [
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "first"),
-                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "second"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "third"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "last"))}]})),
-                              Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "DATA"))})),
-                    Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                Core.projectionTypeName = TestTypes.testTypeTripleName,
-                                Core.projectionField = (Core.Name "first")})))),
-                              Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
-                                Core.recordTypeName = TestTypes.testTypeTripleName,
-                                Core.recordFields = [
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "first"),
-                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "second"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "third"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "last"))}]})),
-                              Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "DATA"))}))})),
-                  Testing.testCaseWithMetadataDescription = Nothing,
-                  Testing.testCaseWithMetadataTags = []}]}],
-          Testing.testGroupCases = []}],
-      Testing.testGroupCases = []},
-    Testing.TestGroup {
-      Testing.testGroupName = "Polymorphic terms (System F)",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [
-        Testing.TestGroup {
-          Testing.testGroupName = "Type lambdas in let bindings",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "polymorphic identity function",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "id"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "id"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "monomorphic partially applied primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "partial"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "partial"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "partial"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "partial"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "monomorphic projection",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "getter"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")})))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "getter"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "getter"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                            Core.projectionTypeName = TestTypes.testTypePersonName,
-                            Core.projectionField = (Core.Name "firstName")})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "getter"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]},
-        Testing.TestGroup {
-          Testing.testGroupName = "Type applications of polymorphic bindings",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "polymorphic variable with type application",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "type application of identity applied to binary function with no arguments",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                      Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                      Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))}))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "type application of identity applied to partially applied binary function",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                      Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))}))}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                      Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))}))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "type application of identity applied to fully applied binary function",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                      Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo,bar"))}))}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                      Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo,bar"))}))}))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "type application of identity applied to binary function, then applied to one argument",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                        Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v1"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                            Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
-                          Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "type application of identity applied to binary function, then fully applied to two arguments",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                          Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                              Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo,bar"))}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "id"),
-                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "a"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [
-                          Core.Name "a"],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
-                          Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                              Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo,bar"))}))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]}],
-      Testing.testGroupCases = []},
-    Testing.TestGroup {
-      Testing.testGroupName = "Higher-Order Functions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [
-        Testing.TestGroup {
-          Testing.testGroupName = "Functions that return functions",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "lambda returning bare binary primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))}))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "lambda returning bare unary primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))}))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "lambda returning partially applied primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))}))}))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v1"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "lambda returning fully applied primitive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "lambda returning bare projection",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "person"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                    Core.projectionTypeName = TestTypes.testTypePersonName,
-                    Core.projectionField = (Core.Name "firstName")}))))}))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "person"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v1"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                        Core.projectionTypeName = TestTypes.testTypePersonName,
-                        Core.projectionField = (Core.Name "firstName")})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "nested lambdas with partial application in body",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "lambda returning lambda returning partial application",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "z"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "z"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]}],
-      Testing.testGroupCases = []},
-    Testing.TestGroup {
-      Testing.testGroupName = "Let terms",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [
-        Testing.TestGroup {
-          Testing.testGroupName = "partial application of a let-bound function",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "simple",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "helper"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "arg1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "arg2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "arg3"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                              Core.applicationArgument = (Core.TermList [
-                                Core.TermVariable (Core.Name "arg1"),
-                                (Core.TermVariable (Core.Name "arg2")),
-                                (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "helper"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "arg1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "arg2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "arg3"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                              Core.applicationArgument = (Core.TermList [
-                                Core.TermVariable (Core.Name "arg1"),
-                                (Core.TermVariable (Core.Name "arg2")),
-                                (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v1"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v2"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v2"))}))})))})))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "in a fold",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "helper"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "arg1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "arg2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "arg3"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                              Core.applicationArgument = (Core.TermList [
-                                Core.TermVariable (Core.Name "arg1"),
-                                (Core.TermVariable (Core.Name "arg2")),
-                                (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralString "bar"),
-                      (Core.TermLiteral (Core.LiteralString "baz"))])}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "helper"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "arg1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "arg2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "arg3"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                              Core.applicationArgument = (Core.TermList [
-                                Core.TermVariable (Core.Name "arg1"),
-                                (Core.TermVariable (Core.Name "arg2")),
-                                (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                            Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "v1"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "v2"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
-                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "v2"))}))})))})))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralString "bar"),
-                      (Core.TermLiteral (Core.LiteralString "baz"))])}))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "within another let binding",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "tryme"),
-                      Core.bindingTerm = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "helper"),
-                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "arg1"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "arg2"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "arg3"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                    Core.applicationArgument = (Core.TermList [
-                                      Core.TermVariable (Core.Name "arg1"),
-                                      (Core.TermVariable (Core.Name "arg2")),
-                                      (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [],
-                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = Core.TermUnit})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "tryme"),
-                      Core.bindingTerm = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "helper"),
-                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "arg1"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "arg2"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "arg3"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                                    Core.applicationArgument = (Core.TermList [
-                                      Core.TermVariable (Core.Name "arg1"),
-                                      (Core.TermVariable (Core.Name "arg2")),
-                                      (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [],
-                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "v1"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "v2"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
-                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "v2"))}))})))})))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = Core.TermUnit}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]}],
-      Testing.testGroupCases = []},
-    Testing.TestGroup {
-      Testing.testGroupName = "Case statements",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [
-        Testing.TestGroup {
-          Testing.testGroupName = "monomorphic at top level",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "non-applied case statement",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "string"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "s"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v1"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "s"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "applied case statement",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                    Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "string"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                    Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
-                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                  Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "string"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "applied case statement in lambda",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName)),
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "s"),
-                            Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName)),
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "s"),
-                            Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]},
-        Testing.TestGroup {
-          Testing.testGroupName = "monomorphic in let binding",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "non-applied case statement",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                        Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "string"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "s"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                            Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "string"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "s"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "applied case statement",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "s"),
-                                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                        Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "string"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "string"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "s"),
-                                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                        Core.applicationArgument = (Core.TermUnion (Core.Injection {
-                          Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
-                          Core.injectionField = Core.Field {
-                            Core.fieldName = (Core.Name "string"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "applied case statement in lambda",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName)),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                            Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "string"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "s"),
-                                  Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName)),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                            Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "string"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "s"),
-                                  Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]},
-        Testing.TestGroup {
-          Testing.testGroupName = "polymorphic in let binding",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "non-applied UnionPolymorphicRecursive",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "value"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "i"),
-                                Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v1"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                              Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                              Core.caseStatementCases = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "value"),
-                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "i"),
-                                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "test"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "applied UnionPolymorphicRecursive with int32",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                            Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "value"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "i"),
-                                  Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                        Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "value"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                            Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "value"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "i"),
-                                  Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                        Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
-                            Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                            Core.injectionField = Core.Field {
-                              Core.fieldName = (Core.Name "value"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-                          Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "test"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "applied UnionPolymorphicRecursive with int32 in lambda",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                              Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                              Core.caseStatementCases = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "value"),
-                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "i"),
-                                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "test"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "test"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                          Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                              Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                              Core.caseStatementCases = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "value"),
-                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "i"),
-                                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
-                            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                            Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermVariable (Core.Name "test"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "applied generic UnionPolymorphicRecursive in lambda",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t0"),
-                  Core.typeLambdaBody = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "test"),
-                        Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                          Core.typeLambdaParameter = (Core.Name "t1"),
-                          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "x"),
-                            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "value"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "ignored"),
-                                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))}]})))),
-                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t1"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "test")),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermTypeLambda (Core.TypeLambda {
-                  Core.typeLambdaParameter = (Core.Name "t0"),
-                  Core.typeLambdaBody = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "test"),
-                        Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                          Core.typeLambdaParameter = (Core.Name "t1"),
-                          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "x"),
-                            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "value"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "ignored"),
-                                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))}]})))),
-                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t1"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
-                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                      Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "test")),
-                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]},
-        Testing.TestGroup {
-          Testing.testGroupName = "Forced expansion in case statement branches",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "variable reference in case branch is expanded",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "handler"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "bool"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "ignored"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "boolean value"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "string"),
-                        Core.fieldTerm = (Core.TermVariable (Core.Name "handler"))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "unit"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "ignored"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "unit value"))})))}]}))))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "handler"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                      Core.bindingType = (Just (Core.TypeScheme {
-                        Core.typeSchemeVariables = [],
-                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                        Core.typeSchemeConstraints = Nothing}))}],
-                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v1"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "bool"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "ignored"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "boolean value"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "string"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "v1"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "handler")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "unit"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "ignored"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "unit value"))})))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "bare primitive in case branch is expanded",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                  Core.caseStatementDefault = Nothing,
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "bool"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "ignored"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "boolean value"))})))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "string"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "unit"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "ignored"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "unit value"))})))}]})))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v1"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "bool"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "ignored"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "boolean value"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "string"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "v1"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "unit"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "ignored"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "unit value"))})))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "variable reference outside case branch is not expanded",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "handler"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "handler"))})),
-                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "handler"),
-                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "handler"))}))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "bare primitive outside case branch is not expanded",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]}],
-      Testing.testGroupCases = []},
-    Testing.TestGroup {
-      Testing.testGroupName = "Non-expansion of eliminations which produce functions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "applied case statement",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t0"),
-              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t1"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "dir"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection"))),
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "coder"),
-                    Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Coder")),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "encode"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "_"),
-                              Core.lambdaDomain = (Just Core.TypeUnit),
-                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "v12"),
-                                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                              Core.projectionTypeName = (Core.Name "hydra.compute.Coder"),
-                                              Core.projectionField = (Core.Name "encode")})))),
-                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "decode"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "_"),
-                              Core.lambdaDomain = (Just Core.TypeUnit),
-                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "v12"),
-                                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                              Core.projectionTypeName = (Core.Name "hydra.compute.Coder"),
-                                              Core.projectionField = (Core.Name "decode")})))),
-                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "dir"))}))})))})))}))})),
-            Testing.etaExpansionTestCaseOutput = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "t0"),
-              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "t1"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "dir"),
-                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection"))),
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "coder"),
-                    Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
-                      Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                          Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                            Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.compute.Coder")),
-                            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "encode"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "_"),
-                              Core.lambdaDomain = (Just Core.TypeUnit),
-                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "v12"),
-                                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                              Core.projectionTypeName = (Core.Name "hydra.compute.Coder"),
-                                              Core.projectionField = (Core.Name "encode")})))),
-                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "decode"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "_"),
-                              Core.lambdaDomain = (Just Core.TypeUnit),
-                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "v12"),
-                                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                          Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                              Core.projectionTypeName = (Core.Name "hydra.compute.Coder"),
-                                              Core.projectionField = (Core.Name "decode")})))),
-                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
-                                        Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v12"))}))})))})))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "dir"))}))})))})))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "applied projection",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypeTripleName,
-                      Core.projectionField = (Core.Name "third")})))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeTripleName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "first"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "second"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "third"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "s"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}]}))})),
-            Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                      Core.projectionTypeName = TestTypes.testTypeTripleName,
-                      Core.projectionField = (Core.Name "third")})))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeTripleName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "first"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "second"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "third"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "s"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}]}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "eta expansion",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Partial application of primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [
+            Testing.TestGroup {
+              Testing.testGroupName = "Bare primitives are not expanded",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "unary primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "binary primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "Partially applied primitives expand with lambdas",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "binary primitive with one argument",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v1"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "ternary primitive with one argument",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v1"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v2"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "v2"))}))})))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "Fully applied primitives are not expanded",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "unary primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "FOO"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "FOO"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "binary primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a,b,c"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a,b,c"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "Record projections",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [
+                Testing.TestGroup {
+                  Testing.testGroupName = "Bare projections expand with a lambda",
+                  Testing.testGroupDescription = Nothing,
+                  Testing.testGroupSubgroups = [],
+                  Testing.testGroupCases = [
+                    Testing.TestCaseWithMetadata {
+                      Testing.testCaseWithMetadataName = "projection without argument",
+                      Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                        Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypePersonName,
+                          Core.projectionField = (Core.Name "firstName")})))),
+                        Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v1"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                              Core.projectionTypeName = TestTypes.testTypePersonName,
+                              Core.projectionField = (Core.Name "firstName")})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
+                      Testing.testCaseWithMetadataDescription = Nothing,
+                      Testing.testCaseWithMetadataTags = []}]},
+                Testing.TestGroup {
+                  Testing.testGroupName = "Applied projections are not expanded",
+                  Testing.testGroupDescription = Nothing,
+                  Testing.testGroupSubgroups = [],
+                  Testing.testGroupCases = [
+                    Testing.TestCaseWithMetadata {
+                      Testing.testCaseWithMetadataName = "projection with argument",
+                      Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                        Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "person"))})),
+                        Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "person"))}))})),
+                      Testing.testCaseWithMetadataDescription = Nothing,
+                      Testing.testCaseWithMetadataTags = []},
+                    Testing.TestCaseWithMetadata {
+                      Testing.testCaseWithMetadataName = "projection applied to a record",
+                      Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                        Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")})))),
+                          Core.applicationArgument = (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = TestTypes.testTypePersonName,
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "firstName"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "lastName"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))}]}))})),
+                        Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")})))),
+                          Core.applicationArgument = (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = TestTypes.testTypePersonName,
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "firstName"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "John"))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "lastName"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Doe"))}]}))}))})),
+                      Testing.testCaseWithMetadataDescription = Nothing,
+                      Testing.testCaseWithMetadataTags = []}]},
+                Testing.TestGroup {
+                  Testing.testGroupName = "Projections nested in other structures",
+                  Testing.testGroupDescription = Nothing,
+                  Testing.testGroupSubgroups = [],
+                  Testing.testGroupCases = [
+                    Testing.TestCaseWithMetadata {
+                      Testing.testCaseWithMetadataName = "projection in a list",
+                      Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                        Testing.etaExpansionTestCaseInput = (Core.TermList [
+                          Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")}))),
+                          (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))]),
+                        Testing.etaExpansionTestCaseOutput = (Core.TermList [
+                          Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                Core.projectionTypeName = TestTypes.testTypePersonName,
+                                Core.projectionField = (Core.Name "firstName")})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})),
+                          (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))])})),
+                      Testing.testCaseWithMetadataDescription = Nothing,
+                      Testing.testCaseWithMetadataTags = []},
+                    Testing.TestCaseWithMetadata {
+                      Testing.testCaseWithMetadataName = "projection in a tuple",
+                      Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                        Testing.etaExpansionTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypePersonName,
+                          Core.projectionField = (Core.Name "firstName")}))), (Core.TermLiteral (Core.LiteralString "default")))),
+                        Testing.etaExpansionTestCaseOutput = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v1"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                              Core.projectionTypeName = TestTypes.testTypePersonName,
+                              Core.projectionField = (Core.Name "firstName")})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})), (Core.TermLiteral (Core.LiteralString "default"))))})),
+                      Testing.testCaseWithMetadataDescription = Nothing,
+                      Testing.testCaseWithMetadataTags = []},
+                    Testing.TestCaseWithMetadata {
+                      Testing.testCaseWithMetadataName = "projection in let binding",
+                      Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                        Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "getter"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                Core.projectionTypeName = TestTypes.testTypePersonName,
+                                Core.projectionField = (Core.Name "firstName")})))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermVariable (Core.Name "getter"))})),
+                        Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "getter"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "v1"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = TestTypes.testTypePersonName,
+                                    Core.projectionField = (Core.Name "firstName")})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermVariable (Core.Name "getter"))}))})),
+                      Testing.testCaseWithMetadataDescription = Nothing,
+                      Testing.testCaseWithMetadataTags = []},
+                    Testing.TestCaseWithMetadata {
+                      Testing.testCaseWithMetadataName = "projection in lambda body",
+                      Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                        Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")}))))}))),
+                        Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                Core.projectionTypeName = TestTypes.testTypePersonName,
+                                Core.projectionField = (Core.Name "firstName")})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})),
+                      Testing.testCaseWithMetadataDescription = Nothing,
+                      Testing.testCaseWithMetadataTags = []}]},
+                Testing.TestGroup {
+                  Testing.testGroupName = "Function-valued projections",
+                  Testing.testGroupDescription = Nothing,
+                  Testing.testGroupSubgroups = [],
+                  Testing.testGroupCases = [
+                    Testing.TestCaseWithMetadata {
+                      Testing.testCaseWithMetadataName = "projection of function-valued field applied to arguments should not be expanded",
+                      Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                        Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                    Core.projectionField = (Core.Name "first")})))),
+                                  Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                                    Core.recordTypeName = TestTypes.testTypeTripleName,
+                                    Core.recordFields = [
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "first"),
+                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))},
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "second"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "third"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "last"))}]})),
+                                  Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "DATA"))})),
+                        Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                    Core.projectionTypeName = TestTypes.testTypeTripleName,
+                                    Core.projectionField = (Core.Name "first")})))),
+                                  Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermRecord (Core.Record {
+                                    Core.recordTypeName = TestTypes.testTypeTripleName,
+                                    Core.recordFields = [
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "first"),
+                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))},
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "second"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "middle"))},
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "third"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "last"))}]})),
+                                  Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "DATA"))}))})),
+                      Testing.testCaseWithMetadataDescription = Nothing,
+                      Testing.testCaseWithMetadataTags = []}]}],
+              Testing.testGroupCases = []}],
+          Testing.testGroupCases = []},
+        Testing.TestGroup {
+          Testing.testGroupName = "Polymorphic terms (System F)",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [
+            Testing.TestGroup {
+              Testing.testGroupName = "Type lambdas in let bindings",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "polymorphic identity function",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "id"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "id"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "monomorphic partially applied primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "partial"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "partial"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "partial"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "partial"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "monomorphic projection",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "getter"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")})))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "getter"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "getter"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                Core.projectionTypeName = TestTypes.testTypePersonName,
+                                Core.projectionField = (Core.Name "firstName")})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "Person")),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "getter"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "Type applications of polymorphic bindings",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "polymorphic variable with type application",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                        Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                        Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "type application of identity applied to binary function with no arguments",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                          Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                          Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))}))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "type application of identity applied to partially applied binary function",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                          Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))})),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))}))}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                          Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))})),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v1"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))}))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "type application of identity applied to fully applied binary function",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                          Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo,bar"))}))}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                          Core.typeApplicationTermType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo,bar"))}))}))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "type application of identity applied to binary function, then applied to one argument",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                            Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v1"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                                Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
+                              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "type application of identity applied to binary function, then fully applied to two arguments",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                              Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                  Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
+                            Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo,bar"))}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "id"),
+                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "a"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [
+                              Core.Name "a"],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "id")),
+                              Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                  Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))}))}))})),
+                            Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo,bar"))}))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]}],
+          Testing.testGroupCases = []},
+        Testing.TestGroup {
+          Testing.testGroupName = "Higher-Order Functions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [
+            Testing.TestGroup {
+              Testing.testGroupName = "Functions that return functions",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "lambda returning bare binary primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))}))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "lambda returning bare unary primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))}))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "lambda returning partially applied primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))}))}))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v1"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "lambda returning fully applied primitive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "lambda returning bare projection",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "person"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                        Core.projectionTypeName = TestTypes.testTypePersonName,
+                        Core.projectionField = (Core.Name "firstName")}))))}))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "person"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v1"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                            Core.projectionTypeName = TestTypes.testTypePersonName,
+                            Core.projectionField = (Core.Name "firstName")})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "nested lambdas with partial application in body",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v1"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "lambda returning lambda returning partial application",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "z"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "z"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]}],
+          Testing.testGroupCases = []},
+        Testing.TestGroup {
+          Testing.testGroupName = "Let terms",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [
+            Testing.TestGroup {
+              Testing.testGroupName = "partial application of a let-bound function",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "simple",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "helper"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "arg1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "arg2"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "arg3"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                  Core.applicationArgument = (Core.TermList [
+                                    Core.TermVariable (Core.Name "arg1"),
+                                    (Core.TermVariable (Core.Name "arg2")),
+                                    (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "helper"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "arg1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "arg2"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "arg3"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                  Core.applicationArgument = (Core.TermList [
+                                    Core.TermVariable (Core.Name "arg1"),
+                                    (Core.TermVariable (Core.Name "arg2")),
+                                    (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v1"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v2"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v2"))}))})))})))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "in a fold",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "helper"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "arg1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "arg2"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "arg3"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                  Core.applicationArgument = (Core.TermList [
+                                    Core.TermVariable (Core.Name "arg1"),
+                                    (Core.TermVariable (Core.Name "arg2")),
+                                    (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralString "bar"),
+                          (Core.TermLiteral (Core.LiteralString "baz"))])}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "helper"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "arg1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "arg2"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "arg3"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                  Core.applicationArgument = (Core.TermList [
+                                    Core.TermVariable (Core.Name "arg1"),
+                                    (Core.TermVariable (Core.Name "arg2")),
+                                    (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "v1"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "v2"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
+                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v2"))}))})))})))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralString "bar"),
+                          (Core.TermLiteral (Core.LiteralString "baz"))])}))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "within another let binding",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "tryme"),
+                          Core.bindingTerm = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "helper"),
+                                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "arg1"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "arg2"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "arg3"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                        Core.applicationArgument = (Core.TermList [
+                                          Core.TermVariable (Core.Name "arg1"),
+                                          (Core.TermVariable (Core.Name "arg2")),
+                                          (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [],
+                                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = Core.TermUnit})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "tryme"),
+                          Core.bindingTerm = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "helper"),
+                                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "arg1"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "arg2"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "arg3"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                                        Core.applicationArgument = (Core.TermList [
+                                          Core.TermVariable (Core.Name "arg1"),
+                                          (Core.TermVariable (Core.Name "arg2")),
+                                          (Core.TermVariable (Core.Name "arg3"))])}))})))})))}))),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [],
+                                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "v1"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "v2"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
+                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v2"))}))})))})))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = Core.TermUnit}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]}],
+          Testing.testGroupCases = []},
+        Testing.TestGroup {
+          Testing.testGroupName = "Case statements",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [
+            Testing.TestGroup {
+              Testing.testGroupName = "monomorphic at top level",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "non-applied case statement",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "s"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v1"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "s"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "applied case statement",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                        Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "s"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                      Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                        Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "s"),
+                              Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                      Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "applied case statement in lambda",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName)),
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "s"),
+                                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName)),
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                          Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "s"),
+                                Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "monomorphic in let binding",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "non-applied case statement",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                            Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "string"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "s"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                                Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "string"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "s"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "applied case statement",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "s"),
+                                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                            Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "string"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "string"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "s"),
+                                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                            Core.applicationArgument = (Core.TermUnion (Core.Injection {
+                              Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
+                              Core.injectionField = Core.Field {
+                                Core.fieldName = (Core.Name "string"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}}))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "applied case statement in lambda",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName)),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                                Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "string"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "s"),
+                                      Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName)),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                                Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "string"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "s"),
+                                      Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "s"))})))}]})))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermLiteral (Core.LiteralString "ignored"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "polymorphic in let binding",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "non-applied UnionPolymorphicRecursive",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "value"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "i"),
+                                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                            Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v1"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                  Core.caseStatementCases = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "value"),
+                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "i"),
+                                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "test"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "applied UnionPolymorphicRecursive with int32",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "value"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "i"),
+                                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                            Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "value"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "value"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "i"),
+                                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                            Core.applicationArgument = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermUnion (Core.Injection {
+                                Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                Core.injectionField = Core.Field {
+                                  Core.fieldName = (Core.Name "value"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+                              Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "test"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "applied UnionPolymorphicRecursive with int32 in lambda",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                  Core.caseStatementCases = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "value"),
+                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "i"),
+                                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "test"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "test"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                              Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                  Core.caseStatementCases = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "value"),
+                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "i"),
+                                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "i"))}))})))}]})))),
+                                Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermVariable (Core.Name "test"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "applied generic UnionPolymorphicRecursive in lambda",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t0"),
+                      Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "test"),
+                            Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                              Core.typeLambdaParameter = (Core.Name "t1"),
+                              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "x"),
+                                Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "value"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "ignored"),
+                                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                                            Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))}]})))),
+                                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t1"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "test")),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermTypeLambda (Core.TypeLambda {
+                      Core.typeLambdaParameter = (Core.Name "t0"),
+                      Core.typeLambdaBody = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "test"),
+                            Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                              Core.typeLambdaParameter = (Core.Name "t1"),
+                              Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "x"),
+                                Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))}))),
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                                      Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "other"))),
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "value"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "ignored"),
+                                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                                            Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))}]})))),
+                                    Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t1"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t1"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeApplication (Core.ApplicationType {
+                                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t1"))})),
+                                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                          Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "test")),
+                          Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}))}))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "Forced expansion in case statement branches",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "variable reference in case branch is expanded",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "handler"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "bool"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "ignored"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "boolean value"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "string"),
+                            Core.fieldTerm = (Core.TermVariable (Core.Name "handler"))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "unit"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "ignored"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "unit value"))})))}]}))))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "handler"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                          Core.bindingType = (Just (Core.TypeScheme {
+                            Core.typeSchemeVariables = [],
+                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                            Core.typeSchemeConstraints = Nothing}))}],
+                      Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v1"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                            Core.caseStatementDefault = Nothing,
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "bool"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "ignored"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "boolean value"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "string"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "v1"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "handler")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "unit"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "ignored"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "unit value"))})))}]})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "bare primitive in case branch is expanded",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                      Core.caseStatementDefault = Nothing,
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "bool"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "ignored"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "boolean value"))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "string"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "unit"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "ignored"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "unit value"))})))}]})))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v1"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "bool"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "ignored"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "boolean value"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "string"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "v1"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "unit"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "ignored"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "unit value"))})))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "variable reference outside case branch is not expanded",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "handler"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "handler"))})),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "handler"),
+                          Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "handler"))}))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "bare primitive outside case branch is not expanded",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                    Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                    Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]}],
+          Testing.testGroupCases = []},
+        Testing.TestGroup {
+          Testing.testGroupName = "Non-expansion of eliminations which produce functions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "applied case statement",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t0"),
+                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "dir"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection"))),
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "coder"),
+                      Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Coder")),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "cx"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.context.Context"))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v1"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "encode"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "_"),
+                                    Core.lambdaDomain = (Just Core.TypeUnit),
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                                Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+                                                Core.projectionField = (Core.Name "encode")})))),
+                                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "decode"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "_"),
+                                    Core.lambdaDomain = (Just Core.TypeUnit),
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                                Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+                                                Core.projectionField = (Core.Name "decode")})))),
+                                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "dir"))}))})))})))})))})))})),
+                Testing.etaExpansionTestCaseOutput = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "t0"),
+                  Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "dir"),
+                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.coders.CoderDirection"))),
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "coder"),
+                      Core.lambdaDomain = (Just (Core.TypeApplication (Core.ApplicationType {
+                        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                          Core.applicationTypeFunction = (Core.TypeVariable (Core.Name "hydra.util.Coder")),
+                          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))),
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "cx"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "hydra.context.Context"))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v1"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "hydra.coders.CoderDirection"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "encode"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "_"),
+                                    Core.lambdaDomain = (Just Core.TypeUnit),
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                                Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+                                                Core.projectionField = (Core.Name "encode")})))),
+                                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "decode"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "_"),
+                                    Core.lambdaDomain = (Just Core.TypeUnit),
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                              Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                                Core.projectionTypeName = (Core.Name "hydra.util.Coder"),
+                                                Core.projectionField = (Core.Name "decode")})))),
+                                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))})),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "coder"))})),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "cx"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "dir"))}))})))})))})))})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "applied projection",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypeTripleName,
+                          Core.projectionField = (Core.Name "third")})))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                  Core.applicationArgument = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeTripleName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "first"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "second"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "third"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "s"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}]}))})),
+                Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                      Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                          Core.projectionTypeName = TestTypes.testTypeTripleName,
+                          Core.projectionField = (Core.Name "third")})))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.typeApplicationTermType = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                  Core.applicationArgument = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeTripleName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "first"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "second"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "third"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "s"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}]}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Formatting.hs b/src/gen-test/haskell/Hydra/Test/Formatting.hs
--- a/src/gen-test/haskell/Hydra/Test/Formatting.hs
+++ b/src/gen-test/haskell/Hydra/Test/Formatting.hs
@@ -15,161 +15,163 @@
 
 -- | Test cases for hydra.formatting
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "formatting",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    caseConversionTests],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "formatting",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        caseConversionTests],
+      Testing.testGroupCases = []}
 
 -- | Test cases for case conversion
 caseConversionTests :: Testing.TestGroup
-caseConversionTests = Testing.TestGroup {
-  Testing.testGroupName = "case conversion",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#1 (lower_snake_case -> UPPER_SNAKE_CASE)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionLowerSnake,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionUpperSnake,
-        Testing.caseConversionTestCaseFromString = "a_hello_world_42_a42_42a_b",
-        Testing.caseConversionTestCaseToString = "A_HELLO_WORLD_42_A42_42A_B"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#2 (lower_snake_case -> camelCase)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionLowerSnake,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionCamel,
-        Testing.caseConversionTestCaseFromString = "a_hello_world_42_a42_42a_b",
-        Testing.caseConversionTestCaseToString = "aHelloWorld42A4242aB"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#3 (lower_snake_case -> PascalCase)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionLowerSnake,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionPascal,
-        Testing.caseConversionTestCaseFromString = "a_hello_world_42_a42_42a_b",
-        Testing.caseConversionTestCaseToString = "AHelloWorld42A4242aB"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#4 (lower_snake_case -> lower_snake_case)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionLowerSnake,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionLowerSnake,
-        Testing.caseConversionTestCaseFromString = "a_hello_world_42_a42_42a_b",
-        Testing.caseConversionTestCaseToString = "a_hello_world_42_a42_42a_b"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#5 (UPPER_SNAKE_CASE -> lower_snake_case)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionUpperSnake,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionLowerSnake,
-        Testing.caseConversionTestCaseFromString = "A_HELLO_WORLD_42_A42_42A_B",
-        Testing.caseConversionTestCaseToString = "a_hello_world_42_a42_42a_b"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#6 (UPPER_SNAKE_CASE -> camelCase)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionUpperSnake,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionCamel,
-        Testing.caseConversionTestCaseFromString = "A_HELLO_WORLD_42_A42_42A_B",
-        Testing.caseConversionTestCaseToString = "aHelloWorld42A4242aB"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#7 (UPPER_SNAKE_CASE -> PascalCase)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionUpperSnake,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionPascal,
-        Testing.caseConversionTestCaseFromString = "A_HELLO_WORLD_42_A42_42A_B",
-        Testing.caseConversionTestCaseToString = "AHelloWorld42A4242aB"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#8 (UPPER_SNAKE_CASE -> UPPER_SNAKE_CASE)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionUpperSnake,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionUpperSnake,
-        Testing.caseConversionTestCaseFromString = "A_HELLO_WORLD_42_A42_42A_B",
-        Testing.caseConversionTestCaseToString = "A_HELLO_WORLD_42_A42_42A_B"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#9 (camelCase -> lower_snake_case)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionCamel,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionLowerSnake,
-        Testing.caseConversionTestCaseFromString = "aHelloWorld42A4242aB",
-        Testing.caseConversionTestCaseToString = "a_hello_world42_a4242a_b"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#10 (camelCase -> UPPER_SNAKE_CASE)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionCamel,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionUpperSnake,
-        Testing.caseConversionTestCaseFromString = "aHelloWorld42A4242aB",
-        Testing.caseConversionTestCaseToString = "A_HELLO_WORLD42_A4242A_B"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#11 (camelCase -> PascalCase)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionCamel,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionPascal,
-        Testing.caseConversionTestCaseFromString = "aHelloWorld42A4242aB",
-        Testing.caseConversionTestCaseToString = "AHelloWorld42A4242aB"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#12 (camelCase -> camelCase)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionCamel,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionCamel,
-        Testing.caseConversionTestCaseFromString = "aHelloWorld42A4242aB",
-        Testing.caseConversionTestCaseToString = "aHelloWorld42A4242aB"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#13 (PascalCase -> lower_snake_case)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionPascal,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionLowerSnake,
-        Testing.caseConversionTestCaseFromString = "AHelloWorld42A4242aB",
-        Testing.caseConversionTestCaseToString = "a_hello_world42_a4242a_b"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#14 (PascalCase -> UPPER_SNAKE_CASE)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionPascal,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionUpperSnake,
-        Testing.caseConversionTestCaseFromString = "AHelloWorld42A4242aB",
-        Testing.caseConversionTestCaseToString = "A_HELLO_WORLD42_A4242A_B"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#15 (PascalCase -> camelCase)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionPascal,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionCamel,
-        Testing.caseConversionTestCaseFromString = "AHelloWorld42A4242aB",
-        Testing.caseConversionTestCaseToString = "aHelloWorld42A4242aB"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#16 (PascalCase -> PascalCase)",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
-        Testing.caseConversionTestCaseFromConvention = Util.CaseConventionPascal,
-        Testing.caseConversionTestCaseToConvention = Util.CaseConventionPascal,
-        Testing.caseConversionTestCaseFromString = "AHelloWorld42A4242aB",
-        Testing.caseConversionTestCaseToString = "AHelloWorld42A4242aB"})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
+caseConversionTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "case conversion",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#1 (lower_snake_case -> UPPER_SNAKE_CASE)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionLowerSnake,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionUpperSnake,
+            Testing.caseConversionTestCaseFromString = "a_hello_world_42_a42_42a_b",
+            Testing.caseConversionTestCaseToString = "A_HELLO_WORLD_42_A42_42A_B"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#2 (lower_snake_case -> camelCase)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionLowerSnake,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionCamel,
+            Testing.caseConversionTestCaseFromString = "a_hello_world_42_a42_42a_b",
+            Testing.caseConversionTestCaseToString = "aHelloWorld42A4242aB"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#3 (lower_snake_case -> PascalCase)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionLowerSnake,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionPascal,
+            Testing.caseConversionTestCaseFromString = "a_hello_world_42_a42_42a_b",
+            Testing.caseConversionTestCaseToString = "AHelloWorld42A4242aB"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#4 (lower_snake_case -> lower_snake_case)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionLowerSnake,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionLowerSnake,
+            Testing.caseConversionTestCaseFromString = "a_hello_world_42_a42_42a_b",
+            Testing.caseConversionTestCaseToString = "a_hello_world_42_a42_42a_b"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#5 (UPPER_SNAKE_CASE -> lower_snake_case)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionUpperSnake,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionLowerSnake,
+            Testing.caseConversionTestCaseFromString = "A_HELLO_WORLD_42_A42_42A_B",
+            Testing.caseConversionTestCaseToString = "a_hello_world_42_a42_42a_b"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#6 (UPPER_SNAKE_CASE -> camelCase)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionUpperSnake,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionCamel,
+            Testing.caseConversionTestCaseFromString = "A_HELLO_WORLD_42_A42_42A_B",
+            Testing.caseConversionTestCaseToString = "aHelloWorld42A4242aB"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#7 (UPPER_SNAKE_CASE -> PascalCase)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionUpperSnake,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionPascal,
+            Testing.caseConversionTestCaseFromString = "A_HELLO_WORLD_42_A42_42A_B",
+            Testing.caseConversionTestCaseToString = "AHelloWorld42A4242aB"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#8 (UPPER_SNAKE_CASE -> UPPER_SNAKE_CASE)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionUpperSnake,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionUpperSnake,
+            Testing.caseConversionTestCaseFromString = "A_HELLO_WORLD_42_A42_42A_B",
+            Testing.caseConversionTestCaseToString = "A_HELLO_WORLD_42_A42_42A_B"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#9 (camelCase -> lower_snake_case)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionCamel,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionLowerSnake,
+            Testing.caseConversionTestCaseFromString = "aHelloWorld42A4242aB",
+            Testing.caseConversionTestCaseToString = "a_hello_world42_a4242a_b"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#10 (camelCase -> UPPER_SNAKE_CASE)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionCamel,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionUpperSnake,
+            Testing.caseConversionTestCaseFromString = "aHelloWorld42A4242aB",
+            Testing.caseConversionTestCaseToString = "A_HELLO_WORLD42_A4242A_B"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#11 (camelCase -> PascalCase)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionCamel,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionPascal,
+            Testing.caseConversionTestCaseFromString = "aHelloWorld42A4242aB",
+            Testing.caseConversionTestCaseToString = "AHelloWorld42A4242aB"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#12 (camelCase -> camelCase)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionCamel,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionCamel,
+            Testing.caseConversionTestCaseFromString = "aHelloWorld42A4242aB",
+            Testing.caseConversionTestCaseToString = "aHelloWorld42A4242aB"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#13 (PascalCase -> lower_snake_case)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionPascal,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionLowerSnake,
+            Testing.caseConversionTestCaseFromString = "AHelloWorld42A4242aB",
+            Testing.caseConversionTestCaseToString = "a_hello_world42_a4242a_b"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#14 (PascalCase -> UPPER_SNAKE_CASE)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionPascal,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionUpperSnake,
+            Testing.caseConversionTestCaseFromString = "AHelloWorld42A4242aB",
+            Testing.caseConversionTestCaseToString = "A_HELLO_WORLD42_A4242A_B"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#15 (PascalCase -> camelCase)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionPascal,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionCamel,
+            Testing.caseConversionTestCaseFromString = "AHelloWorld42A4242aB",
+            Testing.caseConversionTestCaseToString = "aHelloWorld42A4242aB"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#16 (PascalCase -> PascalCase)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseCaseConversion (Testing.CaseConversionTestCase {
+            Testing.caseConversionTestCaseFromConvention = Util.CaseConventionPascal,
+            Testing.caseConversionTestCaseToConvention = Util.CaseConventionPascal,
+            Testing.caseConversionTestCaseFromString = "AHelloWorld42A4242aB",
+            Testing.caseConversionTestCaseToString = "AHelloWorld42A4242aB"})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
diff --git a/src/gen-test/haskell/Hydra/Test/Hoisting.hs b/src/gen-test/haskell/Hydra/Test/Hoisting.hs
deleted file mode 100644
--- a/src/gen-test/haskell/Hydra/Test/Hoisting.hs
+++ /dev/null
@@ -1,5843 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Test cases for hoisting transformations
-
-module Hydra.Test.Hoisting where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Testing as Testing
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Test cases for hoisting transformations
-allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hoisting",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "hoistSubterms",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistNothing: simple let unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateNothing,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistNothing: let with list in body unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateNothing,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistNothing: let with application in body unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateNothing,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "g")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "g")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: list in body is hoisted into local let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: multiple lists in body are hoisted together",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                    Core.bindingType = Nothing},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_2"),
-                    Core.bindingTerm = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_2"))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: list in binding value is hoisted into local let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_x_1"),
-                        Core.bindingTerm = (Core.TermList [
-                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_1"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: nested lists hoisted from inside out",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                    Core.bindingType = Nothing},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_2"),
-                    Core.bindingTerm = (Core.TermList [
-                      Core.TermVariable (Core.Name "_hoist__body_1"),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_2"))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistApplications: application in list element is hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateApplications,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}),
-                (Core.TermVariable (Core.Name "y"))])})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "_hoist__body_1"),
-                  (Core.TermVariable (Core.Name "y"))])}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistApplications: application in record field is hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateApplications,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "Data"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "value"),
-                    Core.fieldTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}]}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "Data"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "_hoist__body_1"))}]}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistApplications: nested applications hoisted from inside out",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateApplications,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})])})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.bindingType = Nothing},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_2"),
-                    Core.bindingTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))})),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "_hoist__body_2")])}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistCaseStatements: case in application argument is hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateCaseStatements,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "Optional"),
-                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "just"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "y"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "nothing"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistCaseStatements: case in list element is hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateCaseStatements,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "Result"),
-                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "ok"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "err"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))])})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Result"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "ok"),
-                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "err"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "_hoist__body_1")])}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: nested let - inner let processed independently",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermVariable (Core.Name "x"),
-                    (Core.TermVariable (Core.Name "y"))])}))}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "_hoist__body_1"),
-                      Core.bindingTerm = (Core.TermList [
-                        Core.TermVariable (Core.Name "x"),
-                        (Core.TermVariable (Core.Name "y"))]),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: non-let term is unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistApplications: bare application unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateApplications,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: term referring to let-bound variable needs no capture",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermVariable (Core.Name "x"),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: term referring to lambda above let needs no capture",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermVariable (Core.Name "y"),
-                    (Core.TermVariable (Core.Name "x"))])}))}))}))),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "_hoist__body_1"),
-                      Core.bindingTerm = (Core.TermList [
-                        Core.TermVariable (Core.Name "y"),
-                        (Core.TermVariable (Core.Name "x"))]),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))}))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: lambda-bound var not free in hoisted term needs no capture",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermVariable (Core.Name "x"),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))})))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))})))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: lambda-bound var free in hoisted term requires capture",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermVariable (Core.Name "x"),
-                    (Core.TermVariable (Core.Name "y"))])}))})))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermList [
-                        Core.TermVariable (Core.Name "x"),
-                        (Core.TermVariable (Core.Name "y"))])}))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist__body_1")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: only free lambda-bound vars are captured",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "a"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "b"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermVariable (Core.Name "b"))])}))})))})))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermList [
-                        Core.TermVariable (Core.Name "x"),
-                        (Core.TermVariable (Core.Name "b"))])}))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "a"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "b"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist__body_1")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))})))})))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: stable naming for binding and body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_x_1"),
-                        Core.bindingTerm = (Core.TermList [
-                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_1"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: stable naming for multiple bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_x_1"),
-                        Core.bindingTerm = (Core.TermList [
-                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_1"))}))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_y_1"),
-                        Core.bindingTerm = (Core.TermList [
-                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_y_1"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "hoistLists: polymorphic binding with self-reference below hoisted term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
-            Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
-            Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                      Core.applicationArgument = (Core.TermList [
-                        Core.TermVariable (Core.Name "x"),
-                        (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-            Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermList [
-                            Core.TermVariable (Core.Name "x"),
-                            (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])}))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "hoistCaseStatements",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case at top level of let body is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "Optional"),
-                Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "just"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "nothing"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "Optional"),
-                Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "just"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "nothing"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in let binding value is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "z"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "z"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case inside lambda body is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))}))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case inside nested lambdas is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Result"),
-                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "ok"),
-                            Core.fieldTerm = (Core.TermVariable (Core.Name "b"))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "err"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Result"),
-                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "ok"),
-                            Core.fieldTerm = (Core.TermVariable (Core.Name "b"))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "err"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case as LHS of one application is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case wrapped in annotation is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                    Core.annotatedTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.annotatedTermAnnotation = M.empty})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
-                    Core.annotatedTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.annotatedTermAnnotation = M.empty})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in lambda with one application is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case as RHS of application IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_f_1"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in nested application LHS IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "z"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "w"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "w"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "z"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "w"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "w"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case inside list element IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))]),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "_hoist_f_1")])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case inside lambda inside list IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))]),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "Optional"),
-                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "just"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "y"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "nothing"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermList [
-                      Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "a"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list inside lambda is NOT hoisted (only case statements)",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "a"),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "a"),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in binding is not hoisted, case in arg position is hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "z"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "Optional"),
-                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "just"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "w"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermVariable (Core.Name "w"))})))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "nothing"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "z"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "w"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "w"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in nested let body is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "Optional"),
-                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "z"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "just"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "w"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermVariable (Core.Name "w"))})))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "nothing"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "Optional"),
-                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "z"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "just"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "w"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermVariable (Core.Name "w"))})))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "nothing"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in let inside lambda is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "x"),
-                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "x"),
-                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in lambda inside let body is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "a"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "Optional"),
-                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "just"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "y"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "nothing"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "a"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                  Core.caseStatementTypeName = (Core.Name "Optional"),
-                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                  Core.caseStatementCases = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "just"),
-                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "y"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "nothing"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case with let+lambda+app is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "x"),
-                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "x"),
-                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in triple application LHS IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "a"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "c"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))})))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "c"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))})))}]})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "z"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "a"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "c"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))})))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "c"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))})))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case as second argument IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_f_1"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in both arguments - both hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]}))))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "x"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing},
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_2"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_f_1"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_f_2"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in second list element IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                    (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))]),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                      (Core.TermVariable (Core.Name "_hoist_f_1"))])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple cases in list - all hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "x"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))),
-                    (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]}))))]),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "x"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing},
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_2"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "_hoist_f_1"),
-                      (Core.TermVariable (Core.Name "_hoist_f_2"))])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in pair first element IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "y"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "_hoist_f_1"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in pair second element IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "y"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermVariable (Core.Name "_hoist_f_1"))))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in child let binding hoisted into child",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "inner"),
-                        Core.bindingTerm = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                          Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "Optional"),
-                            Core.caseStatementDefault = Nothing,
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "just"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "y"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "nothing"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermVariable (Core.Name "inner"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "inner"),
-                        Core.bindingTerm = (Core.TermLet (Core.Let {
-                          Core.letBindings = [
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "_hoist_inner_1"),
-                              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                Core.caseStatementTypeName = (Core.Name "Optional"),
-                                Core.caseStatementDefault = Nothing,
-                                Core.caseStatementCases = [
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "just"),
-                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "y"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "nothing"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                              Core.bindingType = Nothing}],
-                          Core.letBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_inner_1"))}))})),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermVariable (Core.Name "inner"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in child let body hoisted into child",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "inner"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "inner"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "_hoist__body_1"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "Optional"),
-                            Core.caseStatementDefault = Nothing,
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "just"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "y"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "nothing"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist__body_1"))}))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case at top level of child let NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "inner"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermVariable (Core.Name "inner"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "inner"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermVariable (Core.Name "inner"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cases in both outer and child - each hoisted locally",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
-                    Core.applicationArgument = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "inner"),
-                          Core.bindingTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                              Core.caseStatementTypeName = (Core.Name "Optional"),
-                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
-                              Core.caseStatementCases = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "just"),
-                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "y"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "nothing"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]}))))})),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermVariable (Core.Name "inner"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_outer_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "x"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_outer_1"))})),
-                      Core.applicationArgument = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "inner"),
-                            Core.bindingTerm = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "_hoist_inner_1"),
-                                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
-                                    Core.caseStatementCases = [
-                                      Core.Field {
-                                        Core.fieldName = (Core.Name "just"),
-                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "y"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                                      Core.Field {
-                                        Core.fieldName = (Core.Name "nothing"),
-                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]})))),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_inner_1"))}))})),
-                            Core.bindingType = Nothing}],
-                        Core.letBody = (Core.TermVariable (Core.Name "inner"))}))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda after app LHS takes us out of top level",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "Optional"),
-                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "just"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "y"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "nothing"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "a"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case inside case branch is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "Optional"),
-                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "just"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "nothing"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "Optional"),
-                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "just"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "nothing"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case inside case default branch is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "b"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in arg position inside case branch IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Optional"),
-                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "just"),
-                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                              Core.caseStatementTypeName = (Core.Name "Optional"),
-                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                              Core.caseStatementCases = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "just"),
-                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "b"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "nothing"),
-                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "nothing"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                            Core.caseStatementTypeName = (Core.Name "Optional"),
-                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
-                            Core.caseStatementCases = [
-                              Core.Field {
-                                Core.fieldName = (Core.Name "just"),
-                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "b"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
-                              Core.Field {
-                                Core.fieldName = (Core.Name "nothing"),
-                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "a"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in let body inside applied case default IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "a"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "b"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                Core.caseStatementTypeName = (Core.Name "Result"),
-                                Core.caseStatementDefault = Nothing,
-                                Core.caseStatementCases = [
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "ok"),
-                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                      Core.lambdaParameter = (Core.Name "y"),
-                                      Core.lambdaDomain = Nothing,
-                                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                                  Core.Field {
-                                    Core.fieldName = (Core.Name "err"),
-                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "a"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLet (Core.Let {
-                            Core.letBindings = [
-                              Core.Binding {
-                                Core.bindingName = (Core.Name "b"),
-                                Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                                Core.bindingType = Nothing}],
-                            Core.letBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "_hoist__body_1"),
-                                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                    Core.caseStatementTypeName = (Core.Name "Result"),
-                                    Core.caseStatementDefault = Nothing,
-                                    Core.caseStatementCases = [
-                                      Core.Field {
-                                        Core.fieldName = (Core.Name "ok"),
-                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                          Core.lambdaParameter = (Core.Name "y"),
-                                          Core.lambdaDomain = Nothing,
-                                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                                      Core.Field {
-                                        Core.fieldName = (Core.Name "err"),
-                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist__body_1")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))}))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case in let body inside applied case branch IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "a"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "b"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                  Core.caseStatementTypeName = (Core.Name "Result"),
-                                  Core.caseStatementDefault = Nothing,
-                                  Core.caseStatementCases = [
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "ok"),
-                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                        Core.lambdaParameter = (Core.Name "y"),
-                                        Core.lambdaDomain = Nothing,
-                                        Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                                    Core.Field {
-                                      Core.fieldName = (Core.Name "err"),
-                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "a"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermLet (Core.Let {
-                              Core.letBindings = [
-                                Core.Binding {
-                                  Core.bindingName = (Core.Name "b"),
-                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                  Core.bindingType = Nothing}],
-                              Core.letBody = (Core.TermLet (Core.Let {
-                                Core.letBindings = [
-                                  Core.Binding {
-                                    Core.bindingName = (Core.Name "_hoist__body_1"),
-                                    Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                                      Core.caseStatementTypeName = (Core.Name "Result"),
-                                      Core.caseStatementDefault = Nothing,
-                                      Core.caseStatementCases = [
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "ok"),
-                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                            Core.lambdaParameter = (Core.Name "y"),
-                                            Core.lambdaDomain = Nothing,
-                                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                                        Core.Field {
-                                          Core.fieldName = (Core.Name "err"),
-                                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                                    Core.bindingType = Nothing}],
-                                Core.letBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist__body_1")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))}))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case application at top level of binding is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                      Core.caseStatementTypeName = (Core.Name "Optional"),
-                      Core.caseStatementDefault = Nothing,
-                      Core.caseStatementCases = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "just"),
-                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "nothing"),
-                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case application in arg position IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case application inside immediately-applied lambda IS hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "_hoist_f_1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                          Core.caseStatementTypeName = (Core.Name "Optional"),
-                          Core.caseStatementDefault = Nothing,
-                          Core.caseStatementCases = [
-                            Core.Field {
-                              Core.fieldName = (Core.Name "just"),
-                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                            Core.Field {
-                              Core.fieldName = (Core.Name "nothing"),
-                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "a"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "case application in lambda body is NOT hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
-            Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                        Core.caseStatementTypeName = (Core.Name "Optional"),
-                        Core.caseStatementDefault = Nothing,
-                        Core.caseStatementCases = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "just"),
-                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "nothing"),
-                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "hoistLetBindings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested let inside lambda: binding hoisted with lambda capture",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistLetBindings (Testing.HoistLetBindingsTestCase {
-            Testing.hoistLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "g"),
-                          Core.bindingTerm = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "g"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
-            Testing.hoistLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "type application: nested let outside lambda CAN be hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistLetBindings (Testing.HoistLetBindingsTestCase {
-            Testing.hoistLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "y"),
-                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
-            Testing.hoistLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "f_y"))}))}))),
-                    Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "hoistPolymorphicLetBindings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "no polymorphic bindings: simple let unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "no polymorphic bindings: multiple monomorphic bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hi")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hi")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single polymorphic binding: already at top level",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding inside lambda: no capture",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "id"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "x"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "b"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f_id")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_id"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "b"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "b"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding captures lambda variable: wrapped in lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "g"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "x"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "b"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                              Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))}))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "b"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "b"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding captures multiple lambda variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "g"),
-                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermVariable (Core.Name "triple")),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [
-                                Core.Name "c"],
-                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
-                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "c"))})),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "c"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "b"),
-                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "triple")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "c"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "c"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding captures some but not all lambda variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "g"),
-                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [
-                                Core.Name "c"],
-                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
-                                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "c"))}))})),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "c"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "c"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
-                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "c"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding captures both lambda-bound and let-bound variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "x"),
-                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [],
-                            Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                            Core.typeSchemeConstraints = Nothing}))},
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "g"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "b"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "x"),
-                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [],
-                            Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "b"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "y"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "b"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sibling polymorphic bindings inside lambda: one calls the other",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "outer"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "g"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "a"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                            Core.typeSchemeConstraints = Nothing}))},
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "h"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "z"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "b"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "outer"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_h")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "a"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "outer"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "y"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_h"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "b"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "outer"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "z"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_g")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "b"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sibling polymorphic bindings inside lambda: h passes its own args to g",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "outer"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "g"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "v"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "t"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))})))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "a"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
-                            Core.typeSchemeConstraints = Nothing}))},
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "h"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "v"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "t"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "b"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "outer"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_h")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "a"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "outer"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "t"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))})))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_h"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "b"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "outer"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "v"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "t"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_g")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "b"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "untyped binding: not hoisted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "no name collision: distinct names after unshadowing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "id2"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "b"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f_id2")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_id2"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "b"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "b"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested polymorphic binding calls enclosing polymorphic binding",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "outer"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "g"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "a"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "inner"),
-                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                        Core.lambdaBody = (Core.TermLet (Core.Let {
-                          Core.letBindings = [
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "h"),
-                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "z"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))}))),
-                              Core.bindingType = (Just (Core.TypeScheme {
-                                Core.typeSchemeVariables = [
-                                  Core.Name "b"],
-                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                                Core.typeSchemeConstraints = Nothing}))}],
-                          Core.letBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "outer"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "inner"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_h")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "a"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_h"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "b"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "z"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "b"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding captures monomorphic sibling in same let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "left"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "right"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "sleft"),
-                            Core.bindingTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "left"))})),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [],
-                              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                              Core.typeSchemeConstraints = Nothing}))},
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "sright"),
-                            Core.bindingTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "right"))})),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [],
-                              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                              Core.typeSchemeConstraints = Nothing}))},
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "cannotUnify"),
-                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "sright"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [
-                                Core.Name "a"],
-                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "cannotUnify")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "left"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "right"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "sleft"),
-                            Core.bindingTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "left"))})),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [],
-                              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                              Core.typeSchemeConstraints = Nothing}))},
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "sright"),
-                            Core.bindingTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "right"))})),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [],
-                              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_cannotUnify")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "sright"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_cannotUnify"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "a"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "sleft"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "sright"),
-                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "sright"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested lets: poly binding references poly sibling from outer let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "left"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "sleft"),
-                          Core.bindingTerm = (Core.TermVariable (Core.Name "left")),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [],
-                            Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "cannotUnify"),
-                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [
-                                Core.Name "a"],
-                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermLet (Core.Let {
-                          Core.letBindings = [
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "joinList"),
-                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "cannotUnify")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
-                              Core.bindingType = (Just (Core.TypeScheme {
-                                Core.typeSchemeVariables = [
-                                  Core.Name "b"],
-                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                                Core.typeSchemeConstraints = Nothing}))}],
-                          Core.letBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "joinList")),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "left"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "sleft"),
-                          Core.bindingTerm = (Core.TermVariable (Core.Name "left")),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [],
-                            Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_joinList")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_cannotUnify"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "a"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "sleft"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "wrapper_joinList"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "b"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "sleft"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "y"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_cannotUnify")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "b"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding with pair: type applications preserved",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "b"),
-                    Core.lambdaDomain = (Just (Core.TypeWrap (Core.WrappedType {
-                      Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)}))),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "init"),
-                          Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                            Core.typeLambdaParameter = (Core.Name "t0"),
-                            Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                                  Core.typeApplicationTermBody = (Core.TermList []),
-                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}), (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "singleton")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})))),
-                                Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-                              Core.typeApplicationTermType = (Core.TypeSet (Core.TypeWrap (Core.WrappedType {
-                                Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})))}))})),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "t0"],
-                            Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                              Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                              Core.pairTypeSecond = (Core.TypeSet (Core.TypeWrap (Core.WrappedType {
-                                Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                                Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermVariable (Core.Name "init"))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeWrap (Core.WrappedType {
-                        Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})),
-                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                        Core.pairTypeSecond = (Core.TypeSet (Core.TypeWrap (Core.WrappedType {
-                          Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "name_x"))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "b"),
-                    Core.lambdaDomain = (Just (Core.TypeWrap (Core.WrappedType {
-                      Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                      Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)}))),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f_init")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeWrap (Core.WrappedType {
-                        Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})),
-                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                        Core.pairTypeSecond = (Core.TypeSet (Core.TypeWrap (Core.WrappedType {
-                          Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_init"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t0"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = (Just (Core.TypeWrap (Core.WrappedType {
-                        Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)}))),
-                      Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                        Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                          Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermList []),
-                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}), (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "singleton")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})))),
-                          Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-                        Core.typeApplicationTermType = (Core.TypeSet (Core.TypeWrap (Core.WrappedType {
-                          Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})))}))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeWrap (Core.WrappedType {
-                        Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                        Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})),
-                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                        Core.pairTypeSecond = (Core.TypeSet (Core.TypeWrap (Core.WrappedType {
-                          Core.wrappedTypeTypeName = (Core.Name "hydra.core.Name"),
-                          Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)})))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "name_x"))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "monomorphic binding captures type vars: replacement includes type applications",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "a"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "b"),
-                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
-                        Core.lambdaBody = (Core.TermLet (Core.Let {
-                          Core.letBindings = [
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "q"),
-                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "y"),
-                                Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
-                                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
-                              Core.bindingType = (Just (Core.TypeScheme {
-                                Core.typeSchemeVariables = [],
-                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                                Core.typeSchemeConstraints = Nothing}))}],
-                          Core.letBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "q")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a",
-                      (Core.Name "b")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "a"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "b"),
-                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                              Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "f_q")),
-                              Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "a"))})),
-                            Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "b"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a",
-                      (Core.Name "b")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_q"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "a"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "b"),
-                      Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "y"),
-                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a",
-                      (Core.Name "b")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "hoistPolymorphicTypeParameters",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested function types: all type variables must be declared",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "choose"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "forLeft"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "forRight"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "e"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "forLeft")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t0",
-                            (Core.Name "t1"),
-                            (Core.Name "t2")],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermVariable (Core.Name "choose"))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "f_choose")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_choose"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t0"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t1"),
-                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "t2"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "forLeft"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "forRight"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "e"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "forLeft")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))})))}))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0",
-                      (Core.Name "t1"),
-                      (Core.Name "t2")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "type variable in return position only",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "returnT"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "unit"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = Core.TypeUnit,
-                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermVariable (Core.Name "returnT"))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = Core.TypeUnit,
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "f_returnT")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = Core.TypeUnit,
-                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_returnT"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "unit"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = Core.TypeUnit,
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "type variables in deeply nested generics",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "nested"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t0",
-                            (Core.Name "t1"),
-                            (Core.Name "t2")],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypePair (Core.PairType {
-                              Core.pairTypeFirst = (Core.TypePair (Core.PairType {
-                                Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
-                              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t2"))})),
-                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermVariable (Core.Name "nested"))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                        Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "f_nested")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                        Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_nested"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t0"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t1"),
-                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "t2"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))}))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0",
-                      (Core.Name "t1"),
-                      (Core.Name "t2")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
-                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t2"))})),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple bindings with overlapping type variable names",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "id1"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
-                          Core.typeSchemeConstraints = Nothing}))},
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "id2"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "y"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "id1"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "id2"))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                      Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                      Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "outer_id1"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "outer_id2"))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                      Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                      Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer_id1"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "outer_id2"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "outer"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "captured variable with type parameters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "g"),
-                          Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "x"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                          Core.bindingType = (Just (Core.TypeScheme {
-                            Core.typeSchemeVariables = [
-                              Core.Name "t"],
-                            Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                              Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t"))}))})),
-                            Core.typeSchemeConstraints = Nothing}))}],
-                      Core.letBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                        Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t"),
-                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a"),
-                      Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "short type variable names are treated as type parameters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "g"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "t"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "s",
-                            (Core.Name "t"),
-                            (Core.Name "v")],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "s")),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "v"))}))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermVariable (Core.Name "g"))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "f_g")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "s"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t"),
-                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "v"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "t"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))})))}))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "s",
-                      (Core.Name "t"),
-                      (Core.Name "v")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "s")),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "v"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "numbered type variables like t0 t1 t2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "g"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t0",
-                            (Core.Name "t1"),
-                            (Core.Name "t2")],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermVariable (Core.Name "g"))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "f_g")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f_g"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t0"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t1"),
-                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "t2"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "y"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))})))}))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0",
-                      (Core.Name "t1"),
-                      (Core.Name "t2")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "choose pattern from mutateTrace",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
-            Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "mutateTrace"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "mutate"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "restore"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "f"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermLet (Core.Let {
-                          Core.letBindings = [
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "choose"),
-                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                Core.lambdaParameter = (Core.Name "forLeft"),
-                                Core.lambdaDomain = Nothing,
-                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                  Core.lambdaParameter = (Core.Name "forRight"),
-                                  Core.lambdaDomain = Nothing,
-                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "e"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermVariable (Core.Name "forLeft")),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))}))),
-                              Core.bindingType = (Just (Core.TypeScheme {
-                                Core.typeSchemeVariables = [
-                                  Core.Name "t0",
-                                  (Core.Name "t1"),
-                                  (Core.Name "t2")],
-                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                                Core.typeSchemeConstraints = Nothing}))}],
-                          Core.letBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "choose")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "forLeft"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "forRight"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}))})))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "mutateTrace"))},
-            Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "mutateTrace"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "mutate"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "restore"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "f"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "mutateTrace_choose")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "forLeft"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "forRight"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "mutateTrace_choose"),
-                  Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
-                    Core.typeLambdaParameter = (Core.Name "t0"),
-                    Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                      Core.typeLambdaParameter = (Core.Name "t1"),
-                      Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                        Core.typeLambdaParameter = (Core.Name "t2"),
-                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "forLeft"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                            Core.lambdaParameter = (Core.Name "forRight"),
-                            Core.lambdaDomain = Nothing,
-                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "e"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "forLeft")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))})))}))}))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0",
-                      (Core.Name "t1"),
-                      (Core.Name "t2")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermVariable (Core.Name "mutateTrace"))}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Hoisting/All.hs b/src/gen-test/haskell/Hydra/Test/Hoisting/All.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-test/haskell/Hydra/Test/Hoisting/All.hs
@@ -0,0 +1,26 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Hydra's hoisting test suite
+
+module Hydra.Test.Hoisting.All where
+
+import qualified Hydra.Test.Hoisting.Cases as Cases
+import qualified Hydra.Test.Hoisting.Let as Let
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | The group of all hoisting tests
+allTests :: Testing.TestGroup
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hoisting",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Cases.allTests,
+        Let.allTests],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Hoisting/Cases.hs b/src/gen-test/haskell/Hydra/Test/Hoisting/Cases.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-test/haskell/Hydra/Test/Hoisting/Cases.hs
@@ -0,0 +1,3279 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Test cases for subterm hoisting and case statement hoisting
+
+module Hydra.Test.Hoisting.Cases where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Test cases for subterm hoisting and case statement hoisting
+allTests :: Testing.TestGroup
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hoistCases",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "hoistSubterms",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistNothing: simple let unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateNothing,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistNothing: let with list in body unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateNothing,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistNothing: let with application in body unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateNothing,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "g")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "g")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: list in body is hoisted into local let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: multiple lists in body are hoisted together",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                        (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                        Core.bindingType = Nothing},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_2"),
+                        Core.bindingTerm = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_2"))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: list in binding value is hoisted into local let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_x_1"),
+                            Core.bindingTerm = (Core.TermList [
+                              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_1"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: nested lists hoisted from inside out",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermList [
+                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                        (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                        Core.bindingType = Nothing},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_2"),
+                        Core.bindingTerm = (Core.TermList [
+                          Core.TermVariable (Core.Name "_hoist_x_body_1"),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_2"))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistApplications: application in list element is hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateApplications,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}),
+                    (Core.TermVariable (Core.Name "y"))])})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "_hoist_x_body_1"),
+                      (Core.TermVariable (Core.Name "y"))])}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistApplications: application in record field is hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateApplications,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "Data"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "value"),
+                        Core.fieldTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}]}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "Data"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "value"),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "_hoist_x_body_1"))}]}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistApplications: nested applications hoisted from inside out",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateApplications,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})])})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.bindingType = Nothing},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_2"),
+                        Core.bindingTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))})),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "_hoist_x_body_2")])}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistCaseStatements: case in application argument is hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateCaseStatements,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "Optional"),
+                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "just"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "y"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "nothing"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistCaseStatements: case in list element is hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateCaseStatements,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "Result"),
+                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "ok"),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "err"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))])})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Result"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "ok"),
+                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "err"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "_hoist_x_body_1")])}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: nested let - inner let processed independently",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermVariable (Core.Name "x"),
+                        (Core.TermVariable (Core.Name "y"))])}))}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "_hoist_y_body_1"),
+                          Core.bindingTerm = (Core.TermList [
+                            Core.TermVariable (Core.Name "x"),
+                            (Core.TermVariable (Core.Name "y"))]),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_y_body_1"))}))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: non-let term is unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistApplications: bare application unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateApplications,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: term referring to let-bound variable needs no capture",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: term referring to lambda above let needs no capture",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermVariable (Core.Name "y"),
+                        (Core.TermVariable (Core.Name "x"))])}))}))}))),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                          Core.bindingTerm = (Core.TermList [
+                            Core.TermVariable (Core.Name "y"),
+                            (Core.TermVariable (Core.Name "x"))]),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))}))}))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: lambda-bound var not free in hoisted term needs no capture",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermVariable (Core.Name "x"),
+                        (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))})))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))}))})))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: lambda-bound var free in hoisted term requires capture",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermVariable (Core.Name "x"),
+                        (Core.TermVariable (Core.Name "y"))])}))})))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermList [
+                            Core.TermVariable (Core.Name "x"),
+                            (Core.TermVariable (Core.Name "y"))])}))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_x_body_1")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: only free lambda-bound vars are captured",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "a"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "b"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermVariable (Core.Name "b"))])}))})))})))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermList [
+                            Core.TermVariable (Core.Name "x"),
+                            (Core.TermVariable (Core.Name "b"))])}))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "a"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "b"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_x_body_1")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))})))})))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: stable naming for binding and body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_x_1"),
+                            Core.bindingTerm = (Core.TermList [
+                              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_1"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: stable naming for multiple bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_x_1"),
+                            Core.bindingTerm = (Core.TermList [
+                              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_1"))}))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_y_1"),
+                            Core.bindingTerm = (Core.TermList [
+                              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_y_1"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "hoistLists: polymorphic binding with self-reference below hoisted term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistSubterms (Testing.HoistSubtermsTestCase {
+                Testing.hoistSubtermsTestCasePredicate = Testing.HoistPredicateLists,
+                Testing.hoistSubtermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                          Core.applicationArgument = (Core.TermList [
+                            Core.TermVariable (Core.Name "x"),
+                            (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                Testing.hoistSubtermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermList [
+                                Core.TermVariable (Core.Name "x"),
+                                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])}))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "hoistCaseStatements",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case at top level of let body is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "Optional"),
+                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "just"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "nothing"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "Optional"),
+                    Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "just"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "nothing"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in let binding value is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "z"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "z"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case inside lambda body is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))}))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case inside nested lambdas is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Result"),
+                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "ok"),
+                                Core.fieldTerm = (Core.TermVariable (Core.Name "b"))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "err"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Result"),
+                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "ok"),
+                                Core.fieldTerm = (Core.TermVariable (Core.Name "b"))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "err"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case as LHS of one application is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case wrapped in annotation is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                        Core.annotatedTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.annotatedTermAnnotation = M.empty})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermAnnotated (Core.AnnotatedTerm {
+                        Core.annotatedTermBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.annotatedTermAnnotation = M.empty})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in lambda with one application is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = Nothing,
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = Nothing,
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case as RHS of application IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_f_1"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in nested application LHS IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = Nothing,
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "z"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "w"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "w"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "z"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "w"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "w"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case inside list element IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))]),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "_hoist_f_1")])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case inside lambda inside list IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "a"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))]),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "a"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "Optional"),
+                                Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "just"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "y"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "nothing"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermList [
+                          Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "a"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list inside lambda is NOT hoisted (only case statements)",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "a"),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "a"),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in binding is not hoisted, case in arg position is hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "z"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "Optional"),
+                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "just"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "w"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermVariable (Core.Name "w"))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "nothing"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "z"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "_hoist_x_body_1"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "w"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "w"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_x_body_1"))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in nested let body is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "Optional"),
+                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "z"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "just"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "w"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermVariable (Core.Name "w"))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "nothing"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "Optional"),
+                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "z"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "just"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "w"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermVariable (Core.Name "w"))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "nothing"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in let inside lambda is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "x"),
+                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "x"),
+                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in lambda inside let body is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "a"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "Optional"),
+                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "just"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "y"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "nothing"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "a"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                      Core.caseStatementTypeName = (Core.Name "Optional"),
+                      Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                      Core.caseStatementCases = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "just"),
+                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "y"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "nothing"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case with let+lambda+app is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "x"),
+                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "x"),
+                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in triple application LHS IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "a"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "c"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))})))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "c"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))})))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "z"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "a"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "c"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))})))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "c"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})))})))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case as second argument IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_f_1"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in both arguments - both hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]}))))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "x"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing},
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_2"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_f_1"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_f_2"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in second list element IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                        (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))]),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                          (Core.TermVariable (Core.Name "_hoist_f_1"))])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple cases in list - all hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "x"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))),
+                        (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]}))))]),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "x"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing},
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_2"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "_hoist_f_1"),
+                          (Core.TermVariable (Core.Name "_hoist_f_2"))])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in pair first element IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermPair (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "y"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "_hoist_f_1"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in pair second element IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "y"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermVariable (Core.Name "_hoist_f_1"))))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in child let binding hoisted into child",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "inner"),
+                            Core.bindingTerm = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                              Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "Optional"),
+                                Core.caseStatementDefault = Nothing,
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "just"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "y"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "nothing"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermVariable (Core.Name "inner"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "inner"),
+                            Core.bindingTerm = (Core.TermLet (Core.Let {
+                              Core.letBindings = [
+                                Core.Binding {
+                                  Core.bindingName = (Core.Name "_hoist_inner_1"),
+                                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                    Core.caseStatementTypeName = (Core.Name "Optional"),
+                                    Core.caseStatementDefault = Nothing,
+                                    Core.caseStatementCases = [
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "just"),
+                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "y"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "nothing"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                                  Core.bindingType = Nothing}],
+                              Core.letBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_inner_1"))}))})),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermVariable (Core.Name "inner"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in child let body hoisted into child",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "inner"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = Nothing,
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "inner"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "_hoist_inner_body_1"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "Optional"),
+                                Core.caseStatementDefault = Nothing,
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "just"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "y"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "nothing"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_inner_body_1"))}))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case at top level of child let NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "inner"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermVariable (Core.Name "inner"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "inner"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermVariable (Core.Name "inner"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cases in both outer and child - each hoisted locally",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
+                        Core.applicationArgument = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "inner"),
+                              Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = (Core.Name "Optional"),
+                                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
+                                  Core.caseStatementCases = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "just"),
+                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "y"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "nothing"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]}))))})),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermVariable (Core.Name "inner"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_outer_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "x"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_outer_1"))})),
+                          Core.applicationArgument = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "inner"),
+                                Core.bindingTerm = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "_hoist_inner_1"),
+                                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "b"))),
+                                        Core.caseStatementCases = [
+                                          Core.Field {
+                                            Core.fieldName = (Core.Name "just"),
+                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "y"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                          Core.Field {
+                                            Core.fieldName = (Core.Name "nothing"),
+                                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}]})))),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "_hoist_inner_1"))}))})),
+                                Core.bindingType = Nothing}],
+                            Core.letBody = (Core.TermVariable (Core.Name "inner"))}))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda after app LHS takes us out of top level",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "a"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "a"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "Optional"),
+                                Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "just"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "y"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "nothing"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "a"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case inside case branch is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "a"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "Optional"),
+                                Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "just"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "nothing"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "a"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "Optional"),
+                                Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "just"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "nothing"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case inside case default branch is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "a"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "a"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "y"))),
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "b"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in arg position inside case branch IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Optional"),
+                        Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "just"),
+                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "a"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = (Core.Name "Optional"),
+                                  Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                                  Core.caseStatementCases = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "just"),
+                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "b"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "nothing"),
+                                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))})))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "nothing"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "a"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                Core.caseStatementTypeName = (Core.Name "Optional"),
+                                Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "a"))),
+                                Core.caseStatementCases = [
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "just"),
+                                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "b"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermVariable (Core.Name "b"))})))},
+                                  Core.Field {
+                                    Core.fieldName = (Core.Name "nothing"),
+                                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))}))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = (Just (Core.TermVariable (Core.Name "x"))),
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "a"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]}))))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in let body inside applied case default IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "a"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "b"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                    Core.caseStatementTypeName = (Core.Name "Result"),
+                                    Core.caseStatementDefault = Nothing,
+                                    Core.caseStatementCases = [
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "ok"),
+                                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                          Core.lambdaParameter = (Core.Name "y"),
+                                          Core.lambdaDomain = Nothing,
+                                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                      Core.Field {
+                                        Core.fieldName = (Core.Name "err"),
+                                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "a"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "a"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLet (Core.Let {
+                                Core.letBindings = [
+                                  Core.Binding {
+                                    Core.bindingName = (Core.Name "b"),
+                                    Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                                    Core.bindingType = Nothing}],
+                                Core.letBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "_hoist_b_body_1"),
+                                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                        Core.caseStatementTypeName = (Core.Name "Result"),
+                                        Core.caseStatementDefault = Nothing,
+                                        Core.caseStatementCases = [
+                                          Core.Field {
+                                            Core.fieldName = (Core.Name "ok"),
+                                            Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                              Core.lambdaParameter = (Core.Name "y"),
+                                              Core.lambdaDomain = Nothing,
+                                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                          Core.Field {
+                                            Core.fieldName = (Core.Name "err"),
+                                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_b_body_1")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))}))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case in let body inside applied case branch IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "a"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "b"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                      Core.caseStatementTypeName = (Core.Name "Result"),
+                                      Core.caseStatementDefault = Nothing,
+                                      Core.caseStatementCases = [
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "ok"),
+                                          Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                            Core.lambdaParameter = (Core.Name "y"),
+                                            Core.lambdaDomain = Nothing,
+                                            Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                        Core.Field {
+                                          Core.fieldName = (Core.Name "err"),
+                                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "a"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermLet (Core.Let {
+                                  Core.letBindings = [
+                                    Core.Binding {
+                                      Core.bindingName = (Core.Name "b"),
+                                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                      Core.bindingType = Nothing}],
+                                  Core.letBody = (Core.TermLet (Core.Let {
+                                    Core.letBindings = [
+                                      Core.Binding {
+                                        Core.bindingName = (Core.Name "_hoist_b_body_1"),
+                                        Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                          Core.caseStatementTypeName = (Core.Name "Result"),
+                                          Core.caseStatementDefault = Nothing,
+                                          Core.caseStatementCases = [
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "ok"),
+                                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                                Core.lambdaParameter = (Core.Name "y"),
+                                                Core.lambdaDomain = Nothing,
+                                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                            Core.Field {
+                                              Core.fieldName = (Core.Name "err"),
+                                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                                        Core.bindingType = Nothing}],
+                                    Core.letBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_b_body_1")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))}))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case application at top level of binding is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                          Core.caseStatementTypeName = (Core.Name "Optional"),
+                          Core.caseStatementDefault = Nothing,
+                          Core.caseStatementCases = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "just"),
+                              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "nothing"),
+                              Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case application in arg position IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = Nothing,
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case application inside immediately-applied lambda IS hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "a"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "_hoist_f_1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                              Core.caseStatementTypeName = (Core.Name "Optional"),
+                              Core.caseStatementDefault = Nothing,
+                              Core.caseStatementCases = [
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "just"),
+                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                                Core.Field {
+                                  Core.fieldName = (Core.Name "nothing"),
+                                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "a"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "_hoist_f_1")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "case application in lambda body is NOT hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistCaseStatements (Testing.HoistCaseStatementsTestCase {
+                Testing.hoistCaseStatementsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = Nothing,
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.hoistCaseStatementsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                            Core.caseStatementTypeName = (Core.Name "Optional"),
+                            Core.caseStatementDefault = Nothing,
+                            Core.caseStatementCases = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "just"),
+                                Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "y"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "nothing"),
+                                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}]})))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Hoisting/Let.hs b/src/gen-test/haskell/Hydra/Test/Hoisting/Let.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-test/haskell/Hydra/Test/Hoisting/Let.hs
@@ -0,0 +1,2564 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Test cases for let-binding hoisting transformations
+
+module Hydra.Test.Hoisting.Let where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Test cases for let-binding hoisting transformations
+allTests :: Testing.TestGroup
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hoistLet",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "hoistLetBindings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested let inside lambda: binding hoisted with lambda capture",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistLetBindings (Testing.HoistLetBindingsTestCase {
+                Testing.hoistLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "g"),
+                              Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "g"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
+                Testing.hoistLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "type application: nested let outside lambda CAN be hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistLetBindings (Testing.HoistLetBindingsTestCase {
+                Testing.hoistLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "y"),
+                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
+                Testing.hoistLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                        Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "f_y"))}))}))),
+                        Core.typeApplicationTermType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "hoistPolymorphicLetBindings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no polymorphic bindings: simple let unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no polymorphic bindings: multiple monomorphic bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hi")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hi")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single polymorphic binding: already at top level",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding inside lambda: no capture",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "id"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "x"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "b"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f_id")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_id"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "b"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "b"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding captures lambda variable: wrapped in lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "g"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "x"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "b"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))}))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "b"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "a"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "b"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding captures multiple lambda variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "g"),
+                                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermVariable (Core.Name "triple")),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [
+                                    Core.Name "c"],
+                                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
+                                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "c"))})),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "c"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "a"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "b"),
+                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "triple")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "c"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "c"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding captures some but not all lambda variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "g"),
+                                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [
+                                    Core.Name "c"],
+                                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
+                                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                                      Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "c"))}))})),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "c"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "a"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "c"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
+                            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "c"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding captures both lambda-bound and let-bound variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "x"),
+                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [],
+                                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                Core.typeSchemeConstraints = Nothing}))},
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "g"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "b"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "x"),
+                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [],
+                                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "b"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "a"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "y"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "b"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sibling polymorphic bindings inside lambda: one calls the other",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "outer"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "g"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "a"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                                Core.typeSchemeConstraints = Nothing}))},
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "h"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "z"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "b"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "outer"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_h")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "a"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "outer"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "y"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_h"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "b"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "outer"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "z"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_g")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "b"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sibling polymorphic bindings inside lambda: h passes its own args to g",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "outer"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "g"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "v"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "t"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))})))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "a"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
+                                Core.typeSchemeConstraints = Nothing}))},
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "h"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "v"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "t"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "b"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "outer"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_h")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "a"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "outer"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "t"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))}))})))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_h"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "b"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "outer"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "v"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "t"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_g")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "outer"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "b"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "untyped binding: not hoisted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no name collision: distinct names after unshadowing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "id2"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "b"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f_id2")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_id2"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "b"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "b"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested polymorphic binding calls enclosing polymorphic binding",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "outer"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "g"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "a"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "inner"),
+                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                            Core.lambdaBody = (Core.TermLet (Core.Let {
+                              Core.letBindings = [
+                                Core.Binding {
+                                  Core.bindingName = (Core.Name "h"),
+                                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "z"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))}))),
+                                  Core.bindingType = (Just (Core.TypeScheme {
+                                    Core.typeSchemeVariables = [
+                                      Core.Name "b"],
+                                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                                    Core.typeSchemeConstraints = Nothing}))}],
+                              Core.letBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "outer"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "inner"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_h")),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "a"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_h"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "b"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "z"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "b"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding captures monomorphic sibling in same let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "left"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "right"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "sleft"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "left"))})),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [],
+                                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                  Core.typeSchemeConstraints = Nothing}))},
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "sright"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "right"))})),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [],
+                                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                  Core.typeSchemeConstraints = Nothing}))},
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "cannotUnify"),
+                                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                        Core.applicationArgument = (Core.TermVariable (Core.Name "sright"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [
+                                    Core.Name "a"],
+                                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "cannotUnify")),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "left"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "right"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "sleft"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "left"))})),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [],
+                                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                  Core.typeSchemeConstraints = Nothing}))},
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "sright"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "right"))})),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [],
+                                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_cannotUnify")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "sright"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_cannotUnify"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "a"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "sleft"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "sright"),
+                            Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "sright"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested lets: poly binding references poly sibling from outer let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "left"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "sleft"),
+                              Core.bindingTerm = (Core.TermVariable (Core.Name "left")),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [],
+                                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "cannotUnify"),
+                                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "x"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [
+                                    Core.Name "a"],
+                                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermLet (Core.Let {
+                              Core.letBindings = [
+                                Core.Binding {
+                                  Core.bindingName = (Core.Name "joinList"),
+                                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "cannotUnify")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
+                                  Core.bindingType = (Just (Core.TypeScheme {
+                                    Core.typeSchemeVariables = [
+                                      Core.Name "b"],
+                                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                                    Core.typeSchemeConstraints = Nothing}))}],
+                              Core.letBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "joinList")),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "left"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "sleft"),
+                              Core.bindingTerm = (Core.TermVariable (Core.Name "left")),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [],
+                                Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_joinList")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_cannotUnify"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "a"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "sleft"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "wrapper_joinList"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "b"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "sleft"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "y"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper_cannotUnify")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "sleft"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "b"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "wrapper")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding with pair: type applications preserved",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "b"),
+                        Core.lambdaDomain = (Just (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString))),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "init"),
+                              Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                                Core.typeLambdaParameter = (Core.Name "t0"),
+                                Core.typeLambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                    Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                      Core.typeApplicationTermBody = (Core.TermList []),
+                                      Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}), (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "singleton")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})))),
+                                    Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                                  Core.typeApplicationTermType = (Core.TypeSet (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)))}))})),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "t0"],
+                                Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                                  Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                                  Core.pairTypeSecond = (Core.TypeSet (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermVariable (Core.Name "init"))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+                          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                            Core.pairTypeSecond = (Core.TypeSet (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "name_x"))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "b"),
+                        Core.lambdaDomain = (Just (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString))),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f_init")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+                          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                            Core.pairTypeSecond = (Core.TypeSet (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_init"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t0"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = (Just (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString))),
+                          Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                            Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                              Core.typeApplicationTermBody = (Core.TermPair (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermList []),
+                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "t0"))}), (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "singleton")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})))),
+                              Core.typeApplicationTermType = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                            Core.typeApplicationTermType = (Core.TypeSet (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)))}))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)),
+                          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                            Core.pairTypeSecond = (Core.TypeSet (Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "name_x"))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "monomorphic binding captures type vars: replacement includes type applications",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "a"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "b"),
+                          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
+                            Core.lambdaBody = (Core.TermLet (Core.Let {
+                              Core.letBindings = [
+                                Core.Binding {
+                                  Core.bindingName = (Core.Name "q"),
+                                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "y"),
+                                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
+                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
+                                  Core.bindingType = (Just (Core.TypeScheme {
+                                    Core.typeSchemeVariables = [],
+                                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                                    Core.typeSchemeConstraints = Nothing}))}],
+                              Core.letBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "q")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a",
+                          (Core.Name "b")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "a"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "b"),
+                          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                Core.typeApplicationTermBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                                  Core.typeApplicationTermBody = (Core.TermVariable (Core.Name "f_q")),
+                                  Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "a"))})),
+                                Core.typeApplicationTermType = (Core.TypeVariable (Core.Name "b"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a",
+                          (Core.Name "b")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_q"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "a"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "b"),
+                          Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "y"),
+                            Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a",
+                          (Core.Name "b")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "hoistPolymorphicTypeParameters",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested function types: all type variables must be declared",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "choose"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "forLeft"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "forRight"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "e"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "forLeft")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t0",
+                                (Core.Name "t1"),
+                                (Core.Name "t2")],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermVariable (Core.Name "choose"))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "f_choose")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_choose"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t0"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "t1"),
+                          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "t2"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "forLeft"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "forRight"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "e"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "forLeft")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))})))}))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0",
+                          (Core.Name "t1"),
+                          (Core.Name "t2")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "type variable in return position only",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "returnT"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "unit"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = Core.TypeUnit,
+                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermVariable (Core.Name "returnT"))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = Core.TypeUnit,
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "f_returnT")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = Core.TypeUnit,
+                          Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_returnT"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "unit"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = Core.TypeUnit,
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "type variables in deeply nested generics",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "nested"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t0",
+                                (Core.Name "t1"),
+                                (Core.Name "t2")],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypePair (Core.PairType {
+                                  Core.pairTypeFirst = (Core.TypePair (Core.PairType {
+                                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
+                                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t2"))})),
+                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermVariable (Core.Name "nested"))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                            Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "f_nested")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                            Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+                          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_nested"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t0"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "t1"),
+                          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "t2"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))}))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0",
+                          (Core.Name "t1"),
+                          (Core.Name "t2")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
+                            Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t2"))})),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple bindings with overlapping type variable names",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "id1"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
+                              Core.typeSchemeConstraints = Nothing}))},
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "id2"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "y"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "id1"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "id2"))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                          Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                          Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "outer_id1"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "outer_id2"))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                          Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                          Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer_id1"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "outer_id2"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "outer"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "captured variable with type parameters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "g"),
+                              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "x"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                              Core.bindingType = (Just (Core.TypeScheme {
+                                Core.typeSchemeVariables = [
+                                  Core.Name "t"],
+                                Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t"))}))})),
+                                Core.typeSchemeConstraints = Nothing}))}],
+                          Core.letBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f_g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                          Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                            Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t"),
+                        Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "a"),
+                          Core.lambdaDomain = (Just (Core.TypeLiteral Core.LiteralTypeString)),
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "pair")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "short type variable names are treated as type parameters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "g"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "s"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "t"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "s",
+                                (Core.Name "t"),
+                                (Core.Name "v")],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "s")),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "v"))}))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermVariable (Core.Name "g"))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "f_g")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "s"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "t"),
+                          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "v"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "s"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "t"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))})))}))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "s",
+                          (Core.Name "t"),
+                          (Core.Name "v")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "s")),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "v"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "numbered type variables like t0 t1 t2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "g"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t0",
+                                (Core.Name "t1"),
+                                (Core.Name "t2")],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermVariable (Core.Name "g"))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "f_g")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f_g"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t0"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "t1"),
+                          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "t2"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "y"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermVariable (Core.Name "undefined"))})))})))}))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0",
+                          (Core.Name "t1"),
+                          (Core.Name "t2")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "choose pattern from mutateTrace",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseHoistPolymorphicLetBindings (Testing.HoistPolymorphicLetBindingsTestCase {
+                Testing.hoistPolymorphicLetBindingsTestCaseInput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "mutateTrace"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "mutate"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "restore"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "f"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermLet (Core.Let {
+                              Core.letBindings = [
+                                Core.Binding {
+                                  Core.bindingName = (Core.Name "choose"),
+                                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                    Core.lambdaParameter = (Core.Name "forLeft"),
+                                    Core.lambdaDomain = Nothing,
+                                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                      Core.lambdaParameter = (Core.Name "forRight"),
+                                      Core.lambdaDomain = Nothing,
+                                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "e"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermVariable (Core.Name "forLeft")),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))}))),
+                                  Core.bindingType = (Just (Core.TypeScheme {
+                                    Core.typeSchemeVariables = [
+                                      Core.Name "t0",
+                                      (Core.Name "t1"),
+                                      (Core.Name "t2")],
+                                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                                        Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                                    Core.typeSchemeConstraints = Nothing}))}],
+                              Core.letBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "choose")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "forLeft"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "forRight"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}))})))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "mutateTrace"))},
+                Testing.hoistPolymorphicLetBindingsTestCaseOutput = Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "mutateTrace"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "mutate"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "restore"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "f"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "mutateTrace_choose")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "forLeft"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "forRight"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "mutateTrace_choose"),
+                      Core.bindingTerm = (Core.TermTypeLambda (Core.TypeLambda {
+                        Core.typeLambdaParameter = (Core.Name "t0"),
+                        Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                          Core.typeLambdaParameter = (Core.Name "t1"),
+                          Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                            Core.typeLambdaParameter = (Core.Name "t2"),
+                            Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "forLeft"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                Core.lambdaParameter = (Core.Name "forRight"),
+                                Core.lambdaDomain = Nothing,
+                                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "e"),
+                                  Core.lambdaDomain = Nothing,
+                                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "forLeft")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))})))})))})))}))}))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0",
+                          (Core.Name "t1"),
+                          (Core.Name "t2")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermVariable (Core.Name "mutateTrace"))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Inference/AlgebraicTypes.hs b/src/gen-test/haskell/Hydra/Test/Inference/AlgebraicTypes.hs
--- a/src/gen-test/haskell/Hydra/Test/Inference/AlgebraicTypes.hs
+++ b/src/gen-test/haskell/Hydra/Test/Inference/AlgebraicTypes.hs
@@ -15,1213 +15,1258 @@
 
 -- | Algebraic data type tests
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Algebraic terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    testGroupForCollectionPrimitives,
-    testGroupForEithers,
-    testGroupForFolds,
-    testGroupForLists,
-    testGroupForMaps,
-    testGroupForOptionals,
-    testGroupForPairs,
-    testGroupForSets],
-  Testing.testGroupCases = []}
-
-testGroupForCollectionPrimitives :: Testing.TestGroup
-testGroupForCollectionPrimitives = Testing.TestGroup {
-  Testing.testGroupName = "Collection primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "maps.map applied to a function",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x")])})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
-                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
-                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "sets.map applied to a function",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.functionTypeCodomain = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length")))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeSet (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
-                Core.functionTypeCodomain = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Composing collection primitives in let",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
-                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermMap (M.fromList [
-                      (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList [
-                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                        (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))]))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "g"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeMap (Core.MapType {
-                Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.mapTypeValues = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Map operations in lambdas",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "m"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length")))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
-                Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "f"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "m"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))})))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1"),
-                (Core.Name "t2")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
-                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t2")),
-                    Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t2")),
-                    Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Fully applied collection conversions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))])}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeMap (Core.MapType {
-                Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))])}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeMap (Core.MapType {
-                Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.mapTypeValues = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]}],
-  Testing.testGroupCases = []}
-
-testGroupForEithers :: Testing.TestGroup
-testGroupForEithers = Testing.TestGroup {
-  Testing.testGroupName = "Either terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Left values",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))),
-              (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error")))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Right values",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))),
-              (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Polymorphic either values",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermEither (Left (Core.TermList []))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermEither (Right (Core.TermList []))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-                Core.eitherTypeRight = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Nested either values",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermEither (Left (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))))),
-              (Core.TermEither (Left (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "nested")))))),
-              (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True))))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeBoolean)}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermEither (Right (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))),
-              (Core.TermEither (Right (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))))),
-              (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "foo"))))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Either in lambda",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "x"))))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
-                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "x"))))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t1")),
-                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Either in data structures",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))),
-              (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [
-              Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))),
-              (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))], (Core.TermList []))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeList (Core.TypeEither (Core.EitherType {
-                  Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-testGroupForFolds :: Testing.TestGroup
-testGroupForFolds = Testing.TestGroup {
-  Testing.testGroupName = "Eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "List eliminations (folds)",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Optional eliminations",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-              Core.applicationArgument = (Core.TermMaybe Nothing)})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.pure")))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0"))),
-                Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x")])})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0"))),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]}],
-  Testing.testGroupCases = []}
-
-testGroupForLists :: Testing.TestGroup
-testGroupForLists = Testing.TestGroup {
-  Testing.testGroupName = "List terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "List of strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "foo"),
-              (Core.TermLiteral (Core.LiteralString "bar"))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "List of lists of strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralString "foo")],
-              (Core.TermList [])]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Empty list",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList []),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "List containing an empty list",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermList []]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Lambda producing a polymorphic list",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x")])}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Lambda producing a list of integers",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))])}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "List with repeated variables",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermLiteral (Core.LiteralString "foo")),
-                (Core.TermVariable (Core.Name "x"))])}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-testGroupForMaps :: Testing.TestGroup
-testGroupForMaps = Testing.TestGroup {
-  Testing.testGroupName = "Map terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#1",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermMap (M.fromList [
-          (Core.TermLiteral (Core.LiteralString "firstName"), (Core.TermLiteral (Core.LiteralString "Arthur"))),
-          (Core.TermLiteral (Core.LiteralString "lastName"), (Core.TermLiteral (Core.LiteralString "Dent")))])),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeMap (Core.MapType {
-            Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-            Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#2",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermMap M.empty),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0",
-            (Core.Name "t1")],
-          Core.typeSchemeType = (Core.TypeMap (Core.MapType {
-            Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-            Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#3",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-            Core.lambdaParameter = (Core.Name "y"),
-            Core.lambdaDomain = Nothing,
-            Core.lambdaBody = (Core.TermMap (M.fromList [
-              (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.1)))),
-              (Core.TermVariable (Core.Name "y"), (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.2))))]))})))}))),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0"],
-          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
-                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
-                Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))}))}))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]}]}
-
-testGroupForOptionals :: Testing.TestGroup
-testGroupForOptionals = Testing.TestGroup {
-  Testing.testGroupName = "Optional terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#1",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#2",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermMaybe Nothing),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0"],
-          Core.typeSchemeType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0"))),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]}]}
-
-testGroupForPairs :: Testing.TestGroup
-testGroupForPairs = Testing.TestGroup {
-  Testing.testGroupName = "Pair terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Monotyped pairs",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "foo"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "foo"), (Core.TermList [
-              Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 42.0)),
-              (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 137.0)))]))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Polytyped pairs",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermLiteral (Core.LiteralString "foo")))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermList []))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Nested pairs",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "nested"))), (Core.TermLiteral (Core.LiteralBoolean True)))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "foo"), (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermList [
-              Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 42.0))]))))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Pairs in lambda",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralString "constant"))))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "p"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "p"), (Core.TermVariable (Core.Name "p"))))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Pairs in data structures",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralString "b"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermPair (Core.TermList [], (Core.TermLiteral (Core.LiteralString "foo")))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeList (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Additional cases",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo")))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermLiteral (Core.LiteralString "foo")))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermList []))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]}],
-  Testing.testGroupCases = []}
-
-testGroupForSets :: Testing.TestGroup
-testGroupForSets = Testing.TestGroup {
-  Testing.testGroupName = "Set terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#1",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermLiteral (Core.LiteralBoolean True)])),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeBoolean)),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#2",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermSet (S.fromList [
-          Core.TermSet S.empty])),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0"],
-          Core.typeSchemeType = (Core.TypeSet (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]}]}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Algebraic terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        testGroupForCollectionPrimitives,
+        testGroupForEithers,
+        testGroupForFolds,
+        testGroupForLists,
+        testGroupForMaps,
+        testGroupForOptionals,
+        testGroupForPairs,
+        testGroupForSets],
+      Testing.testGroupCases = []}
+
+testGroupForCollectionPrimitives :: Testing.TestGroup
+testGroupForCollectionPrimitives =
+    Testing.TestGroup {
+      Testing.testGroupName = "Collection primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "maps.map applied to a function",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x")])})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])}),
+                    (Core.Name "t1", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "sets.map applied to a function",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.functionTypeCodomain = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length")))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeSet (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
+                    Core.functionTypeCodomain = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Composing collection primitives in let",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])}),
+                    (Core.Name "t1", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermMap (M.fromList [
+                          (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList [
+                            Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                            (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))]))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "g"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.mapTypeValues = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Map operations in lambdas",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "m"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length")))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "f"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "m"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1"),
+                    (Core.Name "t2")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t2")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t2")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t2", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Fully applied collection conversions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))])}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList [
+                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                        (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))])}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.mapTypeValues = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
+
+testGroupForEithers :: Testing.TestGroup
+testGroupForEithers =
+    Testing.TestGroup {
+      Testing.testGroupName = "Either terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Left values",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))),
+                  (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error")))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Right values",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))),
+                  (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Polymorphic either values",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermEither (Left (Core.TermList []))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermEither (Right (Core.TermList []))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                    Core.eitherTypeRight = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Nested either values",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermEither (Left (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))))),
+                  (Core.TermEither (Left (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "nested")))))),
+                  (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True))))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeBoolean)}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermEither (Right (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))),
+                  (Core.TermEither (Right (Core.TermEither (Right (Core.TermLiteral (Core.LiteralBoolean True)))))),
+                  (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "foo"))))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Either in lambda",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Left (Core.TermVariable (Core.Name "x"))))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t0")),
+                      Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t1"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermEither (Right (Core.TermVariable (Core.Name "x"))))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "t1")),
+                      Core.eitherTypeRight = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Either in data structures",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))),
+                  (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [
+                  Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "error"))),
+                  (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))], (Core.TermList []))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeList (Core.TypeEither (Core.EitherType {
+                      Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                    Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForFolds :: Testing.TestGroup
+testGroupForFolds =
+    Testing.TestGroup {
+      Testing.testGroupName = "Eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "List eliminations (folds)",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Optional eliminations",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.pure")))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x")])})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
+
+testGroupForLists :: Testing.TestGroup
+testGroupForLists =
+    Testing.TestGroup {
+      Testing.testGroupName = "List terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "List of strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "foo"),
+                  (Core.TermLiteral (Core.LiteralString "bar"))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "List of lists of strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "foo")],
+                  (Core.TermList [])]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Empty list",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList []),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "List containing an empty list",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermList []]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Lambda producing a polymorphic list",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x")])}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Lambda producing a list of integers",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))])}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "List with repeated variables",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermLiteral (Core.LiteralString "foo")),
+                    (Core.TermVariable (Core.Name "x"))])}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForMaps :: Testing.TestGroup
+testGroupForMaps =
+    Testing.TestGroup {
+      Testing.testGroupName = "Map terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#1",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermMap (M.fromList [
+              (Core.TermLiteral (Core.LiteralString "firstName"), (Core.TermLiteral (Core.LiteralString "Arthur"))),
+              (Core.TermLiteral (Core.LiteralString "lastName"), (Core.TermLiteral (Core.LiteralString "Dent")))])),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#2",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermMap M.empty),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0",
+                (Core.Name "t1")],
+              Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
+              Core.typeSchemeConstraints = (Just (M.fromList [
+                (Core.Name "t0", Core.TypeVariableMetadata {
+                  Core.typeVariableMetadataClasses = (S.fromList [
+                    Core.Name "ordering"])})]))}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#3",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "y"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermMap (M.fromList [
+                  (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.1)))),
+                  (Core.TermVariable (Core.Name "y"), (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.2))))]))})))}))),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0"],
+              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                    Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64))}))}))})),
+              Core.typeSchemeConstraints = (Just (M.fromList [
+                (Core.Name "t0", Core.TypeVariableMetadata {
+                  Core.typeVariableMetadataClasses = (S.fromList [
+                    Core.Name "ordering"])})]))}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]}]}
+
+testGroupForOptionals :: Testing.TestGroup
+testGroupForOptionals =
+    Testing.TestGroup {
+      Testing.testGroupName = "Optional terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#1",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#2",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermMaybe Nothing),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0"],
+              Core.typeSchemeType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0"))),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]}]}
+
+testGroupForPairs :: Testing.TestGroup
+testGroupForPairs =
+    Testing.TestGroup {
+      Testing.testGroupName = "Pair terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Monotyped pairs",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "foo"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "foo"), (Core.TermList [
+                  Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 42.0)),
+                  (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 137.0)))]))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Polytyped pairs",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermLiteral (Core.LiteralString "foo")))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermList []))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Nested pairs",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "nested"))), (Core.TermLiteral (Core.LiteralBoolean True)))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "foo"), (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermList [
+                  Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 42.0))]))))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Pairs in lambda",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralString "constant"))))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "p"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "p"), (Core.TermVariable (Core.Name "p"))))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Pairs in data structures",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralString "b"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermPair (Core.TermList [], (Core.TermLiteral (Core.LiteralString "foo")))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Additional cases",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo")))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermLiteral (Core.LiteralString "foo")))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermList [], (Core.TermList []))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.pairTypeSecond = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
+
+testGroupForSets :: Testing.TestGroup
+testGroupForSets =
+    Testing.TestGroup {
+      Testing.testGroupName = "Set terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#1",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermLiteral (Core.LiteralBoolean True)])),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeBoolean)),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#2",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermSet (S.fromList [
+              Core.TermSet S.empty])),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0"],
+              Core.typeSchemeType = (Core.TypeSet (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))),
+              Core.typeSchemeConstraints = (Just (M.fromList [
+                (Core.Name "t0", Core.TypeVariableMetadata {
+                  Core.typeVariableMetadataClasses = (S.fromList [
+                    Core.Name "ordering"])})]))}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]}]}
diff --git a/src/gen-test/haskell/Hydra/Test/Inference/AlgorithmW.hs b/src/gen-test/haskell/Hydra/Test/Inference/AlgorithmW.hs
--- a/src/gen-test/haskell/Hydra/Test/Inference/AlgorithmW.hs
+++ b/src/gen-test/haskell/Hydra/Test/Inference/AlgorithmW.hs
@@ -15,423 +15,425 @@
 
 -- | Algorithm W test cases
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Algorithm W test cases",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    testGroupForSystemF],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Algorithm W test cases",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        testGroupForSystemF],
+      Testing.testGroupCases = []}
 
 testGroupForSystemF :: Testing.TestGroup
-testGroupForSystemF = Testing.TestGroup {
-  Testing.testGroupName = "STLC to System F",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#1",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-          Core.lambdaParameter = (Core.Name "x"),
-          Core.lambdaDomain = Nothing,
-          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0"],
-          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#2",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "foo"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#3",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#4",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#5",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "sng"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x")])}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "sng"))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0"],
-          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-            Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#6",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "sng"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x")])}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}), (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
-            Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "alice"))}))))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#7",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "+"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+testGroupForSystemF =
+    Testing.TestGroup {
+      Testing.testGroupName = "STLC to System F",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#1",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0"],
+              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#2",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "foo"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#3",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#4",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#5",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "sng"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x")])}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "sng"))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0"],
+              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#6",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "sng"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x")])}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}), (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
+                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "alice"))}))))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#7",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "+"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "+")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermApplication (Core.Application {
+                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "+")),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
                     Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
                     Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "+")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermApplication (Core.Application {
-            Core.applicationFunction = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "+")),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
                 Core.applicationArgument = (Core.TermApplication (Core.Application {
                   Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
                   Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
-            Core.applicationArgument = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#9",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0"],
-          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#10",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "g"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "xx"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "yy"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "xx"))}))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0",
-            (Core.Name "t1")],
-          Core.typeSchemeType = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-            Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#11",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "g"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "u"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0",
-            (Core.Name "t1"),
-            (Core.Name "t2"),
-            (Core.Name "t3")],
-          Core.typeSchemeType = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
-            Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))}))}))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#12",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "g"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "u"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0",
-            (Core.Name "t1")],
-          Core.typeSchemeType = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-            Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#13",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-          Core.letBindings = [
-            Core.Binding {
-              Core.bindingName = (Core.Name "f"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-              Core.bindingType = Nothing},
-            Core.Binding {
-              Core.bindingName = (Core.Name "g"),
-              Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "u"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
-              Core.bindingType = Nothing}],
-          Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [
-            Core.Name "t0",
-            (Core.Name "t1")],
-          Core.typeSchemeType = (Core.TypePair (Core.PairType {
-            Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-            Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#9",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0"],
+              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
                 Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
+                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#10",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "g"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "xx"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "yy"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "xx"))}))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0",
+                (Core.Name "t1")],
+              Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#11",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "g"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "u"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0",
+                (Core.Name "t1"),
+                (Core.Name "t2"),
+                (Core.Name "t3")],
+              Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
+                Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t3"))}))}))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#12",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "g"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "u"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0",
+                (Core.Name "t1")],
+              Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#13",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "f"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "g"),
+                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "u"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [
+                Core.Name "t0",
+                (Core.Name "t1")],
+              Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
diff --git a/src/gen-test/haskell/Hydra/Test/Inference/All.hs b/src/gen-test/haskell/Hydra/Test/Inference/All.hs
--- a/src/gen-test/haskell/Hydra/Test/Inference/All.hs
+++ b/src/gen-test/haskell/Hydra/Test/Inference/All.hs
@@ -6,6 +6,7 @@
 
 import qualified Hydra.Test.Inference.AlgebraicTypes as AlgebraicTypes
 import qualified Hydra.Test.Inference.AlgorithmW as AlgorithmW
+import qualified Hydra.Test.Inference.Classes as Classes
 import qualified Hydra.Test.Inference.Failures as Failures
 import qualified Hydra.Test.Inference.Fundamentals as Fundamentals
 import qualified Hydra.Test.Inference.KernelExamples as KernelExamples
@@ -20,14 +21,16 @@
 
 -- | The group of all inference tests
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "inference",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    AlgebraicTypes.allTests,
-    AlgorithmW.allTests,
-    Failures.allTests,
-    Fundamentals.allTests,
-    KernelExamples.allTests,
-    NominalTypes.allTests],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "inference",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        AlgebraicTypes.allTests,
+        AlgorithmW.allTests,
+        Classes.allTests,
+        Failures.allTests,
+        Fundamentals.allTests,
+        KernelExamples.allTests,
+        NominalTypes.allTests],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Inference/Classes.hs b/src/gen-test/haskell/Hydra/Test/Inference/Classes.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-test/haskell/Hydra/Test/Inference/Classes.hs
@@ -0,0 +1,1336 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Inference tests for type class constraints (ordering and equality)
+
+module Hydra.Test.Inference.Classes where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Type class constraint inference tests
+allTests :: Testing.TestGroup
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Type classes",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        testGroupForMonomorphicConstraints,
+        testGroupForPrimitiveReferences,
+        testGroupForPartialApplication,
+        testGroupForLetBindings,
+        testGroupForComposition,
+        testGroupForNestedContainers,
+        testGroupForCollectionTerms],
+      Testing.testGroupCases = []}
+
+testGroupForCollectionTerms :: Testing.TestGroup
+testGroupForCollectionTerms =
+    Testing.TestGroup {
+      Testing.testGroupName = "Collection term constraints",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Set literals",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermSet (S.fromList [
+                    Core.TermVariable (Core.Name "x")]))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermSet (S.fromList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermVariable (Core.Name "y"))]))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Map literals",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "k"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "v"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermMap (M.fromList [
+                      (Core.TermVariable (Core.Name "k"), (Core.TermVariable (Core.Name "v")))]))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))])),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Collection terms with primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermSet (S.fromList [
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}),
+                    (Core.TermVariable (Core.Name "x"))]))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "k"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermMap (M.fromList [
+                    (Core.TermVariable (Core.Name "k"), (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermVariable (Core.Name "k")])})))]))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Constraint propagation through collection elements",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "xs"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermMap (M.fromList [
+                    (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}), (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))})))]))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.mapTypeValues = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))}))),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermPair (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))})),
+                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "xs"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermSet (S.fromList [
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))})]))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeSet (Core.TypeSet (Core.TypeVariable (Core.Name "t0"))))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
+
+testGroupForComposition :: Testing.TestGroup
+testGroupForComposition =
+    Testing.TestGroup {
+      Testing.testGroupName = "Composition and constraint merging",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Composing constrained primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "xs"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x"))))})))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "f"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "xs"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t1", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Composing map and sort",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "m"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort")))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])}),
+                    (Core.Name "t1", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForLetBindings :: Testing.TestGroup
+testGroupForLetBindings =
+    Testing.TestGroup {
+      Testing.testGroupName = "Let binding constraint propagation",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Simple let-bound wrappers",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "lookup"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "k"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "m"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "lookup"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "member"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "s"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "member"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "fromList"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "fromList"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Let-bound with partial instantiation",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "m"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                            Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "xs"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Multiple uses of a constrained let binding",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))])}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermPair (Core.TermLiteral (Core.LiteralBoolean True), (Core.TermLiteral (Core.LiteralString "x")))])}))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                    Core.pairTypeSecond = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                      Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForMonomorphicConstraints :: Testing.TestGroup
+testGroupForMonomorphicConstraints =
+    Testing.TestGroup {
+      Testing.testGroupName = "Monomorphic (constraints vanish)",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Map operations with concrete types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))))])})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "k"))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.singleton"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "k"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "k"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty")))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Set operations with concrete types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.singleton"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Equality operations with concrete types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "b"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeVariable (Core.Name "hydra.util.Comparison")),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "List operations with concrete types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForNestedContainers :: Testing.TestGroup
+testGroupForNestedContainers =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nested containers",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Maps of sets",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "m"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "m"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeList (Core.TypeVariable (Core.Name "t1")))})),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])}),
+                    (Core.Name "t1", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Sets of sets",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "xss"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList")))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "xss"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeSet (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
+                    Core.functionTypeCodomain = (Core.TypeSet (Core.TypeSet (Core.TypeVariable (Core.Name "t0"))))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Map from sorted list",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "xs"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.singleton"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))))})))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "xs"))}))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForPartialApplication :: Testing.TestGroup
+testGroupForPartialApplication =
+    Testing.TestGroup {
+      Testing.testGroupName = "Partial application preserving constraints",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Map partial application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "k"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "k"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "k"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "v"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.singleton"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Set partial application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Equality partial application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "equality"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Partial application fixing the constrained variable",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "v"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.singleton"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "key"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForPrimitiveReferences :: Testing.TestGroup
+testGroupForPrimitiveReferences =
+    Testing.TestGroup {
+      Testing.testGroupName = "Primitive references with constraints",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Map primitives (ordering on key type)",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))),
+                    Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                      Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                      Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                          Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                          Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
+                        Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                          Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                          Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1"),
+                    (Core.Name "t2")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t2")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.functionTypeCodomain = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t2")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t2", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeMap (Core.MapType {
+                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "t0")),
+                    Core.mapTypeValues = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Set primitives (ordering on element type)",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeSet (Core.TypeVariable (Core.Name "t1")))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])}),
+                    (Core.Name "t1", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Equality primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "equality"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "hydra.util.Comparison"))}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "List primitives with constraints",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "ordering"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "equality"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                  Core.typeSchemeConstraints = (Just (M.fromList [
+                    (Core.Name "t0", Core.TypeVariableMetadata {
+                      Core.typeVariableMetadataClasses = (S.fromList [
+                        Core.Name "equality"])})]))}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Inference/Failures.hs b/src/gen-test/haskell/Hydra/Test/Inference/Failures.hs
--- a/src/gen-test/haskell/Hydra/Test/Inference/Failures.hs
+++ b/src/gen-test/haskell/Hydra/Test/Inference/Failures.hs
@@ -15,2168 +15,2182 @@
 
 -- | Expected failure tests
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Expected failures",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    undefinedVariableTests,
-    unificationFailureTests,
-    invalidApplicationTests,
-    selfApplicationTests,
-    arityMismatchTests,
-    recursiveTypeTests,
-    occurCheckTests,
-    typeConstructorMisuseTests,
-    polymorphismViolationTests,
-    letBindingMismatchTests,
-    constraintSolverEdgeCaseTests,
-    primitiveTypeErrorTests,
-    complexConstraintFailureTests],
-  Testing.testGroupCases = []}
-
-undefinedVariableTests :: Testing.TestGroup
-undefinedVariableTests = Testing.TestGroup {
-  Testing.testGroupName = "Undefined variable",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Basic unbound variables",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermVariable (Core.Name "x"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "y"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Unbound in let expressions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "z"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "z")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Shadowing scope errors",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "z"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "z"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-unificationFailureTests :: Testing.TestGroup
-unificationFailureTests = Testing.TestGroup {
-  Testing.testGroupName = "Unification failure",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Basic type mismatches",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-              (Core.TermLiteral (Core.LiteralString "foo"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))],
-              (Core.TermLiteral (Core.LiteralString "foo"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo")))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Collection type mismatches",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a list"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "foo")])])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermPair (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))], (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "foo")]))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "foo")])])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Conditional type mismatches",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Polymorphic instantiation conflicts",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}),
-                (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermPair (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "cons"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "cons")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}),
-                (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "cons")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-invalidApplicationTests :: Testing.TestGroup
-invalidApplicationTests = Testing.TestGroup {
-  Testing.testGroupName = "Invalid application",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Non-function application",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermLiteral (Core.LiteralString "foo")),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermLiteral (Core.LiteralBoolean True)),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Collection application",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))]),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo")))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermList []),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))))))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "index"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Primitive misapplication",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermMaybe Nothing),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "value"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermList []),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-selfApplicationTests :: Testing.TestGroup
-selfApplicationTests = Testing.TestGroup {
-  Testing.testGroupName = "Self-application",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Direct self-application",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Indirect self-application",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "b")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "a"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "cycle"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "cycle"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "cycle")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "cycle"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-arityMismatchTests :: Testing.TestGroup
-arityMismatchTests = Testing.TestGroup {
-  Testing.testGroupName = "Arity mismatch",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Too many arguments",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))])})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "extra"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Wrong argument types with extra args",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "extra"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "arg"))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-recursiveTypeTests :: Testing.TestGroup
-recursiveTypeTests = Testing.TestGroup {
-  Testing.testGroupName = "Recursive type construction",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Direct recursive types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermVariable (Core.Name "x")]),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x")))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Recursive function types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "f"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "f")])}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Mutually recursive types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermVariable (Core.Name "y")]),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "b"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "a")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "a"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermVariable (Core.Name "g")]),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "f")))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-occurCheckTests :: Testing.TestGroup
-occurCheckTests = Testing.TestGroup {
-  Testing.testGroupName = "Occur check failures",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Function occur checks",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "h"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "g"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "h"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "g"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Mutual occur checks",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "g"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "b")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "a"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "cycle1"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "cycle2")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "cycle1"))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "cycle2"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "cycle1")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "cycle1"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Complex occur checks",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "omega"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "omega"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "omega"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "loop"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "loop")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "loop"))}))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "loop"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-typeConstructorMisuseTests :: Testing.TestGroup
-typeConstructorMisuseTests = Testing.TestGroup {
-  Testing.testGroupName = "Type constructor misuse",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "List constructor errors",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a list"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "String constructor errors",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "foo")])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a list"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Math constructor errors",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-polymorphismViolationTests :: Testing.TestGroup
-polymorphismViolationTests = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphism violations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Identity function violations",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}),
-                (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermPair (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Constrained polymorphism violations",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))])}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralString "constant"))))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bad"))}))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "h"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermList [
-                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "incompatible"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Higher-order polymorphism violations",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "f"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "g"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}),
-                (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bad"))}))])})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "h"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "error"))}))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-letBindingMismatchTests :: Testing.TestGroup
-letBindingMismatchTests = Testing.TestGroup {
-  Testing.testGroupName = "Let binding type mismatches",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Application type mismatches",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "y"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "result"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "extra"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "g"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "num"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "num")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "num"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Collection type mismatches",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "list1"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))]),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "list2"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "list1"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "list2"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "nums"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "mixed"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bad"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "nums"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "mixed"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "pair1"),
-                  Core.bindingTerm = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo")))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "pair2"),
-                  Core.bindingTerm = (Core.TermPair (Core.TermLiteral (Core.LiteralString "bar"), (Core.TermVariable (Core.Name "pair1")))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "pair2"))}))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Function binding mismatches",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "add"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "badCall"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "add")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "badCall"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-constraintSolverEdgeCaseTests :: Testing.TestGroup
-constraintSolverEdgeCaseTests = Testing.TestGroup {
-  Testing.testGroupName = "Constraint solver edge cases",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Complex constraint propagation",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "complex"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "g"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))})))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "complex")),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "a"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Fixed point combinators",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "fix"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "fix")),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "rec"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "n"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "rec"))}))})))})))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "omega"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "omega")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "omega"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Constraint cycles",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "b")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "c"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "c")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "c"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "z"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "circular"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "circular"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "circular")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "circular"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-primitiveTypeErrorTests :: Testing.TestGroup
-primitiveTypeErrorTests = Testing.TestGroup {
-  Testing.testGroupName = "Primitive function type errors",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Logic primitive errors",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not boolean"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Collection primitive errors",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a map"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a list"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromMaybe"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not optional"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Math primitive errors",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-complexConstraintFailureTests :: Testing.TestGroup
-complexConstraintFailureTests = Testing.TestGroup {
-  Testing.testGroupName = "Complex constraint failures",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Multi-level constraint conflicts",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "h"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "z"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "weird"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "weird")),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "y"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "nested"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "g"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))}))})))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "int_f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "n"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "str_g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "s"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                      Core.applicationArgument = (Core.TermList [
-                        Core.TermVariable (Core.Name "s"),
-                        (Core.TermLiteral (Core.LiteralString "!"))])}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "nested")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "int_f"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "str_g"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Function composition failures",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "triple"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "increment"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "n"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "stringify"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "s"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-                      Core.applicationArgument = (Core.TermList [
-                        Core.TermVariable (Core.Name "s"),
-                        (Core.TermLiteral (Core.LiteralString "!"))])}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "triple")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "increment"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "stringify"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
-            Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "compose"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "g"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "reverse_compose"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "g"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "f"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bad"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "compose")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "reverse_compose"))})),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length")))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Expected failures",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        undefinedVariableTests,
+        unificationFailureTests,
+        invalidApplicationTests,
+        selfApplicationTests,
+        arityMismatchTests,
+        recursiveTypeTests,
+        occurCheckTests,
+        typeConstructorMisuseTests,
+        polymorphismViolationTests,
+        letBindingMismatchTests,
+        constraintSolverEdgeCaseTests,
+        primitiveTypeErrorTests,
+        complexConstraintFailureTests],
+      Testing.testGroupCases = []}
+
+arityMismatchTests :: Testing.TestGroup
+arityMismatchTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Arity mismatch",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Too many arguments",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 999)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))])})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "extra"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Wrong argument types with extra args",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "extra"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "arg"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+complexConstraintFailureTests :: Testing.TestGroup
+complexConstraintFailureTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Complex constraint failures",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Multi-level constraint conflicts",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "a"))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "h"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "z"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "weird"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "weird")),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "y"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "nested"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "g"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))}))})))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "int_f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "n"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "str_g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "s"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                          Core.applicationArgument = (Core.TermList [
+                            Core.TermVariable (Core.Name "s"),
+                            (Core.TermLiteral (Core.LiteralString "!"))])}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "nested")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "int_f"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "str_g"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Function composition failures",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "triple"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "increment"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "n"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "stringify"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "s"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                          Core.applicationArgument = (Core.TermList [
+                            Core.TermVariable (Core.Name "s"),
+                            (Core.TermLiteral (Core.LiteralString "!"))])}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "triple")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "increment"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "stringify"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "compose"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "g"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "reverse_compose"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "g"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "f"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "compose")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "reverse_compose"))})),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length")))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+constraintSolverEdgeCaseTests :: Testing.TestGroup
+constraintSolverEdgeCaseTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Constraint solver edge cases",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Complex constraint propagation",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "complex"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "g"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))})))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "complex")),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "a"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Fixed point combinators",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "fix"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "fix")),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "rec"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "n"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "rec"))}))})))})))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "omega"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "omega")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "omega"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Constraint cycles",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "b")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "c"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "c")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "c"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "z"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "circular"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "circular"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "circular")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "circular"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+invalidApplicationTests :: Testing.TestGroup
+invalidApplicationTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Invalid application",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Non-function application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermLiteral (Core.LiteralString "foo")),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermLiteral (Core.LiteralBoolean True)),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Collection application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))]),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo")))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermList []),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))))))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "index"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Primitive misapplication",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermMaybe Nothing),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "value"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermList []),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+letBindingMismatchTests :: Testing.TestGroup
+letBindingMismatchTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Let binding type mismatches",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Application type mismatches",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "y"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "result"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "extra"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "g"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "num"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "num")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "num"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Collection type mismatches",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "list1"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))]),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "list2"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "list1"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "list2"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "nums"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                        (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "mixed"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bad"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "nums"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "mixed"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "pair1"),
+                      Core.bindingTerm = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo")))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "pair2"),
+                      Core.bindingTerm = (Core.TermPair (Core.TermLiteral (Core.LiteralString "bar"), (Core.TermVariable (Core.Name "pair1")))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "pair2"))}))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Function binding mismatches",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "add"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "badCall"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "add")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "badCall"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bad"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "bad"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+occurCheckTests :: Testing.TestGroup
+occurCheckTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Occur check failures",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Function occur checks",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "h"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "g"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "h"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "g"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Mutual occur checks",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "g"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "b")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "a")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "b"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "a"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "cycle1"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "cycle2")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "cycle1"))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "cycle2"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "cycle1")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "cycle1"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Complex occur checks",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "omega"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "omega"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "omega"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "loop"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "loop")),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "loop"))}))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "loop"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+polymorphismViolationTests :: Testing.TestGroup
+polymorphismViolationTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphism violations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Identity function violations",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}),
+                    (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermPair (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Constrained polymorphism violations",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))])}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralString "constant"))))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bad"))}))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "h"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermList [
+                            Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "incompatible"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Higher-order polymorphism violations",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "f"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "g"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}),
+                    (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bad"))}))])})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "h"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "h")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "error"))}))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+primitiveTypeErrorTests :: Testing.TestGroup
+primitiveTypeErrorTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Primitive function type errors",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Logic primitive errors",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not boolean"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Collection primitive errors",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a map"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a list"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromMaybe"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not optional"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Math primitive errors",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+recursiveTypeTests :: Testing.TestGroup
+recursiveTypeTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Recursive type construction",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Direct recursive types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermVariable (Core.Name "x")]),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x")))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Recursive function types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "f"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "f")])}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Mutually recursive types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermVariable (Core.Name "y")]),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "b"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "a")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "a"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermVariable (Core.Name "g")]),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "f")))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+selfApplicationTests :: Testing.TestGroup
+selfApplicationTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Self-application",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Direct self-application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Indirect self-application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "b")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "a"))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "a"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "cycle"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "cycle"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "cycle")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "cycle"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+typeConstructorMisuseTests :: Testing.TestGroup
+typeConstructorMisuseTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Type constructor misuse",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "List constructor errors",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a list"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "String constructor errors",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "foo")])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a list"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Math constructor errors",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a number"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+undefinedVariableTests :: Testing.TestGroup
+undefinedVariableTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Undefined variable",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Basic unbound variables",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermVariable (Core.Name "x"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "y"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Unbound in let expressions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "z"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "z")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Shadowing scope errors",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "z"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "z"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+unificationFailureTests :: Testing.TestGroup
+unificationFailureTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Unification failure",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Basic type mismatches",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                  (Core.TermLiteral (Core.LiteralString "foo"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))],
+                  (Core.TermLiteral (Core.LiteralString "foo"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo")))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Collection type mismatches",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "not a list"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "foo")])])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermPair (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))], (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "foo")]))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "foo")])])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Conditional type mismatches",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Polymorphic instantiation conflicts",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}),
+                    (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermPair (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInferenceFailure (Testing.InferenceFailureTestCase {
+                Testing.inferenceFailureTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "cons"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "cons")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}),
+                    (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "cons")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Inference/Fundamentals.hs b/src/gen-test/haskell/Hydra/Test/Inference/Fundamentals.hs
--- a/src/gen-test/haskell/Hydra/Test/Inference/Fundamentals.hs
+++ b/src/gen-test/haskell/Hydra/Test/Inference/Fundamentals.hs
@@ -15,2623 +15,2630 @@
 
 -- | Fundamental language feature tests
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Fundamentals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    testGroupForLambdas,
-    testGroupForLet,
-    testGroupForLiterals,
-    testGroupForPathologicalTerms,
-    testGroupForPolymorphism,
-    testGroupForPrimitives],
-  Testing.testGroupCases = []}
-
-testGroupForLambdas :: Testing.TestGroup
-testGroupForLambdas = Testing.TestGroup {
-  Testing.testGroupName = "Lambdas",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Simple lambdas",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 137)))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Nested lambdas",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))])}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Nested lambdas with shadowing",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-testGroupForLet :: Testing.TestGroup
-testGroupForLet = Testing.TestGroup {
-  Testing.testGroupName = "Let terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Simple",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 42.0))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "z"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Empty let",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Trivial let",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "foo"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "foo"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Multiple references to a let-bound term",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bar"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "foo"),
-                (Core.TermVariable (Core.Name "bar")),
-                (Core.TermVariable (Core.Name "foo"))])})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Nested let",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "bar"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "foo"),
-                  (Core.TermVariable (Core.Name "bar"))])}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "bar"),
-                    Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "foo"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "bar"))}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "sng"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x")])}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "foo"),
-                    Core.bindingTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                    Core.bindingType = Nothing},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "bar"),
-                    Core.bindingTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))})),
-                    Core.bindingType = Nothing},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "quux"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "foo"), (Core.TermPair (Core.TermVariable (Core.Name "bar"), (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "quux")),
-                  Core.applicationArgument = (Core.TermList [])}))))))}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-                  Core.pairTypeSecond = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0"))))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Nested let with shadowing",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "foo"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "foo"))}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bar"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "foo")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "foo"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "bar"), (Core.TermVariable (Core.Name "foo"))))}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Let-polymorphism",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 42.0))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "z"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "square"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "z"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "z"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "f"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "square")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))})))})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})])}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})])}))})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#6",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#7",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "list"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x")])}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "list")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "list")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-                Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#8",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "singleton"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x")])}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                          Core.applicationArgument = (Core.TermPair (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "singleton")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}), (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "singleton")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))))})),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeList (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabled"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#9",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "fortytwo"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "fortytwo"), (Core.TermVariable (Core.Name "foo"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#10",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "fortytwo"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "fortytwo"), (Core.TermVariable (Core.Name "foo"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Recursive and mutually recursive let (@wisnesky's test cases)",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "u"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
-                Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v0")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabled"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "plus"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "plus")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "plus")),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "z"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "z"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "p0"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "p0"))}), (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "p0"))}))))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#6",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "z"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "z"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#7",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "z"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "w"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "z")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermPair (Core.TermVariable (Core.Name "w"), (Core.TermVariable (Core.Name "z"))))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1"),
-                (Core.Name "t2")],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                  Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Recursive and mutually recursive let with polymorphism",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "g"))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermVariable (Core.Name "f")])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "g"))}))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-                      Core.applicationArgument = (Core.TermList [
-                        Core.TermVariable (Core.Name "f")])}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "g"))}))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-                      Core.applicationArgument = (Core.TermList [
-                        Core.TermVariable (Core.Name "f")])}))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Recursion involving polymorphic functions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "b"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                          Core.applicationArgument = (Core.TermList [
-                            Core.TermList [
-                              Core.TermVariable (Core.Name "x")]])})),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "b"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                        Core.applicationArgument = (Core.TermList [
-                          Core.TermList [
-                            Core.TermVariable (Core.Name "x")]])}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0"))))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "inst"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "rec"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "b0"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "b0"))}))}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "inst"), (Core.TermVariable (Core.Name "rec"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "inst"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "rec"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "inst"), (Core.TermVariable (Core.Name "rec"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "inst1"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "inst2"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "rec"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "inst1"), (Core.TermPair (Core.TermVariable (Core.Name "inst2"), (Core.TermVariable (Core.Name "rec"))))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                Core.pairTypeSecond = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "bar"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "foo")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "foo"), (Core.TermVariable (Core.Name "bar"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Over-generalization of hoisted let-bindings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "g"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "val"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "r"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "val"))})),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "r"))}))}))}))})))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "helper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "g"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "g"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "g"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))}))}))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "forField"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "rec"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermLet (Core.Let {
-                          Core.letBindings = [
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "r"),
-                              Core.bindingTerm = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "val"))})),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                              Core.bindingType = Nothing}],
-                          Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "r"))}), (Core.TermVariable (Core.Name "x"))))}))})))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "main"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "rec"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "x"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "forField")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "rec"))})),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "val"))})),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "main"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1"),
-                (Core.Name "t2"),
-                (Core.Name "t3")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t2")),
-                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t3"))}))}))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t2")),
-                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "helper"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "main"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "b"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})),
-                          Core.applicationArgument = (Core.TermPair (Core.TermVariable (Core.Name "val"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))}))})))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "main"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                      Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "forField"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "rec"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "r"),
-                            Core.bindingTerm = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "val"))})),
-                            Core.bindingType = Nothing}],
-                        Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "r"))}), (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "r"))}))))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "main"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "rec"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "b"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "forField")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "rec"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})),
-                          Core.applicationArgument = (Core.TermPair (Core.TermVariable (Core.Name "val"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))}))})))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "main"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                      Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#6",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "rcases"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "forFields"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "forFields")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "r"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "forFields"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "val"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "b"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "rcases")),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "forFields"))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})),
-                          Core.applicationArgument = (Core.TermPair (Core.TermVariable (Core.Name "val"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))}))})))})))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "r"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
-                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                      Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-testGroupForLiterals :: Testing.TestGroup
-testGroupForLiterals = Testing.TestGroup {
-  Testing.testGroupName = "Literals",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#1",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#2",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLiteral (Core.LiteralString "foo")),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#3",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean False)),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeBoolean),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#4",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 42.0))),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64)),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = []}]}
-
-testGroupForPathologicalTerms :: Testing.TestGroup
-testGroupForPathologicalTerms = Testing.TestGroup {
-  Testing.testGroupName = "Pathological terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Recursion",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "weird"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "id"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "id"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "weird"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "paradox"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "f"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "paradox")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "paradox"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#6",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "g"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Infinite lists",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "self"),
-                  Core.bindingTerm = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "self"))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "self"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "self"),
-                    Core.bindingTerm = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "self"))})),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "self"))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "self"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "e"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "self")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "self")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabled"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "build"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "build")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "build")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-testGroupForPolymorphism :: Testing.TestGroup
-testGroupForPolymorphism = Testing.TestGroup {
-  Testing.testGroupName = "Polymorphism",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Simple lists and optionals",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList []),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermMaybe Nothing),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0"))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Lambdas, lists, and products",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x"))))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x")])}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})),
-              (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermList [
-              Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "y"), (Core.TermVariable (Core.Name "x"))))})))}))]),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                  Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t1")),
-                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Lambdas and application",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Primitives and application",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))],
-                (Core.TermList [])])})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Lambdas and primitives",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Mixed expressions with lambdas, constants, and primitive functions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Application terms",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
-
-testGroupForPrimitives :: Testing.TestGroup
-testGroupForPrimitives = Testing.TestGroup {
-  Testing.testGroupName = "Primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Monomorphic primitive functions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Polymorphic primitive functions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "el"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermVariable (Core.Name "el")])}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "el"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-                  (Core.TermVariable (Core.Name "el"))])}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "lists"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "lists"))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
-                Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "lists"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "lists"))}))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#6",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "list"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermVariable (Core.Name "list"),
-                    (Core.TermList [])])}))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#7",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "list"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermVariable (Core.Name "list"),
-                      (Core.TermList [])])}))}))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#8",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "lists"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "lists"))}))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
-                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Fundamentals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        testGroupForLambdas,
+        testGroupForLet,
+        testGroupForLiterals,
+        testGroupForPathologicalTerms,
+        testGroupForPolymorphism,
+        testGroupForPrimitives],
+      Testing.testGroupCases = []}
+
+testGroupForLambdas :: Testing.TestGroup
+testGroupForLambdas =
+    Testing.TestGroup {
+      Testing.testGroupName = "Lambdas",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Simple lambdas",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 137)))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Nested lambdas",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))])}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Nested lambdas with shadowing",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForLet :: Testing.TestGroup
+testGroupForLet =
+    Testing.TestGroup {
+      Testing.testGroupName = "Let terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Simple",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 42.0))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "z"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Empty let",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Trivial let",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "foo"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "foo"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Multiple references to a let-bound term",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bar"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "foo"),
+                    (Core.TermVariable (Core.Name "bar")),
+                    (Core.TermVariable (Core.Name "foo"))])})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Nested let",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "bar"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "foo"),
+                      (Core.TermVariable (Core.Name "bar"))])}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "bar"),
+                        Core.bindingTerm = (Core.TermPair (Core.TermVariable (Core.Name "foo"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "bar"))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "sng"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x")])}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "foo"),
+                        Core.bindingTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                        Core.bindingType = Nothing},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "bar"),
+                        Core.bindingTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))})),
+                        Core.bindingType = Nothing},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "quux"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "sng")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "foo"), (Core.TermPair (Core.TermVariable (Core.Name "bar"), (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "quux")),
+                      Core.applicationArgument = (Core.TermList [])}))))))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
+                      Core.pairTypeSecond = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0"))))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Nested let with shadowing",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "foo"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "foo"))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bar"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "foo")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "foo"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "bar"), (Core.TermVariable (Core.Name "foo"))))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Let-polymorphism",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 42.0))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "z"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "square"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "z"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "z"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "z"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "f"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "square")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))})))})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})])}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})])}))})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#6",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#7",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "list"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x")])}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "list")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}), (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "list")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                    Core.pairTypeSecond = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#8",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "singleton"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x")])}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                              Core.applicationArgument = (Core.TermPair (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "singleton")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}), (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "singleton")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))))})),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabled"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#9",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "fortytwo"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "fortytwo"), (Core.TermVariable (Core.Name "foo"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#10",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "fortytwo"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "fortytwo"), (Core.TermVariable (Core.Name "foo"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Recursive and mutually recursive let (@wisnesky's test cases)",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "y")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "u"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "v"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "v"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
+                    Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "v0")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabled"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "plus"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "plus")),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "plus")),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "z"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "z"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "p0"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "p0"))}), (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "p0"))}))))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#6",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "z"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "z"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#7",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "z"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "w"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "z")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermPair (Core.TermVariable (Core.Name "w"), (Core.TermVariable (Core.Name "z"))))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1"),
+                    (Core.Name "t2")],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                      Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t2"))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Recursive and mutually recursive let with polymorphism",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "g"))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermVariable (Core.Name "f")])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "g"))}))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                          Core.applicationArgument = (Core.TermList [
+                            Core.TermVariable (Core.Name "f")])}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "g"))}))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                          Core.applicationArgument = (Core.TermList [
+                            Core.TermVariable (Core.Name "f")])}))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "f"), (Core.TermVariable (Core.Name "g"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Recursion involving polymorphic functions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "b"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                              Core.applicationArgument = (Core.TermList [
+                                Core.TermList [
+                                  Core.TermVariable (Core.Name "x")]])})),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "b"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                            Core.applicationArgument = (Core.TermList [
+                              Core.TermList [
+                                Core.TermVariable (Core.Name "x")]])}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0"))))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "inst"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                          Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "rec"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "b0"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "b0"))}))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "inst"), (Core.TermVariable (Core.Name "rec"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                    Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "inst"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "rec"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "inst"), (Core.TermVariable (Core.Name "rec"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                    Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "inst1"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "inst2"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "rec"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "inst1"), (Core.TermPair (Core.TermVariable (Core.Name "inst2"), (Core.TermVariable (Core.Name "rec"))))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                    Core.pairTypeSecond = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.pairTypeSecond = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "bar"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "foo")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "foo"), (Core.TermVariable (Core.Name "bar"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Over-generalization of hoisted let-bindings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "g"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "val"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "r"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "val"))})),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "r"))}))}))}))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "helper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "g"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "g"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "g"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))}))}))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "forField"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "rec"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermLet (Core.Let {
+                              Core.letBindings = [
+                                Core.Binding {
+                                  Core.bindingName = (Core.Name "r"),
+                                  Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "val"))})),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                                  Core.bindingType = Nothing}],
+                              Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "r"))}), (Core.TermVariable (Core.Name "x"))))}))})))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "main"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "rec"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "x"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "forField")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "rec"))})),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "val"))})),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "main"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1"),
+                    (Core.Name "t2"),
+                    (Core.Name "t3")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t2")),
+                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t3"))}))}))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t2")),
+                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "helper"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "main"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "b"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "helper")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "f"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})),
+                              Core.applicationArgument = (Core.TermPair (Core.TermVariable (Core.Name "val"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))}))})))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "main"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "forField"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "rec"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "r"),
+                                Core.bindingTerm = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermVariable (Core.Name "rec")),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "val"))})),
+                                Core.bindingType = Nothing}],
+                            Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "r"))}), (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "r"))}))))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "main"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "rec"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "b"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "forField")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "rec"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})),
+                              Core.applicationArgument = (Core.TermPair (Core.TermVariable (Core.Name "val"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))}))})))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "main"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#6",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "rcases"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "forFields"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "forFields")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "r"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "forFields"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "val"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "b"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "b"))})),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermVariable (Core.Name "rcases")),
+                                    Core.applicationArgument = (Core.TermVariable (Core.Name "forFields"))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "val"))}))})),
+                              Core.applicationArgument = (Core.TermPair (Core.TermVariable (Core.Name "val"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))}))})))})))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "r"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                        Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                          Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForLiterals :: Testing.TestGroup
+testGroupForLiterals =
+    Testing.TestGroup {
+      Testing.testGroupName = "Literals",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#1",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#2",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLiteral (Core.LiteralString "foo")),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#3",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean False)),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeBoolean),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#4",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 42.0))),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64)),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+testGroupForPathologicalTerms :: Testing.TestGroup
+testGroupForPathologicalTerms =
+    Testing.TestGroup {
+      Testing.testGroupName = "Pathological terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Recursion",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "x")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeVariable (Core.Name "t0")),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "weird"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "id"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "id"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "weird"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "paradox"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "f"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "paradox")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "paradox"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#6",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "g"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Infinite lists",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "self"),
+                      Core.bindingTerm = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "self"))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "self"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "self"),
+                        Core.bindingTerm = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "self"))})),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "self"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "self"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "e"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "e"))})),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "self")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "e"))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "self")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabled"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "build"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "build")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "build")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForPolymorphism :: Testing.TestGroup
+testGroupForPolymorphism =
+    Testing.TestGroup {
+      Testing.testGroupName = "Polymorphism",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Simple lists and optionals",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList []),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermMaybe Nothing),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "t0"))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Lambdas, lists, and products",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "x"))))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x")])}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})),
+                  (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermList [
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "y"), (Core.TermVariable (Core.Name "x"))))})))}))]),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                      Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                        Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t1")),
+                        Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t0"))}))}))}))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Lambdas and application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Primitives and application",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))],
+                    (Core.TermList [])])})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Lambdas and primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Mixed expressions with lambdas, constants, and primitive functions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Application terms",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+testGroupForPrimitives :: Testing.TestGroup
+testGroupForPrimitives =
+    Testing.TestGroup {
+      Testing.testGroupName = "Primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Monomorphic primitive functions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Polymorphic primitive functions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "el"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermVariable (Core.Name "el")])}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "el"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                      (Core.TermVariable (Core.Name "el"))])}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "lists"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "lists"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
+                    Core.functionTypeCodomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0")))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "lists"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "lists"))}))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#6",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "list"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermVariable (Core.Name "list"),
+                        (Core.TermList [])])}))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#7",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "list"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermVariable (Core.Name "list"),
+                          (Core.TermList [])])}))}))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeVariable (Core.Name "t0"))),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#8",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "lists"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "lists"))}))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "t0")))),
+                    Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Inference/KernelExamples.hs b/src/gen-test/haskell/Hydra/Test/Inference/KernelExamples.hs
--- a/src/gen-test/haskell/Hydra/Test/Inference/KernelExamples.hs
+++ b/src/gen-test/haskell/Hydra/Test/Inference/KernelExamples.hs
@@ -15,267 +15,269 @@
 
 -- | Examples from the Hydra kernel
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Examples from the Hydra kernel",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    testGroupForNestedLet],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Examples from the Hydra kernel",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        testGroupForNestedLet],
+      Testing.testGroupCases = []}
 
 testGroupForNestedLet :: Testing.TestGroup
-testGroupForNestedLet = Testing.TestGroup {
-  Testing.testGroupName = "Nested let",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
+testGroupForNestedLet =
     Testing.TestGroup {
-      Testing.testGroupName = "hydra.formatting.mapFirstLetter",
+      Testing.testGroupName = "Nested let",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "mapping"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "s"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "firstLetter"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "mapping")),
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "hydra.formatting.mapFirstLetter",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "mapping"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "s"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "firstLetter"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "mapping")),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                                Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "list"))}))}))}))})),
+                          Core.bindingType = Nothing},
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "list"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
                         Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "firstLetter"))})),
                           Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
                             Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "list"))}))}))}))})),
-                      Core.bindingType = Nothing},
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "list"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "s"))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "firstLetter"))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "list"))}))}))}))}))}))})))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-                Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Recursive let with pair return (ifElse)",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "input"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "go"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "depth"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "subst"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "s"),
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "list"))}))}))}))}))}))})))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                    Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Recursive let with pair return (ifElse)",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "input"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "go"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "depth"),
                           Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
-                              Core.applicationArgument = (Core.TermPair (Core.TermVariable (Core.Name "subst"), (Core.TermVariable (Core.Name "s"))))})),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "subst"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "s"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
                                 Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermVariable (Core.Name "go")),
-                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                      Core.applicationArgument = (Core.TermVariable (Core.Name "depth"))})),
-                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
+                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
+                                  Core.applicationArgument = (Core.TermPair (Core.TermVariable (Core.Name "subst"), (Core.TermVariable (Core.Name "s"))))})),
                                 Core.applicationArgument = (Core.TermApplication (Core.Application {
                                   Core.applicationFunction = (Core.TermApplication (Core.Application {
                                     Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
-                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "key"))})),
-                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "val"))})),
-                                  Core.applicationArgument = (Core.TermVariable (Core.Name "subst"))}))})),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))})))})))}))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "result"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "go")),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                          Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty")))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "input"))})),
-                      Core.bindingType = Nothing},
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "subst"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "result"))})),
-                      Core.bindingType = Nothing},
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "body"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "result"))})),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "subst"), (Core.TermVariable (Core.Name "body"))))}))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeMap (Core.MapType {
-                    Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)})),
-                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Recursive let with pair return (case on Type)",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "typ"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "go"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "depth"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                        Core.lambdaParameter = (Core.Name "subst"),
-                        Core.lambdaDomain = Nothing,
-                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "t"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                              Core.caseStatementTypeName = (Core.Name "hydra.core.Type"),
-                              Core.caseStatementDefault = (Just (Core.TermPair (Core.TermVariable (Core.Name "subst"), (Core.TermVariable (Core.Name "t"))))),
-                              Core.caseStatementCases = [
-                                Core.Field {
-                                  Core.fieldName = (Core.Name "forall"),
-                                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                                    Core.lambdaParameter = (Core.Name "ft"),
-                                    Core.lambdaDomain = Nothing,
-                                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                      Core.applicationFunction = (Core.TermVariable (Core.Name "go")),
+                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                          Core.applicationArgument = (Core.TermVariable (Core.Name "depth"))})),
+                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
+                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
                                       Core.applicationFunction = (Core.TermApplication (Core.Application {
                                         Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                          Core.applicationFunction = (Core.TermVariable (Core.Name "go")),
-                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                              Core.applicationArgument = (Core.TermVariable (Core.Name "depth"))})),
-                                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
-                                        Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "key"))})),
+                                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "val"))})),
+                                      Core.applicationArgument = (Core.TermVariable (Core.Name "subst"))}))})),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))}))})))})))}))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "result"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "go")),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty")))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "input"))})),
+                          Core.bindingType = Nothing},
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "subst"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "result"))})),
+                          Core.bindingType = Nothing},
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "body"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "result"))})),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "subst"), (Core.TermVariable (Core.Name "body"))))}))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)})),
+                      Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Recursive let with pair return (case on Type)",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "typ"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "go"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "depth"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                            Core.lambdaParameter = (Core.Name "subst"),
+                            Core.lambdaDomain = Nothing,
+                            Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "t"),
+                              Core.lambdaDomain = Nothing,
+                              Core.lambdaBody = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                                  Core.caseStatementTypeName = (Core.Name "hydra.core.Type"),
+                                  Core.caseStatementDefault = (Just (Core.TermPair (Core.TermVariable (Core.Name "subst"), (Core.TermVariable (Core.Name "t"))))),
+                                  Core.caseStatementCases = [
+                                    Core.Field {
+                                      Core.fieldName = (Core.Name "forall"),
+                                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                        Core.lambdaParameter = (Core.Name "ft"),
+                                        Core.lambdaDomain = Nothing,
+                                        Core.lambdaBody = (Core.TermApplication (Core.Application {
                                           Core.applicationFunction = (Core.TermApplication (Core.Application {
                                             Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                                              Core.applicationFunction = (Core.TermVariable (Core.Name "go")),
                                               Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                                  Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
-                                                  Core.projectionField = (Core.Name "parameter")})))),
-                                                Core.applicationArgument = (Core.TermVariable (Core.Name "ft"))}))})),
-                                            Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                                              Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
-                                              Core.wrappedTermBody = (Core.TermApplication (Core.Application {
                                                 Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "_"))})),
-                                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "depth"))}))}))}))})),
-                                          Core.applicationArgument = (Core.TermVariable (Core.Name "subst"))}))})),
-                                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                        Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                                          Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
-                                          Core.projectionField = (Core.Name "body")})))),
-                                        Core.applicationArgument = (Core.TermVariable (Core.Name "ft"))}))}))})))}]})))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))})))}))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "result"),
-                      Core.bindingTerm = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "go")),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                          Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty")))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "typ"))})),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "result"))}), (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "result"))}))))}))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Type")),
-                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeMap (Core.MapType {
-                    Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
-                    Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Name"))})),
-                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "hydra.core.Type"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]}],
-  Testing.testGroupCases = []}
+                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                                  Core.applicationArgument = (Core.TermVariable (Core.Name "depth"))})),
+                                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
+                                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                                                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                                      Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
+                                                      Core.projectionField = (Core.Name "parameter")})))),
+                                                    Core.applicationArgument = (Core.TermVariable (Core.Name "ft"))}))})),
+                                                Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                                                  Core.wrappedTermTypeName = (Core.Name "hydra.core.Name"),
+                                                  Core.wrappedTermBody = (Core.TermApplication (Core.Application {
+                                                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                                                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "_"))})),
+                                                    Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                                                      Core.applicationArgument = (Core.TermVariable (Core.Name "depth"))}))}))}))})),
+                                              Core.applicationArgument = (Core.TermVariable (Core.Name "subst"))}))})),
+                                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                            Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                                              Core.projectionTypeName = (Core.Name "hydra.core.ForallType"),
+                                              Core.projectionField = (Core.Name "body")})))),
+                                            Core.applicationArgument = (Core.TermVariable (Core.Name "ft"))}))}))})))}]})))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "t"))}))})))})))}))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "result"),
+                          Core.bindingTerm = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermVariable (Core.Name "go")),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty")))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "typ"))})),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermPair (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "result"))}), (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "result"))}))))}))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "hydra.core.Type")),
+                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeMap (Core.MapType {
+                        Core.mapTypeKeys = (Core.TypeVariable (Core.Name "hydra.core.Name")),
+                        Core.mapTypeValues = (Core.TypeVariable (Core.Name "hydra.core.Name"))})),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "hydra.core.Type"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Inference/NominalTypes.hs b/src/gen-test/haskell/Hydra/Test/Inference/NominalTypes.hs
--- a/src/gen-test/haskell/Hydra/Test/Inference/NominalTypes.hs
+++ b/src/gen-test/haskell/Hydra/Test/Inference/NominalTypes.hs
@@ -17,681 +17,687 @@
 
 -- | Nominal type tests
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "Nominal terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    testGroupForCaseStatements,
-    testGroupForProjections,
-    testGroupForRecords,
-    testGroupForVariants,
-    testGroupForWrappers],
-  Testing.testGroupCases = []}
-
-testGroupForCaseStatements :: Testing.TestGroup
-testGroupForCaseStatements = Testing.TestGroup {
-  Testing.testGroupName = "Case statements",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [],
-  Testing.testGroupCases = [
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#1",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeSimpleNumberName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "int"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "float"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))}]})))),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeSimpleNumberName),
-            Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]},
-    Testing.TestCaseWithMetadata {
-      Testing.testCaseWithMetadataName = "#2",
-      Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-        Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-          Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
-          Core.caseStatementDefault = Nothing,
-          Core.caseStatementCases = [
-            Core.Field {
-              Core.fieldName = (Core.Name "bool"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "_"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean True))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "string"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "_"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))},
-            Core.Field {
-              Core.fieldName = (Core.Name "unit"),
-              Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "_"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))}]})))),
-        Testing.inferenceTestCaseOutput = Core.TypeScheme {
-          Core.typeSchemeVariables = [],
-          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
-            Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-          Core.typeSchemeConstraints = Nothing}})),
-      Testing.testCaseWithMetadataDescription = Nothing,
-      Testing.testCaseWithMetadataTags = [
-        Testing.Tag "disabledForMinimalInference"]}]}
-
-testGroupForProjections :: Testing.TestGroup
-testGroupForProjections = Testing.TestGroup {
-  Testing.testGroupName = "Projections",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Record eliminations",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = TestTypes.testTypePersonName,
-              Core.projectionField = (Core.Name "firstName")})))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypePersonName),
-                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Pair projections",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0",
-                (Core.Name "t1")],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypePair (Core.PairType {
-                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo"))))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]}],
-  Testing.testGroupCases = []}
-
-testGroupForRecords :: Testing.TestGroup
-testGroupForRecords = Testing.TestGroup {
-  Testing.testGroupName = "Records",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Simple records",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypeLatLonName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lat"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 37.7749)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lon"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-122.4194))))}]})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeLatLonName),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "lat"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 37.7749)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "lon"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-122.4194))))}]})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "lon"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lat"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 37.7749)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lon"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "lon"))}]}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
-                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "latlon"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lat"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "latlon"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "lon"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "latlon"))}]}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = TestTerms.testDataArthur,
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypePersonName),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Record instances of simply recursive record types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypeIntListName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "head"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "tail"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = TestTypes.testTypeIntListName,
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "head"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 43)))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "tail"),
-                        Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeIntListName),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeIntListName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "head"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "tail"),
-                      Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = TestTypes.testTypeIntListName,
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "head"),
-                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "tail"),
-                            Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeIntListName),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = TestTypes.testTypeListName,
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "head"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "tail"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = TestTypes.testTypeListName,
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "head"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 43)))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "tail"),
-                        Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeListName),
-                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeListName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "head"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "tail"),
-                      Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = TestTypes.testTypeListName,
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "head"),
-                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "tail"),
-                            Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeListName),
-                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeListName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = TestTypes.testTypeListName,
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "head"),
-                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "tail"),
-                          Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeListName),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Record instances of mutually recursive record types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = TestTypes.testTypeBuddyListAName,
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "head"),
-                      Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                    Core.Field {
-                      Core.fieldName = (Core.Name "tail"),
-                      Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                        Core.recordTypeName = TestTypes.testTypeBuddyListBName,
-                        Core.recordFields = [
-                          Core.Field {
-                            Core.fieldName = (Core.Name "head"),
-                            Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                          Core.Field {
-                            Core.fieldName = (Core.Name "tail"),
-                            Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = TestTypes.testTypeBuddyListAName,
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "head"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "tail"),
-                    Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
-                      Core.recordTypeName = TestTypes.testTypeBuddyListBName,
-                      Core.recordFields = [
-                        Core.Field {
-                          Core.fieldName = (Core.Name "head"),
-                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
-                        Core.Field {
-                          Core.fieldName = (Core.Name "tail"),
-                          Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-                  Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
-                  Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]}],
-  Testing.testGroupCases = []}
-
-testGroupForVariants :: Testing.TestGroup
-testGroupForVariants = Testing.TestGroup {
-  Testing.testGroupName = "Variant terms",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Variants",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeTimestampName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "unixTimeMillis"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1638200308368)))}})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeTimestampName),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "string"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Polymorphic and recursive variants",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "bool"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [
-                Core.Name "t0"],
-              Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "value"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "other"),
-                  Core.bindingTerm = (Core.TermUnion (Core.Injection {
-                    Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                    Core.injectionField = Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "other"),
-                  Core.fieldTerm = (Core.TermVariable (Core.Name "other"))}}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
-                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]}],
-  Testing.testGroupCases = []}
-
-testGroupForWrappers :: Testing.TestGroup
-testGroupForWrappers = Testing.TestGroup {
-  Testing.testGroupName = "Wrapper introductions and eliminations",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "Wrapper introductions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "v"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-                Core.wrappedTermBody = (Core.TermVariable (Core.Name "v"))}))}))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.functionTypeCodomain = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "Wrapper eliminations",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
-                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "#2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
-            Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
-              Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
-                Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-            Testing.inferenceTestCaseOutput = Core.TypeScheme {
-              Core.typeSchemeVariables = [],
-              Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.typeSchemeConstraints = Nothing}})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForMinimalInference"]}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "Nominal terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        testGroupForCaseStatements,
+        testGroupForProjections,
+        testGroupForRecords,
+        testGroupForVariants,
+        testGroupForWrappers],
+      Testing.testGroupCases = []}
+
+testGroupForCaseStatements :: Testing.TestGroup
+testGroupForCaseStatements =
+    Testing.TestGroup {
+      Testing.testGroupName = "Case statements",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#1",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeSimpleNumberName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "int"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "float"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))}]})))),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeSimpleNumberName),
+                Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "#2",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+            Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+              Core.caseStatementTypeName = TestTypes.testTypeUnionMonomorphicName,
+              Core.caseStatementDefault = Nothing,
+              Core.caseStatementCases = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "bool"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "_"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean True))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "string"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "_"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "unit"),
+                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "_"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralBoolean False))})))}]})))),
+            Testing.inferenceTestCaseOutput = Core.TypeScheme {
+              Core.typeSchemeVariables = [],
+              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
+                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+              Core.typeSchemeConstraints = Nothing}})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = [
+            Testing.Tag "disabledForMinimalInference"]}]}
+
+testGroupForProjections :: Testing.TestGroup
+testGroupForProjections =
+    Testing.TestGroup {
+      Testing.testGroupName = "Projections",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Record eliminations",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = TestTypes.testTypePersonName,
+                  Core.projectionField = (Core.Name "firstName")})))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypePersonName),
+                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Pair projections",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0",
+                    (Core.Name "t1")],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypePair (Core.PairType {
+                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))})),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "foo"))))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
+
+testGroupForRecords :: Testing.TestGroup
+testGroupForRecords =
+    Testing.TestGroup {
+      Testing.testGroupName = "Records",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Simple records",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypeLatLonName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lat"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 37.7749)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lon"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-122.4194))))}]})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeLatLonName),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lat"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 37.7749)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "lon"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-122.4194))))}]})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "lon"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lat"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 37.7749)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lon"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "lon"))}]}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
+                    Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                      Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "latlon"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeLatLonPolyName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lat"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "latlon"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "lon"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "latlon"))}]}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeLatLonPolyName),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = TestTerms.testDataArthur,
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypePersonName),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Record instances of simply recursive record types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypeIntListName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "head"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "tail"),
+                      Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = TestTypes.testTypeIntListName,
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "head"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 43)))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "tail"),
+                            Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeIntListName),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeIntListName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "head"),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "tail"),
+                          Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = TestTypes.testTypeIntListName,
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "head"),
+                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "tail"),
+                                Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeIntListName),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = TestTypes.testTypeListName,
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "head"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "tail"),
+                      Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                        Core.recordTypeName = TestTypes.testTypeListName,
+                        Core.recordFields = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "head"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 43)))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "tail"),
+                            Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeListName),
+                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeListName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "head"),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "tail"),
+                          Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = TestTypes.testTypeListName,
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "head"),
+                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "tail"),
+                                Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeListName),
+                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeListName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = TestTypes.testTypeListName,
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "head"),
+                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "tail"),
+                              Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeListName),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Record instances of mutually recursive record types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = TestTypes.testTypeBuddyListAName,
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "head"),
+                          Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                        Core.Field {
+                          Core.fieldName = (Core.Name "tail"),
+                          Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                            Core.recordTypeName = TestTypes.testTypeBuddyListBName,
+                            Core.recordFields = [
+                              Core.Field {
+                                Core.fieldName = (Core.Name "head"),
+                                Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                              Core.Field {
+                                Core.fieldName = (Core.Name "tail"),
+                                Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = TestTypes.testTypeBuddyListAName,
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "head"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "tail"),
+                        Core.fieldTerm = (Core.TermMaybe (Just (Core.TermRecord (Core.Record {
+                          Core.recordTypeName = TestTypes.testTypeBuddyListBName,
+                          Core.recordFields = [
+                            Core.Field {
+                              Core.fieldName = (Core.Name "head"),
+                              Core.fieldTerm = (Core.TermVariable (Core.Name "x"))},
+                            Core.Field {
+                              Core.fieldName = (Core.Name "tail"),
+                              Core.fieldTerm = (Core.TermMaybe Nothing)}]}))))}]}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                    Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
+                      Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeBuddyListAName),
+                      Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))}))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
+
+testGroupForVariants :: Testing.TestGroup
+testGroupForVariants =
+    Testing.TestGroup {
+      Testing.testGroupName = "Variant terms",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Variants",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeTimestampName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "unixTimeMillis"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1638200308368)))}})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeTimestampName),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeUnionMonomorphicName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "string"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeUnionMonomorphicName),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Polymorphic and recursive variants",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "bool"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralBoolean True))}})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [
+                    Core.Name "t0"],
+                  Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                    Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "t0"))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "value"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                    Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "other"),
+                      Core.bindingTerm = (Core.TermUnion (Core.Injection {
+                        Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                        Core.injectionField = Core.Field {
+                          Core.fieldName = (Core.Name "value"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = TestTypes.testTypeUnionPolymorphicRecursiveName,
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "other"),
+                      Core.fieldTerm = (Core.TermVariable (Core.Name "other"))}}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeVariable TestTypes.testTypeUnionPolymorphicRecursiveName),
+                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
+
+testGroupForWrappers :: Testing.TestGroup
+testGroupForWrappers =
+    Testing.TestGroup {
+      Testing.testGroupName = "Wrapper introductions and eliminations",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "Wrapper introductions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "v"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                    Core.wrappedTermBody = (Core.TermVariable (Core.Name "v"))}))}))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.functionTypeCodomain = (Core.TypeVariable TestTypes.testTypeStringAliasName)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "Wrapper eliminations",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypeStringAliasName),
+                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "#2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseInference (Testing.InferenceTestCase {
+                Testing.inferenceTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap TestTypes.testTypeStringAliasName))),
+                  Core.applicationArgument = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = TestTypes.testTypeStringAliasName,
+                    Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                Testing.inferenceTestCaseOutput = Core.TypeScheme {
+                  Core.typeSchemeVariables = [],
+                  Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.typeSchemeConstraints = Nothing}})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = [
+                Testing.Tag "disabledForMinimalInference"]}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Json/Coder.hs b/src/gen-test/haskell/Hydra/Test/Json/Coder.hs
deleted file mode 100644
--- a/src/gen-test/haskell/Hydra/Test/Json/Coder.hs
+++ /dev/null
@@ -1,311 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Test cases for the type-directed JSON coder (Hydra Term <-> JSON Value)
-
-module Hydra.Test.Json.Coder where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Json.Model as Model
-import qualified Hydra.Testing as Testing
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Test cases for the type-directed JSON coder
-allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "JSON coder",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "literal types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "boolean true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralBoolean True)),
-            Testing.jsonCoderTestCaseJson = (Model.ValueBoolean True)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "boolean false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralBoolean False)),
-            Testing.jsonCoderTestCaseJson = (Model.ValueBoolean False)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int32 positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 42.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int32 negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17)))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber (-17.0))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int32 zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 0.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "float32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.5))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 1.5)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "float64",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.718))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 2.718)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string simple",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-            Testing.jsonCoderTestCaseJson = (Model.ValueString "hello")})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralString "")),
-            Testing.jsonCoderTestCaseJson = (Model.ValueString "")})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with spaces",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralString "hello world")),
-            Testing.jsonCoderTestCaseJson = (Model.ValueString "hello world")})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "integer types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int8 positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 127.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int8 negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-128)))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber (-128.0))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int16 positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 1000.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int16 negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000)))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber (-1000.0))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uint8 max",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint8)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 255.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uint8 zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint8)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 0.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uint16 positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint16)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 60000))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 60000.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uint32 positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint32)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 4000000000))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 4.0e9)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uint64 positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 1000000.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bigint positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 123456789012345))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 1.23456789012345e14)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bigint negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeBigint)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-999999999999)))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber (-9.99999999999e11))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "float types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bigfloat positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeBigfloat)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159265359))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 3.14159265359)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bigfloat negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeBigfloat)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.71828)))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber (-2.71828))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bigfloat zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeBigfloat)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 0.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "collection types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list of integers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.jsonCoderTestCaseTerm = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
-            Testing.jsonCoderTestCaseJson = (Model.ValueArray [
-              Model.ValueNumber 1.0,
-              (Model.ValueNumber 2.0),
-              (Model.ValueNumber 3.0)])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list of strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))]),
-            Testing.jsonCoderTestCaseJson = (Model.ValueArray [
-              Model.ValueString "a",
-              (Model.ValueString "b")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.jsonCoderTestCaseTerm = (Core.TermList []),
-            Testing.jsonCoderTestCaseJson = (Model.ValueArray [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "optional types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "optional string with value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello")))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueString "hello")})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "optional string nothing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.jsonCoderTestCaseTerm = (Core.TermMaybe Nothing),
-            Testing.jsonCoderTestCaseJson = Model.ValueNull})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "optional int with value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.jsonCoderTestCaseTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-            Testing.jsonCoderTestCaseJson = (Model.ValueNumber 42.0)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "optional int nothing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonCoder (Testing.JsonCoderTestCase {
-            Testing.jsonCoderTestCaseType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.jsonCoderTestCaseTerm = (Core.TermMaybe Nothing),
-            Testing.jsonCoderTestCaseJson = Model.ValueNull})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "record types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = []}],
-  Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Json/Parser.hs b/src/gen-test/haskell/Hydra/Test/Json/Parser.hs
--- a/src/gen-test/haskell/Hydra/Test/Json/Parser.hs
+++ b/src/gen-test/haskell/Hydra/Test/Json/Parser.hs
@@ -16,435 +16,436 @@
 
 -- | Test cases for JSON parsing
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "JSON parsing",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "primitives",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "null",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "null",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = Model.ValueNull,
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "true",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueBoolean True),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "false",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueBoolean False),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "0",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber 0.0),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "42",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber 42.0),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "-17",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber (-17.0)),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "large integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "1000000",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber 1000000.0),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "3.14",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber 3.14),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "-2.5",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber (-2.5)),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "scientific notation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "1e3",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber 1000.0),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "scientific with decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "1.5e2",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber 150.0),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative exponent",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "1e-2",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueNumber 1.0e-2),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString ""),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"hello\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString "hello"),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with spaces",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"hello world\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString "hello world"),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "escaped double quote",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"say \\\"hi\\\"\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString "say \"hi\""),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "escaped backslash",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"path\\\\to\\\\file\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString "path\\to\\file"),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "escaped newline",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"line1\\nline2\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString "line1\nline2"),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "escaped carriage return",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"line1\\rline2\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString "line1\rline2"),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "escaped tab",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"col1\\tcol2\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString "col1\tcol2"),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "escaped forward slash",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "\"a\\/b\"",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueString "a/b"),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "arrays",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty array",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray []),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[1]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray [
-                Model.ValueNumber 1.0]),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[1, 2, 3]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray [
-                Model.ValueNumber 1.0,
-                (Model.ValueNumber 2.0),
-                (Model.ValueNumber 3.0)]),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[\"a\", \"b\"]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray [
-                Model.ValueString "a",
-                (Model.ValueString "b")]),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[1, \"two\", true, null]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray [
-                Model.ValueNumber 1.0,
-                (Model.ValueString "two"),
-                (Model.ValueBoolean True),
-                Model.ValueNull]),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "objects",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty object",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "{}",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueObject M.empty),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single key-value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "{\"name\": \"Alice\"}",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
-                ("name", (Model.ValueString "Alice"))])),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple keys",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "{\"a\": 1, \"b\": 2}",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
-                ("a", (Model.ValueNumber 1.0)),
-                ("b", (Model.ValueNumber 2.0))])),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed value types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "{\"active\": true, \"count\": 42, \"name\": \"test\"}",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
-                ("active", (Model.ValueBoolean True)),
-                ("count", (Model.ValueNumber 42.0)),
-                ("name", (Model.ValueString "test"))])),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "nested structures",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested arrays",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[[1, 2], [3, 4]]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray [
-                Model.ValueArray [
-                  Model.ValueNumber 1.0,
-                  (Model.ValueNumber 2.0)],
-                (Model.ValueArray [
-                  Model.ValueNumber 3.0,
-                  (Model.ValueNumber 4.0)])]),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "object with array",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "{\"items\": [1, 2]}",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
-                ("items", (Model.ValueArray [
-                  Model.ValueNumber 1.0,
-                  (Model.ValueNumber 2.0)]))])),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "array of objects",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[{\"id\": 1}, {\"id\": 2}]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray [
-                Model.ValueObject (M.fromList [
-                  ("id", (Model.ValueNumber 1.0))]),
-                (Model.ValueObject (M.fromList [
-                  ("id", (Model.ValueNumber 2.0))]))]),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested object",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "{\"user\": {\"name\": \"Bob\"}}",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
-                ("user", (Model.ValueObject (M.fromList [
-                  ("name", (Model.ValueString "Bob"))])))])),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "whitespace handling",
+      Testing.testGroupName = "JSON parsing",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "leading whitespace",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "  null",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = Model.ValueNull,
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "trailing whitespace",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "null  ",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = Model.ValueNull,
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "both whitespace",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "  null  ",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = Model.ValueNull,
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "array with whitespace",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[ 1 , 2 , 3 ]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray [
-                Model.ValueNumber 1.0,
-                (Model.ValueNumber 2.0),
-                (Model.ValueNumber 3.0)]),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "object with whitespace",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "{ \"a\" : 1 }",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
-                ("a", (Model.ValueNumber 1.0))])),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiline array",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
-            Testing.parserTestCaseInput = "[\n  1,\n  2\n]",
-            Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
-              Parsing.parseSuccessValue = (Model.ValueArray [
-                Model.ValueNumber 1.0,
-                (Model.ValueNumber 2.0)]),
-              Parsing.parseSuccessRemainder = ""}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "null",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "null",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = Model.ValueNull,
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "true",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "true",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueBoolean True),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "false",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "false",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueBoolean False),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "0",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber 0.0),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive integer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "42",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber 42.0),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative integer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "-17",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber (-17.0)),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "large integer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "1000000",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber 1000000.0),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "3.14",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber 3.14),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "-2.5",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber (-2.5)),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "scientific notation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "1e3",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber 1000.0),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "scientific with decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "1.5e2",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber 150.0),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative exponent",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "1e-2",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueNumber 1.0e-2),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString ""),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"hello\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString "hello"),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with spaces",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"hello world\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString "hello world"),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "escaped double quote",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"say \\\"hi\\\"\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString "say \"hi\""),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "escaped backslash",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"path\\\\to\\\\file\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString "path\\to\\file"),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "escaped newline",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"line1\\nline2\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString "line1\nline2"),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "escaped carriage return",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"line1\\rline2\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString "line1\rline2"),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "escaped tab",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"col1\\tcol2\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString "col1\tcol2"),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "escaped forward slash",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "\"a\\/b\"",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueString "a/b"),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "arrays",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty array",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray []),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[1]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray [
+                    Model.ValueNumber 1.0]),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[1, 2, 3]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray [
+                    Model.ValueNumber 1.0,
+                    (Model.ValueNumber 2.0),
+                    (Model.ValueNumber 3.0)]),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[\"a\", \"b\"]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray [
+                    Model.ValueString "a",
+                    (Model.ValueString "b")]),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[1, \"two\", true, null]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray [
+                    Model.ValueNumber 1.0,
+                    (Model.ValueString "two"),
+                    (Model.ValueBoolean True),
+                    Model.ValueNull]),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "objects",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty object",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "{}",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueObject M.empty),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single key-value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "{\"name\": \"Alice\"}",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
+                    ("name", (Model.ValueString "Alice"))])),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple keys",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "{\"a\": 1, \"b\": 2}",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
+                    ("a", (Model.ValueNumber 1.0)),
+                    ("b", (Model.ValueNumber 2.0))])),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed value types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "{\"active\": true, \"count\": 42, \"name\": \"test\"}",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
+                    ("active", (Model.ValueBoolean True)),
+                    ("count", (Model.ValueNumber 42.0)),
+                    ("name", (Model.ValueString "test"))])),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "nested structures",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested arrays",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[[1, 2], [3, 4]]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray [
+                    Model.ValueArray [
+                      Model.ValueNumber 1.0,
+                      (Model.ValueNumber 2.0)],
+                    (Model.ValueArray [
+                      Model.ValueNumber 3.0,
+                      (Model.ValueNumber 4.0)])]),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "object with array",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "{\"items\": [1, 2]}",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
+                    ("items", (Model.ValueArray [
+                      Model.ValueNumber 1.0,
+                      (Model.ValueNumber 2.0)]))])),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "array of objects",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[{\"id\": 1}, {\"id\": 2}]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray [
+                    Model.ValueObject (M.fromList [
+                      ("id", (Model.ValueNumber 1.0))]),
+                    (Model.ValueObject (M.fromList [
+                      ("id", (Model.ValueNumber 2.0))]))]),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested object",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "{\"user\": {\"name\": \"Bob\"}}",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
+                    ("user", (Model.ValueObject (M.fromList [
+                      ("name", (Model.ValueString "Bob"))])))])),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "whitespace handling",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "leading whitespace",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "  null",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = Model.ValueNull,
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "trailing whitespace",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "null  ",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = Model.ValueNull,
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "both whitespace",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "  null  ",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = Model.ValueNull,
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "array with whitespace",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[ 1 , 2 , 3 ]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray [
+                    Model.ValueNumber 1.0,
+                    (Model.ValueNumber 2.0),
+                    (Model.ValueNumber 3.0)]),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "object with whitespace",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "{ \"a\" : 1 }",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueObject (M.fromList [
+                    ("a", (Model.ValueNumber 1.0))])),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiline array",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonParser (Testing.ParserTestCase {
+                Testing.parserTestCaseInput = "[\n  1,\n  2\n]",
+                Testing.parserTestCaseOutput = (Parsing.ParseResultSuccess (Parsing.ParseSuccess {
+                  Parsing.parseSuccessValue = (Model.ValueArray [
+                    Model.ValueNumber 1.0,
+                    (Model.ValueNumber 2.0)]),
+                  Parsing.parseSuccessRemainder = ""}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Json/Roundtrip.hs b/src/gen-test/haskell/Hydra/Test/Json/Roundtrip.hs
--- a/src/gen-test/haskell/Hydra/Test/Json/Roundtrip.hs
+++ b/src/gen-test/haskell/Hydra/Test/Json/Roundtrip.hs
@@ -15,203 +15,204 @@
 
 -- | Round-trip test cases for JSON encoding and decoding
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "JSON round-trip",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "literal types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "boolean true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "boolean false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeBoolean),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int8 positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int8 negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-17))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int16",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uint8",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint8)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 200)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uint16",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint16)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 50000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int64",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000000000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uint32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint32)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 4000000000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "float32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "float64",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string simple",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with spaces",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralString "hello world"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "collection types",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list of integers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list of strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "set of strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermSet S.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "optional types",
+      Testing.testGroupName = "JSON round-trip",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "optional string with value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "optional string nothing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "optional int with value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
-            Testing.jsonRoundtripTestCaseType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.jsonRoundtripTestCaseTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "literal types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "boolean true",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "boolean false",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeBoolean),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "int8 positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "int8 negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-17))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "int16",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "int32",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "uint8",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint8)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 200)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "uint16",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint16)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 50000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "int64",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000000000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "uint32",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint32)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 4000000000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "float32",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "float64",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat64)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string simple",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with spaces",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermLiteral (Core.LiteralString "hello world"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "collection types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list of integers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list of strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeList (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "set of strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermSet S.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "optional types",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "optional string with value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "optional string nothing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "optional int with value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonRoundtrip (Testing.JsonRoundtripTestCase {
+                Testing.jsonRoundtripTestCaseType = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.jsonRoundtripTestCaseTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Json/Writer.hs b/src/gen-test/haskell/Hydra/Test/Json/Writer.hs
--- a/src/gen-test/haskell/Hydra/Test/Json/Writer.hs
+++ b/src/gen-test/haskell/Hydra/Test/Json/Writer.hs
@@ -15,288 +15,289 @@
 
 -- | Test cases for JSON serialization (writer)
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "JSON serialization",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "primitives",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "null",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = Model.ValueNull,
-            Testing.writerTestCaseOutput = "null"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueBoolean True),
-            Testing.writerTestCaseOutput = "true"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueBoolean False),
-            Testing.writerTestCaseOutput = "false"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueNumber 0.0),
-            Testing.writerTestCaseOutput = "0"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueNumber 42.0),
-            Testing.writerTestCaseOutput = "42"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueNumber (-17.0)),
-            Testing.writerTestCaseOutput = "-17"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "large integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueNumber 1000000.0),
-            Testing.writerTestCaseOutput = "1000000"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueNumber 3.14),
-            Testing.writerTestCaseOutput = "3.14"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueNumber (-2.5)),
-            Testing.writerTestCaseOutput = "-2.5"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "small decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueNumber 1.0e-3),
-            Testing.writerTestCaseOutput = "1.0e-3"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString ""),
-            Testing.writerTestCaseOutput = "\"\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString "hello"),
-            Testing.writerTestCaseOutput = "\"hello\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with spaces",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString "hello world"),
-            Testing.writerTestCaseOutput = "\"hello world\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with double quote",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString "say \"hi\""),
-            Testing.writerTestCaseOutput = "\"say \\\"hi\\\"\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with backslash",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString "path\\to\\file"),
-            Testing.writerTestCaseOutput = "\"path\\\\to\\\\file\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with newline",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString "line1\nline2"),
-            Testing.writerTestCaseOutput = "\"line1\\nline2\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with carriage return",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString "line1\rline2"),
-            Testing.writerTestCaseOutput = "\"line1\\rline2\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with tab",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString "col1\tcol2"),
-            Testing.writerTestCaseOutput = "\"col1\\tcol2\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with mixed escapes",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueString "a\"b\\c\nd"),
-            Testing.writerTestCaseOutput = "\"a\\\"b\\\\c\\nd\""})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "arrays",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty array",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueArray []),
-            Testing.writerTestCaseOutput = "[]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueArray [
-              Model.ValueNumber 1.0]),
-            Testing.writerTestCaseOutput = "[1]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueArray [
-              Model.ValueNumber 1.0,
-              (Model.ValueNumber 2.0),
-              (Model.ValueNumber 3.0)]),
-            Testing.writerTestCaseOutput = "[1, 2, 3]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueArray [
-              Model.ValueString "a",
-              (Model.ValueString "b")]),
-            Testing.writerTestCaseOutput = "[\"a\", \"b\"]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueArray [
-              Model.ValueNumber 1.0,
-              (Model.ValueString "two"),
-              (Model.ValueBoolean True),
-              Model.ValueNull]),
-            Testing.writerTestCaseOutput = "[1, \"two\", true, null]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "objects",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty object",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueObject M.empty),
-            Testing.writerTestCaseOutput = "{}"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single key-value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
-              ("name", (Model.ValueString "Alice"))])),
-            Testing.writerTestCaseOutput = "{\"name\": \"Alice\"}"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple keys",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
-              ("a", (Model.ValueNumber 1.0)),
-              ("b", (Model.ValueNumber 2.0))])),
-            Testing.writerTestCaseOutput = "{\"a\": 1, \"b\": 2}"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed value types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
-              ("active", (Model.ValueBoolean True)),
-              ("count", (Model.ValueNumber 42.0)),
-              ("name", (Model.ValueString "test"))])),
-            Testing.writerTestCaseOutput = "{\"active\": true, \"count\": 42, \"name\": \"test\"}"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "nested structures",
+      Testing.testGroupName = "JSON serialization",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested arrays",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueArray [
-              Model.ValueArray [
-                Model.ValueNumber 1.0,
-                (Model.ValueNumber 2.0)],
-              (Model.ValueArray [
-                Model.ValueNumber 3.0,
-                (Model.ValueNumber 4.0)])]),
-            Testing.writerTestCaseOutput = "[[1, 2], [3, 4]]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "object with array",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
-              ("items", (Model.ValueArray [
-                Model.ValueNumber 1.0,
-                (Model.ValueNumber 2.0)]))])),
-            Testing.writerTestCaseOutput = "{\"items\": [1, 2]}"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "array of objects",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueArray [
-              Model.ValueObject (M.fromList [
-                ("id", (Model.ValueNumber 1.0))]),
-              (Model.ValueObject (M.fromList [
-                ("id", (Model.ValueNumber 2.0))]))]),
-            Testing.writerTestCaseOutput = "[{\"id\": 1}, {\"id\": 2}]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested object",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
-            Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
-              ("user", (Model.ValueObject (M.fromList [
-                ("name", (Model.ValueString "Bob"))])))])),
-            Testing.writerTestCaseOutput = "{\"user\": {\"name\": \"Bob\"}}"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "null",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = Model.ValueNull,
+                Testing.writerTestCaseOutput = "null"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "true",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueBoolean True),
+                Testing.writerTestCaseOutput = "true"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "false",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueBoolean False),
+                Testing.writerTestCaseOutput = "false"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueNumber 0.0),
+                Testing.writerTestCaseOutput = "0"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive integer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueNumber 42.0),
+                Testing.writerTestCaseOutput = "42"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative integer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueNumber (-17.0)),
+                Testing.writerTestCaseOutput = "-17"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "large integer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueNumber 1000000.0),
+                Testing.writerTestCaseOutput = "1000000"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueNumber 3.14),
+                Testing.writerTestCaseOutput = "3.14"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueNumber (-2.5)),
+                Testing.writerTestCaseOutput = "-2.5"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "small decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueNumber 1.0e-3),
+                Testing.writerTestCaseOutput = "1.0e-3"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString ""),
+                Testing.writerTestCaseOutput = "\"\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString "hello"),
+                Testing.writerTestCaseOutput = "\"hello\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with spaces",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString "hello world"),
+                Testing.writerTestCaseOutput = "\"hello world\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with double quote",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString "say \"hi\""),
+                Testing.writerTestCaseOutput = "\"say \\\"hi\\\"\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with backslash",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString "path\\to\\file"),
+                Testing.writerTestCaseOutput = "\"path\\\\to\\\\file\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with newline",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString "line1\nline2"),
+                Testing.writerTestCaseOutput = "\"line1\\nline2\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with carriage return",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString "line1\rline2"),
+                Testing.writerTestCaseOutput = "\"line1\\rline2\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with tab",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString "col1\tcol2"),
+                Testing.writerTestCaseOutput = "\"col1\\tcol2\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with mixed escapes",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueString "a\"b\\c\nd"),
+                Testing.writerTestCaseOutput = "\"a\\\"b\\\\c\\nd\""})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "arrays",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty array",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueArray []),
+                Testing.writerTestCaseOutput = "[]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueArray [
+                  Model.ValueNumber 1.0]),
+                Testing.writerTestCaseOutput = "[1]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueArray [
+                  Model.ValueNumber 1.0,
+                  (Model.ValueNumber 2.0),
+                  (Model.ValueNumber 3.0)]),
+                Testing.writerTestCaseOutput = "[1, 2, 3]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueArray [
+                  Model.ValueString "a",
+                  (Model.ValueString "b")]),
+                Testing.writerTestCaseOutput = "[\"a\", \"b\"]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueArray [
+                  Model.ValueNumber 1.0,
+                  (Model.ValueString "two"),
+                  (Model.ValueBoolean True),
+                  Model.ValueNull]),
+                Testing.writerTestCaseOutput = "[1, \"two\", true, null]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "objects",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty object",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueObject M.empty),
+                Testing.writerTestCaseOutput = "{}"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single key-value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
+                  ("name", (Model.ValueString "Alice"))])),
+                Testing.writerTestCaseOutput = "{\"name\": \"Alice\"}"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple keys",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
+                  ("a", (Model.ValueNumber 1.0)),
+                  ("b", (Model.ValueNumber 2.0))])),
+                Testing.writerTestCaseOutput = "{\"a\": 1, \"b\": 2}"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed value types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
+                  ("active", (Model.ValueBoolean True)),
+                  ("count", (Model.ValueNumber 42.0)),
+                  ("name", (Model.ValueString "test"))])),
+                Testing.writerTestCaseOutput = "{\"active\": true, \"count\": 42, \"name\": \"test\"}"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "nested structures",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested arrays",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueArray [
+                  Model.ValueArray [
+                    Model.ValueNumber 1.0,
+                    (Model.ValueNumber 2.0)],
+                  (Model.ValueArray [
+                    Model.ValueNumber 3.0,
+                    (Model.ValueNumber 4.0)])]),
+                Testing.writerTestCaseOutput = "[[1, 2], [3, 4]]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "object with array",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
+                  ("items", (Model.ValueArray [
+                    Model.ValueNumber 1.0,
+                    (Model.ValueNumber 2.0)]))])),
+                Testing.writerTestCaseOutput = "{\"items\": [1, 2]}"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "array of objects",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueArray [
+                  Model.ValueObject (M.fromList [
+                    ("id", (Model.ValueNumber 1.0))]),
+                  (Model.ValueObject (M.fromList [
+                    ("id", (Model.ValueNumber 2.0))]))]),
+                Testing.writerTestCaseOutput = "[{\"id\": 1}, {\"id\": 2}]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested object",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJsonWriter (Testing.WriterTestCase {
+                Testing.writerTestCaseInput = (Model.ValueObject (M.fromList [
+                  ("user", (Model.ValueObject (M.fromList [
+                    ("name", (Model.ValueString "Bob"))])))])),
+                Testing.writerTestCaseOutput = "{\"user\": {\"name\": \"Bob\"}}"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Chars.hs b/src/gen-test/haskell/Hydra/Test/Lib/Chars.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Chars.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Chars.hs
@@ -15,238 +15,239 @@
 
 -- | Test cases for hydra.lib.chars primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.chars primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "isAlphaNum",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "letter",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isAlphaNum"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "digit",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isAlphaNum"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "space",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isAlphaNum"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 32)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "punctuation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isAlphaNum"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 46)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "isLower",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lowercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uppercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "digit",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "isSpace",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "space",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isSpace"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 32)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "tab",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isSpace"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "newline",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isSpace"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "letter",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isSpace"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "isUpper",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uppercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lowercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "digit",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "toLower",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uppercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lowercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "digit",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "toUpper",
+      Testing.testGroupName = "hydra.lib.chars primitives",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lowercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "uppercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "digit",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "isAlphaNum",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "letter",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isAlphaNum"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "digit",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isAlphaNum"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "space",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isAlphaNum"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 32)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "punctuation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isAlphaNum"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 46)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "isLower",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lowercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "uppercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "digit",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "isSpace",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "space",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isSpace"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 32)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tab",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isSpace"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "newline",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isSpace"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "letter",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isSpace"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "isUpper",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "uppercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lowercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "digit",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.isUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "toLower",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "uppercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lowercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "digit",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "toUpper",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lowercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "uppercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 65)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "digit",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.chars.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 53)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Eithers.hs b/src/gen-test/haskell/Hydra/Test/Lib/Eithers.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Eithers.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Eithers.hs
@@ -15,721 +15,722 @@
 
 -- | Test cases for hydra.lib.eithers primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.eithers primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "bind",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bind Right with success",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "ab"))))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "s"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
-                    Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
-                  Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bind Right with failure",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString ""))))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "s"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
-                    Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
-                  Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bind Left returns Left unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
-                Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "s"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
-                    Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
-                  Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bimap",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map left value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
-              Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map right value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
-              Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "ab"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "isLeft",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "left value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.isLeft"))),
-              Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "right value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.isLeft"))),
-              Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "test"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "isRight",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "right value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.isRight"))),
-              Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "test"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "left value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.isRight"))),
-              Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "fromLeft",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "extract left",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.fromLeft"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-              Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "use default for right",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.fromLeft"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-              Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "test"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "fromRight",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "extract right",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.fromRight"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
-              Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "test"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "test"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "use default for left",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.fromRight"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
-              Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "default"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "either",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "apply left function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
-              Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "apply right function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
-              Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "ab"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lefts",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter left values",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.lefts"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a")))),
-                (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all lefts",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.lefts"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-                (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all rights",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.lefts"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.lefts"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "rights",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter right values",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.rights"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a")))),
-                (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all rights",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.rights"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all lefts",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.rights"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-                (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.rights"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "partitionEithers",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "partition mixed",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.partitionEithers"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a")))),
-                (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all lefts",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.partitionEithers"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-                (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all rights",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.partitionEithers"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.partitionEithers"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "map",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map right value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "preserve left",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapList",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all succeed",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapList"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-                      Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
-                    Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first fails",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapList"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-                      Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
-                    Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapList"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-                      Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
-                    Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermList [])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapMaybe",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just succeeds",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapMaybe"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-                      Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
-                    Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just fails",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapMaybe"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-                      Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
-                    Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapMaybe"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-                      Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
-                    Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
-              Core.applicationArgument = (Core.TermMaybe Nothing)})),
-            Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe Nothing)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.eithers primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "bind",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bind Right with success",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                    Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "ab"))))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "s"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
+                        Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
+                      Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bind Right with failure",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                    Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString ""))))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "s"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
+                        Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
+                      Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bind Left returns Left unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bind"))),
+                    Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "s"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})),
+                        Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
+                      Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bimap",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "map left value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
+                  Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "map right value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.bimap"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
+                  Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "ab"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "isLeft",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "left value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.isLeft"))),
+                  Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "right value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.isLeft"))),
+                  Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "test"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "isRight",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "right value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.isRight"))),
+                  Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "test"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "left value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.isRight"))),
+                  Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "fromLeft",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "extract left",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.fromLeft"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+                  Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "use default for right",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.fromLeft"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+                  Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "test"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "fromRight",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "extract right",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.fromRight"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
+                  Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "test"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "test"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "use default for left",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.fromRight"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
+                  Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "default"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "either",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "apply left function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
+                  Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "apply right function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.either"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
+                  Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "ab"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lefts",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter left values",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.lefts"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a")))),
+                    (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all lefts",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.lefts"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                    (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all rights",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.lefts"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.lefts"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "rights",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter right values",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.rights"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a")))),
+                    (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all rights",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.rights"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all lefts",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.rights"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                    (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.rights"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "partitionEithers",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partition mixed",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.partitionEithers"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a")))),
+                    (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all lefts",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.partitionEithers"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                    (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all rights",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.partitionEithers"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermEither (Right (Core.TermLiteral (Core.LiteralString "b"))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.partitionEithers"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "map",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "map right value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "preserve left",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "mapList",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all succeed",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapList"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+                          Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
+                        Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first fails",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapList"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+                          Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
+                        Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapList"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+                          Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
+                        Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermList [])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "mapMaybe",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just succeeds",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapMaybe"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+                          Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
+                        Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just fails",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapMaybe"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+                          Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
+                        Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.eithers.mapMaybe"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
+                          Core.applicationArgument = (Core.TermEither (Left (Core.TermLiteral (Core.LiteralString "zero"))))})),
+                        Core.applicationArgument = (Core.TermEither (Right (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))}))})))})),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.evaluationTestCaseOutput = (Core.TermEither (Right (Core.TermMaybe Nothing)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Equality.hs b/src/gen-test/haskell/Hydra/Test/Lib/Equality.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Equality.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Equality.hs
@@ -15,751 +15,752 @@
 
 -- | Test cases for hydra.lib.equality primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.equality primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "compare",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less than",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "equalTo"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater than",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "greaterThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "equal",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal integers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unequal integers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "gt",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "gte",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "identity",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lt",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lte",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "max",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "min",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "compare strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less than (lexicographic)",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "banana"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "equalTo"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater than (lexicographic)",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "greaterThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty vs non-empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "prefix vs longer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ab"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lt strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less (lexicographic)",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "banana"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "gt strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater (lexicographic)",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "banana"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "max strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "min strings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "apple"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "apple"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "compare floats",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less than",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "equalTo"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater than",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 5.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "greaterThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative vs positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "lessThan"),
-                Core.fieldTerm = Core.TermUnit}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lt floats",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 5.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "gt floats",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greater",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 5.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "less",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.equality primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "compare",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less than",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "equalTo"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater than",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "greaterThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "equal",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal integers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unequal integers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "gt",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "gte",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "identity",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "integer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lt",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lte",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "max",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "min",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "compare strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less than (lexicographic)",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "banana"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "equalTo"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater than (lexicographic)",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "greaterThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty vs non-empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "prefix vs longer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ab"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lt strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less (lexicographic)",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "banana"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "gt strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater (lexicographic)",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "banana"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "max strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "min strings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "apple"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "zebra"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "apple"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "apple"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "compare floats",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less than",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "equalTo"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater than",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 5.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "greaterThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative vs positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.compare"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "hydra.util.Comparison"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "lessThan"),
+                    Core.fieldTerm = Core.TermUnit}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lt floats",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 5.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "gt floats",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greater",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 5.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "less",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Flows.hs b/src/gen-test/haskell/Hydra/Test/Lib/Flows.hs
deleted file mode 100644
--- a/src/gen-test/haskell/Hydra/Test/Lib/Flows.hs
+++ /dev/null
@@ -1,1373 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Test cases for hydra.lib.flows primitives
-
-module Hydra.Test.Lib.Flows where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Testing as Testing
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Test cases for hydra.lib.flows primitives
-allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.flows primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "apply",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "apply add",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "f"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bind",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bind add",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "n"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bind multiply",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "n"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))}))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "fail",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "fail with message",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.fail")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "test error message"))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe Nothing)},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [
-                          Core.TermLiteral (Core.LiteralString "Error: test error message ()")])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "foldl",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "foldl sum",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "a0"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermVariable (Core.Name "a0"))})),
-                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "a1"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a1"))})),
-                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))}))})),
-                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "a2"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                    Core.applicationArgument = (Core.TermVariable (Core.Name "a2"))})),
-                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))}))})))}))})))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "map",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map negate",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.map"))),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map abs",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.map"))),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs")))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))}))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapElems",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mapElems add one",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "v1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "v2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                              Core.applicationArgument = (Core.TermList [
-                                Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermVariable (Core.Name "v1"))),
-                                (Core.TermPair (Core.TermLiteral (Core.LiteralString "b"), (Core.TermVariable (Core.Name "v2"))))])}))}))})))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMap (M.fromList [
-                    (Core.TermLiteral (Core.LiteralString "a"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))),
-                    (Core.TermLiteral (Core.LiteralString "b"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))))]))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapKeys",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mapKeys add one",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "k1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "k2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-                              Core.applicationArgument = (Core.TermList [
-                                Core.TermPair (Core.TermVariable (Core.Name "k1"), (Core.TermLiteral (Core.LiteralString "a"))),
-                                (Core.TermPair (Core.TermVariable (Core.Name "k2"), (Core.TermLiteral (Core.LiteralString "b"))))])}))}))})))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMap (M.fromList [
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "a"))),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "b")))]))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapList",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mapList add one",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "y2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y3"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                                Core.applicationArgument = (Core.TermList [
-                                  Core.TermVariable (Core.Name "y1"),
-                                  (Core.TermVariable (Core.Name "y2")),
-                                  (Core.TermVariable (Core.Name "y3"))])}))})))}))})))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapMaybe",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mapMaybe just",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermVariable (Core.Name "y"))))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mapMaybe nothing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                    Core.applicationArgument = (Core.TermMaybe Nothing)}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermMaybe Nothing)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapSet",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mapSet add one",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "y2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-                                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))}))})),
-                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "y3"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                                Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
-                                  Core.applicationArgument = (Core.TermList [
-                                    Core.TermVariable (Core.Name "y1"),
-                                    (Core.TermVariable (Core.Name "y2")),
-                                    (Core.TermVariable (Core.Name "y3"))])}))}))})))}))})))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermSet (S.fromList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "pure",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "pure integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "pure zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "pure negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "pure string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "sequence",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sequence pure list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x1"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
-                        Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x2"),
-                          Core.lambdaDomain = Nothing,
-                          Core.lambdaBody = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})),
-                            Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "x3"),
-                              Core.lambdaDomain = Nothing,
-                              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                                Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                                Core.applicationArgument = (Core.TermList [
-                                  Core.TermVariable (Core.Name "x1"),
-                                  (Core.TermVariable (Core.Name "x2")),
-                                  (Core.TermVariable (Core.Name "x3"))])}))})))}))})))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "withDefault",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "withDefault on success returns original",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.withDefault"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "withDefault on failure returns fallback",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.flows.withDefault"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.fail")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "error"))}))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Lists.hs b/src/gen-test/haskell/Hydra/Test/Lib/Lists.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Lists.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Lists.hs
@@ -15,3186 +15,3273 @@
 
 -- | Test cases for hydra.lib.lists primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.lists primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "apply",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [
-        Testing.TestGroup {
-          Testing.testGroupName = "string transformations",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "string transformations",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")),
-                      (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))])})),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralString "One"),
-                    (Core.TermLiteral (Core.LiteralString "Two")),
-                    (Core.TermLiteral (Core.LiteralString "Three"))])})),
-                Testing.evaluationTestCaseOutput = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "ONE"),
-                  (Core.TermLiteral (Core.LiteralString "TWO")),
-                  (Core.TermLiteral (Core.LiteralString "THREE")),
-                  (Core.TermLiteral (Core.LiteralString "one")),
-                  (Core.TermLiteral (Core.LiteralString "two")),
-                  (Core.TermLiteral (Core.LiteralString "three"))])})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]},
-        Testing.TestGroup {
-          Testing.testGroupName = "edge cases",
-          Testing.testGroupDescription = Nothing,
-          Testing.testGroupSubgroups = [],
-          Testing.testGroupCases = [
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "empty function list",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
-                    Core.applicationArgument = (Core.TermList [])})),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralString "a"),
-                    (Core.TermLiteral (Core.LiteralString "b"))])})),
-                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "empty input list",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))])})),
-                  Core.applicationArgument = (Core.TermList [])})),
-                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "single function",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))])})),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralString "hello")])})),
-                Testing.evaluationTestCaseOutput = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "HELLO")])})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []},
-            Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "single input",
-              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
-                    Core.applicationArgument = (Core.TermList [
-                      Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")),
-                      (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))])})),
-                  Core.applicationArgument = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralString "Test")])})),
-                Testing.evaluationTestCaseOutput = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "TEST"),
-                  (Core.TermLiteral (Core.LiteralString "test"))])})),
-              Testing.testCaseWithMetadataDescription = Nothing,
-              Testing.testCaseWithMetadataTags = []}]}],
-      Testing.testGroupCases = []},
-    Testing.TestGroup {
-      Testing.testGroupName = "at",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "middle element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "last element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string list access",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello"),
-                (Core.TermLiteral (Core.LiteralString "world"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "world"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bind",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negation function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.bind"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2)))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3)))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.bind"))),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.bind"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))])})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "duplicate elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.bind"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1)))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "concat",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple non-empty lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty lists included",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                (Core.TermList []),
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all empty lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [],
-                (Core.TermList []),
-                (Core.TermList [])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list of lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "concat2",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two non-empty lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first list empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second list empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "both lists empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "a"),
-                  (Core.TermLiteral (Core.LiteralString "b"))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "c"),
-                (Core.TermLiteral (Core.LiteralString "d"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b")),
-              (Core.TermLiteral (Core.LiteralString "c")),
-              (Core.TermLiteral (Core.LiteralString "d"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "cons",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cons to non-empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cons to empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cons negative number",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cons string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "world")])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hello"),
-              (Core.TermLiteral (Core.LiteralString "world"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "drop",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop from beginning",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop zero elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop all elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop more than length",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop from empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop negative amount",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "dropWhile",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop while less than 3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.dropWhile"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop all elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.dropWhile"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "drop no elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.dropWhile"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.dropWhile"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "elem",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "element present",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "element not present",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element present",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element not present",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "duplicate elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string element present",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "world"),
-                (Core.TermLiteral (Core.LiteralString "hello")),
-                (Core.TermLiteral (Core.LiteralString "test"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string element not present",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "missing"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "world"),
-                (Core.TermLiteral (Core.LiteralString "hello"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "filter",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter positive numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3)))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter all elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter no elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "find",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "find existing element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "find first matching",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "find no match",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "find in empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "find single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "foldl",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sum with addition",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "product with multiplication",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul")))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 24)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "subtraction fold",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub")))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "group",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "consecutive duplicates",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))],
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))]),
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "no duplicates",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all same",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))]])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "head",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "three element list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2)))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello"),
-                (Core.TermLiteral (Core.LiteralString "world"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "init",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.init"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.init"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.init"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.init"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b")),
-                (Core.TermLiteral (Core.LiteralString "c"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "intercalate",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "double zero separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list of lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lists with empty lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]),
-                (Core.TermList [])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "intersperse",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string interspersion",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "and"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "one"),
-                (Core.TermLiteral (Core.LiteralString "two")),
-                (Core.TermLiteral (Core.LiteralString "three"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "one"),
-              (Core.TermLiteral (Core.LiteralString "and")),
-              (Core.TermLiteral (Core.LiteralString "two")),
-              (Core.TermLiteral (Core.LiteralString "and")),
-              (Core.TermLiteral (Core.LiteralString "three"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "only")])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "only")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "+"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "+")),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "number interspersion",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "last",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "three element list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2)))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello"),
-                (Core.TermLiteral (Core.LiteralString "world"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "world"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "length",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "three elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "many elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b")),
-                (Core.TermLiteral (Core.LiteralString "c"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "map",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string to uppercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "one"),
-                (Core.TermLiteral (Core.LiteralString "two"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "ONE"),
-              (Core.TermLiteral (Core.LiteralString "TWO"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello")])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "HELLO")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "number negation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2)))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "identity function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity")))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "nub",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "remove duplicates",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "no duplicates",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all duplicates",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string duplicates",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b")),
-                (Core.TermLiteral (Core.LiteralString "a")),
-                (Core.TermLiteral (Core.LiteralString "c"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b")),
-              (Core.TermLiteral (Core.LiteralString "c"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "null",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty int list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "non-empty string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a")])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "partition",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "partition greater than 3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))], (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "partition all elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))], (Core.TermList [])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "partition no elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "partition even numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))], (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "pure",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "one"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "one")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "number element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative number",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "replicate",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "replicate three times",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.replicate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "replicate zero times",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.replicate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "replicate once",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.replicate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "replicate string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.replicate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hello"),
-              (Core.TermLiteral (Core.LiteralString "hello"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "reverse",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b")),
-                (Core.TermLiteral (Core.LiteralString "c"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "c"),
-              (Core.TermLiteral (Core.LiteralString "b")),
-              (Core.TermLiteral (Core.LiteralString "a"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "safeHead",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "non-empty int list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty int list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "non-empty string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello"),
-                (Core.TermLiteral (Core.LiteralString "world"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "singleton",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "number element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.singleton"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative number",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.singleton"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.singleton"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.singleton"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hello")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "sort",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unsorted numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "already sorted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "reverse sorted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "duplicates",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string sort",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "zebra"),
-                (Core.TermLiteral (Core.LiteralString "apple")),
-                (Core.TermLiteral (Core.LiteralString "banana"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "apple"),
-              (Core.TermLiteral (Core.LiteralString "banana")),
-              (Core.TermLiteral (Core.LiteralString "zebra"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "sortOn",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sort by string length",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length")))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello"),
-                (Core.TermLiteral (Core.LiteralString "hi")),
-                (Core.TermLiteral (Core.LiteralString "world"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hi"),
-              (Core.TermLiteral (Core.LiteralString "hello")),
-              (Core.TermLiteral (Core.LiteralString "world"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length")))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single string element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length")))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "test")])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "test")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sort by negation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sort by absolute value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs")))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3)))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "span",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "span less than 3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "span all elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))], (Core.TermList [])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "span no elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "tail",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b")),
-                (Core.TermLiteral (Core.LiteralString "c"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "b"),
-              (Core.TermLiteral (Core.LiteralString "c"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "take",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "take from beginning",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "take zero elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "take all elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "take more than length",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "take from empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "take negative amount",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "transpose",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "square matrix",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))],
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single row",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single column",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "ragged matrix",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))]),
-                (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))],
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6))])])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "zip",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal length lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b")),
-                (Core.TermLiteral (Core.LiteralString "c"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c"))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first list shorter",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b")),
-                (Core.TermLiteral (Core.LiteralString "c"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second list shorter",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty first list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty second list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "both empty lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "zipWith",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "addition",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first list shorter",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second list shorter",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty first list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty second list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string concatenation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2")))})),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "a"),
-                  (Core.TermLiteral (Core.LiteralString "b"))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "1"),
-                (Core.TermLiteral (Core.LiteralString "2"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a1"),
-              (Core.TermLiteral (Core.LiteralString "b2"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.lists primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "apply",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [
+            Testing.TestGroup {
+              Testing.testGroupName = "string transformations",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "string transformations",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")),
+                          (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))])})),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralString "One"),
+                        (Core.TermLiteral (Core.LiteralString "Two")),
+                        (Core.TermLiteral (Core.LiteralString "Three"))])})),
+                    Testing.evaluationTestCaseOutput = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "ONE"),
+                      (Core.TermLiteral (Core.LiteralString "TWO")),
+                      (Core.TermLiteral (Core.LiteralString "THREE")),
+                      (Core.TermLiteral (Core.LiteralString "one")),
+                      (Core.TermLiteral (Core.LiteralString "two")),
+                      (Core.TermLiteral (Core.LiteralString "three"))])})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "edge cases",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "empty function list",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
+                        Core.applicationArgument = (Core.TermList [])})),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralString "a"),
+                        (Core.TermLiteral (Core.LiteralString "b"))])})),
+                    Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "empty input list",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))])})),
+                      Core.applicationArgument = (Core.TermList [])})),
+                    Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "single function",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))])})),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralString "hello")])})),
+                    Testing.evaluationTestCaseOutput = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "HELLO")])})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "single input",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.apply"))),
+                        Core.applicationArgument = (Core.TermList [
+                          Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")),
+                          (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))])})),
+                      Core.applicationArgument = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralString "Test")])})),
+                    Testing.evaluationTestCaseOutput = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "TEST"),
+                      (Core.TermLiteral (Core.LiteralString "test"))])})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]}],
+          Testing.testGroupCases = []},
+        Testing.TestGroup {
+          Testing.testGroupName = "at",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "middle element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "last element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string list access",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.at"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello"),
+                    (Core.TermLiteral (Core.LiteralString "world"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "world"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bind",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negation function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.bind"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2)))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3)))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.bind"))),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.bind"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))])})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "duplicate elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.bind"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1)))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "concat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple non-empty lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty lists included",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                    (Core.TermList []),
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all empty lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [],
+                    (Core.TermList []),
+                    (Core.TermList [])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list of lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "concat2",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two non-empty lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first list empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second list empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "both lists empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "a"),
+                      (Core.TermLiteral (Core.LiteralString "b"))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "c"),
+                    (Core.TermLiteral (Core.LiteralString "d"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c")),
+                  (Core.TermLiteral (Core.LiteralString "d"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "cons",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cons to non-empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cons to empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cons negative number",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cons string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.cons"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "world")])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello"),
+                  (Core.TermLiteral (Core.LiteralString "world"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "drop",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop from beginning",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop zero elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop all elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop more than length",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop from empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop negative amount",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.drop"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "dropWhile",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop while less than 3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.dropWhile"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop all elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.dropWhile"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "drop no elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.dropWhile"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.dropWhile"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "elem",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "element present",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "element not present",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element present",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element not present",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "duplicate elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string element present",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "world"),
+                    (Core.TermLiteral (Core.LiteralString "hello")),
+                    (Core.TermLiteral (Core.LiteralString "test"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string element not present",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.elem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "missing"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "world"),
+                    (Core.TermLiteral (Core.LiteralString "hello"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "filter",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter positive numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3)))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter all elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter no elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.filter"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "find",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "find existing element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "find first matching",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "find no match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "find in empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "find single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.find"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "foldl",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sum with addition",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "product with multiplication",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 24)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "subtraction fold",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldl"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "foldr",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "subtraction fold right",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldr"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldr"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldr"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sum with addition",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldr"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "subtraction vs foldl",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.foldr"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub")))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-8))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "group",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "consecutive duplicates",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))],
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))]),
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no duplicates",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all same",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))]])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.group"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "head",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "three element list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2)))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello"),
+                    (Core.TermLiteral (Core.LiteralString "world"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "init",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.init"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.init"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.init"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.init"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b")),
+                    (Core.TermLiteral (Core.LiteralString "c"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "intercalate",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "double zero separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list of lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lists with empty lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intercalate"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]),
+                    (Core.TermList [])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "intersperse",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string interspersion",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "and"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "one"),
+                    (Core.TermLiteral (Core.LiteralString "two")),
+                    (Core.TermLiteral (Core.LiteralString "three"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "one"),
+                  (Core.TermLiteral (Core.LiteralString "and")),
+                  (Core.TermLiteral (Core.LiteralString "two")),
+                  (Core.TermLiteral (Core.LiteralString "and")),
+                  (Core.TermLiteral (Core.LiteralString "three"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "only")])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "only")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "+"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "+")),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "number interspersion",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.intersperse"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "last",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "three element list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2)))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello"),
+                    (Core.TermLiteral (Core.LiteralString "world"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "world"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "length",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "three elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "many elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b")),
+                    (Core.TermLiteral (Core.LiteralString "c"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "map",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string to uppercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "one"),
+                    (Core.TermLiteral (Core.LiteralString "two"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "ONE"),
+                  (Core.TermLiteral (Core.LiteralString "TWO"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper")))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello")])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "HELLO")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "number negation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2)))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "identity function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.identity")))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "nub",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "remove duplicates",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no duplicates",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all duplicates",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string duplicates",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.nub"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b")),
+                    (Core.TermLiteral (Core.LiteralString "a")),
+                    (Core.TermLiteral (Core.LiteralString "c"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "null",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty int list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "non-empty string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.null"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a")])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "partition",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partition greater than 3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))], (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partition all elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))], (Core.TermList [])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partition no elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partition even numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))], (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.partition"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "pure",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "one"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "one")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "number element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative number",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.pure"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "replicate",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "replicate three times",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.replicate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "replicate zero times",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.replicate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "replicate once",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.replicate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "replicate string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.replicate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello"),
+                  (Core.TermLiteral (Core.LiteralString "hello"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "reverse",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b")),
+                    (Core.TermLiteral (Core.LiteralString "c"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "c"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "a"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "safeHead",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "non-empty int list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty int list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "non-empty string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello"),
+                    (Core.TermLiteral (Core.LiteralString "world"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.safeHead"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "singleton",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "number element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.singleton"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative number",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.singleton"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.singleton"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.singleton"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "sort",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unsorted numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "already sorted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "reverse sorted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "duplicates",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string sort",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sort"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "zebra"),
+                    (Core.TermLiteral (Core.LiteralString "apple")),
+                    (Core.TermLiteral (Core.LiteralString "banana"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "apple"),
+                  (Core.TermLiteral (Core.LiteralString "banana")),
+                  (Core.TermLiteral (Core.LiteralString "zebra"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "sortOn",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sort by string length",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length")))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello"),
+                    (Core.TermLiteral (Core.LiteralString "hi")),
+                    (Core.TermLiteral (Core.LiteralString "world"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hi"),
+                  (Core.TermLiteral (Core.LiteralString "hello")),
+                  (Core.TermLiteral (Core.LiteralString "world"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length")))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single string element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length")))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "test")])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "test")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sort by negation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sort by absolute value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.sortOn"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs")))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3)))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "span",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "span less than 3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))], (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "span all elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))], (Core.TermList [])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "span no elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.span"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lt"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermList [], (Core.TermList [])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "tail",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.tail"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b")),
+                    (Core.TermLiteral (Core.LiteralString "c"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "b"),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "take",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "take from beginning",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "take zero elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "take all elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "take more than length",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "take from empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "take negative amount",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.take"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "transpose",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "square matrix",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))],
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single row",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single column",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))]),
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "ragged matrix",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.transpose"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))]),
+                    (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))],
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6))])])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "zip",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal length lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b")),
+                    (Core.TermLiteral (Core.LiteralString "c"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c"))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first list shorter",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b")),
+                    (Core.TermLiteral (Core.LiteralString "c"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second list shorter",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty first list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty second list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "both empty lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zip"))),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "zipWith",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "addition",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first list shorter",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second list shorter",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty first list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty second list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add")))})),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string concatenation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.zipWith"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2")))})),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "a"),
+                      (Core.TermLiteral (Core.LiteralString "b"))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "1"),
+                    (Core.TermLiteral (Core.LiteralString "2"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a1"),
+                  (Core.TermLiteral (Core.LiteralString "b2"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Literals.hs b/src/gen-test/haskell/Hydra/Test/Lib/Literals.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Literals.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Literals.hs
@@ -16,1958 +16,1959 @@
 
 -- | Test cases for hydra.lib.literals primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.literals primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToInt8",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-42))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToInt16",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-1000))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToInt32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-42))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToInt64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-1000000))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1000000))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToUint8",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 100)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 100)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToUint16",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 1000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToUint32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 100000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 100000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToUint64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "int8ToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int8ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int8ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-42))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "max value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int8ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 127)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "min value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int8ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-128))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-128))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "int16ToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int16ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int16ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-1000))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "int32ToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int32ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int32ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-42))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int32ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "int64ToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int64ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int64ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1000000))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-1000000))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "uint8ToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint8ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "max value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint8ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 255)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "uint16ToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint16ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint16ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 1000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "uint32ToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint32ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint32ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 100000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 100000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "uint64ToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint64ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint64ToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000000)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "float32ToBigfloat",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float32ToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 2.5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float32ToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-2.5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.5))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float32ToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "float64ToBigfloat",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float64ToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float64ToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.71828))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.71828))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float64ToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigfloatToFloat32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-2.5))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigfloatToFloat64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.71828))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.71828))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigintToBigfloat",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 42.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-42.0))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bigfloatToBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 42.7)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 43)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-42.7))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-43))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "round down",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 42.3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "half even up",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 42.5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "half even down",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 43.5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 44)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showInt8",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "42"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-42))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-42"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showInt16",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1000"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-1000"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showInt32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "42"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-42))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-42"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showInt64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1000000"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1000000))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-1000000"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showUint8",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "max value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "255"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showUint16",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 1000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1000"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showUint32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 100000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "100000"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showUint64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1000000"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "42"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-42"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showFloat32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.14"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-2.5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-2.5"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "small positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 5.0e-2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "5.0e-2"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "small positive 2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.0e-2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.0e-2"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "very small",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0e-3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1.0e-3"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "normal decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.1)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.1"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showFloat64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.14159"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "small positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 5.0e-2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "5.0e-2"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "small positive 2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0e-2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.0e-2"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "very small",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0e-3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1.0e-3"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "normal decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.1)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.1"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showBigfloat",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.14"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.0"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "small positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 5.0e-2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "5.0e-2"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "small positive 2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.0e-2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.0e-2"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "very small",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 1.0e-3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1.0e-3"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "normal decimal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.1)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.1"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showBoolean",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "true"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "false"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "showString",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"hello\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "latin accented",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "caf\233"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"caf\\233\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "greek lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\955"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\955\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed ascii and non-ascii",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "A\233B"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"A\\233B\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "tab",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\t"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\t\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "newline",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\n\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "carriage return",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\r"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\r\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "backslash",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\\"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\\\\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "double quote",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\\"\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "null",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\NUL"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\NUL\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bell",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\a"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\a\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "backspace",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\b"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\b\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "form feed",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\f"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\f\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "vertical tab",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\v"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\v\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "delete",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\DEL"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\DEL\""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readInt8",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "42"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-42"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-42))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "max value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "127"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "min value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-128"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-128))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "overflow",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "128"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readInt16",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "1000"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1000"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readInt32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "42"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-42"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-42))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readInt64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "1000000"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1000000"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1000000))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readUint8",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "100"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 100)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "max value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "255"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readUint16",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 0)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "1000"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 1000)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint16"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readUint32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 0)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "100000"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 100000)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readUint64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 0)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "typical",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "1000000"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readBigint",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "42"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-42"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "large",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "123456789012345678901234567890"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 123456789012345678901234567890)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readFloat32",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "3.14"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-2.5"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-2.5))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat32"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readFloat64",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "3.14159"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-2.71828"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.71828))))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat64"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readBigfloat",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "3.14"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigfloat"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readBoolean",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBoolean"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "true"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralBoolean True))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBoolean"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "false"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralBoolean False))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "invalid",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBoolean"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "yes"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "readString",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "quoted string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\"hello\""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty quoted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\"\""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString ""))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unquoted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "stringToBinary",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple base64",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.stringToBinary"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "aGVsbG8="))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary "aGVsbG8=")))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.stringToBinary"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary "")))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "binaryToString",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple binary",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.binaryToString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary "aGVsbG8=")))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "aGVsbG8="))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty binary",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.binaryToString"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary "")))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.literals primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToInt8",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-42))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToInt16",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-1000))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToInt32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-42))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToInt64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToInt64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-1000000))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1000000))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToUint8",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 100)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 100)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToUint16",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 1000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToUint32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 100000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 100000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToUint64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToUint64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "int8ToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int8ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int8ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-42))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "max value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int8ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 127)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "min value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int8ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-128))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-128))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "int16ToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int16ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int16ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-1000))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "int32ToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int32ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int32ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-42))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int32ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "int64ToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int64ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.int64ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1000000))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-1000000))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "uint8ToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint8ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "max value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint8ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 255)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "uint16ToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint16ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint16ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 1000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "uint32ToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint32ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint32ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 100000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 100000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "uint64ToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint64ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.uint64ToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 1000000)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "float32ToBigfloat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float32ToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 2.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 2.5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float32ToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-2.5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.5))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float32ToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "float64ToBigfloat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float64ToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float64ToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.71828))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.71828))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.float64ToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigfloatToFloat32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-2.5))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigfloatToFloat64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14159)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-2.71828))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.71828))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigintToBigfloat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 42.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-42.0))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigintToBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bigfloatToBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 42.7)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 43)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-42.7))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-43))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round down",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 42.3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "half even up",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 42.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "half even down",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.bigfloatToBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 43.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 44)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showInt8",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "42"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-42))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-42"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showInt16",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1000"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-1000"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showInt32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "42"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-42))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-42"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showInt64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1000000"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showInt64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1000000))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-1000000"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showUint8",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "max value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "255"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showUint16",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 1000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1000"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showUint32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 100000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "100000"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showUint64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showUint64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1000000"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "42"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-42"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showFloat32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.14"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-2.5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "-2.5"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "small positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 5.0e-2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "5.0e-2"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "small positive 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.0e-2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.0e-2"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "very small",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1.0e-3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1.0e-3"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "normal decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.1)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.1"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showFloat64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.14159"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "small positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 5.0e-2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "5.0e-2"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "small positive 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0e-2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.0e-2"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "very small",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0e-3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1.0e-3"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "normal decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.1)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.1"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showBigfloat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.14"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.0"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "small positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 5.0e-2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "5.0e-2"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "small positive 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.0e-2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "3.0e-2"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "very small",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 1.0e-3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "1.0e-3"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "normal decimal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.1)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "0.1"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showBoolean",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "true",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "true"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "false",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showBoolean"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "false"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "showString",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"hello\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "latin accented",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "caf\233"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"caf\\233\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "greek lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\955"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\955\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed ascii and non-ascii",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "A\233B"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"A\\233B\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tab",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\t"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\t\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "newline",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\n\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "carriage return",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\r"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\r\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "backslash",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\\"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\\\\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "double quote",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\\"\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "null",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\NUL"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\NUL\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bell",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\a"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\a\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "backspace",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\b"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\b\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "form feed",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\f"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\f\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "vertical tab",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\v"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\v\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "delete",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.showString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\DEL"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\"\\DEL\""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readInt8",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "42"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-42"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-42))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "max value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "127"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 127)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "min value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-128"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt8 (-128))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "overflow",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "128"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readInt16",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "1000"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 1000)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1000"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt16 (-1000))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readInt32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "42"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-42"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-42))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readInt64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "1000000"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 1000000)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1000000"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt64 (-1000000))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readInt64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readUint8",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 0)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "100"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 100)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "max value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "255"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint8 255)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint8"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readUint16",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 0)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "1000"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint16 1000)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint16"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readUint32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 0)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "100000"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint32 100000)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readUint64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 0)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "typical",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "1000000"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueUint64 1000000)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readUint64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-1"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readBigint",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "42"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-42"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-42))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "0"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 0)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "large",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "123456789012345678901234567890"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 123456789012345678901234567890)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigint"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readFloat32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "3.14"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.14)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-2.5"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-2.5))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat32"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readFloat64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "3.14159"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "-2.71828"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.71828))))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readFloat64"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readBigfloat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "3.14"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.14)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBigfloat"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readBoolean",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "true",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBoolean"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "true"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralBoolean True))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "false",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBoolean"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "false"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralBoolean False))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "invalid",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readBoolean"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "yes"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "readString",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "quoted string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\"hello\""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty quoted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\"\""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString ""))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unquoted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.readString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "stringToBinary",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple base64",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.stringToBinary"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "aGVsbG8="))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary "aGVsbG8=")))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.stringToBinary"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary "")))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "binaryToString",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple binary",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.binaryToString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary "aGVsbG8=")))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "aGVsbG8="))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty binary",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.literals.binaryToString"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBinary (Literals.stringToBinary "")))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Logic.hs b/src/gen-test/haskell/Hydra/Test/Lib/Logic.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Logic.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Logic.hs
@@ -15,243 +15,244 @@
 
 -- | Test cases for hydra.lib.logic primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.logic primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "and",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "true and true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "true and false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "false and true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "false and false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "ifElse",
+      Testing.testGroupName = "hydra.lib.logic primitives",
       Testing.testGroupDescription = Nothing,
       Testing.testGroupSubgroups = [
         Testing.TestGroup {
-          Testing.testGroupName = "boolean values",
+          Testing.testGroupName = "and",
           Testing.testGroupDescription = Nothing,
           Testing.testGroupSubgroups = [],
           Testing.testGroupCases = [
             Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "true condition returns then",
+              Testing.testCaseWithMetadataName = "true and true",
               Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
                 Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
                 Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
                   Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
                     Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
                 Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
               Testing.testCaseWithMetadataDescription = Nothing,
               Testing.testCaseWithMetadataTags = []},
             Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "false condition returns else",
+              Testing.testCaseWithMetadataName = "true and false",
               Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
                 Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
                 Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
                   Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
                     Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
                   Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
                 Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
               Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "false and true",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "false and false",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.and"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
               Testing.testCaseWithMetadataTags = []}]},
         Testing.TestGroup {
-          Testing.testGroupName = "integer values",
+          Testing.testGroupName = "ifElse",
           Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [
+            Testing.TestGroup {
+              Testing.testGroupName = "boolean values",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "true condition returns then",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                    Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "false condition returns else",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                    Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "integer values",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "true selects first int",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                    Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "false selects second int",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                    Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]},
+            Testing.TestGroup {
+              Testing.testGroupName = "string values",
+              Testing.testGroupDescription = Nothing,
+              Testing.testGroupSubgroups = [],
+              Testing.testGroupCases = [
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "true selects first string",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "yes"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "no"))})),
+                    Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "yes"))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []},
+                Testing.TestCaseWithMetadata {
+                  Testing.testCaseWithMetadataName = "false selects second string",
+                  Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                    Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                    Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "yes"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "no"))})),
+                    Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "no"))})),
+                  Testing.testCaseWithMetadataDescription = Nothing,
+                  Testing.testCaseWithMetadataTags = []}]}],
+          Testing.testGroupCases = []},
+        Testing.TestGroup {
+          Testing.testGroupName = "not",
+          Testing.testGroupDescription = Nothing,
           Testing.testGroupSubgroups = [],
           Testing.testGroupCases = [
             Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "true selects first int",
+              Testing.testCaseWithMetadataName = "not true",
               Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
                 Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
                 Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
               Testing.testCaseWithMetadataDescription = Nothing,
               Testing.testCaseWithMetadataTags = []},
             Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "false selects second int",
+              Testing.testCaseWithMetadataName = "not false",
               Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
                 Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
                 Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
               Testing.testCaseWithMetadataDescription = Nothing,
               Testing.testCaseWithMetadataTags = []}]},
         Testing.TestGroup {
-          Testing.testGroupName = "string values",
+          Testing.testGroupName = "or",
           Testing.testGroupDescription = Nothing,
           Testing.testGroupSubgroups = [],
           Testing.testGroupCases = [
             Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "true selects first string",
+              Testing.testCaseWithMetadataName = "true or true",
               Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
                 Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
                 Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
                   Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "yes"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "no"))})),
-                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "yes"))})),
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
               Testing.testCaseWithMetadataDescription = Nothing,
               Testing.testCaseWithMetadataTags = []},
             Testing.TestCaseWithMetadata {
-              Testing.testCaseWithMetadataName = "false selects second string",
+              Testing.testCaseWithMetadataName = "true or false",
               Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
                 Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
                 Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
                   Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "yes"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "no"))})),
-                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "no"))})),
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
               Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "false or true",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "false or false",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
               Testing.testCaseWithMetadataTags = []}]}],
-      Testing.testGroupCases = []},
-    Testing.TestGroup {
-      Testing.testGroupName = "not",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "not true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "not false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.not"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "or",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "true or true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "true or false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "false or true",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean True))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "false or false",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.or"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralBoolean False))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Maps.hs b/src/gen-test/haskell/Hydra/Test/Lib/Maps.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Maps.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Maps.hs
@@ -15,946 +15,947 @@
 
 -- | Test cases for hydra.lib.maps primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.maps primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "alter",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "insert new key",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.alter"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "opt"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "new"))))})))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "new")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "update existing key",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.alter"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "opt"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "updated"))))})))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "updated")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "delete key",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.alter"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "opt"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermMaybe Nothing)})))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bimap",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "transform both",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "k"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "A"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)), (Core.TermLiteral (Core.LiteralString "B")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "k"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "elems",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get all elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.elems"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unsorted keys",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.elems"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b")),
-              (Core.TermLiteral (Core.LiteralString "c"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.elems"))),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "empty",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "filter",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter values starting with a",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filter"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))}))})))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "ab")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "ab")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter all",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filter"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))}))})))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filter"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "v"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))}))})))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "filterWithKey",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter by key > 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filterWithKey"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "k"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter all",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filterWithKey"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "k"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filterWithKey"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "k"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "v"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "findWithDefault",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "find existing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.findWithDefault"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "b"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "use default",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.findWithDefault"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "default"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "fromList",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "create from pairs",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "duplicate keys",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "insert",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "insert new key",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "c"))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "update existing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "updated"))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "updated")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "insert into empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "x")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "keys",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "get all keys",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.keys"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unsorted keys",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.keys"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.keys"))),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lookup",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "find existing key",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "b"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "key not found",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lookup in empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "map",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map over values",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "A"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "B")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapKeys",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "double keys",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.mapKeys"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "k"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.mapKeys"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "k"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "member",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "key exists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.member"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "key missing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.member"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.member"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "null",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.null"))),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "non-empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.null"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "remove",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "remove existing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.delete"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "remove non-existing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.delete"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "remove from empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.delete"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "singleton",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single entry",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.singleton"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "size",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "three entries",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.size"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single entry",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.size"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "test")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.size"))),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "toList",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "convert to pairs",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.toList"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unsorted keys",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.toList"))),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c"))))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.toList"))),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "union",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "union two maps",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.union"))),
-                Core.applicationArgument = (Core.TermMap (M.fromList [
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "x"))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "union with empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.union"))),
-                Core.applicationArgument = (Core.TermMap (M.fromList [
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
-              Core.applicationArgument = (Core.TermMap M.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty with map",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.union"))),
-                Core.applicationArgument = (Core.TermMap M.empty)})),
-              Core.applicationArgument = (Core.TermMap (M.fromList [
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.maps primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "alter",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "insert new key",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.alter"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "opt"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "new"))))})))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "new")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "update existing key",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.alter"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "opt"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "updated"))))})))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "updated")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "delete key",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.alter"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "opt"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermMaybe Nothing)})))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bimap",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "transform both",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "k"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "A"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)), (Core.TermLiteral (Core.LiteralString "B")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.bimap"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "k"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "elems",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get all elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.elems"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unsorted keys",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.elems"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.elems"))),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "empty",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.empty"))),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "filter",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter values starting with a",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filter"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))}))})))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "ab")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "ab")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter all",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filter"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))}))})))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filter"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "v"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.equal"))),
+                          Core.applicationArgument = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "v"))}))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))}))})))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "filterWithKey",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter by key > 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filterWithKey"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "k"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter all",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filterWithKey"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "k"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.filterWithKey"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "k"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "v"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))})))})))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "findWithDefault",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "find existing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.findWithDefault"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "b"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "use default",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.findWithDefault"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "default"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "default"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "fromList",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "create from pairs",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "duplicate keys",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.fromList"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "insert",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "insert new key",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "c"))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "update existing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "updated"))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "updated")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "insert into empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.insert"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "x")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "keys",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "get all keys",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.keys"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unsorted keys",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.keys"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.keys"))),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lookup",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "find existing key",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "b"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "key not found",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lookup in empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.lookup"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "map",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "map over values",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "A"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "B")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "map empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "mapKeys",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "double keys",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.mapKeys"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "k"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.mapKeys"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "k"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "k"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "member",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "key exists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.member"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "key missing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.member"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.member"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "null",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.null"))),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "non-empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.null"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "remove",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "remove existing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.delete"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "remove non-existing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.delete"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "remove from empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.delete"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap M.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "singleton",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single entry",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.singleton"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "size",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "three entries",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.size"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single entry",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.size"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "test")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.size"))),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "toList",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "convert to pairs",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.toList"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unsorted keys",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.toList"))),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c"))))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.toList"))),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "union",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "union two maps",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.union"))),
+                    Core.applicationArgument = (Core.TermMap (M.fromList [
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b")))]))})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "x"))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)), (Core.TermLiteral (Core.LiteralString "b"))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)), (Core.TermLiteral (Core.LiteralString "c")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "union with empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.union"))),
+                    Core.applicationArgument = (Core.TermMap (M.fromList [
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
+                  Core.applicationArgument = (Core.TermMap M.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty with map",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maps.union"))),
+                    Core.applicationArgument = (Core.TermMap M.empty)})),
+                  Core.applicationArgument = (Core.TermMap (M.fromList [
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMap (M.fromList [
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)), (Core.TermLiteral (Core.LiteralString "a")))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Math.hs b/src/gen-test/haskell/Hydra/Test/Lib/Math.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Math.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Math.hs
@@ -15,1639 +15,2263 @@
 
 -- | Test cases for hydra.lib.math primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.math primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "abs",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "add",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-8))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed sign",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "div",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "exact division",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "truncates toward negative infinity",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative dividend",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative divisor",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "even",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "even positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "odd positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "even negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "odd negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "max",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first is larger",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second is larger",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal values",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed sign",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "min",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first is smaller",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second is smaller",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "equal values",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed sign",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mod",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "basic modulo",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "exact division",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative dividend",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative divisor",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mul",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed sign",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-15))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with one",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "negate",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "odd",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "odd positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "even positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "odd negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "even negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "pred",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pred"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pred"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pred"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-6))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "range",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "ascending range",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative start",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1)))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "rem",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "basic remainder",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.rem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "exact division",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.rem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative dividend",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.rem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative divisor",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.rem"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "signum",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.signum"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.signum"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.signum"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "sub",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative numbers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-7))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed sign",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 13)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "succ",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.succ"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.succ"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.succ"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "e",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "Euler's number",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.e"))),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.718281828459045)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "pi",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "pi constant",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pi"))),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592653589793)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "sin",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sin 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sin"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sin pi/2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sin"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5707963267948966)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sin pi",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sin"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592653589793)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.2246467991473532e-16)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "cos",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cos 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cos"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cos pi/2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cos"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5707963267948966)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 6.123233995736766e-17)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cos pi",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cos"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592653589793)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "tan",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "tan 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tan"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "tan pi/4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tan"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.7853981633974483)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.9999999999999999)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "asin",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "asin 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asin"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "asin 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asin"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5707963267948966)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "asin -1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asin"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.5707963267948966))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "acos",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "acos 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acos"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "acos 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acos"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5707963267948966)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "acos -1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acos"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592653589793)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "atan",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "atan 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "atan 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.7853981633974483)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "atan2",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "atan2 1 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.7853981633974483)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "atan2 1 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5707963267948966)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "atan2 0 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "sinh",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sinh 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sinh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sinh 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sinh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.1752011936438014)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "cosh",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cosh 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cosh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cosh 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cosh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5430806348152437)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "tanh",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "tanh 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tanh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "tanh 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tanh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.7615941559557649)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "asinh",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "asinh 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asinh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "asinh 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asinh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.881373587019543)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "acosh",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "acosh 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acosh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "acosh 2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acosh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.3169578969248166)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "atanh",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "atanh 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atanh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "atanh 0.5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atanh"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5493061443340549)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "exp",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "exp 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.exp"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "exp 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.exp"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.718281828459045)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "exp -1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.exp"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.36787944117144233)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "log",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "log 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.log"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "log e",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.log"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.718281828459045)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "logBase",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "log10 1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "log10 10",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "log10 100",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 100.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "log2 8",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 8.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "pow",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "2^3",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pow"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 8.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "10^0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pow"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "2^-1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pow"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "sqrt",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sqrt 4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 4.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sqrt 9",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 9.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sqrt 2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.4142135623730951)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sqrt 0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "ceiling",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "ceiling 3.2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.ceiling"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 4)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "ceiling 3.0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.ceiling"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "ceiling -3.2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.ceiling"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.2))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "ceiling -3.0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.ceiling"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.0))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "floor",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "floor 3.8",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.floor"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.8)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "floor 3.0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.floor"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "floor -3.2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.floor"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.2))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-4))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "floor -3.0",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.floor"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.0))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "round",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "round 3.4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.4)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "round 3.5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 4)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "round 3.6",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.6)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 4)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "round -3.4",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.4))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "round -3.5",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.5))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-4))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "truncate",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "truncate 3.8",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.truncate"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.8)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "truncate 3.2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.truncate"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "truncate -3.8",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.truncate"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.8))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "truncate -3.2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.truncate"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.2))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.math primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "abs",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "add",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-8))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed sign",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "div",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exact division",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "truncates toward negative infinity",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative dividend",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative divisor",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "even",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "even positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "odd positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "even negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "odd negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.even"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "max",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first is larger",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second is larger",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal values",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed sign",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.max"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "min",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first is smaller",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second is smaller",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "equal values",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed sign",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.min"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "mod",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic modulo",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exact division",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative dividend",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative divisor",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "mul",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed sign",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-15))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with one",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "negate",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "odd",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "odd positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "even positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "odd negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "even negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.odd"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "pred",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pred"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pred"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pred"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-6))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "range",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "ascending range",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative start",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.range"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1)))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "rem",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic remainder",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.rem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exact division",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.rem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative dividend",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.rem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative divisor",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.rem"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "signum",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.signum"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.signum"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-1))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.signum"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "sub",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative numbers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-7))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed sign",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 13)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "succ",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.succ"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.succ"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.succ"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-4))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "e",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "Euler's number",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.e")))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.71828182846)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "pi",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "pi constant",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pi")))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159265359)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "sin",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sin 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sin"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sin pi/2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sin"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5707963267948966)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sin pi",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sin"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592653589793)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.22464679915e-16)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sin 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sin"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.841470984808)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sin 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sin"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.479425538604)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "cos",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cos 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cos"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cos pi/2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cos"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.5707963267948966)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 6.12323399574e-17)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cos pi",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cos"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592653589793)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cos 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cos"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.540302305868)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cos 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cos"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.87758256189)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "tan",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tan 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tan"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tan pi/4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tan"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.7853981633974483)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tan 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tan"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.55740772465)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tan 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tan"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.546302489844)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "asin",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "asin 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asin"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "asin 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asin"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.57079632679)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "asin -1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asin"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.57079632679))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "asin 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asin"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.523598775598)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "acos",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "acos 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acos"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "acos 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acos"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.57079632679)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "acos -1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acos"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14159265359)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "acos 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acos"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0471975512)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "atan",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atan 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atan 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.785398163397)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atan 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.463647609001)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "atan2",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atan2 1 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan2"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.785398163397)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atan2 1 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan2"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.57079632679)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atan2 0 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atan2 3 4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atan2"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 4.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.643501108793)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "sinh",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sinh 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sinh"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sinh 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sinh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.17520119364)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sinh 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sinh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.62686040785)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "cosh",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cosh 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cosh"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cosh 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cosh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.54308063482)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cosh 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.cosh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.76219569108)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "tanh",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tanh 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tanh"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tanh 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tanh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.761594155956)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tanh 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.tanh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.46211715726)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "asinh",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "asinh 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asinh"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "asinh 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asinh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.88137358702)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "asinh 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.asinh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.48121182506)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "acosh",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "acosh 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acosh"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "acosh 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acosh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.31695789692)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "acosh 3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.acosh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.76274717404)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "atanh",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atanh 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atanh"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atanh 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atanh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.549306144334)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "atanh 0.1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.atanh"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.1)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.100335347731)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "exp",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exp 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.exp"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exp 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.exp"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.71828182846)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exp -1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.exp"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.367879441171)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exp 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.exp"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 7.38905609893)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exp 0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.exp"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.6487212707)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "log",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.log"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log e",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.log"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.718281828459045)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.log"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.69314718056)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log 10",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.log"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.30258509299)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "logBase",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log10 1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log10 10",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log10 100",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 100.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log2 8",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 8.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "log2 10",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.logBase"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.32192809489)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "pow",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "2^3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pow"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 8.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "10^0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pow"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "2^-1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pow"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1.0))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "2^0.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.pow"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.5)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.41421356237)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "sqrt",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sqrt 4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 4.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sqrt 9",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 9.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sqrt 2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 2.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.4142135623730951)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sqrt 0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sqrt 3",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sqrt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))}))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.73205080757)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "ceiling",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "ceiling 3.2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.ceiling"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 4)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "ceiling 3.0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.ceiling"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "ceiling -3.2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.ceiling"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.2))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "ceiling -3.0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.ceiling"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.0))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "floor",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "floor 3.8",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.floor"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.8)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "floor 3.0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.floor"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "floor -3.2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.floor"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.2))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-4))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "floor -3.0",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.floor"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.0))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "round",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 3.4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.4)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 3.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 4)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 3.6",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.6)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 4)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round -3.4",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.4))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round -3.5",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.round"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-4))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "roundBigfloat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundBigfloat"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round pi to 4 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundBigfloat"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.141592653589793)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 3.142)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 1234.5 to 3 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundBigfloat"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 1234.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 1230.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 0.001234 to 2 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundBigfloat"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 1.234e-3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat 1.2e-3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundBigfloat"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-1234.5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueBigfloat (-1230.0))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "roundFloat32",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat32"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round pi to 4 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat32"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.1415927)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 3.142)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 1234.5 to 3 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat32"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1234.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 1230.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat32"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-1234.5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 (-1230.0))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "roundFloat64",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round pi to 4 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592653589793)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.142)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round pi to 10 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592653589793)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.141592654)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 1234.5 to 3 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1234.5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1230.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 0.001234 to 2 digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.234e-3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 1.2e-3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1234.5))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-1230.0))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "round 1 digit",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.roundFloat64"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 9.876)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 10.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "truncate",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "truncate 3.8",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.truncate"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.8)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "truncate 3.2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.truncate"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "truncate -3.8",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.truncate"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.8))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "truncate -3.2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.truncate"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-3.2))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueBigint (-3))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Maybes.hs b/src/gen-test/haskell/Hydra/Test/Lib/Maybes.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Maybes.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Maybes.hs
@@ -15,659 +15,686 @@
 
 -- | Test cases for hydra.lib.maybes primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.maybes primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "apply",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "both just",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.apply"))),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))))})),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.apply"))),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.apply"))),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))))})),
-              Core.applicationArgument = (Core.TermMaybe Nothing)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bind",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just to just",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.bind"))),
-                Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing to nothing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.bind"))),
-                Core.applicationArgument = (Core.TermMaybe Nothing)})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "cases",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just applies function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cases"))),
-                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing returns default",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cases"))),
-                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "cat",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filters nothings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-                (Core.TermMaybe Nothing),
-                (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all justs",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
-                (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all nothings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermMaybe Nothing,
-                (Core.TermMaybe Nothing)])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "compose",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "both succeed",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.compose"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))))})),
-                      Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
-                    Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first fails",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.compose"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))))})),
-                      Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
-                    Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second fails",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.compose"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                          Core.applicationArgument = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermApplication (Core.Application {
-                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
-                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-                        Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))))})),
-                      Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
-                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
-                    Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "fromJust",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "extract from just",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromJust"))),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "fromMaybe",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromMaybe"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing with default",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromMaybe"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-              Core.applicationArgument = (Core.TermMaybe Nothing)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "isJust",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isJust"))),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isJust"))),
-              Core.applicationArgument = (Core.TermMaybe Nothing)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "isNothing",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isNothing"))),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isNothing"))),
-              Core.applicationArgument = (Core.TermMaybe Nothing)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "map",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "maps just value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermMaybe Nothing)})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "mapMaybe",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "filter and transform",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.mapMaybe"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
-                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
-                    Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty result",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.mapMaybe"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
-                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
-                    Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty input",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.mapMaybe"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
-                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
-                    Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "maybe",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just value applies function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing returns default",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermMaybe Nothing)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "pure",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "wraps integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.pure"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "wraps string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.pure"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.maybes primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "apply",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "both just",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.apply"))),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))))})),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.apply"))),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.apply"))),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))))})),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "bind",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just to just",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.bind"))),
+                    Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing to nothing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.bind"))),
+                    Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "cases",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just applies function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cases"))),
+                      Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing returns default",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cases"))),
+                      Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "cat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filters nothings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                    (Core.TermMaybe Nothing),
+                    (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all justs",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))),
+                    (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all nothings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermMaybe Nothing,
+                    (Core.TermMaybe Nothing)])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.cat"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "compose",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "both succeed",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.compose"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+                            Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))))})),
+                          Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+                          Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
+                        Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first fails",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.compose"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+                            Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))))})),
+                          Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+                          Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
+                        Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second fails",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.compose"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                              Core.applicationArgument = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.lte"))),
+                                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+                            Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))))})),
+                          Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gte"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))})),
+                          Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
+                        Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "fromJust",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "extract from just",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromJust"))),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "fromMaybe",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromMaybe"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing with default",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.fromMaybe"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "isJust",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isJust"))),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isJust"))),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "isNothing",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isNothing"))),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.isNothing"))),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "map",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "maps just value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "mapMaybe",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "filter and transform",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.mapMaybe"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
+                          Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
+                        Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty result",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.mapMaybe"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
+                          Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
+                        Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty input",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.mapMaybe"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.logic.ifElse"))),
+                            Core.applicationArgument = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermApplication (Core.Application {
+                                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.equality.gt"))),
+                                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})),
+                          Core.applicationArgument = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                            Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))))})),
+                        Core.applicationArgument = (Core.TermMaybe Nothing)}))})))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "maybe",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just value applies function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing returns default",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.maybe"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 99)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "pure",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "wraps integer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.pure"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "wraps string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.pure"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "toList",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.toList"))),
+                  Core.applicationArgument = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.maybes.toList"))),
+                  Core.applicationArgument = (Core.TermMaybe Nothing)})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Pairs.hs b/src/gen-test/haskell/Hydra/Test/Lib/Pairs.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Pairs.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Pairs.hs
@@ -15,135 +15,136 @@
 
 -- | Test cases for hydra.lib.pairs primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.pairs primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "bimap",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "transform both elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)), (Core.TermLiteral (Core.LiteralString "ab"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
-                  Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "s"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)), (Core.TermLiteral (Core.LiteralString "hello"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "first",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "extract first element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)), (Core.TermLiteral (Core.LiteralString "world"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative number",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))), (Core.TermLiteral (Core.LiteralString "test"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "second",
+      Testing.testGroupName = "hydra.lib.pairs primitives",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "extract second element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)), (Core.TermLiteral (Core.LiteralString ""))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "long string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
-              Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)), (Core.TermLiteral (Core.LiteralString "testing"))))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "testing"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "bimap",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "transform both elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)), (Core.TermLiteral (Core.LiteralString "ab"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.bimap"))),
+                      Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "s"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "s"))}))})))})),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)), (Core.TermLiteral (Core.LiteralString "hello"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "first",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "extract first element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)), (Core.TermLiteral (Core.LiteralString "world"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative number",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.first"))),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))), (Core.TermLiteral (Core.LiteralString "test"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "second",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "extract second element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)), (Core.TermLiteral (Core.LiteralString "hello"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)), (Core.TermLiteral (Core.LiteralString ""))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "long string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.pairs.second"))),
+                  Core.applicationArgument = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 123)), (Core.TermLiteral (Core.LiteralString "testing"))))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "testing"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Regex.hs b/src/gen-test/haskell/Hydra/Test/Lib/Regex.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Regex.hs
@@ -0,0 +1,521 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Test cases for hydra.lib.regex primitives
+
+module Hydra.Test.Lib.Regex where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Test cases for hydra.lib.regex primitives
+allTests :: Testing.TestGroup
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.regex primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "matches",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "exact match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "pattern match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[a-z]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partial content does not match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[a-z]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello123"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "digit pattern",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "12345"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed pattern",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[a-z]+[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello123"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty pattern matches empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty pattern does not match non-empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "star matches empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a*"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "alternation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "cat|dog"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "cat"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "alternation second",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "cat|dog"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "dog"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "alternation no match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "cat|dog"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bird"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "quantifier",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ab?c"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ac"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "quantifier with optional",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.matches"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ab?c"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "find",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple find",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.find"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc123def"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "123"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.find"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abcdef"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "find first",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.find"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[a-z]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "123abc456def"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "abc"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty input",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.find"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "full match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.find"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ".*"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "findAll",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple matches",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.findAll"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a1b2c3"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "1"),
+                  (Core.TermLiteral (Core.LiteralString "2")),
+                  (Core.TermLiteral (Core.LiteralString "3"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no matches",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.findAll"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "overlapping words",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.findAll"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[a-z]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc def ghi"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "abc"),
+                  (Core.TermLiteral (Core.LiteralString "def")),
+                  (Core.TermLiteral (Core.LiteralString "ghi"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.findAll"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "say hello world"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "replace",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic replace",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.replace"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "X"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc123def456"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abcXdef456"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.replace"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "X"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abcdef"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abcdef"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "replace at start",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.replace"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "^[a-z]+"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "X"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc123"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "X123"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty replacement",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.replace"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc123def"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abcdef"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "replaceAll",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "replace all digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.replaceAll"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "X"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a1b2c3"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "aXbXcX"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.replaceAll"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "X"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abc"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "replace all words",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.replaceAll"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[a-z]+"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "X"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc 123 def"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "X 123 X"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty replacement",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.replaceAll"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a1b2c3"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abc"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "split",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "split on comma",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.split"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a,b,c"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "split on spaces",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.split"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " +"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a b  c"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no match",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.split"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "abc")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "split on digits",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.split"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "[0-9]+"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a1b2c"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "trailing delimiter",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.regex.split"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a,b,"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString ""))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Sets.hs b/src/gen-test/haskell/Hydra/Test/Lib/Sets.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Sets.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Sets.hs
@@ -15,644 +15,645 @@
 
 -- | Test cases for hydra.lib.sets primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.sets primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "empty",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty"))),
-            Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "singleton",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.singleton"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "fromList",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "create from list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "duplicates removed",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "toList",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "convert to list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.toList"))),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unsorted input",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.toList"))),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.toList"))),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "insert",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "insert new element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "insert existing element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "insert into empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "delete",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "delete existing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.delete"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "delete non-existing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.delete"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "delete from empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.delete"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "member",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "element exists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "element missing",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "size",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "three elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.size"))),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.size"))),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.size"))),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "null",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.null"))),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "non-empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.null"))),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "union",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "union two sets",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.union"))),
-                Core.applicationArgument = (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "union with empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.union"))),
-                Core.applicationArgument = (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty with non-empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.union"))),
-                Core.applicationArgument = (Core.TermSet S.empty)})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "unions",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "union of multiple sets",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.unions"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])),
-                (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "union with empty sets",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.unions"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-                (Core.TermSet S.empty),
-                (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))]))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list of sets",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.unions"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.unions"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])])})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "intersection",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "common elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.intersection"))),
-                Core.applicationArgument = (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "no common elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.intersection"))),
-                Core.applicationArgument = (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "intersection with empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.intersection"))),
-                Core.applicationArgument = (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "difference",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "remove elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.difference"))),
-                Core.applicationArgument = (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "no overlap",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.difference"))),
-                Core.applicationArgument = (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "difference with empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.difference"))),
-                Core.applicationArgument = (Core.TermSet (S.fromList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "map",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermSet (S.fromList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map on empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
-                Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
-              Core.applicationArgument = (Core.TermSet S.empty)})),
-            Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.sets primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "empty",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty"))),
+                Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "singleton",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.singleton"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "fromList",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "create from list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "duplicates removed",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.fromList"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "toList",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "convert to list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.toList"))),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unsorted input",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.toList"))),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.toList"))),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "insert",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "insert new element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "insert existing element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "insert into empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.insert"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "delete",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "delete existing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.delete"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "delete non-existing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.delete"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "delete from empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.delete"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "member",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "element exists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "element missing",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.member"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "size",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "three elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.size"))),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.size"))),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.size"))),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "null",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.null"))),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "non-empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.null"))),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "union",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "union two sets",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.union"))),
+                    Core.applicationArgument = (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "union with empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.union"))),
+                    Core.applicationArgument = (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty with non-empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.union"))),
+                    Core.applicationArgument = (Core.TermSet S.empty)})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "unions",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "union of multiple sets",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.unions"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                    (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])),
+                    (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "union with empty sets",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.unions"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                    (Core.TermSet S.empty),
+                    (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))]))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list of sets",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.unions"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.unions"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])])})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "intersection",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "common elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.intersection"))),
+                    Core.applicationArgument = (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no common elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.intersection"))),
+                    Core.applicationArgument = (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "intersection with empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.intersection"))),
+                    Core.applicationArgument = (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "difference",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "remove elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.difference"))),
+                    Core.applicationArgument = (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no overlap",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.difference"))),
+                    Core.applicationArgument = (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "difference with empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.difference"))),
+                    Core.applicationArgument = (Core.TermSet (S.fromList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "map",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "map function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermSet (S.fromList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]))})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "map on empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.map"))),
+                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}))})))})),
+                  Core.applicationArgument = (Core.TermSet S.empty)})),
+                Testing.evaluationTestCaseOutput = (Core.TermSet S.empty)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Lib/Strings.hs b/src/gen-test/haskell/Hydra/Test/Lib/Strings.hs
--- a/src/gen-test/haskell/Hydra/Test/Lib/Strings.hs
+++ b/src/gen-test/haskell/Hydra/Test/Lib/Strings.hs
@@ -15,1360 +15,1361 @@
 
 -- | Test cases for hydra.lib.strings primitives
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "hydra.lib.strings primitives",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "cat",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "basic concatenation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "one"),
-                (Core.TermLiteral (Core.LiteralString "two")),
-                (Core.TermLiteral (Core.LiteralString "three"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "onetwothree"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello")])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with empty strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString ""),
-                (Core.TermLiteral (Core.LiteralString "one")),
-                (Core.TermLiteral (Core.LiteralString "")),
-                (Core.TermLiteral (Core.LiteralString ""))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "one"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all empty strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString ""),
-                (Core.TermLiteral (Core.LiteralString "")),
-                (Core.TermLiteral (Core.LiteralString "")),
-                (Core.TermLiteral (Core.LiteralString ""))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "\241"),
-                (Core.TermLiteral (Core.LiteralString "\19990")),
-                (Core.TermLiteral (Core.LiteralString "\127757"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241\19990\127757"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "combining characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "e"),
-                (Core.TermLiteral (Core.LiteralString "\769"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "e\769"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "control characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "\n"),
-                (Core.TermLiteral (Core.LiteralString "\t")),
-                (Core.TermLiteral (Core.LiteralString "\r"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "null character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello"),
-                (Core.TermLiteral (Core.LiteralString "\NUL")),
-                (Core.TermLiteral (Core.LiteralString "world"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\NULworld"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "cat2",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "basic concatenation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "helloworld"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty first string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "world"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty second string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "both empty strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\19990"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241\19990"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "special characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\t"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "null characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello\NUL"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\NULworld"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "charAt",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "first character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "middle character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "last character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 111)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single character string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 241)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multi-byte unicode",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\19990"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 19990)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "second of combining pair",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "e\769"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 769)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "fromList",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "basic ascii string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 101))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 111)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty code point list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "a"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 241)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 19990))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 127757)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241\19990\127757"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "combining character sequence",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 101)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 769)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "e\769"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "special characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 13)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "null character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 105)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "h\NULi"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "intercalate",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "comma separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "one"),
-                (Core.TermLiteral (Core.LiteralString "two")),
-                (Core.TermLiteral (Core.LiteralString "three"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "one,two,three"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b")),
-                (Core.TermLiteral (Core.LiteralString "c"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abc"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multi-character separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " | "))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "A"),
-                (Core.TermLiteral (Core.LiteralString "B")),
-                (Core.TermLiteral (Core.LiteralString "C"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "A | B | C"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single item list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "only")])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "only"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty strings in list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString ""),
-                (Core.TermLiteral (Core.LiteralString "a")),
-                (Core.TermLiteral (Core.LiteralString ""))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ",a,"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\127757"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "link1"),
-                (Core.TermLiteral (Core.LiteralString "link2"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "link1\127757link2"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "newline separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "line1"),
-                (Core.TermLiteral (Core.LiteralString "line2"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "line1\nline2"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "length",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "basic word",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241\19990\127757"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "combining character sequence",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "e\769"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "special characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lines",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single line",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello world"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hello world")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two lines",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello\nworld"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hello"),
-              (Core.TermLiteral (Core.LiteralString "world"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "three lines",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "one\ntwo\nthree"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "one"),
-              (Core.TermLiteral (Core.LiteralString "two")),
-              (Core.TermLiteral (Core.LiteralString "three"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just newline",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "trailing newline",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello\n"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hello")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "leading newline",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\nhello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString ""),
-              (Core.TermLiteral (Core.LiteralString "hello"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple consecutive newlines",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a\n\nb"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "")),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode content",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241\n\19990"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "\241"),
-              (Core.TermLiteral (Core.LiteralString "\19990"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "tabs not split",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a\tb\nc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a\tb"),
-              (Core.TermLiteral (Core.LiteralString "c"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "null",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "space",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " "))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode space",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\160"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "newline",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "null character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\NUL"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multi-character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "splitOn",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "basic separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ss"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Mississippi"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "Mi"),
-              (Core.TermLiteral (Core.LiteralString "i")),
-              (Core.TermLiteral (Core.LiteralString "ippi"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single char separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " "))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "one two three"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "one"),
-              (Core.TermLiteral (Core.LiteralString "two")),
-              (Core.TermLiteral (Core.LiteralString "three"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multi-char separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "  "))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a  b  c"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b")),
-              (Core.TermLiteral (Core.LiteralString "c"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "separator not found",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hello")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "separator at start",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "h"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString ""),
-              (Core.TermLiteral (Core.LiteralString "ello"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "separator at end",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "o"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hell"),
-              (Core.TermLiteral (Core.LiteralString ""))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "leading and trailing separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " "))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " one two "))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString ""),
-              (Core.TermLiteral (Core.LiteralString "one")),
-              (Core.TermLiteral (Core.LiteralString "two")),
-              (Core.TermLiteral (Core.LiteralString ""))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "whole string as separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Mississippi"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Mississippi"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString ""),
-              (Core.TermLiteral (Core.LiteralString ""))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "consecutive separators",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " "))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a  b"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "")),
-              (Core.TermLiteral (Core.LiteralString "b"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple occurrences",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "l"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "he"),
-              (Core.TermLiteral (Core.LiteralString "")),
-              (Core.TermLiteral (Core.LiteralString "o"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "overlapping pattern",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "aa"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "aaa"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString ""),
-              (Core.TermLiteral (Core.LiteralString "a"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString ""),
-              (Core.TermLiteral (Core.LiteralString "a")),
-              (Core.TermLiteral (Core.LiteralString "b")),
-              (Core.TermLiteral (Core.LiteralString "c"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "separator on empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "both empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single char both",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString ""),
-              (Core.TermLiteral (Core.LiteralString ""))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\19990"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello\19990world"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "hello"),
-              (Core.TermLiteral (Core.LiteralString "world"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode content",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241,\19990,\127757"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "\241"),
-              (Core.TermLiteral (Core.LiteralString "\19990")),
-              (Core.TermLiteral (Core.LiteralString "\127757"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "newline separator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "line1\nline2\nline3"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "line1"),
-              (Core.TermLiteral (Core.LiteralString "line2")),
-              (Core.TermLiteral (Core.LiteralString "line3"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "toList",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "basic word",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 101))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 111)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241\19990\127757"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 241)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 19990))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 127757)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "combining character sequence",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "e\769"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 101)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 769)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "control characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 13)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "null character",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "h\NULi"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 105)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "toLower",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed case",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Hello World"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello world"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all uppercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all lowercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with numbers and punctuation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Abc123, XYZ!"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abc123, xyz!"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "control characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode accented chars",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\209\193\201\205\211\218"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241\225\233\237\243\250"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "toUpper",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed case",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello World"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO WORLD"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all lowercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all uppercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with numbers and punctuation",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc123, xyz!"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "ABC123, XYZ!"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "control characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode accented chars",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241\225\233\237\243\250"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\209\193\201\205\211\218"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "unlines",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple lines",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "one"),
-                (Core.TermLiteral (Core.LiteralString "two")),
-                (Core.TermLiteral (Core.LiteralString "three"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "one\ntwo\nthree\n"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single line",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello")])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\n"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "with empty lines",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "hello"),
-                (Core.TermLiteral (Core.LiteralString "")),
-                (Core.TermLiteral (Core.LiteralString "world"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\n\nworld\n"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "all empty lines",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString ""),
-                (Core.TermLiteral (Core.LiteralString "")),
-                (Core.TermLiteral (Core.LiteralString ""))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\n\n"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unicode content",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "\241o\241o"),
-                (Core.TermLiteral (Core.LiteralString "\19990\30028"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241o\241o\n\19990\30028\n"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "hydra.lib.strings primitives",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "cat",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic concatenation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "one"),
+                    (Core.TermLiteral (Core.LiteralString "two")),
+                    (Core.TermLiteral (Core.LiteralString "three"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "onetwothree"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello")])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with empty strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString ""),
+                    (Core.TermLiteral (Core.LiteralString "one")),
+                    (Core.TermLiteral (Core.LiteralString "")),
+                    (Core.TermLiteral (Core.LiteralString ""))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "one"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all empty strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString ""),
+                    (Core.TermLiteral (Core.LiteralString "")),
+                    (Core.TermLiteral (Core.LiteralString "")),
+                    (Core.TermLiteral (Core.LiteralString ""))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "\241"),
+                    (Core.TermLiteral (Core.LiteralString "\19990")),
+                    (Core.TermLiteral (Core.LiteralString "\127757"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241\19990\127757"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "combining characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "e"),
+                    (Core.TermLiteral (Core.LiteralString "\769"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "e\769"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "control characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "\n"),
+                    (Core.TermLiteral (Core.LiteralString "\t")),
+                    (Core.TermLiteral (Core.LiteralString "\r"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "null character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello"),
+                    (Core.TermLiteral (Core.LiteralString "\NUL")),
+                    (Core.TermLiteral (Core.LiteralString "world"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\NULworld"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "cat2",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic concatenation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "helloworld"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty first string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "world"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty second string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "both empty strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\19990"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241\19990"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "special characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\t"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "null characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello\NUL"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\NULworld"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "charAt",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "first character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "middle character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "last character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 111)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single character string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 241)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multi-byte unicode",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\19990"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 19990)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "second of combining pair",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.charAt"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "e\769"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 769)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "fromList",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic ascii string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 101))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 111)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty code point list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "a"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 241)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 19990))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 127757)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241\19990\127757"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "combining character sequence",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 101)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 769)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "e\769"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "special characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 13)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "null character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.fromList"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 105)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "h\NULi"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "intercalate",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "comma separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "one"),
+                    (Core.TermLiteral (Core.LiteralString "two")),
+                    (Core.TermLiteral (Core.LiteralString "three"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "one,two,three"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b")),
+                    (Core.TermLiteral (Core.LiteralString "c"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abc"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multi-character separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " | "))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "A"),
+                    (Core.TermLiteral (Core.LiteralString "B")),
+                    (Core.TermLiteral (Core.LiteralString "C"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "A | B | C"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single item list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "only")])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "only"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty strings in list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString ""),
+                    (Core.TermLiteral (Core.LiteralString "a")),
+                    (Core.TermLiteral (Core.LiteralString ""))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ",a,"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\127757"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "link1"),
+                    (Core.TermLiteral (Core.LiteralString "link2"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "link1\127757link2"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "newline separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.intercalate"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "line1"),
+                    (Core.TermLiteral (Core.LiteralString "line2"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "line1\nline2"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "length",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic word",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241\19990\127757"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "combining character sequence",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "e\769"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "special characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lines",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single line",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello world"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello world")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two lines",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello\nworld"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello"),
+                  (Core.TermLiteral (Core.LiteralString "world"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "three lines",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "one\ntwo\nthree"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "one"),
+                  (Core.TermLiteral (Core.LiteralString "two")),
+                  (Core.TermLiteral (Core.LiteralString "three"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just newline",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "trailing newline",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello\n"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "leading newline",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\nhello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString ""),
+                  (Core.TermLiteral (Core.LiteralString "hello"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple consecutive newlines",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a\n\nb"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "")),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode content",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241\n\19990"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "\241"),
+                  (Core.TermLiteral (Core.LiteralString "\19990"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "tabs not split",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.lines"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a\tb\nc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a\tb"),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "null",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "space",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " "))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode space",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\160"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "newline",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "null character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\NUL"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multi-character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.null"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "splitOn",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "ss"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Mississippi"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "Mi"),
+                  (Core.TermLiteral (Core.LiteralString "i")),
+                  (Core.TermLiteral (Core.LiteralString "ippi"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single char separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " "))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "one two three"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "one"),
+                  (Core.TermLiteral (Core.LiteralString "two")),
+                  (Core.TermLiteral (Core.LiteralString "three"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multi-char separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "  "))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a  b  c"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "separator not found",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "separator at start",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "h"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString ""),
+                  (Core.TermLiteral (Core.LiteralString "ello"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "separator at end",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "o"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hell"),
+                  (Core.TermLiteral (Core.LiteralString ""))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "leading and trailing separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " "))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " one two "))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString ""),
+                  (Core.TermLiteral (Core.LiteralString "one")),
+                  (Core.TermLiteral (Core.LiteralString "two")),
+                  (Core.TermLiteral (Core.LiteralString ""))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "whole string as separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Mississippi"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Mississippi"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString ""),
+                  (Core.TermLiteral (Core.LiteralString ""))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "consecutive separators",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString " "))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a  b"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "")),
+                  (Core.TermLiteral (Core.LiteralString "b"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple occurrences",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "l"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "he"),
+                  (Core.TermLiteral (Core.LiteralString "")),
+                  (Core.TermLiteral (Core.LiteralString "o"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "overlapping pattern",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "aa"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "aaa"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString ""),
+                  (Core.TermLiteral (Core.LiteralString "a"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString ""),
+                  (Core.TermLiteral (Core.LiteralString "a")),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "separator on empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "x"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "both empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single char both",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString ""),
+                  (Core.TermLiteral (Core.LiteralString ""))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\19990"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello\19990world"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "hello"),
+                  (Core.TermLiteral (Core.LiteralString "world"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode content",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241,\19990,\127757"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "\241"),
+                  (Core.TermLiteral (Core.LiteralString "\19990")),
+                  (Core.TermLiteral (Core.LiteralString "\127757"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "newline separator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "line1\nline2\nline3"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "line1"),
+                  (Core.TermLiteral (Core.LiteralString "line2")),
+                  (Core.TermLiteral (Core.LiteralString "line3"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "toList",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 97))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "basic word",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 101))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 108))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 111)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241\19990\127757"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 241)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 19990))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 127757)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "combining character sequence",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "e\769"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 101)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 769)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "control characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 9))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 13)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "null character",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toList"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "h\NULi"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 104)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 105)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "toLower",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed case",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Hello World"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello world"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all uppercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all lowercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with numbers and punctuation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Abc123, XYZ!"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "abc123, xyz!"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "control characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode accented chars",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\209\193\201\205\211\218"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241\225\233\237\243\250"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "toUpper",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed case",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello World"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO WORLD"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all lowercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all uppercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with numbers and punctuation",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "abc123, xyz!"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "ABC123, XYZ!"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "control characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\t\r"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode accented chars",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "\241\225\233\237\243\250"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\209\193\201\205\211\218"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "unlines",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple lines",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "one"),
+                    (Core.TermLiteral (Core.LiteralString "two")),
+                    (Core.TermLiteral (Core.LiteralString "three"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "one\ntwo\nthree\n"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single line",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello")])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\n"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "with empty lines",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "hello"),
+                    (Core.TermLiteral (Core.LiteralString "")),
+                    (Core.TermLiteral (Core.LiteralString "world"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\n\nworld\n"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "all empty lines",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString ""),
+                    (Core.TermLiteral (Core.LiteralString "")),
+                    (Core.TermLiteral (Core.LiteralString ""))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\n\n\n"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unicode content",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.unlines"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "\241o\241o"),
+                    (Core.TermLiteral (Core.LiteralString "\19990\30028"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "\241o\241o\n\19990\30028\n"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Monads.hs b/src/gen-test/haskell/Hydra/Test/Monads.hs
deleted file mode 100644
--- a/src/gen-test/haskell/Hydra/Test/Monads.hs
+++ /dev/null
@@ -1,429 +0,0 @@
--- Note: this is an automatically generated file. Do not edit.
-
--- | Test cases for hydra.monads functions
-
-module Hydra.Test.Monads where
-
-import qualified Hydra.Core as Core
-import qualified Hydra.Testing as Testing
-import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
-import qualified Data.ByteString as B
-import qualified Data.Int as I
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Set as S
-
--- | Test cases for hydra.monads functions
-allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "monads",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "pure",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "integer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "hello"))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "map",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map negate",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.map")),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.negate")))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-5))))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "map absolute",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.map")),
-                      Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.abs")))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-3))))}))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "bind",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bind add",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "n"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bind multiply",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.bind")),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))}))})),
-                    Core.applicationArgument = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "n"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.pure")),
-                        Core.applicationArgument = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermApplication (Core.Application {
-                            Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                            Core.applicationArgument = (Core.TermVariable (Core.Name "n"))})),
-                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))}))}))})))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "error traces",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "Error traces are in the right order",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationWrap (Core.Name "hydra.compute.Flow")))),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.withTrace")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "one"))})),
-                    Core.applicationArgument = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.withTrace")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "two"))})),
-                      Core.applicationArgument = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "hydra.monads.fail")),
-                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "oops"))}))}))}))})),
-                Core.applicationArgument = Core.TermUnit})),
-              Core.applicationArgument = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "stack"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "messages"),
-                    Core.fieldTerm = (Core.TermList [])},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "other"),
-                    Core.fieldTerm = (Core.TermMap M.empty)}]}))})),
-            Testing.evaluationTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "hydra.compute.FlowState"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "value"),
-                  Core.fieldTerm = (Core.TermMaybe Nothing)},
-                Core.Field {
-                  Core.fieldName = (Core.Name "state"),
-                  Core.fieldTerm = Core.TermUnit},
-                Core.Field {
-                  Core.fieldName = (Core.Name "trace"),
-                  Core.fieldTerm = (Core.TermRecord (Core.Record {
-                    Core.recordTypeName = (Core.Name "hydra.compute.Trace"),
-                    Core.recordFields = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "stack"),
-                        Core.fieldTerm = (Core.TermList [])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "messages"),
-                        Core.fieldTerm = (Core.TermList [
-                          Core.TermLiteral (Core.LiteralString "Error: oops (one > two)")])},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "other"),
-                        Core.fieldTerm = (Core.TermMap M.empty)}]}))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = [
-            Testing.Tag "disabledForPython"]}]}],
-  Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Reduction.hs b/src/gen-test/haskell/Hydra/Test/Reduction.hs
--- a/src/gen-test/haskell/Hydra/Test/Reduction.hs
+++ b/src/gen-test/haskell/Hydra/Test/Reduction.hs
@@ -15,829 +15,830 @@
 
 -- | Test cases for term reduction mechanics
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "reduction",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "beta reduction",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "identity function applied to literal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "constant function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested application",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "monomorphic primitives",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "toUpper on lowercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "toUpper on mixed case",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Hello World"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO WORLD"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "toUpper on empty string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "toLower on uppercase",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string length",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string length of empty",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "add two positive integers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "add negative and positive",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-7))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "add with zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "subtract integers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiply integers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiply by zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "divide integers",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "modulo",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 17)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "splitOn basic",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a,b,c"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b")),
-              (Core.TermLiteral (Core.LiteralString "c"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cat2 strings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "helloworld"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "polymorphic primitives",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "length of integer list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "length of string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "a"),
-                (Core.TermLiteral (Core.LiteralString "b"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "length of empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "length of single element list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralBoolean True)])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "head of integer list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "head of string list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralString "first"),
-                (Core.TermLiteral (Core.LiteralString "second"))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "first"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "last of integer list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "concat two integer lists",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "concat with empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
-                Core.applicationArgument = (Core.TermList [])})),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "reverse integer list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "reverse empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
-              Core.applicationArgument = (Core.TermList [])})),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "nullary primitives",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set has size zero",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.size"))),
-              Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty")))})),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "literals as values",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "integer literal is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative integer literal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17)))),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero integer literal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string literal is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralString "hello")),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty string literal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralString "")),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string with special characters",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralString "hello\nworld\ttab")),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\nworld\ttab"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "boolean true is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean True)),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "boolean false is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean False)),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "float literal is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14))),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "negative float literal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.718)))),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.718))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "zero float literal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0))),
-            Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "list reduction",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermList []),
-            Testing.evaluationTestCaseOutput = (Core.TermList [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list of literals is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list with reducible element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermList [
-              Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})]),
-            Testing.evaluationTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "optional reduction",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nothing is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermMaybe Nothing),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just literal is a value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "just with reducible content",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
-            Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
-            Testing.evaluationTestCaseInput = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))),
-            Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "alpha conversion",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable at top level",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
-            Testing.alphaConversionTestCaseTerm = (Core.TermVariable (Core.Name "x")),
-            Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
-            Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
-            Testing.alphaConversionTestCaseResult = (Core.TermVariable (Core.Name "y"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable in list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
-            Testing.alphaConversionTestCaseTerm = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-              (Core.TermVariable (Core.Name "x"))]),
-            Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
-            Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
-            Testing.alphaConversionTestCaseResult = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-              (Core.TermVariable (Core.Name "y"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda with different variable is transparent",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
-            Testing.alphaConversionTestCaseTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "z"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-                (Core.TermVariable (Core.Name "x")),
-                (Core.TermVariable (Core.Name "z"))])}))),
-            Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
-            Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
-            Testing.alphaConversionTestCaseResult = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "z"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-                (Core.TermVariable (Core.Name "y")),
-                (Core.TermVariable (Core.Name "z"))])})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda with same variable is opaque",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
-            Testing.alphaConversionTestCaseTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-                (Core.TermVariable (Core.Name "x")),
-                (Core.TermVariable (Core.Name "z"))])}))),
-            Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
-            Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
-            Testing.alphaConversionTestCaseResult = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-                (Core.TermVariable (Core.Name "x")),
-                (Core.TermVariable (Core.Name "z"))])})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested lambda outer variable",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
-            Testing.alphaConversionTestCaseTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "a"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "b"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-            Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
-            Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
-            Testing.alphaConversionTestCaseResult = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "a"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "b"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested lambda shadows outer",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
-            Testing.alphaConversionTestCaseTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-            Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
-            Testing.alphaConversionTestCaseNewVariable = (Core.Name "z"),
-            Testing.alphaConversionTestCaseResult = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "application with variable",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
-            Testing.alphaConversionTestCaseTerm = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-            Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
-            Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
-            Testing.alphaConversionTestCaseResult = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "application with both variables same",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
-            Testing.alphaConversionTestCaseTerm = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-            Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
-            Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
-            Testing.alphaConversionTestCaseResult = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "type reduction",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unit type unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = Core.TypeUnit,
-            Testing.typeReductionTestCaseOutput = Core.TypeUnit})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string type unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.typeReductionTestCaseOutput = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "int32 type unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.typeReductionTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "identity type applied to string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "t"),
-                Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
-                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))}))})),
-              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.typeReductionTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "constant type ignores argument",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "x"),
-                Core.forallTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
-            Testing.typeReductionTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested forall first application",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "x"),
-                Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                  Core.forallTypeParameter = (Core.Name "y"),
-                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "x")),
-                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "y"))}))}))})),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.typeReductionTestCaseOutput = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "y"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "y"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested forall both applications",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
-                  Core.forallTypeParameter = (Core.Name "x"),
-                  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-                    Core.forallTypeParameter = (Core.Name "y"),
-                    Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "x")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "y"))}))}))})),
-                Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.typeReductionTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list type applied",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "a"),
-                Core.forallTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "a")))})),
-              Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.typeReductionTestCaseOutput = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "optional type applied",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
-            Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
-                Core.forallTypeParameter = (Core.Name "a"),
-                Core.forallTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a")))})),
-              Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.typeReductionTestCaseOutput = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "reduction",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "beta reduction",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "identity function applied to literal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "constant function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested application",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "monomorphic primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "toUpper on lowercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "toUpper on mixed case",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "Hello World"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "HELLO WORLD"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "toUpper on empty string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toUpper"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "toLower on uppercase",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "HELLO"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string length",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string length of empty",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.length"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ""))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "add two positive integers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 8)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "add negative and positive",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-10))))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-7))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "add with zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.add"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "subtract integers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.sub"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiply integers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiply by zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mul"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "divide integers",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.div"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "modulo",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.math.mod"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 17)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "splitOn basic",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "a,b,c"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cat2 strings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.cat2"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "hello"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "world"))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "helloworld"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "polymorphic primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "length of integer list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "length of string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "a"),
+                    (Core.TermLiteral (Core.LiteralString "b"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "length of empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "length of single element list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.length"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralBoolean True)])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "head of integer list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "head of string list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.head"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "first"),
+                    (Core.TermLiteral (Core.LiteralString "second"))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "first"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "last of integer list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.last"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "concat two integer lists",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                      (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 4)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "concat with empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.concat2"))),
+                    Core.applicationArgument = (Core.TermList [])})),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "reverse integer list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "reverse empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.lists.reverse"))),
+                  Core.applicationArgument = (Core.TermList [])})),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "nullary primitives",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set has size zero",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.size"))),
+                  Core.applicationArgument = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.sets.empty")))})),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "literals as values",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "integer literal is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative integer literal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17)))),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 (-17))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero integer literal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string literal is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralString "hello")),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty string literal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralString "")),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString ""))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string with special characters",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralString "hello\nworld\ttab")),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralString "hello\nworld\ttab"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "boolean true is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean True)),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean True))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "boolean false is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralBoolean False)),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralBoolean False))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "float literal is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14))),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 3.14)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "negative float literal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.718)))),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 (-2.718))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "zero float literal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0))),
+                Testing.evaluationTestCaseOutput = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat64 0.0)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "list reduction",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermList []),
+                Testing.evaluationTestCaseOutput = (Core.TermList [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list of literals is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list with reducible element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermList [
+                  Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})]),
+                Testing.evaluationTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "optional reduction",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nothing is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermMaybe Nothing),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe Nothing)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just literal is a value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "just with reducible content",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEvaluation (Testing.EvaluationTestCase {
+                Testing.evaluationTestCaseEvaluationStyle = Testing.EvaluationStyleEager,
+                Testing.evaluationTestCaseInput = (Core.TermMaybe (Just (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))),
+                Testing.evaluationTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "alpha conversion",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable at top level",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
+                Testing.alphaConversionTestCaseTerm = (Core.TermVariable (Core.Name "x")),
+                Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
+                Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
+                Testing.alphaConversionTestCaseResult = (Core.TermVariable (Core.Name "y"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable in list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
+                Testing.alphaConversionTestCaseTerm = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                  (Core.TermVariable (Core.Name "x"))]),
+                Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
+                Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
+                Testing.alphaConversionTestCaseResult = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                  (Core.TermVariable (Core.Name "y"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda with different variable is transparent",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
+                Testing.alphaConversionTestCaseTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "z"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                    (Core.TermVariable (Core.Name "x")),
+                    (Core.TermVariable (Core.Name "z"))])}))),
+                Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
+                Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
+                Testing.alphaConversionTestCaseResult = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "z"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                    (Core.TermVariable (Core.Name "y")),
+                    (Core.TermVariable (Core.Name "z"))])})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda with same variable is opaque",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
+                Testing.alphaConversionTestCaseTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                    (Core.TermVariable (Core.Name "x")),
+                    (Core.TermVariable (Core.Name "z"))])}))),
+                Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
+                Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
+                Testing.alphaConversionTestCaseResult = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                    (Core.TermVariable (Core.Name "x")),
+                    (Core.TermVariable (Core.Name "z"))])})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested lambda outer variable",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
+                Testing.alphaConversionTestCaseTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "a"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "b"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
+                Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
+                Testing.alphaConversionTestCaseResult = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "a"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "b"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "y"))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested lambda shadows outer",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
+                Testing.alphaConversionTestCaseTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
+                Testing.alphaConversionTestCaseNewVariable = (Core.Name "z"),
+                Testing.alphaConversionTestCaseResult = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "application with variable",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
+                Testing.alphaConversionTestCaseTerm = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
+                Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
+                Testing.alphaConversionTestCaseResult = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "application with both variables same",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseAlphaConversion (Testing.AlphaConversionTestCase {
+                Testing.alphaConversionTestCaseTerm = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                Testing.alphaConversionTestCaseOldVariable = (Core.Name "x"),
+                Testing.alphaConversionTestCaseNewVariable = (Core.Name "y"),
+                Testing.alphaConversionTestCaseResult = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "type reduction",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unit type unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = Core.TypeUnit,
+                Testing.typeReductionTestCaseOutput = Core.TypeUnit})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string type unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.typeReductionTestCaseOutput = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "int32 type unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.typeReductionTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "identity type applied to string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.Name "t"),
+                    Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t")),
+                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t"))}))})),
+                  Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.typeReductionTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "constant type ignores argument",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.Name "x"),
+                    Core.forallTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeBoolean)})),
+                Testing.typeReductionTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested forall first application",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.Name "x"),
+                    Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                      Core.forallTypeParameter = (Core.Name "y"),
+                      Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "x")),
+                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "y"))}))}))})),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.typeReductionTestCaseOutput = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "y"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "y"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested forall both applications",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+                    Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
+                      Core.forallTypeParameter = (Core.Name "x"),
+                      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+                        Core.forallTypeParameter = (Core.Name "y"),
+                        Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "x")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "y"))}))}))})),
+                    Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.typeReductionTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list type applied",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.Name "a"),
+                    Core.forallTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "a")))})),
+                  Core.applicationTypeArgument = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.typeReductionTestCaseOutput = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "optional type applied",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTypeReduction (Testing.TypeReductionTestCase {
+                Testing.typeReductionTestCaseInput = (Core.TypeApplication (Core.ApplicationType {
+                  Core.applicationTypeFunction = (Core.TypeForall (Core.ForallType {
+                    Core.forallTypeParameter = (Core.Name "a"),
+                    Core.forallTypeBody = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a")))})),
+                  Core.applicationTypeArgument = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.typeReductionTestCaseOutput = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Rewriting.hs b/src/gen-test/haskell/Hydra/Test/Rewriting.hs
--- a/src/gen-test/haskell/Hydra/Test/Rewriting.hs
+++ b/src/gen-test/haskell/Hydra/Test/Rewriting.hs
@@ -16,3958 +16,3959 @@
 
 -- | Test cases for term rewriting operations
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "rewriting",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "freeVariables",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string literal has no free variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
-            Testing.freeVariablesTestCaseInput = (Core.TermLiteral (Core.LiteralString "foo")),
-            Testing.freeVariablesTestCaseOutput = S.empty})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single variable",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
-            Testing.freeVariablesTestCaseInput = (Core.TermVariable (Core.Name "x")),
-            Testing.freeVariablesTestCaseOutput = (S.fromList [
-              Core.Name "x"])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bound variable is not free",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
-            Testing.freeVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-            Testing.freeVariablesTestCaseOutput = S.empty})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unbound variable in lambda body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
-            Testing.freeVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-            Testing.freeVariablesTestCaseOutput = (S.fromList [
-              Core.Name "x"])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed free and bound variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
-            Testing.freeVariablesTestCaseInput = (Core.TermList [
-              Core.TermVariable (Core.Name "x"),
-              (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))]),
-            Testing.freeVariablesTestCaseOutput = (S.fromList [
-              Core.Name "x"])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple free variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
-            Testing.freeVariablesTestCaseInput = (Core.TermList [
-              Core.TermVariable (Core.Name "x"),
-              (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))]),
-            Testing.freeVariablesTestCaseOutput = (S.fromList [
-              Core.Name "x",
-              (Core.Name "y")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "simplifyTerm",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "const application with literal",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSimplifyTerm (Testing.SimplifyTermTestCase {
-            Testing.simplifyTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.simplifyTermTestCaseOutput = (Core.TermLiteral (Core.LiteralString "foo"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "identity application",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSimplifyTerm (Testing.SimplifyTermTestCase {
-            Testing.simplifyTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x"),
-                  (Core.TermVariable (Core.Name "x"))])}))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-            Testing.simplifyTermTestCaseOutput = (Core.TermList [
-              Core.TermVariable (Core.Name "y"),
-              (Core.TermVariable (Core.Name "y"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unused parameter",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSimplifyTerm (Testing.SimplifyTermTestCase {
-            Testing.simplifyTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))}))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-            Testing.simplifyTermTestCaseOutput = (Core.TermLiteral (Core.LiteralString "foo"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested lambda applications",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSimplifyTerm (Testing.SimplifyTermTestCase {
-            Testing.simplifyTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "a"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermLiteral (Core.LiteralString "foo"),
-                      (Core.TermVariable (Core.Name "a"))])}))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
-            Testing.simplifyTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "foo"),
-              (Core.TermVariable (Core.Name "y"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "flattenLetTerms",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "non-let term unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
-            Testing.flattenLetTermsTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Testing.flattenLetTermsTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list term unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
-            Testing.flattenLetTermsTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "foo")]),
-            Testing.flattenLetTermsTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "foo")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sequential lets in body are flattened",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
-            Testing.flattenLetTermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x"),
-                  (Core.TermVariable (Core.Name "y"))])}))})),
-            Testing.flattenLetTermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermVariable (Core.Name "y"))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested binding in let value is flattened",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
-            Testing.flattenLetTermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "x"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                        Core.bindingType = Nothing},
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "y"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermVariable (Core.Name "y"))])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "a"),
-                (Core.TermVariable (Core.Name "b"))])})),
-            Testing.flattenLetTermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b_x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b_y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermVariable (Core.Name "b_x"),
-                    (Core.TermVariable (Core.Name "b_y"))]),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "a"),
-                (Core.TermVariable (Core.Name "b"))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple levels of nesting are flattened",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
-            Testing.flattenLetTermsTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "x"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                        Core.bindingType = Nothing},
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "y"),
-                        Core.bindingTerm = (Core.TermLet (Core.Let {
-                          Core.letBindings = [
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "p"),
-                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
-                              Core.bindingType = Nothing},
-                            Core.Binding {
-                              Core.bindingName = (Core.Name "q"),
-                              Core.bindingTerm = (Core.TermList [
-                                Core.TermVariable (Core.Name "x"),
-                                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
-                              Core.bindingType = Nothing}],
-                          Core.letBody = (Core.TermList [
-                            Core.TermVariable (Core.Name "a"),
-                            (Core.TermVariable (Core.Name "q"))])})),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermVariable (Core.Name "y"))])})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "a"),
-                (Core.TermVariable (Core.Name "b"))])})),
-            Testing.flattenLetTermsTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b_x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b_y_p"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b_y_q"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermVariable (Core.Name "b_x"),
-                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b_y"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermVariable (Core.Name "a"),
-                    (Core.TermVariable (Core.Name "b_y_q"))]),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "b"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermVariable (Core.Name "b_x"),
-                    (Core.TermVariable (Core.Name "b_y"))]),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "a"),
-                (Core.TermVariable (Core.Name "b"))])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "liftLambdaAboveLet",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple let with lambda in body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bare lambda unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bare let unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda with let in body unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let with two nested lambdas",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "z"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "z"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "x"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda inside let body already above let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "z"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))}))),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "z"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let without lambda in body unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple let bindings with lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "z"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "z"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing},
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested lets with lambda at innermost level",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "z"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "z"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "y"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda between two lets",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "z"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "z"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple lambdas between nested lets",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "a"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "b"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermVariable (Core.Name "a"))}))})))})))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "a"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "b"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermVariable (Core.Name "a"))}))}))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple lambdas already above let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "z"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))}))),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "z"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotation above let containing lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-              Core.annotatedTermAnnotation = M.empty})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "x"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.annotatedTermAnnotation = M.empty}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotation above lambda in let body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.annotatedTermAnnotation = M.empty}))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "x"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-                Core.annotatedTermAnnotation = M.empty}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotation between two lambdas",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                  Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "z"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.annotatedTermAnnotation = M.empty}))})))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "z"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                  Core.annotatedTermBody = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "x"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-                  Core.annotatedTermAnnotation = M.empty}))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotation on the body of lambda in let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                  Core.annotatedTermBody = (Core.TermVariable (Core.Name "x")),
-                  Core.annotatedTermAnnotation = M.empty}))})))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                  Core.annotatedTermBody = (Core.TermVariable (Core.Name "x")),
-                  Core.annotatedTermAnnotation = M.empty}))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotation on lambda already above let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "x"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.annotatedTermAnnotation = M.empty})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "x"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
-              Core.annotatedTermAnnotation = M.empty}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let-lambda inside a list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "x"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let-lambda in multiple list elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermList [
-              Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "y"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}),
-              (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "z"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "w"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))}))]),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermList [
-              Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "x"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-              (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "w"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "z"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let-lambda in a let binding value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "x"),
-                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                        Core.bindingType = Nothing}],
-                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))})),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermLet (Core.Let {
-                      Core.letBindings = [
-                        Core.Binding {
-                          Core.bindingName = (Core.Name "x"),
-                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                          Core.bindingType = Nothing}],
-                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let-lambda inside a pair",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermPair (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}), (Core.TermLiteral (Core.LiteralString "test")))),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "x"))}))})), (Core.TermLiteral (Core.LiteralString "test"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let-lambda in both elements of a pair",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermPair (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}), (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "z"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "w"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))})))),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "y"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "x"))}))})), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "w"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "z"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let-lambda inside lambda body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
-            Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "outer"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "x"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "inner"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))}))),
-            Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "outer"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "inner"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermLet (Core.Let {
-                  Core.letBindings = [
-                    Core.Binding {
-                      Core.bindingName = (Core.Name "x"),
-                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                      Core.bindingType = Nothing}],
-                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "deannotateTerm",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unannotated literal unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
-            Testing.deannotateTermTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Testing.deannotateTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unannotated variable unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
-            Testing.deannotateTermTestCaseInput = (Core.TermVariable (Core.Name "x")),
-            Testing.deannotateTermTestCaseOutput = (Core.TermVariable (Core.Name "x"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unannotated lambda unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
-            Testing.deannotateTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-            Testing.deannotateTermTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single annotation stripped",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
-            Testing.deannotateTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-              Core.annotatedTermAnnotation = M.empty})),
-            Testing.deannotateTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested annotations stripped",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
-            Testing.deannotateTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-                Core.annotatedTermAnnotation = M.empty})),
-              Core.annotatedTermAnnotation = M.empty})),
-            Testing.deannotateTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotated lambda stripped",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
-            Testing.deannotateTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.annotatedTermAnnotation = M.empty})),
-            Testing.deannotateTermTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotated application stripped",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
-            Testing.deannotateTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-              Core.annotatedTermAnnotation = M.empty})),
-            Testing.deannotateTermTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "deannotateType",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unannotated primitive type unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
-            Testing.deannotateTypeTestCaseInput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.deannotateTypeTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unannotated string type unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
-            Testing.deannotateTypeTestCaseInput = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.deannotateTypeTestCaseOutput = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unannotated function type unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
-            Testing.deannotateTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.deannotateTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single annotation stripped",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
-            Testing.deannotateTypeTestCaseInput = (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.annotatedTypeAnnotation = M.empty})),
-            Testing.deannotateTypeTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested annotations stripped",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
-            Testing.deannotateTypeTestCaseInput = (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (Core.TypeAnnotated (Core.AnnotatedType {
-                Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.annotatedTypeAnnotation = M.empty})),
-              Core.annotatedTypeAnnotation = M.empty})),
-            Testing.deannotateTypeTestCaseOutput = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotated list type stripped",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
-            Testing.deannotateTypeTestCaseInput = (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.annotatedTypeAnnotation = M.empty})),
-            Testing.deannotateTypeTestCaseOutput = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "annotated function type stripped",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
-            Testing.deannotateTypeTestCaseInput = (Core.TypeAnnotated (Core.AnnotatedType {
-              Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.annotatedTypeAnnotation = M.empty})),
-            Testing.deannotateTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "topologicalSortBindings",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "isolated bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortBindings (Testing.TopologicalSortBindingsTestCase {
-            Testing.topologicalSortBindingsTestCaseBindings = [
-              (Core.Name "a", (Core.TermLiteral (Core.LiteralString "foo"))),
-              (Core.Name "b", (Core.TermLiteral (Core.LiteralString "bar")))],
-            Testing.topologicalSortBindingsTestCaseExpected = [
-              [
-                (Core.Name "a", (Core.TermLiteral (Core.LiteralString "foo")))],
-              [
-                (Core.Name "b", (Core.TermLiteral (Core.LiteralString "bar")))]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single recursive binding",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortBindings (Testing.TopologicalSortBindingsTestCase {
-            Testing.topologicalSortBindingsTestCaseBindings = [
-              (Core.Name "a", (Core.TermList [
-                Core.TermVariable (Core.Name "a")]))],
-            Testing.topologicalSortBindingsTestCaseExpected = [
-              [
-                (Core.Name "a", (Core.TermList [
-                  Core.TermVariable (Core.Name "a")]))]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mutually recursive bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortBindings (Testing.TopologicalSortBindingsTestCase {
-            Testing.topologicalSortBindingsTestCaseBindings = [
-              (Core.Name "a", (Core.TermList [
-                Core.TermVariable (Core.Name "b")])),
-              (Core.Name "b", (Core.TermList [
-                Core.TermVariable (Core.Name "a")]))],
-            Testing.topologicalSortBindingsTestCaseExpected = [
-              [
-                (Core.Name "a", (Core.TermList [
-                  Core.TermVariable (Core.Name "b")])),
-                (Core.Name "b", (Core.TermList [
-                  Core.TermVariable (Core.Name "a")]))]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "mixed bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortBindings (Testing.TopologicalSortBindingsTestCase {
-            Testing.topologicalSortBindingsTestCaseBindings = [
-              (Core.Name "a", (Core.TermVariable (Core.Name "b"))),
-              (Core.Name "b", (Core.TermList [
-                Core.TermVariable (Core.Name "a"),
-                (Core.TermVariable (Core.Name "c"))])),
-              (Core.Name "c", (Core.TermLiteral (Core.LiteralString "foo"))),
-              (Core.Name "d", (Core.TermLiteral (Core.LiteralString "bar")))],
-            Testing.topologicalSortBindingsTestCaseExpected = [
-              [
-                (Core.Name "c", (Core.TermLiteral (Core.LiteralString "foo")))],
-              [
-                (Core.Name "a", (Core.TermVariable (Core.Name "b"))),
-                (Core.Name "b", (Core.TermList [
-                  Core.TermVariable (Core.Name "a"),
-                  (Core.TermVariable (Core.Name "c"))]))],
-              [
-                (Core.Name "d", (Core.TermLiteral (Core.LiteralString "bar")))]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "normalizeTypeVariables",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "literal without type variables unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple let without type annotations unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let with monomorphic type scheme unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let with monomorphic binding referencing string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding with free type variable unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeVariable (Core.Name "a")),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeVariable (Core.Name "a")),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "monomorphic binding with typed lambda unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic binding with typed lambda in body unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeVariable (Core.Name "a")),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [],
-                    Core.typeSchemeType = (Core.TypeVariable (Core.Name "a")),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic identity function normalized",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "polymorphic const function normalized",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "const"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a",
-                      (Core.Name "b")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "const")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "const"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0",
-                      (Core.Name "t1")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "const")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "binding rewriting does not affect body with typed lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
-                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
-                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested polymorphic lets normalized",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "id2"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [
-                        Core.Name "b"],
-                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "id2"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [
-                        Core.Name "t0"],
-                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested same substitution in bindings and environment",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "id2"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [
-                        Core.Name "a"],
-                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "id2"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                    Core.bindingType = (Just (Core.TypeScheme {
-                      Core.typeSchemeVariables = [
-                        Core.Name "t0"],
-                      Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                        Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                      Core.typeSchemeConstraints = Nothing}))}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "parent type variable shadows child variable",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "id2"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "a"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "id2"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t1"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "no shadowing distinct type variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "id2"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "b"))),
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "b"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "id"),
-                  Core.bindingTerm = (Core.TermLet (Core.Let {
-                    Core.letBindings = [
-                      Core.Binding {
-                        Core.bindingName = (Core.Name "id2"),
-                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                          Core.lambdaParameter = (Core.Name "x"),
-                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                        Core.bindingType = (Just (Core.TypeScheme {
-                          Core.typeSchemeVariables = [
-                            Core.Name "t1"],
-                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
-                          Core.typeSchemeConstraints = Nothing}))}],
-                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                      Core.lambdaBody = (Core.TermApplication (Core.Application {
-                        Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
-                        Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0"],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "locally free type variable in nested binding",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
-            Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "fun1"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "b"))),
-                      Core.lambdaBody = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "fun2"),
-                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "z"),
-                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "c"))),
-                              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "z"), (Core.TermVariable (Core.Name "y"))))}))),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [
-                                Core.Name "c"],
-                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
-                                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "c")),
-                                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))}))})),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "fun2")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "a",
-                      (Core.Name "b")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
-                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "fun1")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-            Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "fun1"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
-                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "y"),
-                      Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
-                      Core.lambdaBody = (Core.TermLet (Core.Let {
-                        Core.letBindings = [
-                          Core.Binding {
-                            Core.bindingName = (Core.Name "fun2"),
-                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                              Core.lambdaParameter = (Core.Name "z"),
-                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
-                              Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "z"), (Core.TermVariable (Core.Name "y"))))}))),
-                            Core.bindingType = (Just (Core.TypeScheme {
-                              Core.typeSchemeVariables = [
-                                Core.Name "t2"],
-                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
-                                Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t2")),
-                                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))})),
-                              Core.typeSchemeConstraints = Nothing}))}],
-                        Core.letBody = (Core.TermApplication (Core.Application {
-                          Core.applicationFunction = (Core.TermVariable (Core.Name "fun2")),
-                          Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))),
-                  Core.bindingType = (Just (Core.TypeScheme {
-                    Core.typeSchemeVariables = [
-                      Core.Name "t0",
-                      (Core.Name "t1")],
-                    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
-                      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-                        Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
-                        Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
-                          Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
-                          Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})),
-                    Core.typeSchemeConstraints = Nothing}))}],
-              Core.letBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "fun1")),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "etaExpandTerm",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "integer literal unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Testing.etaExpansionTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string list unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "foo"),
-              (Core.TermLiteral (Core.LiteralString "bar"))]),
-            Testing.etaExpansionTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "foo"),
-              (Core.TermLiteral (Core.LiteralString "bar"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "fully applied binary function unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))})),
-            Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda with fully applied primitive unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-            Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda returning constant unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))),
-            Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bare unary primitive unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-            Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "bare binary primitive unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-            Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "partially applied binary primitive expands to one lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-              Core.applicationArgument = (Core.TermVariable (Core.Name "foo"))})),
-            Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "v1"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "foo"))})),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "projection expands to lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-              Core.projectionTypeName = (Core.Name "Person"),
-              Core.projectionField = (Core.Name "firstName")})))),
-            Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "v1"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-                  Core.projectionTypeName = (Core.Name "Person"),
-                  Core.projectionField = (Core.Name "firstName")})))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "partial application inside lambda expands",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
-            Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "v1"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let with constant body unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let with bare primitive value unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "foo"))})),
-            Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "foo"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "foo"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "fully applied unary unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "FOO"))})),
-            Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "FOO"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "partial application in list expands",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
-            Testing.etaExpansionTestCaseInput = (Core.TermList [
-              Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "foo")])})),
-              (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))]),
-            Testing.etaExpansionTestCaseOutput = (Core.TermList [
-              Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "foo")])})),
-              (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "v1"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermApplication (Core.Application {
-                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
-                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))})),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "foldOverTerm",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "collect labels from single node - pre-order",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList []))),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectLabels,
-            Testing.foldOverTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "collect labels from tree - pre-order",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList [
-              Core.TermPair (Core.TermLiteral (Core.LiteralString "b"), (Core.TermList [])),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralString "c"), (Core.TermList [
-                Core.TermPair (Core.TermLiteral (Core.LiteralString "d"), (Core.TermList []))])))]))),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectLabels,
-            Testing.foldOverTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a"),
-              (Core.TermLiteral (Core.LiteralString "b")),
-              (Core.TermLiteral (Core.LiteralString "c")),
-              (Core.TermLiteral (Core.LiteralString "d"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "collect labels from single node - post-order",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList []))),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPost,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectLabels,
-            Testing.foldOverTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "a")])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "collect labels from tree - post-order",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList [
-              Core.TermPair (Core.TermLiteral (Core.LiteralString "b"), (Core.TermList [])),
-              (Core.TermPair (Core.TermLiteral (Core.LiteralString "c"), (Core.TermList [
-                Core.TermPair (Core.TermLiteral (Core.LiteralString "d"), (Core.TermList []))])))]))),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPost,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectLabels,
-            Testing.foldOverTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "b"),
-              (Core.TermLiteral (Core.LiteralString "d")),
-              (Core.TermLiteral (Core.LiteralString "c")),
-              (Core.TermLiteral (Core.LiteralString "a"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "sum int32 literals",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
-              (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))]),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 52)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "collect list lengths - pre-order",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralString "foo"),
-                (Core.TermLiteral (Core.LiteralString "bar"))],
-              (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "quux")])}))]),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectListLengths,
-            Testing.foldOverTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "collect list lengths - post-order",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralString "foo"),
-                (Core.TermLiteral (Core.LiteralString "bar"))],
-              (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.applicationArgument = (Core.TermList [
-                  Core.TermLiteral (Core.LiteralString "quux")])}))]),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPost,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectListLengths,
-            Testing.foldOverTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "rewriteType",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String type in left side of either is replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String type in right side of either is replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String types in both sides of either are replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String type in nested either (left of left) is replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))})),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String type in nested either (right of right) is replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
-              Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
-              Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String types in complex nested either are all replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
-              Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))})),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-              Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
-                Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String in list type is replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String in function domain is replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))})),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String in function codomain is replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
-              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "String in optional type is replaced",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
-            Testing.rewriteTypeTestCaseInput = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
-            Testing.rewriteTypeTestCaseOutput = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "rewriteTerm",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string literal foo replaced with bar",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermLiteral (Core.LiteralString "foo")),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermLiteral (Core.LiteralString "bar"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in variable not changed",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermVariable (Core.Name "x")),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermVariable (Core.Name "x"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "foo"),
-              (Core.TermLiteral (Core.LiteralString "baz"))]),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "bar"),
-              (Core.TermLiteral (Core.LiteralString "baz"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple strings in list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "foo"),
-              (Core.TermLiteral (Core.LiteralString "foo")),
-              (Core.TermLiteral (Core.LiteralString "baz"))]),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralString "bar"),
-              (Core.TermLiteral (Core.LiteralString "bar")),
-              (Core.TermLiteral (Core.LiteralString "baz"))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in optional (just)",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "foo")))),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "bar"))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in function application",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "print")),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "print")),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in lambda body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))}))),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "bar"))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in nested applications",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in record field",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Person"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "name"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Person"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "name"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "strings in multiple record fields",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Data"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "a"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "b"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "c"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Data"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "a"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "b"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "c"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in pair",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "foo"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "bar"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in let binding value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in let body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in first case branch",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = (Core.Name "Result"),
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "success"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "error"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]})))),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = (Core.Name "Result"),
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "success"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "error"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in second case branch",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = (Core.Name "Result"),
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "success"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "error"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]})))),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = (Core.Name "Result"),
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "success"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "error"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in default branch",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = (Core.Name "Result"),
-              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "foo"))),
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "success"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "error"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]})))),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = (Core.Name "Result"),
-              Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "bar"))),
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "success"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "error"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]}))))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string deeply nested in record in list in application",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "process")),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "Item"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]})])})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "process")),
-              Core.applicationArgument = (Core.TermList [
-                Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "Item"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "value"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]})])}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in union inject value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "Result"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "success"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermUnion (Core.Injection {
-              Core.injectionTypeName = (Core.Name "Result"),
-              Core.injectionField = Core.Field {
-                Core.fieldName = (Core.Name "success"),
-                Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in wrapped term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = (Core.Name "Email"),
-              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = (Core.Name "Email"),
-              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in annotated term body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "foo")),
-              Core.annotatedTermAnnotation = M.empty})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "bar")),
-              Core.annotatedTermAnnotation = M.empty}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in first of multiple let bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "baz")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "baz")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in second of multiple let bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "baz")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "y"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "baz")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "y"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in all let bindings and body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralString "baz"),
-              (Core.TermLiteral (Core.LiteralString "foo"))])),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralString "bar"),
-              (Core.TermLiteral (Core.LiteralString "baz"))]))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in type lambda body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "a"),
-              Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "a"),
-              Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in type application body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermLiteral (Core.LiteralString "foo")),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermLiteral (Core.LiteralString "bar")),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in nested type lambdas",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "a"),
-              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "b"),
-                Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "a"),
-              Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "b"),
-                Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralString "bar"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in case branch within let binding",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "handler"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Result"),
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "ok"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "err"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "handler"))})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "handler"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                    Core.caseStatementTypeName = (Core.Name "Result"),
-                    Core.caseStatementDefault = Nothing,
-                    Core.caseStatementCases = [
-                      Core.Field {
-                        Core.fieldName = (Core.Name "ok"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))},
-                      Core.Field {
-                        Core.fieldName = (Core.Name "err"),
-                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]})))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "handler"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "string in annotated wrapped record field",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
-            Testing.rewriteTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = (Core.Name "User"),
-                Core.wrappedTermBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "UserData"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "name"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]}))})),
-              Core.annotatedTermAnnotation = M.empty})),
-            Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
-            Testing.rewriteTermTestCaseOutput = (Core.TermAnnotated (Core.AnnotatedTerm {
-              Core.annotatedTermBody = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = (Core.Name "User"),
-                Core.wrappedTermBody = (Core.TermRecord (Core.Record {
-                  Core.recordTypeName = (Core.Name "UserData"),
-                  Core.recordFields = [
-                    Core.Field {
-                      Core.fieldName = (Core.Name "name"),
-                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]}))})),
-              Core.annotatedTermAnnotation = M.empty}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "rewriteAndFoldTermWithPath",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through application - sum literals",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through nested applications",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermVariable (Core.Name "y"))])})))}))),
-                Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through let bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 32)))])})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through record fields",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Point"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "x"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "y"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}]})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through case branches",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-              Core.caseStatementTypeName = (Core.Name "Result"),
-              Core.caseStatementDefault = Nothing,
-              Core.caseStatementCases = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "ok"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "err"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]})))),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through pair",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))))),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through optional",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through wrapped term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
-              Core.wrappedTermTypeName = (Core.Name "Age"),
-              Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through type lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
-              Core.typeLambdaParameter = (Core.Name "a"),
-              Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through type application",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-              Core.typeApplicationTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 50))),
-              Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 50)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "path tracking through set elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermSet (S.fromList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "deep nesting - application in lambda in let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "f"),
-                  Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermApplication (Core.Application {
-                      Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
-                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
-            Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "collect list lengths in nested structure",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermList [
-              Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
-              (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])]),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectListLengths,
-            Testing.foldOverTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "collect list lengths in let body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
-            Testing.foldOverTermTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "xs"),
-                  Core.bindingTerm = (Core.TermList [
-                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermList [
-                Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-                (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-            Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
-            Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectListLengths,
-            Testing.foldOverTermTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "unshadowVariables",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "literal unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermVariable (Core.Name "x")),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermVariable (Core.Name "x"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single lambda unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "distinct lambda parameters unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x"),
-                  (Core.TermVariable (Core.Name "y"))])})))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x"),
-                  (Core.TermVariable (Core.Name "y"))])})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let with no shadowing unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let and lambda with distinct names unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x"),
-                  (Core.TermVariable (Core.Name "y"))])})))})),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x"),
-                  (Core.TermVariable (Core.Name "y"))])})))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "inner lambda shadows outer lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x2"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "inner lambda shadows outer - body references both",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))])}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermVariable (Core.Name "x"),
-                (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))])})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "triple nested lambda same name",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x2"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x3"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x3"))})))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two parameters shadow sequentially",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermVariable (Core.Name "y"))])})))})))})))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y2"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x2"),
-                      (Core.TermVariable (Core.Name "y2"))])})))})))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda shadows let-bound variable",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x2"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda shadows one of multiple let bindings",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x"),
-                  (Core.TermVariable (Core.Name "y"))])})))})),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing},
-                Core.Binding {
-                  Core.bindingName = (Core.Name "y"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x2"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermList [
-                  Core.TermVariable (Core.Name "x2"),
-                  (Core.TermVariable (Core.Name "y"))])})))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "inner let body with lambda shadowing outer let",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))})),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda in function position of application",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "f"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "f"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "f"))}))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "f"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermApplication (Core.Application {
-                Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "f2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "f2"))}))),
-                Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambdas in list elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})),
-                (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))])}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermList [
-                Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})),
-                (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))])})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda in record field",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "Pair"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fst"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "snd"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermRecord (Core.Record {
-                Core.recordTypeName = (Core.Name "Pair"),
-                Core.recordFields = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "fst"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x2"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "snd"),
-                    Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda in case branch",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "Maybe"),
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "nothing"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "just"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]}))))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
-                Core.caseStatementTypeName = (Core.Name "Maybe"),
-                Core.caseStatementDefault = Nothing,
-                Core.caseStatementCases = [
-                  Core.Field {
-                    Core.fieldName = (Core.Name "nothing"),
-                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))},
-                  Core.Field {
-                    Core.fieldName = (Core.Name "just"),
-                    Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x2"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}]}))))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda in pair",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})), (Core.TermVariable (Core.Name "x"))))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x2"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})), (Core.TermVariable (Core.Name "x"))))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda inside optional",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermMaybe (Just (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermMaybe (Just (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x2"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda inside set element",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermSet (S.fromList [
-                Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))]))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermSet (S.fromList [
-                Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))}))]))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda in union injection",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "Result"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "ok"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}}))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermUnion (Core.Injection {
-                Core.injectionTypeName = (Core.Name "Result"),
-                Core.injectionField = Core.Field {
-                  Core.fieldName = (Core.Name "ok"),
-                  Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "x2"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda inside wrapped term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = (Core.Name "Age"),
-                Core.wrappedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
-                Core.wrappedTermTypeName = (Core.Name "Age"),
-                Core.wrappedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda inside type lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "a"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
-                Core.typeLambdaParameter = (Core.Name "a"),
-                Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda inside type application",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
-                Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))}))),
-                Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowed lambda inside annotated term",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                Core.annotatedTermAnnotation = M.empty}))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
-                Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))}))),
-                Core.annotatedTermAnnotation = M.empty}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "shadowing at multiple depths",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x"),
-                      (Core.TermVariable (Core.Name "y"))])})))})))})))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "y"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x2"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                    Core.lambdaParameter = (Core.Name "y2"),
-                    Core.lambdaDomain = Nothing,
-                    Core.lambdaBody = (Core.TermList [
-                      Core.TermVariable (Core.Name "x2"),
-                      (Core.TermVariable (Core.Name "y2"))])})))})))})))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "let then lambda then lambda all same name",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
-              Core.letBindings = [
-                Core.Binding {
-                  Core.bindingName = (Core.Name "x"),
-                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
-                  Core.bindingType = Nothing}],
-              Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                Core.lambdaParameter = (Core.Name "x2"),
-                Core.lambdaDomain = Nothing,
-                Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                  Core.lambdaParameter = (Core.Name "x3"),
-                  Core.lambdaDomain = Nothing,
-                  Core.lambdaBody = (Core.TermVariable (Core.Name "x3"))})))})))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "lambda with shadowing in let binding value",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-              Core.lambdaParameter = (Core.Name "x"),
-              Core.lambdaDomain = Nothing,
-              Core.lambdaBody = (Core.TermLet (Core.Let {
-                Core.letBindings = [
-                  Core.Binding {
-                    Core.bindingName = (Core.Name "y"),
-                    Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
-                      Core.lambdaParameter = (Core.Name "x2"),
-                      Core.lambdaDomain = Nothing,
-                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))}))),
-                    Core.bindingType = Nothing}],
-                Core.letBody = (Core.TermApplication (Core.Application {
-                  Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
-                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "application without shadowing unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermApplication (Core.Application {
-              Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
-              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list of literals unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermList [
-              Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
-              (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested record unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
-            Testing.unshadowVariablesTestCaseInput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Point"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "x"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "y"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}]})),
-            Testing.unshadowVariablesTestCaseOutput = (Core.TermRecord (Core.Record {
-              Core.recordTypeName = (Core.Name "Point"),
-              Core.recordFields = [
-                Core.Field {
-                  Core.fieldName = (Core.Name "x"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))},
-                Core.Field {
-                  Core.fieldName = (Core.Name "y"),
-                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}]}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "rewriting",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "freeVariables",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string literal has no free variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
+                Testing.freeVariablesTestCaseInput = (Core.TermLiteral (Core.LiteralString "foo")),
+                Testing.freeVariablesTestCaseOutput = S.empty})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single variable",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
+                Testing.freeVariablesTestCaseInput = (Core.TermVariable (Core.Name "x")),
+                Testing.freeVariablesTestCaseOutput = (S.fromList [
+                  Core.Name "x"])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bound variable is not free",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
+                Testing.freeVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                Testing.freeVariablesTestCaseOutput = S.empty})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unbound variable in lambda body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
+                Testing.freeVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                Testing.freeVariablesTestCaseOutput = (S.fromList [
+                  Core.Name "x"])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed free and bound variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
+                Testing.freeVariablesTestCaseInput = (Core.TermList [
+                  Core.TermVariable (Core.Name "x"),
+                  (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))]),
+                Testing.freeVariablesTestCaseOutput = (S.fromList [
+                  Core.Name "x"])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple free variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFreeVariables (Testing.FreeVariablesTestCase {
+                Testing.freeVariablesTestCaseInput = (Core.TermList [
+                  Core.TermVariable (Core.Name "x"),
+                  (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))]),
+                Testing.freeVariablesTestCaseOutput = (S.fromList [
+                  Core.Name "x",
+                  (Core.Name "y")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "simplifyTerm",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "const application with literal",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSimplifyTerm (Testing.SimplifyTermTestCase {
+                Testing.simplifyTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.simplifyTermTestCaseOutput = (Core.TermLiteral (Core.LiteralString "foo"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "identity application",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSimplifyTerm (Testing.SimplifyTermTestCase {
+                Testing.simplifyTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermVariable (Core.Name "x"))])}))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                Testing.simplifyTermTestCaseOutput = (Core.TermList [
+                  Core.TermVariable (Core.Name "y"),
+                  (Core.TermVariable (Core.Name "y"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unused parameter",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSimplifyTerm (Testing.SimplifyTermTestCase {
+                Testing.simplifyTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))}))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                Testing.simplifyTermTestCaseOutput = (Core.TermLiteral (Core.LiteralString "foo"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested lambda applications",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSimplifyTerm (Testing.SimplifyTermTestCase {
+                Testing.simplifyTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "a"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermLiteral (Core.LiteralString "foo"),
+                          (Core.TermVariable (Core.Name "a"))])}))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "y"))})),
+                Testing.simplifyTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "foo"),
+                  (Core.TermVariable (Core.Name "y"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "flattenLetTerms",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "non-let term unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
+                Testing.flattenLetTermsTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                Testing.flattenLetTermsTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list term unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
+                Testing.flattenLetTermsTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "foo")]),
+                Testing.flattenLetTermsTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "foo")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sequential lets in body are flattened",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
+                Testing.flattenLetTermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermVariable (Core.Name "y"))])}))})),
+                Testing.flattenLetTermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermVariable (Core.Name "y"))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested binding in let value is flattened",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
+                Testing.flattenLetTermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "x"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                            Core.bindingType = Nothing},
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "y"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermVariable (Core.Name "y"))])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "a"),
+                    (Core.TermVariable (Core.Name "b"))])})),
+                Testing.flattenLetTermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b_x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b_y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermVariable (Core.Name "b_x"),
+                        (Core.TermVariable (Core.Name "b_y"))]),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "a"),
+                    (Core.TermVariable (Core.Name "b"))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple levels of nesting are flattened",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFlattenLetTerms (Testing.FlattenLetTermsTestCase {
+                Testing.flattenLetTermsTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "x"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                            Core.bindingType = Nothing},
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "y"),
+                            Core.bindingTerm = (Core.TermLet (Core.Let {
+                              Core.letBindings = [
+                                Core.Binding {
+                                  Core.bindingName = (Core.Name "p"),
+                                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
+                                  Core.bindingType = Nothing},
+                                Core.Binding {
+                                  Core.bindingName = (Core.Name "q"),
+                                  Core.bindingTerm = (Core.TermList [
+                                    Core.TermVariable (Core.Name "x"),
+                                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
+                                  Core.bindingType = Nothing}],
+                              Core.letBody = (Core.TermList [
+                                Core.TermVariable (Core.Name "a"),
+                                (Core.TermVariable (Core.Name "q"))])})),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermVariable (Core.Name "y"))])})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "a"),
+                    (Core.TermVariable (Core.Name "b"))])})),
+                Testing.flattenLetTermsTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b_x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b_y_p"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b_y_q"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermVariable (Core.Name "b_x"),
+                        (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))]),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b_y"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermVariable (Core.Name "a"),
+                        (Core.TermVariable (Core.Name "b_y_q"))]),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "b"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermVariable (Core.Name "b_x"),
+                        (Core.TermVariable (Core.Name "b_y"))]),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "a"),
+                    (Core.TermVariable (Core.Name "b"))])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "liftLambdaAboveLet",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple let with lambda in body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bare lambda unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bare let unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda with let in body unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let with two nested lambdas",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "z"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "z"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "x"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda inside let body already above let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "z"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))}))),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "z"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let without lambda in body unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermPair (Core.TermVariable (Core.Name "x"), (Core.TermVariable (Core.Name "y"))))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple let bindings with lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "z"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "z"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested lets with lambda at innermost level",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "z"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "z"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "y"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda between two lets",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "z"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "z"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "hello")),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple lambdas between nested lets",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "a"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "b"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermVariable (Core.Name "a"))}))})))})))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "a"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "b"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermVariable (Core.Name "a"))}))}))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple lambdas already above let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "z"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))}))),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "z"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotation above let containing lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                  Core.annotatedTermAnnotation = M.empty})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "x"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.annotatedTermAnnotation = M.empty}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotation above lambda in let body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.annotatedTermAnnotation = M.empty}))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "x"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                    Core.annotatedTermAnnotation = M.empty}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotation between two lambdas",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                      Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "z"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.annotatedTermAnnotation = M.empty}))})))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "z"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                      Core.annotatedTermBody = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "x"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                      Core.annotatedTermAnnotation = M.empty}))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotation on the body of lambda in let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                      Core.annotatedTermBody = (Core.TermVariable (Core.Name "x")),
+                      Core.annotatedTermAnnotation = M.empty}))})))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                      Core.annotatedTermBody = (Core.TermVariable (Core.Name "x")),
+                      Core.annotatedTermAnnotation = M.empty}))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotation on lambda already above let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "x"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.annotatedTermAnnotation = M.empty})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "x"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
+                  Core.annotatedTermAnnotation = M.empty}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let-lambda inside a list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))]),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "x"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let-lambda in multiple list elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermList [
+                  Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "y"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}),
+                  (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "z"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "w"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))}))]),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermList [
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "x"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+                  (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "w"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "z"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let-lambda in a let binding value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "x"),
+                            Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                            Core.bindingType = Nothing}],
+                        Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))})),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermLet (Core.Let {
+                          Core.letBindings = [
+                            Core.Binding {
+                              Core.bindingName = (Core.Name "x"),
+                              Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                              Core.bindingType = Nothing}],
+                          Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "f"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let-lambda inside a pair",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermPair (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}), (Core.TermLiteral (Core.LiteralString "test")))),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "x"))}))})), (Core.TermLiteral (Core.LiteralString "test"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let-lambda in both elements of a pair",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermPair (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}), (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "z"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "w"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "z"))})))})))),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "y"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "x"))}))})), (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "w"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "z"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "z"))}))})))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let-lambda inside lambda body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseLiftLambdaAboveLet (Testing.LiftLambdaAboveLetTestCase {
+                Testing.liftLambdaAboveLetTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "outer"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "x"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "inner"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))}))),
+                Testing.liftLambdaAboveLetTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "outer"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "inner"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermLet (Core.Let {
+                      Core.letBindings = [
+                        Core.Binding {
+                          Core.bindingName = (Core.Name "x"),
+                          Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                          Core.bindingType = Nothing}],
+                      Core.letBody = (Core.TermVariable (Core.Name "x"))}))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "deannotateTerm",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unannotated literal unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
+                Testing.deannotateTermTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                Testing.deannotateTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unannotated variable unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
+                Testing.deannotateTermTestCaseInput = (Core.TermVariable (Core.Name "x")),
+                Testing.deannotateTermTestCaseOutput = (Core.TermVariable (Core.Name "x"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unannotated lambda unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
+                Testing.deannotateTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                Testing.deannotateTermTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single annotation stripped",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
+                Testing.deannotateTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                  Core.annotatedTermAnnotation = M.empty})),
+                Testing.deannotateTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested annotations stripped",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
+                Testing.deannotateTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                    Core.annotatedTermAnnotation = M.empty})),
+                  Core.annotatedTermAnnotation = M.empty})),
+                Testing.deannotateTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotated lambda stripped",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
+                Testing.deannotateTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.annotatedTermAnnotation = M.empty})),
+                Testing.deannotateTermTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotated application stripped",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateTerm (Testing.DeannotateTermTestCase {
+                Testing.deannotateTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                  Core.annotatedTermAnnotation = M.empty})),
+                Testing.deannotateTermTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "deannotateType",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unannotated primitive type unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
+                Testing.deannotateTypeTestCaseInput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.deannotateTypeTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unannotated string type unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
+                Testing.deannotateTypeTestCaseInput = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.deannotateTypeTestCaseOutput = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unannotated function type unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
+                Testing.deannotateTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.deannotateTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single annotation stripped",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
+                Testing.deannotateTypeTestCaseInput = (Core.TypeAnnotated (Core.AnnotatedType {
+                  Core.annotatedTypeBody = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.annotatedTypeAnnotation = M.empty})),
+                Testing.deannotateTypeTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested annotations stripped",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
+                Testing.deannotateTypeTestCaseInput = (Core.TypeAnnotated (Core.AnnotatedType {
+                  Core.annotatedTypeBody = (Core.TypeAnnotated (Core.AnnotatedType {
+                    Core.annotatedTypeBody = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.annotatedTypeAnnotation = M.empty})),
+                  Core.annotatedTypeAnnotation = M.empty})),
+                Testing.deannotateTypeTestCaseOutput = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotated list type stripped",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
+                Testing.deannotateTypeTestCaseInput = (Core.TypeAnnotated (Core.AnnotatedType {
+                  Core.annotatedTypeBody = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.annotatedTypeAnnotation = M.empty})),
+                Testing.deannotateTypeTestCaseOutput = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "annotated function type stripped",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseDeannotateType (Testing.DeannotateTypeTestCase {
+                Testing.deannotateTypeTestCaseInput = (Core.TypeAnnotated (Core.AnnotatedType {
+                  Core.annotatedTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.annotatedTypeAnnotation = M.empty})),
+                Testing.deannotateTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "topologicalSortBindings",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "isolated bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortBindings (Testing.TopologicalSortBindingsTestCase {
+                Testing.topologicalSortBindingsTestCaseBindings = [
+                  (Core.Name "a", (Core.TermLiteral (Core.LiteralString "foo"))),
+                  (Core.Name "b", (Core.TermLiteral (Core.LiteralString "bar")))],
+                Testing.topologicalSortBindingsTestCaseExpected = [
+                  [
+                    (Core.Name "a", (Core.TermLiteral (Core.LiteralString "foo")))],
+                  [
+                    (Core.Name "b", (Core.TermLiteral (Core.LiteralString "bar")))]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single recursive binding",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortBindings (Testing.TopologicalSortBindingsTestCase {
+                Testing.topologicalSortBindingsTestCaseBindings = [
+                  (Core.Name "a", (Core.TermList [
+                    Core.TermVariable (Core.Name "a")]))],
+                Testing.topologicalSortBindingsTestCaseExpected = [
+                  [
+                    (Core.Name "a", (Core.TermList [
+                      Core.TermVariable (Core.Name "a")]))]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mutually recursive bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortBindings (Testing.TopologicalSortBindingsTestCase {
+                Testing.topologicalSortBindingsTestCaseBindings = [
+                  (Core.Name "a", (Core.TermList [
+                    Core.TermVariable (Core.Name "b")])),
+                  (Core.Name "b", (Core.TermList [
+                    Core.TermVariable (Core.Name "a")]))],
+                Testing.topologicalSortBindingsTestCaseExpected = [
+                  [
+                    (Core.Name "a", (Core.TermList [
+                      Core.TermVariable (Core.Name "b")])),
+                    (Core.Name "b", (Core.TermList [
+                      Core.TermVariable (Core.Name "a")]))]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "mixed bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortBindings (Testing.TopologicalSortBindingsTestCase {
+                Testing.topologicalSortBindingsTestCaseBindings = [
+                  (Core.Name "a", (Core.TermVariable (Core.Name "b"))),
+                  (Core.Name "b", (Core.TermList [
+                    Core.TermVariable (Core.Name "a"),
+                    (Core.TermVariable (Core.Name "c"))])),
+                  (Core.Name "c", (Core.TermLiteral (Core.LiteralString "foo"))),
+                  (Core.Name "d", (Core.TermLiteral (Core.LiteralString "bar")))],
+                Testing.topologicalSortBindingsTestCaseExpected = [
+                  [
+                    (Core.Name "c", (Core.TermLiteral (Core.LiteralString "foo")))],
+                  [
+                    (Core.Name "a", (Core.TermVariable (Core.Name "b"))),
+                    (Core.Name "b", (Core.TermList [
+                      Core.TermVariable (Core.Name "a"),
+                      (Core.TermVariable (Core.Name "c"))]))],
+                  [
+                    (Core.Name "d", (Core.TermLiteral (Core.LiteralString "bar")))]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "normalizeTypeVariables",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "literal without type variables unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple let without type annotations unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let with monomorphic type scheme unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let with monomorphic binding referencing string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding with free type variable unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeVariable (Core.Name "a")),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeVariable (Core.Name "a")),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "monomorphic binding with typed lambda unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeLiteral Core.LiteralTypeString),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic binding with typed lambda in body unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeVariable (Core.Name "a")),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermVariable (Core.Name "bar")),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [],
+                        Core.typeSchemeType = (Core.TypeVariable (Core.Name "a")),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic identity function normalized",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "polymorphic const function normalized",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "const"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a",
+                          (Core.Name "b")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "const")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "const"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0",
+                          (Core.Name "t1")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "const")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "binding rewriting does not affect body with typed lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = (Just (Core.TypeFunction (Core.FunctionType {
+                      Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                      Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))),
+                    Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested polymorphic lets normalized",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "id2"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [
+                            Core.Name "b"],
+                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "id2"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "y"))}))),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [
+                            Core.Name "t0"],
+                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested same substitution in bindings and environment",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "id2"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [
+                            Core.Name "a"],
+                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "id2"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                        Core.bindingType = (Just (Core.TypeScheme {
+                          Core.typeSchemeVariables = [
+                            Core.Name "t0"],
+                          Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                            Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                          Core.typeSchemeConstraints = Nothing}))}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "parent type variable shadows child variable",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "id2"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "a"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "id2"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t1"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "no shadowing distinct type variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "id2"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "b"))),
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "b"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "id"),
+                      Core.bindingTerm = (Core.TermLet (Core.Let {
+                        Core.letBindings = [
+                          Core.Binding {
+                            Core.bindingName = (Core.Name "id2"),
+                            Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                              Core.lambdaParameter = (Core.Name "x"),
+                              Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                            Core.bindingType = (Just (Core.TypeScheme {
+                              Core.typeSchemeVariables = [
+                                Core.Name "t1"],
+                              Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t1"))})),
+                              Core.typeSchemeConstraints = Nothing}))}],
+                        Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                          Core.lambdaBody = (Core.TermApplication (Core.Application {
+                            Core.applicationFunction = (Core.TermVariable (Core.Name "id2")),
+                            Core.applicationArgument = (Core.TermVariable (Core.Name "y"))}))})))})),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0"],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "t0"))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "id")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "locally free type variable in nested binding",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseNormalizeTypeVariables (Testing.NormalizeTypeVariablesTestCase {
+                Testing.normalizeTypeVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "fun1"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "a"))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "b"))),
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "fun2"),
+                                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "z"),
+                                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "c"))),
+                                  Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "z"), (Core.TermVariable (Core.Name "y"))))}))),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [
+                                    Core.Name "c"],
+                                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "c")),
+                                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "c")),
+                                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))}))})),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "fun2")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "a",
+                          (Core.Name "b")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
+                              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "fun1")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+                Testing.normalizeTypeVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "fun1"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t0"))),
+                        Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "y"),
+                          Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t1"))),
+                          Core.lambdaBody = (Core.TermLet (Core.Let {
+                            Core.letBindings = [
+                              Core.Binding {
+                                Core.bindingName = (Core.Name "fun2"),
+                                Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                                  Core.lambdaParameter = (Core.Name "z"),
+                                  Core.lambdaDomain = (Just (Core.TypeVariable (Core.Name "t2"))),
+                                  Core.lambdaBody = (Core.TermPair (Core.TermVariable (Core.Name "z"), (Core.TermVariable (Core.Name "y"))))}))),
+                                Core.bindingType = (Just (Core.TypeScheme {
+                                  Core.typeSchemeVariables = [
+                                    Core.Name "t2"],
+                                  Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t2")),
+                                    Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                                      Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t2")),
+                                      Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))})),
+                                  Core.typeSchemeConstraints = Nothing}))}],
+                            Core.letBody = (Core.TermApplication (Core.Application {
+                              Core.applicationFunction = (Core.TermVariable (Core.Name "fun2")),
+                              Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))}))),
+                      Core.bindingType = (Just (Core.TypeScheme {
+                        Core.typeSchemeVariables = [
+                          Core.Name "t0",
+                          (Core.Name "t1")],
+                        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+                          Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t0")),
+                          Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+                            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "t1")),
+                            Core.functionTypeCodomain = (Core.TypePair (Core.PairType {
+                              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "t0")),
+                              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "t1"))}))}))})),
+                        Core.typeSchemeConstraints = Nothing}))}],
+                  Core.letBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "fun1")),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "etaExpandTerm",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "integer literal unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                Testing.etaExpansionTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string list unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "foo"),
+                  (Core.TermLiteral (Core.LiteralString "bar"))]),
+                Testing.etaExpansionTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "foo"),
+                  (Core.TermLiteral (Core.LiteralString "bar"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "fully applied binary function unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))})),
+                Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda with fully applied primitive unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                      Core.applicationArgument = (Core.TermLiteral (Core.LiteralString ","))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda returning constant unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))),
+                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bare unary primitive unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower")))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "bare binary primitive unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn")))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partially applied binary primitive expands to one lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                  Core.applicationArgument = (Core.TermVariable (Core.Name "foo"))})),
+                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "v1"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "foo"))})),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "projection expands to lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                  Core.projectionTypeName = (Core.Name "Person"),
+                  Core.projectionField = (Core.Name "firstName")})))),
+                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "v1"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+                      Core.projectionTypeName = (Core.Name "Person"),
+                      Core.projectionField = (Core.Name "firstName")})))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partial application inside lambda expands",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))),
+                Testing.etaExpansionTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "v1"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                        Core.applicationArgument = (Core.TermVariable (Core.Name "x"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let with constant body unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 137))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let with bare primitive value unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "foo"))})),
+                Testing.etaExpansionTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "foo"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "foo"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "fully applied unary unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "FOO"))})),
+                Testing.etaExpansionTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.toLower"))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "FOO"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "partial application in list expands",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseEtaExpansion (Testing.EtaExpansionTestCase {
+                Testing.etaExpansionTestCaseInput = (Core.TermList [
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "foo")])})),
+                  (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))]),
+                Testing.etaExpansionTestCaseOutput = (Core.TermList [
+                  Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "foo")])})),
+                  (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "v1"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermApplication (Core.Application {
+                        Core.applicationFunction = (Core.TermFunction (Core.FunctionPrimitive (Core.Name "hydra.lib.strings.splitOn"))),
+                        Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))})),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "v1"))}))})))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "foldOverTerm",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "collect labels from single node - pre-order",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList []))),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectLabels,
+                Testing.foldOverTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "collect labels from tree - pre-order",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList [
+                  Core.TermPair (Core.TermLiteral (Core.LiteralString "b"), (Core.TermList [])),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralString "c"), (Core.TermList [
+                    Core.TermPair (Core.TermLiteral (Core.LiteralString "d"), (Core.TermList []))])))]))),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectLabels,
+                Testing.foldOverTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a"),
+                  (Core.TermLiteral (Core.LiteralString "b")),
+                  (Core.TermLiteral (Core.LiteralString "c")),
+                  (Core.TermLiteral (Core.LiteralString "d"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "collect labels from single node - post-order",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList []))),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPost,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectLabels,
+                Testing.foldOverTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "a")])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "collect labels from tree - post-order",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "a"), (Core.TermList [
+                  Core.TermPair (Core.TermLiteral (Core.LiteralString "b"), (Core.TermList [])),
+                  (Core.TermPair (Core.TermLiteral (Core.LiteralString "c"), (Core.TermList [
+                    Core.TermPair (Core.TermLiteral (Core.LiteralString "d"), (Core.TermList []))])))]))),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPost,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectLabels,
+                Testing.foldOverTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "b"),
+                  (Core.TermLiteral (Core.LiteralString "d")),
+                  (Core.TermLiteral (Core.LiteralString "c")),
+                  (Core.TermLiteral (Core.LiteralString "a"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "sum int32 literals",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)),
+                  (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))}))]),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 52)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "collect list lengths - pre-order",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "foo"),
+                    (Core.TermLiteral (Core.LiteralString "bar"))],
+                  (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "quux")])}))]),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectListLengths,
+                Testing.foldOverTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "collect list lengths - post-order",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralString "foo"),
+                    (Core.TermLiteral (Core.LiteralString "bar"))],
+                  (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.applicationArgument = (Core.TermList [
+                      Core.TermLiteral (Core.LiteralString "quux")])}))]),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPost,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectListLengths,
+                Testing.foldOverTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "rewriteType",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String type in left side of either is replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String type in right side of either is replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String types in both sides of either are replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String type in nested either (left of left) is replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))})),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String type in nested either (right of right) is replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
+                  Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
+                  Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String types in complex nested either are all replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
+                  Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))})),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                  Core.eitherTypeRight = (Core.TypeEither (Core.EitherType {
+                    Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String in list type is replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String in function domain is replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))})),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String in function codomain is replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt64)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "String in optional type is replaced",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteType (Testing.RewriteTypeTestCase {
+                Testing.rewriteTypeTestCaseInput = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)),
+                Testing.rewriteTypeTestCaseRewriter = Testing.TypeRewriterReplaceStringWithInt32,
+                Testing.rewriteTypeTestCaseOutput = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "rewriteTerm",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string literal foo replaced with bar",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermLiteral (Core.LiteralString "foo")),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermLiteral (Core.LiteralString "bar"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in variable not changed",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermVariable (Core.Name "x")),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermVariable (Core.Name "x"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "foo"),
+                  (Core.TermLiteral (Core.LiteralString "baz"))]),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "bar"),
+                  (Core.TermLiteral (Core.LiteralString "baz"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple strings in list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "foo"),
+                  (Core.TermLiteral (Core.LiteralString "foo")),
+                  (Core.TermLiteral (Core.LiteralString "baz"))]),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralString "bar"),
+                  (Core.TermLiteral (Core.LiteralString "bar")),
+                  (Core.TermLiteral (Core.LiteralString "baz"))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in optional (just)",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "foo")))),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralString "bar"))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in function application",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "print")),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "print")),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in lambda body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))}))),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLiteral (Core.LiteralString "bar"))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in nested applications",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermVariable (Core.Name "g")),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralString "bar"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in record field",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Person"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "name"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Person"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "name"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "strings in multiple record fields",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Data"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "a"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "b"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "c"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Data"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "a"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "b"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "c"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in pair",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "foo"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermPair (Core.TermLiteral (Core.LiteralString "bar"), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in let binding value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in let body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in first case branch",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = (Core.Name "Result"),
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "success"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "error"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]})))),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = (Core.Name "Result"),
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "success"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "error"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in second case branch",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = (Core.Name "Result"),
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "success"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "error"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]})))),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = (Core.Name "Result"),
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "success"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "error"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in default branch",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = (Core.Name "Result"),
+                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "foo"))),
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "success"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "error"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]})))),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = (Core.Name "Result"),
+                  Core.caseStatementDefault = (Just (Core.TermLiteral (Core.LiteralString "bar"))),
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "success"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "error"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]}))))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string deeply nested in record in list in application",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "process")),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "Item"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "value"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]})])})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "process")),
+                  Core.applicationArgument = (Core.TermList [
+                    Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "Item"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "value"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]})])}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in union inject value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "Result"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "success"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermUnion (Core.Injection {
+                  Core.injectionTypeName = (Core.Name "Result"),
+                  Core.injectionField = Core.Field {
+                    Core.fieldName = (Core.Name "success"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in wrapped term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = (Core.Name "Email"),
+                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = (Core.Name "Email"),
+                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in annotated term body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "foo")),
+                  Core.annotatedTermAnnotation = M.empty})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermLiteral (Core.LiteralString "bar")),
+                  Core.annotatedTermAnnotation = M.empty}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in first of multiple let bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "baz")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "baz")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in second of multiple let bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "baz")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "y"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "baz")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "y"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in all let bindings and body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "foo")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralString "bar")),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralString "baz"),
+                  (Core.TermLiteral (Core.LiteralString "foo"))])),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralString "bar"),
+                  (Core.TermLiteral (Core.LiteralString "baz"))]))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in type lambda body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "a"),
+                  Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "a"),
+                  Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralString "bar"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in type application body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermLiteral (Core.LiteralString "foo")),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermLiteral (Core.LiteralString "bar")),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in nested type lambdas",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "a"),
+                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "b"),
+                    Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralString "foo"))}))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "a"),
+                  Core.typeLambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "b"),
+                    Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralString "bar"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in case branch within let binding",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "handler"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Result"),
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "ok"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "err"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "handler"))})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "handler"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                        Core.caseStatementTypeName = (Core.Name "Result"),
+                        Core.caseStatementDefault = Nothing,
+                        Core.caseStatementCases = [
+                          Core.Field {
+                            Core.fieldName = (Core.Name "ok"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))},
+                          Core.Field {
+                            Core.fieldName = (Core.Name "err"),
+                            Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "baz"))}]})))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "handler"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "string in annotated wrapped record field",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseRewriteTerm (Testing.RewriteTermTestCase {
+                Testing.rewriteTermTestCaseInput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "User"),
+                    Core.wrappedTermBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "UserData"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "name"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "foo"))}]}))})),
+                  Core.annotatedTermAnnotation = M.empty})),
+                Testing.rewriteTermTestCaseRewriter = Testing.TermRewriterReplaceFooWithBar,
+                Testing.rewriteTermTestCaseOutput = (Core.TermAnnotated (Core.AnnotatedTerm {
+                  Core.annotatedTermBody = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "User"),
+                    Core.wrappedTermBody = (Core.TermRecord (Core.Record {
+                      Core.recordTypeName = (Core.Name "UserData"),
+                      Core.recordFields = [
+                        Core.Field {
+                          Core.fieldName = (Core.Name "name"),
+                          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "bar"))}]}))})),
+                  Core.annotatedTermAnnotation = M.empty}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "rewriteAndFoldTermWithPath",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through application - sum literals",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through nested applications",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermVariable (Core.Name "y"))])})))}))),
+                    Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))})),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through let bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 32)))])})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through record fields",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Point"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "x"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "y"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}]})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 30)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through case branches",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                  Core.caseStatementTypeName = (Core.Name "Result"),
+                  Core.caseStatementDefault = Nothing,
+                  Core.caseStatementCases = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "ok"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "err"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]})))),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through pair",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermPair (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)), (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 7))))),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 12)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through optional",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermMaybe (Just (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))))),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through wrapped term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermWrap (Core.WrappedTerm {
+                  Core.wrappedTermTypeName = (Core.Name "Age"),
+                  Core.wrappedTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 25)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through type lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermTypeLambda (Core.TypeLambda {
+                  Core.typeLambdaParameter = (Core.Name "a"),
+                  Core.typeLambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 100)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through type application",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                  Core.typeApplicationTermBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 50))),
+                  Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 50)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "path tracking through set elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermSet (S.fromList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 6)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "deep nesting - application in lambda in let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "f"),
+                      Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermApplication (Core.Application {
+                          Core.applicationFunction = (Core.TermVariable (Core.Name "x")),
+                          Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 5)))}))}))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationSumInt32Literals,
+                Testing.foldOverTermTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 15)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "collect list lengths in nested structure",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermList [
+                  Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))],
+                  (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))])]),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectListLengths,
+                Testing.foldOverTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "collect list lengths in let body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseFoldOverTerm (Testing.FoldOverTermTestCase {
+                Testing.foldOverTermTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "xs"),
+                      Core.bindingTerm = (Core.TermList [
+                        Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))]),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermList [
+                    Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                    (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+                Testing.foldOverTermTestCaseTraversalOrder = Coders.TraversalOrderPre,
+                Testing.foldOverTermTestCaseOperation = Testing.FoldOperationCollectListLengths,
+                Testing.foldOverTermTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "unshadowVariables",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "literal unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermVariable (Core.Name "x")),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermVariable (Core.Name "x"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single lambda unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "distinct lambda parameters unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermVariable (Core.Name "y"))])})))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermVariable (Core.Name "y"))])})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let with no shadowing unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let and lambda with distinct names unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermVariable (Core.Name "y"))])})))})),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermVariable (Core.Name "y"))])})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "inner lambda shadows outer lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x2"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "inner lambda shadows outer - body references both",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))])}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermVariable (Core.Name "x"),
+                    (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))])})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "triple nested lambda same name",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x2"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x3"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x3"))})))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two parameters shadow sequentially",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermVariable (Core.Name "y"))])})))})))})))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y2"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x2"),
+                          (Core.TermVariable (Core.Name "y2"))])})))})))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda shadows let-bound variable",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x2"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda shadows one of multiple let bindings",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x"),
+                      (Core.TermVariable (Core.Name "y"))])})))})),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing},
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "y"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x2"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermList [
+                      Core.TermVariable (Core.Name "x2"),
+                      (Core.TermVariable (Core.Name "y"))])})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "inner let body with lambda shadowing outer let",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))})),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda in function position of application",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "f"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "f"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "f"))}))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "f"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermApplication (Core.Application {
+                    Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "f2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "f2"))}))),
+                    Core.applicationArgument = (Core.TermVariable (Core.Name "f"))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambdas in list elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})),
+                    (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))])}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermList [
+                    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})),
+                    (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))])})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda in record field",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "Pair"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fst"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "snd"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermRecord (Core.Record {
+                    Core.recordTypeName = (Core.Name "Pair"),
+                    Core.recordFields = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "fst"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x2"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "snd"),
+                        Core.fieldTerm = (Core.TermVariable (Core.Name "x"))}]}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda in case branch",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "Maybe"),
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "nothing"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "just"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}]}))))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionElimination (Core.EliminationUnion (Core.CaseStatement {
+                    Core.caseStatementTypeName = (Core.Name "Maybe"),
+                    Core.caseStatementDefault = Nothing,
+                    Core.caseStatementCases = [
+                      Core.Field {
+                        Core.fieldName = (Core.Name "nothing"),
+                        Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))},
+                      Core.Field {
+                        Core.fieldName = (Core.Name "just"),
+                        Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x2"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}]}))))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda in pair",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})), (Core.TermVariable (Core.Name "x"))))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermPair (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x2"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})), (Core.TermVariable (Core.Name "x"))))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda inside optional",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermMaybe (Just (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermMaybe (Just (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x2"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda inside set element",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermSet (S.fromList [
+                    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))]))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermSet (S.fromList [
+                    Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))}))]))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda in union injection",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "Result"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "ok"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}}))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermUnion (Core.Injection {
+                    Core.injectionTypeName = (Core.Name "Result"),
+                    Core.injectionField = Core.Field {
+                      Core.fieldName = (Core.Name "ok"),
+                      Core.fieldTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "x2"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda inside wrapped term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "Age"),
+                    Core.wrappedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermWrap (Core.WrappedTerm {
+                    Core.wrappedTermTypeName = (Core.Name "Age"),
+                    Core.wrappedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda inside type lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "a"),
+                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermTypeLambda (Core.TypeLambda {
+                    Core.typeLambdaParameter = (Core.Name "a"),
+                    Core.typeLambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))})))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda inside type application",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermTypeApplication (Core.TypeApplicationTerm {
+                    Core.typeApplicationTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))}))),
+                    Core.typeApplicationTermType = (Core.TypeLiteral Core.LiteralTypeString)}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowed lambda inside annotated term",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                    Core.annotatedTermAnnotation = M.empty}))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermAnnotated (Core.AnnotatedTerm {
+                    Core.annotatedTermBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))}))),
+                    Core.annotatedTermAnnotation = M.empty}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "shadowing at multiple depths",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x"),
+                          (Core.TermVariable (Core.Name "y"))])})))})))})))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "y"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x2"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                        Core.lambdaParameter = (Core.Name "y2"),
+                        Core.lambdaDomain = Nothing,
+                        Core.lambdaBody = (Core.TermList [
+                          Core.TermVariable (Core.Name "x2"),
+                          (Core.TermVariable (Core.Name "y2"))])})))})))})))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "let then lambda then lambda all same name",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))})))})),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermLet (Core.Let {
+                  Core.letBindings = [
+                    Core.Binding {
+                      Core.bindingName = (Core.Name "x"),
+                      Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                      Core.bindingType = Nothing}],
+                  Core.letBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                    Core.lambdaParameter = (Core.Name "x2"),
+                    Core.lambdaDomain = Nothing,
+                    Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                      Core.lambdaParameter = (Core.Name "x3"),
+                      Core.lambdaDomain = Nothing,
+                      Core.lambdaBody = (Core.TermVariable (Core.Name "x3"))})))})))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "lambda with shadowing in let binding value",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))}))),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                  Core.lambdaParameter = (Core.Name "x"),
+                  Core.lambdaDomain = Nothing,
+                  Core.lambdaBody = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "y"),
+                        Core.bindingTerm = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                          Core.lambdaParameter = (Core.Name "x2"),
+                          Core.lambdaDomain = Nothing,
+                          Core.lambdaBody = (Core.TermVariable (Core.Name "x2"))}))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermApplication (Core.Application {
+                      Core.applicationFunction = (Core.TermVariable (Core.Name "y")),
+                      Core.applicationArgument = (Core.TermVariable (Core.Name "x"))}))}))})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "application without shadowing unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermApplication (Core.Application {
+                  Core.applicationFunction = (Core.TermVariable (Core.Name "f")),
+                  Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list of literals unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))]),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermList [
+                  Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3)))])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested record unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnshadowVariables (Testing.UnshadowVariablesTestCase {
+                Testing.unshadowVariablesTestCaseInput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Point"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "x"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "y"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}]})),
+                Testing.unshadowVariablesTestCaseOutput = (Core.TermRecord (Core.Record {
+                  Core.recordTypeName = (Core.Name "Point"),
+                  Core.recordFields = [
+                    Core.Field {
+                      Core.fieldName = (Core.Name "x"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 10)))},
+                    Core.Field {
+                      Core.fieldName = (Core.Name "y"),
+                      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 20)))}]}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Serialization.hs b/src/gen-test/haskell/Hydra/Test/Serialization.hs
--- a/src/gen-test/haskell/Hydra/Test/Serialization.hs
+++ b/src/gen-test/haskell/Hydra/Test/Serialization.hs
@@ -5,7 +5,7 @@
 module Hydra.Test.Serialization where
 
 import qualified Hydra.Ast as Ast
-import qualified Hydra.Ext.Haskell.Operators as Operators
+import qualified Hydra.Lib.Math as Math
 import qualified Hydra.Serialization as Serialization
 import qualified Hydra.Testing as Testing
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
@@ -17,158 +17,177 @@
 
 -- | Test cases for AST serialization
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "serialization",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "associativity",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "right-associative operator",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.ifx Operators.arrowOp (Serialization.ifx Operators.arrowOp (Serialization.cst "a") (Serialization.cst "b")) (Serialization.ifx Operators.arrowOp (Serialization.cst "c") (Serialization.cst "d"))),
-            Testing.serializationTestCaseOutput = "(a -> b) -> c -> d"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "case statements",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple case statement",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.ifx (Ast.Op {
-              Ast.opSymbol = (Ast.Symbol "of"),
-              Ast.opPadding = Ast.Padding {
-                Ast.paddingLeft = Ast.WsSpace,
-                Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
-              Ast.opPrecedence = (Ast.Precedence 0),
-              Ast.opAssociativity = Ast.AssociativityNone}) (Serialization.spaceSep [
-              Serialization.cst "case",
-              (Serialization.ifx Operators.gtOp (Serialization.cst "x") (Serialization.num 42))]) (Serialization.newlineSep [
-              Serialization.ifx Operators.caseOp (Serialization.cst "False") (Serialization.cst "Big"),
-              (Serialization.ifx Operators.caseOp (Serialization.cst "True") (Serialization.cst "Small"))])),
-            Testing.serializationTestCaseOutput = "case x > 42 of\n  False -> Big\n  True -> Small"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested case statement",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.ifx (Ast.Op {
-              Ast.opSymbol = (Ast.Symbol "of"),
-              Ast.opPadding = Ast.Padding {
-                Ast.paddingLeft = Ast.WsSpace,
-                Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
-              Ast.opPrecedence = (Ast.Precedence 0),
-              Ast.opAssociativity = Ast.AssociativityNone}) (Serialization.spaceSep [
-              Serialization.cst "case",
-              (Serialization.ifx Operators.gtOp (Serialization.cst "x") (Serialization.num 42))]) (Serialization.newlineSep [
-              Serialization.ifx Operators.caseOp (Serialization.cst "True") (Serialization.ifx (Ast.Op {
-                Ast.opSymbol = (Ast.Symbol "of"),
-                Ast.opPadding = Ast.Padding {
-                  Ast.paddingLeft = Ast.WsSpace,
-                  Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
-                Ast.opPrecedence = (Ast.Precedence 0),
-                Ast.opAssociativity = Ast.AssociativityNone}) (Serialization.spaceSep [
-                Serialization.cst "case",
-                (Serialization.ifx Operators.gtOp (Serialization.cst "x") (Serialization.num 100))]) (Serialization.newlineSep [
-                Serialization.ifx Operators.caseOp (Serialization.cst "True") (Serialization.cst "ReallyBig"),
-                (Serialization.ifx Operators.caseOp (Serialization.cst "False") (Serialization.cst "Big"))])),
-              (Serialization.ifx Operators.caseOp (Serialization.cst "False") (Serialization.cst "Small"))])),
-            Testing.serializationTestCaseOutput = "case x > 42 of\n  True -> case x > 100 of\n    True -> ReallyBig\n    False -> Big\n  False -> Small"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lambdas",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple lambda",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.ifx Operators.lambdaOp (Serialization.cst "\\x y") (Serialization.ifx Operators.plusOp (Serialization.cst "x") (Serialization.cst "y"))),
-            Testing.serializationTestCaseOutput = "\\x y -> x + y"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "lists",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.bracketList Serialization.inlineStyle []),
-            Testing.serializationTestCaseOutput = "[]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "simple non-empty list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.bracketList Serialization.inlineStyle [
-              Serialization.num 1,
-              (Serialization.num 2),
-              (Serialization.num 3)]),
-            Testing.serializationTestCaseOutput = "[1, 2, 3]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.bracketList Serialization.inlineStyle [
-              Serialization.bracketList Serialization.inlineStyle [
-                Serialization.num 1,
-                (Serialization.num 3)],
-              (Serialization.num 2)]),
-            Testing.serializationTestCaseOutput = "[[1, 3], 2]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "list with parenthesized expression inside",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.bracketList Serialization.inlineStyle [
-              Serialization.bracketList Serialization.inlineStyle [
-                Serialization.num 1,
-                (Serialization.ifx Operators.multOp (Serialization.ifx Operators.plusOp (Serialization.num 2) (Serialization.num 3)) (Serialization.ifx Operators.plusOp (Serialization.num 1) (Serialization.num 10)))],
-              (Serialization.num 2)]),
-            Testing.serializationTestCaseOutput = "[[1, (2 + 3) * (1 + 10)], 2]"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "precedence",
+      Testing.testGroupName = "serialization",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "operators with different precedence - no parens needed",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.ifx Operators.plusOp (Serialization.ifx Operators.multOp (Serialization.num 2) (Serialization.num 3)) (Serialization.ifx Operators.multOp (Serialization.num 1) (Serialization.num 10))),
-            Testing.serializationTestCaseOutput = "2 * 3 + 1 * 10"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "operators with different precedence - parens needed",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.ifx Operators.multOp (Serialization.ifx Operators.plusOp (Serialization.num 2) (Serialization.num 3)) (Serialization.ifx Operators.plusOp (Serialization.num 1) (Serialization.num 10))),
-            Testing.serializationTestCaseOutput = "(2 + 3) * (1 + 10)"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "associative operator left nesting",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.ifx Operators.multOp (Serialization.cst "x") (Serialization.ifx Operators.multOp (Serialization.cst "y") (Serialization.cst "z"))),
-            Testing.serializationTestCaseOutput = "x * y * z"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "associative operator right nesting",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
-            Testing.serializationTestCaseInput = (Serialization.ifx Operators.multOp (Serialization.ifx Operators.multOp (Serialization.cst "x") (Serialization.cst "y")) (Serialization.cst "z")),
-            Testing.serializationTestCaseOutput = "x * y * z"})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "associativity",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "right-associative operator",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.ifx arrowOp (Serialization.ifx arrowOp (Serialization.cst "a") (Serialization.cst "b")) (Serialization.ifx arrowOp (Serialization.cst "c") (Serialization.cst "d"))),
+                Testing.serializationTestCaseOutput = "(a -> b) -> c -> d"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "case statements",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple case statement",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.ifx (Ast.Op {
+                  Ast.opSymbol = (Ast.Symbol "of"),
+                  Ast.opPadding = Ast.Padding {
+                    Ast.paddingLeft = Ast.WsSpace,
+                    Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
+                  Ast.opPrecedence = (Ast.Precedence 0),
+                  Ast.opAssociativity = Ast.AssociativityNone}) (Serialization.spaceSep [
+                  Serialization.cst "case",
+                  (Serialization.ifx gtOp (Serialization.cst "x") (Serialization.num 42))]) (Serialization.newlineSep [
+                  Serialization.ifx caseOp (Serialization.cst "False") (Serialization.cst "Big"),
+                  (Serialization.ifx caseOp (Serialization.cst "True") (Serialization.cst "Small"))])),
+                Testing.serializationTestCaseOutput = "case x > 42 of\n  False -> Big\n  True -> Small"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested case statement",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.ifx (Ast.Op {
+                  Ast.opSymbol = (Ast.Symbol "of"),
+                  Ast.opPadding = Ast.Padding {
+                    Ast.paddingLeft = Ast.WsSpace,
+                    Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
+                  Ast.opPrecedence = (Ast.Precedence 0),
+                  Ast.opAssociativity = Ast.AssociativityNone}) (Serialization.spaceSep [
+                  Serialization.cst "case",
+                  (Serialization.ifx gtOp (Serialization.cst "x") (Serialization.num 42))]) (Serialization.newlineSep [
+                  Serialization.ifx caseOp (Serialization.cst "True") (Serialization.ifx (Ast.Op {
+                    Ast.opSymbol = (Ast.Symbol "of"),
+                    Ast.opPadding = Ast.Padding {
+                      Ast.paddingLeft = Ast.WsSpace,
+                      Ast.paddingRight = (Ast.WsBreakAndIndent "  ")},
+                    Ast.opPrecedence = (Ast.Precedence 0),
+                    Ast.opAssociativity = Ast.AssociativityNone}) (Serialization.spaceSep [
+                    Serialization.cst "case",
+                    (Serialization.ifx gtOp (Serialization.cst "x") (Serialization.num 100))]) (Serialization.newlineSep [
+                    Serialization.ifx caseOp (Serialization.cst "True") (Serialization.cst "ReallyBig"),
+                    (Serialization.ifx caseOp (Serialization.cst "False") (Serialization.cst "Big"))])),
+                  (Serialization.ifx caseOp (Serialization.cst "False") (Serialization.cst "Small"))])),
+                Testing.serializationTestCaseOutput = "case x > 42 of\n  True -> case x > 100 of\n    True -> ReallyBig\n    False -> Big\n  False -> Small"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lambdas",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple lambda",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.ifx lambdaOp (Serialization.cst "\\x y") (Serialization.ifx plusOp (Serialization.cst "x") (Serialization.cst "y"))),
+                Testing.serializationTestCaseOutput = "\\x y -> x + y"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "lists",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.bracketList Serialization.inlineStyle []),
+                Testing.serializationTestCaseOutput = "[]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "simple non-empty list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.bracketList Serialization.inlineStyle [
+                  Serialization.num 1,
+                  (Serialization.num 2),
+                  (Serialization.num 3)]),
+                Testing.serializationTestCaseOutput = "[1, 2, 3]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.bracketList Serialization.inlineStyle [
+                  Serialization.bracketList Serialization.inlineStyle [
+                    Serialization.num 1,
+                    (Serialization.num 3)],
+                  (Serialization.num 2)]),
+                Testing.serializationTestCaseOutput = "[[1, 3], 2]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "list with parenthesized expression inside",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.bracketList Serialization.inlineStyle [
+                  Serialization.bracketList Serialization.inlineStyle [
+                    Serialization.num 1,
+                    (Serialization.ifx multOp (Serialization.ifx plusOp (Serialization.num 2) (Serialization.num 3)) (Serialization.ifx plusOp (Serialization.num 1) (Serialization.num 10)))],
+                  (Serialization.num 2)]),
+                Testing.serializationTestCaseOutput = "[[1, (2 + 3) * (1 + 10)], 2]"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "precedence",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "operators with different precedence - no parens needed",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.ifx plusOp (Serialization.ifx multOp (Serialization.num 2) (Serialization.num 3)) (Serialization.ifx multOp (Serialization.num 1) (Serialization.num 10))),
+                Testing.serializationTestCaseOutput = "2 * 3 + 1 * 10"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "operators with different precedence - parens needed",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.ifx multOp (Serialization.ifx plusOp (Serialization.num 2) (Serialization.num 3)) (Serialization.ifx plusOp (Serialization.num 1) (Serialization.num 10))),
+                Testing.serializationTestCaseOutput = "(2 + 3) * (1 + 10)"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "associative operator left nesting",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.ifx multOp (Serialization.cst "x") (Serialization.ifx multOp (Serialization.cst "y") (Serialization.cst "z"))),
+                Testing.serializationTestCaseOutput = "x * y * z"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "associative operator right nesting",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSerialization (Testing.SerializationTestCase {
+                Testing.serializationTestCaseInput = (Serialization.ifx multOp (Serialization.ifx multOp (Serialization.cst "x") (Serialization.cst "y")) (Serialization.cst "z")),
+                Testing.serializationTestCaseOutput = "x * y * z"})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
+
+arrowOp :: Ast.Op
+arrowOp = Serialization.op "->" (Math.negate 1) Ast.AssociativityRight
+
+caseOp :: Ast.Op
+caseOp = Serialization.op "->" 0 Ast.AssociativityNone
+
+gtOp :: Ast.Op
+gtOp = Serialization.op ">" 4 Ast.AssociativityNone
+
+lambdaOp :: Ast.Op
+lambdaOp = Serialization.op "->" (Math.negate 1) Ast.AssociativityRight
+
+multOp :: Ast.Op
+multOp = Serialization.op "*" 7 Ast.AssociativityBoth
+
+plusOp :: Ast.Op
+plusOp = Serialization.op "+" 6 Ast.AssociativityBoth
diff --git a/src/gen-test/haskell/Hydra/Test/Sorting.hs b/src/gen-test/haskell/Hydra/Test/Sorting.hs
--- a/src/gen-test/haskell/Hydra/Test/Sorting.hs
+++ b/src/gen-test/haskell/Hydra/Test/Sorting.hs
@@ -14,439 +14,440 @@
 
 -- | Test cases for topological sorting
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "sorting",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "topological sort",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [],
-            Testing.topologicalSortTestCaseExpected = (Right [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "singleton set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [
-              (1, [])],
-            Testing.topologicalSortTestCaseExpected = (Right [
-              1])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "discrete set with multiple elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [
-              (3, []),
-              (1, []),
-              (2, [])],
-            Testing.topologicalSortTestCaseExpected = (Right [
-              1,
-              2,
-              3])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "linked list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [
-              (3, [
-                1]),
-              (2, [
-                3]),
-              (1, [])],
-            Testing.topologicalSortTestCaseExpected = (Right [
-              1,
-              3,
-              2])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "binary tree",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [
-              (3, [
-                1,
-                4]),
-              (4, [
-                6,
-                2]),
-              (1, [
-                5]),
-              (2, []),
-              (6, []),
-              (5, [])],
-            Testing.topologicalSortTestCaseExpected = (Right [
-              5,
-              1,
-              2,
-              6,
-              4,
-              3])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two trees",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [
-              (3, [
-                1,
-                4]),
-              (5, [
-                6,
-                2]),
-              (2, [
-                7]),
-              (1, []),
-              (4, []),
-              (6, []),
-              (7, [])],
-            Testing.topologicalSortTestCaseExpected = (Right [
-              1,
-              7,
-              2,
-              4,
-              3,
-              6,
-              5])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "diamond DAG",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [
-              (1, [
-                3,
-                4]),
-              (3, [
-                2]),
-              (4, [
-                2]),
-              (2, [
-                5]),
-              (5, [])],
-            Testing.topologicalSortTestCaseExpected = (Right [
-              5,
-              2,
-              3,
-              4,
-              1])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "two-node cycle",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [
-              (1, [
-                2]),
-              (2, [
-                1])],
-            Testing.topologicalSortTestCaseExpected = (Left [
-              [
-                1,
-                2]])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cycle with incoming and outgoing edges",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
-            Testing.topologicalSortTestCaseAdjacencyList = [
-              (1, [
-                3]),
-              (3, [
-                2]),
-              (2, [
-                3,
-                4]),
-              (4, [
-                5]),
-              (5, [])],
-            Testing.topologicalSortTestCaseExpected = (Left [
-              [
-                2,
-                3]])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "topological sort SCC",
+      Testing.testGroupName = "sorting",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [],
-            Testing.topologicalSortSCCTestCaseExpected = []})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "singleton set",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (1, [])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "discrete set with multiple elements",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (3, []),
-              (1, []),
-              (2, [])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1],
-              [
-                2],
-              [
-                3]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single two-element component #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (1, [
-                2]),
-              (2, [])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                2],
-              [
-                1]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "single two-element component #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (2, [
-                1]),
-              (1, [])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1],
-              [
-                2]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple-element component",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (2, [
-                1,
-                3]),
-              (1, [
-                3]),
-              (3, [])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                3],
-              [
-                1],
-              [
-                2]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cycle of two nodes #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (1, [
-                2]),
-              (2, [
-                1])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1,
-                2]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cycle of two nodes #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (2, [
-                1]),
-              (1, [
-                2])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1,
-                2]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cycle of three nodes #1",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (1, [
-                2]),
-              (2, [
-                3]),
-              (3, [
-                1])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1,
-                2,
-                3]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "cycle of three nodes #2",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (2, [
-                1]),
-              (3, [
-                2]),
-              (1, [
-                3])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1,
-                2,
-                3]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple disconnected cycles",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (200, []),
-              (100, []),
-              (300, []),
-              (10, [
-                20]),
-              (20, [
-                10]),
-              (1, [
-                2]),
-              (2, [
-                3]),
-              (3, [
-                1])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1,
-                2,
-                3],
-              [
-                10,
-                20],
-              [
-                100],
-              [
-                200],
-              [
-                300]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "complex cycles",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (1, [
-                2,
-                3]),
-              (2, [
-                3]),
-              (3, [
-                1])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                1,
-                2,
-                3]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "chain of three SCCs",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (1, [
-                2,
-                10]),
-              (2, [
-                3]),
-              (3, [
-                1]),
-              (10, [
-                20]),
-              (20, [
-                100,
-                10]),
-              (100, [])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                100],
-              [
-                10,
-                20],
-              [
-                1,
-                2,
-                3]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "SCCs with dependencies to/from non-SCC nodes",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
-            Testing.topologicalSortSCCTestCaseAdjacencyList = [
-              (1, [
-                2,
-                3,
-                10]),
-              (2, [
-                3]),
-              (3, [
-                1]),
-              (10, [
-                20,
-                30]),
-              (20, [
-                30]),
-              (30, []),
-              (100, [
-                200,
-                2]),
-              (200, []),
-              (300, [
-                100]),
-              (1000, []),
-              (2000, [])],
-            Testing.topologicalSortSCCTestCaseExpected = [
-              [
-                30],
-              [
-                20],
-              [
-                10],
-              [
-                1,
-                2,
-                3],
-              [
-                200],
-              [
-                100],
-              [
-                300],
-              [
-                1000],
-              [
-                2000]]})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "topological sort",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [],
+                Testing.topologicalSortTestCaseExpected = (Right [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "singleton set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [
+                  (1, [])],
+                Testing.topologicalSortTestCaseExpected = (Right [
+                  1])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "discrete set with multiple elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [
+                  (3, []),
+                  (1, []),
+                  (2, [])],
+                Testing.topologicalSortTestCaseExpected = (Right [
+                  1,
+                  2,
+                  3])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "linked list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [
+                  (3, [
+                    1]),
+                  (2, [
+                    3]),
+                  (1, [])],
+                Testing.topologicalSortTestCaseExpected = (Right [
+                  1,
+                  3,
+                  2])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "binary tree",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [
+                  (3, [
+                    1,
+                    4]),
+                  (4, [
+                    6,
+                    2]),
+                  (1, [
+                    5]),
+                  (2, []),
+                  (6, []),
+                  (5, [])],
+                Testing.topologicalSortTestCaseExpected = (Right [
+                  5,
+                  1,
+                  2,
+                  6,
+                  4,
+                  3])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two trees",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [
+                  (3, [
+                    1,
+                    4]),
+                  (5, [
+                    6,
+                    2]),
+                  (2, [
+                    7]),
+                  (1, []),
+                  (4, []),
+                  (6, []),
+                  (7, [])],
+                Testing.topologicalSortTestCaseExpected = (Right [
+                  1,
+                  7,
+                  2,
+                  4,
+                  3,
+                  6,
+                  5])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "diamond DAG",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [
+                  (1, [
+                    3,
+                    4]),
+                  (3, [
+                    2]),
+                  (4, [
+                    2]),
+                  (2, [
+                    5]),
+                  (5, [])],
+                Testing.topologicalSortTestCaseExpected = (Right [
+                  5,
+                  2,
+                  3,
+                  4,
+                  1])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "two-node cycle",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [
+                  (1, [
+                    2]),
+                  (2, [
+                    1])],
+                Testing.topologicalSortTestCaseExpected = (Left [
+                  [
+                    1,
+                    2]])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cycle with incoming and outgoing edges",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSort (Testing.TopologicalSortTestCase {
+                Testing.topologicalSortTestCaseAdjacencyList = [
+                  (1, [
+                    3]),
+                  (3, [
+                    2]),
+                  (2, [
+                    3,
+                    4]),
+                  (4, [
+                    5]),
+                  (5, [])],
+                Testing.topologicalSortTestCaseExpected = (Left [
+                  [
+                    2,
+                    3]])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "topological sort SCC",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [],
+                Testing.topologicalSortSCCTestCaseExpected = []})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "singleton set",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (1, [])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "discrete set with multiple elements",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (3, []),
+                  (1, []),
+                  (2, [])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1],
+                  [
+                    2],
+                  [
+                    3]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single two-element component #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (1, [
+                    2]),
+                  (2, [])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    2],
+                  [
+                    1]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "single two-element component #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (2, [
+                    1]),
+                  (1, [])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1],
+                  [
+                    2]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple-element component",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (2, [
+                    1,
+                    3]),
+                  (1, [
+                    3]),
+                  (3, [])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    3],
+                  [
+                    1],
+                  [
+                    2]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cycle of two nodes #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (1, [
+                    2]),
+                  (2, [
+                    1])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1,
+                    2]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cycle of two nodes #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (2, [
+                    1]),
+                  (1, [
+                    2])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1,
+                    2]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cycle of three nodes #1",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (1, [
+                    2]),
+                  (2, [
+                    3]),
+                  (3, [
+                    1])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1,
+                    2,
+                    3]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "cycle of three nodes #2",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (2, [
+                    1]),
+                  (3, [
+                    2]),
+                  (1, [
+                    3])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1,
+                    2,
+                    3]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple disconnected cycles",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (200, []),
+                  (100, []),
+                  (300, []),
+                  (10, [
+                    20]),
+                  (20, [
+                    10]),
+                  (1, [
+                    2]),
+                  (2, [
+                    3]),
+                  (3, [
+                    1])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1,
+                    2,
+                    3],
+                  [
+                    10,
+                    20],
+                  [
+                    100],
+                  [
+                    200],
+                  [
+                    300]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "complex cycles",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (1, [
+                    2,
+                    3]),
+                  (2, [
+                    3]),
+                  (3, [
+                    1])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    1,
+                    2,
+                    3]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "chain of three SCCs",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (1, [
+                    2,
+                    10]),
+                  (2, [
+                    3]),
+                  (3, [
+                    1]),
+                  (10, [
+                    20]),
+                  (20, [
+                    100,
+                    10]),
+                  (100, [])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    100],
+                  [
+                    10,
+                    20],
+                  [
+                    1,
+                    2,
+                    3]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "SCCs with dependencies to/from non-SCC nodes",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseTopologicalSortSCC (Testing.TopologicalSortSCCTestCase {
+                Testing.topologicalSortSCCTestCaseAdjacencyList = [
+                  (1, [
+                    2,
+                    3,
+                    10]),
+                  (2, [
+                    3]),
+                  (3, [
+                    1]),
+                  (10, [
+                    20,
+                    30]),
+                  (20, [
+                    30]),
+                  (30, []),
+                  (100, [
+                    200,
+                    2]),
+                  (200, []),
+                  (300, [
+                    100]),
+                  (1000, []),
+                  (2000, [])],
+                Testing.topologicalSortSCCTestCaseExpected = [
+                  [
+                    30],
+                  [
+                    20],
+                  [
+                    10],
+                  [
+                    1,
+                    2,
+                    3],
+                  [
+                    200],
+                  [
+                    100],
+                  [
+                    300],
+                  [
+                    1000],
+                  [
+                    2000]]})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Substitution.hs b/src/gen-test/haskell/Hydra/Test/Substitution.hs
--- a/src/gen-test/haskell/Hydra/Test/Substitution.hs
+++ b/src/gen-test/haskell/Hydra/Test/Substitution.hs
@@ -15,192 +15,193 @@
 
 -- | Test cases for type and term substitution operations
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "substitution",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
+allTests =
     Testing.TestGroup {
-      Testing.testGroupName = "substInType",
+      Testing.testGroupName = "substitution",
       Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "empty substitution returns type unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [],
-            Testing.substInTypeTestCaseInput = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.substInTypeTestCaseOutput = (Core.TypeLiteral Core.LiteralTypeString)})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute type variable with int32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
-            Testing.substInTypeTestCaseInput = (Core.TypeVariable (Core.Name "a")),
-            Testing.substInTypeTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "non-matching variable unchanged",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
-            Testing.substInTypeTestCaseInput = (Core.TypeVariable (Core.Name "b")),
-            Testing.substInTypeTestCaseOutput = (Core.TypeVariable (Core.Name "b"))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute in function domain",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
-            Testing.substInTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.substInTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute in function codomain",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral Core.LiteralTypeString))],
-            Testing.substInTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-            Testing.substInTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute in list element type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
-            Testing.substInTypeTestCaseInput = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
-            Testing.substInTypeTestCaseOutput = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute in optional type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral Core.LiteralTypeString))],
-            Testing.substInTypeTestCaseInput = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a"))),
-            Testing.substInTypeTestCaseOutput = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute in pair type both sides",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
-            Testing.substInTypeTestCaseInput = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
-              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "a"))})),
-            Testing.substInTypeTestCaseOutput = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute in either type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral Core.LiteralTypeString))],
-            Testing.substInTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "a")),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.substInTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute in map key type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "k", (Core.TypeLiteral Core.LiteralTypeString))],
-            Testing.substInTypeTestCaseInput = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "k")),
-              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.substInTypeTestCaseOutput = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "substitute in set type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
-            Testing.substInTypeTestCaseInput = (Core.TypeSet (Core.TypeVariable (Core.Name "a"))),
-            Testing.substInTypeTestCaseOutput = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "nested substitution in list of pairs",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
-            Testing.substInTypeTestCaseInput = (Core.TypeList (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
-              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))),
-            Testing.substInTypeTestCaseOutput = (Core.TypeList (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "multiple substitutions",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))],
-            Testing.substInTypeTestCaseInput = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
-              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))})),
-            Testing.substInTypeTestCaseOutput = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "forAll bound variable not substituted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
-            Testing.substInTypeTestCaseInput = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "a"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
-            Testing.substInTypeTestCaseOutput = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "a"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "forAll free variable substituted",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
-            Testing.substInTypeTestCaseSubstitution = [
-              (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))],
-            Testing.substInTypeTestCaseInput = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "a"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))})),
-            Testing.substInTypeTestCaseOutput = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "a"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "substInType",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "empty substitution returns type unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [],
+                Testing.substInTypeTestCaseInput = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.substInTypeTestCaseOutput = (Core.TypeLiteral Core.LiteralTypeString)})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute type variable with int32",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
+                Testing.substInTypeTestCaseInput = (Core.TypeVariable (Core.Name "a")),
+                Testing.substInTypeTestCaseOutput = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "non-matching variable unchanged",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
+                Testing.substInTypeTestCaseInput = (Core.TypeVariable (Core.Name "b")),
+                Testing.substInTypeTestCaseOutput = (Core.TypeVariable (Core.Name "b"))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute in function domain",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
+                Testing.substInTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.substInTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute in function codomain",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral Core.LiteralTypeString))],
+                Testing.substInTypeTestCaseInput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                Testing.substInTypeTestCaseOutput = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute in list element type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
+                Testing.substInTypeTestCaseInput = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
+                Testing.substInTypeTestCaseOutput = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute in optional type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral Core.LiteralTypeString))],
+                Testing.substInTypeTestCaseInput = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a"))),
+                Testing.substInTypeTestCaseOutput = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute in pair type both sides",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
+                Testing.substInTypeTestCaseInput = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
+                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "a"))})),
+                Testing.substInTypeTestCaseOutput = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute in either type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral Core.LiteralTypeString))],
+                Testing.substInTypeTestCaseInput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "a")),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.substInTypeTestCaseOutput = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute in map key type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "k", (Core.TypeLiteral Core.LiteralTypeString))],
+                Testing.substInTypeTestCaseInput = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "k")),
+                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.substInTypeTestCaseOutput = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "substitute in set type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
+                Testing.substInTypeTestCaseInput = (Core.TypeSet (Core.TypeVariable (Core.Name "a"))),
+                Testing.substInTypeTestCaseOutput = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "nested substitution in list of pairs",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
+                Testing.substInTypeTestCaseInput = (Core.TypeList (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
+                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))),
+                Testing.substInTypeTestCaseOutput = (Core.TypeList (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "multiple substitutions",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))],
+                Testing.substInTypeTestCaseInput = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
+                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))})),
+                Testing.substInTypeTestCaseOutput = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "forAll bound variable not substituted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))],
+                Testing.substInTypeTestCaseInput = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "a"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
+                Testing.substInTypeTestCaseOutput = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "a"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "forAll free variable substituted",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseSubstInType (Testing.SubstInTypeTestCase {
+                Testing.substInTypeTestCaseSubstitution = [
+                  (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))],
+                Testing.substInTypeTestCaseInput = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "a"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))}))})),
+                Testing.substInTypeTestCaseOutput = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "a"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/TestGraph.hs b/src/gen-test/haskell/Hydra/Test/TestGraph.hs
--- a/src/gen-test/haskell/Hydra/Test/TestGraph.hs
+++ b/src/gen-test/haskell/Hydra/Test/TestGraph.hs
@@ -16,40 +16,38 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-testTerms :: (M.Map Core.Name Core.Term)
-testTerms = (Maps.fromList [
-  (Core.Name "testDataArthur", TestTerms.testDataArthur)])
-
-testTypes :: (M.Map Core.Name Core.Type)
-testTypes = (Maps.fromList [
-  (TestTypes.testTypeBuddyListAName, TestTypes.testTypeBuddyListA),
-  (TestTypes.testTypeBuddyListBName, TestTypes.testTypeBuddyListB),
-  (TestTypes.testTypeComparisonName, TestTypes.testTypeComparison),
-  (TestTypes.testTypeEitherName, TestTypes.testTypeEither),
-  (TestTypes.testTypeFlowName, TestTypes.testTypeFlow),
-  (TestTypes.testTypeFlowStateName, TestTypes.testTypeFlowState),
-  (TestTypes.testTypeHydraLiteralTypeName, TestTypes.testTypeHydraLiteralType),
-  (TestTypes.testTypeHydraTypeName, TestTypes.testTypeHydraType),
-  (TestTypes.testTypeIntListName, TestTypes.testTypeIntList),
-  (TestTypes.testTypeLatLonName, TestTypes.testTypeLatLon),
-  (TestTypes.testTypeLatLonPolyName, TestTypes.testTypeLatLonPoly),
-  (TestTypes.testTypeListName, TestTypes.testTypeList),
-  (TestTypes.testTypeNumberName, TestTypes.testTypeNumber),
-  (TestTypes.testTypePersonName, TestTypes.testTypePerson),
-  (TestTypes.testTypePersonOrSomethingName, TestTypes.testTypePersonOrSomething),
-  (TestTypes.testTypePolymorphicWrapperName, TestTypes.testTypePolymorphicWrapper),
-  (TestTypes.testTypeSimpleNumberName, TestTypes.testTypeSimpleNumber),
-  (TestTypes.testTypeStringAliasName, TestTypes.testTypeStringAlias),
-  (TestTypes.testTypeSymmetricTripleName, TestTypes.testTypeSymmetricTriple),
-  (TestTypes.testTypeTimestampName, TestTypes.testTypeTimestamp),
-  (TestTypes.testTypeTraceName, TestTypes.testTypeTrace),
-  (TestTypes.testTypeTripleName, TestTypes.testTypeTriple),
-  (TestTypes.testTypeUnionMonomorphicName, TestTypes.testTypeUnionMonomorphic),
-  (TestTypes.testTypeUnionPolymorphicRecursiveName, TestTypes.testTypeUnionPolymorphicRecursive),
-  (TestTypes.testTypeUnitName, TestTypes.testTypeUnit)])
-
 testNamespace :: Module.Namespace
-testNamespace = (Module.Namespace "testGraph")
+testNamespace = Module.Namespace "testGraph"
 
 testSchemaNamespace :: Module.Namespace
-testSchemaNamespace = (Module.Namespace "testSchemaGraph")
+testSchemaNamespace = Module.Namespace "testSchemaGraph"
+
+testTerms :: M.Map Core.Name Core.Term
+testTerms = Maps.fromList [
+  (Core.Name "testDataArthur", TestTerms.testDataArthur)]
+
+testTypes :: M.Map Core.Name Core.Type
+testTypes =
+    Maps.fromList [
+      (TestTypes.testTypeBuddyListAName, TestTypes.testTypeBuddyListA),
+      (TestTypes.testTypeBuddyListBName, TestTypes.testTypeBuddyListB),
+      (TestTypes.testTypeComparisonName, TestTypes.testTypeComparison),
+      (TestTypes.testTypeEitherName, TestTypes.testTypeEither),
+      (TestTypes.testTypeHydraLiteralTypeName, TestTypes.testTypeHydraLiteralType),
+      (TestTypes.testTypeHydraTypeName, TestTypes.testTypeHydraType),
+      (TestTypes.testTypeIntListName, TestTypes.testTypeIntList),
+      (TestTypes.testTypeLatLonName, TestTypes.testTypeLatLon),
+      (TestTypes.testTypeLatLonPolyName, TestTypes.testTypeLatLonPoly),
+      (TestTypes.testTypeListName, TestTypes.testTypeList),
+      (TestTypes.testTypeNumberName, TestTypes.testTypeNumber),
+      (TestTypes.testTypePersonName, TestTypes.testTypePerson),
+      (TestTypes.testTypePersonOrSomethingName, TestTypes.testTypePersonOrSomething),
+      (TestTypes.testTypePolymorphicWrapperName, TestTypes.testTypePolymorphicWrapper),
+      (TestTypes.testTypeSimpleNumberName, TestTypes.testTypeSimpleNumber),
+      (TestTypes.testTypeStringAliasName, TestTypes.testTypeStringAlias),
+      (TestTypes.testTypeSymmetricTripleName, TestTypes.testTypeSymmetricTriple),
+      (TestTypes.testTypeTimestampName, TestTypes.testTypeTimestamp),
+      (TestTypes.testTypeTripleName, TestTypes.testTypeTriple),
+      (TestTypes.testTypeUnionMonomorphicName, TestTypes.testTypeUnionMonomorphic),
+      (TestTypes.testTypeUnionPolymorphicRecursiveName, TestTypes.testTypeUnionPolymorphicRecursive),
+      (TestTypes.testTypeUnitName, TestTypes.testTypeUnit)]
diff --git a/src/gen-test/haskell/Hydra/Test/TestSuite.hs b/src/gen-test/haskell/Hydra/Test/TestSuite.hs
--- a/src/gen-test/haskell/Hydra/Test/TestSuite.hs
+++ b/src/gen-test/haskell/Hydra/Test/TestSuite.hs
@@ -8,16 +8,14 @@
 import qualified Hydra.Test.Checking.All as All
 import qualified Hydra.Test.EtaExpansion as EtaExpansion
 import qualified Hydra.Test.Formatting as Formatting
-import qualified Hydra.Test.Hoisting as Hoisting
-import qualified Hydra.Test.Inference.All as All_
-import qualified Hydra.Test.Json.Coder as Coder
+import qualified Hydra.Test.Hoisting.All as All_
+import qualified Hydra.Test.Inference.All as All__
 import qualified Hydra.Test.Json.Parser as Parser
 import qualified Hydra.Test.Json.Roundtrip as Roundtrip
 import qualified Hydra.Test.Json.Writer as Writer
 import qualified Hydra.Test.Lib.Chars as Chars
 import qualified Hydra.Test.Lib.Eithers as Eithers
 import qualified Hydra.Test.Lib.Equality as Equality
-import qualified Hydra.Test.Lib.Flows as Flows
 import qualified Hydra.Test.Lib.Lists as Lists
 import qualified Hydra.Test.Lib.Literals as Literals
 import qualified Hydra.Test.Lib.Logic as Logic
@@ -25,15 +23,16 @@
 import qualified Hydra.Test.Lib.Math as Math
 import qualified Hydra.Test.Lib.Maybes as Maybes
 import qualified Hydra.Test.Lib.Pairs as Pairs
+import qualified Hydra.Test.Lib.Regex as Regex
 import qualified Hydra.Test.Lib.Sets as Sets
 import qualified Hydra.Test.Lib.Strings as Strings
-import qualified Hydra.Test.Monads as Monads
 import qualified Hydra.Test.Reduction as Reduction
 import qualified Hydra.Test.Rewriting as Rewriting
 import qualified Hydra.Test.Serialization as Serialization
 import qualified Hydra.Test.Sorting as Sorting
 import qualified Hydra.Test.Substitution as Substitution
 import qualified Hydra.Test.Unification as Unification
+import qualified Hydra.Test.Validate.All as All___
 import qualified Hydra.Testing as Testing
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -44,38 +43,38 @@
 
 -- | The group of all common tests
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "common",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Chars.allTests,
-    Eithers.allTests,
-    Equality.allTests,
-    Flows.allTests,
-    Lists.allTests,
-    Literals.allTests,
-    Logic.allTests,
-    Maps.allTests,
-    Math.allTests,
-    Maybes.allTests,
-    Pairs.allTests,
-    Sets.allTests,
-    Strings.allTests,
-    Annotations.allTests,
-    All.allTests,
-    EtaExpansion.allTests,
-    Formatting.allTests,
-    Hoisting.allTests,
-    All_.allTests,
-    Coder.allTests,
-    Parser.allTests,
-    Roundtrip.allTests,
-    Writer.allTests,
-    Monads.allTests,
-    Reduction.allTests,
-    Rewriting.allTests,
-    Serialization.allTests,
-    Sorting.allTests,
-    Substitution.allTests,
-    Unification.allTests],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "common",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Chars.allTests,
+        Eithers.allTests,
+        Equality.allTests,
+        Lists.allTests,
+        Literals.allTests,
+        Logic.allTests,
+        Maps.allTests,
+        Math.allTests,
+        Maybes.allTests,
+        Pairs.allTests,
+        Regex.allTests,
+        Sets.allTests,
+        Strings.allTests,
+        Annotations.allTests,
+        All.allTests,
+        EtaExpansion.allTests,
+        Formatting.allTests,
+        All_.allTests,
+        All__.allTests,
+        Parser.allTests,
+        Roundtrip.allTests,
+        Writer.allTests,
+        Reduction.allTests,
+        Rewriting.allTests,
+        Serialization.allTests,
+        Sorting.allTests,
+        Substitution.allTests,
+        Unification.allTests,
+        All___.allTests],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/TestTerms.hs b/src/gen-test/haskell/Hydra/Test/TestTerms.hs
--- a/src/gen-test/haskell/Hydra/Test/TestTerms.hs
+++ b/src/gen-test/haskell/Hydra/Test/TestTerms.hs
@@ -13,49 +13,53 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-latlonRecord :: (Float -> Float -> Core.Term)
-latlonRecord lat lon = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = TestTypes.testTypeLatLonName,
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "lat"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 lat)))},
-    Core.Field {
-      Core.fieldName = (Core.Name "lon"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 lon)))}]}))
+latlonRecord :: Float -> Float -> Core.Term
+latlonRecord lat lon =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = TestTypes.testTypeLatLonName,
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "lat"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 lat)))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lon"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralFloat (Core.FloatValueFloat32 lon)))}]})
 
 testDataArthur :: Core.Term
-testDataArthur = (Core.TermRecord (Core.Record {
-  Core.recordTypeName = TestTypes.testTypePersonName,
-  Core.recordFields = [
-    Core.Field {
-      Core.fieldName = (Core.Name "firstName"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Arthur"))},
-    Core.Field {
-      Core.fieldName = (Core.Name "lastName"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Dent"))},
-    Core.Field {
-      Core.fieldName = (Core.Name "age"),
-      Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}]}))
+testDataArthur =
+    Core.TermRecord (Core.Record {
+      Core.recordTypeName = TestTypes.testTypePersonName,
+      Core.recordFields = [
+        Core.Field {
+          Core.fieldName = (Core.Name "firstName"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Arthur"))},
+        Core.Field {
+          Core.fieldName = (Core.Name "lastName"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralString "Dent"))},
+        Core.Field {
+          Core.fieldName = (Core.Name "age"),
+          Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))}]})
 
 testElementArthur :: Core.Binding
-testElementArthur = Core.Binding {
-  Core.bindingName = (Core.Name "firstName"),
-  Core.bindingTerm = testDataArthur,
-  Core.bindingType = (Just (Core.TypeScheme {
-    Core.typeSchemeVariables = [],
-    Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypePersonName),
-    Core.typeSchemeConstraints = Nothing}))}
+testElementArthur =
+    Core.Binding {
+      Core.bindingName = (Core.Name "firstName"),
+      Core.bindingTerm = testDataArthur,
+      Core.bindingType = (Just (Core.TypeScheme {
+        Core.typeSchemeVariables = [],
+        Core.typeSchemeType = (Core.TypeVariable TestTypes.testTypePersonName),
+        Core.typeSchemeConstraints = Nothing}))}
 
 testElementFirstName :: Core.Binding
-testElementFirstName = Core.Binding {
-  Core.bindingName = (Core.Name "firstName"),
-  Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
-    Core.projectionTypeName = TestTypes.testTypePersonName,
-    Core.projectionField = (Core.Name "firstName")})))),
-  Core.bindingType = (Just (Core.TypeScheme {
-    Core.typeSchemeVariables = [],
-    Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
-      Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypePersonName),
-      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-    Core.typeSchemeConstraints = Nothing}))}
+testElementFirstName =
+    Core.Binding {
+      Core.bindingName = (Core.Name "firstName"),
+      Core.bindingTerm = (Core.TermFunction (Core.FunctionElimination (Core.EliminationRecord (Core.Projection {
+        Core.projectionTypeName = TestTypes.testTypePersonName,
+        Core.projectionField = (Core.Name "firstName")})))),
+      Core.bindingType = (Just (Core.TypeScheme {
+        Core.typeSchemeVariables = [],
+        Core.typeSchemeType = (Core.TypeFunction (Core.FunctionType {
+          Core.functionTypeDomain = (Core.TypeVariable TestTypes.testTypePersonName),
+          Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+        Core.typeSchemeConstraints = Nothing}))}
diff --git a/src/gen-test/haskell/Hydra/Test/TestTypes.hs b/src/gen-test/haskell/Hydra/Test/TestTypes.hs
--- a/src/gen-test/haskell/Hydra/Test/TestTypes.hs
+++ b/src/gen-test/haskell/Hydra/Test/TestTypes.hs
@@ -4,7 +4,6 @@
 
 module Hydra.Test.TestTypes where
 
-import qualified Hydra.Compute as Compute
 import qualified Hydra.Core as Core
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
 import qualified Data.ByteString as B
@@ -13,484 +12,401 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 
-testTypeBuddyListA :: Core.Type
-testTypeBuddyListA = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-    Core.rowTypeTypeName = testTypeBuddyListAName,
-    Core.rowTypeFields = [
-      Core.FieldType {
-        Core.fieldTypeName = (Core.Name "head"),
-        Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
-      Core.FieldType {
-        Core.fieldTypeName = (Core.Name "tail"),
-        Core.fieldTypeType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable testTypeBuddyListBName),
-          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})))}]}))}))
+compareStringsType :: Core.Type
+compareStringsType =
+    Core.TypeFunction (Core.FunctionType {
+      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})
 
-testTypeBuddyListAName :: Core.Name
-testTypeBuddyListAName = (Core.Name "BuddyListA")
+concatType :: Core.Type
+concatType =
+    Core.TypeFunction (Core.FunctionType {
+      Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+      Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
+        Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
+        Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))})
 
-testTypeBuddyListB :: Core.Type
-testTypeBuddyListB = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-    Core.rowTypeTypeName = testTypeBuddyListBName,
-    Core.rowTypeFields = [
+eitherStringOrInt8Type :: Core.Type
+eitherStringOrInt8Type =
+    Core.TypeUnion [
       Core.FieldType {
-        Core.fieldTypeName = (Core.Name "head"),
-        Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+        Core.fieldTypeName = (Core.Name "left"),
+        Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
       Core.FieldType {
-        Core.fieldTypeName = (Core.Name "tail"),
-        Core.fieldTypeType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable testTypeBuddyListAName),
-          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})))}]}))}))
+        Core.fieldTypeName = (Core.Name "right"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8))}]
 
-testTypeBuddyListBName :: Core.Name
-testTypeBuddyListBName = (Core.Name "BuddyListB")
+eitherStringOrInt8TypeName :: Core.Name
+eitherStringOrInt8TypeName = Core.Name "EitherStringOrInt8"
 
-testTypeComparison :: Core.Type
-testTypeComparison = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = testTypeComparisonName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "lessThan"),
-      Core.fieldTypeType = Core.TypeUnit},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "equalTo"),
-      Core.fieldTypeType = Core.TypeUnit},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "greaterThan"),
-      Core.fieldTypeType = Core.TypeUnit}]}))
+exampleProjectionType :: Core.Type
+exampleProjectionType =
+    Core.TypeFunction (Core.FunctionType {
+      Core.functionTypeDomain = (Core.TypeVariable testTypePersonName),
+      Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})
 
-testTypeComparisonName :: Core.Name
-testTypeComparisonName = (Core.Name "Comparison")
+listOfInt16sType :: Core.Type
+listOfInt16sType = Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16))
 
-testTypeEither :: Core.Type
-testTypeEither = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-    Core.forallTypeParameter = (Core.Name "b"),
-    Core.forallTypeBody = (Core.TypeUnion (Core.RowType {
-      Core.rowTypeTypeName = testTypeEitherName,
-      Core.rowTypeFields = [
+listOfInt8sType :: Core.Type
+listOfInt8sType = Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8))
+
+listOfListsOfStringsType :: Core.Type
+listOfListsOfStringsType = Core.TypeList (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))
+
+listOfSetOfStringsType :: Core.Type
+listOfSetOfStringsType = Core.TypeList (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString))
+
+listOfStringsType :: Core.Type
+listOfStringsType = Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)
+
+mapOfStringsToIntsType :: Core.Type
+mapOfStringsToIntsType =
+    Core.TypeMap (Core.MapType {
+      Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+      Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})
+
+optionalInt16Type :: Core.Type
+optionalInt16Type = Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16))
+
+optionalInt8Type :: Core.Type
+optionalInt8Type = Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8))
+
+optionalStringType :: Core.Type
+optionalStringType = Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString)
+
+setOfStringsType :: Core.Type
+setOfStringsType = Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString)
+
+stringOrIntName :: Core.Name
+stringOrIntName = Core.Name "StringOrInt"
+
+stringOrIntType :: Core.Type
+stringOrIntType =
+    Core.TypeUnion [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "left"),
+        Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "right"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}]
+
+testTypeBuddyListA :: Core.Type
+testTypeBuddyListA =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeRecord [
         Core.FieldType {
-          Core.fieldTypeName = (Core.Name "left"),
+          Core.fieldTypeName = (Core.Name "head"),
           Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
         Core.FieldType {
-          Core.fieldTypeName = (Core.Name "right"),
-          Core.fieldTypeType = (Core.TypeVariable (Core.Name "b"))}]}))}))}))
+          Core.fieldTypeName = (Core.Name "tail"),
+          Core.fieldTypeType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+            Core.applicationTypeFunction = (Core.TypeVariable testTypeBuddyListBName),
+            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})))}])})
 
-testTypeEitherName :: Core.Name
-testTypeEitherName = (Core.Name "Either")
+testTypeBuddyListAName :: Core.Name
+testTypeBuddyListAName = Core.Name "BuddyListA"
 
-testTypeFlow :: Core.Type
-testTypeFlow = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "s"),
-  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-    Core.forallTypeParameter = (Core.Name "a"),
-    Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = testTypeFlowName,
-      Core.rowTypeFields = [
+testTypeBuddyListB :: Core.Type
+testTypeBuddyListB =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeRecord [
         Core.FieldType {
-          Core.fieldTypeName = (Core.Name "value"),
-          Core.fieldTypeType = (Core.TypeFunction (Core.FunctionType {
-            Core.functionTypeDomain = (Core.TypeVariable (Core.Name "s")),
-            Core.functionTypeCodomain = (Core.TypeApplication (Core.ApplicationType {
-              Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-                Core.applicationTypeFunction = (Core.TypeVariable testTypeFlowStateName),
-                Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "s"))})),
-              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}))}]}))}))}))
+          Core.fieldTypeName = (Core.Name "head"),
+          Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "tail"),
+          Core.fieldTypeType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+            Core.applicationTypeFunction = (Core.TypeVariable testTypeBuddyListAName),
+            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})))}])})
 
-testTypeFlowName :: Core.Name
-testTypeFlowName = (Core.Name "hydra.compute.Flow")
+testTypeBuddyListBName :: Core.Name
+testTypeBuddyListBName = Core.Name "BuddyListB"
 
-testTypeFlowState :: Core.Type
-testTypeFlowState = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "s"),
-  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-    Core.forallTypeParameter = (Core.Name "a"),
-    Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-      Core.rowTypeTypeName = testTypeFlowStateName,
-      Core.rowTypeFields = [
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "value"),
-          Core.fieldTypeType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a")))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "state"),
-          Core.fieldTypeType = (Core.TypeVariable (Core.Name "s"))},
-        Core.FieldType {
-          Core.fieldTypeName = (Core.Name "trace"),
-          Core.fieldTypeType = (Core.TypeVariable testTypeTraceName)}]}))}))}))
+testTypeComparison :: Core.Type
+testTypeComparison =
+    Core.TypeUnion [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "lessThan"),
+        Core.fieldTypeType = Core.TypeUnit},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "equalTo"),
+        Core.fieldTypeType = Core.TypeUnit},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "greaterThan"),
+        Core.fieldTypeType = Core.TypeUnit}]
 
-testTypeFlowStateName :: Core.Name
-testTypeFlowStateName = (Core.Name "hydra.compute.FlowState")
+testTypeComparisonName :: Core.Name
+testTypeComparisonName = Core.Name "Comparison"
 
+testTypeEither :: Core.Type
+testTypeEither =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+        Core.forallTypeParameter = (Core.Name "b"),
+        Core.forallTypeBody = (Core.TypeUnion [
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "left"),
+            Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+          Core.FieldType {
+            Core.fieldTypeName = (Core.Name "right"),
+            Core.fieldTypeType = (Core.TypeVariable (Core.Name "b"))}])}))})
+
+testTypeEitherName :: Core.Name
+testTypeEitherName = Core.Name "Either"
+
 testTypeHydraLiteralType :: Core.Type
-testTypeHydraLiteralType = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = testTypeHydraLiteralTypeName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "boolean"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeBoolean)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "string"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)}]}))
+testTypeHydraLiteralType =
+    Core.TypeUnion [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "boolean"),
+        Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeBoolean)},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "string"),
+        Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)}]
 
 testTypeHydraLiteralTypeName :: Core.Name
-testTypeHydraLiteralTypeName = (Core.Name "HydraLiteralType")
+testTypeHydraLiteralTypeName = Core.Name "HydraLiteralType"
 
 testTypeHydraType :: Core.Type
-testTypeHydraType = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = testTypeHydraTypeName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "literal"),
-      Core.fieldTypeType = (Core.TypeVariable testTypeHydraLiteralTypeName)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "list"),
-      Core.fieldTypeType = (Core.TypeVariable testTypeHydraTypeName)}]}))
+testTypeHydraType =
+    Core.TypeUnion [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "literal"),
+        Core.fieldTypeType = (Core.TypeVariable testTypeHydraLiteralTypeName)},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "list"),
+        Core.fieldTypeType = (Core.TypeVariable testTypeHydraTypeName)}]
 
 testTypeHydraTypeName :: Core.Name
-testTypeHydraTypeName = (Core.Name "HydraType")
+testTypeHydraTypeName = Core.Name "HydraType"
 
 testTypeIntList :: Core.Type
-testTypeIntList = (Core.TypeRecord (Core.RowType {
-  Core.rowTypeTypeName = testTypeIntListName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "head"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "tail"),
-      Core.fieldTypeType = (Core.TypeMaybe (Core.TypeVariable testTypeIntListName))}]}))
+testTypeIntList =
+    Core.TypeRecord [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "head"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "tail"),
+        Core.fieldTypeType = (Core.TypeMaybe (Core.TypeVariable testTypeIntListName))}]
 
 testTypeIntListName :: Core.Name
-testTypeIntListName = (Core.Name "IntList")
+testTypeIntListName = Core.Name "IntList"
 
 testTypeLatLon :: Core.Type
-testTypeLatLon = (Core.TypeRecord (Core.RowType {
-  Core.rowTypeTypeName = testTypeLatLonName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "lat"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "lon"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}]}))
-
-testTypeLatLonName :: Core.Name
-testTypeLatLonName = (Core.Name "LatLon")
-
-testTypeLatLonPoly :: Core.Type
-testTypeLatLonPoly = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-    Core.rowTypeTypeName = testTypeLatLonPolyName,
-    Core.rowTypeFields = [
+testTypeLatLon =
+    Core.TypeRecord [
       Core.FieldType {
         Core.fieldTypeName = (Core.Name "lat"),
-        Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))},
       Core.FieldType {
         Core.fieldTypeName = (Core.Name "lon"),
-        Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))}]}))}))
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}]
 
+testTypeLatLonName :: Core.Name
+testTypeLatLonName = Core.Name "LatLon"
+
+testTypeLatLonPoly :: Core.Type
+testTypeLatLonPoly =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeRecord [
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "lat"),
+          Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "lon"),
+          Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))}])})
+
 testTypeLatLonPolyName :: Core.Name
-testTypeLatLonPolyName = (Core.Name "LatLonPoly")
+testTypeLatLonPolyName = Core.Name "LatLonPoly"
 
 testTypeList :: Core.Type
-testTypeList = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-    Core.rowTypeTypeName = testTypeListName,
-    Core.rowTypeFields = [
-      Core.FieldType {
-        Core.fieldTypeName = (Core.Name "head"),
-        Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
-      Core.FieldType {
-        Core.fieldTypeName = (Core.Name "tail"),
-        Core.fieldTypeType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable testTypeListName),
-          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})))}]}))}))
+testTypeList =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeRecord [
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "head"),
+          Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "tail"),
+          Core.fieldTypeType = (Core.TypeMaybe (Core.TypeApplication (Core.ApplicationType {
+            Core.applicationTypeFunction = (Core.TypeVariable testTypeListName),
+            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))})))}])})
 
 testTypeListName :: Core.Name
-testTypeListName = (Core.Name "List")
+testTypeListName = Core.Name "List"
 
+testTypeName :: Core.Name
+testTypeName = Core.Name "Test"
+
 testTypeNumber :: Core.Type
-testTypeNumber = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = testTypeNumberName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "int"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "float"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}]}))
+testTypeNumber =
+    Core.TypeUnion [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "int"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "float"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}]
 
 testTypeNumberName :: Core.Name
-testTypeNumberName = (Core.Name "Number")
+testTypeNumberName = Core.Name "Number"
 
 testTypePerson :: Core.Type
-testTypePerson = (Core.TypeRecord (Core.RowType {
-  Core.rowTypeTypeName = testTypePersonName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "firstName"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "lastName"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "age"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}]}))
+testTypePerson =
+    Core.TypeRecord [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "firstName"),
+        Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "lastName"),
+        Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "age"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}]
 
 testTypePersonName :: Core.Name
-testTypePersonName = (Core.Name "Person")
+testTypePersonName = Core.Name "Person"
 
 testTypePersonOrSomething :: Core.Type
-testTypePersonOrSomething = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeUnion (Core.RowType {
-    Core.rowTypeTypeName = testTypePersonOrSomethingName,
-    Core.rowTypeFields = [
-      Core.FieldType {
-        Core.fieldTypeName = (Core.Name "person"),
-        Core.fieldTypeType = (Core.TypeVariable testTypePersonName)},
-      Core.FieldType {
-        Core.fieldTypeName = (Core.Name "other"),
-        Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))}]}))}))
+testTypePersonOrSomething =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeUnion [
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "person"),
+          Core.fieldTypeType = (Core.TypeVariable testTypePersonName)},
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "other"),
+          Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))}])})
 
 testTypePersonOrSomethingName :: Core.Name
-testTypePersonOrSomethingName = (Core.Name "PersonOrSomething")
+testTypePersonOrSomethingName = Core.Name "PersonOrSomething"
 
 testTypePolymorphicWrapper :: Core.Type
-testTypePolymorphicWrapper = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeWrap (Core.WrappedType {
-    Core.wrappedTypeTypeName = testTypePolymorphicWrapperName,
-    Core.wrappedTypeBody = (Core.TypeList (Core.TypeVariable (Core.Name "a")))}))}))
+testTypePolymorphicWrapper =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeWrap (Core.TypeList (Core.TypeVariable (Core.Name "a"))))})
 
 testTypePolymorphicWrapperName :: Core.Name
-testTypePolymorphicWrapperName = (Core.Name "PolymorphicWrapper")
+testTypePolymorphicWrapperName = Core.Name "PolymorphicWrapper"
 
 testTypeSimpleNumber :: Core.Type
-testTypeSimpleNumber = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = testTypeSimpleNumberName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "int"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "float"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}]}))
+testTypeSimpleNumber =
+    Core.TypeUnion [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "int"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "float"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeFloat Core.FloatTypeFloat32))}]
 
 testTypeSimpleNumberName :: Core.Name
-testTypeSimpleNumberName = (Core.Name "SimpleNumber")
+testTypeSimpleNumberName = Core.Name "SimpleNumber"
 
 testTypeStringAlias :: Core.Type
-testTypeStringAlias = (Core.TypeWrap (Core.WrappedType {
-  Core.wrappedTypeTypeName = testTypeStringAliasName,
-  Core.wrappedTypeBody = (Core.TypeLiteral Core.LiteralTypeString)}))
+testTypeStringAlias = Core.TypeWrap (Core.TypeLiteral Core.LiteralTypeString)
 
 testTypeStringAliasName :: Core.Name
-testTypeStringAliasName = (Core.Name "StringAlias")
+testTypeStringAliasName = Core.Name "StringAlias"
 
 testTypeSymmetricTriple :: Core.Type
-testTypeSymmetricTriple = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "v"),
-  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-    Core.forallTypeParameter = (Core.Name "e"),
-    Core.forallTypeBody = (Core.TypeWrap (Core.WrappedType {
-      Core.wrappedTypeTypeName = testTypeSymmetricTripleName,
-      Core.wrappedTypeBody = (Core.TypeApplication (Core.ApplicationType {
-        Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+testTypeSymmetricTriple =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "v"),
+      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+        Core.forallTypeParameter = (Core.Name "e"),
+        Core.forallTypeBody = (Core.TypeWrap (Core.TypeApplication (Core.ApplicationType {
           Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
-            Core.applicationTypeFunction = (Core.TypeVariable testTypeTripleName),
-            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
-          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "e"))})),
-        Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))}))}))}))}))
+            Core.applicationTypeFunction = (Core.TypeApplication (Core.ApplicationType {
+              Core.applicationTypeFunction = (Core.TypeVariable testTypeTripleName),
+              Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})),
+            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "e"))})),
+          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "v"))})))}))})
 
 testTypeSymmetricTripleName :: Core.Name
-testTypeSymmetricTripleName = (Core.Name "SymmetricTriple")
+testTypeSymmetricTripleName = Core.Name "SymmetricTriple"
 
 testTypeTimestamp :: Core.Type
-testTypeTimestamp = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = testTypeTimestampName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "unixTimeMillis"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64))},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "date"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)}]}))
+testTypeTimestamp =
+    Core.TypeUnion [
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "unixTimeMillis"),
+        Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeUint64))},
+      Core.FieldType {
+        Core.fieldTypeName = (Core.Name "date"),
+        Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)}]
 
 testTypeTimestampName :: Core.Name
-testTypeTimestampName = (Core.Name "Timestamp")
-
-testTypeTrace :: Core.Type
-testTypeTrace = (Core.TypeRecord (Core.RowType {
-  Core.rowTypeTypeName = testTypeTraceName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "stack"),
-      Core.fieldTypeType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "messages"),
-      Core.fieldTypeType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "other"),
-      Core.fieldTypeType = (Core.TypeMap (Core.MapType {
-        Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-        Core.mapTypeValues = (Core.TypeLiteral Core.LiteralTypeString)}))}]}))
-
-testTypeTraceName :: Core.Name
-testTypeTraceName = (Core.Name "hydra.compute.Trace")
+testTypeTimestampName = Core.Name "Timestamp"
 
 testTypeTriple :: Core.Type
-testTypeTriple = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-    Core.forallTypeParameter = (Core.Name "b"),
-    Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
-      Core.forallTypeParameter = (Core.Name "c"),
-      Core.forallTypeBody = (Core.TypeRecord (Core.RowType {
-        Core.rowTypeTypeName = testTypeTripleName,
-        Core.rowTypeFields = [
-          Core.FieldType {
-            Core.fieldTypeName = (Core.Name "first"),
-            Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
-          Core.FieldType {
-            Core.fieldTypeName = (Core.Name "second"),
-            Core.fieldTypeType = (Core.TypeVariable (Core.Name "b"))},
-          Core.FieldType {
-            Core.fieldTypeName = (Core.Name "third"),
-            Core.fieldTypeType = (Core.TypeVariable (Core.Name "c"))}]}))}))}))}))
+testTypeTriple =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+        Core.forallTypeParameter = (Core.Name "b"),
+        Core.forallTypeBody = (Core.TypeForall (Core.ForallType {
+          Core.forallTypeParameter = (Core.Name "c"),
+          Core.forallTypeBody = (Core.TypeRecord [
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "first"),
+              Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "second"),
+              Core.fieldTypeType = (Core.TypeVariable (Core.Name "b"))},
+            Core.FieldType {
+              Core.fieldTypeName = (Core.Name "third"),
+              Core.fieldTypeType = (Core.TypeVariable (Core.Name "c"))}])}))}))})
 
 testTypeTripleName :: Core.Name
-testTypeTripleName = (Core.Name "Triple")
+testTypeTripleName = Core.Name "Triple"
 
 testTypeUnionMonomorphic :: Core.Type
-testTypeUnionMonomorphic = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = testTypeUnionMonomorphicName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "bool"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeBoolean)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "string"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "unit"),
-      Core.fieldTypeType = Core.TypeUnit}]}))
-
-testTypeUnionMonomorphicName :: Core.Name
-testTypeUnionMonomorphicName = (Core.Name "UnionMonomorphic")
-
-testTypeUnionPolymorphicRecursive :: Core.Type
-testTypeUnionPolymorphicRecursive = (Core.TypeForall (Core.ForallType {
-  Core.forallTypeParameter = (Core.Name "a"),
-  Core.forallTypeBody = (Core.TypeUnion (Core.RowType {
-    Core.rowTypeTypeName = testTypeUnionPolymorphicRecursiveName,
-    Core.rowTypeFields = [
+testTypeUnionMonomorphic =
+    Core.TypeUnion [
       Core.FieldType {
         Core.fieldTypeName = (Core.Name "bool"),
         Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeBoolean)},
       Core.FieldType {
-        Core.fieldTypeName = (Core.Name "value"),
-        Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+        Core.fieldTypeName = (Core.Name "string"),
+        Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
       Core.FieldType {
-        Core.fieldTypeName = (Core.Name "other"),
-        Core.fieldTypeType = (Core.TypeApplication (Core.ApplicationType {
-          Core.applicationTypeFunction = (Core.TypeVariable testTypeUnionPolymorphicRecursiveName),
-          Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}]}))}))
+        Core.fieldTypeName = (Core.Name "unit"),
+        Core.fieldTypeType = Core.TypeUnit}]
 
+testTypeUnionMonomorphicName :: Core.Name
+testTypeUnionMonomorphicName = Core.Name "UnionMonomorphic"
+
+testTypeUnionPolymorphicRecursive :: Core.Type
+testTypeUnionPolymorphicRecursive =
+    Core.TypeForall (Core.ForallType {
+      Core.forallTypeParameter = (Core.Name "a"),
+      Core.forallTypeBody = (Core.TypeUnion [
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "bool"),
+          Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeBoolean)},
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "value"),
+          Core.fieldTypeType = (Core.TypeVariable (Core.Name "a"))},
+        Core.FieldType {
+          Core.fieldTypeName = (Core.Name "other"),
+          Core.fieldTypeType = (Core.TypeApplication (Core.ApplicationType {
+            Core.applicationTypeFunction = (Core.TypeVariable testTypeUnionPolymorphicRecursiveName),
+            Core.applicationTypeArgument = (Core.TypeVariable (Core.Name "a"))}))}])})
+
 testTypeUnionPolymorphicRecursiveName :: Core.Name
-testTypeUnionPolymorphicRecursiveName = (Core.Name "UnionPolymorphicRecursive")
+testTypeUnionPolymorphicRecursiveName = Core.Name "UnionPolymorphicRecursive"
 
 testTypeUnit :: Core.Type
-testTypeUnit = (Core.TypeRecord (Core.RowType {
-  Core.rowTypeTypeName = testTypeUnitName,
-  Core.rowTypeFields = []}))
+testTypeUnit = Core.TypeRecord []
 
 testTypeUnitName :: Core.Name
-testTypeUnitName = (Core.Name "Unit")
-
-concatType :: Core.Type
-concatType = (Core.TypeFunction (Core.FunctionType {
-  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-  Core.functionTypeCodomain = (Core.TypeFunction (Core.FunctionType {
-    Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-    Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))}))
-
-compareStringsType :: Core.Type
-compareStringsType = (Core.TypeFunction (Core.FunctionType {
-  Core.functionTypeDomain = (Core.TypeLiteral Core.LiteralTypeString),
-  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))
-
-eitherStringOrInt8TypeName :: Core.Name
-eitherStringOrInt8TypeName = (Core.Name "EitherStringOrInt8")
-
-eitherStringOrInt8Type :: Core.Type
-eitherStringOrInt8Type = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = eitherStringOrInt8TypeName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "left"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "right"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8))}]}))
-
-exampleProjectionType :: Core.Type
-exampleProjectionType = (Core.TypeFunction (Core.FunctionType {
-  Core.functionTypeDomain = (Core.TypeVariable testTypePersonName),
-  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)}))
-
-listOfInt8sType :: Core.Type
-listOfInt8sType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)))
-
-listOfInt16sType :: Core.Type
-listOfInt16sType = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16)))
-
-listOfListsOfStringsType :: Core.Type
-listOfListsOfStringsType = (Core.TypeList (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)))
-
-listOfSetOfStringsType :: Core.Type
-listOfSetOfStringsType = (Core.TypeList (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString)))
-
-listOfStringsType :: Core.Type
-listOfStringsType = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString))
-
-mapOfStringsToIntsType :: Core.Type
-mapOfStringsToIntsType = (Core.TypeMap (Core.MapType {
-  Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}))
-
-optionalInt8Type :: Core.Type
-optionalInt8Type = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt8)))
-
-optionalInt16Type :: Core.Type
-optionalInt16Type = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt16)))
-
-optionalStringType :: Core.Type
-optionalStringType = (Core.TypeMaybe (Core.TypeLiteral Core.LiteralTypeString))
-
-setOfStringsType :: Core.Type
-setOfStringsType = (Core.TypeSet (Core.TypeLiteral Core.LiteralTypeString))
-
-stringOrIntName :: Core.Name
-stringOrIntName = (Core.Name "StringOrInt")
-
-stringOrIntType :: Core.Type
-stringOrIntType = (Core.TypeUnion (Core.RowType {
-  Core.rowTypeTypeName = stringOrIntName,
-  Core.rowTypeFields = [
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "left"),
-      Core.fieldTypeType = (Core.TypeLiteral Core.LiteralTypeString)},
-    Core.FieldType {
-      Core.fieldTypeName = (Core.Name "right"),
-      Core.fieldTypeType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))}]}))
-
-testTypeName :: Core.Name
-testTypeName = (Core.Name "Test")
+testTypeUnitName = Core.Name "Unit"
diff --git a/src/gen-test/haskell/Hydra/Test/Unification.hs b/src/gen-test/haskell/Hydra/Test/Unification.hs
--- a/src/gen-test/haskell/Hydra/Test/Unification.hs
+++ b/src/gen-test/haskell/Hydra/Test/Unification.hs
@@ -16,620 +16,621 @@
 
 -- | Test cases for type unification operations
 allTests :: Testing.TestGroup
-allTests = Testing.TestGroup {
-  Testing.testGroupName = "unification",
-  Testing.testGroupDescription = Nothing,
-  Testing.testGroupSubgroups = [
-    Testing.TestGroup {
-      Testing.testGroupName = "variableOccursInType",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in itself",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeVariable (Core.Name "a")),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable does not occur in different variable",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeVariable (Core.Name "b")),
-            Testing.variableOccursInTypeTestCaseExpected = False})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable does not occur in int32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.variableOccursInTypeTestCaseExpected = False})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable does not occur in string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.variableOccursInTypeTestCaseExpected = False})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in list element type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable does not occur in list of different type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeList (Core.TypeVariable (Core.Name "b"))),
-            Testing.variableOccursInTypeTestCaseExpected = False})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in function domain",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in function codomain",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable does not occur in function with different vars",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "c"))})),
-            Testing.variableOccursInTypeTestCaseExpected = False})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in optional type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a"))),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in pair first",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
-              Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in pair second",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "a"))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in either left",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "a")),
-              Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in either right",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in map key type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "a")),
-              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in map value type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "a"))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in set type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeSet (Core.TypeVariable (Core.Name "a"))),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in nested list",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "a")))),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in list of functions",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable does not occur in complex type without it",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))})))})),
-            Testing.variableOccursInTypeTestCaseExpected = False})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs deep in complex type",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypePair (Core.PairType {
-                Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
-                Core.pairTypeSecond = (Core.TypeVariable (Core.Name "a"))})))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in forAll body",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "b"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "variable occurs in forAll bound position",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
-            Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
-            Testing.variableOccursInTypeTestCaseType = (Core.TypeForall (Core.ForallType {
-              Core.forallTypeParameter = (Core.Name "a"),
-              Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
-                Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-                Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
-            Testing.variableOccursInTypeTestCaseExpected = True})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "unifyTypes",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify identical int32 types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.unifyTypesTestCaseRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify identical string types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.unifyTypesTestCaseRight = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify identical variable types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeVariable (Core.Name "a")),
-            Testing.unifyTypesTestCaseRight = (Core.TypeVariable (Core.Name "a")),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify variable with int32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeVariable (Core.Name "a")),
-            Testing.unifyTypesTestCaseRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify int32 with variable",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.unifyTypesTestCaseRight = (Core.TypeVariable (Core.Name "a")),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify two different variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeVariable (Core.Name "a")),
-            Testing.unifyTypesTestCaseRight = (Core.TypeVariable (Core.Name "b")),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeVariable (Core.Name "b")))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify list of variables with list of int32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
-            Testing.unifyTypesTestCaseRight = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify identical list types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.unifyTypesTestCaseRight = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify function types with variables",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-            Testing.unifyTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify identical function types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.unifyTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify optional types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a"))),
-            Testing.unifyTypesTestCaseRight = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify pair types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
-              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))})),
-            Testing.unifyTypesTestCaseRight = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify either types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "a")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "b"))})),
-            Testing.unifyTypesTestCaseRight = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-              (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify map types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "k")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "v"))})),
-            Testing.unifyTypesTestCaseRight = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "k", (Core.TypeLiteral Core.LiteralTypeString)),
-              (Core.Name "v", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify set types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeSet (Core.TypeVariable (Core.Name "a"))),
-            Testing.unifyTypesTestCaseRight = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
-              (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "unify unit types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = Core.TypeUnit,
-            Testing.unifyTypesTestCaseRight = Core.TypeUnit,
-            Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "fail to unify int32 with string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.unifyTypesTestCaseRight = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.unifyTypesTestCaseExpected = (Left "cannot unify")})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "fail to unify list with function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.unifyTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.unifyTypesTestCaseExpected = (Left "cannot unify")})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "occur check: variable with list containing it",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
-            Testing.unifyTypesTestCaseSchemaTypes = [],
-            Testing.unifyTypesTestCaseLeft = (Core.TypeVariable (Core.Name "a")),
-            Testing.unifyTypesTestCaseRight = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
-            Testing.unifyTypesTestCaseExpected = (Left "appears free")})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]},
-    Testing.TestGroup {
-      Testing.testGroupName = "joinTypes",
-      Testing.testGroupDescription = Nothing,
-      Testing.testGroupSubgroups = [],
-      Testing.testGroupCases = [
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join identical int32",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.joinTypesTestCaseRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.joinTypesTestCaseExpected = (Right [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join identical string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.joinTypesTestCaseRight = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.joinTypesTestCaseExpected = (Right [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join list types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
-            Testing.joinTypesTestCaseRight = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.joinTypesTestCaseExpected = (Right [
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
-                Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Typing.typeConstraintComment = "join types; test"}])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join function types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
-              Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
-            Testing.joinTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.joinTypesTestCaseExpected = (Right [
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
-                Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Typing.typeConstraintComment = "join types; test"},
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "b")),
-                Typing.typeConstraintRight = (Core.TypeLiteral Core.LiteralTypeString),
-                Typing.typeConstraintComment = "join types; test"}])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join optional types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a"))),
-            Testing.joinTypesTestCaseRight = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.joinTypesTestCaseExpected = (Right [
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
-                Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Typing.typeConstraintComment = "join types; test"}])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join pair types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
-              Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))})),
-            Testing.joinTypesTestCaseRight = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.joinTypesTestCaseExpected = (Right [
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
-                Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Typing.typeConstraintComment = "join types; test"},
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "b")),
-                Typing.typeConstraintRight = (Core.TypeLiteral Core.LiteralTypeString),
-                Typing.typeConstraintComment = "join types; test"}])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join either types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "a")),
-              Core.eitherTypeRight = (Core.TypeVariable (Core.Name "b"))})),
-            Testing.joinTypesTestCaseRight = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.joinTypesTestCaseExpected = (Right [
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
-                Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Typing.typeConstraintComment = "join types; test"},
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "b")),
-                Typing.typeConstraintRight = (Core.TypeLiteral Core.LiteralTypeString),
-                Typing.typeConstraintComment = "join types; test"}])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join map types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeVariable (Core.Name "k")),
-              Core.mapTypeValues = (Core.TypeVariable (Core.Name "v"))})),
-            Testing.joinTypesTestCaseRight = (Core.TypeMap (Core.MapType {
-              Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
-              Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.joinTypesTestCaseExpected = (Right [
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "k")),
-                Typing.typeConstraintRight = (Core.TypeLiteral Core.LiteralTypeString),
-                Typing.typeConstraintComment = "join types; test"},
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "v")),
-                Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Typing.typeConstraintComment = "join types; test"}])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join set types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeSet (Core.TypeVariable (Core.Name "a"))),
-            Testing.joinTypesTestCaseRight = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.joinTypesTestCaseExpected = (Right [
-              Typing.TypeConstraint {
-                Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
-                Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-                Typing.typeConstraintComment = "join types; test"}])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "join unit types",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = Core.TypeUnit,
-            Testing.joinTypesTestCaseRight = Core.TypeUnit,
-            Testing.joinTypesTestCaseExpected = (Right [])})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "fail to join int32 with string",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-            Testing.joinTypesTestCaseRight = (Core.TypeLiteral Core.LiteralTypeString),
-            Testing.joinTypesTestCaseExpected = (Left ())})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "fail to join list with function",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
-            Testing.joinTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
-              Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
-            Testing.joinTypesTestCaseExpected = (Left ())})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []},
-        Testing.TestCaseWithMetadata {
-          Testing.testCaseWithMetadataName = "fail to join pair with either",
-          Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
-            Testing.joinTypesTestCaseLeft = (Core.TypePair (Core.PairType {
-              Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.joinTypesTestCaseRight = (Core.TypeEither (Core.EitherType {
-              Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
-              Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
-            Testing.joinTypesTestCaseExpected = (Left ())})),
-          Testing.testCaseWithMetadataDescription = Nothing,
-          Testing.testCaseWithMetadataTags = []}]}],
-  Testing.testGroupCases = []}
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "unification",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Testing.TestGroup {
+          Testing.testGroupName = "variableOccursInType",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in itself",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeVariable (Core.Name "a")),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable does not occur in different variable",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeVariable (Core.Name "b")),
+                Testing.variableOccursInTypeTestCaseExpected = False})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable does not occur in int32",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.variableOccursInTypeTestCaseExpected = False})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable does not occur in string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.variableOccursInTypeTestCaseExpected = False})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in list element type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable does not occur in list of different type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeList (Core.TypeVariable (Core.Name "b"))),
+                Testing.variableOccursInTypeTestCaseExpected = False})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in function domain",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in function codomain",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable does not occur in function with different vars",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "c"))})),
+                Testing.variableOccursInTypeTestCaseExpected = False})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in optional type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a"))),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in pair first",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
+                  Core.pairTypeSecond = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in pair second",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "a"))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in either left",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "a")),
+                  Core.eitherTypeRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in either right",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "a"))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in map key type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "a")),
+                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in map value type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "a"))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in set type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeSet (Core.TypeVariable (Core.Name "a"))),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in nested list",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeList (Core.TypeList (Core.TypeVariable (Core.Name "a")))),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in list of functions",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeList (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable does not occur in complex type without it",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))})))})),
+                Testing.variableOccursInTypeTestCaseExpected = False})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs deep in complex type",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  Core.functionTypeCodomain = (Core.TypeMaybe (Core.TypePair (Core.PairType {
+                    Core.pairTypeFirst = (Core.TypeLiteral Core.LiteralTypeString),
+                    Core.pairTypeSecond = (Core.TypeVariable (Core.Name "a"))})))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in forAll body",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "b"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "b")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "variable occurs in forAll bound position",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseVariableOccursInType (Testing.VariableOccursInTypeTestCase {
+                Testing.variableOccursInTypeTestCaseVariable = (Core.Name "a"),
+                Testing.variableOccursInTypeTestCaseType = (Core.TypeForall (Core.ForallType {
+                  Core.forallTypeParameter = (Core.Name "a"),
+                  Core.forallTypeBody = (Core.TypeFunction (Core.FunctionType {
+                    Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                    Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "a"))}))})),
+                Testing.variableOccursInTypeTestCaseExpected = True})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "unifyTypes",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify identical int32 types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.unifyTypesTestCaseRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify identical string types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.unifyTypesTestCaseRight = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify identical variable types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeVariable (Core.Name "a")),
+                Testing.unifyTypesTestCaseRight = (Core.TypeVariable (Core.Name "a")),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify variable with int32",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeVariable (Core.Name "a")),
+                Testing.unifyTypesTestCaseRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify int32 with variable",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.unifyTypesTestCaseRight = (Core.TypeVariable (Core.Name "a")),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify two different variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeVariable (Core.Name "a")),
+                Testing.unifyTypesTestCaseRight = (Core.TypeVariable (Core.Name "b")),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeVariable (Core.Name "b")))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify list of variables with list of int32",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
+                Testing.unifyTypesTestCaseRight = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify identical list types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
+                Testing.unifyTypesTestCaseRight = (Core.TypeList (Core.TypeLiteral Core.LiteralTypeString)),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify function types with variables",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                Testing.unifyTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify identical function types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.unifyTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify optional types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a"))),
+                Testing.unifyTypesTestCaseRight = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify pair types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
+                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))})),
+                Testing.unifyTypesTestCaseRight = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify either types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "a")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "b"))})),
+                Testing.unifyTypesTestCaseRight = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                  (Core.Name "b", (Core.TypeLiteral Core.LiteralTypeString))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify map types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "k")),
+                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "v"))})),
+                Testing.unifyTypesTestCaseRight = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "k", (Core.TypeLiteral Core.LiteralTypeString)),
+                  (Core.Name "v", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify set types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeSet (Core.TypeVariable (Core.Name "a"))),
+                Testing.unifyTypesTestCaseRight = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst (M.fromList [
+                  (Core.Name "a", (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)))])))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "unify unit types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = Core.TypeUnit,
+                Testing.unifyTypesTestCaseRight = Core.TypeUnit,
+                Testing.unifyTypesTestCaseExpected = (Right (Typing.TypeSubst M.empty))})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "fail to unify int32 with string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.unifyTypesTestCaseRight = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.unifyTypesTestCaseExpected = (Left "cannot unify")})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "fail to unify list with function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.unifyTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.unifyTypesTestCaseExpected = (Left "cannot unify")})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "occur check: variable with list containing it",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseUnifyTypes (Testing.UnifyTypesTestCase {
+                Testing.unifyTypesTestCaseSchemaTypes = [],
+                Testing.unifyTypesTestCaseLeft = (Core.TypeVariable (Core.Name "a")),
+                Testing.unifyTypesTestCaseRight = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
+                Testing.unifyTypesTestCaseExpected = (Left "appears free")})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]},
+        Testing.TestGroup {
+          Testing.testGroupName = "joinTypes",
+          Testing.testGroupDescription = Nothing,
+          Testing.testGroupSubgroups = [],
+          Testing.testGroupCases = [
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join identical int32",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.joinTypesTestCaseRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.joinTypesTestCaseExpected = (Right [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join identical string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.joinTypesTestCaseRight = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.joinTypesTestCaseExpected = (Right [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join list types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeList (Core.TypeVariable (Core.Name "a"))),
+                Testing.joinTypesTestCaseRight = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.joinTypesTestCaseExpected = (Right [
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Typing.typeConstraintComment = "join types; test"}])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join function types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeVariable (Core.Name "a")),
+                  Core.functionTypeCodomain = (Core.TypeVariable (Core.Name "b"))})),
+                Testing.joinTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.joinTypesTestCaseExpected = (Right [
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Typing.typeConstraintComment = "join types; test"},
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "b")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral Core.LiteralTypeString),
+                    Typing.typeConstraintComment = "join types; test"}])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join optional types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeMaybe (Core.TypeVariable (Core.Name "a"))),
+                Testing.joinTypesTestCaseRight = (Core.TypeMaybe (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.joinTypesTestCaseExpected = (Right [
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Typing.typeConstraintComment = "join types; test"}])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join pair types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeVariable (Core.Name "a")),
+                  Core.pairTypeSecond = (Core.TypeVariable (Core.Name "b"))})),
+                Testing.joinTypesTestCaseRight = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.joinTypesTestCaseExpected = (Right [
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Typing.typeConstraintComment = "join types; test"},
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "b")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral Core.LiteralTypeString),
+                    Typing.typeConstraintComment = "join types; test"}])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join either types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeVariable (Core.Name "a")),
+                  Core.eitherTypeRight = (Core.TypeVariable (Core.Name "b"))})),
+                Testing.joinTypesTestCaseRight = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.joinTypesTestCaseExpected = (Right [
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Typing.typeConstraintComment = "join types; test"},
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "b")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral Core.LiteralTypeString),
+                    Typing.typeConstraintComment = "join types; test"}])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join map types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeVariable (Core.Name "k")),
+                  Core.mapTypeValues = (Core.TypeVariable (Core.Name "v"))})),
+                Testing.joinTypesTestCaseRight = (Core.TypeMap (Core.MapType {
+                  Core.mapTypeKeys = (Core.TypeLiteral Core.LiteralTypeString),
+                  Core.mapTypeValues = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.joinTypesTestCaseExpected = (Right [
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "k")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral Core.LiteralTypeString),
+                    Typing.typeConstraintComment = "join types; test"},
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "v")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Typing.typeConstraintComment = "join types; test"}])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join set types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeSet (Core.TypeVariable (Core.Name "a"))),
+                Testing.joinTypesTestCaseRight = (Core.TypeSet (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.joinTypesTestCaseExpected = (Right [
+                  Typing.TypeConstraint {
+                    Typing.typeConstraintLeft = (Core.TypeVariable (Core.Name "a")),
+                    Typing.typeConstraintRight = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                    Typing.typeConstraintComment = "join types; test"}])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "join unit types",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = Core.TypeUnit,
+                Testing.joinTypesTestCaseRight = Core.TypeUnit,
+                Testing.joinTypesTestCaseExpected = (Right [])})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "fail to join int32 with string",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                Testing.joinTypesTestCaseRight = (Core.TypeLiteral Core.LiteralTypeString),
+                Testing.joinTypesTestCaseExpected = (Left ())})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "fail to join list with function",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypeList (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))),
+                Testing.joinTypesTestCaseRight = (Core.TypeFunction (Core.FunctionType {
+                  Core.functionTypeDomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.functionTypeCodomain = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32))})),
+                Testing.joinTypesTestCaseExpected = (Left ())})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []},
+            Testing.TestCaseWithMetadata {
+              Testing.testCaseWithMetadataName = "fail to join pair with either",
+              Testing.testCaseWithMetadataCase = (Testing.TestCaseJoinTypes (Testing.JoinTypesTestCase {
+                Testing.joinTypesTestCaseLeft = (Core.TypePair (Core.PairType {
+                  Core.pairTypeFirst = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.pairTypeSecond = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.joinTypesTestCaseRight = (Core.TypeEither (Core.EitherType {
+                  Core.eitherTypeLeft = (Core.TypeLiteral (Core.LiteralTypeInteger Core.IntegerTypeInt32)),
+                  Core.eitherTypeRight = (Core.TypeLiteral Core.LiteralTypeString)})),
+                Testing.joinTypesTestCaseExpected = (Left ())})),
+              Testing.testCaseWithMetadataDescription = Nothing,
+              Testing.testCaseWithMetadataTags = []}]}],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Validate/All.hs b/src/gen-test/haskell/Hydra/Test/Validate/All.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-test/haskell/Hydra/Test/Validate/All.hs
@@ -0,0 +1,24 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Hydra's validation test suite
+
+module Hydra.Test.Validate.All where
+
+import qualified Hydra.Test.Validate.Core as Core
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | The group of all validation tests
+allTests :: Testing.TestGroup
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "validation",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        Core.allTests],
+      Testing.testGroupCases = []}
diff --git a/src/gen-test/haskell/Hydra/Test/Validate/Core.hs b/src/gen-test/haskell/Hydra/Test/Validate/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/gen-test/haskell/Hydra/Test/Validate/Core.hs
@@ -0,0 +1,411 @@
+-- Note: this is an automatically generated file. Do not edit.
+
+-- | Test cases for core term and type validation
+
+module Hydra.Test.Validate.Core where
+
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Core as Core_
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Testing as Testing
+import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.ByteString as B
+import qualified Data.Int as I
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+-- | Test cases for core term and type validation
+allTests :: Testing.TestGroup
+allTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "validate.core",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [
+        duplicateBindingsTests,
+        duplicateFieldsTests,
+        emptyLetBindingsTests,
+        identityApplicationTests,
+        variableShadowingTests],
+      Testing.testGroupCases = []}
+
+duplicateBindingsTests :: Testing.TestGroup
+duplicateBindingsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "duplicate bindings",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "no bindings (literal)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "single binding",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "distinct bindings",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "y"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "duplicate bindings at top level",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing},
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorDuplicateBinding (Core_.DuplicateBindingError {
+              Core_.duplicateBindingErrorLocation = (Paths.SubtermPath []),
+              Core_.duplicateBindingErrorName = (Core.Name "x")})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "duplicate bindings in lambda body",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "f"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "a"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    Core.bindingType = Nothing},
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "a"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermVariable (Core.Name "a"))}))}))),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorDuplicateBinding (Core_.DuplicateBindingError {
+              Core_.duplicateBindingErrorLocation = (Paths.SubtermPath [
+                Paths.SubtermStepLambdaBody]),
+              Core_.duplicateBindingErrorName = (Core.Name "a")})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "duplicate bindings in let body",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    Core.bindingType = Nothing},
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "y"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 3))),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermVariable (Core.Name "y"))}))})),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorDuplicateBinding (Core_.DuplicateBindingError {
+              Core_.duplicateBindingErrorLocation = (Paths.SubtermPath [
+                Paths.SubtermStepLetBody]),
+              Core_.duplicateBindingErrorName = (Core.Name "y")})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "duplicate bindings in let binding value",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLet (Core.Let {
+                    Core.letBindings = [
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "a"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                        Core.bindingType = Nothing},
+                      Core.Binding {
+                        Core.bindingName = (Core.Name "a"),
+                        Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                        Core.bindingType = Nothing}],
+                    Core.letBody = (Core.TermVariable (Core.Name "a"))})),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorDuplicateBinding (Core_.DuplicateBindingError {
+              Core_.duplicateBindingErrorLocation = (Paths.SubtermPath [
+                Paths.SubtermStepLetBinding (Core.Name "x")]),
+              Core_.duplicateBindingErrorName = (Core.Name "a")})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "same name in different scopes is valid",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "x"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2))),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermVariable (Core.Name "x"))}))})),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+duplicateFieldsTests :: Testing.TestGroup
+duplicateFieldsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "duplicate fields",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "no fields (literal)",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42))),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "distinct record fields",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Point"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "x"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "y"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]})),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "duplicate record fields at top level",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermRecord (Core.Record {
+              Core.recordTypeName = (Core.Name "Point"),
+              Core.recordFields = [
+                Core.Field {
+                  Core.fieldName = (Core.Name "x"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                Core.Field {
+                  Core.fieldName = (Core.Name "x"),
+                  Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]})),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorDuplicateField (Core_.DuplicateFieldError {
+              Core_.duplicateFieldErrorLocation = (Paths.SubtermPath []),
+              Core_.duplicateFieldErrorName = (Core.Name "x")})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "duplicate fields in record inside lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "f"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "Point"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "x"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "x"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]}))}))),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorDuplicateField (Core_.DuplicateFieldError {
+              Core_.duplicateFieldErrorLocation = (Paths.SubtermPath [
+                Paths.SubtermStepLambdaBody]),
+              Core_.duplicateFieldErrorName = (Core.Name "x")})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "duplicate fields in record inside let body",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "r"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermRecord (Core.Record {
+                Core.recordTypeName = (Core.Name "Point"),
+                Core.recordFields = [
+                  Core.Field {
+                    Core.fieldName = (Core.Name "x"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))},
+                  Core.Field {
+                    Core.fieldName = (Core.Name "x"),
+                    Core.fieldTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))}]}))})),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorDuplicateField (Core_.DuplicateFieldError {
+              Core_.duplicateFieldErrorLocation = (Paths.SubtermPath [
+                Paths.SubtermStepLetBody]),
+              Core_.duplicateFieldErrorName = (Core.Name "x")})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+emptyLetBindingsTests :: Testing.TestGroup
+emptyLetBindingsTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "empty let bindings",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "let with bindings is valid",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [
+                Core.Binding {
+                  Core.bindingName = (Core.Name "x"),
+                  Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                  Core.bindingType = Nothing}],
+              Core.letBody = (Core.TermVariable (Core.Name "x"))})),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "empty let bindings",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermLet (Core.Let {
+              Core.letBindings = [],
+              Core.letBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 0)))})),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorEmptyLetBindings (Core_.EmptyLetBindingsError {
+              Core_.emptyLetBindingsErrorLocation = (Paths.SubtermPath [])})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+identityApplicationTests :: Testing.TestGroup
+identityApplicationTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "identity application",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "non-identity lambda application is valid",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1)))}))),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 2)))})),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "identity lambda application",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermApplication (Core.Application {
+              Core.applicationFunction = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+              Core.applicationArgument = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 42)))})),
+            Testing.validateCoreTermTestCaseOutput = (Just (Core_.InvalidTermErrorUnnecessaryIdentityApplication (Core_.UnnecessaryIdentityApplicationError {
+              Core_.unnecessaryIdentityApplicationErrorLocation = (Paths.SubtermPath [])})))})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
+
+variableShadowingTests :: Testing.TestGroup
+variableShadowingTests =
+    Testing.TestGroup {
+      Testing.testGroupName = "variable shadowing",
+      Testing.testGroupDescription = Nothing,
+      Testing.testGroupSubgroups = [],
+      Testing.testGroupCases = [
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda with fresh variable is valid",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermVariable (Core.Name "x"))}))),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "lambda shadows outer lambda",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+                Core.lambdaParameter = (Core.Name "x"),
+                Core.lambdaDomain = Nothing,
+                Core.lambdaBody = (Core.TermVariable (Core.Name "x"))})))}))),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []},
+        Testing.TestCaseWithMetadata {
+          Testing.testCaseWithMetadataName = "let binding shadows lambda parameter",
+          Testing.testCaseWithMetadataCase = (Testing.TestCaseValidateCoreTerm (Testing.ValidateCoreTermTestCase {
+            Testing.validateCoreTermTestCaseTyped = False,
+            Testing.validateCoreTermTestCaseInput = (Core.TermFunction (Core.FunctionLambda (Core.Lambda {
+              Core.lambdaParameter = (Core.Name "x"),
+              Core.lambdaDomain = Nothing,
+              Core.lambdaBody = (Core.TermLet (Core.Let {
+                Core.letBindings = [
+                  Core.Binding {
+                    Core.bindingName = (Core.Name "x"),
+                    Core.bindingTerm = (Core.TermLiteral (Core.LiteralInteger (Core.IntegerValueInt32 1))),
+                    Core.bindingType = Nothing}],
+                Core.letBody = (Core.TermVariable (Core.Name "x"))}))}))),
+            Testing.validateCoreTermTestCaseOutput = Nothing})),
+          Testing.testCaseWithMetadataDescription = Nothing,
+          Testing.testCaseWithMetadataTags = []}]}
diff --git a/src/main/haskell/Hydra/Dsl/Annotations.hs b/src/main/haskell/Hydra/Dsl/Annotations.hs
--- a/src/main/haskell/Hydra/Dsl/Annotations.hs
+++ b/src/main/haskell/Hydra/Dsl/Annotations.hs
@@ -3,7 +3,7 @@
 module Hydra.Dsl.Annotations where
 
 import Hydra.Core
-import Hydra.Compute
+import Hydra.Util
 import Hydra.Constants
 import Hydra.Annotations
 import Hydra.Dsl.AsType
diff --git a/src/main/haskell/Hydra/Dsl/Bootstrap.hs b/src/main/haskell/Hydra/Dsl/Bootstrap.hs
--- a/src/main/haskell/Hydra/Dsl/Bootstrap.hs
+++ b/src/main/haskell/Hydra/Dsl/Bootstrap.hs
@@ -7,24 +7,21 @@
   qualify,
   typeref,
   defineType,
+  toTypeDef,
   use,
   useType,
 ) where
 
-import Hydra.Compute
+import Hydra.Util
 import Hydra.Constants
 import Hydra.Core
 import Hydra.Dsl.AsType
-import qualified Hydra.Encode.Core as EncodeCore
 import Hydra.Graph
 import Hydra.Lexical
 import Hydra.Annotations
 import Hydra.Module
-import Hydra.Rewriting
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Terms as Terms
-import qualified Hydra.Dsl.Types as Types
-import Hydra.Tools.Debug
+import qualified Hydra.Decode.Core as Decode
 
 import qualified Data.List as L
 import qualified Data.Map as M
@@ -33,28 +30,21 @@
 
 -- | An empty graph (no elements, no schema, but with primitive functions) which is used for bootstrapping Hydra Core
 bootstrapGraph :: Graph
-bootstrapGraph = emptyGraph {graphPrimitives = M.fromList $ fmap (\p -> (primitiveName p, p)) (L.concat (libraryPrimitives <$> standardLibraries))}
+bootstrapGraph = Graph {
+  graphBoundTerms = M.empty,
+  graphBoundTypes = M.empty,
+  graphClassConstraints = M.empty,
+  graphLambdaVariables = S.empty,
+  graphMetadata = M.empty,
+  graphPrimitives = M.fromList $ fmap (\p -> (primitiveName p, p)) (L.concat (libraryPrimitives <$> standardLibraries)),
+  graphSchemaTypes = M.empty,
+  graphTypeVariables = S.empty}
 
 datatype :: Namespace -> String -> Type -> Binding
-datatype gname lname typ = typeElement elName $ rewriteType replacePlaceholders typ
+datatype gname lname typ = typeElement elName typ
   where
     elName = qualify gname (Name lname)
 
-    -- Note: placeholders are only expected at the top level, or beneath annotations and/or type lambdas
-    replacePlaceholders rec t = case rect of
-        TypeRecord (RowType tname fields) -> if tname == placeholderName
-          then TypeRecord (RowType elName fields)
-          else rect
-        TypeUnion (RowType tname fields) -> if tname == placeholderName
-          then TypeUnion (RowType elName fields)
-          else rect
-        TypeWrap (WrappedType tname t) -> if tname == placeholderName
-          then TypeWrap (WrappedType elName t)
-          else rect
-        _ -> rect
-      where
-        rect = rec t
-
 qualify :: Namespace -> Name -> Name
 qualify (Namespace gname) (Name lname) = Name $ gname ++ "." ++ lname
 
@@ -66,6 +56,18 @@
 -- | Define a type in a namespace
 defineType :: Namespace -> String -> Type -> Binding
 defineType = datatype
+
+-- | Convert a type Binding (from defineType) to a type Definition.
+-- The Binding must have been created by defineType/datatype, which stores
+-- the type encoded as a term via typeElement. We decode it back.
+toTypeDef :: Binding -> Definition
+toTypeDef b = case Decode.type_ bootstrapGraph (stripAnnotations $ bindingTerm b) of
+  Right typ -> DefinitionType $ TypeDefinition (bindingName b) typ
+  Left err -> error $ "toTypeDef: failed to decode type from binding "
+    ++ show (bindingName b) ++ ": " ++ show err
+  where
+    stripAnnotations (TermAnnotated (AnnotatedTerm body _)) = stripAnnotations body
+    stripAnnotations t = t
 
 -- | Reference a type by its binding
 use :: Binding -> Type
diff --git a/src/main/haskell/Hydra/Dsl/Grammars.hs b/src/main/haskell/Hydra/Dsl/Grammars.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Grammars.hs
+++ /dev/null
@@ -1,61 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
--- | A DSL for building BNF grammars
-
-module Hydra.Dsl.Grammars where
-
-import qualified Hydra.Grammar as G
-
-import Data.String(IsString(..))
-
-
-instance IsString G.Pattern where fromString = symbol
-
-infixr 0 >:
-(>:) :: String -> G.Pattern -> G.Pattern
-l >: p = G.PatternLabeled $ G.LabeledPattern (G.Label l) p
-
-alts :: [G.Pattern] -> G.Pattern
-alts = G.PatternAlternatives
-
-define :: String -> [G.Pattern] -> G.Production
-define s pats = G.Production (G.Symbol s) pat
-  where
-    pat = case pats of
-      [p] -> p
-      _ -> alts pats
-
-ignored :: G.Pattern -> G.Pattern
-ignored = G.PatternIgnored
-
-list :: [G.Pattern] -> G.Pattern
-list = G.PatternSequence
-
-nil :: G.Pattern
-nil = G.PatternNil
-
-opt :: G.Pattern -> G.Pattern
-opt = G.PatternOption
-
-plus :: G.Pattern -> G.Pattern
-plus = G.PatternPlus
-
-regex :: String -> G.Pattern
-regex = G.PatternRegex . G.Regex
-
--- | A helper which matches patterns like "foo.bar.quux" or "one; two; three; four"
-sep :: G.Pattern -> G.Pattern -> G.Pattern
-sep separator pat = list[pat, star(list[separator, pat])]
-
--- | A helper which matches patterns like "foo.bar.quux" or "foo.bar.quux." (i.e. trailing separators are allowed)
-sepp :: G.Pattern -> G.Pattern -> G.Pattern
-sepp separator pat = list[pat, star(list[separator, pat]), opt(separator)]
-
-star :: G.Pattern -> G.Pattern
-star = G.PatternStar
-
-symbol :: String -> G.Pattern
-symbol = G.PatternNonterminal . G.Symbol
-
-terminal :: String -> G.Pattern
-terminal = G.PatternConstant . G.Constant
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Accessors.hs b/src/main/haskell/Hydra/Dsl/Meta/Accessors.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Accessors.hs
+++ /dev/null
@@ -1,105 +0,0 @@
--- | Meta-DSL functions for accessing term and type metadata
-
-module Hydra.Dsl.Meta.Accessors where
-
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Phantoms
-import Hydra.Accessors
-
-import qualified Data.Map as M
-import qualified Data.Maybe as Y
-
-
-accessorEdge :: TTerm AccessorNode -> TTerm AccessorPath -> TTerm AccessorNode -> TTerm AccessorEdge
-accessorEdge source path target = record _AccessorEdge [
-  _AccessorEdge_source>>: source,
-  _AccessorEdge_path>>: path,
-  _AccessorEdge_target>>: target]
-
-accessorEdgeSource = injectUnit _AccessorEdge _AccessorEdge_source
-accessorEdgePath = injectUnit _AccessorEdge _AccessorEdge_path
-accessorEdgeTarget = injectUnit _AccessorEdge _AccessorEdge_target
-
-accessorGraph :: TTerm [AccessorNode] -> TTerm [AccessorEdge] -> TTerm AccessorGraph
-accessorGraph nodes edges = record _AccessorGraph [
-  _AccessorGraph_nodes>>: nodes,
-  _AccessorGraph_edges>>: edges]
-
-accessorGraphNodes = injectUnit _AccessorGraph _AccessorGraph_nodes
-accessorGraphEdges = injectUnit _AccessorGraph _AccessorGraph_edges
-
-accessorNode :: TTerm Name -> TTerm String -> TTerm String -> TTerm AccessorNode
-accessorNode name label id = record _AccessorNode [
-  _AccessorNode_name>>: name,
-  _AccessorNode_label>>: label,
-  _AccessorNode_id>>: id]
-
-accessorNodeName = injectUnit _AccessorNode _AccessorNode_name
-accessorNodeLabel = injectUnit _AccessorNode _AccessorNode_label
-accessorNodeId = injectUnit _AccessorNode _AccessorNode_id
-
-accessorPath :: TTerm [TermAccessor] -> TTerm AccessorPath
-accessorPath path = wrap _AccessorPath path
-
-termAccessorAnnotatedBody :: TTerm TermAccessor
-termAccessorAnnotatedBody = injectUnit _TermAccessor _TermAccessor_annotatedBody
-
-termAccessorApplicationFunction :: TTerm TermAccessor
-termAccessorApplicationFunction = injectUnit _TermAccessor _TermAccessor_applicationFunction
-
-termAccessorApplicationArgument :: TTerm TermAccessor
-termAccessorApplicationArgument = injectUnit _TermAccessor _TermAccessor_applicationArgument
-
-termAccessorLambdaBody :: TTerm TermAccessor
-termAccessorLambdaBody = injectUnit _TermAccessor _TermAccessor_lambdaBody
-
-termAccessorUnionCasesDefault :: TTerm TermAccessor
-termAccessorUnionCasesDefault = injectUnit _TermAccessor _TermAccessor_unionCasesDefault
-
-termAccessorUnionCasesBranch :: TTerm Name -> TTerm TermAccessor
-termAccessorUnionCasesBranch = inject _TermAccessor _TermAccessor_unionCasesBranch
-
-termAccessorLetEnvironment :: TTerm TermAccessor
-termAccessorLetEnvironment = injectUnit _TermAccessor _TermAccessor_letBody
-
-termAccessorLetBinding :: TTerm Name -> TTerm TermAccessor
-termAccessorLetBinding = inject _TermAccessor _TermAccessor_letBinding
-
-termAccessorListElement :: TTerm Int -> TTerm TermAccessor
-termAccessorListElement = inject _TermAccessor _TermAccessor_listElement
-
-termAccessorMapKey :: TTerm Int -> TTerm TermAccessor
-termAccessorMapKey = inject _TermAccessor _TermAccessor_mapKey
-
-termAccessorMapValue :: TTerm Int -> TTerm TermAccessor
-termAccessorMapValue = inject _TermAccessor _TermAccessor_mapValue
-
-termAccessorOptionalTerm :: TTerm TermAccessor
-termAccessorOptionalTerm = injectUnit _TermAccessor _TermAccessor_maybeTerm
-
-termAccessorProductTerm :: TTerm Int -> TTerm TermAccessor
-termAccessorProductTerm = inject _TermAccessor _TermAccessor_productTerm
-
-termAccessorRecordField :: TTerm Name -> TTerm TermAccessor
-termAccessorRecordField = inject _TermAccessor _TermAccessor_recordField
-
-termAccessorSetElement :: TTerm Int -> TTerm TermAccessor
-termAccessorSetElement = inject _TermAccessor _TermAccessor_setElement
-
-termAccessorSumTerm :: TTerm TermAccessor
-termAccessorSumTerm = injectUnit _TermAccessor _TermAccessor_sumTerm
-
-termAccessorTypeLambdaBody :: TTerm TermAccessor
-termAccessorTypeLambdaBody = injectUnit _TermAccessor _TermAccessor_typeLambdaBody
-
-termAccessorTypeApplicationTerm :: TTerm TermAccessor
-termAccessorTypeApplicationTerm = injectUnit _TermAccessor _TermAccessor_typeApplicationTerm
-
-termAccessorInjectionTerm :: TTerm TermAccessor
-termAccessorInjectionTerm = injectUnit _TermAccessor _TermAccessor_injectionTerm
-
-termAccessorWrappedTerm :: TTerm TermAccessor
-termAccessorWrappedTerm = injectUnit _TermAccessor _TermAccessor_wrappedTerm
-
-unAccessorPath :: TTerm AccessorPath -> TTerm [TermAccessor]
-unAccessorPath path = unwrap _AccessorPath @@ path
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Ast.hs b/src/main/haskell/Hydra/Dsl/Meta/Ast.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Ast.hs
+++ /dev/null
@@ -1,191 +0,0 @@
--- | Meta-DSL for constructing abstract syntax tree nodes
-
-module Hydra.Dsl.Meta.Ast where
-
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Phantoms
-import Hydra.Ast
-
-import qualified Data.Map as M
-import qualified Data.Int as I
-
-
--- Associativity
-
-associativityNone :: TTerm Associativity
-associativityNone = injectUnit _Associativity _Associativity_none
-
-associativityLeft :: TTerm Associativity
-associativityLeft = injectUnit _Associativity _Associativity_left
-
-associativityRight :: TTerm Associativity
-associativityRight = injectUnit _Associativity _Associativity_right
-
-associativityBoth :: TTerm Associativity
-associativityBoth = injectUnit _Associativity _Associativity_both
-
--- BlockStyle
-
-blockStyle :: TTerm (Maybe String) -> TTerm Bool -> TTerm Bool -> TTerm BlockStyle
-blockStyle indent newlineBefore newlineAfter = record _BlockStyle [
-    _BlockStyle_indent >>: indent,
-    _BlockStyle_newlineBeforeContent >>: newlineBefore,
-    _BlockStyle_newlineAfterContent >>: newlineAfter]
-
-blockStyleIndent :: TTerm BlockStyle -> TTerm (Maybe String)
-blockStyleIndent bs = project _BlockStyle _BlockStyle_indent @@ bs
-
-blockStyleNewlineBeforeContent :: TTerm BlockStyle -> TTerm Bool
-blockStyleNewlineBeforeContent bs = project _BlockStyle _BlockStyle_newlineBeforeContent @@ bs
-
-blockStyleNewlineAfterContent :: TTerm BlockStyle -> TTerm Bool
-blockStyleNewlineAfterContent bs = project _BlockStyle _BlockStyle_newlineAfterContent @@ bs
-
--- BracketExpr
-
-bracketExpr :: TTerm Brackets -> TTerm Expr -> TTerm BlockStyle -> TTerm BracketExpr
-bracketExpr brackets enclosed style = record _BracketExpr [
-    _BracketExpr_brackets >>: brackets,
-    _BracketExpr_enclosed >>: enclosed,
-    _BracketExpr_style >>: style]
-
-bracketExprBrackets :: TTerm BracketExpr -> TTerm Brackets
-bracketExprBrackets be = project _BracketExpr _BracketExpr_brackets @@ be
-
-bracketExprEnclosed :: TTerm BracketExpr -> TTerm Expr
-bracketExprEnclosed be = project _BracketExpr _BracketExpr_enclosed @@ be
-
-bracketExprStyle :: TTerm BracketExpr -> TTerm BlockStyle
-bracketExprStyle be = project _BracketExpr _BracketExpr_style @@ be
-
--- Brackets
-
-brackets :: TTerm Symbol -> TTerm Symbol -> TTerm Brackets
-brackets open close = record _Brackets [
-    _Brackets_open >>: open,
-    _Brackets_close >>: close]
-
-bracketsOpen :: TTerm Brackets -> TTerm Symbol
-bracketsOpen b = project _Brackets _Brackets_open @@ b
-
-bracketsClose :: TTerm Brackets -> TTerm Symbol
-bracketsClose b = project _Brackets _Brackets_close @@ b
-
--- Expr (sum type)
-
-exprConst :: TTerm Symbol -> TTerm Expr
-exprConst sym = inject _Expr _Expr_const sym
-
-exprIndent :: TTerm IndentedExpression -> TTerm Expr
-exprIndent ind = inject _Expr _Expr_indent ind
-
-exprOp :: TTerm OpExpr -> TTerm Expr
-exprOp op = inject _Expr _Expr_op op
-
-exprBrackets :: TTerm BracketExpr -> TTerm Expr
-exprBrackets be = inject _Expr _Expr_brackets be
-
--- IndentedExpression
-
-indentedExpression :: TTerm IndentStyle -> TTerm Expr -> TTerm IndentedExpression
-indentedExpression style expr = record _IndentedExpression [
-    _IndentedExpression_style >>: style,
-    _IndentedExpression_expr >>: expr]
-
-indentedExpressionStyle :: TTerm IndentedExpression -> TTerm IndentStyle
-indentedExpressionStyle ie = project _IndentedExpression _IndentedExpression_style @@ ie
-
-indentedExpressionExpr :: TTerm IndentedExpression -> TTerm Expr
-indentedExpressionExpr ie = project _IndentedExpression _IndentedExpression_expr @@ ie
-
--- IndentStyle (sum type)
-
-indentStyleAllLines :: TTerm String -> TTerm IndentStyle
-indentStyleAllLines s = inject _IndentStyle _IndentStyle_allLines s
-
-indentStyleSubsequentLines :: TTerm String -> TTerm IndentStyle
-indentStyleSubsequentLines s = inject _IndentStyle _IndentStyle_subsequentLines s
-
--- Op
-
-op :: TTerm Symbol -> TTerm Padding -> TTerm Precedence -> TTerm Associativity -> TTerm Op
-op symbol padding precedence associativity = record _Op [
-    _Op_symbol >>: symbol,
-    _Op_padding >>: padding,
-    _Op_precedence >>: precedence,
-    _Op_associativity >>: associativity]
-
-opSymbol :: TTerm Op -> TTerm Symbol
-opSymbol o = project _Op _Op_symbol @@ o
-
-opPadding :: TTerm Op -> TTerm Padding
-opPadding o = project _Op _Op_padding @@ o
-
-opPrecedence :: TTerm Op -> TTerm Precedence
-opPrecedence o = project _Op _Op_precedence @@ o
-
-opAssociativity :: TTerm Op -> TTerm Associativity
-opAssociativity o = project _Op _Op_associativity @@ o
-
--- OpExpr
-
-opExpr :: TTerm Op -> TTerm Expr -> TTerm Expr -> TTerm OpExpr
-opExpr op lhs rhs = record _OpExpr [
-    _OpExpr_op >>: op,
-    _OpExpr_lhs >>: lhs,
-    _OpExpr_rhs >>: rhs]
-
-opExprOp :: TTerm OpExpr -> TTerm Op
-opExprOp oe = project _OpExpr _OpExpr_op @@ oe
-
-opExprLhs :: TTerm OpExpr -> TTerm Expr
-opExprLhs oe = project _OpExpr _OpExpr_lhs @@ oe
-
-opExprRhs :: TTerm OpExpr -> TTerm Expr
-opExprRhs oe = project _OpExpr _OpExpr_rhs @@ oe
-
--- Padding
-
-padding :: TTerm Ws -> TTerm Ws -> TTerm Padding
-padding left right = record _Padding [
-    _Padding_left >>: left,
-    _Padding_right >>: right]
-
-paddingLeft :: TTerm Padding -> TTerm Ws
-paddingLeft p = project _Padding _Padding_left @@ p
-
-paddingRight :: TTerm Padding -> TTerm Ws
-paddingRight p = project _Padding _Padding_right @@ p
-
--- Precedence (newtype wrapping Int)
-
-precedence :: TTerm I.Int -> TTerm Precedence
-precedence = wrap _Precedence
-
-unPrecedence :: TTerm Precedence -> TTerm I.Int
-unPrecedence p = unwrap _Precedence @@ p
-
--- Symbol (newtype wrapping String)
-
-symbol :: TTerm String -> TTerm Symbol
-symbol = wrap _Symbol
-
-unSymbol :: TTerm Symbol -> TTerm String
-unSymbol s = unwrap _Symbol @@ s
-
--- Ws (sum type)
-
-wsNone :: TTerm Ws
-wsNone = injectUnit _Ws _Ws_none
-
-wsSpace :: TTerm Ws
-wsSpace = injectUnit _Ws _Ws_space
-
-wsBreak :: TTerm Ws
-wsBreak = injectUnit _Ws _Ws_break
-
-wsBreakAndIndent :: TTerm String -> TTerm Ws
-wsBreakAndIndent s = inject _Ws _Ws_breakAndIndent s
-
-wsDoubleBreak :: TTerm Ws
-wsDoubleBreak = injectUnit _Ws _Ws_doubleBreak
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Coders.hs b/src/main/haskell/Hydra/Dsl/Meta/Coders.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Coders.hs
+++ /dev/null
@@ -1,111 +0,0 @@
-{-# LANGUAGE FlexibleContexts #-}
-
--- | Meta-DSL for constructing coder-related terms
-
-module Hydra.Dsl.Meta.Coders where
-
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Phantoms as Phantoms
-import qualified Hydra.Dsl.Meta.Core as Core
-import Hydra.Dsl.Meta.Lib.Sets as Sets
-import qualified Hydra.Dsl.Meta.Types as T
-
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-
-adapterContext :: TTerm Graph -> TTerm Language -> TTerm (M.Map Name (Adapter AdapterContext AdapterContext Type Type Term Term)) -> TTerm AdapterContext
-adapterContext graph language adapters = Phantoms.record _AdapterContext [
-  _AdapterContext_graph>>: graph,
-  _AdapterContext_language>>: language,
-  _AdapterContext_adapters>>: adapters]
-
-adapterContextGraph :: TTerm AdapterContext -> TTerm Graph
-adapterContextGraph c = project _AdapterContext _AdapterContext_graph @@ c
-
-adapterContextLanguage :: TTerm AdapterContext -> TTerm Language
-adapterContextLanguage c = project _AdapterContext _AdapterContext_language @@ c
-
-adapterContextAdapters :: TTerm AdapterContext -> TTerm (M.Map Name (Adapter AdapterContext AdapterContext Type Type Term Term))
-adapterContextAdapters c = project _AdapterContext _AdapterContext_adapters @@ c
-
-coderDirectionEncode :: TTerm CoderDirection
-coderDirectionEncode = injectUnit _CoderDirection _CoderDirection_encode
-
-coderDirectionDecode :: TTerm CoderDirection
-coderDirectionDecode = injectUnit _CoderDirection _CoderDirection_decode
-
-language :: TTerm LanguageName -> TTerm LanguageConstraints -> TTerm Language
-language name constraints = record _Language [
-    _Language_name>>: name,
-    _Language_constraints>>: constraints]
-
-
---binding :: AsTerm t Term => TTerm Name -> t -> TTerm (Maybe TypeScheme) -> TTerm Binding
-
-languageName :: AsTerm t String => t -> TTerm LanguageName
-languageName = wrap _LanguageName . asTerm
-
-unLanguageName :: TTerm LanguageName -> TTerm String
-unLanguageName n = unwrap _LanguageName @@ n
-
--- TODO: resolve _Language_name/_LanguageName conflict
-languageNameProjection :: TTerm Language -> TTerm LanguageName
-languageNameProjection c = project _Language _Language_name @@ c
-
--- TODO: resolve _Language_constraints/LanguageConstraints conflict
-languageConstraintsProjection :: TTerm Language -> TTerm LanguageConstraints
-languageConstraintsProjection c = project _Language _Language_constraints @@ c
-
-languageConstraints :: TTerm (S.Set EliminationVariant)
-                    -> TTerm (S.Set LiteralVariant)
-                    -> TTerm (S.Set FloatType)
-                    -> TTerm (S.Set FunctionVariant)
-                    -> TTerm (S.Set IntegerType)
-                    -> TTerm (S.Set TermVariant)
-                    -> TTerm (S.Set TypeVariant)
-                    -> TTerm (Type -> Bool)
-                    -> TTerm LanguageConstraints
-languageConstraints eliminationVariants
-                    literalVariants
-                    floatTypes
-                    functionVariants
-                    integerTypes
-                    termVariants
-                    typeVariants
-                    types = record _LanguageConstraints [
-    _LanguageConstraints_eliminationVariants>>: eliminationVariants,
-    _LanguageConstraints_literalVariants>>: literalVariants,
-    _LanguageConstraints_floatTypes>>: floatTypes,
-    _LanguageConstraints_functionVariants>>: functionVariants,
-    _LanguageConstraints_integerTypes>>: integerTypes,
-    _LanguageConstraints_termVariants>>: termVariants,
-    _LanguageConstraints_typeVariants>>: typeVariants,
-    _LanguageConstraints_types>>: types]
-
-languageConstraintsEliminationVariants :: TTerm LanguageConstraints -> TTerm (S.Set EliminationVariant)
-languageConstraintsEliminationVariants lc = project _LanguageConstraints _LanguageConstraints_eliminationVariants @@ lc
-
-languageConstraintsLiteralVariants :: TTerm LanguageConstraints -> TTerm (S.Set LiteralVariant)
-languageConstraintsLiteralVariants lc = project _LanguageConstraints _LanguageConstraints_literalVariants @@ lc
-
-languageConstraintsFloatTypes :: TTerm LanguageConstraints -> TTerm (S.Set FloatType)
-languageConstraintsFloatTypes lc = project _LanguageConstraints _LanguageConstraints_floatTypes @@ lc
-
-languageConstraintsFunctionVariants :: TTerm LanguageConstraints -> TTerm (S.Set FunctionVariant)
-languageConstraintsFunctionVariants lc = project _LanguageConstraints _LanguageConstraints_functionVariants @@ lc
-
-languageConstraintsIntegerTypes :: TTerm LanguageConstraints -> TTerm (S.Set IntegerType)
-languageConstraintsIntegerTypes lc = project _LanguageConstraints _LanguageConstraints_integerTypes @@ lc
-
-languageConstraintsTermVariants :: TTerm LanguageConstraints -> TTerm (S.Set TermVariant)
-languageConstraintsTermVariants lc = project _LanguageConstraints _LanguageConstraints_termVariants @@ lc
-
-languageConstraintsTypeVariants :: TTerm LanguageConstraints -> TTerm (S.Set TypeVariant)
-languageConstraintsTypeVariants lc = project _LanguageConstraints _LanguageConstraints_typeVariants @@ lc
-
-languageConstraintsTypes :: TTerm LanguageConstraints -> TTerm (Type -> Bool)
-languageConstraintsTypes lc = project _LanguageConstraints _LanguageConstraints_types @@ lc
-
-traversalOrderPre = injectUnit _TraversalOrder _TraversalOrder_pre
-traversalOrderPost = injectUnit _TraversalOrder _TraversalOrder_post
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Compute.hs b/src/main/haskell/Hydra/Dsl/Meta/Compute.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Compute.hs
+++ /dev/null
@@ -1,100 +0,0 @@
-{-# LANGUAGE FlexibleContexts #-}
-
--- | Meta-DSL for constructing compute-related terms (Flow, Trace, etc.)
-
-module Hydra.Dsl.Meta.Compute where
-
-import Hydra.Kernel
-import Hydra.Dsl.AsTerm
-import Hydra.Dsl.Meta.Phantoms
-import qualified Hydra.Dsl.Meta.Core as Core
-
-import qualified Data.Map as M
-import qualified Data.Maybe as Y
-
-
-adapter :: AsTerm c (Coder s1 s2 v1 v2) => TTerm Bool -> TTerm t1 -> TTerm t2 -> c -> TTerm (Adapter s1 s2 t1 t2 v1 v2)
-adapter isLossy source target coderArg = record _Adapter [
-  _Adapter_isLossy>>: isLossy,
-  _Adapter_source>>: source,
-  _Adapter_target>>: target,
-  _Adapter_coder>>: asTerm coderArg]
-
-adapterIsLossy :: TTerm (Adapter s1 s2 t1 t2 v1 v2) -> TTerm Bool
-adapterIsLossy a = project _Adapter _Adapter_isLossy @@ a
-
-adapterSource :: TTerm (Adapter s1 s2 t1 t2 v1 v2) -> TTerm t1
-adapterSource a = project _Adapter _Adapter_source @@ a
-
-adapterTarget :: TTerm (Adapter s1 s2 t1 t2 v1 v2) -> TTerm t2
-adapterTarget a = project _Adapter _Adapter_target @@ a
-
-adapterCoder :: TTerm (Adapter s1 s2 t1 t2 v1 v2) -> TTerm (Coder s1 s2 v1 v2)
-adapterCoder a = project _Adapter _Adapter_coder @@ a
-
-adapterWithCoder :: TTerm (Adapter s1 s2 t1 t2 v1 v2) -> TTerm (Coder s1 s2 v1 v2) -> TTerm (Adapter s1 s2 t1 t2 v1 v2)
-adapterWithCoder a coder = adapter
-  (Hydra.Dsl.Meta.Compute.adapterIsLossy a)
-  (Hydra.Dsl.Meta.Compute.adapterSource a)
-  (Hydra.Dsl.Meta.Compute.adapterTarget a)
-  coder
-
-adapterWithTarget :: TTerm (Adapter s1 s2 t1 t2 v1 v2) -> TTerm t2 -> TTerm (Adapter s1 s2 t1 t2 v1 v2)
-adapterWithTarget a target = adapter
-  (Hydra.Dsl.Meta.Compute.adapterIsLossy a)
-  (Hydra.Dsl.Meta.Compute.adapterSource a)
-  target
-  (Hydra.Dsl.Meta.Compute.adapterCoder a)
-
-coder :: TTerm (v1 -> Flow s1 v2) -> TTerm (v2 -> Flow s2 v1) -> TTerm (Coder s1 s2 v1 v2)
-coder encode decode = record _Coder [
-  _Coder_encode>>: encode,
-  _Coder_decode>>: decode]
-
-coderEncode :: TTerm (Coder s1 s2 v1 v2) -> TTerm (v1 -> Flow s1 v2)
-coderEncode c = project _Coder _Coder_encode @@ c
-
-coderDecode :: TTerm (Coder s1 s2 v1 v2) -> TTerm (v2 -> Flow s2 v1)
-coderDecode c = project _Coder _Coder_decode @@ c
-
-flow :: TTerm (s -> Trace -> FlowState s v) -> TTerm (Flow s v)
-flow = wrap _Flow
-
-flowState :: TTerm (Maybe x) -> TTerm s -> TTerm Trace -> TTerm (FlowState s x)
-flowState value state trace = record _FlowState [
-  _FlowState_value>>: value,
-  _FlowState_state>>: state,
-  _FlowState_trace>>: trace]
-
-flowStateState :: TTerm (FlowState s x) -> TTerm s
-flowStateState fs = project _FlowState _FlowState_state @@ fs
-
-flowStateTrace :: TTerm (FlowState s x) -> TTerm Trace
-flowStateTrace fs = project _FlowState _FlowState_trace @@ fs
-
-flowStateValue :: TTerm (FlowState s x) -> TTerm (Maybe x)
-flowStateValue fs = project _FlowState _FlowState_value @@ fs
-
-trace :: TTerm [String] -> TTerm [String] -> TTerm (M.Map Name Term) -> TTerm Trace
-trace stack messages other = record _Trace [
-  _Trace_stack>>: stack,
-  _Trace_messages>>: messages,
-  _Trace_other>>: other]
-
-traceStack :: TTerm Trace -> TTerm [String]
-traceStack t = project _Trace _Trace_stack @@ t
-
-traceMessages :: TTerm Trace -> TTerm [String]
-traceMessages t = project _Trace _Trace_messages @@ t
-
-traceOther :: TTerm Trace -> TTerm (M.Map Name Term)
-traceOther t = project _Trace _Trace_other @@ t
-
-traceWithOther :: TTerm Trace -> TTerm (M.Map Name Term) -> TTerm Trace
-traceWithOther t other = record _Trace [
-  _Trace_stack>>: Hydra.Dsl.Meta.Compute.traceStack t,
-  _Trace_messages>>: Hydra.Dsl.Meta.Compute.traceMessages t,
-  _Trace_other>>: other]
-
-unFlow :: AsTerm t Trace => TTerm (Flow s x) -> TTerm s -> t -> TTerm (FlowState s x)
-unFlow f s t = unwrap _Flow @@ f @@ s @@ asTerm t
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Context.hs b/src/main/haskell/Hydra/Dsl/Meta/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Dsl/Meta/Context.hs
@@ -0,0 +1,33 @@
+-- | Haskell-specific convenience layer over the generated Hydra.Dsl.Context module.
+
+module Hydra.Dsl.Meta.Context (
+  module Hydra.Dsl.Context,
+  module Hydra.Dsl.Meta.Context,
+  DslCtx.contextTrace,
+  DslCtx.contextMessages,
+  DslCtx.contextOther,
+) where
+
+import Hydra.Kernel
+import Hydra.Dsl.Meta.Phantoms
+import Hydra.Dsl.Context hiding (contextTrace, contextMessages, contextOther)
+import qualified Hydra.Dsl.Context as DslCtx
+
+import qualified Hydra.Dsl.Meta.Lib.Eithers as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Lists as Lists
+
+
+-- | Wrap an Either's Left side with a Context
+withContext :: TTerm Context -> TTerm (Either e a) -> TTerm (Either (InContext e) a)
+withContext cx e = Eithers.bimap ("_wc_e" ~> inContext (var "_wc_e") cx) ("_wc_a" ~> var "_wc_a") e
+
+-- | Push a trace frame onto a Context
+pushTrace :: TTerm String -> TTerm Context -> TTerm Context
+pushTrace label cx = context
+    (Lists.cons label (DslCtx.contextTrace cx))
+    (DslCtx.contextMessages cx)
+    (DslCtx.contextOther cx)
+
+-- | Create a Left (InContext error cx)
+failInContext :: TTerm e -> TTerm Context -> TTerm (Either (InContext e) a)
+failInContext err cx = left (inContext err cx)
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Core.hs b/src/main/haskell/Hydra/Dsl/Meta/Core.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Core.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Core.hs
@@ -1,596 +1,56 @@
 {-# LANGUAGE FlexibleContexts #-}
 
--- | Meta-DSL for constructing Hydra core terms and types as first-class values
+-- | Haskell-specific convenience layer over the generated Hydra.Dsl.Core module.
+-- Re-exports all generated DSL functions and adds AsTerm-flexible overrides
+-- for functions commonly called with TBinding arguments.
 
-module Hydra.Dsl.Meta.Core where
+module Hydra.Dsl.Meta.Core (
+  module Hydra.Dsl.Core,
+  module Hydra.Dsl.Meta.Core,
+  nameLift,
+) where
 
 import Hydra.Kernel
 import Hydra.Dsl.AsTerm
-import Hydra.Dsl.Meta.Phantoms as Phantoms
-import qualified Hydra.Dsl.Terms as Terms
+import Hydra.Dsl.Meta.Phantoms (nameLift, var, (~>))
+import Hydra.Dsl.Core hiding (binding, injection, typeVariable)
+import qualified Hydra.Dsl.Core as Gen
 
 -- For helpers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
 import qualified Hydra.Dsl.Meta.Lib.Lists as Lists
 import qualified Hydra.Dsl.Meta.Lib.Logic as Logic
-import Hydra.Sources.Libraries
 
-import qualified Data.ByteString as B
 import qualified Data.Map as M
-import qualified Data.Set as S
-import qualified Data.Maybe as Y
-import Data.Int
 import Prelude hiding (map, product)
 
 
-annotatedTerm :: TTerm Term -> TTerm (M.Map Name Term) -> TTerm AnnotatedTerm
-annotatedTerm body annotation = Phantoms.record _AnnotatedTerm [
-  _AnnotatedTerm_body>>: body,
-  _AnnotatedTerm_annotation>>: annotation]
-
-annotatedTermBody :: TTerm AnnotatedTerm -> TTerm Term
-annotatedTermBody at = Phantoms.project _AnnotatedTerm _AnnotatedTerm_body @@ at
-
-annotatedTermAnnotation :: TTerm AnnotatedTerm -> TTerm (M.Map Name Term)
-annotatedTermAnnotation at = Phantoms.project _AnnotatedTerm _AnnotatedTerm_annotation @@ at
-
-annotatedTermWithBody :: TTerm AnnotatedTerm -> TTerm Term -> TTerm AnnotatedTerm
-annotatedTermWithBody at body = annotatedTerm body (Hydra.Dsl.Meta.Core.annotatedTermAnnotation at)
-
-annotatedType :: TTerm Type -> TTerm (M.Map Name Term) -> TTerm AnnotatedType
-annotatedType body annotation = Phantoms.record _AnnotatedType [
-  _AnnotatedType_body>>: body,
-  _AnnotatedType_annotation>>: annotation]
-
-annotatedTypeBody :: TTerm AnnotatedType -> TTerm Type
-annotatedTypeBody at = Phantoms.project _AnnotatedType _AnnotatedType_body @@ at
-
-annotatedTypeAnnotation :: TTerm AnnotatedType -> TTerm (M.Map Name Term)
-annotatedTypeAnnotation at = Phantoms.project _AnnotatedType _AnnotatedType_annotation @@ at
-
-application :: TTerm Term -> TTerm Term -> TTerm Application
-application function argument = Phantoms.record _Application [
-  _Application_function>>: function,
-  _Application_argument>>: argument]
-
-applicationFunction :: TTerm Application -> TTerm Term
-applicationFunction app = Phantoms.project _Application _Application_function @@ app
-
-applicationArgument :: TTerm Application -> TTerm Term
-applicationArgument app = Phantoms.project _Application _Application_argument @@ app
-
-applicationType :: TTerm Type -> TTerm Type -> TTerm ApplicationType
-applicationType function argument = Phantoms.record _ApplicationType [
-  _ApplicationType_function>>: function,
-  _ApplicationType_argument>>: argument]
-
-applicationTypeFunction :: TTerm ApplicationType -> TTerm Type
-applicationTypeFunction app = Phantoms.project _ApplicationType _ApplicationType_function @@ app
-
-applicationTypeArgument :: TTerm ApplicationType -> TTerm Type
-applicationTypeArgument app = Phantoms.project _ApplicationType _ApplicationType_argument @@ app
-
-eitherType :: TTerm Type -> TTerm Type -> TTerm EitherType
-eitherType left right = Phantoms.record _EitherType [
-  _EitherType_left>>: left,
-  _EitherType_right>>: right]
-
-eitherTypeLeft :: TTerm EitherType -> TTerm Type
-eitherTypeLeft et = Phantoms.project _EitherType _EitherType_left @@ et
-
-eitherTypeRight :: TTerm EitherType -> TTerm Type
-eitherTypeRight et = Phantoms.project _EitherType _EitherType_right @@ et
-
-pairType :: TTerm Type -> TTerm Type -> TTerm PairType
-pairType first second = Phantoms.record _PairType [
-  _PairType_first>>: first,
-  _PairType_second>>: second]
-
-pairTypeFirst :: TTerm PairType -> TTerm Type
-pairTypeFirst pt = Phantoms.project _PairType _PairType_first @@ pt
-
-pairTypeSecond :: TTerm PairType -> TTerm Type
-pairTypeSecond pt = Phantoms.project _PairType _PairType_second @@ pt
+-- | AsTerm-flexible overrides of generated functions.
+-- These allow passing TBinding values where TTerm is expected.
 
 binding :: AsTerm t Term => TTerm Name -> t -> TTerm (Maybe TypeScheme) -> TTerm Binding
-binding nameTerm termArg mtype = Phantoms.record _Binding [
-  _Binding_name>>: nameTerm,
-  _Binding_term>>: asTerm termArg,
-  _Binding_type>>: mtype]
-
-bindingName :: TTerm Binding -> TTerm Name
-bindingName lb = Phantoms.project _Binding _Binding_name @@ lb
-
-bindingTerm :: TTerm Binding -> TTerm Term
-bindingTerm lb = Phantoms.project _Binding _Binding_term @@ lb
-
-bindingType :: TTerm Binding -> TTerm (Y.Maybe TypeScheme)
-bindingType lb = Phantoms.project _Binding _Binding_type @@ lb
-
-bindingWithTerm :: TTerm Binding -> TTerm Term -> TTerm Binding
-bindingWithTerm b term = binding (Hydra.Dsl.Meta.Core.bindingName b) term (Hydra.Dsl.Meta.Core.bindingType b)
-
-caseStatement :: TTerm Name -> TTerm (Maybe Term) -> TTerm [Field] -> TTerm CaseStatement
-caseStatement typeName defaultTerm cases = Phantoms.record _CaseStatement [
-  _CaseStatement_typeName>>: typeName,
-  _CaseStatement_default>>: defaultTerm,
-  _CaseStatement_cases>>: cases]
-
-caseStatementTypeName :: TTerm CaseStatement -> TTerm Name
-caseStatementTypeName cs = Phantoms.project _CaseStatement _CaseStatement_typeName @@ cs
-
-caseStatementDefault :: TTerm CaseStatement -> TTerm (Maybe Term)
-caseStatementDefault cs = Phantoms.project _CaseStatement _CaseStatement_default @@ cs
-
-caseStatementCases :: TTerm CaseStatement -> TTerm [Field]
-caseStatementCases cs = Phantoms.project _CaseStatement _CaseStatement_cases @@ cs
-
-eliminationRecord :: TTerm Projection -> TTerm Elimination
-eliminationRecord = inject _Elimination _Elimination_record
-
-eliminationUnion :: TTerm CaseStatement -> TTerm Elimination
-eliminationUnion = inject _Elimination _Elimination_union
-
-eliminationWrap :: TTerm Name -> TTerm Elimination
-eliminationWrap = inject _Elimination _Elimination_wrap
-
-field :: TTerm Name -> TTerm Term -> TTerm Field
-field name term = Phantoms.record _Field [
-  _Field_name>>: name,
-  _Field_term>>: term]
-
-fieldName :: TTerm Field -> TTerm Name
-fieldName f = Phantoms.project _Field _Field_name @@ f
-
-fieldTerm :: TTerm Field -> TTerm Term
-fieldTerm f = Phantoms.project _Field _Field_term @@ f
-
-fieldType :: TTerm Name -> TTerm Type -> TTerm FieldType
-fieldType name typ = Phantoms.record _FieldType [
-  _FieldType_name>>: name,
-  _FieldType_type>>: typ]
-
-fieldTypeName :: TTerm FieldType -> TTerm Name
-fieldTypeName ft = Phantoms.project _FieldType _FieldType_name @@ ft
-
-fieldTypeType :: TTerm FieldType -> TTerm Type
-fieldTypeType ft = Phantoms.project _FieldType _FieldType_type @@ ft
-
-floatTypeBigfloat :: TTerm FloatType
-floatTypeBigfloat = injectUnit _FloatType _FloatType_bigfloat
-
-floatTypeFloat32 :: TTerm FloatType
-floatTypeFloat32 = injectUnit _FloatType _FloatType_float32
-
-floatTypeFloat64 :: TTerm FloatType
-floatTypeFloat64 = injectUnit _FloatType _FloatType_float64
-
-floatValueBigfloat :: TTerm Double -> TTerm FloatValue
-floatValueBigfloat = inject _FloatValue _FloatValue_bigfloat
-
-floatValueFloat32 :: TTerm Float -> TTerm FloatValue
-floatValueFloat32 = inject _FloatValue _FloatValue_float32
-
-floatValueFloat64 :: TTerm Double -> TTerm FloatValue
-floatValueFloat64 = inject _FloatValue _FloatValue_float64
-
-forallType :: TTerm Name -> TTerm Type -> TTerm ForallType
-forallType parameter body = Phantoms.record _ForallType [
-  _ForallType_parameter>>: parameter,
-  _ForallType_body>>: body]
-
-forallTypeParameter :: TTerm ForallType -> TTerm Name
-forallTypeParameter ft = Phantoms.project _ForallType _ForallType_parameter @@ ft
-
-forallTypeBody :: TTerm ForallType -> TTerm Type
-forallTypeBody ft = Phantoms.project _ForallType _ForallType_body @@ ft
-
-functionElimination :: TTerm Elimination -> TTerm Function
-functionElimination = inject _Function _Function_elimination
-
-functionLambda :: TTerm Lambda -> TTerm Function
-functionLambda = inject _Function _Function_lambda
-
-functionPrimitive :: TTerm Name -> TTerm Function
-functionPrimitive = inject _Function _Function_primitive
-
-functionType :: TTerm Type -> TTerm Type -> TTerm FunctionType
-functionType domain codomain = Phantoms.record _FunctionType [
-  _FunctionType_domain>>: domain,
-  _FunctionType_codomain>>: codomain]
-
-functionTypeDomain :: TTerm FunctionType -> TTerm Type
-functionTypeDomain ft = Phantoms.project _FunctionType _FunctionType_domain @@ ft
-
-functionTypeCodomain :: TTerm FunctionType -> TTerm Type
-functionTypeCodomain ft = Phantoms.project _FunctionType _FunctionType_codomain @@ ft
+binding n t ts = Gen.binding n (asTerm t) ts
 
 injection :: AsTerm t Name => t -> TTerm Field -> TTerm Injection
-injection typeName field = Phantoms.record _Injection [
-  _Injection_typeName>>: asTerm typeName,
-  _Injection_field>>: field]
-
-injectionTypeName :: TTerm Injection -> TTerm Name
-injectionTypeName inj = Phantoms.project _Injection _Injection_typeName @@ inj
-
-injectionField :: TTerm Injection -> TTerm Field
-injectionField inj = Phantoms.project _Injection _Injection_field @@ inj
-
-integerTypeBigint :: TTerm IntegerType
-integerTypeBigint = injectUnit _IntegerType _IntegerType_bigint
-
-integerTypeInt8 :: TTerm IntegerType
-integerTypeInt8 = injectUnit _IntegerType _IntegerType_int8
-
-integerTypeInt16 :: TTerm IntegerType
-integerTypeInt16 = injectUnit _IntegerType _IntegerType_int16
-
-integerTypeInt32 :: TTerm IntegerType
-integerTypeInt32 = injectUnit _IntegerType _IntegerType_int32
-
-integerTypeInt64 :: TTerm IntegerType
-integerTypeInt64 = injectUnit _IntegerType _IntegerType_int64
-
-integerTypeUint8 :: TTerm IntegerType
-integerTypeUint8 = injectUnit _IntegerType _IntegerType_uint8
-
-integerTypeUint16 :: TTerm IntegerType
-integerTypeUint16 = injectUnit _IntegerType _IntegerType_uint16
-
-integerTypeUint32 :: TTerm IntegerType
-integerTypeUint32 = injectUnit _IntegerType _IntegerType_uint32
-
-integerTypeUint64 :: TTerm IntegerType
-integerTypeUint64 = injectUnit _IntegerType _IntegerType_uint64
-
-integerValueBigint :: TTerm Integer -> TTerm IntegerValue
-integerValueBigint = inject _IntegerValue _IntegerValue_bigint
-
-integerValueInt8 :: TTerm Int8 -> TTerm IntegerValue
-integerValueInt8 = inject _IntegerValue _IntegerValue_int8
-
-integerValueInt16 :: TTerm Int16 -> TTerm IntegerValue
-integerValueInt16 = inject _IntegerValue _IntegerValue_int16
-
-integerValueInt32 :: TTerm Int -> TTerm IntegerValue
-integerValueInt32 = inject _IntegerValue _IntegerValue_int32
-
-integerValueInt64 :: TTerm Int64 -> TTerm IntegerValue
-integerValueInt64 = inject _IntegerValue _IntegerValue_int64
-
-integerValueUint8 :: TTerm Int16 -> TTerm IntegerValue
-integerValueUint8 = inject _IntegerValue _IntegerValue_uint8
-
-integerValueUint16 :: TTerm Int -> TTerm IntegerValue
-integerValueUint16 = inject _IntegerValue _IntegerValue_uint16
-
-integerValueUint32 :: TTerm Int64 -> TTerm IntegerValue
-integerValueUint32 = inject _IntegerValue _IntegerValue_uint32
-
-integerValueUint64 :: TTerm Integer -> TTerm IntegerValue
-integerValueUint64 = inject _IntegerValue _IntegerValue_uint64
-
-lambda :: TTerm Name -> TTerm (Maybe Type) -> TTerm Term -> TTerm Lambda
-lambda parameter mdom body = Phantoms.record _Lambda [
-  _Lambda_parameter>>: parameter,
-  _Lambda_domain>>: mdom,
-  _Lambda_body>>: body]
-
-lambdaParameter :: TTerm Lambda -> TTerm Name
-lambdaParameter l = Phantoms.project _Lambda _Lambda_parameter @@ l
-
-lambdaBody :: TTerm Lambda -> TTerm Term
-lambdaBody l = Phantoms.project _Lambda _Lambda_body @@ l
-
-lambdaDomain :: TTerm Lambda -> TTerm (Maybe Type)
-lambdaDomain l = Phantoms.project _Lambda _Lambda_domain @@ l
-
-lambdaWithBody :: TTerm Lambda -> TTerm Term -> TTerm Lambda
-lambdaWithBody l body = Hydra.Dsl.Meta.Core.lambda (Hydra.Dsl.Meta.Core.lambdaParameter l) (Hydra.Dsl.Meta.Core.lambdaDomain l) body
-
-let_ :: TTerm [Binding] -> TTerm Term -> TTerm Let
-let_ bindings body = Phantoms.record _Let [
-  _Let_bindings>>: bindings,
-  _Let_body>>: body]
-
-letBindings :: TTerm Let -> TTerm [Binding]
-letBindings l = Phantoms.project _Let _Let_bindings @@ l
-
-letBody :: TTerm Let -> TTerm Term
-letBody l = Phantoms.project _Let _Let_body @@ l
-
-letWithBody :: TTerm Let -> TTerm Term -> TTerm Let
-letWithBody l body = let_ (Hydra.Dsl.Meta.Core.letBindings l) body
-
-literalBinary :: TTerm B.ByteString -> TTerm Literal
-literalBinary = inject _Literal _Literal_binary
-
-literalBoolean :: TTerm Bool -> TTerm Literal
-literalBoolean = inject _Literal _Literal_boolean
-
-literalFloat :: TTerm FloatValue -> TTerm Literal
-literalFloat = inject _Literal _Literal_float
-
-literalInteger :: TTerm IntegerValue -> TTerm Literal
-literalInteger = inject _Literal _Literal_integer
-
-literalString :: TTerm String -> TTerm Literal
-literalString = inject _Literal _Literal_string
-
-literalTypeBinary :: TTerm LiteralType
-literalTypeBinary = injectUnit _LiteralType _LiteralType_binary
-
-literalTypeBoolean :: TTerm LiteralType
-literalTypeBoolean = injectUnit _LiteralType _LiteralType_boolean
-
-literalTypeFloat :: TTerm FloatType -> TTerm LiteralType
-literalTypeFloat = inject _LiteralType _LiteralType_float
-
-literalTypeInteger :: TTerm IntegerType -> TTerm LiteralType
-literalTypeInteger = inject _LiteralType _LiteralType_integer
-
-literalTypeString :: TTerm LiteralType
-literalTypeString = injectUnit _LiteralType _LiteralType_string
-
-mapType :: TTerm Type -> TTerm Type -> TTerm MapType
-mapType keys values = Phantoms.record _MapType [
-  _MapType_keys>>: keys,
-  _MapType_values>>: values]
-
-mapTypeKeys :: TTerm MapType -> TTerm Type
-mapTypeKeys mt = Phantoms.project _MapType _MapType_keys @@ mt
-
-mapTypeValues :: TTerm MapType -> TTerm Type
-mapTypeValues mt = Phantoms.project _MapType _MapType_values @@ mt
-
-name :: TTerm String -> TTerm Name
-name = wrap _Name
-
-nameLift :: Name -> TTerm Name
-nameLift (Name n) = wrap _Name $ Phantoms.string n
-
-projection :: TTerm Name -> TTerm Name -> TTerm Projection
-projection tname fname = Phantoms.record _Projection [
-  _Projection_typeName>>: tname,
-  _Projection_field>>: fname]
-
-projectionTypeName :: TTerm Projection -> TTerm Name
-projectionTypeName p = Phantoms.project _Projection _Projection_typeName @@ p
-
-projectionField :: TTerm Projection -> TTerm Name
-projectionField p = Phantoms.project _Projection _Projection_field @@ p
-
-record :: TTerm Name -> TTerm [Field] -> TTerm Record
-record typeName fields = Phantoms.record _Record [
-  _Record_typeName>>: typeName,
-  _Record_fields>>: fields]
-
-recordTypeName :: TTerm Record -> TTerm Name
-recordTypeName r = Phantoms.project _Record _Record_typeName @@ r
-
-recordFields :: TTerm Record -> TTerm [Field]
-recordFields r = Phantoms.project _Record _Record_fields @@ r
-
-rowType :: AsTerm t Name => t -> TTerm [FieldType] -> TTerm (RowType)
-rowType typeName fields = Phantoms.record _RowType [
-  _RowType_typeName>>: asTerm typeName,
-  _RowType_fields>>: fields]
-
-rowTypeTypeName :: TTerm RowType -> TTerm Name
-rowTypeTypeName rt = Phantoms.project _RowType _RowType_typeName @@ rt
-
-rowTypeFields :: TTerm RowType -> TTerm [FieldType]
-rowTypeFields rt = Phantoms.project _RowType _RowType_fields @@ rt
-
-termAnnotated :: TTerm AnnotatedTerm -> TTerm Term
-termAnnotated = inject _Term _Term_annotated
-
-termApplication :: TTerm Application -> TTerm Term
-termApplication = inject _Term _Term_application
-
-termEither :: TTerm (Either Term Term) -> TTerm Term
-termEither = inject _Term _Term_either
-
-termFunction :: TTerm Function -> TTerm Term
-termFunction = inject _Term _Term_function
-
-termLet :: TTerm Let -> TTerm Term
-termLet = inject _Term _Term_let
-
-termList :: TTerm [Term] -> TTerm Term
-termList = inject _Term _Term_list
-
-termLiteral :: TTerm Literal -> TTerm Term
-termLiteral = inject _Term _Term_literal
-
-termMap :: TTerm (M.Map Term Term) -> TTerm Term
-termMap = inject _Term _Term_map
-
-termMaybe :: TTerm (Maybe Term) -> TTerm Term
-termMaybe = inject _Term _Term_maybe
-
-termPair :: TTerm (Term, Term) -> TTerm Term
-termPair = inject _Term _Term_pair
-
-termRecord :: TTerm Record -> TTerm Term
-termRecord = inject _Term _Term_record
-
-termSet :: TTerm (S.Set Term) -> TTerm Term
-termSet = inject _Term _Term_set
-
-termTypeLambda :: TTerm TypeLambda -> TTerm Term
-termTypeLambda = inject _Term _Term_typeLambda
-
-termTypeApplication :: TTerm TypeApplicationTerm -> TTerm Term
-termTypeApplication = inject _Term _Term_typeApplication
-
-termUnion :: TTerm Injection -> TTerm Term
-termUnion = inject _Term _Term_union
-
-termUnit :: TTerm Term
-termUnit = injectUnit _Term _Term_unit
-
-termVariable :: TTerm Name -> TTerm Term
-termVariable = inject _Term _Term_variable
-
-termWrap :: TTerm WrappedTerm -> TTerm Term
-termWrap = inject _Term _Term_wrap
-
-typeLambda :: TTerm Name -> TTerm Term -> TTerm TypeLambda
-typeLambda parameter body = Phantoms.record _TypeLambda [
-  _TypeLambda_parameter>>: parameter,
-  _TypeLambda_body>>: body]
-
-typeLambdaParameter :: TTerm TypeLambda -> TTerm Name
-typeLambdaParameter ta = Phantoms.project _TypeLambda _TypeLambda_parameter @@ ta
-
-typeLambdaBody :: TTerm TypeLambda -> TTerm Term
-typeLambdaBody ta = Phantoms.project _TypeLambda _TypeLambda_body @@ ta
-
-typeLambdaWithBody :: TTerm TypeLambda -> TTerm Term -> TTerm TypeLambda
-typeLambdaWithBody tl body = typeLambda (Phantoms.project _TypeLambda _TypeLambda_parameter @@ tl) body
-
-typeAnnotated :: TTerm AnnotatedType -> TTerm Type
-typeAnnotated = inject _Type _Type_annotated
-
-typeApplication :: TTerm ApplicationType -> TTerm Type
-typeApplication = inject _Type _Type_application
-
-typeEither :: TTerm EitherType -> TTerm Type
-typeEither = inject _Type _Type_either
-
-typeForall :: TTerm ForallType -> TTerm Type
-typeForall = inject _Type _Type_forall
-
-typeFunction :: TTerm FunctionType -> TTerm Type
-typeFunction = inject _Type _Type_function
-
-typeList :: TTerm Type -> TTerm Type
-typeList = inject _Type _Type_list
-
-typeLiteral :: TTerm LiteralType -> TTerm Type
-typeLiteral = inject _Type _Type_literal
-
-typeMap :: TTerm MapType -> TTerm Type
-typeMap = inject _Type _Type_map
-
-typeMaybe :: TTerm Type -> TTerm Type
-typeMaybe = inject _Type _Type_maybe
-
-typePair :: TTerm PairType -> TTerm Type
-typePair = inject _Type _Type_pair
-
-typeRecord :: TTerm RowType -> TTerm Type
-typeRecord = inject _Type _Type_record
-
-typeScheme :: TTerm [Name] -> TTerm Type -> TTerm (Maybe (M.Map Name TypeVariableMetadata)) -> TTerm TypeScheme
-typeScheme variables body constraints = Phantoms.record _TypeScheme [
-  _TypeScheme_variables>>: variables,
-  _TypeScheme_type>>: body,
-  _TypeScheme_constraints>>: constraints]
-
-typeVariableMetadata :: TTerm (S.Set Name) -> TTerm TypeVariableMetadata
-typeVariableMetadata classes = Phantoms.record _TypeVariableMetadata [
-  _TypeVariableMetadata_classes>>: classes]
-
-typeVariableMetadataClasses :: TTerm TypeVariableMetadata -> TTerm (S.Set Name)
-typeVariableMetadataClasses meta = Phantoms.project _TypeVariableMetadata _TypeVariableMetadata_classes @@ meta
-
-typeSchemeVariables :: TTerm TypeScheme -> TTerm [Name]
-typeSchemeVariables ts = Phantoms.project _TypeScheme _TypeScheme_variables @@ ts
-
-typeSchemeType :: TTerm TypeScheme -> TTerm Type
-typeSchemeType ts = Phantoms.project _TypeScheme _TypeScheme_type @@ ts
-
-typeSchemeConstraints :: TTerm TypeScheme -> TTerm (Maybe (M.Map Name TypeVariableMetadata))
-typeSchemeConstraints ts = Phantoms.project _TypeScheme _TypeScheme_constraints @@ ts
-
-typeSet :: TTerm Type -> TTerm Type
-typeSet = inject _Type _Type_set
-
-typeUnion :: TTerm RowType -> TTerm Type
-typeUnion = inject _Type _Type_union
-
-typeUnit :: TTerm Type
-typeUnit = injectUnit _Type _Type_unit
+injection n f = Gen.injection (asTerm n) f
 
 typeVariable :: AsTerm t Name => t -> TTerm Type
-typeVariable n = inject _Type _Type_variable (asTerm n)
+typeVariable n = Gen.typeVariable (asTerm n)
 
-typeWrap :: TTerm WrappedType -> TTerm Type
-typeWrap = inject _Type _Type_wrap
 
-typeApplicationTerm :: TTerm Term -> TTerm Type -> TTerm TypeApplicationTerm
-typeApplicationTerm body type_ = Phantoms.record _TypeApplicationTerm [
-  _TypeApplicationTerm_body>>: body,
-  _TypeApplicationTerm_type>>: type_]
-
-typeApplicationTermBody :: TTerm TypeApplicationTerm -> TTerm Term
-typeApplicationTermBody tt = Phantoms.project _TypeApplicationTerm _TypeApplicationTerm_body @@ tt
-
-typeApplicationTermType :: TTerm TypeApplicationTerm -> TTerm Type
-typeApplicationTermType tt = Phantoms.project _TypeApplicationTerm _TypeApplicationTerm_type @@ tt
-
-unName :: TTerm Name -> TTerm String
-unName n = unwrap _Name @@ n
-
-unNamespace :: TTerm Namespace -> TTerm String
-unNamespace ns = unwrap _Namespace @@ ns
-
-wrappedTerm :: TTerm Name -> TTerm Term -> TTerm WrappedTerm
-wrappedTerm typeName object = Phantoms.record _WrappedTerm [
-  _WrappedTerm_typeName>>: typeName,
-  _WrappedTerm_body>>: object]
-
-wrappedTermTypeName :: TTerm WrappedTerm -> TTerm Name
-wrappedTermTypeName wt = Phantoms.project _WrappedTerm _WrappedTerm_typeName @@ wt
-
-wrappedTermBody :: TTerm WrappedTerm -> TTerm Term
-wrappedTermBody wt = Phantoms.project _WrappedTerm _WrappedTerm_body @@ wt
-
-wrappedType :: AsTerm t Name => t -> TTerm Type -> TTerm WrappedType
-wrappedType typeName object = Phantoms.record _WrappedType [
-  _WrappedType_typeName>>: asTerm typeName,
-  _WrappedType_body>>: object]
-
-wrappedTypeTypeName :: TTerm WrappedType -> TTerm Name
-wrappedTypeTypeName wt = Phantoms.project _WrappedType _WrappedType_typeName @@ wt
-
-wrappedTypeBody :: TTerm WrappedType -> TTerm Type
-wrappedTypeBody wt = Phantoms.project _WrappedType _WrappedType_body @@ wt
-
-----------------------------------------
--- Non-schema helpers
-
-equalName :: TTerm (Name -> Name -> Bool)
-equalName = lambdas ["left", "right"] $ primitive _equality_equal
-  @@ (Hydra.Dsl.Meta.Core.unName $ var "left")
-  @@ (Hydra.Dsl.Meta.Core.unName $ var "right")
+-- | Non-standard helpers (used in kernel source modules)
 
 equalName_ :: TTerm Name -> TTerm Name -> TTerm Bool
-equalName_ left right = Equality.equal (Hydra.Dsl.Meta.Core.unName left) (Hydra.Dsl.Meta.Core.unName right)
-
-equalNameList :: TTerm ([Name] -> [Name] -> Bool)
-equalNameList = lambdas ["lefts", "rights"] $ Logic.and
-  (Equality.equal (Lists.length (var "lefts")) (Lists.length (var "rights")))
-  (Logic.ands $ Lists.zipWith equalName (var "lefts") (var "rights"))
+equalName_ left right = Equality.equal (Gen.unName left) (Gen.unName right)
 
 equalNameList_ :: TTerm [Name] -> TTerm [Name] -> TTerm Bool
 equalNameList_ lefts rights = Logic.and
   (Equality.equal (Lists.length lefts) (Lists.length rights))
   (Logic.ands $ Lists.zipWith equalName lefts rights)
-
-fieldWithTerm :: TTerm Term -> TTerm Field -> TTerm Field
-fieldWithTerm t ft = Hydra.Dsl.Meta.Core.field (Hydra.Dsl.Meta.Core.fieldName ft) t
-
-fieldTypeWithType :: TTerm FieldType -> TTerm Type -> TTerm FieldType
-fieldTypeWithType ft t = Hydra.Dsl.Meta.Core.fieldType (Hydra.Dsl.Meta.Core.fieldTypeName ft) t
+  where
+    equalName = "left" ~> "right" ~> Equality.equal
+      (Gen.unName (var "left" :: TTerm Name))
+      (Gen.unName (var "right" :: TTerm Name))
 
 false :: TTerm Term
-false = termLiteral $ literalBoolean $ Phantoms.false
-
-int32 :: Int -> TTerm Term
-int32 = termLiteral . literalInteger . integerValueInt32 . Phantoms.int32
-
-string :: String -> TTerm Term
-string = termLiteral . literalString . Phantoms.string
+false = termLiteral $ literalBoolean $ TTerm $ TermLiteral $ LiteralBoolean False
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Grammar.hs b/src/main/haskell/Hydra/Dsl/Meta/Grammar.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Grammar.hs
+++ /dev/null
@@ -1,40 +0,0 @@
--- | Meta-DSL for constructing grammar-related terms (patterns, productions)
-
-module Hydra.Dsl.Meta.Grammar where
-
-import Hydra.Kernel hiding (Pattern)
-import Hydra.Dsl.Meta.Phantoms
-import Hydra.Grammar
-
-import qualified Data.Map as M
-import qualified Data.Maybe as Y
-
-
-labeledPatternLabel :: TTerm LabeledPattern -> TTerm Label
-labeledPatternLabel lp = project _LabeledPattern _LabeledPattern_label @@ lp
-
-labeledPatternPattern :: TTerm LabeledPattern -> TTerm Pattern
-labeledPatternPattern lp = project _LabeledPattern _LabeledPattern_pattern @@ lp
-
-production :: TTerm Symbol -> TTerm Pattern -> TTerm Production
-production sym pat = record _Production [
-  _Production_symbol>>: sym,
-  _Production_pattern>>: pat]
-
-productionSymbol :: TTerm Production -> TTerm Symbol
-productionSymbol p = project _Production _Production_symbol @@ p
-
-productionPattern :: TTerm Production -> TTerm Pattern
-productionPattern p = project _Production _Production_pattern @@ p
-
-unConstant :: TTerm Constant -> TTerm String
-unConstant c = unwrap _Constant @@ c
-
-unGrammar :: TTerm Grammar -> TTerm [Production]
-unGrammar g = unwrap _Grammar @@ g
-
-unLabel :: TTerm Label -> TTerm String
-unLabel l = unwrap _Label @@ l
-
-unSymbol :: TTerm Symbol -> TTerm String
-unSymbol s = unwrap _Symbol @@ s
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Graph.hs b/src/main/haskell/Hydra/Dsl/Meta/Graph.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Graph.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Graph.hs
@@ -1,13 +1,29 @@
--- | Meta-DSL for constructing graph-related terms (Comparison, Primitive, etc.)
+-- | Haskell-specific convenience layer over the generated Hydra.Dsl.Graph module.
+-- Re-exports all generated DSL functions and adds non-standard helpers.
 
-module Hydra.Dsl.Meta.Graph where
+module Hydra.Dsl.Meta.Graph (
+  module Hydra.Dsl.Graph,
+  module Hydra.Dsl.Meta.Graph,
+  DslGraph.primitiveName,
+  DslGraph.primitiveType,
+  DslGraph.graphPrimitives,
+) where
 
 import Hydra.Kernel
 import Hydra.Dsl.Meta.Phantoms
+import Hydra.Dsl.Graph hiding (primitiveName, primitiveType, graphPrimitives)
+import qualified Hydra.Dsl.Graph as DslGraph
 
+import qualified Hydra.Dsl.Meta.Lib.Lists as Lists
+import qualified Hydra.Dsl.Meta.Lib.Maps as Maps
+import qualified Hydra.Dsl.Meta.Lib.Sets as Sets
+
 import qualified Data.Map as M
+import qualified Data.Set as S
 
 
+-- | Non-standard helpers
+
 comparisonLessThan :: TTerm Comparison
 comparisonLessThan = injectUnit _Comparison _Comparison_lessThan
 
@@ -17,119 +33,24 @@
 comparisonGreaterThan :: TTerm Comparison
 comparisonGreaterThan = injectUnit _Comparison _Comparison_greaterThan
 
-graph :: TTerm [Binding]
-    -> TTerm (M.Map Name (Maybe Term))
-    -> TTerm (M.Map Name TypeScheme)
-    -> TTerm Term
-    -> TTerm (M.Map Name Primitive)
-    -> TTerm (Maybe Graph)
-    -> TTerm Graph
-graph elements environment types body primitives schema = record _Graph [
-    _Graph_elements>>: elements,
-    _Graph_environment>>: environment,
-    _Graph_types>>: types,
-    _Graph_body>>: body,
-    _Graph_primitives>>: primitives,
-    _Graph_schema>>: schema]
-
-graphElements :: TTerm Graph -> TTerm [Binding]
-graphElements g = project _Graph _Graph_elements @@ g
-
-graphEnvironment :: TTerm Graph -> TTerm (M.Map Name (Maybe Term))
-graphEnvironment g = project _Graph _Graph_environment @@ g
-
-graphTypes :: TTerm Graph -> TTerm (M.Map Name TypeScheme)
-graphTypes g = project _Graph _Graph_types @@ g
-
-graphBody :: TTerm Graph -> TTerm Term
-graphBody g = project _Graph _Graph_body @@ g
-
-graphPrimitives :: TTerm Graph -> TTerm (M.Map Name Primitive)
-graphPrimitives g = project _Graph _Graph_primitives @@ g
-
-graphSchema :: TTerm Graph -> TTerm (Maybe Graph)
-graphSchema g = project _Graph _Graph_schema @@ g
-
-graphWithElements :: TTerm Graph -> TTerm [Binding] -> TTerm Graph
-graphWithElements g newElements = graph
-    newElements
-    (Hydra.Dsl.Meta.Graph.graphEnvironment g)
-    (Hydra.Dsl.Meta.Graph.graphTypes g)
-    (Hydra.Dsl.Meta.Graph.graphBody g)
-    (Hydra.Dsl.Meta.Graph.graphPrimitives g)
-    (Hydra.Dsl.Meta.Graph.graphSchema g)
-
-graphWithEnvironment :: TTerm Graph -> TTerm (M.Map Name (Maybe Term)) -> TTerm Graph
-graphWithEnvironment g newEnvironment = graph
-    (Hydra.Dsl.Meta.Graph.graphElements g)
-    newEnvironment
-    (Hydra.Dsl.Meta.Graph.graphTypes g)
-    (Hydra.Dsl.Meta.Graph.graphBody g)
-    (Hydra.Dsl.Meta.Graph.graphPrimitives g)
-    (Hydra.Dsl.Meta.Graph.graphSchema g)
-
-graphWithTypes :: TTerm Graph -> TTerm (M.Map Name TypeScheme) -> TTerm Graph
-graphWithTypes g newTypes = graph
-    (Hydra.Dsl.Meta.Graph.graphElements g)
-    (Hydra.Dsl.Meta.Graph.graphEnvironment g)
-    newTypes
-    (Hydra.Dsl.Meta.Graph.graphBody g)
-    (Hydra.Dsl.Meta.Graph.graphPrimitives g)
-    (Hydra.Dsl.Meta.Graph.graphSchema g)
-
-graphWithBody :: TTerm Graph -> TTerm Term -> TTerm Graph
-graphWithBody g newBody = graph
-    (Hydra.Dsl.Meta.Graph.graphElements g)
-    (Hydra.Dsl.Meta.Graph.graphEnvironment g)
-    (Hydra.Dsl.Meta.Graph.graphTypes g)
-    newBody
-    (Hydra.Dsl.Meta.Graph.graphPrimitives g)
-    (Hydra.Dsl.Meta.Graph.graphSchema g)
-
-graphWithPrimitives :: TTerm Graph -> TTerm (M.Map Name Primitive) -> TTerm Graph
-graphWithPrimitives g newPrimitives = graph
-    (Hydra.Dsl.Meta.Graph.graphElements g)
-    (Hydra.Dsl.Meta.Graph.graphEnvironment g)
-    (Hydra.Dsl.Meta.Graph.graphTypes g)
-    (Hydra.Dsl.Meta.Graph.graphBody g)
-    newPrimitives
-    (Hydra.Dsl.Meta.Graph.graphSchema g)
-
-graphWithSchema :: TTerm Graph -> TTerm (Maybe Graph) -> TTerm Graph
-graphWithSchema g newSchema = graph
-    (Hydra.Dsl.Meta.Graph.graphElements g)
-    (Hydra.Dsl.Meta.Graph.graphEnvironment g)
-    (Hydra.Dsl.Meta.Graph.graphTypes g)
-    (Hydra.Dsl.Meta.Graph.graphBody g)
-    (Hydra.Dsl.Meta.Graph.graphPrimitives g)
-    newSchema
-
-primitive :: TTerm Name
-    -> TTerm TypeScheme
-    -> TTerm ([Term] -> Flow Graph Term)
-    -> TTerm Primitive
-primitive name typ implementation = record _Primitive [
-    _Primitive_name>>: name,
-    _Primitive_type>>: typ,
-    _Primitive_implementation>>: implementation]
-
-primitiveName :: TTerm Primitive -> TTerm Name
-primitiveName p = project _Primitive _Primitive_name @@ p
-
-primitiveType :: TTerm Primitive -> TTerm TypeScheme
-primitiveType p = project _Primitive _Primitive_type @@ p
-
-primitiveImplementation :: TTerm Primitive -> TTerm ([Term] -> Flow Graph Term)
-primitiveImplementation p = project _Primitive _Primitive_implementation @@ p
-
-primitiveWithType :: TTerm Primitive -> TTerm TypeScheme -> TTerm Primitive
-primitiveWithType p newType = Hydra.Dsl.Meta.Graph.primitive
-    (Hydra.Dsl.Meta.Graph.primitiveName p)
-    newType
-    (Hydra.Dsl.Meta.Graph.primitiveImplementation p)
-
 typeClassEquality :: TTerm TypeClass
 typeClassEquality = injectUnit _TypeClass _TypeClass_equality
 
 typeClassOrdering :: TTerm TypeClass
 typeClassOrdering = injectUnit _TypeClass _TypeClass_ordering
+
+emptyGraph :: TTerm Graph
+emptyGraph = graph
+    Maps.empty  -- boundTerms
+    Maps.empty  -- boundTypes
+    Maps.empty  -- classConstraints
+    Sets.empty  -- lambdaVariables
+    Maps.empty  -- metadata
+    Maps.empty  -- primitives
+    Maps.empty  -- schemaTypes
+    Sets.empty  -- typeVariables
+
+graphPrimitiveTypes :: TTerm Graph -> TTerm (M.Map Name TypeScheme)
+graphPrimitiveTypes g = Maps.fromList (Lists.map
+    ("_gpt_p" ~> pair (DslGraph.primitiveName $ var "_gpt_p") (DslGraph.primitiveType $ var "_gpt_p"))
+    (Maps.elems $ DslGraph.graphPrimitives g))
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Json.hs b/src/main/haskell/Hydra/Dsl/Meta/Json.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Json.hs
+++ /dev/null
@@ -1,28 +0,0 @@
--- | Meta-DSL for constructing JSON value terms
-
-module Hydra.Dsl.Meta.Json where
-
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Phantoms
-import Hydra.Json.Model
-
-import qualified Data.Map as M
-
-
-valueArray :: TTerm [Value] -> TTerm Value
-valueArray = inject _Value _Value_array
-
-valueBoolean :: TTerm Bool -> TTerm Value
-valueBoolean = inject _Value _Value_boolean
-
-valueNull :: TTerm Value
-valueNull = injectUnit _Value _Value_null
-
-valueNumber :: TTerm Double -> TTerm Value
-valueNumber = inject _Value _Value_number
-
-valueObject :: TTerm (M.Map String Value) -> TTerm Value
-valueObject = inject _Value _Value_object
-
-valueString :: TTerm String -> TTerm Value
-valueString = inject _Value _Value_string
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Chars.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Chars.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Chars.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Chars.hs
@@ -8,26 +8,26 @@
 import Hydra.Sources.Libraries
 
 
--- Follow's GHC.s Data.Char.isAlphaNum
+-- | Check whether a character is alphanumeric.
 isAlphaNum :: TTerm Int -> TTerm Bool
 isAlphaNum = primitive1 _chars_isAlphaNum
 
--- Follows GHC's Data.Char.isLower (GHC.Internal.Unicode.isLower)
+-- | Check whether a character is lowercase.
 isLower :: TTerm Int -> TTerm Bool
 isLower = primitive1 _chars_isLower
 
--- Follow's GHC.s Data.Char.isSpace
+-- | Check whether a character is a whitespace character.
 isSpace :: TTerm Int -> TTerm Bool
 isSpace = primitive1 _chars_isSpace
 
--- Follows GHC's Data.Char.isUpper (GHC.Internal.Unicode.isUpper)
+-- | Check whether a character is uppercase.
 isUpper :: TTerm Int -> TTerm Bool
 isUpper = primitive1 _chars_isUpper
 
--- Follows GHC's toLower (GHC.Internal.Unicode.Char.UnicodeData.SimpleLowerCaseMapping.toSimpleLowerCase)
+-- | Convert a character to lowercase.
 toLower :: TTerm Int -> TTerm Int
 toLower = primitive1 _chars_toLower
 
--- Follows GHC's toUpper (GHC.Internal.Unicode.Char.UnicodeData.SimpleUpperCaseMapping.toSimpleUpperCase)
+-- | Convert a character to uppercase.
 toUpper :: TTerm Int -> TTerm Int
 toUpper = primitive1 _chars_toUpper
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Eithers.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Eithers.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Eithers.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Eithers.hs
@@ -6,43 +6,65 @@
 import Hydra.Dsl.Meta.Phantoms
 import qualified Hydra.Dsl.Terms as Terms
 import Hydra.Sources.Libraries
+import qualified Data.Set as S
 
 
-bind :: TTerm (Either a b) -> TTerm (b -> Either a c) -> TTerm (Either a c)
-bind = primitive2 _eithers_bind
-
+-- | Map over both sides of an Either value.
 bimap :: TTerm (a -> c) -> TTerm (b -> d) -> TTerm (Either a b) -> TTerm (Either c d)
 bimap = primitive3 _eithers_bimap
 
+-- | Bind (flatMap) for Either: if Right, apply the function; if Left, return unchanged.
+bind :: TTerm (Either a b) -> TTerm (b -> Either a c) -> TTerm (Either a c)
+bind = primitive2 _eithers_bind
+
+-- | Eliminate an Either value by applying one of two functions.
 either_ :: TTerm (a -> c) -> TTerm (b -> c) -> TTerm (Either a b) -> TTerm c
 either_ = primitive3 _eithers_either
 
+-- | Left-fold over a list with an Either-returning function, short-circuiting on Left.
+foldl :: TTerm (a -> b -> Either c a) -> TTerm a -> TTerm [b] -> TTerm (Either c a)
+foldl = primitive3 _eithers_foldl
+
+-- | Extract the Left value, or return a default.
 fromLeft :: TTerm a -> TTerm (Either a b) -> TTerm a
 fromLeft = primitive2 _eithers_fromLeft
 
+-- | Extract the Right value, or return a default.
 fromRight :: TTerm b -> TTerm (Either a b) -> TTerm b
 fromRight = primitive2 _eithers_fromRight
 
+-- | Check if an Either is a Left value.
 isLeft :: TTerm (Either a b) -> TTerm Bool
 isLeft = primitive1 _eithers_isLeft
 
+-- | Check if an Either is a Right value.
 isRight :: TTerm (Either a b) -> TTerm Bool
 isRight = primitive1 _eithers_isRight
 
+-- | Extract all Left values from a list of Eithers.
 lefts :: TTerm [Either a b] -> TTerm [a]
 lefts = primitive1 _eithers_lefts
 
+-- | Map a function over the Right side of an Either (standard functor map).
 map :: TTerm (a -> b) -> TTerm (Either c a) -> TTerm (Either c b)
 map = primitive2 _eithers_map
 
+-- | Map a function returning Either over a list, collecting results or short-circuiting on Left.
 mapList :: TTerm (a -> Either e b) -> TTerm [a] -> TTerm (Either e [b])
 mapList = primitive2 _eithers_mapList
 
+-- | Map a function returning Either over a Maybe, or return Right Nothing if Nothing.
 mapMaybe :: TTerm (a -> Either c b) -> TTerm (Maybe a) -> TTerm (Either c (Maybe b))
 mapMaybe = primitive2 _eithers_mapMaybe
 
+-- | Map a function returning Either over a Set, collecting results or short-circuiting on Left.
+mapSet :: TTerm (a -> Either c b) -> TTerm (S.Set a) -> TTerm (Either c (S.Set b))
+mapSet = primitive2 _eithers_mapSet
+
+-- | Partition a list of Eithers into lefts and rights.
 partitionEithers :: TTerm [Either a b] -> TTerm ([a], [b])
 partitionEithers = primitive1 _eithers_partitionEithers
 
+-- | Extract all Right values from a list of Eithers.
 rights :: TTerm [Either a b] -> TTerm [b]
 rights = primitive1 _eithers_rights
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Equality.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Equality.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Equality.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Equality.hs
@@ -14,29 +14,38 @@
 import Data.Int
 
 
+-- | Compare two values and return a Comparison.
 compare :: AsTerm t2 a => TTerm a -> t2 -> TTerm Comparison
 compare t1 t2 = primitive2 _equality_compare t1 (asTerm t2)
 
+-- | Check if two values are equal.
 equal :: AsTerm t2 a => TTerm a -> t2 -> TTerm Bool
 equal t1 t2 = primitive2 _equality_equal t1 (asTerm t2)
 
+-- | Check if first value is greater than second.
 gt :: AsTerm t2 a => TTerm a -> t2 -> TTerm Bool
 gt t1 t2 = primitive2 _equality_gt t1 (asTerm t2)
 
+-- | Check if first value is greater than or equal to second.
 gte :: AsTerm t2 a => TTerm a -> t2 -> TTerm Bool
 gte t1 t2 = primitive2 _equality_gte t1 (asTerm t2)
 
+-- | Return a value unchanged.
 identity :: TTerm a -> TTerm a
 identity = primitive1 _equality_identity
 
+-- | Check if first value is less than second.
 lt :: AsTerm t2 a => TTerm a -> t2 -> TTerm Bool
 lt t1 t2 = primitive2 _equality_lt t1 (asTerm t2)
 
+-- | Check if first value is less than or equal to second.
 lte :: AsTerm t2 a => TTerm a -> t2 -> TTerm Bool
 lte t1 t2 = primitive2 _equality_lte t1 (asTerm t2)
 
+-- | Return the maximum of two values.
 max :: AsTerm t2 a => TTerm a -> t2 -> TTerm a
 max t1 t2 = primitive2 _equality_max t1 (asTerm t2)
 
+-- | Return the minimum of two values.
 min :: AsTerm t2 a => TTerm a -> t2 -> TTerm a
 min t1 t2 = primitive2 _equality_min t1 (asTerm t2)
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Flows.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Flows.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Flows.hs
+++ /dev/null
@@ -1,56 +0,0 @@
-{-# LANGUAGE FlexibleContexts #-}
-
--- | Phantom-typed term DSL for the hydra.lib.flows library
-
-module Hydra.Dsl.Meta.Lib.Flows where
-
-import Hydra.Compute
-import Hydra.Phantoms
-import Hydra.Dsl.AsTerm
-import Hydra.Dsl.Meta.Phantoms
-import qualified Hydra.Dsl.Terms as Terms
-import qualified Hydra.Dsl.Types as Types
-import Hydra.Sources.Libraries
-
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-
-apply :: TTerm (Flow s (x -> y)) -> TTerm (Flow s x) -> TTerm (Flow s y)
-apply = primitive2 _flows_apply
-
-bind :: (AsTerm t (Flow s x), AsTerm f (x -> Flow s y)) => t -> f -> TTerm (Flow s y)
-bind fx f = primitive2 _flows_bind (asTerm fx) (asTerm f)
-
-fail :: AsTerm f String => f -> TTerm (Flow s x)
-fail = primitive1 _flows_fail . asTerm
-
-foldl :: TTerm (x -> y -> Flow s x) -> TTerm x -> TTerm [y] -> TTerm (Flow s x)
-foldl = primitive3 _flows_foldl
-
-map :: (AsTerm f (x -> y), AsTerm t (Flow s x)) => f -> t -> TTerm (Flow s y)
-map f fx = primitive2 _flows_map (asTerm f) (asTerm fx)
-
-mapElems :: TTerm (v1 -> Flow s v2) -> TTerm (M.Map k v1) -> TTerm (Flow s (M.Map k v2))
-mapElems = primitive2 _flows_mapElems
-
-mapKeys :: TTerm (k1 -> Flow s k2) -> TTerm (M.Map k1 v) -> TTerm (Flow s (M.Map k2 v))
-mapKeys = primitive2 _flows_mapKeys
-
-mapList :: AsTerm f (x -> Flow s y) => f -> TTerm [x] -> TTerm (Flow s [y])
-mapList f = primitive2 _flows_mapList (asTerm f)
-
-mapMaybe :: AsTerm f (x -> Flow s y) => f -> TTerm (Maybe x) -> TTerm (Flow s (Maybe y))
-mapMaybe f = primitive2 _flows_mapMaybe (asTerm f)
-
-mapSet :: TTerm (x -> Flow s y) -> TTerm (S.Set x) -> TTerm (Flow s (S.Set y))
-mapSet = primitive2 _flows_mapSet
-
-pure :: AsTerm t x => t -> TTerm (Flow s x)
-pure x = primitive1 _flows_pure (asTerm x)
-
-sequence :: TTerm [Flow s a] -> TTerm (Flow s [a])
-sequence = primitive1 _flows_sequence
-
-withDefault :: AsTerm t x => t -> TTerm (Flow s x) -> TTerm (Flow s x)
-withDefault fallback flow = primitive2 _flows_withDefault (asTerm fallback) flow
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Lists.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Lists.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Lists.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Lists.hs
@@ -11,112 +11,150 @@
 import Hydra.Sources.Libraries
 
 
+-- | Apply a list of functions to a list of values (applicative style).
 apply :: TTerm [a -> b] -> TTerm [a] -> TTerm [b]
 apply = primitive2 _lists_apply
 
+-- | Get the element at a specified index in a list.
 at :: TTerm Int -> TTerm [a] -> TTerm a
 at = primitive2 _lists_at
 
+-- | Apply a function that returns lists to each element and flatten results.
 bind :: TTerm [a] -> TTerm (a -> [b]) -> TTerm [b]
 bind = primitive2 _lists_bind
 
+-- | Concatenate a list of lists.
 concat :: TTerm [[a]] -> TTerm [a]
 concat = primitive1 _lists_concat
 
+-- | Concatenate two lists.
 concat2 :: TTerm [a] -> TTerm [a] -> TTerm [a]
 concat2 = primitive2 _lists_concat2
 
+-- | Prepend a value to a list.
 cons :: TTerm a -> TTerm [a] -> TTerm [a]
 cons = primitive2 _lists_cons
 
+-- | Drop the first n elements from a list.
 drop :: TTerm Int -> TTerm [a] -> TTerm [a]
 drop = primitive2 _lists_drop
 
+-- | Drop elements from the beginning of a list while predicate is true.
 dropWhile :: TTerm (a -> Bool) -> TTerm [a] -> TTerm [a]
 dropWhile = primitive2 _lists_dropWhile
 
+-- | Check if an element is in a list.
 elem :: Eq a => TTerm a -> TTerm [a] -> TTerm Bool
 elem = primitive2 _lists_elem
 
+-- | Filter a list based on a predicate.
 filter :: AsTerm t [a] => TTerm (a -> Bool) -> t -> TTerm [a]
 filter p xs = primitive2 _lists_filter p (asTerm xs)
 
+-- | Find the first element matching a predicate.
 find :: TTerm (a -> Bool) -> TTerm [a] -> TTerm (Maybe a)
 find = primitive2 _lists_find
 
+-- | Fold a list from the left.
 foldl :: AsTerm f (b -> a -> b) => f -> TTerm b -> TTerm [a] -> TTerm b
 foldl f = primitive3 _lists_foldl (asTerm f)
 
+-- | Fold a list from the right.
+foldr :: AsTerm f (a -> b -> b) => f -> TTerm b -> TTerm [a] -> TTerm b
+foldr f = primitive3 _lists_foldr (asTerm f)
+
+-- | Group consecutive equal elements.
 group :: Eq a => TTerm [a] -> TTerm [[a]]
 group = primitive1 _lists_group
 
+-- | Get the first element of a list.
 head :: TTerm [a] -> TTerm a
 head = primitive1 _lists_head
 
+-- | Return all elements except the last one.
 init :: TTerm [a] -> TTerm [a]
 init = primitive1 _lists_init
 
+-- | Intercalate a list of lists with a separator list between each.
 intercalate :: TTerm [a] -> TTerm [[a]] -> TTerm [a]
 intercalate = primitive2 _lists_intercalate
 
+-- | Intersperse a value between elements of a list.
 intersperse :: TTerm a -> TTerm [a] -> TTerm [a]
 intersperse = primitive2 _lists_intersperse
 
+-- | Get the last element of a list.
 last :: TTerm [a] -> TTerm a
 last = primitive1 _lists_last
 
+-- | Get the length of a list.
 length :: TTerm [a] -> TTerm Int
 length = primitive1 _lists_length
 
--- | Map a function over a list
--- Accepts TTerm or TBinding for both arguments (via AsTerm)
+-- | Map a function over a list.
 map :: (AsTerm f (a -> b), AsTerm t [a]) => f -> t -> TTerm [b]
 map f l = primitive2 _lists_map (asTerm f) (asTerm l)
 
+-- | Remove duplicate elements from a list.
 nub :: Eq a => TTerm [a] -> TTerm [a]
 nub = primitive1 _lists_nub
 
+-- | Check if a list is empty.
 null :: TTerm [a] -> TTerm Bool
 null = primitive1 _lists_null
 
+-- | Partition a list into elements that satisfy a predicate and elements that do not.
 partition :: TTerm (a -> Bool) -> TTerm [a] -> TTerm ([a], [a])
 partition = primitive2 _lists_partition
 
+-- | Create a list with a single element.
 pure :: TTerm a -> TTerm [a]
 pure = primitive1 _lists_pure
 
+-- | Create a list with n copies of a value.
 replicate :: AsTerm t a => TTerm Int -> t -> TTerm [a]
 replicate n x = primitive2 _lists_replicate n (asTerm x)
 
+-- | Reverse a list.
 reverse :: TTerm [a] -> TTerm [a]
 reverse = primitive1 _lists_reverse
 
+-- | Get the first element of a list, returning Nothing if the list is empty.
 safeHead :: TTerm [a] -> TTerm (Maybe a)
 safeHead = primitive1 _lists_safeHead
 
+-- | Create a single-element list.
 singleton :: TTerm a -> TTerm [a]
 singleton = primitive1 _lists_singleton
 
+-- | Sort a list.
 sort :: TTerm [a] -> TTerm [a]
 sort = primitive1 _lists_sort
 
+-- | Sort a list based on a key function.
 sortOn :: TTerm (a -> b) -> TTerm [a] -> TTerm [a]
 sortOn = primitive2 _lists_sortOn
 
+-- | Split a list at the first element where predicate fails.
 span :: TTerm (a -> Bool) -> TTerm [a] -> TTerm ([a], [a])
 span = primitive2 _lists_span
 
+-- | Get all elements of a list except the first.
 tail :: TTerm [a] -> TTerm [a]
 tail = primitive1 _lists_tail
 
+-- | Take the first n elements from a list.
 take :: TTerm Int -> TTerm [a] -> TTerm [a]
 take = primitive2 _lists_take
 
+-- | Transpose a list of lists.
 transpose :: TTerm [[a]] -> TTerm [[a]]
 transpose = primitive1 _lists_transpose
 
+-- | Zip two lists into pairs.
 zip :: TTerm [a] -> TTerm [b] -> TTerm [(a, b)]
 zip = primitive2 _lists_zip
 
+-- | Zip two lists with a combining function.
 zipWith :: TTerm (a -> b -> c) -> TTerm [a] -> TTerm [b] -> TTerm [c]
 zipWith = primitive3 _lists_zipWith
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Literals.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Literals.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Literals.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Literals.hs
@@ -11,163 +11,214 @@
 import Data.Int
 
 
+-- | Convert a bigfloat (Double) to a bigint (Integer).
 bigfloatToBigint :: TTerm Double -> TTerm Integer
 bigfloatToBigint = primitive1 _literals_bigfloatToBigint
 
+-- | Convert a bigfloat (Double) to a float32 (Float).
 bigfloatToFloat32 :: TTerm Double -> TTerm Float
 bigfloatToFloat32 = primitive1 _literals_bigfloatToFloat32
 
+-- | Convert a bigfloat (Double) to a float64 (Double).
 bigfloatToFloat64 :: TTerm Double -> TTerm Double
 bigfloatToFloat64 = primitive1 _literals_bigfloatToFloat64
 
+-- | Convert a bigint (Integer) to a bigfloat (Double).
 bigintToBigfloat :: TTerm Integer -> TTerm Double
 bigintToBigfloat = primitive1 _literals_bigintToBigfloat
 
+-- | Convert a bigint (Integer) to an int8.
 bigintToInt8 :: TTerm Integer -> TTerm Int8
 bigintToInt8 = primitive1 _literals_bigintToInt8
 
+-- | Convert a bigint (Integer) to an int16.
 bigintToInt16 :: TTerm Integer -> TTerm Int16
 bigintToInt16 = primitive1 _literals_bigintToInt16
 
+-- | Convert a bigint (Integer) to an int32.
 bigintToInt32 :: TTerm Integer -> TTerm Int
 bigintToInt32 = primitive1 _literals_bigintToInt32
 
+-- | Convert a bigint (Integer) to an int64.
 bigintToInt64 :: TTerm Integer -> TTerm Int64
 bigintToInt64 = primitive1 _literals_bigintToInt64
 
+-- | Convert a bigint (Integer) to a uint8.
 bigintToUint8 :: TTerm Integer -> TTerm Int16
 bigintToUint8 = primitive1 _literals_bigintToUint8
 
+-- | Convert a bigint (Integer) to a uint16.
 bigintToUint16 :: TTerm Integer -> TTerm Int
 bigintToUint16 = primitive1 _literals_bigintToUint16
 
+-- | Convert a bigint (Integer) to a uint32.
 bigintToUint32 :: TTerm Integer -> TTerm Int64
 bigintToUint32 = primitive1 _literals_bigintToUint32
 
+-- | Convert a bigint (Integer) to a uint64.
 bigintToUint64 :: TTerm Integer -> TTerm Integer
 bigintToUint64 = primitive1 _literals_bigintToUint64
 
+-- | Convert binary to a list of byte values (0-255).
 binaryToBytes :: TTerm B.ByteString -> TTerm [Int]
 binaryToBytes = primitive1 _literals_binaryToBytes
 
+-- | Convert binary to string by base64 encoding.
 binaryToString :: TTerm B.ByteString -> TTerm String
 binaryToString = primitive1 _literals_binaryToString
 
+-- | Convert a float32 (Float) to a bigfloat (Double).
 float32ToBigfloat :: TTerm Float -> TTerm Double
 float32ToBigfloat = primitive1 _literals_float32ToBigfloat
 
+-- | Convert a float64 (Double) to a bigfloat (Double).
 float64ToBigfloat :: TTerm Double -> TTerm Double
 float64ToBigfloat = primitive1 _literals_float64ToBigfloat
 
+-- | Convert an int8 to a bigint (Integer).
 int8ToBigint :: TTerm Int8 -> TTerm Integer
 int8ToBigint = primitive1 _literals_int8ToBigint
 
+-- | Convert an int16 to a bigint (Integer).
 int16ToBigint :: TTerm Int16 -> TTerm Integer
 int16ToBigint = primitive1 _literals_int16ToBigint
 
+-- | Convert an int32 to a bigint (Integer).
 int32ToBigint :: TTerm Int -> TTerm Integer
 int32ToBigint = primitive1 _literals_int32ToBigint
 
+-- | Convert an int64 to a bigint (Integer).
 int64ToBigint :: TTerm Int64 -> TTerm Integer
 int64ToBigint = primitive1 _literals_int64ToBigint
 
+-- | Parse a string to a bigfloat (Double).
 readBigfloat :: TTerm String -> TTerm (Maybe Double)
 readBigfloat = primitive1 _literals_readBigfloat
 
+-- | Parse a string to a bigint (Integer).
 readBigint :: TTerm String -> TTerm (Maybe Integer)
 readBigint = primitive1 _literals_readBigint
 
+-- | Parse a string to a boolean.
 readBoolean :: TTerm String -> TTerm (Maybe Bool)
 readBoolean = primitive1 _literals_readBoolean
 
+-- | Parse a string to a float32 (Float).
 readFloat32 :: TTerm String -> TTerm (Maybe Float)
 readFloat32 = primitive1 _literals_readFloat32
 
+-- | Parse a string to a float64 (Double).
 readFloat64 :: TTerm String -> TTerm (Maybe Double)
 readFloat64 = primitive1 _literals_readFloat64
 
+-- | Parse a string to an int8 (-128 to 127).
 readInt8 :: TTerm String -> TTerm (Maybe Int8)
 readInt8 = primitive1 _literals_readInt8
 
+-- | Parse a string to an int16 (-32768 to 32767).
 readInt16 :: TTerm String -> TTerm (Maybe Int16)
 readInt16 = primitive1 _literals_readInt16
 
+-- | Parse a string to an int32.
 readInt32 :: TTerm String -> TTerm (Maybe Int)
 readInt32 = primitive1 _literals_readInt32
 
+-- | Parse a string to an int64.
 readInt64 :: TTerm String -> TTerm (Maybe Int64)
 readInt64 = primitive1 _literals_readInt64
 
+-- | Parse a string literal.
 readString :: TTerm String -> TTerm (Maybe String)
 readString = primitive1 _literals_readString
 
--- Note: Hydra uses wider signed types to represent unsigned values
--- Uint8 -> Int16, Uint16 -> Int, Uint32 -> Int64, Uint64 -> Integer
+-- | Parse a string to a uint8 (0 to 255).
 readUint8 :: TTerm String -> TTerm (Maybe Int16)
 readUint8 = primitive1 _literals_readUint8
 
+-- | Parse a string to a uint16 (0 to 65535).
 readUint16 :: TTerm String -> TTerm (Maybe Int)
 readUint16 = primitive1 _literals_readUint16
 
+-- | Parse a string to a uint32 (0 to 4294967295).
 readUint32 :: TTerm String -> TTerm (Maybe Int64)
 readUint32 = primitive1 _literals_readUint32
 
+-- | Parse a string to a uint64 (0 to 18446744073709551615).
 readUint64 :: TTerm String -> TTerm (Maybe Integer)
 readUint64 = primitive1 _literals_readUint64
 
+-- | Convert a bigfloat (Double) to string.
 showBigfloat :: TTerm Double -> TTerm String
 showBigfloat = primitive1 _literals_showBigfloat
 
+-- | Convert a bigint (Integer) to string.
 showBigint :: TTerm Integer -> TTerm String
 showBigint = primitive1 _literals_showBigint
 
+-- | Convert a boolean to string.
 showBoolean :: TTerm Bool -> TTerm String
 showBoolean = primitive1 _literals_showBoolean
 
+-- | Convert a float32 (Float) to string.
 showFloat32 :: TTerm Float -> TTerm String
 showFloat32 = primitive1 _literals_showFloat32
 
+-- | Convert a float64 (Double) to string.
 showFloat64 :: TTerm Double -> TTerm String
 showFloat64 = primitive1 _literals_showFloat64
 
+-- | Convert an int8 to string.
 showInt8 :: TTerm Int8 -> TTerm String
 showInt8 = primitive1 _literals_showInt8
 
+-- | Convert an int16 to string.
 showInt16 :: TTerm Int16 -> TTerm String
 showInt16 = primitive1 _literals_showInt16
 
+-- | Convert an int32 to string.
 showInt32 :: TTerm Int -> TTerm String
 showInt32 = primitive1 _literals_showInt32
 
+-- | Convert an int64 to string.
 showInt64 :: TTerm Int64 -> TTerm String
 showInt64 = primitive1 _literals_showInt64
 
+-- | Convert a string to a quoted string representation.
+showString :: TTerm String -> TTerm String
+showString = primitive1 _literals_showString
+
+-- | Convert a uint8 to string.
 showUint8 :: TTerm Int16 -> TTerm String
 showUint8 = primitive1 _literals_showUint8
 
+-- | Convert a uint16 to string.
 showUint16 :: TTerm Int -> TTerm String
 showUint16 = primitive1 _literals_showUint16
 
+-- | Convert a uint32 to string.
 showUint32 :: TTerm Int64 -> TTerm String
 showUint32 = primitive1 _literals_showUint32
 
+-- | Convert a uint64 to string.
 showUint64 :: TTerm Integer -> TTerm String
 showUint64 = primitive1 _literals_showUint64
 
-showString :: TTerm String -> TTerm String
-showString = primitive1 _literals_showString
-
+-- | Convert string to binary by base64 decoding.
 stringToBinary :: TTerm String -> TTerm B.ByteString
 stringToBinary = primitive1 _literals_stringToBinary
 
+-- | Convert a uint8 to a bigint (Integer).
 uint8ToBigint :: TTerm Int16 -> TTerm Integer
 uint8ToBigint = primitive1 _literals_uint8ToBigint
 
+-- | Convert a uint16 to a bigint (Integer).
 uint16ToBigint :: TTerm Int -> TTerm Integer
 uint16ToBigint = primitive1 _literals_uint16ToBigint
 
+-- | Convert a uint32 to a bigint (Integer).
 uint32ToBigint :: TTerm Int64 -> TTerm Integer
 uint32ToBigint = primitive1 _literals_uint32ToBigint
 
+-- | Convert a uint64 to a bigint (Integer).
 uint64ToBigint :: TTerm Integer -> TTerm Integer
 uint64ToBigint = primitive1 _literals_uint64ToBigint
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Logic.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Logic.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Logic.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Logic.hs
@@ -11,25 +11,29 @@
 import Hydra.Sources.Libraries
 
 
+-- | Compute the logical AND of two boolean values.
 and :: TTerm Bool -> TTerm Bool -> TTerm Bool
 and = primitive2 _logic_and
 
--- | Conditional expression: ifElse condition thenBranch elseBranch
--- Accepts TTerm or TBinding for condition and branches (via AsTerm)
+-- | Compute a conditional expression.
 ifElse :: (AsTerm c Bool, AsTerm t a, AsTerm e a) => c -> t -> e -> TTerm a
 ifElse cond t e = primitive3 _logic_ifElse (asTerm cond) (asTerm t) (asTerm e)
 
+-- | Compute the logical NOT of a boolean value.
 not :: TTerm Bool -> TTerm Bool
 not = primitive1 _logic_not
 
+-- | Compute the logical OR of two boolean values.
 or :: TTerm Bool -> TTerm Bool -> TTerm Bool
 or = primitive2 _logic_or
 
 ----------------------------------------
 -- Helpers which are not primitives
 
+-- | Fold a list of booleans with logical AND, returning True for an empty list.
 ands :: TTerm [Bool] -> TTerm Bool
 ands terms = fold (primitive _logic_and) @@ true @@ terms
 
+-- | Fold a list of booleans with logical OR, returning False for an empty list.
 ors :: TTerm [Bool] -> TTerm Bool
 ors terms = fold (primitive _logic_or) @@ false @@ terms
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Maps.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Maps.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Maps.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Maps.hs
@@ -13,62 +13,82 @@
 import Data.Map
 
 
+-- | Alter a value at a key using a function.
 alter :: TTerm (Maybe v -> Maybe v) -> TTerm k -> TTerm (Map k v) -> TTerm (Map k v)
 alter = primitive3 _maps_alter
 
+-- | Map a function over the keys and values of a map.
 bimap :: TTerm (k1 -> k2) -> TTerm (v1 -> v2) -> TTerm (Map k1 v1) -> TTerm (Map k2 v2)
 bimap = primitive3 _maps_bimap
 
+-- | Remove a key from a map.
 delete :: TTerm k -> TTerm (Map k v) -> TTerm (Map k v)
 delete = primitive2 _maps_delete
 
+-- | Get the values of a map.
 elems :: TTerm (Map k v) -> TTerm [v]
 elems = primitive1 _maps_elems
 
+-- | Create an empty map.
 empty :: TTerm (Map k v)
 empty = primitive _maps_empty
 
+-- | Filter a map based on values.
 filter :: TTerm (v -> Bool) -> TTerm (Map k v) -> TTerm (Map k v)
 filter = primitive2 _maps_filter
 
+-- | Filter a map based on key-value pairs.
 filterWithKey :: TTerm (k -> v -> Bool) -> TTerm (Map k v) -> TTerm (Map k v)
 filterWithKey = primitive2 _maps_filterWithKey
 
+-- | Lookup a value with a default.
 findWithDefault :: AsTerm t v => t -> TTerm k -> TTerm (Map k v) -> TTerm v
 findWithDefault def = primitive3 _maps_findWithDefault (asTerm def)
 
+-- | Create a map from a list of key-value pairs.
 fromList :: TTerm [(k, v)] -> TTerm (Map k v)
 fromList = primitive1 _maps_fromList
 
+-- | Insert a key-value pair into a map.
 insert :: TTerm k -> TTerm v -> TTerm (Map k v) -> TTerm (Map k v)
 insert = primitive3 _maps_insert
 
+-- | Get the keys of a map.
 keys :: TTerm (Map k v) -> TTerm [k]
 keys = primitive1 _maps_keys
 
+-- | Lookup a value in a map.
 lookup :: AsTerm t k => t -> TTerm (Map k v) -> TTerm (Maybe v)
 lookup k = primitive2 _maps_lookup (asTerm k)
 
+-- | Map a function over a map.
 map :: AsTerm f (v1 -> v2) => f -> TTerm (Map k v1) -> TTerm (Map k v2)
 map f = primitive2 _maps_map (asTerm f)
 
+-- | Map a function over the keys of a map.
 mapKeys :: TTerm (k1 -> k2) -> TTerm (Map k1 v) -> TTerm (Map k2 v)
 mapKeys = primitive2 _maps_mapKeys
 
+-- | Check if a key is present in a map.
 member :: TTerm k -> TTerm (Map k v) -> TTerm Bool
 member = primitive2 _maps_member
 
+-- | Check if a map is empty.
 null :: TTerm (Map k v) -> TTerm Bool
 null = primitive1 _maps_null
 
+-- | Create a map with a single key-value pair.
 singleton :: TTerm k -> TTerm v -> TTerm (Map k v)
 singleton = primitive2 _maps_singleton
 
+-- | Get the size of a map.
 size :: TTerm (Map k v) -> TTerm Int
 size = primitive1 _maps_size
 
+-- | Convert a map to a list of key-value pairs.
 toList :: TTerm (Map k v) -> TTerm [(k, v)]
 toList = primitive1 _maps_toList
 
+-- | Union two maps, with the first taking precedence.
 union :: TTerm (Map k v) -> TTerm (Map k v) -> TTerm (Map k v)
 union = primitive2 _maps_union
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Math.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Math.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Math.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Math.hs
@@ -8,122 +8,174 @@
 import Hydra.Sources.Libraries
 
 
+-- | Return the absolute value.
 abs :: Num a => TTerm a -> TTerm a
 abs = primitive1 _math_abs
 
+-- | Return the arc cosine of x in radians.
 acos :: TTerm Double -> TTerm Double
 acos = primitive1 _math_acos
 
+-- | Return the inverse hyperbolic cosine of x.
 acosh :: TTerm Double -> TTerm Double
 acosh = primitive1 _math_acosh
 
+-- | Add two numbers.
 add :: Num a => TTerm a -> TTerm a -> TTerm a
 add = primitive2 _math_add
 
+-- | Return the arc sine of x in radians.
 asin :: TTerm Double -> TTerm Double
 asin = primitive1 _math_asin
 
+-- | Return the inverse hyperbolic sine of x.
 asinh :: TTerm Double -> TTerm Double
 asinh = primitive1 _math_asinh
 
+-- | Return the arc tangent of x in radians.
 atan :: TTerm Double -> TTerm Double
 atan = primitive1 _math_atan
 
+-- | Return the arc tangent of y/x in radians, using signs to determine quadrant.
 atan2 :: TTerm Double -> TTerm Double -> TTerm Double
 atan2 = primitive2 _math_atan2
 
+-- | Return the inverse hyperbolic tangent of x.
 atanh :: TTerm Double -> TTerm Double
 atanh = primitive1 _math_atanh
 
+-- | Return the ceiling of x as an integer.
 ceiling :: TTerm Double -> TTerm Integer
 ceiling = primitive1 _math_ceiling
 
+-- | Return the cosine of x radians.
 cos :: TTerm Double -> TTerm Double
 cos = primitive1 _math_cos
 
+-- | Return the hyperbolic cosine of x.
 cosh :: TTerm Double -> TTerm Double
 cosh = primitive1 _math_cosh
 
+-- | Divide two integers using integer division.
 div :: Integral a => TTerm a -> TTerm a -> TTerm a
 div = primitive2 _math_div
 
+-- | Euler's number (e = 2.71828).
 e :: TTerm Double
 e = primitive _math_e
 
+-- | Check if an integer is even.
 even :: Integral a => TTerm a -> TTerm Bool
 even = primitive1 _math_even
 
+-- | Return e raised to the power x.
 exp :: TTerm Double -> TTerm Double
 exp = primitive1 _math_exp
 
+-- | Return the floor of x as an integer.
 floor :: TTerm Double -> TTerm Integer
 floor = primitive1 _math_floor
 
+-- | Return the natural logarithm of x.
 log :: TTerm Double -> TTerm Double
 log = primitive1 _math_log
 
+-- | Return the logarithm of x to the given base.
 logBase :: TTerm Double -> TTerm Double -> TTerm Double
 logBase = primitive2 _math_logBase
 
+-- | Return the maximum of two values.
 max :: Ord a => TTerm a -> TTerm a -> TTerm a
 max = primitive2 _math_max
 
+-- | Return the minimum of two values.
 min :: Ord a => TTerm a -> TTerm a -> TTerm a
 min = primitive2 _math_min
 
+-- | Mathematical modulo.
 mod :: Integral a => TTerm a -> TTerm a -> TTerm a
 mod = primitive2 _math_mod
 
+-- | Multiply two numbers.
 mul :: Num a => TTerm a -> TTerm a -> TTerm a
 mul = primitive2 _math_mul
 
+-- | Negate a number.
 negate :: Num a => TTerm a -> TTerm a
 negate = primitive1 _math_negate
 
+-- | Check if an integer is odd.
 odd :: Integral a => TTerm a -> TTerm Bool
 odd = primitive1 _math_odd
 
+-- | Pi (pi = 3.14159).
 pi :: TTerm Double
 pi = primitive _math_pi
 
+-- | Return x raised to the power y.
 pow :: TTerm Double -> TTerm Double -> TTerm Double
 pow = primitive2 _math_pow
 
+-- | Return the predecessor (x - 1).
 pred :: Enum a => TTerm a -> TTerm a
 pred = primitive1 _math_pred
 
+-- | Generate a range of values from start to end (inclusive).
 range :: Enum a => TTerm a -> TTerm a -> TTerm [a]
 range start end = primitive2 _math_range start end
 
+-- | Integer remainder.
 rem :: Integral a => TTerm a -> TTerm a -> TTerm a
 rem = primitive2 _math_rem
 
+-- | Return x rounded to the nearest integer.
 round :: TTerm Double -> TTerm Integer
 round = primitive1 _math_round
 
+-- | Round a bigfloat to n significant digits.
+roundBigfloat :: TTerm Int -> TTerm Double -> TTerm Double
+roundBigfloat = primitive2 _math_roundBigfloat
+
+-- | Round a float32 to n significant digits.
+roundFloat32 :: TTerm Int -> TTerm Float -> TTerm Float
+roundFloat32 = primitive2 _math_roundFloat32
+
+-- | Round a float64 to n significant digits.
+roundFloat64 :: TTerm Int -> TTerm Double -> TTerm Double
+roundFloat64 = primitive2 _math_roundFloat64
+
+-- | Return the sign of a number (-1, 0, or 1).
 signum :: Num a => TTerm a -> TTerm a
 signum = primitive1 _math_signum
 
+-- | Return the sine of x radians.
 sin :: TTerm Double -> TTerm Double
 sin = primitive1 _math_sin
 
+-- | Return the hyperbolic sine of x.
 sinh :: TTerm Double -> TTerm Double
 sinh = primitive1 _math_sinh
 
+-- | Return the square root of x.
 sqrt :: TTerm Double -> TTerm Double
 sqrt = primitive1 _math_sqrt
 
+-- | Subtract two numbers.
 sub :: Num a => TTerm a -> TTerm a -> TTerm a
 sub = primitive2 _math_sub
 
+-- | Return the successor (x + 1).
 succ :: Enum a => TTerm a -> TTerm a
 succ = primitive1 _math_succ
 
+-- | Return the tangent of x radians.
 tan :: TTerm Double -> TTerm Double
 tan = primitive1 _math_tan
 
+-- | Return the hyperbolic tangent of x.
 tanh :: TTerm Double -> TTerm Double
 tanh = primitive1 _math_tanh
 
+-- | Return x truncated to an integer (towards zero).
 truncate :: TTerm Double -> TTerm Integer
 truncate = primitive1 _math_truncate
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Maybes.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Maybes.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Maybes.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Maybes.hs
@@ -11,41 +11,58 @@
 import Hydra.Sources.Libraries
 
 
+-- | Apply a function to an argument (applicative).
 apply :: TTerm (Maybe (a -> b)) -> TTerm (Maybe a) -> TTerm (Maybe b)
 apply = primitive2 _maybes_apply
 
+-- | Chain operations on optional values, handling Nothing cases automatically.
 bind :: TTerm (Maybe a) -> TTerm (a -> Maybe b) -> TTerm (Maybe b)
 bind = primitive2 _maybes_bind
 
+-- | Handle an optional value with the maybe value as the first argument.
 cases :: TTerm (Maybe a) -> TTerm b -> TTerm (a -> b) -> TTerm b
 cases = primitive3 _maybes_cases
 
+-- | Filter out Nothing values from a list.
 cat :: TTerm [Maybe a] -> TTerm [a]
 cat = primitive1 _maybes_cat
 
+-- | Compose two Maybe-returning functions (Kleisli composition).
 compose :: TTerm (a -> Maybe b) -> TTerm (b -> Maybe c) -> TTerm (a -> Maybe c)
 compose = primitive2 _maybes_compose
 
+-- | Extract value from a Just, or error on Nothing (partial function).
 fromJust :: TTerm (Maybe a) -> TTerm a
 fromJust = primitive1 _maybes_fromJust
 
+-- | Get a value from an optional value, or return a default value.
 fromMaybe :: TTerm a -> TTerm (Maybe a) -> TTerm a
 fromMaybe = primitive2 _maybes_fromMaybe
 
+-- | Check if a value is Just.
 isJust :: TTerm (Maybe a) -> TTerm Bool
 isJust = primitive1 _maybes_isJust
 
+-- | Check if a value is Nothing.
 isNothing :: TTerm (Maybe a) -> TTerm Bool
 isNothing = primitive1 _maybes_isNothing
 
+-- | Map a function over an optional value.
 map :: AsTerm f (a -> b) => f -> TTerm (Maybe a) -> TTerm (Maybe b)
 map f = primitive2 _maybes_map (asTerm f)
 
+-- | Map a function over a list and collect Just results.
 mapMaybe :: TTerm (a -> Maybe b) -> TTerm [a] -> TTerm [b]
 mapMaybe = primitive2 _maybes_mapMaybe
 
+-- | Eliminate an optional value with a default and a function.
 maybe :: (AsTerm t1 b, AsTerm t2 (a -> b)) => t1 -> t2 -> TTerm (Maybe a) -> TTerm b
 maybe def f = primitive3 _maybes_maybe (asTerm def) (asTerm f)
 
+-- | Lift a value into the Maybe type.
 pure :: TTerm a -> TTerm (Maybe a)
 pure = primitive1 _maybes_pure
+
+-- | Convert a Maybe to a list: Just x becomes [x], Nothing becomes [].
+toList :: TTerm (Maybe a) -> TTerm [a]
+toList = primitive1 _maybes_toList
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Pairs.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Pairs.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Pairs.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Pairs.hs
@@ -8,11 +8,14 @@
 import Hydra.Sources.Libraries
 
 
+-- | Map over both elements of a pair.
 bimap :: TTerm (a -> c) -> TTerm (b -> d) -> TTerm (a, b) -> TTerm (c, d)
 bimap = primitive3 _pairs_bimap
 
+-- | Get the first element of a pair.
 first :: TTerm (a, b) -> TTerm a
 first = primitive1 _pairs_first
 
+-- | Get the second element of a pair.
 second :: TTerm (a, b) -> TTerm b
 second = primitive1 _pairs_second
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Regex.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Regex.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Regex.hs
@@ -0,0 +1,33 @@
+-- | Phantom-typed term DSL for the hydra.lib.regex library
+
+module Hydra.Dsl.Meta.Lib.Regex where
+
+import Hydra.Phantoms
+import Hydra.Dsl.Meta.Phantoms
+import qualified Hydra.Dsl.Terms as Terms
+import Hydra.Sources.Libraries
+
+
+-- | Find the first substring matching a regex pattern.
+find :: TTerm String -> TTerm String -> TTerm (Maybe String)
+find = primitive2 _regex_find
+
+-- | Find all non-overlapping substrings matching a regex pattern.
+findAll :: TTerm String -> TTerm String -> TTerm [String]
+findAll = primitive2 _regex_findAll
+
+-- | Check whether an entire string matches a regex pattern.
+matches :: TTerm String -> TTerm String -> TTerm Bool
+matches = primitive2 _regex_matches
+
+-- | Replace the first occurrence of a regex pattern with a replacement string.
+replace :: TTerm String -> TTerm String -> TTerm String -> TTerm String
+replace = primitive3 _regex_replace
+
+-- | Replace all non-overlapping occurrences of a regex pattern with a replacement string.
+replaceAll :: TTerm String -> TTerm String -> TTerm String -> TTerm String
+replaceAll = primitive3 _regex_replaceAll
+
+-- | Split a string by a regex pattern.
+split :: TTerm String -> TTerm String -> TTerm [String]
+split = primitive2 _regex_split
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Sets.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Sets.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Sets.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Sets.hs
@@ -13,44 +13,58 @@
 import Data.Set
 
 
+-- | Delete an element from a set.
 delete :: AsTerm t a => t -> TTerm (Set a) -> TTerm (Set a)
 delete x = primitive2 _sets_delete (asTerm x)
 
+-- | Compute the difference of two sets.
 difference :: TTerm (Set a) -> TTerm (Set a) -> TTerm (Set a)
 difference = primitive2 _sets_difference
 
+-- | Create an empty set.
 empty :: TTerm (Set a)
 empty = primitive _sets_empty
 
+-- | Create a set from a list.
 fromList :: AsTerm t [a] => t -> TTerm (Set a)
 fromList xs = primitive1 _sets_fromList (asTerm xs)
 
+-- | Insert an element into a set.
 insert :: TTerm a -> TTerm (Set a) -> TTerm (Set a)
 insert = primitive2 _sets_insert
 
+-- | Compute the intersection of two sets.
 intersection :: TTerm (Set a) -> TTerm (Set a) -> TTerm (Set a)
 intersection = primitive2 _sets_intersection
 
+-- | Map a function over a set.
 map :: TTerm (a -> b) -> TTerm (Set a) -> TTerm (Set b)
 map = primitive2 _sets_map
 
+-- | Check if an element is in a set.
 member :: TTerm a -> TTerm (Set a) -> TTerm Bool
 member = primitive2 _sets_member
 
+-- | Check if a set is empty.
 null :: TTerm (Set a) -> TTerm Bool
 null = primitive1 _sets_null
 
+-- | Create a singleton set.
 singleton :: TTerm a -> TTerm (Set a)
 singleton = primitive1 _sets_singleton
 
+-- | Get the size of a set.
 size :: TTerm (Set a) -> TTerm Int
 size = primitive1 _sets_size
 
+-- | Convert a set to a list.
 toList :: TTerm (Set a) -> TTerm [a]
 toList = primitive1 _sets_toList
 
+-- | Compute the union of two sets.
 union :: TTerm (Set a) -> TTerm (Set a) -> TTerm (Set a)
 union = primitive2 _sets_union
 
+-- | Compute the union of multiple sets.
 unions :: TTerm [Set a] -> TTerm (Set a)
 unions = primitive1 _sets_unions
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Lib/Strings.hs b/src/main/haskell/Hydra/Dsl/Meta/Lib/Strings.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Lib/Strings.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Lib/Strings.hs
@@ -8,49 +8,60 @@
 import Hydra.Sources.Libraries
 
 
---(++) :: TTerm String -> TTerm String -> TTerm String
---l ++ r = (primitive _strings_cat) @@ (list [l, r])
-
+-- | Concatenate a list of strings into a single string.
 cat :: TTerm [String] -> TTerm String
 cat = primitive1 _strings_cat
 
+-- | Concatenate two strings.
 cat2 :: TTerm String -> TTerm String -> TTerm String
 cat2 = primitive2 _strings_cat2
 
+-- | Get the Unicode code point of the character at a specific index in a string.
 charAt :: TTerm Int -> TTerm String -> TTerm Int
 charAt = primitive2 _strings_charAt
 
+-- | Convert a list of Unicode code points to a string.
 fromList :: TTerm [Int] -> TTerm String
 fromList = primitive1 _strings_fromList
 
+-- | Join a list of strings with a separator between each element.
 intercalate :: TTerm String -> TTerm [String] -> TTerm String
 intercalate = primitive2 _strings_intercalate
 
+-- | Return the length of a string.
 length :: TTerm String -> TTerm Int
 length = primitive1 _strings_length
 
+-- | Split a string into lines.
 lines :: TTerm String -> TTerm [String]
 lines = primitive1 _strings_lines
 
+-- | Check whether a string is empty.
 null :: TTerm String -> TTerm Bool
 null = primitive1 _strings_null
 
+-- | Split a string on a delimiter string.
 splitOn :: TTerm String -> TTerm String -> TTerm [String]
 splitOn = primitive2 _strings_splitOn
 
+-- | Convert a string to a list of Unicode code points.
 toList :: TTerm String -> TTerm [Int]
 toList = primitive1 _strings_toList
 
+-- | Convert a string to lowercase.
 toLower :: TTerm String -> TTerm String
 toLower = primitive1 _strings_toLower
 
+-- | Convert a string to uppercase.
 toUpper :: TTerm String -> TTerm String
 toUpper = primitive1 _strings_toUpper
 
+-- | Join a list of strings with newlines, appending a trailing newline.
 unlines :: TTerm [String] -> TTerm String
 unlines = primitive1 _strings_unlines
 
 -- Helpers
 
+-- | Concatenate a Haskell list of string terms into a single string.
 concat :: [TTerm String] -> TTerm String
 concat strings = primitive _strings_cat @@ list strings
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Module.hs b/src/main/haskell/Hydra/Dsl/Meta/Module.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Module.hs
+++ /dev/null
@@ -1,101 +0,0 @@
--- | Meta-DSL for constructing module-related terms (definitions, namespaces)
-
-module Hydra.Dsl.Meta.Module where
-
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Phantoms
-
-import qualified Data.Map as M
-
-
-definitionTerm :: TTerm TermDefinition -> TTerm Definition
-definitionTerm = inject _Definition _Definition_term
-
-definitionType :: TTerm TypeDefinition -> TTerm Definition
-definitionType = inject _Definition _Definition_type
-
-module_ :: TTerm Namespace -> TTerm [Binding] -> TTerm [Namespace] -> TTerm [Namespace] -> TTerm (Maybe String) -> TTerm Module
-module_ ns elems termDeps typeDeps desc = record _Module [
-  _Module_namespace>>: ns,
-  _Module_elements>>: elems,
-  _Module_termDependencies>>: termDeps,
-  _Module_typeDependencies>>: typeDeps,
-  _Module_description>>: desc]
-
-moduleNamespace :: TTerm Module -> TTerm Namespace
-moduleNamespace m = project _Module _Module_namespace @@ m
-
-moduleElements :: TTerm Module -> TTerm [Binding]
-moduleElements m = project _Module _Module_elements @@ m
-
-moduleTermDependencies :: TTerm Module -> TTerm [Namespace]
-moduleTermDependencies m = project _Module _Module_termDependencies @@ m
-
-moduleTypeDependencies :: TTerm Module -> TTerm [Namespace]
-moduleTypeDependencies m = project _Module _Module_typeDependencies @@ m
-
-moduleDescription :: TTerm Module -> TTerm (Maybe String)
-moduleDescription m = project _Module _Module_description @@ m
-
-namespace :: TTerm String -> TTerm Namespace
-namespace ns = wrap _Namespace ns
-
-namespaces :: TTerm (Namespace, n) -> TTerm (M.Map Namespace n) -> TTerm (Namespaces n)
-namespaces focus mapping = record _Namespaces [
-  _Namespaces_focus>>: focus,
-  _Namespaces_mapping>>: mapping]
-
-namespacesFocus :: TTerm (Namespaces n) -> TTerm (Namespace, n)
-namespacesFocus ns = project _Namespaces _Namespaces_focus @@ ns
-
-namespacesMapping :: TTerm (Namespaces n) -> TTerm (M.Map Namespace n)
-namespacesMapping ns = project _Namespaces _Namespaces_mapping @@ ns
-
-namespacesWithFocus :: TTerm (Namespaces n) -> TTerm (Namespace, n) -> TTerm (Namespaces n)
-namespacesWithFocus ns focus = namespaces focus (Hydra.Dsl.Meta.Module.namespacesMapping ns)
-
-namespacesWithMapping :: TTerm (Namespaces n) -> TTerm (M.Map Namespace n) -> TTerm (Namespaces n)
-namespacesWithMapping ns mapping = namespaces (Hydra.Dsl.Meta.Module.namespacesFocus ns) mapping
-
-qualifiedName :: TTerm (Maybe Namespace) -> TTerm String -> TTerm QualifiedName
-qualifiedName ns local = record _QualifiedName [
-  _QualifiedName_namespace>>: ns,
-  _QualifiedName_local>>: local]
-
-qualifiedNameLocal :: TTerm QualifiedName -> TTerm String
-qualifiedNameLocal qn = project _QualifiedName _QualifiedName_local @@ qn
-
-qualifiedNameNamespace :: TTerm QualifiedName -> TTerm (Maybe Namespace)
-qualifiedNameNamespace qn = project _QualifiedName _QualifiedName_namespace @@ qn
-
-termDefinition :: TTerm Name -> TTerm Term -> TTerm TypeScheme -> TTerm TermDefinition
-termDefinition name term typeScheme = record _TermDefinition [
-  _TermDefinition_name>>: name,
-  _TermDefinition_term>>: term,
-  _TermDefinition_type>>: typeScheme]
-
-termDefinitionName :: TTerm TermDefinition -> TTerm Name
-termDefinitionName td = project _TermDefinition _TermDefinition_name @@ td
-
-termDefinitionTerm :: TTerm TermDefinition -> TTerm Term
-termDefinitionTerm td = project _TermDefinition _TermDefinition_term @@ td
-
-termDefinitionType :: TTerm TermDefinition -> TTerm TypeScheme
-termDefinitionType td = project _TermDefinition _TermDefinition_type @@ td
-
-typeDefinition :: TTerm Name -> TTerm Type -> TTerm TypeDefinition
-typeDefinition name typ = record _TypeDefinition [
-  _TypeDefinition_name>>: name,
-  _TypeDefinition_type>>: typ]
-
-typeDefinitionName :: TTerm TypeDefinition -> TTerm Name
-typeDefinitionName td = project _TypeDefinition _TypeDefinition_name @@ td
-
-typeDefinitionType :: TTerm TypeDefinition -> TTerm Type
-typeDefinitionType td = project _TypeDefinition _TypeDefinition_type @@ td
-
-unFileExtension :: TTerm FileExtension -> TTerm String
-unFileExtension fe = unwrap _FileExtension @@ fe
-
-unNamespace :: TTerm Namespace -> TTerm String
-unNamespace ns = unwrap _Namespace @@ ns
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Parsing.hs b/src/main/haskell/Hydra/Dsl/Meta/Parsing.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Parsing.hs
+++ /dev/null
@@ -1,53 +0,0 @@
--- | Phantom-typed term DSL for the hydra.parsing types
-
-module Hydra.Dsl.Meta.Parsing where
-
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Phantoms
-
-import qualified Data.Map as M
-
-
--- | Construct a ParseError
-parseError :: TTerm String -> TTerm String -> TTerm ParseError
-parseError message remainder = record _ParseError [
-  _ParseError_message>>: message,
-  _ParseError_remainder>>: remainder]
-
--- | Get the message from a ParseError
-parseErrorMessage :: TTerm ParseError -> TTerm String
-parseErrorMessage e = project _ParseError _ParseError_message @@ e
-
--- | Get the remainder from a ParseError
-parseErrorRemainder :: TTerm ParseError -> TTerm String
-parseErrorRemainder e = project _ParseError _ParseError_remainder @@ e
-
--- | Construct a successful ParseResult
-parseResultSuccess :: TTerm (ParseSuccess a) -> TTerm (ParseResult a)
-parseResultSuccess = inject _ParseResult _ParseResult_success
-
--- | Construct a failed ParseResult
-parseResultFailure :: TTerm ParseError -> TTerm (ParseResult a)
-parseResultFailure = inject _ParseResult _ParseResult_failure
-
--- | Construct a ParseSuccess
-parseSuccess :: TTerm a -> TTerm String -> TTerm (ParseSuccess a)
-parseSuccess value remainder = record _ParseSuccess [
-  _ParseSuccess_value>>: value,
-  _ParseSuccess_remainder>>: remainder]
-
--- | Get the value from a ParseSuccess
-parseSuccessValue :: TTerm (ParseSuccess a) -> TTerm a
-parseSuccessValue s = project _ParseSuccess _ParseSuccess_value @@ s
-
--- | Get the remainder from a ParseSuccess
-parseSuccessRemainder :: TTerm (ParseSuccess a) -> TTerm String
-parseSuccessRemainder s = project _ParseSuccess _ParseSuccess_remainder @@ s
-
--- | Wrap a function as a Parser
-parser :: TTerm (String -> ParseResult a) -> TTerm (Parser a)
-parser = wrap _Parser
-
--- | Unwrap a Parser to get its function
-runParser :: TTerm (Parser a) -> TTerm String -> TTerm (ParseResult a)
-runParser p input = unwrap _Parser @@ p @@ input
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Phantoms.hs b/src/main/haskell/Hydra/Dsl/Meta/Phantoms.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Phantoms.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Phantoms.hs
@@ -36,8 +36,8 @@
 name <~ value = let1 name value
 
 infixl 1 <<~
-(<<~) :: AsTerm t (Flow s a) => String -> t -> TTerm (Flow s b) -> TTerm (Flow s b)
-name <<~ def = bind name (asTerm def)
+(<<~) :: AsTerm t (Either e a) => String -> t -> TTerm (Either e b) -> TTerm (Either e b)
+name <<~ def = eitherBind name (asTerm def)
 
 -- | Function composition operator: f <.> g creates a function that applies g then f
 -- Example: toString <.> increment
@@ -78,19 +78,19 @@
 apply :: TTerm (a -> b) -> TTerm a -> TTerm b
 apply (TTerm lhs) (TTerm rhs) = TTerm $ Terms.apply lhs rhs
 
-bind :: AsTerm t (Flow s a) => String -> t -> TTerm (Flow s b) -> TTerm (Flow s b)
-bind v def body = primitive2 _flows_bind (asTerm def) $ lambda v $ body
 
+
+-- | Bind over Either: extracts the Right value into a variable, short-circuiting on Left
+eitherBind :: AsTerm t (Either e a) => String -> t -> TTerm (Either e b) -> TTerm (Either e b)
+eitherBind v def body = primitive2 _eithers_bind (asTerm def) $ lambda v $ body
+
 binaryFunction :: (TTerm a -> TTerm b -> TTerm c) -> TTerm (a -> b -> c)
 binaryFunction f = case (unTTerm $ f (var "x") (var "y")) of
   TermApplication (Application (TermApplication (Application lhs _)) _) -> TTerm lhs
   t -> TTerm $ Terms.string $ "unexpected term as binary function: " <> ShowCore.term t
 
-binds :: [Field] -> TTerm (Flow s a) -> TTerm (Flow s a)
-binds fields rhs = L.foldr withField rhs fields
-  where
-    withField (Field (Name fname) fterm) b = bind fname (TTerm fterm) b
 
+
 -- | Apply a named case match to an argument
 -- Example: cases resultTypeName myResult Nothing [onSuccess, onError]
 -- See also: 'match'
@@ -226,9 +226,8 @@
 el :: TBinding a -> Binding
 el = toBinding
 
-exec :: TTerm (Flow s a) -> TTerm (Flow s b) -> TTerm (Flow s b)
-exec f b = primitive2 _flows_bind f (lambda ignoredVariable b)
 
+
 -- | Create a field with the given name and value
 -- Example: field (Name "age") (int32 30)
 field :: Name -> TTerm a -> Field
@@ -367,9 +366,6 @@
 primitive3 :: Name -> TTerm a -> TTerm b -> TTerm c -> TTerm d
 primitive3 primName (TTerm a) (TTerm b) (TTerm c) = TTerm $ Terms.primitive primName Terms.@@ a Terms.@@ b Terms.@@ c
 
-produce :: AsTerm t a => t -> TTerm (Flow s a)
-produce x = primitive1 _flows_pure (asTerm x)
-
 -- | Extract a field from a record
 -- Example: project (Name "Person") (Name "name")
 project :: Name -> Name -> TTerm (a -> b)
@@ -390,9 +386,12 @@
 toBinding :: TBinding a -> Binding
 toBinding (TBinding name (TTerm term)) = Binding name term Nothing
 
-trace :: TTerm String -> TTerm (Flow s a) -> TTerm (Flow s a)
-trace msg flow = var "hydra.monads.withTrace" @@ msg @@ flow
+-- | Convert a typed binding to a term Definition for use in module definition lists
+-- Example: toTermDefinition functionArity
+toTermDefinition :: TBinding a -> Definition
+toTermDefinition (TBinding name (TTerm term)) = DefinitionTerm $ TermDefinition name term Nothing
 
+
 triple :: TTerm a -> TTerm b -> TTerm c -> TTerm (a, b, c)
 triple (TTerm a) (TTerm b) (TTerm c) = TTerm $ Terms.triple a b c
 
@@ -411,6 +410,10 @@
   TermUnion (Injection tname (Field fname _)) -> lambda "x" $ inject tname fname $ var "x"
   TermWrap (WrappedTerm tname _) -> lambda "x" $ wrap tname $ var "x"
 
+-- | Unsafe phantom type cast. Used during bootstrap when changing Module field types.
+unsafeCast :: TTerm a -> TTerm b
+unsafeCast (TTerm t) = TTerm t
+
 -- | Unit value (empty record)
 unit :: TTerm a
 unit = TTerm Terms.unit
@@ -435,3 +438,7 @@
 -- Note: the phantom types provide no guarantee of type safety in this case
 wrap :: Name -> TTerm a -> TTerm b
 wrap name (TTerm term) = TTerm $ Terms.wrap name term
+
+-- | Lift a Haskell Name value to a phantom-typed TTerm Name
+nameLift :: Name -> TTerm Name
+nameLift (Name n) = wrap _Name $ string n
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Tabular.hs b/src/main/haskell/Hydra/Dsl/Meta/Tabular.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Dsl/Meta/Tabular.hs
@@ -0,0 +1,14 @@
+-- | DSL helpers for constructing tabular (relational) schemas
+
+module Hydra.Dsl.Meta.Tabular where
+
+import Hydra.Core
+import Hydra.Relational
+import Hydra.Tabular
+
+
+columnType :: String -> Type -> ColumnType
+columnType name typ = ColumnType (ColumnName name) typ
+
+tableType :: String -> [ColumnType] -> TableType
+tableType name columns = TableType (RelationName name) columns
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Terms.hs b/src/main/haskell/Hydra/Dsl/Meta/Terms.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Terms.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Terms.hs
@@ -515,20 +515,3 @@
   ComparisonLessThan -> Phantoms.injectUnit _Comparison _Comparison_lessThan
   ComparisonGreaterThan -> Phantoms.injectUnit _Comparison _Comparison_greaterThan
 
--- hydra.compute at the `TTerm Term` level
-
-flowStateTerm :: TTerm Term -> TTerm Term -> TTerm Term -> TTerm Term
-flowStateTerm value state trace = recordLift _FlowState [
-  _FlowState_value>>: value,
-  _FlowState_state>>: state,
-  _FlowState_trace>>: trace]
-
--- | Build a trace term at the meta level with custom stack, messages, and other
-traceTerm :: TTerm Term -> TTerm Term -> TTerm Term -> TTerm Term
-traceTerm stack messages other = recordLift _Trace [
-  _Trace_stack>>: stack,
-  _Trace_messages>>: messages,
-  _Trace_other>>: other]
-
-unFlowTerm :: TTerm Term
-unFlowTerm = unwrap $ Core.nameLift _Flow
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Testing.hs b/src/main/haskell/Hydra/Dsl/Meta/Testing.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Testing.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Testing.hs
@@ -3,8 +3,45 @@
 -- | Meta-DSL for constructing test-related terms
 -- TODO: merge with Hydra.Dsl.Tests
 
-module Hydra.Dsl.Meta.Testing where
+module Hydra.Dsl.Meta.Testing (
+  module Hydra.Dsl.Testing,
+  module Hydra.Dsl.Meta.Testing,
+) where
 
+import Hydra.Dsl.Testing hiding (
+  alphaConversionTestCase, caseConversionTestCase, deannotateTermTestCase,
+  deannotateTypeTestCase, delegatedEvaluationTestCase, etaExpansionTestCase,
+  evaluationStyleEager, evaluationStyleLazy, evaluationTestCase,
+  flattenLetTermsTestCase, foldOverTermTestCase, freeVariablesTestCase,
+  hoistCaseStatementsTestCase, hoistLetBindingsTestCase,
+  hoistPolymorphicLetBindingsTestCase, hoistPredicateApplications,
+  hoistPredicateCaseStatements, hoistPredicateLists, hoistPredicateNothing,
+  hoistSubtermsTestCase, inferenceFailureTestCase, inferenceTestCase,
+  joinTypesTestCase, jsonDecodeTestCase, jsonEncodeTestCase,
+  jsonRoundtripTestCase, liftLambdaAboveLetTestCase, normalizeTypeVariablesTestCase,
+  parserTestCase, rewriteTermTestCase, rewriteTypeTestCase,
+  serializationTestCase, simplifyTermTestCase, substInTypeTestCase, tag,
+  termRewriterReplaceFooWithBar, termRewriterReplaceInt32WithInt64,
+  testCaseAlphaConversion, testCaseCaseConversion, testCaseDeannotateTerm,
+  testCaseDeannotateType, testCaseDelegatedEvaluation, testCaseEtaExpansion,
+  testCaseEvaluation, testCaseFlattenLetTerms, testCaseFoldOverTerm,
+  testCaseFreeVariables, testCaseHoistCaseStatements, testCaseHoistLetBindings,
+  testCaseHoistPolymorphicLetBindings, testCaseHoistSubterms, testCaseInference,
+  testCaseInferenceFailure, testCaseJoinTypes, testCaseJsonDecode,
+  testCaseJsonEncode, testCaseJsonParser, testCaseJsonRoundtrip, testCaseJsonWriter,
+  testCaseLiftLambdaAboveLet, testCaseNormalizeTypeVariables, testCaseRewriteTerm,
+  testCaseRewriteType, testCaseSerialization, testCaseSimplifyTerm,
+  testCaseSubstInType, testCaseTopologicalSort, testCaseTopologicalSortBindings,
+  testCaseTopologicalSortSCC, testCaseTypeReduction, testCaseUnifyTypes,
+  testCaseUnshadowVariables, testCaseVariableOccursInType, testCaseWithMetadata,
+  testCaseWithMetadataCase, testCaseWithMetadataDescription,
+  testCaseWithMetadataName, testCaseWithMetadataTags, testGroup,
+  topologicalSortBindingsTestCase, topologicalSortSCCTestCase,
+  topologicalSortTestCase, typeReductionTestCase,
+  typeRewriterReplaceStringWithInt32, unifyTypesTestCase,
+  unshadowVariablesTestCase, variableOccursInTypeTestCase, writerTestCase, unTag,
+  testCaseTypeChecking, testCaseValidateCoreTerm, typeCheckingTestCase,
+  validateCoreTermCase, validateCoreTermTestCase)
 import Hydra.Kernel
 import Hydra.Ast (Expr)
 import Hydra.Json.Model (Value)
@@ -27,8 +64,6 @@
 
 tag_disabled = Tag "disabled"
 tag_disabledForMinimalInference = Tag "disabledForMinimalInference"
-tag_disabledForPython = Tag "disabledForPython"
-tag_requiresFlowDecoding = Tag "requiresFlowDecoding"
 
 noTags :: TTerm [Tag]
 noTags = Phantoms.list ([] :: [TTerm Tag])
@@ -42,6 +77,9 @@
 expectPoly :: AsTerm t Term => Int -> [Tag] -> t -> [String] -> TTerm Type -> TTerm TestCaseWithMetadata
 expectPoly i tags term params typ = infTest ("#" ++ show i) tags (asTerm term) $ T.poly params typ
 
+expectPolyConstrained :: AsTerm t Term => Int -> [Tag] -> t -> [String] -> [(String, [String])] -> TTerm Type -> TTerm TestCaseWithMetadata
+expectPolyConstrained i tags term params constraints typ = infTest ("#" ++ show i) tags (asTerm term) $ T.polyConstrained params constraints typ
+
 groupRef = MetaTerms.varNamePhantom . bindingName
 
 primCase :: String -> Name -> [TTerm Term] -> TTerm Term -> TTerm TestCaseWithMetadata
@@ -72,8 +110,6 @@
 
 isDisabled tcase = tag_disabled `L.elem` Testing.testCaseWithMetadataTags tcase
 isDisabledForMinimalInference tcase = tag_disabledForMinimalInference `L.elem` Testing.testCaseWithMetadataTags tcase
-isDisabledForPython tcase = tag_disabledForPython `L.elem` Testing.testCaseWithMetadataTags tcase
-isRequiresFlowDecoding tcase = tag_requiresFlowDecoding `L.elem` Testing.testCaseWithMetadataTags tcase
 
 mapTerm :: [(TTerm Term, TTerm Term)] -> TTerm Term
 mapTerm pairs = TTerm $ TermUnion $ Injection _Term $ Field _Term_map $ TermMap $ M.fromList [(unTTerm k, unTTerm v) | (k, v) <- pairs]
@@ -199,9 +235,6 @@
 testCaseInferenceFailure :: TTerm InferenceFailureTestCase -> TTerm TestCase
 testCaseInferenceFailure = inject _TestCase _TestCase_inferenceFailure
 
-testCaseJsonCoder :: TTerm JsonCoderTestCase -> TTerm TestCase
-testCaseJsonCoder = inject _TestCase _TestCase_jsonCoder
-
 testCaseJsonDecode :: TTerm JsonDecodeTestCase -> TTerm TestCase
 testCaseJsonDecode = inject _TestCase _TestCase_jsonDecode
 
@@ -263,18 +296,6 @@
 jsonParserTestCase :: TTerm String -> TTerm (ParseResult Value) -> TTerm JsonParserTestCase
 jsonParserTestCase = parserTestCase
 
-jsonCoderTestCase :: TTerm Type -> TTerm Term -> TTerm Value -> TTerm JsonCoderTestCase
-jsonCoderTestCase typ term json = Phantoms.record _JsonCoderTestCase [
-  _JsonCoderTestCase_type>>: typ,
-  _JsonCoderTestCase_term>>: term,
-  _JsonCoderTestCase_json>>: json]
-
--- | Convenience function for creating JSON coder test cases
-coderCase :: String -> TTerm Type -> TTerm Term -> TTerm Value -> TTerm TestCaseWithMetadata
-coderCase cname typ term json = testCaseWithMetadata (Phantoms.string cname)
-  (testCaseJsonCoder $ jsonCoderTestCase typ term json)
-  nothing noTags
-
 ----------------------------------------
 -- JSON encode/decode/roundtrip test case helpers (Either-based)
 
@@ -777,4 +798,21 @@
 unshadowCase :: String -> TTerm Term -> TTerm Term -> TTerm TestCaseWithMetadata
 unshadowCase cname input output = testCaseWithMetadata (Phantoms.string cname)
   (testCaseUnshadowVariables $ unshadowVariablesTestCase input output)
+  nothing noTags
+
+-- | Inject a ValidateCoreTermTestCase into TestCase
+testCaseValidateCoreTerm :: TTerm ValidateCoreTermTestCase -> TTerm TestCase
+testCaseValidateCoreTerm = inject _TestCase _TestCase_validateCoreTerm
+
+-- | Construct a ValidateCoreTermTestCase
+validateCoreTermTestCase :: TTerm Bool -> TTerm Term -> TTerm (Maybe InvalidTermError) -> TTerm ValidateCoreTermTestCase
+validateCoreTermTestCase typed input output = Phantoms.record _ValidateCoreTermTestCase [
+  _ValidateCoreTermTestCase_typed>>: typed,
+  _ValidateCoreTermTestCase_input>>: input,
+  _ValidateCoreTermTestCase_output>>: output]
+
+-- | Convenience function for creating validation test cases
+validateCoreTermCase :: String -> TTerm Bool -> TTerm Term -> TTerm (Maybe InvalidTermError) -> TTerm TestCaseWithMetadata
+validateCoreTermCase cname typed input expected = testCaseWithMetadata (Phantoms.string cname)
+  (testCaseValidateCoreTerm $ validateCoreTermTestCase typed input expected)
   nothing noTags
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Topology.hs b/src/main/haskell/Hydra/Dsl/Meta/Topology.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Topology.hs
+++ /dev/null
@@ -1,105 +0,0 @@
--- | Meta-DSL for constructing topology-related terms (type and term accessors)
-
-module Hydra.Dsl.Meta.Topology where
-
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Phantoms
-import Hydra.Topology as Topology
-
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-
-orderingIsomorphism :: TTerm ([a] -> [a])
-                  -> TTerm ([a] -> [a])
-                  -> TTerm (Topology.OrderingIsomorphism a)
-orderingIsomorphism encode decode = record _OrderingIsomorphism [
-    _OrderingIsomorphism_encode>>: encode,
-    _OrderingIsomorphism_decode>>: decode]
-
-tarjanState :: TTerm Int
-            -> TTerm (M.Map Vertex Int)
-            -> TTerm (M.Map Vertex Int)
-            -> TTerm [Vertex]
-            -> TTerm (S.Set Vertex)
-            -> TTerm [[Vertex]]
-            -> TTerm TarjanState
-tarjanState counter indices lowLinks stack onStack sccs = record _TarjanState [
-    _TarjanState_counter>>: counter,
-    _TarjanState_indices>>: indices,
-    _TarjanState_lowLinks>>: lowLinks,
-    _TarjanState_stack>>: stack,
-    _TarjanState_onStack>>: onStack,
-    _TarjanState_sccs>>: sccs]
-
-tarjanStateCounter :: TTerm TarjanState -> TTerm Int
-tarjanStateCounter ts = project _TarjanState _TarjanState_counter @@ ts
-
-tarjanStateIndices :: TTerm TarjanState -> TTerm (M.Map Vertex Int)
-tarjanStateIndices ts = project _TarjanState _TarjanState_indices @@ ts
-
-tarjanStateLowLinks :: TTerm TarjanState -> TTerm (M.Map Vertex Int)
-tarjanStateLowLinks ts = project _TarjanState _TarjanState_lowLinks @@ ts
-
-tarjanStateStack :: TTerm TarjanState -> TTerm [Vertex]
-tarjanStateStack ts = project _TarjanState _TarjanState_stack @@ ts
-
-tarjanStateOnStack :: TTerm TarjanState -> TTerm (S.Set Vertex)
-tarjanStateOnStack ts = project _TarjanState _TarjanState_onStack @@ ts
-
-tarjanStateSccs :: TTerm TarjanState -> TTerm [[Vertex]]
-tarjanStateSccs ts = project _TarjanState _TarjanState_sccs @@ ts
-
-tarjanStateWithCounter :: TTerm TarjanState -> TTerm Int -> TTerm TarjanState
-tarjanStateWithCounter ts counter = tarjanState
-    counter
-    (Hydra.Dsl.Meta.Topology.tarjanStateIndices ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateLowLinks ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateStack ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateOnStack ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateSccs ts)
-
-tarjanStateWithIndices :: TTerm TarjanState -> TTerm (M.Map Vertex Int) -> TTerm TarjanState
-tarjanStateWithIndices ts indices = tarjanState
-    (Hydra.Dsl.Meta.Topology.tarjanStateCounter ts)
-    indices
-    (Hydra.Dsl.Meta.Topology.tarjanStateLowLinks ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateStack ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateOnStack ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateSccs ts)
-
-tarjanStateWithLowLinks :: TTerm TarjanState -> TTerm (M.Map Vertex Int) -> TTerm TarjanState
-tarjanStateWithLowLinks ts lowLinks = tarjanState
-    (Hydra.Dsl.Meta.Topology.tarjanStateCounter ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateIndices ts)
-    lowLinks
-    (Hydra.Dsl.Meta.Topology.tarjanStateStack ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateOnStack ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateSccs ts)
-
-tarjanStateWithStack :: TTerm TarjanState -> TTerm [Vertex] -> TTerm TarjanState
-tarjanStateWithStack ts stack = tarjanState
-    (Hydra.Dsl.Meta.Topology.tarjanStateCounter ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateIndices ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateLowLinks ts)
-    stack
-    (Hydra.Dsl.Meta.Topology.tarjanStateOnStack ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateSccs ts)
-
-tarjanStateWithOnStack :: TTerm TarjanState -> TTerm (S.Set Vertex) -> TTerm TarjanState
-tarjanStateWithOnStack ts onStack = tarjanState
-    (Hydra.Dsl.Meta.Topology.tarjanStateCounter ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateIndices ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateLowLinks ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateStack ts)
-    onStack
-    (Hydra.Dsl.Meta.Topology.tarjanStateSccs ts)
-
-tarjanStateWithSccs :: TTerm TarjanState -> TTerm [[Vertex]] -> TTerm TarjanState
-tarjanStateWithSccs ts sccs = tarjanState
-    (Hydra.Dsl.Meta.Topology.tarjanStateCounter ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateIndices ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateLowLinks ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateStack ts)
-    (Hydra.Dsl.Meta.Topology.tarjanStateOnStack ts)
-    sccs
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Types.hs b/src/main/haskell/Hydra/Dsl/Meta/Types.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Types.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Types.hs
@@ -17,6 +17,7 @@
 import qualified Data.List as L
 import qualified Data.Map as M
 import qualified Data.Maybe as Y
+import qualified Data.Set as S
 import Prelude hiding (either, map, maybe, product, sum)
 
 
@@ -189,6 +190,18 @@
   Phantoms.field _TypeScheme_type t,
   Phantoms.field _TypeScheme_constraints Phantoms.nothing]
 
+-- | Create a term-encoded polymorphic type scheme with class constraints
+-- Example: polyConstrained ["k", "v"] [("k", ["ordering"])] (map (var "k") (var "v"))
+polyConstrained :: [String] -> [(String, [String])] -> TTerm Type -> TTerm TypeScheme
+polyConstrained params constraints t = Phantoms.record _TypeScheme [
+  Phantoms.field _TypeScheme_variables (Phantoms.list (name <$> params)),
+  Phantoms.field _TypeScheme_type t,
+  Phantoms.field _TypeScheme_constraints constraintsTerm]
+  where
+    constraintsTerm = Phantoms.just $ Phantoms.map $ M.fromList
+      [(name v, Core.typeVariableMetadata (Phantoms.set (name <$> classes)))
+      | (v, classes) <- constraints]
+
 -- | Create a term-encoded product type (tuple) with multiple components using nested pairs
 -- Example: product [string, int32, boolean]
 product :: [TTerm Type] -> TTerm Type
@@ -199,9 +212,9 @@
 
 -- | Create a term-encoded record type with named fields
 -- Example: record (name "Person") ["name">: string, "age">: int32]
--- Accepts TTerm Name or TBinding Name (via AsTerm)
+-- Note: the name parameter is now ignored; record types no longer carry a type name
 record :: AsTerm t Name => t -> [(TTerm Name, TTerm Type)] -> TTerm Type
-record n pairs = typeRecord $ rowType (asTerm n) $ Phantoms.list (toField <$> pairs)
+record _n pairs = typeRecord $ Phantoms.list (toField <$> pairs)
   where
     toField (fn, t) = fieldType fn t
 
@@ -237,9 +250,9 @@
 
 -- | Create a term-encoded union type with named variants
 -- Example: union (name "Result") ["success">: int32, "error">: string]
--- Accepts TTerm Name or TBinding Name (via AsTerm)
+-- Note: the name parameter is now ignored; union types no longer carry a type name
 union :: AsTerm t Name => t -> [(TTerm Name, TTerm Type)] -> TTerm Type
-union n pairs = typeUnion $ rowType (asTerm n) $ Phantoms.list (toField <$> pairs)
+union _n pairs = typeUnion $ Phantoms.list (toField <$> pairs)
   where
     toField (fn, ft) = fieldType fn ft
 
@@ -248,6 +261,11 @@
 unit :: TTerm Type
 unit = typeUnit
 
+-- | Term-encoded void type (uninhabited / bottom type)
+-- Example: void
+void :: TTerm Type
+void = typeVoid
+
 -- | Create a term-encoded type variable
 -- Example: variable "a"
 variable :: String -> TTerm Type
@@ -259,9 +277,9 @@
 var = variable
 
 -- | Create a term-encoded wrapped type (newtype)
--- Accepts TTerm Name or TBinding Name (via AsTerm)
+-- Note: the name parameter is now ignored; wrapped types no longer carry a type name
 wrap :: AsTerm t Name => t -> TTerm Type -> TTerm Type
-wrap n t = typeWrap $ wrappedType (asTerm n) t
+wrap _n t = typeWrap t
 
 -- | Create a term-encoded enum type with the given variant names (conventionally in camelCase)
 -- Example: enum (name "Color") ["red", "green", "blue"]
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Typing.hs b/src/main/haskell/Hydra/Dsl/Meta/Typing.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Typing.hs
+++ /dev/null
@@ -1,180 +0,0 @@
-{-# LANGUAGE FlexibleContexts #-}
-
--- | Meta-DSL for constructing typing-related terms (TypeScheme, TypeConstraints)
-
-module Hydra.Dsl.Meta.Typing where
-
-import Hydra.Kernel
-import Hydra.Dsl.AsTerm
-import Hydra.Dsl.Meta.Phantoms as Phantoms
-import qualified Hydra.Dsl.Terms as Terms
-
-import qualified Data.Map as M
-import qualified Data.Set as S
-import qualified Data.Maybe as Y
-import Data.Int
-import Prelude hiding (map, product, sum)
-
-
-inferenceContext
-  :: TTerm (M.Map Name TypeScheme)
-  -> TTerm (M.Map Name TypeScheme)
-  -> TTerm (M.Map Name TypeScheme)
-  -> TTerm (M.Map Name TypeVariableMetadata)
-  -> TTerm Bool
-  -> TTerm InferenceContext
-inferenceContext schemaTypes primitiveTypes dataTypes classConstraints debug = Phantoms.record _InferenceContext [
-  _InferenceContext_schemaTypes>>: schemaTypes,
-  _InferenceContext_primitiveTypes>>: primitiveTypes,
-  _InferenceContext_dataTypes>>: dataTypes,
-  _InferenceContext_classConstraints>>: classConstraints,
-  _InferenceContext_debug>>: debug]
-
-inferenceContextSchemaTypes :: TTerm InferenceContext -> TTerm (M.Map Name TypeScheme)
-inferenceContextSchemaTypes ic = Phantoms.project _InferenceContext _InferenceContext_schemaTypes @@ ic
-
-inferenceContextPrimitiveTypes :: TTerm InferenceContext -> TTerm (M.Map Name TypeScheme)
-inferenceContextPrimitiveTypes ic = Phantoms.project _InferenceContext _InferenceContext_primitiveTypes @@ ic
-
-inferenceContextDataTypes :: TTerm InferenceContext -> TTerm (M.Map Name TypeScheme)
-inferenceContextDataTypes ic = Phantoms.project _InferenceContext _InferenceContext_dataTypes @@ ic
-
-inferenceContextClassConstraints :: TTerm InferenceContext -> TTerm (M.Map Name TypeVariableMetadata)
-inferenceContextClassConstraints ic = Phantoms.project _InferenceContext _InferenceContext_classConstraints @@ ic
-
-inferenceContextDebug :: TTerm InferenceContext -> TTerm Bool
-inferenceContextDebug ic = Phantoms.project _InferenceContext _InferenceContext_debug @@ ic
-
-inferenceContextWithDataTypes :: TTerm InferenceContext -> TTerm (M.Map Name TypeScheme) -> TTerm InferenceContext
-inferenceContextWithDataTypes ctx dataTypes = inferenceContext
-  (Hydra.Dsl.Meta.Typing.inferenceContextSchemaTypes ctx)
-  (Hydra.Dsl.Meta.Typing.inferenceContextPrimitiveTypes ctx)
-  dataTypes
-  (Hydra.Dsl.Meta.Typing.inferenceContextClassConstraints ctx)
-  (Hydra.Dsl.Meta.Typing.inferenceContextDebug ctx)
-
-inferenceContextWithClassConstraints :: TTerm InferenceContext -> TTerm (M.Map Name TypeVariableMetadata) -> TTerm InferenceContext
-inferenceContextWithClassConstraints ctx classConstraints = inferenceContext
-  (Hydra.Dsl.Meta.Typing.inferenceContextSchemaTypes ctx)
-  (Hydra.Dsl.Meta.Typing.inferenceContextPrimitiveTypes ctx)
-  (Hydra.Dsl.Meta.Typing.inferenceContextDataTypes ctx)
-  classConstraints
-  (Hydra.Dsl.Meta.Typing.inferenceContextDebug ctx)
-
-inferenceResult :: AsTerm t TypeSubst => TTerm Term -> TTerm Type -> t -> TTerm (M.Map Name TypeVariableMetadata) -> TTerm InferenceResult
-inferenceResult term type_ subst classConstraints = Phantoms.record _InferenceResult [
-  _InferenceResult_term>>: term,
-  _InferenceResult_type>>: type_,
-  _InferenceResult_subst>>: asTerm subst,
-  _InferenceResult_classConstraints>>: classConstraints]
-
-inferenceResultTerm :: TTerm InferenceResult -> TTerm Term
-inferenceResultTerm ir = Phantoms.project _InferenceResult _InferenceResult_term @@ ir
-
-inferenceResultType :: TTerm InferenceResult -> TTerm Type
-inferenceResultType ir = Phantoms.project _InferenceResult _InferenceResult_type @@ ir
-
-inferenceResultSubst :: TTerm InferenceResult -> TTerm TypeSubst
-inferenceResultSubst ir = Phantoms.project _InferenceResult _InferenceResult_subst @@ ir
-
-inferenceResultClassConstraints :: TTerm InferenceResult -> TTerm (M.Map Name TypeVariableMetadata)
-inferenceResultClassConstraints ir = Phantoms.project _InferenceResult _InferenceResult_classConstraints @@ ir
-
-termSubst :: TTerm (M.Map Name Term) -> TTerm TermSubst
-termSubst = Phantoms.wrap _TermSubst
-
-typeConstraint :: TTerm Type -> TTerm Type -> TTerm String -> TTerm TypeConstraint
-typeConstraint t1 t2 comment = Phantoms.record _TypeConstraint [
-  _TypeConstraint_left>>: t1,
-  _TypeConstraint_right>>: t2,
-  _TypeConstraint_comment>>: comment]
-
-typeConstraintLeft :: TTerm TypeConstraint -> TTerm Type
-typeConstraintLeft tc = Phantoms.project _TypeConstraint _TypeConstraint_left @@ tc
-
-typeConstraintRight :: TTerm TypeConstraint -> TTerm Type
-typeConstraintRight tc = Phantoms.project _TypeConstraint _TypeConstraint_right @@ tc
-
-typeConstraintComment :: TTerm TypeConstraint -> TTerm String
-typeConstraintComment tc = Phantoms.project _TypeConstraint _TypeConstraint_comment @@ tc
-
-typeContext :: TTerm (M.Map Name Type) -> TTerm (M.Map Name Term) -> TTerm (S.Set Name) -> TTerm (S.Set Name) -> TTerm (S.Set Name) -> TTerm InferenceContext -> TTerm TypeContext
-typeContext types metadata typeVariables lambdaVariables letVariables inferenceContext = Phantoms.record _TypeContext [
-  _TypeContext_types>>: types,
-  _TypeContext_metadata>>: metadata,
-  _TypeContext_typeVariables>>: typeVariables,
-  _TypeContext_lambdaVariables>>: lambdaVariables,
-  _TypeContext_letVariables>>: letVariables,
-  _TypeContext_inferenceContext>>: inferenceContext]
-
-typeContextTypes :: TTerm TypeContext -> TTerm (M.Map Name Type)
-typeContextTypes tc = Phantoms.project _TypeContext _TypeContext_types @@ tc
-
-typeContextMetadata :: TTerm TypeContext -> TTerm (M.Map Name Term)
-typeContextMetadata tc = Phantoms.project _TypeContext _TypeContext_metadata @@ tc
-
-typeContextTypeVariables :: TTerm TypeContext -> TTerm (S.Set Name)
-typeContextTypeVariables tc = Phantoms.project _TypeContext _TypeContext_typeVariables @@ tc
-
-typeContextLambdaVariables :: TTerm TypeContext -> TTerm (S.Set Name)
-typeContextLambdaVariables tc = Phantoms.project _TypeContext _TypeContext_lambdaVariables @@ tc
-
-typeContextLetVariables :: TTerm TypeContext -> TTerm (S.Set Name)
-typeContextLetVariables tc = Phantoms.project _TypeContext _TypeContext_letVariables @@ tc
-
-typeContextInferenceContext :: TTerm TypeContext -> TTerm InferenceContext
-typeContextInferenceContext tc = Phantoms.project _TypeContext _TypeContext_inferenceContext @@ tc
-
-typeContextWithTypes :: TTerm TypeContext -> TTerm (M.Map Name Type) -> TTerm TypeContext
-typeContextWithTypes ctx types = typeContext
-  types
-  (Hydra.Dsl.Meta.Typing.typeContextMetadata ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextTypeVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextLambdaVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextLetVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextInferenceContext ctx)
-
-typeContextWithMetadata :: TTerm TypeContext -> TTerm (M.Map Name Term) -> TTerm TypeContext
-typeContextWithMetadata ctx metadata = typeContext
-  (Hydra.Dsl.Meta.Typing.typeContextTypes ctx)
-  metadata
-  (Hydra.Dsl.Meta.Typing.typeContextTypeVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextLambdaVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextLetVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextInferenceContext ctx)
-
-typeContextWithTypeVariables :: TTerm TypeContext -> TTerm (S.Set Name) -> TTerm TypeContext
-typeContextWithTypeVariables ctx typeVariables = typeContext
-  (Hydra.Dsl.Meta.Typing.typeContextTypes ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextMetadata ctx)
-  typeVariables
-  (Hydra.Dsl.Meta.Typing.typeContextLambdaVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextLetVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextInferenceContext ctx)
-
-typeContextWithLambdaVariables :: TTerm TypeContext -> TTerm (S.Set Name) -> TTerm TypeContext
-typeContextWithLambdaVariables ctx lambdaVariables = typeContext
-  (Hydra.Dsl.Meta.Typing.typeContextTypes ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextMetadata ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextTypeVariables ctx)
-  lambdaVariables
-  (Hydra.Dsl.Meta.Typing.typeContextLetVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextInferenceContext ctx)
-
-typeContextWithLetVariables :: TTerm TypeContext -> TTerm (S.Set Name) -> TTerm TypeContext
-typeContextWithLetVariables ctx letVariables = typeContext
-  (Hydra.Dsl.Meta.Typing.typeContextTypes ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextMetadata ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextTypeVariables ctx)
-  (Hydra.Dsl.Meta.Typing.typeContextLambdaVariables ctx)
-  letVariables
-  (Hydra.Dsl.Meta.Typing.typeContextInferenceContext ctx)
-
-typeSubst :: TTerm (M.Map Name Type) -> TTerm TypeSubst
-typeSubst = Phantoms.wrap _TypeSubst
-
-unTermSubst :: TTerm TermSubst -> TTerm (M.Map Name Term)
-unTermSubst ts = unwrap _TermSubst @@ ts
-
-unTypeSubst :: TTerm TypeSubst -> TTerm (M.Map Name Type)
-unTypeSubst ts = unwrap _TypeSubst @@ ts
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Util.hs b/src/main/haskell/Hydra/Dsl/Meta/Util.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Meta/Util.hs
+++ /dev/null
@@ -1,28 +0,0 @@
--- | Meta-DSL for constructing utility-related terms (CaseConvention, etc.)
-
-module Hydra.Dsl.Meta.Util where
-
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Phantoms
-import Hydra.Util
-
-import qualified Data.Map as M
-import qualified Data.Maybe as Y
-
-
-caseConventionCamel = injectUnit _CaseConvention _CaseConvention_camel
-caseConventionPascal = injectUnit _CaseConvention _CaseConvention_pascal
-caseConventionLowerSnake = injectUnit _CaseConvention _CaseConvention_lowerSnake
-caseConventionUpperSnake = injectUnit _CaseConvention _CaseConvention_upperSnake
-
-decodingError :: TTerm String -> TTerm DecodingError
-decodingError = wrap _DecodingError
-
-unDecodingError :: TTerm (DecodingError -> String)
-unDecodingError = unwrap _DecodingError
-
-precisionArbitrary :: TTerm Precision
-precisionArbitrary = injectUnit _Precision _Precision_arbitrary
-
-precisionBits :: TTerm Int -> TTerm Precision
-precisionBits = inject _Precision _Precision_bits
diff --git a/src/main/haskell/Hydra/Dsl/Meta/Variants.hs b/src/main/haskell/Hydra/Dsl/Meta/Variants.hs
--- a/src/main/haskell/Hydra/Dsl/Meta/Variants.hs
+++ b/src/main/haskell/Hydra/Dsl/Meta/Variants.hs
@@ -1,45 +1,31 @@
--- | Meta-DSL for constructing variant-related terms (field accessors, etc.)
+-- | Haskell-specific convenience layer over the generated Hydra.Dsl.Variants module.
+-- Adds Haskell enum -> TTerm converter functions.
 
-module Hydra.Dsl.Meta.Variants where
+module Hydra.Dsl.Meta.Variants (
+  module Hydra.Dsl.Variants,
+  module Hydra.Dsl.Meta.Variants,
+) where
 
 import Hydra.Kernel
 import Hydra.Dsl.Meta.Phantoms
-import Hydra.Variants
-
-import qualified Data.Map as M
-import qualified Data.Maybe as Y
+import Hydra.Dsl.Variants
 
 
+-- | Convert a Haskell EliminationVariant to a TTerm
 eliminationVariant :: EliminationVariant -> TTerm EliminationVariant
 eliminationVariant v = injectUnit _EliminationVariant $ case v of
   EliminationVariantRecord -> _EliminationVariant_record
   EliminationVariantUnion -> _EliminationVariant_union
   EliminationVariantWrap -> _EliminationVariant_wrap
 
-eliminationVariantRecord :: TTerm EliminationVariant
-eliminationVariantRecord = injectUnit _EliminationVariant _EliminationVariant_record
-
-eliminationVariantUnion :: TTerm EliminationVariant
-eliminationVariantUnion = injectUnit _EliminationVariant _EliminationVariant_union
-
-eliminationVariantWrap :: TTerm EliminationVariant
-eliminationVariantWrap = injectUnit _EliminationVariant _EliminationVariant_wrap
-
+-- | Convert a Haskell FunctionVariant to a TTerm
 functionVariant :: FunctionVariant -> TTerm FunctionVariant
 functionVariant v = injectUnit _FunctionVariant $ case v of
   FunctionVariantElimination -> _FunctionVariant_elimination
   FunctionVariantLambda -> _FunctionVariant_lambda
   FunctionVariantPrimitive -> _FunctionVariant_primitive
 
-functionVariantElimination :: TTerm FunctionVariant
-functionVariantElimination = injectUnit _FunctionVariant _FunctionVariant_elimination
-
-functionVariantLambda :: TTerm FunctionVariant
-functionVariantLambda = injectUnit _FunctionVariant _FunctionVariant_lambda
-
-functionVariantPrimitive :: TTerm FunctionVariant
-functionVariantPrimitive = injectUnit _FunctionVariant _FunctionVariant_primitive
-
+-- | Convert a Haskell LiteralVariant to a TTerm
 literalVariant :: LiteralVariant -> TTerm LiteralVariant
 literalVariant v = injectUnit _LiteralVariant $ case v of
   LiteralVariantBinary -> _LiteralVariant_binary
@@ -48,21 +34,7 @@
   LiteralVariantInteger -> _LiteralVariant_integer
   LiteralVariantString -> _LiteralVariant_string
 
-literalVariantBinary :: TTerm LiteralVariant
-literalVariantBinary = injectUnit _LiteralVariant _LiteralVariant_binary
-
-literalVariantBoolean :: TTerm LiteralVariant
-literalVariantBoolean = injectUnit _LiteralVariant _LiteralVariant_boolean
-
-literalVariantFloat :: TTerm LiteralVariant
-literalVariantFloat = injectUnit _LiteralVariant _LiteralVariant_float
-
-literalVariantInteger :: TTerm LiteralVariant
-literalVariantInteger = injectUnit _LiteralVariant _LiteralVariant_integer
-
-literalVariantString :: TTerm LiteralVariant
-literalVariantString = injectUnit _LiteralVariant _LiteralVariant_string
-
+-- | Convert a Haskell TermVariant to a TTerm
 termVariant :: TermVariant -> TTerm TermVariant
 termVariant v = injectUnit _TermVariant $ case v of
   TermVariantAnnotated -> _TermVariant_annotated
@@ -84,60 +56,7 @@
   TermVariantVariable -> _TermVariant_variable
   TermVariantWrap -> _TermVariant_wrap
 
-termVariantAnnotated :: TTerm TermVariant
-termVariantAnnotated = injectUnit _TermVariant _TermVariant_annotated
-
-termVariantApplication :: TTerm TermVariant
-termVariantApplication = injectUnit _TermVariant _TermVariant_application
-
-termVariantEither :: TTerm TermVariant
-termVariantEither = injectUnit _TermVariant _TermVariant_either
-
-termVariantFunction :: TTerm TermVariant
-termVariantFunction = injectUnit _TermVariant _TermVariant_function
-
-termVariantLet :: TTerm TermVariant
-termVariantLet = injectUnit _TermVariant _TermVariant_let
-
-termVariantList :: TTerm TermVariant
-termVariantList = injectUnit _TermVariant _TermVariant_list
-
-termVariantLiteral :: TTerm TermVariant
-termVariantLiteral = injectUnit _TermVariant _TermVariant_literal
-
-termVariantMap :: TTerm TermVariant
-termVariantMap = injectUnit _TermVariant _TermVariant_map
-
-termVariantMaybe :: TTerm TermVariant
-termVariantMaybe = injectUnit _TermVariant _TermVariant_maybe
-
-termVariantPair :: TTerm TermVariant
-termVariantPair = injectUnit _TermVariant _TermVariant_pair
-
-termVariantRecord :: TTerm TermVariant
-termVariantRecord = injectUnit _TermVariant _TermVariant_record
-
-termVariantSet :: TTerm TermVariant
-termVariantSet = injectUnit _TermVariant _TermVariant_set
-
-termVariantTypeLambda :: TTerm TermVariant
-termVariantTypeLambda = injectUnit _TermVariant _TermVariant_typeLambda
-
-termVariantTypeApplication :: TTerm TermVariant
-termVariantTypeApplication = injectUnit _TermVariant _TermVariant_typeApplication
-
-termVariantUnion :: TTerm TermVariant
-termVariantUnion = injectUnit _TermVariant _TermVariant_union
-
-termVariantUnit :: TTerm TermVariant
-termVariantUnit = injectUnit _TermVariant _TermVariant_unit
-
-termVariantVariable :: TTerm TermVariant
-termVariantVariable = injectUnit _TermVariant _TermVariant_variable
-
-termVariantWrap :: TTerm TermVariant
-termVariantWrap = injectUnit _TermVariant _TermVariant_wrap
-
+-- | Convert a Haskell TypeVariant to a TTerm
 typeVariant :: TypeVariant -> TTerm TypeVariant
 typeVariant v = injectUnit _TypeVariant $ case v of
   TypeVariantAnnotated -> _TypeVariant_annotated
@@ -155,52 +74,5 @@
   TypeVariantUnion -> _TypeVariant_union
   TypeVariantUnit -> _TypeVariant_unit
   TypeVariantVariable -> _TypeVariant_variable
+  TypeVariantVoid -> _TypeVariant_void
   TypeVariantWrap -> _TypeVariant_wrap
-
-typeVariantAnnotated :: TTerm TypeVariant
-typeVariantAnnotated = injectUnit _TypeVariant _TypeVariant_annotated
-
-typeVariantApplication :: TTerm TypeVariant
-typeVariantApplication = injectUnit _TypeVariant _TypeVariant_application
-
-typeVariantEither :: TTerm TypeVariant
-typeVariantEither = injectUnit _TypeVariant _TypeVariant_either
-
-typeVariantFunction :: TTerm TypeVariant
-typeVariantFunction = injectUnit _TypeVariant _TypeVariant_function
-
-typeVariantForall :: TTerm TypeVariant
-typeVariantForall = injectUnit _TypeVariant _TypeVariant_forall
-
-typeVariantList :: TTerm TypeVariant
-typeVariantList = injectUnit _TypeVariant _TypeVariant_list
-
-typeVariantLiteral :: TTerm TypeVariant
-typeVariantLiteral = injectUnit _TypeVariant _TypeVariant_literal
-
-typeVariantMap :: TTerm TypeVariant
-typeVariantMap = injectUnit _TypeVariant _TypeVariant_map
-
-typeVariantMaybe :: TTerm TypeVariant
-typeVariantMaybe = injectUnit _TypeVariant _TypeVariant_maybe
-
-typeVariantPair :: TTerm TypeVariant
-typeVariantPair = injectUnit _TypeVariant _TypeVariant_pair
-
-typeVariantRecord :: TTerm TypeVariant
-typeVariantRecord = injectUnit _TypeVariant _TypeVariant_record
-
-typeVariantSet :: TTerm TypeVariant
-typeVariantSet = injectUnit _TypeVariant _TypeVariant_set
-
-typeVariantUnion :: TTerm TypeVariant
-typeVariantUnion = injectUnit _TypeVariant _TypeVariant_union
-
-typeVariantUnit :: TTerm TypeVariant
-typeVariantUnit = injectUnit _TypeVariant _TypeVariant_unit
-
-typeVariantVariable :: TTerm TypeVariant
-typeVariantVariable = injectUnit _TypeVariant _TypeVariant_variable
-
-typeVariantWrap :: TTerm TypeVariant
-typeVariantWrap = injectUnit _TypeVariant _TypeVariant_wrap
diff --git a/src/main/haskell/Hydra/Dsl/Prims.hs b/src/main/haskell/Hydra/Dsl/Prims.hs
--- a/src/main/haskell/Hydra/Dsl/Prims.hs
+++ b/src/main/haskell/Hydra/Dsl/Prims.hs
@@ -3,16 +3,15 @@
 -- | A DSL for constructing primitive function definitions
 module Hydra.Dsl.Prims where
 
-import Hydra.Compute
 import Hydra.Core
 import Hydra.Classes
 import Hydra.Graph
 import Hydra.Util
-import qualified Hydra.Monads as Monads
 import qualified Hydra.Encode.Core as EncodeCore
 import qualified Hydra.Decode.Core as DecodeCore
 import qualified Hydra.Extract.Core as ExtractCore
-import qualified Hydra.Util as Util
+import qualified Hydra.Context as Context
+import qualified Hydra.Errors as Error
 import qualified Hydra.Extract.Util as ExtractUtil
 import qualified Hydra.Dsl.Terms as Terms
 import qualified Hydra.Dsl.Types as Types
@@ -26,7 +25,12 @@
 import qualified Data.Maybe as Y
 import Hydra.Rewriting (removeTermAnnotations)
 import Data.String(IsString(..))
+import Data.Either (Either)
 
+-- | A helper to create an Error InContext from a string message and context
+otherErr :: Context.Context -> String -> Context.InContext Error.Error
+otherErr cx msg = Context.InContext (Error.ErrorOther (Error.OtherError msg)) cx
+
 -- | A type variable specification with optional class constraints
 data TypeVar = TypeVar {
   typeVarName :: String,
@@ -66,197 +70,191 @@
 instance IsString (TermCoder Term) where fromString = variable
 
 bigfloat :: TermCoder Double
-bigfloat = TermCoder Types.bigfloat $ Coder encode decode
+bigfloat = TermCoder Types.bigfloat encode decode
   where
-    encode = ExtractCore.bigfloat
-    decode = pure . Terms.bigfloat
+    encode cx g = ExtractCore.bigfloat cx g
+    decode _cx = Right . Terms.bigfloat
 
 bigint :: TermCoder Integer
-bigint = TermCoder Types.bigint $ Coder encode decode
+bigint = TermCoder Types.bigint encode decode
   where
-    encode = ExtractCore.bigint
-    decode = pure . Terms.bigint
+    encode cx g = ExtractCore.bigint cx g
+    decode _cx = Right . Terms.bigint
 
 binary :: TermCoder B.ByteString
-binary = TermCoder Types.binary $ Coder encode decode
+binary = TermCoder Types.binary encode decode
   where
-    encode = ExtractCore.binary
-    decode = pure . Terms.binary
+    encode cx g = ExtractCore.binary cx g
+    decode _cx = Right . Terms.binary
 
 boolean :: TermCoder Bool
-boolean = TermCoder Types.boolean $ Coder encode decode
+boolean = TermCoder Types.boolean encode decode
   where
-    encode = ExtractCore.boolean
-    decode = pure . Terms.boolean
+    encode cx g = ExtractCore.boolean cx g
+    decode _cx = Right . Terms.boolean
 
 comparison :: TermCoder Comparison
-comparison = TermCoder (TypeVariable _Comparison) $ Coder encode decode
+comparison = TermCoder (TypeVariable _Comparison) encode decode
   where
-    encode = ExtractUtil.comparison
-    decode = pure . Terms.comparison
+    encode cx g = ExtractUtil.comparison cx g
+    decode _cx = Right . Terms.comparison
 
 either_ :: TermCoder x -> TermCoder y -> TermCoder (Prelude.Either x y)
-either_ xCoder yCoder = TermCoder (Types.either_ (termCoderType xCoder) (termCoderType yCoder)) $ Coder encode decode
+either_ xCoder yCoder = TermCoder (Types.either_ (termCoderType xCoder) (termCoderType yCoder)) encode decode
   where
-    encode term = case term of
-      TermEither (Prelude.Left l) -> Prelude.Left <$> coderEncode (termCoderCoder xCoder) l
-      TermEither (Prelude.Right r) -> Prelude.Right <$> coderEncode (termCoderCoder yCoder) r
-      _ -> fail $ "expected either term, got: " ++ show term
-    decode ev = case ev of
+    encode cx g term = case term of
+      TermEither (Prelude.Left l) -> Prelude.Left <$> termCoderEncode xCoder cx g l
+      TermEither (Prelude.Right r) -> Prelude.Right <$> termCoderEncode yCoder cx g r
+      _ -> Left $ otherErr cx $ "expected either term, got: " ++ show term
+    decode cx ev = case ev of
       Prelude.Left x -> do
-        xTerm <- coderDecode (termCoderCoder xCoder) x
+        xTerm <- termCoderDecode xCoder cx x
         return $ Terms.left xTerm
       Prelude.Right y -> do
-        yTerm <- coderDecode (termCoderCoder yCoder) y
+        yTerm <- termCoderDecode yCoder cx y
         return $ Terms.right yTerm
 
 floatType :: TermCoder FloatType
-floatType = TermCoder (TypeVariable _FloatType) $ Coder encode decode
+floatType = TermCoder (TypeVariable _FloatType) encode decode
   where
-    encode term = do
-      g <- Monads.getState
-      Monads.eitherToFlow Util.unDecodingError $ DecodeCore.floatType g term
-    decode = pure . EncodeCore.floatType
+    encode _cx g term = case DecodeCore.floatType g term of
+      Left err -> Left $ Context.InContext (Error.ErrorDecoding err) _cx
+      Right v -> Right v
+    decode _cx = Right . EncodeCore.floatType
 
 floatValue :: TermCoder FloatValue
-floatValue = TermCoder (TypeVariable _FloatValue) $ Coder encode decode
+floatValue = TermCoder (TypeVariable _FloatValue) encode decode
   where
-    encode = ExtractCore.floatValue
-    decode = pure . Terms.float
+    encode cx g = ExtractCore.floatValue cx g
+    decode _cx = Right . Terms.float
 
 float32 :: TermCoder Float
-float32 = TermCoder Types.float32 $ Coder encode decode
+float32 = TermCoder Types.float32 encode decode
   where
-    encode = ExtractCore.float32
-    decode = pure . Terms.float32
+    encode cx g = ExtractCore.float32 cx g
+    decode _cx = Right . Terms.float32
 
 float64 :: TermCoder Double
-float64 = TermCoder Types.float64 $ Coder encode decode
-  where
-    encode = ExtractCore.float64
-    decode = pure . Terms.float64
-
-flow :: TermCoder s -> TermCoder x -> TermCoder (Flow s x)
-flow states values = TermCoder (TypeVariable _Flow Types.@@ (termCoderType states) Types.@@ (termCoderType values)) $
-    Coder encode decode
+float64 = TermCoder Types.float64 encode decode
   where
-    encode _ = fail $ "cannot currently encode flows from terms"
-    decode _ = fail $ "cannot decode flows to terms"
+    encode cx g = ExtractCore.float64 cx g
+    decode _cx = Right . Terms.float64
 
 function :: TermCoder x -> TermCoder y -> TermCoder (x -> y)
-function dom cod = TermCoder (Types.function (termCoderType dom) (termCoderType cod)) $ Coder encode decode
+function dom cod = TermCoder (Types.function (termCoderType dom) (termCoderType cod)) encode decode
   where
-    encode term = fail $ "cannot encode term to a function: " ++ ShowCore.term term
-    decode _ = fail $ "cannot decode functions to terms"
+    encode cx _g term = Left $ otherErr cx $ "cannot encode term to a function: " ++ ShowCore.term term
+    decode cx _val = Left $ otherErr cx "cannot decode functions to terms"
 
 -- | A TermCoder for function types, using a reducer to bridge term-level functions to native functions.
 --   The reducer is called to evaluate function application at the term level.
 --   Failures in reduction or encoding/decoding will result in a runtime error.
-functionWithReduce :: (Term -> Flow Graph Term) -> TermCoder x -> TermCoder y -> TermCoder (x -> y)
-functionWithReduce reduce dom cod = TermCoder (Types.function (termCoderType dom) (termCoderType cod)) $ Coder encode decode
+functionWithReduce :: (Context.Context -> Graph -> Term -> Either (Context.InContext Error.Error) Term) -> TermCoder x -> TermCoder y -> TermCoder (x -> y)
+functionWithReduce reduce dom cod = TermCoder (Types.function (termCoderType dom) (termCoderType cod)) encode decode
   where
-    encode funTerm = do
-      g <- Monads.getState
-      pure $ \x ->
-        let argTerm = Monads.fromFlow (error "functionWithReduce: failed to encode argument") g
-                        (coderDecode (termCoderCoder dom) x)
-            resultTerm = Monads.fromFlow (error "functionWithReduce: failed to reduce application") g
-                           (reduce (TermApplication (Application funTerm argTerm)))
-        in Monads.fromFlow (error "functionWithReduce: failed to decode result") g
-             (coderEncode (termCoderCoder cod) resultTerm)
-    decode _ = fail $ "cannot decode functions to terms"
+    encode cx g funTerm = Right $ \x ->
+      let argTerm = case termCoderDecode dom cx x of
+            Left _ -> error "functionWithReduce: failed to encode argument"
+            Right t -> t
+          resultTerm = case reduce cx g (TermApplication (Application funTerm argTerm)) of
+            Left _ -> error "functionWithReduce: failed to reduce application"
+            Right t -> t
+      in case termCoderEncode cod cx g resultTerm of
+           Left _ -> error "functionWithReduce: failed to decode result"
+           Right v -> v
+    decode cx _val = Left $ otherErr cx "cannot decode functions to terms"
 
 integerType :: TermCoder IntegerType
-integerType = TermCoder (TypeVariable _IntegerType) $ Coder encode decode
+integerType = TermCoder (TypeVariable _IntegerType) encode decode
   where
-    encode term = do
-      g <- Monads.getState
-      Monads.eitherToFlow Util.unDecodingError $ DecodeCore.integerType g term
-    decode = pure . EncodeCore.integerType
+    encode _cx g term = case DecodeCore.integerType g term of
+      Left err -> Left $ Context.InContext (Error.ErrorDecoding err) _cx
+      Right v -> Right v
+    decode _cx = Right . EncodeCore.integerType
 
 integerValue :: TermCoder IntegerValue
-integerValue = TermCoder (TypeVariable _IntegerValue) $ Coder encode decode
+integerValue = TermCoder (TypeVariable _IntegerValue) encode decode
   where
-    encode = ExtractCore.integerValue
-    decode = pure . Terms.integer
+    encode cx g = ExtractCore.integerValue cx g
+    decode _cx = Right . Terms.integer
 
 int8 :: TermCoder Int8
-int8 = TermCoder Types.int8 $ Coder encode decode
+int8 = TermCoder Types.int8 encode decode
   where
-    encode = ExtractCore.int8
-    decode = pure . Terms.int8
+    encode cx g = ExtractCore.int8 cx g
+    decode _cx = Right . Terms.int8
 
 int16 :: TermCoder Int16
-int16 = TermCoder Types.int16 $ Coder encode decode
+int16 = TermCoder Types.int16 encode decode
   where
-    encode = ExtractCore.int16
-    decode = pure . Terms.int16
+    encode cx g = ExtractCore.int16 cx g
+    decode _cx = Right . Terms.int16
 
 int32 :: TermCoder Int
-int32 = TermCoder Types.int32 $ Coder encode decode
+int32 = TermCoder Types.int32 encode decode
   where
-    encode = ExtractCore.int32
-    decode = pure . Terms.int32
+    encode cx g = ExtractCore.int32 cx g
+    decode _cx = Right . Terms.int32
 
 int64 :: TermCoder Int64
-int64 = TermCoder Types.int64 $ Coder encode decode
+int64 = TermCoder Types.int64 encode decode
   where
-    encode = ExtractCore.int64
-    decode = pure . Terms.int64
+    encode cx g = ExtractCore.int64 cx g
+    decode _cx = Right . Terms.int64
 
 list :: TermCoder x -> TermCoder [x]
-list els = TermCoder (Types.list $ termCoderType els) $ Coder encode decode
+list els = TermCoder (Types.list $ termCoderType els) encode decode
   where
-    encode = ExtractCore.listOf (coderEncode $ termCoderCoder els)
-    decode l = Terms.list <$> mapM (coderDecode $ termCoderCoder els) l
+    encode cx g = ExtractCore.listOf cx (termCoderEncode els cx g) g
+    decode cx l = Terms.list <$> mapM (termCoderDecode els cx) l
 
 literal :: TermCoder Literal
-literal = TermCoder (TypeVariable _Literal) $ Coder encode decode
+literal = TermCoder (TypeVariable _Literal) encode decode
   where
-    encode = ExtractCore.literal
-    decode = pure . Terms.literal
+    encode cx g = ExtractCore.literal cx g
+    decode _cx = Right . Terms.literal
 
 literalType :: TermCoder LiteralType
-literalType = TermCoder (TypeVariable _LiteralType) $ Coder encode decode
+literalType = TermCoder (TypeVariable _LiteralType) encode decode
   where
-    encode term = do
-      g <- Monads.getState
-      Monads.eitherToFlow Util.unDecodingError $ DecodeCore.literalType g term
-    decode = pure . EncodeCore.literalType
+    encode _cx g term = case DecodeCore.literalType g term of
+      Left err -> Left $ Context.InContext (Error.ErrorDecoding err) _cx
+      Right v -> Right v
+    decode _cx = Right . EncodeCore.literalType
 
 map :: Ord k => TermCoder k -> TermCoder v -> TermCoder (M.Map k v)
-map keys values = TermCoder (Types.map (termCoderType keys) (termCoderType values)) $ Coder encode decode
+map keys values = TermCoder (Types.map (termCoderType keys) (termCoderType values)) encode decode
   where
-    encode = ExtractCore.map (coderEncode $ termCoderCoder keys) (coderEncode $ termCoderCoder values)
-    decode m = Terms.map . M.fromList <$> mapM decodePair (M.toList m)
+    encode cx g = ExtractCore.map cx (termCoderEncode keys cx g) (termCoderEncode values cx g) g
+    decode cx m = Terms.map . M.fromList <$> mapM decodePair (M.toList m)
       where
         decodePair (k, v) = do
-          ke <- (coderDecode $ termCoderCoder keys) k
-          ve <- (coderDecode $ termCoderCoder values) v
+          ke <- termCoderDecode keys cx k
+          ve <- termCoderDecode values cx v
           return (ke, ve)
 
 optional :: TermCoder x -> TermCoder (Y.Maybe x)
-optional mel = TermCoder (Types.optional $ termCoderType mel) $ Coder encode decode
+optional mel = TermCoder (Types.optional $ termCoderType mel) encode decode
   where
-    encode = ExtractCore.maybeTerm (coderEncode $ termCoderCoder mel)
-    decode mv = Terms.optional <$> case mv of
+    encode cx g = ExtractCore.maybeTerm cx (termCoderEncode mel cx g) g
+    decode cx mv = Terms.optional <$> case mv of
       Nothing -> pure Nothing
-      Just v -> Just <$> (coderDecode $ termCoderCoder mel) v
+      Just v -> Just <$> termCoderDecode mel cx v
 
 pair :: TermCoder x -> TermCoder y -> TermCoder (x, y)
-pair xCoder yCoder = TermCoder (Types.pair (termCoderType xCoder) (termCoderType yCoder)) $ Coder encode decode
+pair xCoder yCoder = TermCoder (Types.pair (termCoderType xCoder) (termCoderType yCoder)) encode decode
   where
-    encode = ExtractCore.pair (coderEncode $ termCoderCoder xCoder) (coderEncode $ termCoderCoder yCoder)
-    decode (x, y) = do
-      xTerm <- coderDecode (termCoderCoder xCoder) x
-      yTerm <- coderDecode (termCoderCoder yCoder) y
+    encode cx g = ExtractCore.pair cx (termCoderEncode xCoder cx g) (termCoderEncode yCoder cx g) g
+    decode cx (x, y) = do
+      xTerm <- termCoderDecode xCoder cx x
+      yTerm <- termCoderDecode yCoder cx y
       return $ Terms.pair xTerm yTerm
 
 prim0 :: Name -> x -> [TypeVar] -> TermCoder x -> Primitive
 prim0 name value vars output = Primitive name typ impl
   where
     typ = buildTypeScheme vars $ termCoderType output
-    impl _ = coderDecode (termCoderCoder output) value
+    impl cx _g _args = termCoderDecode output cx value
 
 prim1 :: Name -> (x -> y) -> [TypeVar] -> TermCoder x -> TermCoder y -> Primitive
 prim1 name compute vars input1 output = Primitive name typ impl
@@ -264,10 +262,10 @@
     typ = buildTypeScheme vars $ Types.functionMany [
       termCoderType input1,
       termCoderType output]
-    impl args = do
-      ExtractCore.nArgs name 1 args
-      arg1 <- coderEncode (termCoderCoder input1) (args !! 0)
-      coderDecode (termCoderCoder output) $ compute arg1
+    impl cx g args = do
+      ExtractCore.nArgs cx name 1 args
+      arg1 <- termCoderEncode input1 cx g (args !! 0)
+      termCoderDecode output cx $ compute arg1
 
 prim2 :: Name -> (x -> y -> z) -> [TypeVar] -> TermCoder x -> TermCoder y -> TermCoder z -> Primitive
 prim2 name compute vars input1 input2 output = Primitive name typ impl
@@ -276,11 +274,11 @@
       termCoderType input1,
       termCoderType input2,
       termCoderType output]
-    impl args = do
-      ExtractCore.nArgs name 2 args
-      arg1 <- coderEncode (termCoderCoder input1) (args !! 0)
-      arg2 <- coderEncode (termCoderCoder input2) (args !! 1)
-      coderDecode (termCoderCoder output) $ compute arg1 arg2
+    impl cx g args = do
+      ExtractCore.nArgs cx name 2 args
+      arg1 <- termCoderEncode input1 cx g (args !! 0)
+      arg2 <- termCoderEncode input2 cx g (args !! 1)
+      termCoderDecode output cx $ compute arg1 arg2
 
 prim3 :: Name -> (w -> x -> y -> z) -> [TypeVar] -> TermCoder w -> TermCoder x -> TermCoder y -> TermCoder z -> Primitive
 prim3 name compute vars input1 input2 input3 output = Primitive name typ impl
@@ -290,98 +288,65 @@
       termCoderType input2,
       termCoderType input3,
       termCoderType output]
-    impl args = do
-      ExtractCore.nArgs name 3 args
-      arg1 <- coderEncode (termCoderCoder input1) (args !! 0)
-      arg2 <- coderEncode (termCoderCoder input2) (args !! 1)
-      arg3 <- coderEncode (termCoderCoder input3) (args !! 2)
-      coderDecode (termCoderCoder output) $ compute arg1 arg2 arg3
-
-prim1Eval :: Name -> (Term -> Flow Graph Term) -> [TypeVar] -> TermCoder x -> TermCoder y -> Primitive
-prim1Eval name compute vars input1 output = Primitive name typ impl
-  where
-    typ = buildTypeScheme vars $ Types.functionMany [
-      termCoderType input1,
-      termCoderType output]
-    impl args = do
-      ExtractCore.nArgs name 1 args
-      compute (args !! 0)
-
-prim2Eval :: Name -> (Term -> Term -> Flow Graph Term) -> [TypeVar] -> TermCoder x -> TermCoder y -> TermCoder z -> Primitive
-prim2Eval name compute vars input1 input2 output = Primitive name typ impl
-  where
-    typ = buildTypeScheme vars $ Types.functionMany [
-      termCoderType input1,
-      termCoderType input2,
-      termCoderType output]
-    impl args = do
-      ExtractCore.nArgs name 2 args
-      compute (args !! 0) (args !! 1)
-
-prim3Eval :: Name -> (Term -> Term -> Term -> Flow Graph Term) -> [TypeVar] -> TermCoder w -> TermCoder x -> TermCoder y -> TermCoder z -> Primitive
-prim3Eval name compute vars input1 input2 input3 output = Primitive name typ impl
-  where
-    typ = buildTypeScheme vars $ Types.functionMany [
-      termCoderType input1,
-      termCoderType input2,
-      termCoderType input3,
-      termCoderType output]
-    impl args = do
-      ExtractCore.nArgs name 3 args
-      compute (args !! 0) (args !! 1) (args !! 2)
+    impl cx g args = do
+      ExtractCore.nArgs cx name 3 args
+      arg1 <- termCoderEncode input1 cx g (args !! 0)
+      arg2 <- termCoderEncode input2 cx g (args !! 1)
+      arg3 <- termCoderEncode input3 cx g (args !! 2)
+      termCoderDecode output cx $ compute arg1 arg2 arg3
 
 set :: Ord x => TermCoder x -> TermCoder (S.Set x)
-set els = TermCoder (Types.set $ termCoderType els) $ Coder encode decode
+set els = TermCoder (Types.set $ termCoderType els) encode decode
   where
-    encode = ExtractCore.setOf (coderEncode $ termCoderCoder els)
-    decode s = Terms.set . S.fromList <$> mapM (coderDecode $ termCoderCoder els) (S.toList s)
+    encode cx g = ExtractCore.setOf cx (termCoderEncode els cx g) g
+    decode cx s = Terms.set . S.fromList <$> mapM (termCoderDecode els cx) (S.toList s)
 
 string :: TermCoder String
-string = TermCoder Types.string $ Coder encode decode
+string = TermCoder Types.string encode decode
   where
-    encode = ExtractCore.string
-    decode = pure . Terms.string
+    encode cx g = ExtractCore.string cx g
+    decode _cx = Right . Terms.string
 
 term :: TermCoder Term
-term = TermCoder (TypeVariable _Term) $ Coder encode decode
+term = TermCoder (TypeVariable _Term) encode decode
   where
-    encode = pure
-    decode = pure
+    encode _cx _g = Right
+    decode _cx = Right
 
 type_ :: TermCoder Type
-type_ = TermCoder (TypeVariable _Type) $ Coder encode decode
+type_ = TermCoder (TypeVariable _Type) encode decode
   where
-    encode term = do
-      g <- Monads.getState
-      Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ g term
-    decode = pure . EncodeCore.type_
+    encode _cx g t = case DecodeCore.type_ g t of
+      Left err -> Left $ Context.InContext (Error.ErrorDecoding err) _cx
+      Right v -> Right v
+    decode _cx = Right . EncodeCore.type_
 
 uint8 :: TermCoder Int16
-uint8 = TermCoder Types.uint8 $ Coder encode decode
+uint8 = TermCoder Types.uint8 encode decode
   where
-    encode = ExtractCore.uint8
-    decode = pure . Terms.uint8
+    encode cx g = ExtractCore.uint8 cx g
+    decode _cx = Right . Terms.uint8
 
 uint16 :: TermCoder Int
-uint16 = TermCoder Types.uint16 $ Coder encode decode
+uint16 = TermCoder Types.uint16 encode decode
   where
-    encode = ExtractCore.uint16
-    decode = pure . Terms.uint16
+    encode cx g = ExtractCore.uint16 cx g
+    decode _cx = Right . Terms.uint16
 
 uint32 :: TermCoder Int64
-uint32 = TermCoder Types.uint32 $ Coder encode decode
+uint32 = TermCoder Types.uint32 encode decode
   where
-    encode = ExtractCore.uint32
-    decode = pure . Terms.uint32
+    encode cx g = ExtractCore.uint32 cx g
+    decode _cx = Right . Terms.uint32
 
 uint64 :: TermCoder Integer
-uint64 = TermCoder Types.uint64 $ Coder encode decode
+uint64 = TermCoder Types.uint64 encode decode
   where
-    encode = ExtractCore.uint64
-    decode = pure . Terms.uint64
+    encode cx g = ExtractCore.uint64 cx g
+    decode _cx = Right . Terms.uint64
 
 variable :: String -> TermCoder Term
-variable v = TermCoder (Types.var v) $ Coder encode decode
+variable v = TermCoder (Types.var v) encode decode
   where
-    encode = pure
-    decode = pure
+    encode _cx _g = Right
+    decode _cx = Right
diff --git a/src/main/haskell/Hydra/Dsl/Tabular.hs b/src/main/haskell/Hydra/Dsl/Tabular.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Dsl/Tabular.hs
+++ /dev/null
@@ -1,14 +0,0 @@
--- | DSL helpers for constructing tabular (relational) schemas
-
-module Hydra.Dsl.Tabular where
-
-import Hydra.Core
-import Hydra.Relational
-import Hydra.Tabular
-
-
-columnType :: String -> Type -> ColumnType
-columnType name typ = ColumnType (ColumnName name) typ
-
-tableType :: String -> [ColumnType] -> TableType
-tableType name columns = TableType (RelationName name) columns
diff --git a/src/main/haskell/Hydra/Dsl/Types.hs b/src/main/haskell/Hydra/Dsl/Types.hs
--- a/src/main/haskell/Hydra/Dsl/Types.hs
+++ b/src/main/haskell/Hydra/Dsl/Types.hs
@@ -6,7 +6,6 @@
 import Hydra.Core
 import Hydra.Dsl.AsType
 import Hydra.Dsl.Meta.Common
-import Hydra.Constants
 
 import qualified Data.List as L
 import qualified Data.Map as M
@@ -209,16 +208,10 @@
 product [a, b] = pair a b
 product (a:rest) = pair a (product rest)
 
--- | Create a record type with the given fields and the default type name
+-- | Create a record type with the given fields
 -- Example: record ["name">: string, "age">: int32]
--- Use 'recordWithName' to specify a custom type name
 record :: [FieldType] -> Type
-record = recordWithName placeholderName
-
--- | Create a record type with the given fields and a provided type name
--- Example: recordWithName (Name "Person") ["name" >: string, "age" >: int32]
-recordWithName :: Name -> [FieldType] -> Type
-recordWithName tname fields = TypeRecord $ RowType tname fields
+record = TypeRecord
 
 -- | Set type
 -- Example: set string
@@ -249,12 +242,16 @@
 unit :: Type
 unit = TypeUnit
 
--- | Create a union type with the given variants and the default type name
+-- | Void type (uninhabited / bottom type)
+void :: Type
+void = TypeVoid
+
+-- | Create a union type with the given variants
 -- Example: union ["success">: int32, "failure">: string]
 -- This creates a tagged union type (sum type with named variants)
 -- Similar to sum [int32, string] but with named branches
 union :: [FieldType] -> Type
-union fields = TypeUnion $ RowType placeholderName fields
+union = TypeUnion
 
 -- | Create a type variable with the given name
 -- Example: variable "a"
@@ -266,13 +263,7 @@
 var :: String -> Type
 var = variable
 
--- | Create a wrapped type (newtype) with a provided base type and the default type name
+-- | Create a wrapped type (newtype) with a provided base type
 -- Example: wrap string
--- Creates a newtype with placeholder name; use 'wrapWithName' for custom names
 wrap :: AsType a => a -> Type
-wrap = wrapWithName placeholderName
-
--- | Create a wrapped type (newtype) with a provided base type and type name
--- Example: wrapWithName (Name "Email") string
-wrapWithName :: AsType a => Name -> a -> Type
-wrapWithName name t = TypeWrap $ WrappedType name (asType t)
+wrap = TypeWrap . asType
diff --git a/src/main/haskell/Hydra/Ext/Haskell/TestingIo.hs b/src/main/haskell/Hydra/Ext/Haskell/TestingIo.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Ext/Haskell/TestingIo.hs
@@ -0,0 +1,66 @@
+-- | Haskell test code generation codec for HSpec-based generation tests.
+-- This thin wrapper delegates all codec logic to the generated module,
+-- and only adds the TestGenerator (which involves IO infrastructure)
+-- and the aggregator file generator (which uses System.FilePath).
+
+module Hydra.Ext.Haskell.TestingIo where
+
+import Hydra.Kernel hiding (map)
+import Hydra.Testing
+import Hydra.Generation (showError, TestGenerator(..), generateGenerationTestSuite)
+import Hydra.Test.Transform (addGenerationPrefix)
+import Hydra.Ext.Haskell.Utils (namespacesForModule, sanitizeHaskellName)
+import qualified Hydra.Ext.Haskell.Testing as Generated
+import qualified Hydra.Ext.Haskell.Syntax as H
+import qualified Hydra.Formatting as Formatting
+import qualified Hydra.Lib.Strings as Strings
+
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified System.FilePath as FP
+import Data.Char (toUpper)
+
+
+-- | Haskell-specific test generator
+haskellTestGenerator :: TestGenerator H.ModuleName
+haskellTestGenerator = TestGenerator {
+  testGeneratorNamespacesForModule = \m g -> do
+    case namespacesForModule m emptyContext g of
+      Left ic -> Left (showError (inContextObject ic))
+      Right ns -> Right ns,
+  testGeneratorCreateCodec = Generated.haskellTestCodec,
+  testGeneratorGenerateTestFile = Generated.generateHaskellTestFile,
+  testGeneratorAggregatorFile = Just generateHaskellAggregatorSpec
+}
+
+-- | Main entry point for generating Haskell generation tests
+generateHaskellGenerationTests :: FilePath -> [Module] -> (Namespace -> Maybe TestGroup) -> IO Bool
+generateHaskellGenerationTests = generateGenerationTestSuite haskellTestGenerator
+
+-- | Generate an aggregator spec file that imports all generated test modules (Haskell/HSpec style)
+generateHaskellAggregatorSpec :: FilePath -> [Module] -> (FilePath, String)
+generateHaskellAggregatorSpec baseDir modules =
+  let addSpecSuffix (Namespace ns) = Namespace (ns ++ "Spec")
+      modulePaths = map (namespaceToModuleName . addSpecSuffix . addGenerationPrefix . moduleNamespace) modules
+      imports = L.intercalate "\n" $ map (\m -> "import qualified " ++ m ++ " as " ++ sanitizeModuleName m) modulePaths
+      specs = L.intercalate "\n    " $ map (\m -> sanitizeModuleName m ++ ".spec") modulePaths
+      content = unlines [
+        "-- Note: this is an automatically generated file. Do not edit.",
+        "",
+        "module Generation.Spec (spec) where",
+        "",
+        "import qualified Test.Hspec as H",
+        imports,
+        "",
+        "spec :: H.Spec",
+        "spec = do",
+        "    " ++ specs
+        ]
+      filePath = FP.combine baseDir "Generation/Spec.hs"
+  in (filePath, content)
+  where
+    sanitizeModuleName = map (\c -> if c == '.' then '_' else c)
+    namespaceToModuleName (Namespace ns) =
+      L.intercalate "." $ L.map capitalize (L.filter (not . null) $ Strings.splitOn "." ns)
+    capitalize [] = []
+    capitalize (x:xs) = toUpper x : xs
diff --git a/src/main/haskell/Hydra/Generation.hs b/src/main/haskell/Hydra/Generation.hs
--- a/src/main/haskell/Hydra/Generation.hs
+++ b/src/main/haskell/Hydra/Generation.hs
@@ -1,6 +1,9 @@
 -- | Entry point for Hydra code generation utilities
 
-module Hydra.Generation where
+module Hydra.Generation (
+  module Hydra.Generation,
+  TestGenerator(..),
+) where
 
 import Hydra.Kernel
 import Hydra.Dsl.Annotations
@@ -8,18 +11,28 @@
 import Hydra.Ext.Haskell.Coder
 import Hydra.Ext.Haskell.Language
 import Hydra.Module (_Module)
+import Hydra.Testing (TestGenerator(..), TestCodec(..), TestGroup(..), TestCaseWithMetadata(..), TestCase(..),
+                       DelegatedEvaluationTestCase(..))
 import qualified Hydra.Json.Model as Json
 import qualified Hydra.Json.Writer as JsonWriter
-import Hydra.Staging.Yaml.Modules
-import Hydra.Staging.Yaml.Language
 import Hydra.Sources.Libraries
+import qualified Hydra.Context as Context
 import qualified Hydra.Decoding as Decoding
+import qualified Hydra.Dsls as Dsls
 import qualified Hydra.Encoding as Encoding
+import qualified Hydra.Errors as Error
+import qualified Hydra.Show.Errors as ShowError
 import qualified Hydra.Sources.All as Sources
 import qualified Hydra.Sources.Eval.Lib.All as EvalLib
 import qualified Hydra.Sources.Kernel.Types.Core as CoreTypes
 import qualified Hydra.CodeGeneration as CodeGeneration
+import Hydra.Test.Transform (addGenerationPrefix, collectTestCases, transformToCompiledTests)
+import Hydra.Sources.Test.All (testModules)
+import qualified Hydra.Inference as Inference
 
+import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
+
 import qualified Control.Monad as CM
 import qualified Data.Aeson as A
 import qualified Data.Aeson.KeyMap as AKM
@@ -27,21 +40,33 @@
 import qualified Data.ByteString.Lazy as BS
 import qualified Data.Scientific as SC
 import qualified Data.Vector as V
-import Data.Word (Word8)
 import qualified System.FilePath as FP
 import qualified Data.List as L
 import qualified Data.List.Split as LS
 import qualified Data.Map as M
-import qualified Data.Set as S
 import qualified Data.Text as T
 import qualified System.Directory as SD
 import qualified Data.Maybe as Y
+import Data.Char (isAlphaNum, isUpper, toLower, toUpper)
+import Debug.Trace (trace)
+import qualified Hydra.Lib.Strings as Strings
 
 
+-- | Format an InContext Error with trace information
+formatError :: Context.InContext Error.Error -> String
+formatError ic = showError (Context.inContextObject ic) ++ traceInfo
+  where
+    cx = Context.inContextContext ic
+    stack = Context.contextTrace cx
+    traceInfo = if L.null stack then "" else " (" ++ L.intercalate " > " (reverse stack) ++ ")"
+
+showError :: Error.Error -> String
+showError = ShowError.error
+
 -- | Generate source files and write them to disk.
 -- This is a thin I/O wrapper around 'generateSourceFiles'.
 generateSources
-  :: (Module -> [Definition] -> Flow Graph (M.Map FilePath String))
+  :: (Module -> [Definition] -> Context.Context -> Graph -> Either (Context.InContext Error.Error) (M.Map FilePath String))
   -> Language
   -> Bool  -- ^ doInfer
   -> Bool  -- ^ doExpand
@@ -50,115 +75,46 @@
   -> FilePath
   -> [Module]  -- ^ Universe
   -> [Module]  -- ^ Modules to generate
-  -> IO ()
+  -> IO Int  -- ^ Number of files written
 generateSources printDefinitions lang doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings basePath universeModules modulesToGenerate = do
-    mfiles <- runFlow bootstrapGraph $
-      CodeGeneration.generateSourceFiles printDefinitions lang doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings bootstrapGraph universeModules modulesToGenerate
-    case mfiles of
-      Nothing -> fail "Failed to generate source files"
-      Just files -> mapM_ writePair files
+    let cx = Context.Context [] [] M.empty
+    case CodeGeneration.generateSourceFiles printDefinitions lang doInfer doExpand doHoistCaseStatements doHoistPolymorphicLetBindings bootstrapGraph universeModules modulesToGenerate cx of
+      Left ic -> fail $ "Failed to generate source files: " ++ formatError ic
+      Right files -> do
+        mapM_ writePair files
+        return $ length files
   where
     writePair (path, s) = do
         let fullPath = FP.combine basePath path
         SD.createDirectoryIfMissing True $ FP.takeDirectory fullPath
         writeFile fullPath withNewline
       where
-        withNewline = if L.isSuffixOf "\n" s then s else s ++ "\n"
+        cleaned = unlines $ map stripTrailingWhitespace $ lines s
+        stripTrailingWhitespace line = reverse $ dropWhile (== ' ') $ reverse line
+        withNewline = if L.isSuffixOf "\n" cleaned then cleaned else cleaned ++ "\n"
 
 -- | Build a graph from a list of modules using the Haskell bootstrapGraph.
 -- Thin wrapper around modulesToGraphWith.
 modulesToGraph :: [Module] -> [Module] -> Graph
 modulesToGraph = CodeGeneration.modulesToGraph bootstrapGraph
 
-printTrace :: Bool -> Trace -> IO ()
-printTrace isError t = do
-  CM.unless (L.null $ traceMessages t) $ do
-      putStrLn $ if isError then "Flow failed. Messages:" else "Messages:"
-      putStrLn $ indentLines $ traceSummary t
 
-runFlow :: s -> Flow s a -> IO (Maybe a)
-runFlow s f = do
-    printTrace (Y.isNothing v) t
-    return v
-  where
-    FlowState v _ t = unFlow f s emptyTrace
-
 -- | Generate Haskell source files from modules.
 -- First argument: output directory
 -- Second argument: universe modules (all modules for type/term resolution)
 -- Third argument: modules to transform and generate
-writeHaskell :: FilePath -> [Module] -> [Module] -> IO ()
+writeHaskell :: FilePath -> [Module] -> [Module] -> IO Int
 writeHaskell = generateSources moduleToHaskell haskellLanguage True False False False
 
 -- writeJson :: FP.FilePath -> [Module] -> IO ()
 -- writeJson = generateSources Json.printModule
 
--- | YAML generation - only processes data modules (term definitions), skips schema modules
--- First argument: output directory
--- Second argument: universe modules (all modules for type/term resolution)
--- Third argument: modules to transform and generate
-writeYaml :: FP.FilePath -> [Module] -> [Module] -> IO ()
-writeYaml basePath universeModules modulesToGenerate = do
-    mfiles <- runFlow bootstrapGraph (generateFiles modulesToGenerate)
-    case mfiles of
-      Nothing -> fail "Failed to generate YAML files"
-      Just files -> mapM_ writePair files
-  where
-    constraints = languageConstraints yamlLanguage
-    hasNativeTypes mod = not $ L.null $ L.filter isNativeType $ moduleElements mod
-
-    -- Build the complete universe by computing transitive closure of dependencies
-    namespaceMap = M.fromList [(moduleNamespace m, m) | m <- universeModules ++ modulesToGenerate]
-
-    transitiveClosure :: [Module] -> S.Set Namespace
-    transitiveClosure startMods = go (S.fromList $ moduleNamespace <$> startMods) S.empty
-      where
-        go pending visited
-          | S.null pending = visited
-          | otherwise =
-              let newVisited = S.union visited pending
-                  nextDeps = S.fromList $ concat
-                    [moduleTermDependencies m ++ moduleTypeDependencies m
-                    | ns <- S.toList pending
-                    , Just m <- [M.lookup ns namespaceMap]]
-                  newPending = S.difference nextDeps newVisited
-              in go newPending newVisited
-
-    allNeededNamespaces = transitiveClosure modulesToGenerate
-    completeUniverse = [m | ns <- S.toList allNeededNamespaces, Just m <- [M.lookup ns namespaceMap]]
-                    ++ modulesToGenerate
-
-    generateFiles mods = do
-        -- Only process data modules (modules without native types)
-        let dataModules = L.filter (not . hasNativeTypes) mods
-        if L.null dataModules
-          then pure []
-          else withTrace "generate YAML files" $ do
-            let g0 = modulesToGraph completeUniverse completeUniverse  -- Use complete universe for full dependency resolution
-                namespaces = fmap moduleNamespace dataModules
-            -- Infer types on the data graph before adaptation (eta expansion requires types)
-            g0' <- inferGraphTypes g0
-            (g1, defLists) <- dataGraphToDefinitions constraints True True False False g0' namespaces
-            withState g1 $ do
-              maps <- CM.zipWithM forEachModule dataModules defLists
-              return $ L.concat (M.toList <$> maps)
-      where
-        forEachModule mod defs = withTrace ("data module " ++ unNamespace (moduleNamespace mod)) $
-          moduleToYaml mod (fmap DefinitionTerm defs)
-
-    writePair (path, contents) = do
-      let fullPath = basePath FP.</> path
-      SD.createDirectoryIfMissing True $ FP.takeDirectory fullPath
-      writeFile fullPath contents
-
 -- | Generate and write the lexicon file (IO wrapper).
 writeLexicon :: FilePath -> IO ()
 writeLexicon path = do
-  mcontent <- runFlow bootstrapGraph
-    (CodeGeneration.inferAndGenerateLexicon bootstrapGraph Sources.kernelModules)
-  case mcontent of
-    Nothing -> fail "Lexicon generation failed"
-    Just content -> do
+  case CodeGeneration.inferAndGenerateLexicon (Context [] [] M.empty) bootstrapGraph Sources.kernelModules of
+    Left err -> fail $ "Lexicon generation failed: " ++ err
+    Right content -> do
       writeFile path content
       putStrLn $ "Lexicon written to " ++ path
 
@@ -168,17 +124,13 @@
 
 ----------------------------------------
 
--- | IO wrapper for generateCoderModules. Evaluates the Flow and handles errors.
-generateCoderModulesIO :: (Module -> Flow Graph (Maybe Module)) -> String -> [Module] -> [Module] -> IO [Module]
+-- | IO wrapper for generateCoderModules. Evaluates the Either and handles errors.
+generateCoderModulesIO :: (Context.Context -> Graph -> Module -> Either (Context.InContext Error.Error) (Maybe Module)) -> String -> [Module] -> [Module] -> IO [Module]
 generateCoderModulesIO codec label universeModules typeModules = do
-    let graph = modulesToGraph universeModules universeModules
-    case graphSchema graph of
-      Nothing -> fail "No schema graph available"
-      Just schemaGraph -> do
-        mresult <- runFlow schemaGraph (CodeGeneration.generateCoderModules codec bootstrapGraph universeModules typeModules)
-        case mresult of
-          Nothing -> fail $ "Failed to generate " ++ label ++ " modules"
-          Just results -> return results
+    let cx = Context.Context [] [] M.empty
+    case CodeGeneration.generateCoderModules codec bootstrapGraph universeModules typeModules cx of
+      Left ic -> fail $ "Failed to generate " ++ label ++ " modules: " ++ formatError ic
+      Right results -> return results
 
 generateDecoderModules :: [Module] -> [Module] -> IO [Module]
 generateDecoderModules = generateCoderModulesIO Decoding.decodeModule "decoder"
@@ -207,7 +159,8 @@
 writeCoderSourceHaskell generate basePath universeModules typeModules = do
   sourceMods <- generateCoderSourceModules generate universeModules typeModules
   -- The source modules need the Module encoder/decoder and Core types
-  writeHaskell basePath (universeModules ++ sourceMods) sourceMods
+  _ <- writeHaskell basePath (universeModules ++ sourceMods) sourceMods
+  return ()
 
 -- | Write decoder Source modules as Haskell to the given path.
 -- These typically go to src/gen-main/haskell/Hydra/Sources/Decode/
@@ -233,7 +186,8 @@
     -- Add core types namespace to each encoder/decoder module's type dependencies
     -- since the encoders/decoders reference hydra.core.Term, hydra.core.Injection, etc.
     let withCoreDeps = fmap addCoreDep coderMods
-    writeHaskell basePath universeModules withCoreDeps
+    _ <- writeHaskell basePath universeModules withCoreDeps
+    return ()
   where
     addCoreDep m = m { moduleTypeDependencies = CoreTypes.ns : moduleTypeDependencies m }
 
@@ -244,17 +198,41 @@
 writeEncoderHaskell = writeCoderHaskell generateEncoderModules
 
 ----------------------------------------
+-- DSL Module Generation
+----------------------------------------
+
+-- | Write the hydra.dsls source module (the DSL generator itself) to Haskell.
+-- The Dsls module is NOT included in the universe to avoid infinite recursion
+-- during graph construction (its terms reference decoders that reference types).
+writeDslSourceHaskell :: FilePath -> IO ()
+writeDslSourceHaskell basePath = do
+    _ <- writeHaskell basePath Sources.mainModules Sources.dslSourceModules
+    return ()
+
+generateDslModules :: [Module] -> [Module] -> IO [Module]
+generateDslModules = generateCoderModulesIO Dsls.dslModule "DSL"
+
+-- | Write DSL modules with doInfer=False. All bindings are fully typed.
+writeDslHaskell :: FilePath -> [Module] -> [Module] -> IO ()
+writeDslHaskell basePath universeModules typeModules = do
+    dslMods <- generateDslModules universeModules typeModules
+    let nonEmpty = filter (not . null . moduleDefinitions) dslMods
+    let withCoreDeps = fmap addCoreDep nonEmpty
+    _ <- generateSources moduleToHaskell haskellLanguage False False False False basePath universeModules withCoreDeps
+    return ()
+  where
+    addCoreDep m = m { moduleTypeDependencies = CoreTypes.ns : moduleTypeDependencies m }
+
+----------------------------------------
 -- Module Inference
 ----------------------------------------
 
--- | IO wrapper for inferModules. Evaluates the Flow and handles errors.
+-- | IO wrapper for inferModules. Evaluates the Either and handles errors.
 inferModulesIO :: [Module] -> [Module] -> IO [Module]
 inferModulesIO universeMods targetMods = do
-  let g0 = modulesToGraph universeMods universeMods
-  mresult <- runFlow g0 (CodeGeneration.inferModules bootstrapGraph universeMods targetMods)
-  case mresult of
-    Nothing -> fail "Type inference failed on modules"
-    Just mods -> return mods
+  case CodeGeneration.inferModules (Context [] [] M.empty) bootstrapGraph universeMods targetMods of
+    Left ic -> fail $ "Type inference failed: " ++ formatError ic
+    Right mods -> return mods
 
 ----------------------------------------
 -- JSON Module Export
@@ -282,11 +260,21 @@
   mods' <- if doInfer then inferModulesIO universeMods mods else return mods
   mapM_ (writeModuleJson basePath) mods'
 
+-- | Write DSL modules to JSON files.
+writeDslJson :: FilePath -> [Module] -> [Module] -> IO ()
+writeDslJson basePath universeModules typeModules = do
+    dslMods <- generateDslModules universeModules typeModules
+    let nonEmpty = filter (not . null . moduleDefinitions) dslMods
+    writeModulesJson False basePath universeModules nonEmpty
+
 -- | Write a manifest.json listing module namespaces for kernelModules, mainModules, and testModules.
 -- This allows Java and Python hosts to load the correct set of modules without directory scanning.
 writeManifestJson :: FilePath -> IO ()
 writeManifestJson basePath = do
+    dslMods <- generateDslModules Sources.mainModules Sources.kernelTypesModules
+    let nonEmptyDsls = filter (not . null . moduleDefinitions) dslMods
     let jsonVal = Json.ValueObject $ M.fromList [
+            ("dslModules", namespacesJson nonEmptyDsls),
             ("evalLibModules", namespacesJson EvalLib.evalLibModules),
             ("kernelModules", namespacesJson Sources.kernelModules),
             ("mainModules", namespacesJson Sources.mainModules),
@@ -346,6 +334,25 @@
     toNamespace (Json.ValueString s) = Namespace s
     toNamespace _ = error $ "manifest.json: expected string in " ++ fieldName
 
+-- | Read a manifest field, trying a primary name first and falling back to an alternative.
+readManifestFieldWithFallback :: FilePath -> String -> String -> IO [Namespace]
+readManifestFieldWithFallback basePath primaryField fallbackField = do
+    let manifestPath = basePath FP.</> "manifest.json"
+    parseResult <- parseJsonFile manifestPath
+    case parseResult of
+      Left err -> fail $ "Failed to parse manifest.json: " ++ err
+      Right jsonVal -> case jsonVal of
+        Json.ValueObject obj -> case M.lookup primaryField obj of
+          Just (Json.ValueArray arr) -> return $ fmap toNamespace arr
+          _ -> case M.lookup fallbackField obj of
+            Just (Json.ValueArray arr) -> return $ fmap toNamespace arr
+            Nothing -> fail $ "manifest.json missing fields: " ++ primaryField ++ " and " ++ fallbackField
+            Just _ -> fail $ "manifest.json field " ++ fallbackField ++ " is not an array"
+        _ -> fail "manifest.json is not a JSON object"
+  where
+    toNamespace (Json.ValueString s) = Namespace s
+    toNamespace _ = error $ "manifest.json: expected string in " ++ primaryField ++ "/" ++ fallbackField
+
 -- | Load modules from JSON files for a list of namespaces.
 -- Uses the universe modules to build the graph for type resolution.
 -- When doStripTypeSchemes is True, TypeSchemes are stripped from term bindings.
@@ -361,3 +368,125 @@
           Right mod -> do
             putStrLn $ "  Loaded: " ++ unNamespace ns
             return mod
+
+----------------------------------------
+-- Test Generation
+----------------------------------------
+
+-- | Build namespaces for test group by creating a module with test terms and using the generator's namespacesForModule
+buildNamespacesForTestGroup :: TestGenerator a -> Module -> TestGroup -> Graph -> Either String (Namespaces a)
+buildNamespacesForTestGroup testGen testModule testGroup g = do
+    let testCases = collectTestCases testGroup
+        testTerms = concatMap extractTestTerms testCases
+        testBindings = zipWith (\i term -> Binding (Name $ "_test_" ++ show i) term Nothing) ([0..] :: [Integer]) testTerms
+        tempModule = testModule { moduleDefinitions = map bindingToDefinition testBindings }
+    testGeneratorNamespacesForModule testGen tempModule g
+  where
+    extractTestTerms (TestCaseWithMetadata _ tcase _ _) = case tcase of
+      TestCaseDelegatedEvaluation (DelegatedEvaluationTestCase input output) -> [input, output]
+      _ -> []
+
+-- | Build a mapping from module namespaces to test groups by matching on derived keys.
+buildTestGroupMap :: [Namespace] -> TestGroup -> M.Map Namespace TestGroup
+buildTestGroupMap subModuleNamespaces rootTestGroup =
+  let subGroups = testGroupSubgroups rootTestGroup
+      groupByName = M.fromList [(testGroupName g, g) | g <- subGroups]
+      pairs = [(ns, group) |
+               ns <- subModuleNamespaces,
+               let expectedName = deriveTestGroupName ns,
+               Just group <- [M.lookup expectedName groupByName]]
+  in M.fromList pairs
+  where
+    deriveTestGroupName (Namespace ns) =
+      let parts = Strings.splitOn "." ns
+          withoutPrefix = drop 2 parts
+      in case withoutPrefix of
+        ("lib":rest) -> "hydra.lib." ++ L.intercalate "." rest ++ " primitives"
+        ["json", "coder"] -> "JSON coder"
+        ["json", "parser"] -> "JSON parsing"
+        ["json", "writer"] -> "JSON serialization"
+        [name] -> decamelize name
+        parts' | not (null parts') && last parts' == "all" -> L.intercalate "." (init parts')
+        _ -> L.intercalate "." withoutPrefix
+
+    decamelize s = map toLower $ L.intercalate " " $ splitCamelCase s
+
+    splitCamelCase [] = []
+    splitCamelCase (c:cs) =
+      let (word, rest) = span (not . isUpper) cs
+      in (c:word) : splitCamelCase rest
+
+-- | Create a lookup function from a test group hierarchy
+createTestGroupLookup :: [Namespace] -> TestGroup -> (Namespace -> Maybe TestGroup)
+createTestGroupLookup subModuleNamespaces rootTestGroup =
+  let testGroupMap = buildTestGroupMap subModuleNamespaces rootTestGroup
+  in \ns -> M.lookup ns testGroupMap
+
+-- | Main entry point: generate generation test suite from test modules
+generateGenerationTestSuite :: TestGenerator a -> FilePath -> [Module] -> (Namespace -> Maybe TestGroup) -> IO Bool
+generateGenerationTestSuite testGen outDir modules lookupTestGroup = do
+  putStrLn "Processing test modules..."
+
+  putStrLn $ "Found " ++ show (length modules) ++ " test module(s)"
+  putStrLn "Transforming test suite to generation tests..."
+
+  let moduleTestPairs = [(mod, transformed) |
+        mod <- modules,
+        Just testGroup <- [lookupTestGroup (moduleNamespace mod)],
+        Just transformed <- [transformToCompiledTests testGroup]]
+
+  if null moduleTestPairs
+    then do
+      putStrLn "No generation tests to generate"
+      return True
+    else do
+      putStrLn $ "Found " ++ show (length moduleTestPairs) ++ " module(s) with generation tests, generating to " ++ outDir
+
+      let graph = modulesToGraph (Sources.mainModules ++ testModules) $ modules ++ extraModules
+
+      putStrLn "Starting type inference..."
+      let cx0 = Context [] [] M.empty
+      case Inference.inferGraphTypes cx0 (graphToBindings graph) graph of
+        Left ic -> do
+          putStrLn $ "✗ Type inference failed: " ++ showError (inContextObject ic)
+          return False
+        Right ((g, _inferredBindings), _cx') -> do
+          putStrLn $ "Type inference complete. Generating " ++ show (length moduleTestPairs) ++ " module(s)..."
+
+          result <- generateAllFiles testGen g outDir moduleTestPairs writeFilePair
+
+          case result of
+            Left err -> do
+              putStrLn $ "✗ Generation failed: " ++ err
+              return False
+            Right count -> do
+              putStrLn $ "✓ Successfully generated " ++ show count ++ " test file(s)"
+              return True
+  where
+    writeFilePair (fullPath, content) = do
+      SD.createDirectoryIfMissing True $ FP.takeDirectory fullPath
+      writeFile fullPath content
+      putStrLn $ "  Generated: " ++ fullPath
+    extraModules = [Formatting.module_, Lexical.module_, CoreTypes.module_]
+
+-- | Generate all test files using the provided test generator and write them
+generateAllFiles :: TestGenerator a -> Graph -> FilePath -> [(Module, TestGroup)] -> ((FilePath, String) -> IO ()) -> IO (Either String Int)
+generateAllFiles testGen g baseDir modulePairs writeFile' = go 1 modulePairs
+  where
+    go _ [] = do
+      case testGeneratorAggregatorFile testGen of
+        Just genAggregator -> do
+          let aggregator = genAggregator baseDir (map fst modulePairs)
+          writeFile' aggregator
+          return $ Right (length modulePairs + 1)
+        Nothing -> return $ Right (length modulePairs)
+    go idx ((sourceModule, testGroup):rest) = do
+      let ns = moduleNamespace sourceModule
+          generationModule = sourceModule {moduleNamespace = addGenerationPrefix ns}
+      trace ("  Generating module " ++ show idx ++ ": " ++ show ns) $ return ()
+      case testGeneratorGenerateTestFile testGen generationModule testGroup g of
+        Left err -> return $ Left err
+        Right (filePath, content) -> do
+          let fullPath = FP.combine baseDir filePath
+          writeFile' (fullPath, content)
+          go (idx + 1) rest
diff --git a/src/main/haskell/Hydra/Kernel.hs b/src/main/haskell/Hydra/Kernel.hs
--- a/src/main/haskell/Hydra/Kernel.hs
+++ b/src/main/haskell/Hydra/Kernel.hs
@@ -7,39 +7,37 @@
 - Hydra.Extract.Core
 - Hydra.Extract.Helpers
 - Hydra.Extract.Util
-- Hydra.Grammar
-- Hydra.Grammars
 - Hydra.Json.Parser
 - Hydra.Json.Writer
 - Hydra.Parsers
+- Hydra.Packaging
 - Hydra.Show.Core
 - Hydra.Topology
 -}
 
 module Hydra.Kernel (
-  module Hydra.Accessors,
-  module Hydra.Adapt.Literals,
-  module Hydra.Adapt.Modules,
-  module Hydra.Adapt.Simple,
-  module Hydra.Adapt.Terms,
-  module Hydra.Adapt.Utils,
+  module Hydra.Paths,
+  module Hydra.Adapt,
   module Hydra.Annotations,
   module Hydra.Arity,
   module Hydra.Checking,
   module Hydra.Classes,
   module Hydra.Coders,
-  module Hydra.Compute,
   module Hydra.Constants,
-  module Hydra.Constraints,
+  module Hydra.Context,
   module Hydra.Core,
+  module Hydra.Error.Checking,
+  module Hydra.Error.Core,
+  module Hydra.Error.Packaging,
+  module Hydra.Errors,
   module Hydra.Languages,
-  module Hydra.Monads,
   module Hydra.Formatting,
   module Hydra.Graph,
   module Hydra.Inference,
   module Hydra.Lexical,
   module Hydra.Literals,
   module Hydra.Module,
+  module Hydra.Module.Compat,
   module Hydra.Parsing,
   module Hydra.Phantoms,
   module Hydra.Names,
@@ -60,32 +58,30 @@
   module Hydra.Unification,
   module Hydra.Util,
   module Hydra.Variants,
-  module Hydra.Workflow,
 ) where
 
-import Hydra.Accessors
-import Hydra.Adapt.Literals
-import Hydra.Adapt.Modules
-import Hydra.Adapt.Simple
-import Hydra.Adapt.Terms hiding (maybeToList)
-import Hydra.Adapt.Utils
+import Hydra.Paths
+import Hydra.Adapt
 import Hydra.Annotations
 import Hydra.Arity
 import Hydra.Checking
 import Hydra.Classes
 import Hydra.Coders
-import Hydra.Compute
 import Hydra.Constants
-import Hydra.Constraints
+import Hydra.Context
 import Hydra.Core
+import Hydra.Error.Checking
+import Hydra.Error.Core
+import Hydra.Error.Packaging
+import Hydra.Errors
 import Hydra.Languages
-import Hydra.Monads hiding (bind, exec, fail, pure)
 import Hydra.Formatting
 import Hydra.Graph
 import Hydra.Inference
 import Hydra.Lexical
 import Hydra.Literals
 import Hydra.Module
+import Hydra.Module.Compat
 import Hydra.Parsing
 import Hydra.Phantoms
 import Hydra.Names
@@ -106,4 +102,3 @@
 import Hydra.Unification
 import Hydra.Util
 import Hydra.Variants
-import Hydra.Workflow
diff --git a/src/main/haskell/Hydra/Lib/Chars.hs b/src/main/haskell/Hydra/Lib/Chars.hs
--- a/src/main/haskell/Hydra/Lib/Chars.hs
+++ b/src/main/haskell/Hydra/Lib/Chars.hs
@@ -6,26 +6,26 @@
 import qualified Data.Char as C
 
 
--- | Check if a character (as int) is alphanumeric.
+-- | Check whether a character is alphanumeric.
 isAlphaNum :: Int -> Bool
 isAlphaNum = C.isAlphaNum . C.chr
 
--- | Check if a character (as int) is lowercase.
+-- | Check whether a character is lowercase.
 isLower :: Int -> Bool
 isLower = C.isLower . C.chr
 
--- | Check if a character (as int) is whitespace.
+-- | Check whether a character is a whitespace character.
 isSpace :: Int -> Bool
 isSpace = C.isSpace . C.chr
 
--- | Check if a character (as int) is uppercase.
+-- | Check whether a character is uppercase.
 isUpper :: Int -> Bool
 isUpper = C.isUpper . C.chr
 
--- | Convert a character (as int) to lowercase, returning the int value.
+-- | Convert a character to lowercase.
 toLower :: Int -> Int
 toLower = C.ord . C.toLower . C.chr
 
--- | Convert a character (as int) to uppercase, returning the int value.
+-- | Convert a character to uppercase.
 toUpper :: Int -> Int
 toUpper = C.ord . C.toUpper . C.chr
diff --git a/src/main/haskell/Hydra/Lib/Eithers.hs b/src/main/haskell/Hydra/Lib/Eithers.hs
--- a/src/main/haskell/Hydra/Lib/Eithers.hs
+++ b/src/main/haskell/Hydra/Lib/Eithers.hs
@@ -5,20 +5,25 @@
 import qualified Control.Monad as CM
 import qualified Data.Bifunctor as BF
 import qualified Data.Either as E
+import qualified Data.Set as S
 
 
--- | Bind (flatMap) for Either: if Right, apply the function; if Left, return unchanged.
-bind :: Either a b -> (b -> Either a c) -> Either a c
-bind = (>>=)
-
 -- | Map over both sides of an Either value.
 bimap :: (a -> c) -> (b -> d) -> Either a b -> Either c d
 bimap = BF.bimap
 
+-- | Bind (flatMap) for Either: if Right, apply the function; if Left, return unchanged.
+bind :: Either a b -> (b -> Either a c) -> Either a c
+bind = (>>=)
+
 -- | Eliminate an Either value by applying one of two functions.
 either :: (a -> c) -> (b -> c) -> Either a b -> c
 either = E.either
 
+-- | Left-fold over a list with an Either-returning function, short-circuiting on Left.
+foldl :: (a -> b -> Either c a) -> a -> [b] -> Either c a
+foldl = CM.foldM
+
 -- | Extract the Left value, or return a default.
 fromLeft :: a -> Either a b -> a
 fromLeft = E.fromLeft
@@ -50,6 +55,10 @@
 -- | Map a function returning Either over a Maybe, or return Right Nothing if Nothing.
 mapMaybe :: (a -> Either c b) -> Maybe a -> Either c (Maybe b)
 mapMaybe = CM.mapM
+
+-- | Map a function returning Either over a Set, collecting results or short-circuiting on Left.
+mapSet :: Ord b => (a -> Either c b) -> S.Set a -> Either c (S.Set b)
+mapSet f s = fmap S.fromList (CM.mapM f (S.toList s))
 
 -- | Partition a list of Eithers into lefts and rights.
 partitionEithers :: [Either a b] -> ([a], [b])
diff --git a/src/main/haskell/Hydra/Lib/Equality.hs b/src/main/haskell/Hydra/Lib/Equality.hs
--- a/src/main/haskell/Hydra/Lib/Equality.hs
+++ b/src/main/haskell/Hydra/Lib/Equality.hs
@@ -1,4 +1,4 @@
--- | Haskell implementations of hydra.lib.equality primitives. These simply make use of derived Eq.
+-- | Haskell implementations of hydra.lib.equality primitives.
 
 module Hydra.Lib.Equality where
 
@@ -26,7 +26,7 @@
 gte :: Ord a => a -> a -> Bool
 gte = (>=)
 
--- | Return the identity of a value.
+-- | Return a value unchanged.
 identity :: a -> a
 identity = id
 
diff --git a/src/main/haskell/Hydra/Lib/Flows.hs b/src/main/haskell/Hydra/Lib/Flows.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Lib/Flows.hs
+++ /dev/null
@@ -1,82 +0,0 @@
--- | Haskell implementations of hydra.lib.flows primitives. These are simply wrappers around hydra.flows functions.
-
-module Hydra.Lib.Flows where
-
-import Hydra.Compute
-import qualified Hydra.Monads as Monads
-
-import qualified Control.Monad as CM
-import qualified Data.Map as M
-import qualified Data.Set as S
-
-
--- Haskell-specific helpers
-
-instance Functor (Flow s) where
-  fmap = CM.liftM
-instance Applicative (Flow s) where
-  pure = Monads.pure
-  (<*>) = CM.ap
-instance Monad (Flow s) where
-  (>>=) = Monads.bind
-instance MonadFail (Flow s) where
-  fail = Monads.fail
-
--- Primitive functions
-
--- | Apply a function in a Flow to a value in a Flow (applicative).
-apply :: Flow s (x -> y) -> Flow s x -> Flow s y
-apply = (<*>)
-
--- | Monadic bind for Flow.
-bind :: Flow s x -> (x -> Flow s y) -> Flow s y
-bind = Monads.bind
-
--- | Create a failed Flow with an error message.
-fail :: String -> Flow s x
-fail = Monads.fail
-
--- | Fold over a list with a monadic function.
-foldl :: (a -> b -> Flow s a) -> a -> [b] -> Flow s a
-foldl = CM.foldM
-
--- | Map a function over a Flow (functor).
-map :: (x -> y) -> Flow s x -> Flow s y
-map = Monads.map
-
--- | Map a monadic function over the values of a map.
-mapElems :: Ord k => (v1 -> Flow s v2) -> M.Map k v1 -> Flow s (M.Map k v2)
-mapElems f m = M.fromList <$> (CM.mapM (\(k, v) -> (,) <$> Monads.pure k <*> f v) $ M.toList m)
-
--- | Map a monadic function over the keys of a map.
-mapKeys :: Ord k2 => (k1 -> Flow s k2) -> M.Map k1 v -> Flow s (M.Map k2 v)
-mapKeys f m = M.fromList <$> (CM.mapM (\(k, v) -> (,) <$> f k <*> Monads.pure v) $ M.toList m)
-
--- | Map a monadic function over a list.
-mapList :: (x -> Flow s y) -> [x] -> Flow s [y]
-mapList = CM.mapM
-
--- | Map a monadic function over an optional value.
-mapMaybe :: (x -> Flow s y) -> Maybe x -> Flow s (Maybe y)
-mapMaybe = traverse
-
--- | Map a monadic function over a set.
-mapSet :: Ord y => (x -> Flow s y) -> S.Set x -> Flow s (S.Set y)
-mapSet f xs = S.fromList <$> (CM.mapM f $ S.toList xs)
-
--- | Lift a value into a Flow.
-pure :: x -> Flow s x
-pure = Monads.pure
-
--- | Sequence a list of Flows into a Flow of a list.
-sequence :: [Flow s x] -> Flow s [x]
-sequence = CM.sequence
-
--- | Try a Flow and use a default value if it fails.
---   This is similar to "catch" - the fallback is used only if the flow fails.
-withDefault :: x -> Flow s x -> Flow s x
-withDefault fallback flow = Flow $ \s t ->
-  let FlowState mResult s' t' = unFlow flow s t
-  in case mResult of
-    Just result -> FlowState (Just result) s' t'
-    Nothing -> FlowState (Just fallback) s t  -- Use original state and trace on failure
diff --git a/src/main/haskell/Hydra/Lib/Lists.hs b/src/main/haskell/Hydra/Lib/Lists.hs
--- a/src/main/haskell/Hydra/Lib/Lists.hs
+++ b/src/main/haskell/Hydra/Lib/Lists.hs
@@ -2,7 +2,7 @@
 
 module Hydra.Lib.Lists where
 
-import Hydra.Compute
+import Hydra.Util
 import Hydra.Core
 import Hydra.Graph
 import qualified Hydra.Dsl.Terms as Terms
@@ -14,7 +14,7 @@
 apply :: [a -> b] -> [a] -> [b]
 apply = (<*>)
 
--- | Get the element at specified index of a list.
+-- | Get the element at a specified index in a list.
 -- TODO: partial function. See https://github.com/CategoricalData/hydra/issues/201
 at :: Int -> [a] -> a
 at i l = l !! i
@@ -59,6 +59,10 @@
 foldl :: (b -> a -> b) -> b -> [a] -> b
 foldl = L.foldl
 
+-- | Fold a list from the right.
+foldr :: (a -> b -> b) -> b -> [a] -> b
+foldr = L.foldr
+
 -- | Group consecutive equal elements.
 group :: Eq a => [a] -> [[a]]
 group = L.group
@@ -102,14 +106,13 @@
 null :: [a] -> Bool
 null = L.null
 
+-- | Partition a list into elements that satisfy a predicate and elements that do not.
+partition :: (a -> Bool) -> [a] -> ([a], [a])
+partition = L.partition
+
 -- | Create a list with a single element.
 pure :: a -> [a]
 pure e = [e]
-
--- | Partition a list based on a predicate.
--- Returns (elements satisfying predicate, elements not satisfying predicate).
-partition :: (a -> Bool) -> [a] -> ([a], [a])
-partition = L.partition
 
 -- | Create a list with n copies of a value.
 replicate :: Int -> a -> [a]
diff --git a/src/main/haskell/Hydra/Lib/Literals.hs b/src/main/haskell/Hydra/Lib/Literals.hs
--- a/src/main/haskell/Hydra/Lib/Literals.hs
+++ b/src/main/haskell/Hydra/Lib/Literals.hs
@@ -210,6 +210,10 @@
 showInt64 :: Int64 -> String
 showInt64 = show
 
+-- | Convert a string to a quoted string representation.
+showString :: String -> String
+showString = show
+
 -- | Convert a uint8 to string.
 showUint8 :: Int16 -> String
 showUint8 = show
@@ -225,10 +229,6 @@
 -- | Convert a uint64 to string.
 showUint64 :: Integer -> String
 showUint64 = show
-
--- | Convert a string to a quoted string representation.
-showString :: String -> String
-showString = show
 
 -- | Convert string to binary by base64 decoding.
 -- Returns an empty ByteString if decoding fails.
diff --git a/src/main/haskell/Hydra/Lib/Maps.hs b/src/main/haskell/Hydra/Lib/Maps.hs
--- a/src/main/haskell/Hydra/Lib/Maps.hs
+++ b/src/main/haskell/Hydra/Lib/Maps.hs
@@ -5,8 +5,7 @@
 import qualified Data.Map as M
 
 
--- | Alter a value at a key using a function. The function receives Nothing if the key is absent,
--- or Just the current value if present. Return Nothing to delete, Just to insert/update.
+-- | Alter a value at a key using a function.
 alter :: Ord k => (Maybe v -> Maybe v) -> k -> M.Map k v -> M.Map k v
 alter = M.alter
 
diff --git a/src/main/haskell/Hydra/Lib/Math.hs b/src/main/haskell/Hydra/Lib/Math.hs
--- a/src/main/haskell/Hydra/Lib/Math.hs
+++ b/src/main/haskell/Hydra/Lib/Math.hs
@@ -18,6 +18,10 @@
 acosh :: Double -> Double
 acosh = Prelude.acosh
 
+-- | Add two numbers.
+add :: Num a => a -> a -> a
+add x y = x + y
+
 -- | Return the arc sine of x in radians.
 asin :: Double -> Double
 asin = Prelude.asin
@@ -50,10 +54,6 @@
 cosh :: Double -> Double
 cosh = Prelude.cosh
 
--- | Add two numbers.
-add :: Num a => a -> a -> a
-add x y = x + y
-
 -- | Divide two integers using integer division.
 -- TODO: partial function. See https://github.com/CategoricalData/hydra/issues/201
 div :: Integral a => a -> a -> a
@@ -132,6 +132,26 @@
 -- | Return x rounded to the nearest integer.
 round :: Double -> Integer
 round = Prelude.round
+
+-- | Round a bigfloat to n significant digits.
+roundBigfloat :: Int -> Double -> Double
+roundBigfloat = roundFloat64
+
+-- | Round a float32 to n significant digits.
+roundFloat32 :: Int -> Float -> Float
+roundFloat32 n x
+  | x Prelude.== 0 = 0
+  | Prelude.otherwise =
+      let factor = 10 Prelude.^^ (n - 1 - Prelude.floor (Prelude.logBase 10 (Prelude.abs x)))
+      in Prelude.fromIntegral (Prelude.round (x * factor) :: Integer) Prelude./ factor
+
+-- | Round a float64 to n significant digits.
+roundFloat64 :: Int -> Double -> Double
+roundFloat64 n x
+  | x Prelude.== 0 = 0
+  | Prelude.otherwise =
+      let factor = 10 Prelude.^^ (n - 1 - Prelude.floor (Prelude.logBase 10 (Prelude.abs x)))
+      in Prelude.fromIntegral (Prelude.round (x * factor) :: Integer) Prelude./ factor
 
 -- | Return the sign of a number (-1, 0, or 1).
 signum :: Num a => a -> a
diff --git a/src/main/haskell/Hydra/Lib/Maybes.hs b/src/main/haskell/Hydra/Lib/Maybes.hs
--- a/src/main/haskell/Hydra/Lib/Maybes.hs
+++ b/src/main/haskell/Hydra/Lib/Maybes.hs
@@ -13,8 +13,7 @@
 bind :: Y.Maybe a -> (a -> Y.Maybe b) -> Y.Maybe b
 bind = (>>=)
 
--- | Handle an optional value with different parameter order than maybe.
--- Arguments are: the Maybe value, the default for Nothing, and the function to apply for Just.
+-- | Handle an optional value with the maybe value as the first argument.
 cases :: Y.Maybe a -> b -> (a -> b) -> b
 cases m n j = Y.maybe n j m
 
@@ -26,8 +25,7 @@
 compose :: (a -> Y.Maybe b) -> (b -> Y.Maybe c) -> (a -> Y.Maybe c)
 compose f g = \x -> f x >>= g
 
--- | Extract value from Maybe, assuming it's Just (unsafe).
--- TODO: partial function. See https://github.com/CategoricalData/hydra/issues/201
+-- | Extract value from a Just, or error on Nothing (partial function).
 fromJust :: Y.Maybe a -> a
 fromJust = Y.fromJust
 
@@ -51,10 +49,14 @@
 mapMaybe :: (a -> Y.Maybe b) -> [a] -> [b]
 mapMaybe = Y.mapMaybe
 
--- | Handle an optional value, with transformation.
+-- | Eliminate an optional value with a default and a function.
 maybe :: b -> (a -> b) -> Y.Maybe a -> b
 maybe = Y.maybe
 
 -- | Lift a value into the Maybe type.
 pure :: a -> Y.Maybe a
 pure = Just
+
+-- | Convert a Maybe to a list: Just x becomes [x], Nothing becomes [].
+toList :: Y.Maybe a -> [a]
+toList = Y.maybeToList
diff --git a/src/main/haskell/Hydra/Lib/Regex.hs b/src/main/haskell/Hydra/Lib/Regex.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Lib/Regex.hs
@@ -0,0 +1,48 @@
+-- | Haskell implementations of hydra.lib.regex primitives
+
+module Hydra.Lib.Regex where
+
+import qualified Text.Regex.TDFA as R
+
+
+-- | Find the first substring matching a regex pattern.
+find :: String -> String -> Maybe String
+find pattern input = case (input R.=~ pattern :: (String, String, String)) of
+  (_, match, _)
+    | null match -> Nothing
+    | otherwise  -> Just match
+
+-- | Find all non-overlapping substrings matching a regex pattern.
+findAll :: String -> String -> [String]
+findAll pattern input = R.getAllTextMatches (input R.=~ pattern :: R.AllTextMatches [] String)
+
+-- | Check whether an entire string matches a regex pattern.
+matches :: String -> String -> Bool
+matches pattern input = input R.=~ ("^(" ++ pattern ++ ")$" :: String) :: Bool
+
+-- | Replace the first occurrence of a regex pattern with a replacement string.
+replace :: String -> String -> String -> String
+replace pattern replacement input = case (input R.=~ pattern :: (String, String, String)) of
+  (before, match, after)
+    | null match -> input
+    | otherwise  -> before ++ replacement ++ after
+
+-- | Replace all non-overlapping occurrences of a regex pattern with a replacement string.
+replaceAll :: String -> String -> String -> String
+replaceAll pattern replacement input = go input
+  where
+    go "" = ""
+    go s = case (s R.=~ pattern :: (String, String, String)) of
+      (before, match, after)
+        | null match -> s
+        | otherwise  -> before ++ replacement ++ go after
+
+-- | Split a string by a regex pattern.
+split :: String -> String -> [String]
+split pattern input = go input
+  where
+    go "" = [""]
+    go s = case (s R.=~ pattern :: (String, String, String)) of
+      (before, match, after)
+        | null match -> [s]
+        | otherwise  -> before : go after
diff --git a/src/main/haskell/Hydra/Lib/Strings.hs b/src/main/haskell/Hydra/Lib/Strings.hs
--- a/src/main/haskell/Hydra/Lib/Strings.hs
+++ b/src/main/haskell/Hydra/Lib/Strings.hs
@@ -7,7 +7,7 @@
 import qualified Data.List.Split as LS
 
 
--- | Concatenate a list of strings.
+-- | Concatenate a list of strings into a single string.
 cat :: [String] -> String
 cat = L.concat
 
@@ -15,7 +15,7 @@
 cat2 :: String -> String -> String
 cat2 s1 s2 = s1 ++ s2
 
--- | Get the character code at a specific index in a string.
+-- | Get the Unicode code point of the character at a specific index in a string.
 -- TODO: partial function. See https://github.com/CategoricalData/hydra/issues/201
 charAt :: Int -> String -> Int
 charAt i s = C.ord (s !! i)
@@ -24,7 +24,7 @@
 fromList :: [Int] -> String
 fromList = fmap C.chr
 
--- | Intercalate a string between a list of strings.
+-- | Join a list of strings with a separator between each element.
 intercalate :: String -> [String] -> String
 intercalate = L.intercalate
 
@@ -36,11 +36,11 @@
 lines :: String -> [String]
 lines = L.lines
 
--- | Check if a string is null/empty.
+-- | Check whether a string is empty.
 null :: String -> Bool
 null = L.null
 
--- | Split a string on a delimiter.
+-- | Split a string on a delimiter string.
 splitOn :: String -> String -> [String]
 splitOn = LS.splitOn
 
@@ -56,6 +56,6 @@
 toUpper :: String -> String
 toUpper = fmap C.toUpper
 
--- | Join strings with newlines, adding trailing newline.
+-- | Join a list of strings with newlines, appending a trailing newline.
 unlines :: [String] -> String
 unlines = L.unlines
diff --git a/src/main/haskell/Hydra/Module/Compat.hs b/src/main/haskell/Hydra/Module/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Module/Compat.hs
@@ -0,0 +1,46 @@
+-- | Compatibility functions for converting between Definition and Binding.
+-- These bridge the gap during the transition from Module.elements :: [Binding]
+-- to Module.definitions :: [Definition].
+
+module Hydra.Module.Compat (
+  bindingToDefinition,
+  definitionToBinding,
+  moduleBindings,
+) where
+
+import Hydra.Core
+import Hydra.Module
+import qualified Hydra.Encode.Core as EncodeCore
+
+import qualified Data.List as L
+import qualified Data.Map as M
+
+
+-- | Convert a Binding to a Definition (always produces DefinitionTerm).
+bindingToDefinition :: Binding -> Definition
+bindingToDefinition b = DefinitionTerm $ TermDefinition {
+  termDefinitionName = bindingName b,
+  termDefinitionTerm = bindingTerm b,
+  termDefinitionType = bindingType b}
+
+-- | Convert a Definition back to a Binding.
+definitionToBinding :: Definition -> Binding
+definitionToBinding d = case d of
+  DefinitionTerm td -> Binding {
+    bindingName = termDefinitionName td,
+    bindingTerm = termDefinitionTerm td,
+    bindingType = termDefinitionType td}
+  DefinitionType td ->
+    let encoded = EncodeCore.type_ (typeDefinitionType td)
+        annotated = TermAnnotated (AnnotatedTerm {
+          annotatedTermBody = encoded,
+          annotatedTermAnnotation = M.fromList [
+            (Name "type", TermVariable (Name "hydra.core.Type"))]})
+    in Binding {
+      bindingName = typeDefinitionName td,
+      bindingTerm = annotated,
+      bindingType = Just (TypeScheme [] (TypeVariable (Name "hydra.core.Type")) Nothing)}
+
+-- | Extract all definitions from a module as Bindings.
+moduleBindings :: Module -> [Binding]
+moduleBindings m = L.map definitionToBinding (moduleDefinitions m)
diff --git a/src/main/haskell/Hydra/Sources/All.hs b/src/main/haskell/Hydra/Sources/All.hs
--- a/src/main/haskell/Hydra/Sources/All.hs
+++ b/src/main/haskell/Hydra/Sources/All.hs
@@ -13,52 +13,65 @@
 import Hydra.Sources.Test.All
 
 import qualified Hydra.Sources.CoderUtils as CoderUtils
-import qualified Hydra.Sources.Haskell.Ast as HaskellAst
+import qualified Hydra.Sources.Haskell.Syntax as HaskellSyntax
 import qualified Hydra.Sources.Haskell.Coder as HaskellCoder
 import qualified Hydra.Sources.Haskell.Language as HaskellLanguage
 import qualified Hydra.Sources.Haskell.Operators as HaskellOperators
 import qualified Hydra.Sources.Haskell.Serde as HaskellSerde
+import qualified Hydra.Sources.Haskell.Testing as HaskellTesting
 import qualified Hydra.Sources.Haskell.Utils as HaskellUtils
 import qualified Hydra.Sources.Json.Bootstrap as JsonBootstrap
-import qualified Hydra.Sources.Json.Coder as JsonCoder
 import qualified Hydra.Sources.Json.Decode as JsonDecode
 import qualified Hydra.Sources.Json.Decoding as JsonDecoding
 import qualified Hydra.Sources.Json.Encode as JsonEncode
 import qualified Hydra.Sources.Json.Extract as JsonExtract
-import qualified Hydra.Sources.Json.Language as JsonLanguage
 import qualified Hydra.Sources.Json.Parser as JsonParser
 import qualified Hydra.Sources.Json.Writer as JsonWriter
+import qualified Hydra.Sources.Json.Yaml.Decode as JsonYamlDecode
+import qualified Hydra.Sources.Json.Yaml.Encode as JsonYamlEncode
+import qualified Hydra.Sources.Test.Transform as TestTransform
+import qualified Hydra.Sources.Test.Utils as TestUtils
+import qualified Hydra.Sources.Kernel.Terms.Dsls as Dsls
 import qualified Hydra.Sources.Yaml.Model as YamlModel
 
 
 mainModules :: [Module]
 mainModules = kernelModules ++ haskellModules ++ jsonModules ++ otherModules
 
+-- | The DSL source module (hydra.dsls) must be generated separately from mainModules
+-- because including it in the main generation causes a stack overflow due to the
+-- complexity of its term definitions (which reference decoders, the full type graph, etc.)
+dslSourceModules :: [Module]
+dslSourceModules = [Dsls.module_]
+
 kernelModules :: [Module]
 kernelModules = kernelTypesModules ++ kernelTermsModules ++ jsonModules
 
 haskellModules :: [Module]
 haskellModules = [
-  HaskellAst.module_,
+  HaskellSyntax.module_,
   HaskellCoder.module_,
   HaskellLanguage.module_,
   HaskellOperators.module_,
   HaskellSerde.module_,
+  HaskellTesting.module_,
   HaskellUtils.module_]
 
 jsonModules :: [Module]
 jsonModules = [
   JsonBootstrap.module_,
-  JsonCoder.module_,
   JsonDecode.module_,
   JsonDecoding.module_,
   JsonEncode.module_,
   JsonExtract.module_,
-  JsonLanguage.module_,
   JsonParser.module_,
   JsonWriter.module_]
 
 otherModules :: [Module]
 otherModules = [
   CoderUtils.module_,
-  YamlModel.module_]
+  TestTransform.module_,
+  TestUtils.module_,
+  YamlModel.module_,
+  JsonYamlDecode.module_,
+  JsonYamlEncode.module_]
diff --git a/src/main/haskell/Hydra/Sources/CoderUtils.hs b/src/main/haskell/Hydra/Sources/CoderUtils.hs
--- a/src/main/haskell/Hydra/Sources/CoderUtils.hs
+++ b/src/main/haskell/Hydra/Sources/CoderUtils.hs
@@ -7,7 +7,7 @@
 
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (
-  commentsFromElement,
+  commentsFromBinding,
   commentsFromFieldType,
   gatherApplications,
   gatherArgs,
@@ -17,22 +17,21 @@
   isComplexVariable,
   isSimpleAssignment,
   isTrivialTerm,
+  nameToFilePath,
   normalizeComment)
 import Hydra.Sources.Libraries
 import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
+import qualified Hydra.Dsl.Ast           as Ast
 import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
 import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
+import qualified Hydra.Dsl.Errors        as Error
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
+import qualified Hydra.Dsl.Json.Model          as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
@@ -47,17 +46,17 @@
 import qualified Hydra.Dsl.Meta.Base     as MetaBase
 import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
 import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
+import qualified Hydra.Dsl.Module        as Module
 import           Hydra.Dsl.Meta.Phantoms as Phantoms
 import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
 import qualified Hydra.Dsl.Meta.Testing       as Testing
 import qualified Hydra.Dsl.Terms         as Terms
 import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
+import qualified Hydra.Dsl.Topology      as Topology
 import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
 import qualified Hydra.Dsl.Meta.Variants      as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -72,9 +71,10 @@
 import qualified Hydra.Sources.Kernel.Terms.Checking as Checking
 import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
 import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
+import qualified Hydra.Sources.Kernel.Terms.Names as Names
 import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas as Schemas
+import qualified Hydra.Sources.Kernel.Terms.Sorting as Sorting
 
 
 ns :: Namespace
@@ -85,71 +85,193 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Annotations.ns, Arity.ns, Checking.ns, Lexical.ns, Monads.ns, Rewriting.ns, Schemas.ns]
+    [Annotations.ns, Arity.ns, Checking.ns, Formatting.ns, Lexical.ns, Names.ns, Rewriting.ns, Schemas.ns, Sorting.ns]
     kernelTypesNamespaces $
     Just "Common utilities for language coders, providing shared patterns for term decomposition and analysis."
   where
    elements = [
-     -- Simple pure functions first
-     toBinding normalizeComment,
-     toBinding gatherApplications,
-     toBinding gatherArgs,
-     toBinding gatherArgsWithTypeApps,
-     -- Predicates
-     toBinding isSimpleAssignment,
-     toBinding isComplexTerm,
-     toBinding isComplexVariable,
-     toBinding isComplexBinding,
-     toBinding isTrivialTerm,
-     -- Tail-call optimization detection
-     toBinding isSelfTailRecursive,
-     toBinding isTailRecursiveInTailPosition,
-     -- Flow-based utilities
-     toBinding commentsFromElement,
-     toBinding commentsFromFieldType,
-     -- Function analysis helpers
-     toBinding tryTypeOf,
-     toBinding bindingMetadata,
-     toBinding analyzeFunctionTermWith_finish,
-     toBinding analyzeFunctionTermWith_gather,
-     toBinding analyzeFunctionTermWith,
-     toBinding analyzeFunctionTermNoInferWith_finish,
-     toBinding analyzeFunctionTermNoInferWith_gather,
-     toBinding analyzeFunctionTermNoInferWith,
-     toBinding analyzeFunctionTerm,
-     toBinding analyzeFunctionTermInline,
-     toBinding analyzeFunctionTermNoInfer,
-     -- State management helpers for coders
-     toBinding updateCoderMetadata,
-     toBinding withUpdatedCoderGraph,
-     toBinding withGraphBindings,
-     toBinding inCoderGraphContext]
+     toTermDefinition analyzeFunctionTerm,
+     toTermDefinition analyzeFunctionTermWith,
+     toTermDefinition analyzeFunctionTermWith_finish,
+     toTermDefinition analyzeFunctionTermWith_gather,
+     toTermDefinition bindingMetadata,
+     toTermDefinition commentsFromBinding,
+     toTermDefinition commentsFromFieldType,
+     toTermDefinition gatherApplications,
+     toTermDefinition gatherArgs,
+     toTermDefinition gatherArgsWithTypeApps,
+     toTermDefinition isComplexBinding,
+     toTermDefinition isComplexTerm,
+     toTermDefinition isComplexVariable,
+     toTermDefinition isSelfTailRecursive,
+     toTermDefinition isSimpleAssignment,
+     toTermDefinition isTailRecursiveInTailPosition,
+     toTermDefinition isTrivialTerm,
+     toTermDefinition nameToFilePath,
+     toTermDefinition normalizeComment,
+     toTermDefinition reorderDefs,
+     toTermDefinition typeOfTerm]
 
+-- | Analyze a function term by recursively peeling off lambdas, type lambdas, lets, and type applications.
+-- This is a common pattern across all language coders: we need to understand the structure of a function
+-- to properly encode it in the target language.
+analyzeFunctionTerm :: TBinding (
+  Context ->
+  (env -> Graph) ->
+  (Graph -> env -> env) ->
+  env ->
+  Term ->
+  Either (InContext Error) (FunctionStructure env))
+analyzeFunctionTerm = define "analyzeFunctionTerm" $
+  doc "Analyze a function term, collecting lambdas, type lambdas, lets, and type applications" $
+  "cx" ~> "getTC" ~> "setTC" ~> "env" ~> "term" ~>
+  analyzeFunctionTermWith @@ var "cx" @@ bindingMetadata @@ var "getTC" @@ var "setTC" @@ var "env" @@ var "term"
 
---------------------------------------------------------------------------------
--- Simple pure functions
---------------------------------------------------------------------------------
+analyzeFunctionTermWith :: TBinding (
+  Context ->
+  (Graph -> Binding -> Maybe Term) ->
+  (env -> Graph) ->
+  (Graph -> env -> env) ->
+  env ->
+  Term ->
+  Either (InContext Error) (FunctionStructure env))
+analyzeFunctionTermWith = define "analyzeFunctionTermWith" $
+  doc "Analyze a function term with configurable binding metadata" $
+  "cx" ~> "forBinding" ~> "getTC" ~> "setTC" ~> "env" ~> "term" ~>
+  analyzeFunctionTermWith_gather @@ var "cx" @@ var "forBinding" @@ var "getTC" @@ var "setTC"
+    @@ boolean True @@ var "env"
+    @@ list ([] :: [TTerm Name])
+    @@ list ([] :: [TTerm Name])
+    @@ list ([] :: [TTerm Binding])
+    @@ list ([] :: [TTerm Type])
+    @@ list ([] :: [TTerm Type])
+    @@ var "term"
 
--- | Normalize a comment string for consistent output across coders.
--- Strips leading/trailing whitespace and ensures the comment ends with a period.
--- Returns empty string for whitespace-only input.
-normalizeComment :: TBinding (String -> String)
-normalizeComment = define "normalizeComment" $
-  doc "Normalize a comment string for consistent output across coders" $
-  "s" ~>
-  "stripped" <~ Formatting.stripLeadingAndTrailingWhitespace @@ var "s" $
+-- | Internal helper: analyze a function term with a configurable binding metadata function.
+-- This is the core implementation used by all analyzeFunctionTerm variants.
+--
+-- The function peels off lambdas, type lambdas, lets, and type applications,
+-- collecting their components into a FunctionStructure. It uses a recursive
+-- gather/finish pattern with an argMode flag to track whether we're still
+-- collecting lambda parameters (vs. having seen a let which stops parameter collection).
+-- | Finish helper for analyzeFunctionTermWith: reapply type applications and infer return type
+analyzeFunctionTermWith_finish :: TBinding (
+  Context ->
+  (env -> Graph) ->
+  env -> [Name] -> [Name] -> [Binding] -> [Type] -> [Type] -> Term ->
+  Either (InContext Error) (FunctionStructure env))
+analyzeFunctionTermWith_finish = define "analyzeFunctionTermWith_finish" $
+  "cx" ~> "getTC" ~> "fEnv" ~> "tparams" ~> "args" ~> "bindings" ~> "doms" ~> "tapps" ~> "body" ~>
+  "bodyWithTapps" <~ Lists.foldl
+    ("trm" ~> "typ" ~> Core.termTypeApplication (Core.typeApplicationTerm (var "trm") (var "typ")))
+    (var "body")
+    (var "tapps") $
+  -- Use typeOfTerm but fall back to Nothing if type inference fails (e.g. for untyped hoisted bindings)
+  "mcod" <~ Eithers.either_ (constant nothing) ("c" ~> just (var "c"))
+    (typeOfTerm @@ var "cx" @@ (var "getTC" @@ var "fEnv") @@ var "bodyWithTapps") $
+  right $ record _FunctionStructure [
+    _FunctionStructure_typeParams>>: Lists.reverse (var "tparams"),
+    _FunctionStructure_params>>: Lists.reverse (var "args"),
+    _FunctionStructure_bindings>>: var "bindings",
+    _FunctionStructure_body>>: var "bodyWithTapps",
+    _FunctionStructure_domains>>: Lists.reverse (var "doms"),
+    _FunctionStructure_codomain>>: var "mcod",
+    _FunctionStructure_environment>>: var "fEnv"]
+
+-- | Gather helper for analyzeFunctionTermWith: recursively collect function components
+analyzeFunctionTermWith_gather :: TBinding (
+  Context ->
+  (Graph -> Binding -> Maybe Term) ->
+  (env -> Graph) ->
+  (Graph -> env -> env) ->
+  Bool -> env -> [Name] -> [Name] -> [Binding] -> [Type] -> [Type] -> Term ->
+  Either (InContext Error) (FunctionStructure env))
+analyzeFunctionTermWith_gather = define "analyzeFunctionTermWith_gather" $
+  "cx" ~> "forBinding" ~> "getTC" ~> "setTC" ~>
+  "argMode" ~> "gEnv" ~> "tparams" ~> "args" ~> "bindings" ~> "doms" ~> "tapps" ~> "t" ~>
+  cases _Term (Rewriting.deannotateTerm @@ var "t")
+    (Just $ analyzeFunctionTermWith_finish @@ var "cx" @@ var "getTC" @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t") [
+    _Term_function>>: "f" ~>
+      cases _Function (var "f")
+        (Just $ analyzeFunctionTermWith_finish @@ var "cx" @@ var "getTC" @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t") [
+        _Function_lambda>>: "lam" ~>
+          Logic.ifElse (var "argMode")
+            ("v" <~ Core.lambdaParameter (var "lam") $
+             "dom" <~ Maybes.maybe (Core.typeVariable (Core.name (string "_"))) identity (Core.lambdaDomain (var "lam")) $
+             "body" <~ Core.lambdaBody (var "lam") $
+             "newEnv" <~ (var "setTC" @@ (Rewriting.extendGraphForLambda @@ (var "getTC" @@ var "gEnv") @@ var "lam") @@ var "gEnv") $
+             analyzeFunctionTermWith_gather @@ var "cx" @@ var "forBinding" @@ var "getTC" @@ var "setTC"
+               @@ var "argMode" @@ var "newEnv"
+               @@ var "tparams"
+               @@ (Lists.cons (var "v") (var "args"))
+               @@ var "bindings"
+               @@ (Lists.cons (var "dom") (var "doms"))
+               @@ var "tapps"
+               @@ var "body")
+            (analyzeFunctionTermWith_finish @@ var "cx" @@ var "getTC" @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t")],
+    _Term_let>>: "lt" ~>
+      "newBindings" <~ Core.letBindings (var "lt") $
+      "body" <~ Core.letBody (var "lt") $
+      "newEnv" <~ (var "setTC" @@ (Rewriting.extendGraphForLet @@ var "forBinding" @@ (var "getTC" @@ var "gEnv") @@ var "lt") @@ var "gEnv") $
+      analyzeFunctionTermWith_gather @@ var "cx" @@ var "forBinding" @@ var "getTC" @@ var "setTC"
+        @@ boolean False @@ var "newEnv"
+        @@ var "tparams"
+        @@ var "args"
+        @@ (Lists.concat2 (var "bindings") (var "newBindings"))
+        @@ var "doms"
+        @@ var "tapps"
+        @@ var "body",
+    _Term_typeApplication>>: "ta" ~>
+      "taBody" <~ Core.typeApplicationTermBody (var "ta") $
+      "typ" <~ Core.typeApplicationTermType (var "ta") $
+      analyzeFunctionTermWith_gather @@ var "cx" @@ var "forBinding" @@ var "getTC" @@ var "setTC"
+        @@ var "argMode" @@ var "gEnv"
+        @@ var "tparams"
+        @@ var "args"
+        @@ var "bindings"
+        @@ var "doms"
+        @@ (Lists.cons (var "typ") (var "tapps"))
+        @@ var "taBody",
+    _Term_typeLambda>>: "tl" ~>
+      "tvar" <~ Core.typeLambdaParameter (var "tl") $
+      "tlBody" <~ Core.typeLambdaBody (var "tl") $
+      "newEnv" <~ (var "setTC" @@ (Rewriting.extendGraphForTypeLambda @@ (var "getTC" @@ var "gEnv") @@ var "tl") @@ var "gEnv") $
+      analyzeFunctionTermWith_gather @@ var "cx" @@ var "forBinding" @@ var "getTC" @@ var "setTC"
+        @@ var "argMode" @@ var "newEnv"
+        @@ (Lists.cons (var "tvar") (var "tparams"))
+        @@ var "args"
+        @@ var "bindings"
+        @@ var "doms"
+        @@ var "tapps"
+        @@ var "tlBody"]
+
+
+-- | Produces a simple 'true' value if the binding is complex (needs to be treated as a function)
+bindingMetadata :: TBinding (Graph -> Binding -> Maybe Term)
+bindingMetadata = define "bindingMetadata" $
+  doc "Produces metadata for a binding if it is complex" $
+  "tc" ~> "b" ~>
   Logic.ifElse
-    (Strings.null (var "stripped"))
-    (string "")
-    -- Get the last character by using charAt with (length - 1)
-    -- Code point 46 is '.'
-    ("lastIdx" <~ Math.sub (Strings.length (var "stripped")) (int32 1) $
-     "lastChar" <~ Strings.charAt (var "lastIdx") (var "stripped") $
-     Logic.ifElse
-       (Equality.equal (var "lastChar") (int32 46))
-       (var "stripped")
-       (Strings.cat2 (var "stripped") (string ".")))
+    (isComplexBinding @@ var "tc" @@ var "b")
+    (just MetaTerms.true)
+    nothing
 
+-- | Extract comments/description from a Binding.
+-- This is a common pattern for coders that need to preserve documentation.
+commentsFromBinding :: TBinding (Context -> Graph -> Binding -> Either (InContext Error) (Maybe String))
+commentsFromBinding = define "commentsFromBinding" $
+  doc "Extract comments/description from a Binding" $
+  "cx" ~> "g" ~> "b" ~>
+  Annotations.getTermDescription @@ var "cx" @@ var "g" @@ (Core.bindingTerm $ var "b")
+
+-- | Extract comments/description from a FieldType.
+-- This is a common pattern for coders that need to preserve field documentation.
+commentsFromFieldType :: TBinding (Context -> Graph -> FieldType -> Either (InContext Error) (Maybe String))
+commentsFromFieldType = define "commentsFromFieldType" $
+  doc "Extract comments/description from a FieldType" $
+  "cx" ~> "g" ~> "ft" ~>
+  Annotations.getTypeDescription @@ var "cx" @@ var "g" @@ (Core.fieldTypeType $ var "ft")
+
 -- | Recursively gather applications from a term, returning the list of arguments
 -- and the base term. Applications are traversed left-to-right, with arguments
 -- collected in the order they appear (leftmost first).
@@ -210,47 +332,29 @@
       gatherArgsWithTypeApps @@ var "body" @@ var "args" @@ (Lists.cons (var "typ") (var "tyArgs"))]
 
 
---------------------------------------------------------------------------------
--- Predicate functions
---------------------------------------------------------------------------------
-
--- | Determines whether a term can be encoded as a simple assignment (without type annotation).
--- A term is considered a simple assignment if:
--- - It's not a lambda, let, or type lambda
--- - It's not a type application (which introduces polymorphism requiring type signatures)
--- - When peeled of applications, it's not a case statement
-isSimpleAssignment :: TBinding (Term -> Bool)
-isSimpleAssignment = define "isSimpleAssignment" $
-  doc "Check if a term can be encoded as a simple assignment" $
-  "term" ~>
-  cases _Term (var "term")
-    (Just $
-      -- Check if the base term (after gathering args) is a union elimination
-      "baseTerm" <~ Pairs.first (gatherArgs @@ var "term" @@ list ([] :: [TTerm Term])) $
-      cases _Term (var "baseTerm")
-        (Just $ boolean True) [
-        _Term_function>>: "f" ~>
-          cases _Function (var "f")
-            (Just $ boolean True) [
-            _Function_elimination>>: "elim" ~>
-              cases _Elimination (var "elim")
-                (Just $ boolean True) [
-                _Elimination_union>>: constant (boolean False)]]]) [
-    _Term_annotated>>: "at" ~>
-      isSimpleAssignment @@ (Core.annotatedTermBody $ var "at"),
-    _Term_function>>: "f" ~>
-      cases _Function (var "f")
-        (Just $ boolean True) [
-        _Function_lambda>>: constant (boolean False)],
-    _Term_let>>: constant (boolean False),
-    _Term_typeLambda>>: constant (boolean False),
-    _Term_typeApplication>>: "ta" ~>
-      isSimpleAssignment @@ (Core.typeApplicationTermBody $ var "ta")]
+-- | Check if a binding is complex and needs to be treated as a function
+isComplexBinding :: TBinding (Graph -> Binding -> Bool)
+isComplexBinding = define "isComplexBinding" $
+  doc "Check if a binding needs to be treated as a function" $
+  "tc" ~> "b" ~>
+  "term" <~ Core.bindingTerm (var "b") $
+  "mts" <~ Core.bindingType (var "b") $
+  -- Bindings without type schemes are complex (e.g., lifted case expressions)
+  Maybes.cases (var "mts")
+    (isComplexTerm @@ var "tc" @@ var "term") $
+    "ts" ~>
+      -- Check if polymorphic
+      "isPolymorphic" <~ Logic.not (Lists.null (Core.typeSchemeVariables $ var "ts")) $
+      -- Check if non-nullary
+      "isNonNullary" <~ Equality.gt (Arity.typeArity @@ (Core.typeSchemeType $ var "ts")) (int32 0) $
+      -- Check if complex term
+      "isComplex" <~ isComplexTerm @@ var "tc" @@ var "term" $
+      Logic.or (Logic.or (var "isPolymorphic") (var "isNonNullary")) (var "isComplex")
 
 -- | Determine whether a given term needs to be treated as a (possibly nullary) function,
 -- rather than a simple value. The term might be an actual function, or it may have type parameters
 -- or internal let bindings, or it may reference complex variables.
-isComplexTerm :: TBinding (TypeContext -> Term -> Bool)
+isComplexTerm :: TBinding (Graph -> Term -> Bool)
 isComplexTerm = define "isComplexTerm" $
   doc "Check if a term needs to be treated as a function rather than a simple value" $
   "tc" ~> "t" ~>
@@ -267,83 +371,31 @@
     _Term_variable>>: "name" ~> isComplexVariable @@ var "tc" @@ var "name"]
 
 -- | Look up a variable to see if it is bound to a complex term
-isComplexVariable :: TBinding (TypeContext -> Name -> Bool)
+isComplexVariable :: TBinding (Graph -> Name -> Bool)
 isComplexVariable = define "isComplexVariable" $
   doc "Check if a variable is bound to a complex term" $
   "tc" ~> "name" ~>
   -- Check if there's metadata for this variable (indicates complexity)
-  "metaLookup" <~ Maps.lookup (var "name") (Typing.typeContextMetadata $ var "tc") $
+  "metaLookup" <~ Maps.lookup (var "name") (Graph.graphMetadata $ var "tc") $
   Logic.ifElse
     (Maybes.isJust (var "metaLookup"))
     (boolean True)
     -- Lambda-bound variables are complex because they might be thunked
     (Logic.ifElse
-      (Sets.member (var "name") (Typing.typeContextLambdaVariables $ var "tc"))
+      (Sets.member (var "name") (Graph.graphLambdaVariables $ var "tc"))
       (boolean True)
-      -- If not in type context, assume mutual recursion (complex)
-      ("typeLookup" <~ Maps.lookup (var "name") (Typing.typeContextTypes $ var "tc") $
-       Logic.not (Maybes.isJust (var "typeLookup"))))
-
--- | Check if a binding is complex and needs to be treated as a function
-isComplexBinding :: TBinding (TypeContext -> Binding -> Bool)
-isComplexBinding = define "isComplexBinding" $
-  doc "Check if a binding needs to be treated as a function" $
-  "tc" ~> "b" ~>
-  "term" <~ Core.bindingTerm (var "b") $
-  "mts" <~ Core.bindingType (var "b") $
-  -- Bindings without type schemes are complex (e.g., lifted case expressions)
-  Maybes.cases (var "mts")
-    (isComplexTerm @@ var "tc" @@ var "term") $
-    "ts" ~>
-      -- Check if polymorphic
-      "isPolymorphic" <~ Logic.not (Lists.null (Core.typeSchemeVariables $ var "ts")) $
-      -- Check if non-nullary
-      "isNonNullary" <~ Equality.gt (Arity.typeArity @@ (Core.typeSchemeType $ var "ts")) (int32 0) $
-      -- Check if complex term
-      "isComplex" <~ isComplexTerm @@ var "tc" @@ var "term" $
-      Logic.or (Logic.or (var "isPolymorphic") (var "isNonNullary")) (var "isComplex")
-
--- | Check if a term is trivially cheap to evaluate, meaning it needs no thunking.
--- Trivial terms include: literals, plain variable references, field projections
--- on trivial terms (e.g. app.function), unit values, maybe wrappers around trivial terms,
--- and type wrappers around trivial terms.
--- Field projections cause minor regressions in inference/hoisting (~200ms) but yield
--- large gains in checking/annotations/strings (~1500ms), for a net 4.2% improvement.
--- This is a conservative predicate: anything not explicitly recognized is non-trivial.
-isTrivialTerm :: TBinding (Term -> Bool)
-isTrivialTerm = define "isTrivialTerm" $
-  doc "Check if a term is trivially cheap (no thunking needed)" $
-  "t" ~>
-  cases _Term (Rewriting.deannotateTerm @@ var "t")
-    (Just $ boolean False) [
-    -- Literals are always trivial
-    _Term_literal>>: constant (boolean True),
-    -- Plain variables are trivial (the variable itself is cheap to reference)
-    _Term_variable>>: constant (boolean True),
-    -- Unit is trivial
-    _Term_unit>>: constant (boolean True),
-    -- Field projection on a trivial subterm is trivial (e.g. app.function)
-    _Term_application>>: "app" ~>
-      "fun" <~ Core.applicationFunction (var "app") $
-      "arg" <~ Core.applicationArgument (var "app") $
-      cases _Term (var "fun") (Just $ boolean False) [
-        _Term_function>>: "f" ~>
-          cases _Function (var "f") (Just $ boolean False) [
-            _Function_elimination>>: "e" ~>
-              cases _Elimination (var "e") (Just $ boolean False) [
-                -- record projection: trivial if the subject is trivial
-                _Elimination_record>>: constant (isTrivialTerm @@ var "arg")]]],
-    -- Maybe term (just x) where x is trivial; nothing is also trivial
-    _Term_maybe>>: "opt" ~>
-      Maybes.maybe (boolean True) ("inner" ~> isTrivialTerm @@ var "inner") (var "opt"),
-    -- Type applications/lambdas: check the inner term
-    _Term_typeApplication>>: "ta" ~> isTrivialTerm @@ (Core.typeApplicationTermBody $ var "ta"),
-    _Term_typeLambda>>: "tl" ~> isTrivialTerm @@ (Core.typeLambdaBody $ var "tl")]
-
-
---------------------------------------------------------------------------------
--- Tail-call optimization detection
---------------------------------------------------------------------------------
+      -- Check if the variable is in the graph's bound types
+      ("typeLookup" <~ Maps.lookup (var "name") (Graph.graphBoundTypes $ var "tc") $
+       Maybes.maybe
+         -- If not in graph at all, assume mutual recursion (complex)
+         (boolean True)
+         -- If in graph, check if the binding itself is non-nullary (a function).
+         -- Non-nullary bindings are always complex (they take parameters).
+         -- Nullary bindings are assumed non-complex from this check;
+         -- their actual complexity will be determined by isComplexBinding
+         -- at the reference site.
+         ("ts" ~> Equality.gt (Arity.typeSchemeArity @@ var "ts") (int32 0))
+         (var "typeLookup")))
 
 -- | Check if a term body is self-tail-recursive with respect to a function name.
 --   Returns True if the function references itself AND all self-references are in tail position.
@@ -359,6 +411,39 @@
       (isTailRecursiveInTailPosition @@ var "funcName" @@ var "body")
       false
 
+-- | Determines whether a term can be encoded as a simple assignment (without type annotation).
+-- A term is considered a simple assignment if:
+-- - It's not a lambda, let, or type lambda
+-- - It's not a type application (which introduces polymorphism requiring type signatures)
+-- - When peeled of applications, it's not a case statement
+isSimpleAssignment :: TBinding (Term -> Bool)
+isSimpleAssignment = define "isSimpleAssignment" $
+  doc "Check if a term can be encoded as a simple assignment" $
+  "term" ~>
+  cases _Term (var "term")
+    (Just $
+      -- Check if the base term (after gathering args) is a union elimination
+      "baseTerm" <~ Pairs.first (gatherArgs @@ var "term" @@ list ([] :: [TTerm Term])) $
+      cases _Term (var "baseTerm")
+        (Just $ boolean True) [
+        _Term_function>>: "f" ~>
+          cases _Function (var "f")
+            (Just $ boolean True) [
+            _Function_elimination>>: "elim" ~>
+              cases _Elimination (var "elim")
+                (Just $ boolean True) [
+                _Elimination_union>>: constant (boolean False)]]]) [
+    _Term_annotated>>: "at" ~>
+      isSimpleAssignment @@ (Core.annotatedTermBody $ var "at"),
+    _Term_function>>: "f" ~>
+      cases _Function (var "f")
+        (Just $ boolean True) [
+        _Function_lambda>>: constant (boolean False)],
+    _Term_let>>: constant (boolean False),
+    _Term_typeLambda>>: constant (boolean False),
+    _Term_typeApplication>>: "ta" ~>
+      isSimpleAssignment @@ (Core.typeApplicationTermBody $ var "ta")]
+
 -- | Check that all occurrences of funcName in a term are in tail position.
 --   Called after confirming funcName IS present in the term.
 --   Returns True if the term is safe for TCO transformation.
@@ -458,396 +543,133 @@
           (isTailRecursiveInTailPosition @@ var "funcName" @@ (Core.letBody $ var "lt"))]
 
 
---------------------------------------------------------------------------------
--- Flow-based utilities
---------------------------------------------------------------------------------
-
--- | Extract comments/description from a Binding (element definition).
--- This is a common pattern for coders that need to preserve documentation.
-commentsFromElement :: TBinding (Binding -> Flow Graph (Maybe String))
-commentsFromElement = define "commentsFromElement" $
-  doc "Extract comments/description from a Binding" $
-  "b" ~> Annotations.getTermDescription @@ (Core.bindingTerm $ var "b")
-
--- | Extract comments/description from a FieldType.
--- This is a common pattern for coders that need to preserve field documentation.
-commentsFromFieldType :: TBinding (FieldType -> Flow Graph (Maybe String))
-commentsFromFieldType = define "commentsFromFieldType" $
-  doc "Extract comments/description from a FieldType" $
-  "ft" ~> Annotations.getTypeDescription @@ (Core.fieldTypeType $ var "ft")
-
-
---------------------------------------------------------------------------------
--- Function analysis utilities
---------------------------------------------------------------------------------
-
--- | Infer the type of a term using the given TypeContext.
--- This is a helper that adds tracing for debugging purposes.
-tryTypeOf :: TBinding (String -> TypeContext -> Term -> Flow s Type)
-tryTypeOf = define "tryTypeOf" $
-  doc "Infer the type of a term with tracing" $
-  "msg" ~> "tc" ~> "term" ~>
-  Monads.withTrace @@ var "msg" @@ (Checking.typeOf @@ var "tc" @@ list ([] :: [TTerm Type]) @@ var "term")
-
--- | Produces a simple 'true' value if the binding is complex (needs to be treated as a function)
-bindingMetadata :: TBinding (TypeContext -> Binding -> Maybe Term)
-bindingMetadata = define "bindingMetadata" $
-  doc "Produces metadata for a binding if it is complex" $
-  "tc" ~> "b" ~>
-  Logic.ifElse
-    (isComplexBinding @@ var "tc" @@ var "b")
-    (just MetaTerms.true)
-    nothing
-
--- | Internal helper: analyze a function term with a configurable binding metadata function.
--- This is the core implementation used by all analyzeFunctionTerm variants.
---
--- The function peels off lambdas, type lambdas, lets, and type applications,
--- collecting their components into a FunctionStructure. It uses a recursive
--- gather/finish pattern with an argMode flag to track whether we're still
--- collecting lambda parameters (vs. having seen a let which stops parameter collection).
--- | Finish helper for analyzeFunctionTermWith: reapply type applications and infer return type
-analyzeFunctionTermWith_finish :: TBinding (
-  (env -> TypeContext) ->
-  env -> [Name] -> [Name] -> [Binding] -> [Type] -> [Type] -> Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTermWith_finish = define "analyzeFunctionTermWith_finish" $
-  "getTC" ~> "fEnv" ~> "tparams" ~> "args" ~> "bindings" ~> "doms" ~> "tapps" ~> "body" ~>
-  "bodyWithTapps" <~ Lists.foldl
-    ("trm" ~> "typ" ~> Core.termTypeApplication (Core.typeApplicationTerm (var "trm") (var "typ")))
-    (var "body")
-    (var "tapps") $
-  "mcod" <<~ Flows.withDefault (nothing :: TTerm (Maybe Type))
-    (Flows.map (primitive _maybes_pure) (tryTypeOf @@ string "analyzeFunctionTermWith" @@ (var "getTC" @@ var "fEnv") @@ var "bodyWithTapps")) $
-  Flows.pure $ record _FunctionStructure [
-    _FunctionStructure_typeParams>>: Lists.reverse (var "tparams"),
-    _FunctionStructure_params>>: Lists.reverse (var "args"),
-    _FunctionStructure_bindings>>: var "bindings",
-    _FunctionStructure_body>>: var "bodyWithTapps",
-    _FunctionStructure_domains>>: Lists.reverse (var "doms"),
-    _FunctionStructure_codomain>>: var "mcod",
-    _FunctionStructure_environment>>: var "fEnv"]
-
--- | Gather helper for analyzeFunctionTermWith: recursively collect function components
-analyzeFunctionTermWith_gather :: TBinding (
-  (TypeContext -> Binding -> Maybe Term) ->
-  (env -> TypeContext) ->
-  (TypeContext -> env -> env) ->
-  Bool -> env -> [Name] -> [Name] -> [Binding] -> [Type] -> [Type] -> Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTermWith_gather = define "analyzeFunctionTermWith_gather" $
-  "forBinding" ~> "getTC" ~> "setTC" ~>
-  "argMode" ~> "gEnv" ~> "tparams" ~> "args" ~> "bindings" ~> "doms" ~> "tapps" ~> "t" ~>
+-- | Check if a term is trivially cheap to evaluate, meaning it needs no thunking.
+-- Trivial terms include: literals, plain variable references, field projections
+-- on trivial terms (e.g. app.function), unit values, maybe wrappers around trivial terms,
+-- and type wrappers around trivial terms.
+-- Field projections cause minor regressions in inference/hoisting (~200ms) but yield
+-- large gains in checking/annotations/strings (~1500ms), for a net 4.2% improvement.
+-- This is a conservative predicate: anything not explicitly recognized is non-trivial.
+isTrivialTerm :: TBinding (Term -> Bool)
+isTrivialTerm = define "isTrivialTerm" $
+  doc "Check if a term is trivially cheap (no thunking needed)" $
+  "t" ~>
   cases _Term (Rewriting.deannotateTerm @@ var "t")
-    (Just $ analyzeFunctionTermWith_finish @@ var "getTC" @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t") [
-    _Term_function>>: "f" ~>
-      cases _Function (var "f")
-        (Just $ analyzeFunctionTermWith_finish @@ var "getTC" @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t") [
-        _Function_lambda>>: "lam" ~>
-          Logic.ifElse (var "argMode")
-            ("v" <~ Core.lambdaParameter (var "lam") $
-             "dom" <~ Maybes.maybe (Core.typeVariable (Core.name (string "_"))) identity (Core.lambdaDomain (var "lam")) $
-             "body" <~ Core.lambdaBody (var "lam") $
-             "newEnv" <~ (var "setTC" @@ (Schemas.extendTypeContextForLambda @@ (var "getTC" @@ var "gEnv") @@ var "lam") @@ var "gEnv") $
-             analyzeFunctionTermWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-               @@ var "argMode" @@ var "newEnv"
-               @@ var "tparams"
-               @@ (Lists.cons (var "v") (var "args"))
-               @@ var "bindings"
-               @@ (Lists.cons (var "dom") (var "doms"))
-               @@ var "tapps"
-               @@ var "body")
-            (analyzeFunctionTermWith_finish @@ var "getTC" @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t")],
-    _Term_let>>: "lt" ~>
-      "newBindings" <~ Core.letBindings (var "lt") $
-      "body" <~ Core.letBody (var "lt") $
-      "newEnv" <~ (var "setTC" @@ (Schemas.extendTypeContextForLet @@ var "forBinding" @@ (var "getTC" @@ var "gEnv") @@ var "lt") @@ var "gEnv") $
-      analyzeFunctionTermWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-        @@ boolean False @@ var "newEnv"
-        @@ var "tparams"
-        @@ var "args"
-        @@ (Lists.concat2 (var "bindings") (var "newBindings"))
-        @@ var "doms"
-        @@ var "tapps"
-        @@ var "body",
-    _Term_typeApplication>>: "ta" ~>
-      "taBody" <~ Core.typeApplicationTermBody (var "ta") $
-      "typ" <~ Core.typeApplicationTermType (var "ta") $
-      analyzeFunctionTermWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-        @@ var "argMode" @@ var "gEnv"
-        @@ var "tparams"
-        @@ var "args"
-        @@ var "bindings"
-        @@ var "doms"
-        @@ (Lists.cons (var "typ") (var "tapps"))
-        @@ var "taBody",
-    _Term_typeLambda>>: "tl" ~>
-      "tvar" <~ Core.typeLambdaParameter (var "tl") $
-      "tlBody" <~ Core.typeLambdaBody (var "tl") $
-      "newEnv" <~ (var "setTC" @@ (Schemas.extendTypeContextForTypeLambda @@ (var "getTC" @@ var "gEnv") @@ var "tl") @@ var "gEnv") $
-      analyzeFunctionTermWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-        @@ var "argMode" @@ var "newEnv"
-        @@ (Lists.cons (var "tvar") (var "tparams"))
-        @@ var "args"
-        @@ var "bindings"
-        @@ var "doms"
-        @@ var "tapps"
-        @@ var "tlBody"]
+    (Just $ boolean False) [
+    -- Literals are always trivial
+    _Term_literal>>: constant (boolean True),
+    -- Plain variables are trivial (the variable itself is cheap to reference)
+    _Term_variable>>: constant (boolean True),
+    -- Unit is trivial
+    _Term_unit>>: constant (boolean True),
+    -- Field projection on a trivial subterm is trivial (e.g. app.function)
+    _Term_application>>: "app" ~>
+      "fun" <~ Core.applicationFunction (var "app") $
+      "arg" <~ Core.applicationArgument (var "app") $
+      cases _Term (var "fun") (Just $ boolean False) [
+        _Term_function>>: "f" ~>
+          cases _Function (var "f") (Just $ boolean False) [
+            _Function_elimination>>: "e" ~>
+              cases _Elimination (var "e") (Just $ boolean False) [
+                -- record projection: trivial if the subject is trivial
+                _Elimination_record>>: constant (isTrivialTerm @@ var "arg"),
+                -- newtype unwrap: trivial if the subject is trivial
+                _Elimination_wrap>>: constant (isTrivialTerm @@ var "arg")]]],
+    -- Maybe term (just x) where x is trivial; nothing is also trivial
+    _Term_maybe>>: "opt" ~>
+      Maybes.maybe (boolean True) ("inner" ~> isTrivialTerm @@ var "inner") (var "opt"),
+    -- Record construction is trivial if all field terms are trivial
+    _Term_record>>: "rec" ~>
+      Lists.foldl ("acc" ~> "fld" ~> Logic.and (var "acc") (isTrivialTerm @@ (Core.fieldTerm $ var "fld")))
+        (boolean True) (Core.recordFields $ var "rec"),
+    -- Wrap (newtype construction) is trivial if the inner term is trivial
+    _Term_wrap>>: "wt" ~> isTrivialTerm @@ (Core.wrappedTermBody $ var "wt"),
+    -- Type applications/lambdas: check the inner term
+    _Term_typeApplication>>: "ta" ~> isTrivialTerm @@ (Core.typeApplicationTermBody $ var "ta"),
+    _Term_typeLambda>>: "tl" ~> isTrivialTerm @@ (Core.typeLambdaBody $ var "tl")]
 
-analyzeFunctionTermWith :: TBinding (
-  (TypeContext -> Binding -> Maybe Term) ->
-  (env -> TypeContext) ->
-  (TypeContext -> env -> env) ->
-  env ->
-  Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTermWith = define "analyzeFunctionTermWith" $
-  doc "Analyze a function term with configurable binding metadata" $
-  "forBinding" ~> "getTC" ~> "setTC" ~> "env" ~> "term" ~>
-  analyzeFunctionTermWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-    @@ boolean True @@ var "env"
-    @@ list ([] :: [TTerm Name])
-    @@ list ([] :: [TTerm Name])
-    @@ list ([] :: [TTerm Binding])
-    @@ list ([] :: [TTerm Type])
-    @@ list ([] :: [TTerm Type])
-    @@ var "term"
 
--- | Finish helper for analyzeFunctionTermNoInferWith: reapply type applications, skip type inference
-analyzeFunctionTermNoInferWith_finish :: TBinding (
-  env -> [Name] -> [Name] -> [Binding] -> [Type] -> [Type] -> Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTermNoInferWith_finish = define "analyzeFunctionTermNoInferWith_finish" $
-  "fEnv" ~> "tparams" ~> "args" ~> "bindings" ~> "doms" ~> "tapps" ~> "body" ~>
-  "bodyWithTapps" <~ Lists.foldl
-    ("trm" ~> "typ" ~> Core.termTypeApplication (Core.typeApplicationTerm (var "trm") (var "typ")))
-    (var "body")
-    (var "tapps") $
-  Flows.pure $ record _FunctionStructure [
-    _FunctionStructure_typeParams>>: Lists.reverse (var "tparams"),
-    _FunctionStructure_params>>: Lists.reverse (var "args"),
-    _FunctionStructure_bindings>>: var "bindings",
-    _FunctionStructure_body>>: var "bodyWithTapps",
-    _FunctionStructure_domains>>: Lists.reverse (var "doms"),
-    _FunctionStructure_codomain>>: nothing,
-    _FunctionStructure_environment>>: var "fEnv"]
+nameToFilePath :: TBinding (CaseConvention -> CaseConvention -> FileExtension -> Name -> FilePath)
+nameToFilePath = define "nameToFilePath" $
+  doc "Convert a name to file path, given case conventions for namespaces and local names, and assuming '/' as the file path separator" $
+  "nsConv" ~> "localConv" ~> "ext" ~> "name" ~>
+  "qualName" <~ Names.qualifyName @@ var "name" $
+  "ns" <~ Module.qualifiedNameNamespace (var "qualName") $
+  "local" <~ Module.qualifiedNameLocal (var "qualName") $
+  "nsToFilePath" <~ ("ns" ~>
+    Strings.intercalate (string "/") (Lists.map
+      ("part" ~> Formatting.convertCase @@ Util.caseConventionCamel @@ var "nsConv" @@ var "part")
+      (Strings.splitOn (string ".") (Module.unNamespace (var "ns"))))) $
+  "prefix" <~ Maybes.maybe (string "")
+    ("n" ~> Strings.cat2 (var "nsToFilePath" @@ var "n") (string "/"))
+    (var "ns") $
+  "suffix" <~ Formatting.convertCase @@ Util.caseConventionPascal @@ var "localConv" @@ var "local" $
+  Strings.cat (list [var "prefix", var "suffix", string ".", Module.unFileExtension (var "ext")])
 
--- | Gather helper for analyzeFunctionTermNoInferWith: recursively collect function components
-analyzeFunctionTermNoInferWith_gather :: TBinding (
-  (TypeContext -> Binding -> Maybe Term) ->
-  (env -> TypeContext) ->
-  (TypeContext -> env -> env) ->
-  Bool -> env -> [Name] -> [Name] -> [Binding] -> [Type] -> [Type] -> Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTermNoInferWith_gather = define "analyzeFunctionTermNoInferWith_gather" $
-  "forBinding" ~> "getTC" ~> "setTC" ~>
-  "argMode" ~> "gEnv" ~> "tparams" ~> "args" ~> "bindings" ~> "doms" ~> "tapps" ~> "t" ~>
-  cases _Term (Rewriting.deannotateTerm @@ var "t")
-    (Just $ analyzeFunctionTermNoInferWith_finish @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t") [
-    _Term_function>>: "f" ~>
-      cases _Function (var "f")
-        (Just $ analyzeFunctionTermNoInferWith_finish @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t") [
-        _Function_lambda>>: "lam" ~>
-          Logic.ifElse (var "argMode")
-            ("v" <~ Core.lambdaParameter (var "lam") $
-             "dom" <~ Maybes.maybe (Core.typeVariable (Core.name (string "_"))) identity (Core.lambdaDomain (var "lam")) $
-             "body" <~ Core.lambdaBody (var "lam") $
-             "newEnv" <~ (var "setTC" @@ (Schemas.extendTypeContextForLambda @@ (var "getTC" @@ var "gEnv") @@ var "lam") @@ var "gEnv") $
-             analyzeFunctionTermNoInferWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-               @@ var "argMode" @@ var "newEnv"
-               @@ var "tparams"
-               @@ (Lists.cons (var "v") (var "args"))
-               @@ var "bindings"
-               @@ (Lists.cons (var "dom") (var "doms"))
-               @@ var "tapps"
-               @@ var "body")
-            (analyzeFunctionTermNoInferWith_finish @@ var "gEnv" @@ var "tparams" @@ var "args" @@ var "bindings" @@ var "doms" @@ var "tapps" @@ var "t")],
-    _Term_let>>: "lt" ~>
-      "newBindings" <~ Core.letBindings (var "lt") $
-      "body" <~ Core.letBody (var "lt") $
-      "newEnv" <~ (var "setTC" @@ (Schemas.extendTypeContextForLet @@ var "forBinding" @@ (var "getTC" @@ var "gEnv") @@ var "lt") @@ var "gEnv") $
-      analyzeFunctionTermNoInferWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-        @@ boolean False @@ var "newEnv"
-        @@ var "tparams"
-        @@ var "args"
-        @@ (Lists.concat2 (var "bindings") (var "newBindings"))
-        @@ var "doms"
-        @@ var "tapps"
-        @@ var "body",
-    _Term_typeApplication>>: "ta" ~>
-      "taBody" <~ Core.typeApplicationTermBody (var "ta") $
-      "typ" <~ Core.typeApplicationTermType (var "ta") $
-      analyzeFunctionTermNoInferWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-        @@ var "argMode" @@ var "gEnv"
-        @@ var "tparams"
-        @@ var "args"
-        @@ var "bindings"
-        @@ var "doms"
-        @@ (Lists.cons (var "typ") (var "tapps"))
-        @@ var "taBody",
-    _Term_typeLambda>>: "tl" ~>
-      "tvar" <~ Core.typeLambdaParameter (var "tl") $
-      "tlBody" <~ Core.typeLambdaBody (var "tl") $
-      "newEnv" <~ (var "setTC" @@ (Schemas.extendTypeContextForTypeLambda @@ (var "getTC" @@ var "gEnv") @@ var "tl") @@ var "gEnv") $
-      analyzeFunctionTermNoInferWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-        @@ var "argMode" @@ var "newEnv"
-        @@ (Lists.cons (var "tvar") (var "tparams"))
-        @@ var "args"
-        @@ var "bindings"
-        @@ var "doms"
-        @@ var "tapps"
-        @@ var "tlBody"]
 
--- | Internal helper: analyze a function term without type inference, with configurable binding metadata.
-analyzeFunctionTermNoInferWith :: TBinding (
-  (TypeContext -> Binding -> Maybe Term) ->
-  (env -> TypeContext) ->
-  (TypeContext -> env -> env) ->
-  env ->
-  Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTermNoInferWith = define "analyzeFunctionTermNoInferWith" $
-  doc "Analyze a function term without type inference, with configurable binding metadata" $
-  "forBinding" ~> "getTC" ~> "setTC" ~> "env" ~> "term" ~>
-  analyzeFunctionTermNoInferWith_gather @@ var "forBinding" @@ var "getTC" @@ var "setTC"
-    @@ boolean True @@ var "env"
-    @@ list ([] :: [TTerm Name])
-    @@ list ([] :: [TTerm Name])
-    @@ list ([] :: [TTerm Binding])
-    @@ list ([] :: [TTerm Type])
-    @@ list ([] :: [TTerm Type])
-    @@ var "term"
-
--- | Analyze a function term by recursively peeling off lambdas, type lambdas, lets, and type applications.
--- This is a common pattern across all language coders: we need to understand the structure of a function
--- to properly encode it in the target language.
-analyzeFunctionTerm :: TBinding (
-  (env -> TypeContext) ->
-  (TypeContext -> env -> env) ->
-  env ->
-  Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTerm = define "analyzeFunctionTerm" $
-  doc "Analyze a function term, collecting lambdas, type lambdas, lets, and type applications" $
-  "getTC" ~> "setTC" ~> "env" ~> "term" ~>
-  analyzeFunctionTermWith @@ bindingMetadata @@ var "getTC" @@ var "setTC" @@ var "env" @@ var "term"
-
--- | Like analyzeFunctionTerm, but without recording binding metadata. This is used for inline
--- lambda expressions where let bindings are encoded as walrus operators (which evaluate
--- immediately and share values, so don't need thunking or function call syntax).
-analyzeFunctionTermInline :: TBinding (
-  (env -> TypeContext) ->
-  (TypeContext -> env -> env) ->
-  env ->
-  Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTermInline = define "analyzeFunctionTermInline" $
-  doc "Analyze a function term without recording binding metadata" $
-  "getTC" ~> "setTC" ~> "env" ~> "term" ~>
-  analyzeFunctionTermWith @@ (constant (constant nothing)) @@ var "getTC" @@ var "setTC" @@ var "env" @@ var "term"
+-- | Normalize a comment string for consistent output across coders.
+-- Strips leading/trailing whitespace and ensures the comment ends with a period.
+-- Returns empty string for whitespace-only input.
+normalizeComment :: TBinding (String -> String)
+normalizeComment = define "normalizeComment" $
+  doc "Normalize a comment string for consistent output across coders" $
+  "s" ~>
+  "stripped" <~ Formatting.stripLeadingAndTrailingWhitespace @@ var "s" $
+  Logic.ifElse
+    (Strings.null (var "stripped"))
+    (string "")
+    -- Get the last character by using charAt with (length - 1)
+    -- Code point 46 is '.'
+    ("lastIdx" <~ Math.sub (Strings.length (var "stripped")) (int32 1) $
+     "lastChar" <~ Strings.charAt (var "lastIdx") (var "stripped") $
+     Logic.ifElse
+       (Equality.equal (var "lastChar") (int32 46))
+       (var "stripped")
+       (Strings.cat2 (var "stripped") (string ".")))
 
--- | Analyze a function term without inferring the return type.
--- This is a performance optimization for dynamically-typed target languages (like Python)
--- where the codomain type is not needed and type inference is expensive.
-analyzeFunctionTermNoInfer :: TBinding (
-  (env -> TypeContext) ->
-  (TypeContext -> env -> env) ->
-  env ->
-  Term ->
-  Flow s (FunctionStructure env))
-analyzeFunctionTermNoInfer = define "analyzeFunctionTermNoInfer" $
-  doc "Analyze a function term without type inference (performance optimization)" $
-  "getTC" ~> "setTC" ~> "env" ~> "term" ~>
-  analyzeFunctionTermNoInferWith @@ bindingMetadata @@ var "getTC" @@ var "setTC" @@ var "env" @@ var "term"
+-- | Reorder definitions: types first, then topologically sorted terms.
+-- This is a common pattern across language coders to ensure definitions
+-- appear in dependency order in the generated output.
+reorderDefs :: TBinding ([Definition] -> [Definition])
+reorderDefs = define "reorderDefs" $
+  doc "Reorder definitions: types first (with hydra.core.Name first among types), then topologically sorted terms" $
+  "defs" ~>
+    "partitioned" <~ (Schemas.partitionDefinitions @@ var "defs") $
+    "typeDefsRaw" <~ Pairs.first (var "partitioned") $
+    -- Sort type defs: Name type first (it is referenced by almost everything else)
+    "nameFirst" <~ Lists.filter
+      ("td" ~> Equality.equal
+        (project _TypeDefinition _TypeDefinition_name @@ var "td")
+        (wrap _Name $ string "hydra.core.Name"))
+      (var "typeDefsRaw") $
+    "nameRest" <~ Lists.filter
+      ("td" ~> Logic.not $ Equality.equal
+        (project _TypeDefinition _TypeDefinition_name @@ var "td")
+        (wrap _Name $ string "hydra.core.Name"))
+      (var "typeDefsRaw") $
+    "typeDefs" <~ Lists.concat (list [
+      Lists.map ("td" ~> inject _Definition _Definition_type (var "td")) (var "nameFirst"),
+      Lists.map ("td" ~> inject _Definition _Definition_type (var "td")) (var "nameRest")]) $
+    "termDefsWrapped" <~ Lists.map ("td" ~> inject _Definition _Definition_term (var "td"))
+      (Pairs.second (var "partitioned")) $
+    -- Topologically sort term definitions by free variable dependencies
+    "sortedTermDefs" <~ (Lists.concat $ Sorting.topologicalSortNodes @@
+      ("d" ~> cases _Definition (var "d") Nothing [
+        _Definition_term>>: "td" ~> project _TermDefinition _TermDefinition_name @@ var "td"])
+      @@
+      ("d" ~> cases _Definition (var "d") (Just (list ([] :: [TTerm Name]))) [
+        _Definition_term>>: "td" ~>
+          Sets.toList $ Rewriting.freeVariablesInTerm @@ (project _TermDefinition _TermDefinition_term @@ var "td")])
+      @@ var "termDefsWrapped") $
+    Lists.concat (list [var "typeDefs", var "sortedTermDefs"])
 
 
---------------------------------------------------------------------------------
--- State management helpers for coders
---------------------------------------------------------------------------------
-
--- | Update the metadata portion of a coder state.
--- This is useful for tracking language-specific metadata during code generation.
---
--- Parameters:
--- - getMeta: Extract metadata from state
--- - makeCoder: Construct state from Graph and metadata
--- - getGraph: Extract Graph from state
--- - f: Transformation to apply to metadata
-updateCoderMetadata :: TBinding (
-  (state -> metadata) ->
-  (Graph -> metadata -> state) ->
-  (state -> Graph) ->
-  (metadata -> metadata) ->
-  Flow state ())
-updateCoderMetadata = define "updateCoderMetadata" $
-  doc "Update the metadata portion of a coder state" $
-  "getMeta" ~> "makeCoder" ~> "getGraph" ~> "f" ~>
-  "st" <<~ Monads.getState $
-  Monads.putState @@ (var "makeCoder" @@ (var "getGraph" @@ var "st") @@ (var "f" @@ (var "getMeta" @@ var "st")))
-
--- | Temporarily update the graph for a computation, then restore it.
--- The metadata remains mutable throughout the flow (any changes are preserved).
---
--- This pattern is useful when you need to:
--- - Try encoding with an extended graph but not commit the extensions
--- - Test something in a modified graph context
--- - Keep metadata changes but discard graph changes
-withUpdatedCoderGraph :: TBinding (
-  (state -> Graph) ->
-  (state -> metadata) ->
-  (Graph -> metadata -> state) ->
-  (Graph -> Graph) ->
-  Flow state a ->
-  Flow state a)
-withUpdatedCoderGraph = define "withUpdatedCoderGraph" $
-  doc "Temporarily update the graph for a computation, then restore it" $
-  "getGraph" ~> "getMeta" ~> "makeCoder" ~> "f" ~> "flow" ~>
-  "st" <<~ Monads.getState $
-  exec (Monads.putState @@ (var "makeCoder" @@ (var "f" @@ (var "getGraph" @@ var "st")) @@ (var "getMeta" @@ var "st"))) $
-  "r" <<~ var "flow" $
-  "st2" <<~ Monads.getState $
-  exec (Monads.putState @@ (var "makeCoder" @@ (var "getGraph" @@ var "st") @@ (var "getMeta" @@ var "st2"))) $
-  Flows.pure (var "r")
-
--- | Temporarily extend the graph with additional bindings for a computation.
--- The bindings are only visible within the provided flow action.
---
--- This is commonly used when encoding terms that introduce local bindings
--- (like let expressions), where we need those bindings available in the graph
--- for type checking and term resolution.
-withGraphBindings :: TBinding (
-  (state -> Graph) ->
-  (Graph -> metadata -> state) ->
-  (state -> metadata) ->
-  [Binding] ->
-  Flow state a ->
-  Flow state a)
-withGraphBindings = define "withGraphBindings" $
-  doc "Temporarily extend the graph with additional bindings for a computation" $
-  "getGraph" ~> "makeCoder" ~> "getMeta" ~> "bindings" ~> "flow" ~>
-  withUpdatedCoderGraph @@ var "getGraph" @@ var "getMeta" @@ var "makeCoder"
-    @@ (Lexical.extendGraphWithBindings @@ var "bindings")
-    @@ var "flow"
+-- | Check/reconstruct the type of a term, discarding the updated Context.
+-- Wraps Checking.typeOf and returns just the Type.
+typeOfTerm :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Type)
+typeOfTerm = define "typeOfTerm" $
+  doc "Check the type of a term" $
+  "cx" ~> "g" ~> "term" ~>
+  Eithers.map (primitive _pairs_first)
+    (Checking.typeOf @@ var "cx" @@ var "g" @@ list ([] :: [TTerm Type]) @@ var "term")
 
--- | Run a Flow Graph computation within a Flow state computation.
--- This allows you to execute graph-level operations (like type inference,
--- term lookups, etc.) while maintaining a richer coder state with metadata.
---
--- The graph changes from the inner computation are preserved, but run in
--- the context of the coder's graph.
-inCoderGraphContext :: TBinding (
-  (state -> Graph) ->
-  (state -> metadata) ->
-  (Graph -> metadata -> state) ->
-  Flow Graph a ->
-  Flow state a)
-inCoderGraphContext = define "inCoderGraphContext" $
-  doc "Run a Flow Graph computation within a Flow state computation" $
-  "getGraph" ~> "getMeta" ~> "makeCoder" ~> "graphFlow" ~>
-  "st" <<~ Monads.getState $
-  "result" <<~ Monads.withState @@ (var "getGraph" @@ var "st") @@ (
-    "ret" <<~ var "graphFlow" $
-    "g2" <<~ Monads.getState $
-    Flows.pure (pair (var "ret") (var "g2"))) $
-  exec (Monads.putState @@ (var "makeCoder" @@ (Pairs.second (var "result")) @@ (var "getMeta" @@ var "st"))) $
-  Flows.pure (Pairs.first (var "result"))
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/All.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/All.hs
--- a/src/main/haskell/Hydra/Sources/Eval/Lib/All.hs
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/All.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors     as Accessors
+import qualified Hydra.Dsl.Paths     as Paths
 import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
+import qualified Hydra.Dsl.Ast           as Ast
 import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
 import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
+import qualified Hydra.Dsl.Json.Model          as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
@@ -33,17 +30,17 @@
 import qualified Hydra.Dsl.Meta.Base     as MetaBase
 import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
 import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
+import qualified Hydra.Dsl.Module        as Module
 import           Hydra.Dsl.Meta.Phantoms as Phantoms
 import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
 import qualified Hydra.Dsl.Meta.Testing       as Testing
 import qualified Hydra.Dsl.Terms         as Terms
 import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
+import qualified Hydra.Dsl.Topology      as Topology
 import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
 import qualified Hydra.Dsl.Meta.Variants      as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -54,9 +51,11 @@
 import qualified Data.Maybe              as Y
 
 import qualified Hydra.Sources.Eval.Lib.Eithers as EvalEithers
-import qualified Hydra.Sources.Eval.Lib.Flows as EvalFlows
+import qualified Hydra.Sources.Eval.Lib.Equality as EvalEquality
 import qualified Hydra.Sources.Eval.Lib.Lists as EvalLists
+import qualified Hydra.Sources.Eval.Lib.Logic as EvalLogic
 import qualified Hydra.Sources.Eval.Lib.Maps as EvalMaps
+import qualified Hydra.Sources.Eval.Lib.Math as EvalMath
 import qualified Hydra.Sources.Eval.Lib.Maybes as EvalMaybes
 import qualified Hydra.Sources.Eval.Lib.Pairs as EvalPairs
 import qualified Hydra.Sources.Eval.Lib.Sets as EvalSets
@@ -69,15 +68,23 @@
 define = definitionInNamespace ns
 
 -- | All eval library modules
+-- Note: Eithers, Lists, Maps, Maybes, and Sets modules cannot currently be code-generated
+-- due to DSL type inference limitations. The eval primitive implementations in those modules
+-- use meta-level DSL functions (Maybes.maybe, Eithers.either_, etc.) applied to Term-level
+-- values, which causes unification errors. These modules still work at runtime via the
+-- native Haskell implementations in EvalPrimitives.hs.
 evalLibModules :: [Module]
 evalLibModules = [
   EvalEithers.module_,
-  EvalFlows.module_,
+  EvalEquality.module_,
   EvalLists.module_,
+  EvalLogic.module_,
   EvalMaps.module_,
+  EvalMath.module_,
   EvalMaybes.module_,
   EvalPairs.module_,
-  EvalSets.module_]
+  EvalSets.module_
+  ]
 
 -- | Namespaces of all eval library modules
 evalLibNamespaces :: [Namespace]
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Eithers.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Eithers.hs
--- a/src/main/haskell/Hydra/Sources/Eval/Lib/Eithers.hs
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Eithers.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (either)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors     as Accessors
+import qualified Hydra.Dsl.Paths     as Paths
 import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
+import qualified Hydra.Dsl.Ast           as Ast
 import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
 import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
+import qualified Hydra.Dsl.Json.Model          as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
@@ -30,20 +27,21 @@
 import           Hydra.Dsl.Meta.Lib.Strings   as Strings
 import qualified Hydra.Dsl.Literals      as Literals
 import qualified Hydra.Dsl.LiteralTypes  as LiteralTypes
+import qualified Hydra.Dsl.Meta.Literals as MetaLiterals
 import qualified Hydra.Dsl.Meta.Base     as MetaBase
 import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
 import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
+import qualified Hydra.Dsl.Module        as Module
 import           Hydra.Dsl.Meta.Phantoms as Phantoms
 import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
 import qualified Hydra.Dsl.Meta.Testing       as Testing
 import qualified Hydra.Dsl.Terms         as Terms
 import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
+import qualified Hydra.Dsl.Topology      as Topology
 import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
 import qualified Hydra.Dsl.Meta.Variants      as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++), either)
@@ -54,10 +52,8 @@
 import qualified Data.Maybe              as Y
 
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
 
-
 ns :: Namespace
 ns = Namespace "hydra.eval.lib.eithers"
 
@@ -66,29 +62,39 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Monads.ns, ShowCore.ns]
+    [ExtractCore.ns, ShowCore.ns]
     kernelTypesNamespaces $
     Just ("Evaluation-level implementations of Either functions for the Hydra interpreter.")
   where
     elements = [
-      toBinding bind_,
-      toBinding bimap_,
-      toBinding either_,
-      toBinding map_,
-      toBinding mapList_,
-      toBinding mapMaybe_]
+      toTermDefinition bind_,
+      toTermDefinition bimap_,
+      toTermDefinition either_,
+      toTermDefinition foldl_,
+      toTermDefinition fromLeft_,
+      toTermDefinition fromRight_,
+      toTermDefinition isLeft_,
+      toTermDefinition isRight_,
+      toTermDefinition lefts_,
+      toTermDefinition map_,
+      toTermDefinition mapList_,
+      toTermDefinition mapMaybe_,
+      toTermDefinition mapSet_,
+      toTermDefinition partitionEithers_,
+      toTermDefinition rights_]
 
 -- | Interpreter-friendly bind for Either terms.
 -- Takes an Either term and a function term, applies the function to the Right
 -- value and returns the result (which should be an Either), or returns the Left unchanged.
-bind_ :: TBinding (Term -> Term -> Flow s Term)
+bind_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 bind_ = define "bind" $
   doc "Interpreter-friendly bind for Either terms." $
+  "cx" ~> "g" ~>
   "eitherTerm" ~> "funTerm" ~>
   cases _Term (var "eitherTerm")
-    (Just (Monads.unexpected @@ string "either value" @@ (ShowCore.term @@ var "eitherTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "either value") (ShowCore.term @@ var "eitherTerm"))) [
     _Term_either>>: "e" ~>
-      produce $ Eithers.either_
+      right $ Eithers.either_
         -- If Left: return the Left unchanged
         ("val" ~> Core.termEither $ left $ var "val")
         -- If Right: apply funTerm to the value
@@ -98,14 +104,15 @@
 -- | Interpreter-friendly bimap for Either terms.
 -- Takes two function terms (for left and right) and an Either term, applies
 -- the appropriate function to the contained value and re-wraps the result.
-bimap_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+bimap_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 bimap_ = define "bimap" $
   doc "Interpreter-friendly bimap for Either terms." $
+  "cx" ~> "g" ~>
   "leftFun" ~> "rightFun" ~> "eitherTerm" ~>
   cases _Term (var "eitherTerm")
-    (Just (Monads.unexpected @@ string "either value" @@ (ShowCore.term @@ var "eitherTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "either value") (ShowCore.term @@ var "eitherTerm"))) [
     _Term_either>>: "e" ~>
-      produce $ Eithers.either_
+      right $ Eithers.either_
         ("val" ~> Core.termEither $ left $ Core.termApplication $ Core.application (var "leftFun") (var "val"))
         ("val" ~> Core.termEither $ right $ Core.termApplication $ Core.application (var "rightFun") (var "val"))
         (var "e")]
@@ -113,26 +120,136 @@
 -- | Interpreter-friendly case analysis for Either terms.
 -- Takes two function terms and an Either term, applies the appropriate function
 -- to the contained value.
-either_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+either_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 either_ = define "either" $
   doc "Interpreter-friendly case analysis for Either terms." $
+  "cx" ~> "g" ~>
   "leftFun" ~> "rightFun" ~> "eitherTerm" ~>
   cases _Term (var "eitherTerm")
-    (Just (Monads.unexpected @@ string "either value" @@ (ShowCore.term @@ var "eitherTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "either value") (ShowCore.term @@ var "eitherTerm"))) [
     _Term_either>>: "e" ~>
-      produce $ Eithers.either_
+      right $ Eithers.either_
         ("val" ~> Core.termApplication $ Core.application (var "leftFun") (var "val"))
         ("val" ~> Core.termApplication $ Core.application (var "rightFun") (var "val"))
         (var "e")]
 
-map_ :: TBinding (Term -> Term -> Flow s Term)
+-- | Interpreter-friendly foldl for Either.
+-- foldl funTerm initTerm listTerm: folds funTerm over elements of listTerm,
+-- threading an accumulator starting from initTerm. Short-circuits on first Left.
+foldl_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
+foldl_ = define "foldl" $
+  doc "Interpreter-friendly foldl for Either." $
+  "cx" ~> "g" ~>
+  "funTerm" ~> "initTerm" ~> "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  -- Fold: for each element, apply funTerm acc el, then bind to check Left/Right
+  right $ Lists.foldl
+    ("acc" ~> "el" ~>
+      -- bind acc (\a -> funTerm a el)
+      Core.termApplication $ Core.application
+        (Core.termApplication $ Core.application
+          (Core.termApplication $ Core.application
+            (Core.termFunction $ Core.functionPrimitive $ encodedName _eithers_either)
+            -- If acc is Left: short-circuit
+            (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "err") nothing $
+              Core.termEither $ left $ Core.termVariable $ wrap _Name $ string "err"))
+          -- If acc is Right: apply funTerm to acc value and element
+          (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "a") nothing $
+            Core.termApplication $ Core.application
+              (Core.termApplication $ Core.application (var "funTerm") (Core.termVariable $ wrap _Name $ string "a"))
+              (var "el")))
+        (var "acc"))
+    -- Initial accumulator: Right initTerm
+    (Core.termEither $ right $ var "initTerm")
+    (var "elements")
+
+-- | Interpreter-friendly fromLeft for Either terms.
+-- fromLeft default eitherTerm: returns the Left value, or default if Right.
+fromLeft_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+fromLeft_ = define "fromLeft" $
+  doc "Interpreter-friendly fromLeft for Either terms." $
+  "cx" ~> "g" ~>
+  "defaultTerm" ~> "eitherTerm" ~>
+  cases _Term (var "eitherTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "either value") (ShowCore.term @@ var "eitherTerm"))) [
+    _Term_either>>: "e" ~>
+      right $ Eithers.either_
+        ("val" ~> var "val")
+        ("_" ~> var "defaultTerm")
+        (var "e")]
+
+-- | Interpreter-friendly fromRight for Either terms.
+-- fromRight default eitherTerm: returns the Right value, or default if Left.
+fromRight_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+fromRight_ = define "fromRight" $
+  doc "Interpreter-friendly fromRight for Either terms." $
+  "cx" ~> "g" ~>
+  "defaultTerm" ~> "eitherTerm" ~>
+  cases _Term (var "eitherTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "either value") (ShowCore.term @@ var "eitherTerm"))) [
+    _Term_either>>: "e" ~>
+      right $ Eithers.either_
+        ("_" ~> var "defaultTerm")
+        ("val" ~> var "val")
+        (var "e")]
+
+-- | Interpreter-friendly isLeft for Either terms.
+isLeft_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+isLeft_ = define "isLeft" $
+  doc "Interpreter-friendly isLeft for Either terms." $
+  "cx" ~> "g" ~>
+  "eitherTerm" ~>
+  cases _Term (var "eitherTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "either value") (ShowCore.term @@ var "eitherTerm"))) [
+    _Term_either>>: "e" ~>
+      right $ Eithers.either_
+        ("_" ~> Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean True)
+        ("_" ~> Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean False)
+        (var "e")]
+
+-- | Interpreter-friendly isRight for Either terms.
+isRight_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+isRight_ = define "isRight" $
+  doc "Interpreter-friendly isRight for Either terms." $
+  "cx" ~> "g" ~>
+  "eitherTerm" ~>
+  cases _Term (var "eitherTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "either value") (ShowCore.term @@ var "eitherTerm"))) [
+    _Term_either>>: "e" ~>
+      right $ Eithers.either_
+        ("_" ~> Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean False)
+        ("_" ~> Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean True)
+        (var "e")]
+
+-- | Interpreter-friendly lefts for list of Either terms.
+-- Extracts all Left values from a list.
+lefts_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+lefts_ = define "lefts" $
+  doc "Interpreter-friendly lefts for list of Either terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  right $ Core.termList $ Lists.foldl
+    ("acc" ~> "el" ~>
+      cases _Term (var "el")
+        (Just (var "acc")) [
+        _Term_either>>: "e" ~>
+          Eithers.either_
+            ("val" ~> Lists.concat2 (var "acc") (Lists.pure (var "val")))
+            ("_" ~> var "acc")
+            (var "e")])
+    (list ([] :: [TTerm Term]))
+    (var "elements")
+
+map_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 map_ = define "map" $
   doc "Interpreter-friendly map for Either terms." $
+  "cx" ~> "g" ~>
   "rightFun" ~> "eitherTerm" ~>
   cases _Term (var "eitherTerm")
-    (Just (Monads.unexpected @@ string "either value" @@ (ShowCore.term @@ var "eitherTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "either value") (ShowCore.term @@ var "eitherTerm"))) [
     _Term_either>>: "e" ~>
-      produce $ Eithers.either_
+      right $ Eithers.either_
         ("val" ~> Core.termEither $ left $ var "val")
         ("val" ~> Core.termEither $ right $ Core.termApplication $ Core.application (var "rightFun") (var "val"))
         (var "e")]
@@ -140,14 +257,15 @@
 -- | Interpreter-friendly mapList for Either (traverse).
 -- mapList funTerm listTerm: applies funTerm to each element, collecting results.
 -- Short-circuits on first Left error.
-mapList_ :: TBinding (Term -> Term -> Flow s Term)
+mapList_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 mapList_ = define "mapList" $
   doc "Interpreter-friendly mapList for Either (traverse)." $
+  "cx" ~> "g" ~>
   "funTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
   -- Fold over reversed elements so that cons builds list in original order
   -- foldl (\acc el -> bind (f el) (\y -> map (cons y) acc)) (Right []) (reverse xs)
-  produce $ Lists.foldl
+  right $ Lists.foldl
     -- Accumulator function: acc -> el -> Either err [results]
     ("acc" ~> "el" ~>
       -- First apply funTerm to element: funTerm el
@@ -183,16 +301,62 @@
     -- Reverse elements so foldl with cons builds list in original order
     (Lists.reverse $ var "elements")
 
+-- | Interpreter-friendly mapSet for Either (traverse over Set).
+-- mapSet funTerm setTerm: applies funTerm to each element, collecting results as a set.
+-- Short-circuits on first Left error.
+mapSet_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+mapSet_ = define "mapSet" $
+  doc "Interpreter-friendly mapSet for Either (traverse over Set)." $
+  "cx" ~> "g" ~>
+  "funTerm" ~> "setTerm" ~>
+  "elements" <<~ (ExtractCore.set @@ var "cx" @@ var "g" @@ var "setTerm") $
+  -- Convert set to list, apply mapList logic, convert back to set
+  -- Fold over elements: foldl (\acc el -> either (\e -> Left e) (\y -> either (\e -> Left e) (\ys -> Right (cons y ys)) acc) (f el)) (Right []) elements
+  -- Then wrap result in Set
+  right $ Lists.foldl
+    ("acc" ~> "el" ~>
+      Core.termApplication $ Core.application
+        (Core.termApplication $ Core.application
+          (Core.termApplication $ Core.application
+            (Core.termFunction $ Core.functionPrimitive $ encodedName _eithers_either)
+            -- If Left: return the Left unchanged (short-circuit)
+            (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "err") nothing $
+              Core.termEither $ left $ Core.termVariable $ wrap _Name $ string "err"))
+          -- If Right: check acc, if acc is Right then cons, else return acc's Left
+          (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "y") nothing $
+            Core.termApplication $ Core.application
+              (Core.termApplication $ Core.application
+                (Core.termApplication $ Core.application
+                  (Core.termFunction $ Core.functionPrimitive $ encodedName _eithers_either)
+                  -- If acc is Left: return it
+                  (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "accErr") nothing $
+                    Core.termEither $ left $ Core.termVariable $ wrap _Name $ string "accErr"))
+                -- If acc is Right: insert y into the set using primitive
+                (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "ys") nothing $
+                  Core.termEither $ right $
+                    Core.termApplication $ Core.application
+                      (Core.termApplication $ Core.application
+                        (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_insert)
+                        (Core.termVariable $ wrap _Name $ string "y"))
+                      (Core.termVariable $ wrap _Name $ string "ys")))
+              (var "acc")))
+        (Core.termApplication $ Core.application (var "funTerm") (var "el")))
+    -- Initial accumulator: Right (empty set)
+    (Core.termEither $ right $ Core.termSet $ Sets.fromList (list ([] :: [TTerm Term])))
+    -- Convert set elements to list for folding
+    (Sets.toList $ var "elements")
+
 -- | Interpreter-friendly mapMaybe for Either (traverse over Maybe).
 -- mapMaybe funTerm maybeTerm: if Just, applies funTerm to the value.
-mapMaybe_ :: TBinding (Term -> Term -> Flow s Term)
+mapMaybe_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 mapMaybe_ = define "mapMaybe" $
   doc "Interpreter-friendly mapMaybe for Either (traverse over Maybe)." $
+  "cx" ~> "g" ~>
   "funTerm" ~> "maybeTerm" ~>
   cases _Term (var "maybeTerm")
-    (Just (Monads.unexpected @@ string "maybe value" @@ (ShowCore.term @@ var "maybeTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "maybe value") (ShowCore.term @@ var "maybeTerm"))) [
     _Term_maybe>>: "opt" ~>
-      produce $ Maybes.maybe
+      right $ Maybes.maybe
         -- Nothing: return Right Nothing
         (Core.termEither $ right $ Core.termMaybe nothing)
         -- Just val: apply funTerm, wrap result in Just
@@ -208,3 +372,44 @@
             (Core.termApplication $ Core.application (var "funTerm") (var "val")))
         (var "opt")]
 
+-- | Interpreter-friendly partitionEithers for list of Either terms.
+-- Splits a list of Eithers into (lefts, rights).
+partitionEithers_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+partitionEithers_ = define "partitionEithers" $
+  doc "Interpreter-friendly partitionEithers for list of Either terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  right $ Lists.foldl
+    ("acc" ~> "el" ~>
+      "ls" <~ Pairs.first (var "acc") $
+      "rs" <~ Pairs.second (var "acc") $
+      cases _Term (var "el")
+        (Just (var "acc")) [
+        _Term_either>>: "e" ~>
+          Eithers.either_
+            ("val" ~> pair (Lists.concat2 (var "ls") (Lists.pure (var "val"))) (var "rs"))
+            ("val" ~> pair (var "ls") (Lists.concat2 (var "rs") (Lists.pure (var "val"))))
+            (var "e")])
+    (pair (list ([] :: [TTerm Term])) (list ([] :: [TTerm Term])))
+    (var "elements")
+
+-- | Interpreter-friendly rights for list of Either terms.
+-- Extracts all Right values from a list.
+rights_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+rights_ = define "rights" $
+  doc "Interpreter-friendly rights for list of Either terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  right $ Core.termList $ Lists.foldl
+    ("acc" ~> "el" ~>
+      cases _Term (var "el")
+        (Just (var "acc")) [
+        _Term_either>>: "e" ~>
+          Eithers.either_
+            ("_" ~> var "acc")
+            ("val" ~> Lists.concat2 (var "acc") (Lists.pure (var "val")))
+            (var "e")])
+    (list ([] :: [TTerm Term]))
+    (var "elements")
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Equality.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Equality.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Equality.hs
@@ -0,0 +1,116 @@
+
+module Hydra.Sources.Eval.Lib.Equality where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths     as Paths
+import qualified Hydra.Dsl.Annotations   as Annotations
+import qualified Hydra.Dsl.Ast           as Ast
+import qualified Hydra.Dsl.Bootstrap     as Bootstrap
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
+import qualified Hydra.Dsl.Meta.Core          as Core
+import qualified Hydra.Dsl.Meta.Graph         as Graph
+import qualified Hydra.Dsl.Json.Model          as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps      as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math      as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes    as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs     as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets      as Sets
+import           Hydra.Dsl.Meta.Lib.Strings   as Strings
+import qualified Hydra.Dsl.Literals      as Literals
+import qualified Hydra.Dsl.LiteralTypes  as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base     as MetaBase
+import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
+import qualified Hydra.Dsl.Meta.Types    as MetaTypes
+import qualified Hydra.Dsl.Module        as Module
+import           Hydra.Dsl.Meta.Phantoms as Phantoms
+import qualified Hydra.Dsl.Prims         as Prims
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Testing       as Testing
+import qualified Hydra.Dsl.Terms         as Terms
+import qualified Hydra.Dsl.Tests         as Tests
+import qualified Hydra.Dsl.Topology      as Topology
+import qualified Hydra.Dsl.Types         as Types
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
+import qualified Hydra.Dsl.Meta.Variants      as Variants
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                as I
+import qualified Data.List               as L
+import qualified Data.Map                as M
+import qualified Data.Set                as S
+import qualified Data.Maybe              as Y
+
+
+ns :: Namespace
+ns = Namespace "hydra.eval.lib.equality"
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInNamespace ns
+
+module_ :: Module
+module_ = Module ns elements
+    []
+    kernelTypesNamespaces $
+    Just ("Evaluation-level implementations of Equality functions for the Hydra interpreter.")
+  where
+    elements = [
+      toTermDefinition identity_,
+      toTermDefinition max_,
+      toTermDefinition min_]
+
+-- | Interpreter-friendly identity function.
+-- identity x = x
+identity_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+identity_ = define "identity" $
+  doc "Interpreter-friendly identity function." $
+  "cx" ~> "g" ~>
+  "x" ~>
+  right $ var "x"
+
+-- | Interpreter-friendly max.
+-- max x y = ifElse (gte x y) x y
+max_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+max_ = define "max" $
+  doc "Interpreter-friendly max." $
+  "cx" ~> "g" ~>
+  "x" ~> "y" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
+        (Core.termApplication $ Core.application
+          (Core.termApplication $ Core.application
+            (Core.termFunction $ Core.functionPrimitive $ encodedName _equality_gte)
+            (var "x"))
+          (var "y")))
+      (var "x"))
+    (var "y")
+
+-- | Interpreter-friendly min.
+-- min x y = ifElse (lte x y) x y
+min_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+min_ = define "min" $
+  doc "Interpreter-friendly min." $
+  "cx" ~> "g" ~>
+  "x" ~> "y" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
+        (Core.termApplication $ Core.application
+          (Core.termApplication $ Core.application
+            (Core.termFunction $ Core.functionPrimitive $ encodedName _equality_lte)
+            (var "x"))
+          (var "y")))
+      (var "x"))
+    (var "y")
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Flows.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Flows.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Eval/Lib/Flows.hs
+++ /dev/null
@@ -1,420 +0,0 @@
-
-module Hydra.Sources.Eval.Lib.Flows where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors     as Accessors
-import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
-import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
-import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
-import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps      as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math      as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes    as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs     as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets      as Sets
-import           Hydra.Dsl.Meta.Lib.Strings   as Strings
-import qualified Hydra.Dsl.Literals      as Literals
-import qualified Hydra.Dsl.LiteralTypes  as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base     as MetaBase
-import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
-import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
-import           Hydra.Dsl.Meta.Phantoms as Phantoms
-import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
-import qualified Hydra.Dsl.Meta.Testing       as Testing
-import qualified Hydra.Dsl.Terms         as Terms
-import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
-import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
-import qualified Hydra.Dsl.Meta.Variants      as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++), map)
-import qualified Data.Int                as I
-import qualified Data.List               as L
-import qualified Data.Map                as M
-import qualified Data.Set                as S
-import qualified Data.Maybe              as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
-import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
-
-
-ns :: Namespace
-ns = Namespace "hydra.eval.lib.flows"
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInNamespace ns
-
-module_ :: Module
-module_ = Module ns elements
-    [ExtractCore.ns, Monads.ns, ShowCore.ns]
-    kernelTypesNamespaces $
-    Just ("Evaluation-level implementations of Flow functions for the Hydra interpreter.")
-  where
-    elements = [
-      toBinding apply_,
-      toBinding bind_,
-      toBinding foldl_,
-      toBinding map_,
-      toBinding mapElems_,
-      toBinding mapKeys_,
-      toBinding mapList_,
-      toBinding mapMaybe_,
-      toBinding mapSet_,
-      toBinding withDefault_]
-
--- | Interpreter-friendly applicative apply for Flow.
--- apply flowFun flowArg: applies the function inside flowFun to the value inside flowArg.
-apply_ :: TBinding (Term -> Term -> Flow s Term)
-apply_ = define "apply" $
-  doc "Interpreter-friendly applicative apply for Flow." $
-  "flowFun" ~> "flowArg" ~>
-  -- Build: flowFun >>= \f -> flowArg >>= \x -> pure (f x)
-  produce $ Core.termApplication $ Core.application
-    (Core.termApplication $ Core.application
-      (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_bind)
-      (var "flowFun"))
-    (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "f") nothing $
-      Core.termApplication $ Core.application
-        (Core.termApplication $ Core.application
-          (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_bind)
-          (var "flowArg"))
-        (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "x") nothing $
-          Core.termApplication $ Core.application
-            (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_pure)
-            (Core.termApplication $ Core.application
-              (Core.termVariable $ wrap _Name $ string "f")
-              (Core.termVariable $ wrap _Name $ string "x"))))
-
--- | Interpreter-friendly monadic bind for Flow.
--- Pattern matches on the flow term to extract the wrapped function,
--- then builds a new Flow that sequences the computation.
-bind_ :: TBinding (Term -> Term -> Flow s Term)
-bind_ = define "bind" $
-  doc "Interpreter-friendly monadic bind for Flow." $
-  "flowTerm" ~> "funTerm" ~>
-  -- Pattern match on flowTerm to see if it's a TermWrap (Flow)
-  cases _Term (var "flowTerm")
-    (Just (Monads.unexpected @@ string "flow term" @@ (ShowCore.term @@ var "flowTerm"))) [
-    _Term_wrap>>: "wrappedTerm" ~>
-      "innerFun" <~ Core.wrappedTermBody (var "wrappedTerm") $
-      produce $ Core.termWrap $ Core.wrappedTerm
-        (wrap _Name $ string "hydra.compute.Flow")
-        (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "s") nothing $
-          Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "t") nothing $
-            -- Build: let fs = innerFun s t
-            --        in maybe (FlowState Nothing fs.state fs.trace)
-            --                 (\v -> unwrap (funTerm v) fs.state fs.trace)
-            --                 fs.value
-            Core.termApplication $ Core.application
-              (Core.termApplication $ Core.application
-                (Core.termApplication $ Core.application
-                  (Core.termFunction $ Core.functionPrimitive $ encodedName _maybes_maybe)
-                  -- default (Nothing): return FlowState with Nothing
-                  (Core.termRecord $ Core.record (wrap _Name $ string "hydra.compute.FlowState") $
-                    list [
-                      Core.field (wrap _Name $ string "value") (Core.termMaybe nothing),
-                      Core.field (wrap _Name $ string "state") (projectFs (string "state")),
-                      Core.field (wrap _Name $ string "trace") (projectFs (string "trace"))]))
-                -- Just case: \v -> unwrap (funTerm v) fs.state fs.trace
-                (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "v") nothing $
-                  Core.termApplication $ Core.application
-                    (Core.termApplication $ Core.application
-                      (Core.termFunction $ Core.functionElimination $ Core.eliminationWrap $ wrap _Name $ string "hydra.compute.Flow")
-                      (Core.termApplication $ Core.application (var "funTerm") (Core.termVariable $ wrap _Name $ string "v")))
-                    (Core.termApplication $ Core.application
-                      (projectFs (string "state"))
-                      (projectFs (string "trace")))))
-              -- fs.value
-              (projectFs (string "value")))]
-  where
-    -- Run the inner function to get FlowState: innerFun s t
-    runFlow :: TTerm Term
-    runFlow = Core.termApplication $ Core.application
-      (Core.termApplication $ Core.application
-        (var "innerFun")
-        (Core.termVariable $ wrap _Name $ string "s"))
-      (Core.termVariable $ wrap _Name $ string "t")
-    -- Project a field from the FlowState
-    projectFs :: TTerm String -> TTerm Term
-    projectFs fieldName = Core.termApplication $ Core.application
-      (Core.termFunction $ Core.functionElimination $ Core.eliminationRecord $ Core.projection
-        (wrap _Name $ string "hydra.compute.FlowState")
-        (wrap _Name fieldName))
-      runFlow
-
--- | Interpreter-friendly foldl for Flow.
--- foldl funTerm initTerm listTerm: folds over the list with Flow effects.
-foldl_ :: TBinding (Term -> Term -> Term -> Flow s Term)
-foldl_ = define "foldl" $
-  doc "Interpreter-friendly foldl for Flow." $
-  "funTerm" ~> "initTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
-  -- Build: fold over elements using bind
-  -- foldl f init [e1,e2,...] = bind (f init e1) (\acc1 -> bind (f acc1 e2) (\acc2 -> ...))
-  produce $ Lists.foldl
-    ("acc" ~> "el" ~>
-      Core.termApplication $ Core.application
-        (Core.termApplication $ Core.application
-          (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_bind)
-          (var "acc"))
-        (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "accVal") nothing $
-          Core.termApplication $ Core.application
-            (Core.termApplication $ Core.application (var "funTerm") (Core.termVariable $ wrap _Name $ string "accVal"))
-            (var "el")))
-    (Core.termApplication $ Core.application
-      (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_pure)
-      (var "initTerm"))
-    (var "elements")
-
--- | Interpreter-friendly functor map for Flow.
--- map funTerm flowTerm: applies funTerm to the value inside flowTerm.
-map_ :: TBinding (Term -> Term -> Flow s Term)
-map_ = define "map" $
-  doc "Interpreter-friendly functor map for Flow." $
-  "funTerm" ~> "flowTerm" ~>
-  -- Pattern match on flowTerm to see if it's a TermWrap (Flow)
-  cases _Term (var "flowTerm")
-    (Just (Monads.unexpected @@ string "flow term" @@ (ShowCore.term @@ var "flowTerm"))) [
-    _Term_wrap>>: "wrappedTerm" ~>
-      "innerFun" <~ Core.wrappedTermBody (var "wrappedTerm") $
-      produce $ Core.termWrap $ Core.wrappedTerm
-        (wrap _Name $ string "hydra.compute.Flow")
-        (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "s") nothing $
-          Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "t") nothing $
-            -- Build: let fs = innerFun s t
-            --        in FlowState (map (\v -> funTerm v) fs.value) fs.state fs.trace
-            Core.termRecord $ Core.record (wrap _Name $ string "hydra.compute.FlowState") $
-              list [
-                Core.field (wrap _Name $ string "value")
-                  (Core.termApplication $ Core.application
-                    (Core.termApplication $ Core.application
-                      (Core.termFunction $ Core.functionPrimitive $ encodedName _maybes_map)
-                      (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "v") nothing $
-                        Core.termApplication $ Core.application (var "funTerm") (Core.termVariable $ wrap _Name $ string "v")))
-                    (projectFsMap (string "value"))),
-                Core.field (wrap _Name $ string "state") (projectFsMap (string "state")),
-                Core.field (wrap _Name $ string "trace") (projectFsMap (string "trace"))])]
-  where
-    -- Run the inner function to get FlowState: innerFun s t
-    runFlowMap :: TTerm Term
-    runFlowMap = Core.termApplication $ Core.application
-      (Core.termApplication $ Core.application
-        (var "innerFun")
-        (Core.termVariable $ wrap _Name $ string "s"))
-      (Core.termVariable $ wrap _Name $ string "t")
-    -- Project a field from the FlowState
-    projectFsMap :: TTerm String -> TTerm Term
-    projectFsMap fieldName = Core.termApplication $ Core.application
-      (Core.termFunction $ Core.functionElimination $ Core.eliminationRecord $ Core.projection
-        (wrap _Name $ string "hydra.compute.FlowState")
-        (wrap _Name fieldName))
-      runFlowMap
-
--- | Interpreter-friendly mapElems for Map with Flow.
--- mapElems funTerm mapTerm: applies funTerm to each value in the map.
-mapElems_ :: TBinding (Term -> Term -> Flow s Term)
-mapElems_ = define "mapElems" $
-  doc "Interpreter-friendly mapElems for Map with Flow." $
-  "funTerm" ~> "mapTerm" ~>
-  cases _Term (var "mapTerm")
-    (Just (Monads.unexpected @@ string "map value" @@ (ShowCore.term @@ var "mapTerm"))) [
-    _Term_map>>: "m" ~>
-      "pairs" <~ Maps.toList (var "m") $
-      -- Build: sequence (map (\(k,v) -> map (\v' -> (k, v')) (funTerm v)) pairs) >>= fromList
-      produce $ Core.termApplication $ Core.application
-        (Core.termApplication $ Core.application
-          (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_bind)
-          (Core.termApplication $ Core.application
-            (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_sequence)
-            (Core.termList $ Lists.map
-              ("p" ~>
-                "k" <~ Pairs.first (var "p") $
-                "v" <~ Pairs.second (var "p") $
-                Core.termApplication $ Core.application
-                  (Core.termApplication $ Core.application
-                    (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_map)
-                    (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "v'") nothing $
-                      Core.termPair $ pair (var "k") (Core.termVariable $ wrap _Name $ string "v'")))
-                  (Core.termApplication $ Core.application (var "funTerm") (var "v")))
-              (var "pairs"))))
-        (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "newPairs") nothing $
-          Core.termApplication $ Core.application
-            (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_pure)
-            (Core.termApplication $ Core.application
-              (Core.termFunction $ Core.functionPrimitive $ encodedName _maps_fromList)
-              (Core.termVariable $ wrap _Name $ string "newPairs")))]
-
--- | Interpreter-friendly mapKeys for Map with Flow.
--- mapKeys funTerm mapTerm: applies funTerm to each key in the map.
-mapKeys_ :: TBinding (Term -> Term -> Flow s Term)
-mapKeys_ = define "mapKeys" $
-  doc "Interpreter-friendly mapKeys for Map with Flow." $
-  "funTerm" ~> "mapTerm" ~>
-  cases _Term (var "mapTerm")
-    (Just (Monads.unexpected @@ string "map value" @@ (ShowCore.term @@ var "mapTerm"))) [
-    _Term_map>>: "m" ~>
-      "pairs" <~ Maps.toList (var "m") $
-      -- Build: sequence (map (\(k,v) -> map (\k' -> (k', v)) (funTerm k)) pairs) >>= fromList
-      produce $ Core.termApplication $ Core.application
-        (Core.termApplication $ Core.application
-          (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_bind)
-          (Core.termApplication $ Core.application
-            (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_sequence)
-            (Core.termList $ Lists.map
-              ("p" ~>
-                "k" <~ Pairs.first (var "p") $
-                "v" <~ Pairs.second (var "p") $
-                Core.termApplication $ Core.application
-                  (Core.termApplication $ Core.application
-                    (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_map)
-                    (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "k'") nothing $
-                      Core.termPair $ pair (Core.termVariable $ wrap _Name $ string "k'") (var "v")))
-                  (Core.termApplication $ Core.application (var "funTerm") (var "k")))
-              (var "pairs"))))
-        (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "newPairs") nothing $
-          Core.termApplication $ Core.application
-            (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_pure)
-            (Core.termApplication $ Core.application
-              (Core.termFunction $ Core.functionPrimitive $ encodedName _maps_fromList)
-              (Core.termVariable $ wrap _Name $ string "newPairs")))]
-
--- | Interpreter-friendly mapList for List with Flow (traverse).
--- mapList funTerm listTerm: applies funTerm to each element, collecting results.
-mapList_ :: TBinding (Term -> Term -> Flow s Term)
-mapList_ = define "mapList" $
-  doc "Interpreter-friendly mapList for List with Flow." $
-  "funTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
-  -- Build: sequence (map funTerm elements)
-  produce $ Core.termApplication $ Core.application
-    (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_sequence)
-    (Core.termList $ Lists.map
-      ("el" ~> Core.termApplication $ Core.application (var "funTerm") (var "el"))
-      (var "elements"))
-
--- | Interpreter-friendly mapMaybe for Maybe with Flow (traverse).
--- mapMaybe funTerm maybeTerm: applies funTerm if Just, returns Nothing otherwise.
-mapMaybe_ :: TBinding (Term -> Term -> Flow s Term)
-mapMaybe_ = define "mapMaybe" $
-  doc "Interpreter-friendly mapMaybe for Maybe with Flow." $
-  "funTerm" ~> "maybeTerm" ~>
-  cases _Term (var "maybeTerm")
-    (Just (Monads.unexpected @@ string "optional value" @@ (ShowCore.term @@ var "maybeTerm"))) [
-    _Term_maybe>>: "m" ~>
-      -- Use ifElse with term-level lambdas to delay evaluation (same pattern as Maybes)
-      produce $ Core.termApplication $ Core.application
-        (Core.termApplication $ Core.application
-          (Core.termApplication $ Core.application
-            (Core.termApplication $ Core.application
-              (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
-              -- isNothing m
-              (Core.termApplication $ Core.application
-                (Core.termFunction $ Core.functionPrimitive $ encodedName _maybes_isNothing)
-                (Core.termMaybe $ var "m")))
-            -- Lambda returning pure Nothing (delayed)
-            (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "_") nothing $
-              Core.termApplication $ Core.application
-                (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_pure)
-                (Core.termMaybe nothing)))
-          -- Lambda returning map Just (funTerm (fromJust m)) (delayed)
-          (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "_") nothing $
-            Core.termApplication $ Core.application
-              (Core.termApplication $ Core.application
-                (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_map)
-                (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "x") nothing $
-                  Core.termMaybe $ just $ Core.termVariable $ wrap _Name $ string "x"))
-              (Core.termApplication $ Core.application
-                (var "funTerm")
-                (Core.termApplication $ Core.application
-                  (Core.termFunction $ Core.functionPrimitive $ encodedName _maybes_fromJust)
-                  (Core.termMaybe $ var "m")))))
-        Core.termUnit]
-
--- | Interpreter-friendly mapSet for Set with Flow (traverse).
--- mapSet funTerm setTerm: applies funTerm to each element, collecting results.
-mapSet_ :: TBinding (Term -> Term -> Flow s Term)
-mapSet_ = define "mapSet" $
-  doc "Interpreter-friendly mapSet for Set with Flow." $
-  "funTerm" ~> "setTerm" ~>
-  "elements" <<~ ExtractCore.set @@ var "setTerm" $
-  -- Build: map fromList (sequence (map funTerm (toList elements)))
-  produce $ Core.termApplication $ Core.application
-    (Core.termApplication $ Core.application
-      (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_map)
-      (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_fromList))
-    (Core.termApplication $ Core.application
-      (Core.termFunction $ Core.functionPrimitive $ encodedName _flows_sequence)
-      (Core.termList $ Lists.map
-        ("el" ~> Core.termApplication $ Core.application (var "funTerm") (var "el"))
-        (Sets.toList $ var "elements")))
-
--- | Interpreter-friendly withDefault for Flow (try/catch).
--- withDefault fallbackTerm flowTerm: returns flowTerm's result if it succeeds,
--- otherwise returns fallbackTerm wrapped in pure.
-withDefault_ :: TBinding (Term -> Term -> Flow s Term)
-withDefault_ = define "withDefault" $
-  doc "Interpreter-friendly withDefault for Flow." $
-  "fallbackTerm" ~> "flowTerm" ~>
-  -- Pattern match on flowTerm to see if it's a TermWrap (Flow)
-  cases _Term (var "flowTerm")
-    (Just (Monads.unexpected @@ string "flow term" @@ (ShowCore.term @@ var "flowTerm"))) [
-    _Term_wrap>>: "wrappedTerm" ~>
-      "innerFun" <~ Core.wrappedTermBody (var "wrappedTerm") $
-      produce $ Core.termWrap $ Core.wrappedTerm
-        (wrap _Name $ string "hydra.compute.Flow")
-        (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "s") nothing $
-          Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "t") nothing $
-            -- Build: let fs = innerFun s t
-            --        in maybe (FlowState (Just fallback) s t)  -- use original s, t on failure
-            --                 (\_ -> fs)                        -- use result on success
-            --                 fs.value
-            Core.termApplication $ Core.application
-              (Core.termApplication $ Core.application
-                (Core.termApplication $ Core.application
-                  (Core.termFunction $ Core.functionPrimitive $ encodedName _maybes_maybe)
-                  -- default (Nothing): return FlowState with fallback, original state/trace
-                  (Core.termRecord $ Core.record (wrap _Name $ string "hydra.compute.FlowState") $
-                    list [
-                      Core.field (wrap _Name $ string "value") (Core.termMaybe $ just $ var "fallbackTerm"),
-                      Core.field (wrap _Name $ string "state") (Core.termVariable $ wrap _Name $ string "s"),
-                      Core.field (wrap _Name $ string "trace") (Core.termVariable $ wrap _Name $ string "t")]))
-                -- Just case: \_ -> fs (return the original FlowState)
-                (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "_") nothing $
-                  runFlowWd))
-              -- fs.value
-              (projectFsWd (string "value")))]
-  where
-    -- Run the inner function to get FlowState: innerFun s t
-    runFlowWd :: TTerm Term
-    runFlowWd = Core.termApplication $ Core.application
-      (Core.termApplication $ Core.application
-        (var "innerFun")
-        (Core.termVariable $ wrap _Name $ string "s"))
-      (Core.termVariable $ wrap _Name $ string "t")
-    -- Project a field from the FlowState
-    projectFsWd :: TTerm String -> TTerm Term
-    projectFsWd fieldName = Core.termApplication $ Core.application
-      (Core.termFunction $ Core.functionElimination $ Core.eliminationRecord $ Core.projection
-        (wrap _Name $ string "hydra.compute.FlowState")
-        (wrap _Name fieldName))
-      runFlowWd
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Lists.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Lists.hs
--- a/src/main/haskell/Hydra/Sources/Eval/Lib/Lists.hs
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Lists.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (map)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors     as Accessors
+import qualified Hydra.Dsl.Paths     as Paths
 import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
+import qualified Hydra.Dsl.Ast           as Ast
 import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
 import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
+import qualified Hydra.Dsl.Json.Model          as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
@@ -34,17 +31,17 @@
 import qualified Hydra.Dsl.Meta.Base     as MetaBase
 import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
 import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
+import qualified Hydra.Dsl.Module        as Module
 import           Hydra.Dsl.Meta.Phantoms as Phantoms
 import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
 import qualified Hydra.Dsl.Meta.Testing       as Testing
 import qualified Hydra.Dsl.Terms         as Terms
 import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
+import qualified Hydra.Dsl.Topology      as Topology
 import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
 import qualified Hydra.Dsl.Meta.Variants      as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++), map)
@@ -54,11 +51,12 @@
 import qualified Data.Set                as S
 import qualified Data.Maybe              as Y
 
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
+import qualified Hydra.Sources.Kernel.Terms.Reduction as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
 
-
 ns :: Namespace
 ns = Namespace "hydra.eval.lib.lists"
 
@@ -67,57 +65,84 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [ExtractCore.ns, Monads.ns, ShowCore.ns]
+    [ExtractCore.ns, Reduction.ns, ShowCore.ns]
     kernelTypesNamespaces $
     Just ("Evaluation-level implementations of List functions for the Hydra interpreter.")
   where
     elements = [
-      toBinding apply_,
-      toBinding bind_,
-      toBinding dropWhile_,
-      toBinding filter_,
-      toBinding find_,
-      toBinding foldl_,
-      toBinding map_,
-      toBinding partition_,
-      toBinding sortOn_,
-      toBinding span_,
-      toBinding zipWith_]
+      toTermDefinition apply_,
+      toTermDefinition bind_,
+      toTermDefinition concat2_,
+      toTermDefinition dropWhile_,
+      toTermDefinition elem_,
+      toTermDefinition filter_,
+      toTermDefinition find_,
+      toTermDefinition foldl_,
+      toTermDefinition foldr_,
+      toTermDefinition group_,
+      toTermDefinition intercalate_,
+      toTermDefinition intersperse_,
+      toTermDefinition map_,
+      toTermDefinition nub_,
+      toTermDefinition partition_,
+      toTermDefinition pure_,
+      toTermDefinition replicate_,
+      toTermDefinition safeHead_,
+      toTermDefinition singleton_,
+      toTermDefinition sort_,
+      toTermDefinition sortOn_,
+      toTermDefinition span_,
+      toTermDefinition zipWith_]
 
 -- | Interpreter-friendly applicative apply for List terms.
 -- Applies each function in funsTerm to each argument in argsTerm.
-apply_ :: TBinding (Term -> Term -> Flow s Term)
+apply_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 apply_ = define "apply" $
   doc "Interpreter-friendly applicative apply for List terms." $
+  "cx" ~> "g" ~>
   "funsTerm" ~> "argsTerm" ~>
-  "funs" <<~ ExtractCore.list @@ var "funsTerm" $
-  "arguments" <<~ ExtractCore.list @@ var "argsTerm" $
+  "funs" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "funsTerm") $
+  "arguments" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "argsTerm") $
   "applyOne" <~ ("f" ~> Lists.map
     ("arg" ~> Core.termApplication $ Core.application (var "f") (var "arg"))
     (var "arguments")) $
-  produce $ Core.termList $ Lists.concat $ Lists.map (var "applyOne") (var "funs")
+  right $ Core.termList $ Lists.concat $ Lists.map (var "applyOne") (var "funs")
 
 -- | Interpreter-friendly monadic bind for List terms.
 -- Applies funTerm to each element and concatenates the results.
-bind_ :: TBinding (Term -> Term -> Flow s Term)
+bind_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 bind_ = define "bind" $
   doc "Interpreter-friendly monadic bind for List terms." $
+  "cx" ~> "g" ~>
   "listTerm" ~> "funTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
-  produce $ Core.termApplication $ Core.application
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  right $ Core.termApplication $ Core.application
     (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_concat)
     (Core.termList $ Lists.map
       ("el" ~> Core.termApplication $ Core.application (var "funTerm") (var "el"))
       (var "elements"))
 
+-- | Interpreter-friendly concat2 for List terms.
+-- Concatenates two lists.
+concat2_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+concat2_ = define "concat2" $
+  doc "Interpreter-friendly concat2 for List terms." $
+  "cx" ~> "g" ~>
+  "list1" ~> "list2" ~>
+  -- Build: concat [list1, list2]
+  right $ Core.termApplication $ Core.application
+    (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_concat)
+    (Core.termList $ list [var "list1", var "list2"])
+
 -- | Interpreter-friendly dropWhile for List terms.
 -- Drops elements from the front while predTerm returns true.
-dropWhile_ :: TBinding (Term -> Term -> Flow s Term)
+dropWhile_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 dropWhile_ = define "dropWhile" $
   doc "Interpreter-friendly dropWhile for List terms." $
+  "cx" ~> "g" ~>
   "predTerm" ~> "listTerm" ~>
   -- Build: snd (span predTerm listTerm) - delegate to span primitive
-  produce $ Core.termApplication $ Core.application
+  right $ Core.termApplication $ Core.application
     (Core.termFunction $ Core.functionPrimitive $ encodedName _pairs_second)
     (Core.termApplication $ Core.application
       (Core.termApplication $ Core.application
@@ -127,13 +152,14 @@
 
 -- | Interpreter-friendly filter for List terms.
 -- Keeps elements where predTerm returns true.
-filter_ :: TBinding (Term -> Term -> Flow s Term)
+filter_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 filter_ = define "filter" $
   doc "Interpreter-friendly filter for List terms." $
+  "cx" ~> "g" ~>
   "predTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
   -- Build: concat (map (\el -> ifElse (pred el) [el] []) elements)
-  produce $ Core.termApplication $ Core.application
+  right $ Core.termApplication $ Core.application
     (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_concat)
     (Core.termList $ Lists.map
       ("el" ~> Core.termApplication $ Core.application
@@ -147,12 +173,13 @@
 
 -- | Interpreter-friendly find for List terms.
 -- Returns the first element where predTerm returns true, or Nothing if none found.
-find_ :: TBinding (Term -> Term -> Flow s Term)
+find_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 find_ = define "find" $
   doc "Interpreter-friendly find for List terms." $
+  "cx" ~> "g" ~>
   "predTerm" ~> "listTerm" ~>
   -- Build: safeHead (filter predTerm listTerm) - delegate to filter and safeHead
-  produce $ Core.termApplication $ Core.application
+  right $ Core.termApplication $ Core.application
     (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_safeHead)
     (Core.termApplication $ Core.application
       (Core.termApplication $ Core.application
@@ -162,30 +189,59 @@
 
 -- | Interpreter-friendly left fold for List terms.
 -- Folds from the left: foldl f init [e1,e2,e3] = f (f (f init e1) e2) e3
-foldl_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+-- Each step is reduced through the interpreter so that the accumulator is always a value.
+foldl_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 foldl_ = define "foldl" $
   doc "Interpreter-friendly left fold for List terms." $
+  "cx" ~> "g" ~>
   "funTerm" ~> "initTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
-  -- Build nested applications: f (f (f init e1) e2) e3
-  produce $ Lists.foldl
-    ("acc" ~> "el" ~> Core.termApplication $ Core.application
-      (Core.termApplication $ Core.application (var "funTerm") (var "acc"))
-      (var "el"))
-    (var "initTerm")
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  -- Fold with reduction at each step: reduce f(acc, el) before next iteration.
+  -- The accumulator is Either (InContext Error) Term to thread errors through.
+  Lists.foldl
+    ("acc" ~> "el" ~>
+      Eithers.bind (var "acc") $
+        "reducedAcc" ~>
+          Reduction.reduceTerm @@ var "cx" @@ var "g" @@ MetaLiterals.boolean True @@
+            (Core.termApplication $ Core.application
+              (Core.termApplication $ Core.application (var "funTerm") (var "reducedAcc"))
+              (var "el")))
+    (right $ var "initTerm")
     (var "elements")
 
+-- | Interpreter-friendly right fold for List terms.
+-- Folds from the right: foldr f init [e1,e2,e3] = f e1 (f e2 (f e3 init))
+-- Each step is reduced through the interpreter so that the accumulator is always a value.
+foldr_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
+foldr_ = define "foldr" $
+  doc "Interpreter-friendly right fold for List terms." $
+  "cx" ~> "g" ~>
+  "funTerm" ~> "initTerm" ~> "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  -- Fold with reduction at each step
+  Lists.foldr
+    ("el" ~> "acc" ~>
+      Eithers.bind (var "acc") $
+        "reducedAcc" ~>
+          Reduction.reduceTerm @@ var "cx" @@ var "g" @@ MetaLiterals.boolean True @@
+            (Core.termApplication $ Core.application
+              (Core.termApplication $ Core.application (var "funTerm") (var "el"))
+              (var "reducedAcc")))
+    (right $ var "initTerm")
+    (var "elements")
+
 -- | Interpreter-friendly map for List terms.
 -- Applies funTerm to each element of listTerm.
 -- Note: builds result directly using foldl to avoid recursive primitive calls.
-map_ :: TBinding (Term -> Term -> Flow s Term)
+map_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 map_ = define "map" $
   doc "Interpreter-friendly map for List terms." $
+  "cx" ~> "g" ~>
   "funTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
   -- Build the mapped list by folding over elements and accumulating applications
   -- This avoids calling lists.map recursively
-  produce $ Core.termList $ Lists.reverse $ Lists.foldl
+  right $ Core.termList $ Lists.reverse $ Lists.foldl
     ("acc" ~> "el" ~> Lists.cons
       (Core.termApplication $ Core.application (var "funTerm") (var "el"))
       (var "acc"))
@@ -195,11 +251,12 @@
 -- | Interpreter-friendly partition for List terms.
 -- Partitions elements into (satisfying predicate, not satisfying predicate).
 -- Unlike span, partition checks ALL elements, not just the prefix.
-partition_ :: TBinding (Term -> Term -> Flow s Term)
+partition_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 partition_ = define "partition" $
   doc "Interpreter-friendly partition for List terms." $
+  "cx" ~> "g" ~>
   "predTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
   -- State: (yeses, nos) - two accumulators
   -- Initial: ([], [])
   -- Step: ifElse (pred el) (append yeses [el], nos) (yeses, append nos [el])
@@ -242,20 +299,21 @@
     (var "initialState")
     (var "elements")) $
   -- Return the final state directly (it's already a pair)
-  produce $ var "finalState"
+  right $ var "finalState"
 
 -- | Interpreter-friendly sortOn for List terms.
 -- Sorts elements by comparing the results of applying projTerm to each.
 -- Uses insertion sort: for each element, use span to find insertion point.
-sortOn_ :: TBinding (Term -> Term -> Flow s Term)
+sortOn_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 sortOn_ = define "sortOn" $
   doc "Interpreter-friendly sortOn for List terms." $
+  "cx" ~> "g" ~>
   "projTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
   -- Build: foldl (\sorted x -> insert x sorted) [] elements
   -- where insert x sorted = let (before, after) = span (\y -> lte (proj y) (proj x)) sorted
   --                         in concat [before, [x], after]
-  produce $ Lists.foldl
+  right $ Lists.foldl
     ("sorted" ~> "x" ~>
       -- Build the split using span with predicate: \y -> lte (proj y) (proj x)
       "splitResult" <~ (Core.termApplication $ Core.application
@@ -293,11 +351,12 @@
 -- | Interpreter-friendly span for List terms.
 -- Splits the list into (takeWhile pred list, dropWhile pred list).
 -- Uses foldl with state ((stillTaking, left), right) to track the split point.
-span_ :: TBinding (Term -> Term -> Flow s Term)
+span_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 span_ = define "span" $
   doc "Interpreter-friendly span for List terms." $
+  "cx" ~> "g" ~>
   "predTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
   -- State: ((taking, left), right) as nested pairs
   -- Initial: ((true, []), [])
   -- Step: ifElse (and taking (pred el))
@@ -358,7 +417,7 @@
     (var "initialState")
     (var "elements")) $
   -- Extract result: (snd (fst finalState), snd finalState)
-  produce $ Core.termPair $ pair
+  right $ Core.termPair $ pair
     (Core.termApplication $ Core.application
       (Core.termFunction $ Core.functionPrimitive $ encodedName _pairs_second)
       (Core.termApplication $ Core.application
@@ -370,14 +429,15 @@
 
 -- | Interpreter-friendly zipWith for List terms.
 -- Applies funTerm to corresponding pairs of elements.
-zipWith_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+zipWith_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 zipWith_ = define "zipWith" $
   doc "Interpreter-friendly zipWith for List terms." $
+  "cx" ~> "g" ~>
   "funTerm" ~> "listTerm1" ~> "listTerm2" ~>
-  "elements1" <<~ ExtractCore.list @@ var "listTerm1" $
-  "elements2" <<~ ExtractCore.list @@ var "listTerm2" $
+  "elements1" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm1") $
+  "elements2" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm2") $
   -- Build: [f a1 b1, f a2 b2, ...]
-  produce $ Core.termList $ Lists.map
+  right $ Core.termList $ Lists.map
     ("p" ~>
       "a" <~ Pairs.first (var "p") $
       "b" <~ Pairs.second (var "p") $
@@ -385,3 +445,216 @@
         (Core.termApplication $ Core.application (var "funTerm") (var "a"))
         (var "b"))
     (Lists.zip (var "elements1") (var "elements2"))
+
+-- | Interpreter-friendly elem for List terms.
+-- Tests whether an element is in the list: elem x xs = isJust (find (equal x) xs)
+elem_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+elem_ = define "elem" $
+  doc "Interpreter-friendly elem for List terms." $
+  "cx" ~> "g" ~>
+  "x" ~> "listTerm" ~>
+  -- Build: isJust (find (equal x) listTerm)
+  right $ Core.termApplication $ Core.application
+    (Core.termFunction $ Core.functionPrimitive $ encodedName _maybes_isJust)
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_find)
+        (Core.termApplication $ Core.application
+          (Core.termFunction $ Core.functionPrimitive $ encodedName _equality_equal)
+          (var "x")))
+      (var "listTerm"))
+
+-- | Interpreter-friendly group for List terms.
+-- Groups consecutive equal elements: group [1,1,2,2,2,3] = [[1,1],[2,2,2],[3]]
+-- Returns a term that delegates to the lists.foldl primitive with a term-level lambda.
+-- The interpreter's native foldl uses functionWithReduce, which reduces each step
+-- via reduceTerm — so the accumulator is always a value, not an unreduced expression.
+-- Uses safeHead+maybe instead of null+head+ifElse to avoid eager evaluation of head on empty lists.
+group_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+group_ = define "group" $
+  doc "Interpreter-friendly group for List terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  right $ Core.termApplication $ Core.application flushFn foldExpr
+  where
+    -- Helper: build a primitive application
+    prim1 n x = Core.termApplication $ Core.application (Core.termFunction $ Core.functionPrimitive $ encodedName n) x
+    prim2 n x y = Core.termApplication $ Core.application (Core.termApplication $ Core.application (Core.termFunction $ Core.functionPrimitive $ encodedName n) x) y
+    prim3 n x y z = Core.termApplication $ Core.application (Core.termApplication $ Core.application (Core.termApplication $ Core.application (Core.termFunction $ Core.functionPrimitive $ encodedName n) x) y) z
+    -- Helper: term-level variable
+    tv s = Core.termVariable $ wrap _Name $ string s
+    -- Helper: term-level lambda
+    lam s body = Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string s) nothing body
+
+    -- stepFn: \acc el -> maybe ([el], snd acc) (\h -> ifElse (equal el h) (extend) (flush)) (safeHead (fst acc))
+    stepFn = lam "acc" $ lam "el" $
+      prim3 _maybes_maybe
+        -- Nothing (empty group): start new with [el]
+        (Core.termPair $ pair
+          (Core.termList $ list [tv "el"])
+          (prim1 _pairs_second (tv "acc")))
+        -- Just h: check equality
+        (lam "h" $
+          prim3 _logic_ifElse
+            (prim2 _equality_equal (tv "el") (tv "h"))
+            -- Same: extend current group
+            (Core.termPair $ pair
+              (prim2 _lists_concat2 (prim1 _pairs_first (tv "acc")) (Core.termList $ list [tv "el"]))
+              (prim1 _pairs_second (tv "acc")))
+            -- Different: flush and start new
+            (Core.termPair $ pair
+              (Core.termList $ list [tv "el"])
+              (prim2 _lists_concat2
+                (prim1 _pairs_second (tv "acc"))
+                (Core.termList $ list [prim1 _pairs_first (tv "acc")]))))
+        -- safeHead (fst acc)
+        (prim1 _lists_safeHead (prim1 _pairs_first (tv "acc")))
+
+    initState = Core.termPair $ pair
+      (Core.termList $ list ([] :: [TTerm Term]))
+      (Core.termList $ list ([] :: [TTerm Term]))
+
+    foldExpr = prim3 _lists_foldl stepFn initState (var "listTerm")
+
+    -- Flush: \foldResult -> ifElse (null (fst r)) (snd r) (concat2 (snd r) [fst r])
+    flushFn = lam "foldResult" $
+      prim3 _logic_ifElse
+        (prim1 _lists_null (prim1 _pairs_first (tv "foldResult")))
+        (prim1 _pairs_second (tv "foldResult"))
+        (prim2 _lists_concat2
+          (prim1 _pairs_second (tv "foldResult"))
+          (Core.termList $ list [prim1 _pairs_first (tv "foldResult")]))
+
+-- | Interpreter-friendly intercalate for List terms.
+-- intercalate sep xss = concat (intersperse sep xss)
+intercalate_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+intercalate_ = define "intercalate" $
+  doc "Interpreter-friendly intercalate for List terms." $
+  "cx" ~> "g" ~>
+  "sep" ~> "listsTerm" ~>
+  -- Build: concat (intersperse sep listsTerm)
+  right $ Core.termApplication $ Core.application
+    (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_concat)
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_intersperse)
+        (var "sep"))
+      (var "listsTerm"))
+
+-- | Interpreter-friendly intersperse for List terms.
+-- intersperse sep [a,b,c] = [a,sep,b,sep,c]
+intersperse_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+intersperse_ = define "intersperse" $
+  doc "Interpreter-friendly intersperse for List terms." $
+  "cx" ~> "g" ~>
+  "sep" ~> "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  right $ Logic.ifElse
+    (Lists.null (var "elements"))
+    (Core.termList $ list ([] :: [TTerm Term]))
+    (Core.termList $ Lists.cons
+      (Lists.head (var "elements"))
+      (Lists.concat $ Lists.map
+        ("el" ~> list [var "sep", var "el"])
+        (Lists.tail (var "elements"))))
+
+-- | Interpreter-friendly nub for List terms.
+-- Removes duplicates using equality. nub xs = foldl (\acc x -> ifElse (elem x acc) acc (concat2 acc [x])) [] xs
+nub_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+nub_ = define "nub" $
+  doc "Interpreter-friendly nub for List terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  -- Build: foldl (\acc x -> ifElse (elem x acc) acc (concat2 acc [x])) [] xs
+  -- This must be entirely at the term level since we need runtime equality checks
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_foldl)
+        -- fold function: \acc x -> ifElse (elem x acc) acc (concat2 acc [x])
+        (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "acc") nothing $
+          Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "x") nothing $
+            Core.termApplication $ Core.application
+              (Core.termApplication $ Core.application
+                (Core.termApplication $ Core.application
+                  (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
+                  (Core.termApplication $ Core.application
+                    (Core.termApplication $ Core.application
+                      (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_elem)
+                      (Core.termVariable $ wrap _Name $ string "x"))
+                    (Core.termVariable $ wrap _Name $ string "acc")))
+                (Core.termVariable $ wrap _Name $ string "acc"))
+              (Core.termApplication $ Core.application
+                (Core.termApplication $ Core.application
+                  (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_concat2)
+                  (Core.termVariable $ wrap _Name $ string "acc"))
+                (Core.termList $ list [Core.termVariable $ wrap _Name $ string "x"]))))
+      -- initial: []
+      (Core.termList $ list ([] :: [TTerm Term])))
+    -- list
+    (var "listTerm")
+
+-- | Interpreter-friendly pure for List terms.
+-- Wraps a single element in a list: pure x = [x]
+pure_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+pure_ = define "pure" $
+  doc "Interpreter-friendly pure for List terms." $
+  "cx" ~> "g" ~>
+  "x" ~>
+  right $ Core.termList $ list [var "x"]
+
+-- | Interpreter-friendly replicate for List terms.
+-- replicate n x = map (const x) (range 0 n)
+replicate_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+replicate_ = define "replicate" $
+  doc "Interpreter-friendly replicate for List terms." $
+  "cx" ~> "g" ~>
+  "n" ~> "x" ~>
+  -- Build: map (\_ -> x) (range 1 n)  -- range is inclusive, so range 1 n has n elements
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_map)
+      (Core.termFunction $ Core.functionLambda $ Core.lambda (wrap _Name $ string "_") nothing $
+        var "x"))
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _math_range)
+        (Core.termLiteral $ Core.literalInteger $ Core.integerValueInt32 $ MetaLiterals.int32 1))
+      (var "n"))
+
+-- | Interpreter-friendly safeHead for List terms.
+-- safeHead xs = if null xs then Nothing else Just (head xs)
+safeHead_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+safeHead_ = define "safeHead" $
+  doc "Interpreter-friendly safeHead for List terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  right $ Logic.ifElse
+    (Lists.null (var "elements"))
+    (Core.termMaybe nothing)
+    (Core.termMaybe $ just $ Lists.head (var "elements"))
+
+-- | Interpreter-friendly singleton for List terms.
+-- singleton x = [x]
+singleton_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+singleton_ = define "singleton" $
+  doc "Interpreter-friendly singleton for List terms." $
+  "cx" ~> "g" ~>
+  "x" ~>
+  right $ Core.termList $ list [var "x"]
+
+-- | Interpreter-friendly sort for List terms.
+-- sort xs = sortOn identity xs
+sort_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+sort_ = define "sort" $
+  doc "Interpreter-friendly sort for List terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  -- Build: sortOn identity listTerm
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_sortOn)
+      (Core.termFunction $ Core.functionPrimitive $ encodedName _equality_identity))
+    (var "listTerm")
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Logic.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Logic.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Logic.hs
@@ -0,0 +1,115 @@
+
+module Hydra.Sources.Eval.Lib.Logic where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths     as Paths
+import qualified Hydra.Dsl.Annotations   as Annotations
+import qualified Hydra.Dsl.Ast           as Ast
+import qualified Hydra.Dsl.Bootstrap     as Bootstrap
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
+import qualified Hydra.Dsl.Meta.Core          as Core
+import qualified Hydra.Dsl.Meta.Graph         as Graph
+import qualified Hydra.Dsl.Json.Model          as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps      as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math      as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes    as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs     as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets      as Sets
+import           Hydra.Dsl.Meta.Lib.Strings   as Strings
+import qualified Hydra.Dsl.Literals      as Literals
+import qualified Hydra.Dsl.LiteralTypes  as LiteralTypes
+import qualified Hydra.Dsl.Meta.Literals as MetaLiterals
+import qualified Hydra.Dsl.Meta.Base     as MetaBase
+import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
+import qualified Hydra.Dsl.Meta.Types    as MetaTypes
+import qualified Hydra.Dsl.Module        as Module
+import           Hydra.Dsl.Meta.Phantoms as Phantoms
+import qualified Hydra.Dsl.Prims         as Prims
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Testing       as Testing
+import qualified Hydra.Dsl.Terms         as Terms
+import qualified Hydra.Dsl.Tests         as Tests
+import qualified Hydra.Dsl.Topology      as Topology
+import qualified Hydra.Dsl.Types         as Types
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
+import qualified Hydra.Dsl.Meta.Variants      as Variants
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                as I
+import qualified Data.List               as L
+import qualified Data.Map                as M
+import qualified Data.Set                as S
+import qualified Data.Maybe              as Y
+
+
+ns :: Namespace
+ns = Namespace "hydra.eval.lib.logic"
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInNamespace ns
+
+module_ :: Module
+module_ = Module ns elements
+    []
+    kernelTypesNamespaces $
+    Just ("Evaluation-level implementations of Logic functions for the Hydra interpreter.")
+  where
+    elements = [
+      toTermDefinition and_,
+      toTermDefinition not_,
+      toTermDefinition or_]
+
+-- | Interpreter-friendly logical AND.
+-- and a b = ifElse a b false
+and_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+and_ = define "and" $
+  doc "Interpreter-friendly logical AND." $
+  "cx" ~> "g" ~>
+  "a" ~> "b" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
+        (var "a"))
+      (var "b"))
+    (Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean False)
+
+-- | Interpreter-friendly logical NOT.
+-- not a = ifElse a false true
+not_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+not_ = define "not" $
+  doc "Interpreter-friendly logical NOT." $
+  "cx" ~> "g" ~>
+  "a" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
+        (var "a"))
+      (Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean False))
+    (Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean True)
+
+-- | Interpreter-friendly logical OR.
+-- or a b = ifElse a true b
+or_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+or_ = define "or" $
+  doc "Interpreter-friendly logical OR." $
+  "cx" ~> "g" ~>
+  "a" ~> "b" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
+        (var "a"))
+      (Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean True))
+    (var "b")
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Maps.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Maps.hs
--- a/src/main/haskell/Hydra/Sources/Eval/Lib/Maps.hs
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Maps.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (map)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors     as Accessors
+import qualified Hydra.Dsl.Paths     as Paths
 import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
+import qualified Hydra.Dsl.Ast           as Ast
 import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
 import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
+import qualified Hydra.Dsl.Json.Model          as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
@@ -33,17 +30,17 @@
 import qualified Hydra.Dsl.Meta.Base     as MetaBase
 import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
 import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
+import qualified Hydra.Dsl.Module        as Module
 import           Hydra.Dsl.Meta.Phantoms as Phantoms
 import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
 import qualified Hydra.Dsl.Meta.Testing       as Testing
 import qualified Hydra.Dsl.Terms         as Terms
 import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
+import qualified Hydra.Dsl.Topology      as Topology
 import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
 import qualified Hydra.Dsl.Meta.Variants      as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++), map)
@@ -54,7 +51,6 @@
 import qualified Data.Maybe              as Y
 
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
 
 
@@ -66,26 +62,28 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [ExtractCore.ns, Monads.ns, ShowCore.ns]
+    [ExtractCore.ns, ShowCore.ns]
     kernelTypesNamespaces $
     Just ("Evaluation-level implementations of Map functions for the Hydra interpreter.")
   where
     elements = [
-      toBinding alter_,
-      toBinding bimap_,
-      toBinding filter_,
-      toBinding filterWithKey_,
-      toBinding map_,
-      toBinding mapKeys_]
+      toTermDefinition alter_,
+      toTermDefinition bimap_,
+      toTermDefinition filter_,
+      toTermDefinition filterWithKey_,
+      toTermDefinition findWithDefault_,
+      toTermDefinition map_,
+      toTermDefinition mapKeys_]
 
 -- | Interpreter-friendly alter for Map terms.
 -- Applies funTerm to the current value (or Nothing) and updates accordingly.
-alter_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+alter_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 alter_ = define "alter" $
   doc "Interpreter-friendly alter for Map terms." $
+  "cx" ~> "g" ~>
   "funTerm" ~> "keyTerm" ~> "mapTerm" ~>
   cases _Term (var "mapTerm")
-    (Just (Monads.unexpected @@ string "map value" @@ (ShowCore.term @@ var "mapTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "map value") (ShowCore.term @@ var "mapTerm"))) [
     _Term_map>>: "m" ~>
       -- Get current value: lookup key m
       "currentVal" <~ Maps.lookup (var "keyTerm") (var "m") $
@@ -96,7 +94,7 @@
       -- Result depends on newVal:
       -- If newVal is Nothing, delete the key
       -- If newVal is Just v', insert/update with v'
-      produce $ Core.termApplication $ Core.application
+      right $ Core.termApplication $ Core.application
         (Core.termApplication $ Core.application
           (Core.termApplication $ Core.application
             (Core.termFunction $ Core.functionPrimitive $ encodedName _maybes_maybe)
@@ -119,17 +117,18 @@
 
 -- | Interpreter-friendly bimap for Map terms.
 -- Applies keyFun to each key and valFun to each value.
-bimap_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+bimap_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 bimap_ = define "bimap" $
   doc "Interpreter-friendly bimap for Map terms." $
+  "cx" ~> "g" ~>
   "keyFun" ~> "valFun" ~> "mapTerm" ~>
   cases _Term (var "mapTerm")
-    (Just (Monads.unexpected @@ string "map value" @@ (ShowCore.term @@ var "mapTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "map value") (ShowCore.term @@ var "mapTerm"))) [
     _Term_map>>: "m" ~>
       -- m is Map Term Term, convert to list of pairs
       "pairs" <~ Maps.toList (var "m") $
       -- Build: fromList (map (\(k,v) -> (keyFun k, valFun v)) pairs)
-      produce $ Core.termMap $ Maps.fromList $ Lists.map
+      right $ Core.termMap $ Maps.fromList $ Lists.map
         ("p" ~>
           "k" <~ Pairs.first (var "p") $
           "v" <~ Pairs.second (var "p") $
@@ -140,16 +139,17 @@
 
 -- | Interpreter-friendly filter for Map terms.
 -- Keeps entries where valPred returns true for the value.
-filter_ :: TBinding (Term -> Term -> Flow s Term)
+filter_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 filter_ = define "filter" $
   doc "Interpreter-friendly filter for Map terms." $
+  "cx" ~> "g" ~>
   "valPred" ~> "mapTerm" ~>
   cases _Term (var "mapTerm")
-    (Just (Monads.unexpected @@ string "map value" @@ (ShowCore.term @@ var "mapTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "map value") (ShowCore.term @@ var "mapTerm"))) [
     _Term_map>>: "m" ~>
       "pairs" <~ Maps.toList (var "m") $
       -- Build: fromList (concat (map (\(k,v) -> if valPred v then [(k,v)] else []) pairs))
-      produce $ Core.termApplication $ Core.application
+      right $ Core.termApplication $ Core.application
         (Core.termFunction $ Core.functionPrimitive $ encodedName _maps_fromList)
         (Core.termApplication $ Core.application
           (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_concat)
@@ -167,16 +167,17 @@
 
 -- | Interpreter-friendly filterWithKey for Map terms.
 -- Keeps entries where pred returns true for the key and value.
-filterWithKey_ :: TBinding (Term -> Term -> Flow s Term)
+filterWithKey_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 filterWithKey_ = define "filterWithKey" $
   doc "Interpreter-friendly filterWithKey for Map terms." $
+  "cx" ~> "g" ~>
   "pred" ~> "mapTerm" ~>
   cases _Term (var "mapTerm")
-    (Just (Monads.unexpected @@ string "map value" @@ (ShowCore.term @@ var "mapTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "map value") (ShowCore.term @@ var "mapTerm"))) [
     _Term_map>>: "m" ~>
       "pairs" <~ Maps.toList (var "m") $
       -- Build: fromList (concat (map (\(k,v) -> if pred k v then [(k,v)] else []) pairs))
-      produce $ Core.termApplication $ Core.application
+      right $ Core.termApplication $ Core.application
         (Core.termFunction $ Core.functionPrimitive $ encodedName _maps_fromList)
         (Core.termApplication $ Core.application
           (Core.termFunction $ Core.functionPrimitive $ encodedName _lists_concat)
@@ -195,18 +196,37 @@
                 (Core.termList $ list ([] :: [TTerm Term])))
             (var "pairs")))]
 
+-- | Interpreter-friendly findWithDefault for Map terms.
+-- findWithDefault default key map: returns the value at key, or default if not found.
+findWithDefault_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
+findWithDefault_ = define "findWithDefault" $
+  doc "Interpreter-friendly findWithDefault for Map terms." $
+  "cx" ~> "g" ~>
+  "defaultTerm" ~> "keyTerm" ~> "mapTerm" ~>
+  -- Build: fromMaybe default (lookup key map)
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termFunction $ Core.functionPrimitive $ encodedName _maybes_fromMaybe)
+      (var "defaultTerm"))
+    (Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termFunction $ Core.functionPrimitive $ encodedName _maps_lookup)
+        (var "keyTerm"))
+      (var "mapTerm"))
+
 -- | Interpreter-friendly map for Map terms.
 -- Applies valFun to each value.
-map_ :: TBinding (Term -> Term -> Flow s Term)
+map_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 map_ = define "map" $
   doc "Interpreter-friendly map for Map terms." $
+  "cx" ~> "g" ~>
   "valFun" ~> "mapTerm" ~>
   cases _Term (var "mapTerm")
-    (Just (Monads.unexpected @@ string "map value" @@ (ShowCore.term @@ var "mapTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "map value") (ShowCore.term @@ var "mapTerm"))) [
     _Term_map>>: "m" ~>
       "pairs" <~ Maps.toList (var "m") $
       -- Build: fromList (map (\(k,v) -> (k, valFun v)) pairs)
-      produce $ Core.termMap $ Maps.fromList $ Lists.map
+      right $ Core.termMap $ Maps.fromList $ Lists.map
         ("p" ~>
           "k" <~ Pairs.first (var "p") $
           "v" <~ Pairs.second (var "p") $
@@ -215,16 +235,17 @@
 
 -- | Interpreter-friendly mapKeys for Map terms.
 -- Applies keyFun to each key.
-mapKeys_ :: TBinding (Term -> Term -> Flow s Term)
+mapKeys_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 mapKeys_ = define "mapKeys" $
   doc "Interpreter-friendly mapKeys for Map terms." $
+  "cx" ~> "g" ~>
   "keyFun" ~> "mapTerm" ~>
   cases _Term (var "mapTerm")
-    (Just (Monads.unexpected @@ string "map value" @@ (ShowCore.term @@ var "mapTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "map value") (ShowCore.term @@ var "mapTerm"))) [
     _Term_map>>: "m" ~>
       "pairs" <~ Maps.toList (var "m") $
       -- Build: fromList (map (\(k,v) -> (keyFun k, v)) pairs)
-      produce $ Core.termMap $ Maps.fromList $ Lists.map
+      right $ Core.termMap $ Maps.fromList $ Lists.map
         ("p" ~>
           "k" <~ Pairs.first (var "p") $
           "v" <~ Pairs.second (var "p") $
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Math.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Math.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Math.hs
@@ -0,0 +1,133 @@
+
+module Hydra.Sources.Eval.Lib.Math where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths     as Paths
+import qualified Hydra.Dsl.Annotations   as Annotations
+import qualified Hydra.Dsl.Ast           as Ast
+import qualified Hydra.Dsl.Bootstrap     as Bootstrap
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
+import qualified Hydra.Dsl.Meta.Core          as Core
+import qualified Hydra.Dsl.Meta.Graph         as Graph
+import qualified Hydra.Dsl.Json.Model          as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps      as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math      as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes    as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs     as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets      as Sets
+import           Hydra.Dsl.Meta.Lib.Strings   as Strings
+import qualified Hydra.Dsl.Literals      as Literals
+import qualified Hydra.Dsl.LiteralTypes  as LiteralTypes
+import qualified Hydra.Dsl.Meta.Literals as MetaLiterals
+import qualified Hydra.Dsl.Meta.Base     as MetaBase
+import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
+import qualified Hydra.Dsl.Meta.Types    as MetaTypes
+import qualified Hydra.Dsl.Module        as Module
+import           Hydra.Dsl.Meta.Phantoms as Phantoms
+import qualified Hydra.Dsl.Prims         as Prims
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Testing       as Testing
+import qualified Hydra.Dsl.Terms         as Terms
+import qualified Hydra.Dsl.Tests         as Tests
+import qualified Hydra.Dsl.Topology      as Topology
+import qualified Hydra.Dsl.Types         as Types
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
+import qualified Hydra.Dsl.Meta.Variants      as Variants
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                as I
+import qualified Data.List               as L
+import qualified Data.Map                as M
+import qualified Data.Set                as S
+import qualified Data.Maybe              as Y
+
+
+ns :: Namespace
+ns = Namespace "hydra.eval.lib.math"
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInNamespace ns
+
+module_ :: Module
+module_ = Module ns elements
+    []
+    kernelTypesNamespaces $
+    Just ("Evaluation-level implementations of Math functions for the Hydra interpreter.")
+  where
+    elements = [
+      toTermDefinition even_,
+      toTermDefinition odd_,
+      toTermDefinition pred_,
+      toTermDefinition succ_]
+
+-- | Interpreter-friendly even.
+-- even x = equal (mod x 2) 0
+even_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+even_ = define "even" $
+  doc "Interpreter-friendly even." $
+  "cx" ~> "g" ~>
+  "x" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termFunction $ Core.functionPrimitive $ encodedName _equality_equal)
+      (Core.termApplication $ Core.application
+        (Core.termApplication $ Core.application
+          (Core.termFunction $ Core.functionPrimitive $ encodedName _math_mod)
+          (var "x"))
+        (Core.termLiteral $ Core.literalInteger $ Core.integerValueInt32 $ MetaLiterals.int32 2)))
+    (Core.termLiteral $ Core.literalInteger $ Core.integerValueInt32 $ MetaLiterals.int32 0)
+
+-- | Interpreter-friendly odd.
+-- odd x = not (even x)
+odd_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+odd_ = define "odd" $
+  doc "Interpreter-friendly odd." $
+  "cx" ~> "g" ~>
+  "x" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_not)
+    (Core.termApplication $ Core.application
+      (Core.termFunction $ Core.functionPrimitive $ encodedName _math_even)
+      (var "x"))
+
+-- | Interpreter-friendly predecessor.
+-- pred x = sub x 1
+pred_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+pred_ = define "pred" $
+  doc "Interpreter-friendly predecessor." $
+  "cx" ~> "g" ~>
+  "x" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termFunction $ Core.functionPrimitive $ encodedName _math_sub)
+      (var "x"))
+    (Core.termLiteral $ Core.literalInteger $ Core.integerValueInt32 $ MetaLiterals.int32 1)
+
+-- TODO: range lo hi = ifElse (gt lo hi) [] (cons lo (range (add lo 1) hi))
+--   The recursive definition causes the interpreter to loop. The eval primitive returns a term
+--   containing ifElse(gt(lo,hi), [], cons(lo, range(add(lo,1), hi))), but reduction does not
+--   terminate. Needs investigation of the reducer's handling of recursive primitive references.
+-- range_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+
+-- | Interpreter-friendly successor.
+-- succ x = add x 1
+succ_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+succ_ = define "succ" $
+  doc "Interpreter-friendly successor." $
+  "cx" ~> "g" ~>
+  "x" ~>
+  right $ Core.termApplication $ Core.application
+    (Core.termApplication $ Core.application
+      (Core.termFunction $ Core.functionPrimitive $ encodedName _math_add)
+      (var "x"))
+    (Core.termLiteral $ Core.literalInteger $ Core.integerValueInt32 $ MetaLiterals.int32 1)
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Maybes.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Maybes.hs
--- a/src/main/haskell/Hydra/Sources/Eval/Lib/Maybes.hs
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Maybes.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (maybe)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors     as Accessors
+import qualified Hydra.Dsl.Paths     as Paths
 import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
+import qualified Hydra.Dsl.Ast           as Ast
 import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
 import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
+import qualified Hydra.Dsl.Json.Model          as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
@@ -30,20 +27,21 @@
 import           Hydra.Dsl.Meta.Lib.Strings   as Strings
 import qualified Hydra.Dsl.Literals      as Literals
 import qualified Hydra.Dsl.LiteralTypes  as LiteralTypes
+import qualified Hydra.Dsl.Meta.Literals as MetaLiterals
 import qualified Hydra.Dsl.Meta.Base     as MetaBase
 import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
 import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
+import qualified Hydra.Dsl.Module        as Module
 import           Hydra.Dsl.Meta.Phantoms as Phantoms
 import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
 import qualified Hydra.Dsl.Meta.Testing       as Testing
 import qualified Hydra.Dsl.Terms         as Terms
 import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
+import qualified Hydra.Dsl.Topology      as Topology
 import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
 import qualified Hydra.Dsl.Meta.Variants      as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++), maybe, map)
@@ -53,11 +51,11 @@
 import qualified Data.Set                as S
 import qualified Data.Maybe              as Y
 
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
 
-
 ns :: Namespace
 ns = Namespace "hydra.eval.lib.maybes"
 
@@ -66,77 +64,163 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [ExtractCore.ns, Monads.ns, ShowCore.ns]
+    [ExtractCore.ns, ShowCore.ns]
     kernelTypesNamespaces $
     Just ("Evaluation-level implementations of Maybe functions for the Hydra interpreter.")
   where
     elements = [
-      toBinding apply_,
-      toBinding bind_,
-      toBinding cases_,
-      toBinding compose_,
-      toBinding map_,
-      toBinding mapMaybe_,
-      toBinding maybe_]
+      toTermDefinition apply_,
+      toTermDefinition bind_,
+      toTermDefinition cases_,
+      toTermDefinition cat_,
+      toTermDefinition compose_,
+      toTermDefinition fromJust_,
+      toTermDefinition fromMaybe_,
+      toTermDefinition isJust_,
+      toTermDefinition isNothing_,
+      toTermDefinition map_,
+      toTermDefinition mapMaybe_,
+      toTermDefinition maybe_,
+      toTermDefinition pure_,
+      toTermDefinition toList_]
 
 -- | Interpreter-friendly applicative apply for Maybe terms.
 -- apply (Just f) (Just x) = Just (f x); otherwise Nothing
 -- We manually construct the result because the nested lambda would be flattened in Python.
 -- The logic is: apply (Just f) (Just x) = Just (f x)
-apply_ :: TBinding (Term -> Term -> Flow s Term)
+apply_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 apply_ = define "apply" $
   doc "Interpreter-friendly applicative apply for Maybe terms." $
-  "funOptTerm" ~> "argOptTerm" ~>
+  "cx" ~> "g" ~> "funOptTerm" ~> "argOptTerm" ~>
   cases _Term (var "funOptTerm")
-    (Just (Monads.unexpected @@ string "optional function" @@ (ShowCore.term @@ var "funOptTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "optional function") (ShowCore.term @@ var "funOptTerm"))) [
     _Term_maybe>>: "mf" ~>
       cases _Term (var "argOptTerm")
-        (Just (Monads.unexpected @@ string "optional value" @@ (ShowCore.term @@ var "argOptTerm"))) [
+        (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "argOptTerm"))) [
         _Term_maybe>>: "mx" ~>
           -- Manual applicative apply: for Just f, Just x => Just (f x); else Nothing
           -- We use Maybes.bind to handle the nested Maybes without requiring curried lambdas
-          produce $ Core.termMaybe $
+          right $ Core.termMaybe $
             Maybes.bind (var "mf") $
               "f" ~> Maybes.map ("x" ~> Core.termApplication $ Core.application (var "f") (var "x")) (var "mx")]]
 
 -- | Interpreter-friendly monadic bind for Maybe terms.
 -- bind (Just x) f = f x; bind Nothing f = Nothing
-bind_ :: TBinding (Term -> Term -> Flow s Term)
+bind_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 bind_ = define "bind" $
   doc "Interpreter-friendly monadic bind for Maybe terms." $
-  "optTerm" ~> "funTerm" ~>
+  "cx" ~> "g" ~> "optTerm" ~> "funTerm" ~>
   cases _Term (var "optTerm")
-    (Just (Monads.unexpected @@ string "optional value" @@ (ShowCore.term @@ var "optTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
     _Term_maybe>>: "m" ~>
-      produce $ Maybes.maybe
+      right $ Maybes.maybe
         (Core.termMaybe nothing)
         ("val" ~> Core.termApplication $ Core.application (var "funTerm") (var "val"))
         (var "m")]
 
+-- | Interpreter-friendly cat (catMaybes) for list of Maybe terms.
+-- Filters out Nothings and unwraps Justs.
+cat_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+cat_ = define "cat" $
+  doc "Interpreter-friendly cat for list of Maybe terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  -- Build: foldl (\acc el -> case el of TermMaybe m -> maybe acc (\v -> concat2 acc [v]) m; _ -> acc) [] elements
+  right $ Lists.foldl
+    ("acc" ~> "el" ~>
+      cases _Term (var "el")
+        (Just (var "acc")) [
+        _Term_maybe>>: "m" ~>
+          Maybes.maybe
+            (var "acc")
+            ("v" ~> Lists.concat2 (var "acc") (Lists.pure (var "v")))
+            (var "m")])
+    (list ([] :: [TTerm Term]))
+    (var "elements")
+
 -- | Interpreter-friendly case analysis for Maybe terms (cases variant).
 -- Takes optTerm, defaultTerm, funTerm - returns defaultTerm if Nothing,
 -- or applies funTerm to the value if Just.
-cases_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+cases_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 cases_ = define "cases" $
   doc "Interpreter-friendly case analysis for Maybe terms (cases argument order)." $
-  "optTerm" ~> "defaultTerm" ~> "funTerm" ~>
+  "cx" ~> "g" ~> "optTerm" ~> "defaultTerm" ~> "funTerm" ~>
   cases _Term (var "optTerm")
-    (Just (Monads.unexpected @@ string "optional value" @@ (ShowCore.term @@ var "optTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
     _Term_maybe>>: "m" ~>
-      produce $ Maybes.maybe
+      right $ Maybes.maybe
         (var "defaultTerm")
         ("val" ~> Core.termApplication $ Core.application (var "funTerm") (var "val"))
         (var "m")]
 
+-- | Interpreter-friendly fromJust for Maybe terms.
+-- Extracts the value from Just, or errors on Nothing.
+fromJust_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+fromJust_ = define "fromJust" $
+  doc "Interpreter-friendly fromJust for Maybe terms." $
+  "cx" ~> "g" ~>
+  "optTerm" ~>
+  cases _Term (var "optTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
+    _Term_maybe>>: "m" ~>
+      Maybes.maybe
+        (ExtractCore.unexpected (var "cx") (string "Just value") (ShowCore.term @@ var "optTerm"))
+        ("val" ~> right $ var "val")
+        (var "m")]
+
+-- | Interpreter-friendly fromMaybe for Maybe terms.
+-- Returns the contained value or a default.
+fromMaybe_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+fromMaybe_ = define "fromMaybe" $
+  doc "Interpreter-friendly fromMaybe for Maybe terms." $
+  "cx" ~> "g" ~>
+  "defaultTerm" ~> "optTerm" ~>
+  cases _Term (var "optTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
+    _Term_maybe>>: "m" ~>
+      right $ Maybes.maybe
+        (var "defaultTerm")
+        ("val" ~> var "val")
+        (var "m")]
+
+-- | Interpreter-friendly isJust for Maybe terms.
+isJust_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+isJust_ = define "isJust" $
+  doc "Interpreter-friendly isJust for Maybe terms." $
+  "cx" ~> "g" ~>
+  "optTerm" ~>
+  cases _Term (var "optTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
+    _Term_maybe>>: "m" ~>
+      right $ Maybes.maybe
+        (Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean False)
+        ("_" ~> Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean True)
+        (var "m")]
+
+-- | Interpreter-friendly isNothing for Maybe terms.
+isNothing_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+isNothing_ = define "isNothing" $
+  doc "Interpreter-friendly isNothing for Maybe terms." $
+  "cx" ~> "g" ~>
+  "optTerm" ~>
+  cases _Term (var "optTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
+    _Term_maybe>>: "m" ~>
+      right $ Maybes.maybe
+        (Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean True)
+        ("_" ~> Core.termLiteral $ Core.literalBoolean $ MetaLiterals.boolean False)
+        (var "m")]
+
 -- | Interpreter-friendly Kleisli composition for Maybe.
 -- compose f g x = bind (f x) g
-compose_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+compose_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 compose_ = define "compose" $
   doc "Interpreter-friendly Kleisli composition for Maybe." $
-  "funF" ~> "funG" ~> "xTerm" ~>
+  "cx" ~> "g" ~> "funF" ~> "funG" ~> "xTerm" ~>
   -- Compute: bind (f x) g
   -- This builds the term: bind @ (funF @ xTerm) @ funG
-  produce $ Core.termApplication $ Core.application
+  right $ Core.termApplication $ Core.application
     (Core.termApplication $ Core.application
       (Core.termFunction $ Core.functionPrimitive $ wrap _Name $ string "hydra.lib.maybes.bind")
       (Core.termApplication $ Core.application (var "funF") (var "xTerm")))
@@ -144,26 +228,26 @@
 
 -- | Interpreter-friendly map for Maybe terms.
 -- Returns Nothing if Nothing, or Just (fun val) if Just val.
-map_ :: TBinding (Term -> Term -> Flow s Term)
+map_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 map_ = define "map" $
   doc "Interpreter-friendly map for Maybe terms." $
-  "funTerm" ~> "optTerm" ~>
+  "cx" ~> "g" ~> "funTerm" ~> "optTerm" ~>
   cases _Term (var "optTerm")
-    (Just (Monads.unexpected @@ string "optional value" @@ (ShowCore.term @@ var "optTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
     _Term_maybe>>: "m" ~>
-      produce $ Core.termMaybe $ Maybes.map
+      right $ Core.termMaybe $ Maybes.map
         ("val" ~> Core.termApplication $ Core.application (var "funTerm") (var "val"))
         (var "m")]
 
 -- | Interpreter-friendly mapMaybe for List terms.
 -- Applies funTerm to each element, keeping only Just results.
-mapMaybe_ :: TBinding (Term -> Term -> Flow s Term)
+mapMaybe_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 mapMaybe_ = define "mapMaybe" $
   doc "Interpreter-friendly mapMaybe for List terms." $
-  "funTerm" ~> "listTerm" ~>
-  "elements" <<~ ExtractCore.list @@ var "listTerm" $
+  "cx" ~> "g" ~> "funTerm" ~> "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
   -- Build: cat (map funTerm elements) - cat filters out Nothings and unwraps Justs
-  produce $ Core.termApplication $ Core.application
+  right $ Core.termApplication $ Core.application
     (Core.termFunction $ Core.functionPrimitive $ wrap _Name $ string "hydra.lib.maybes.cat")
     (Core.termList $ Lists.map
       ("el" ~> Core.termApplication $ Core.application (var "funTerm") (var "el"))
@@ -172,14 +256,38 @@
 -- | Interpreter-friendly case analysis for Maybe terms.
 -- Takes defaultTerm, funTerm, optTerm - returns defaultTerm if Nothing,
 -- or applies funTerm to the value if Just.
-maybe_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+maybe_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 maybe_ = define "maybe" $
   doc "Interpreter-friendly case analysis for Maybe terms." $
-  "defaultTerm" ~> "funTerm" ~> "optTerm" ~>
+  "cx" ~> "g" ~> "defaultTerm" ~> "funTerm" ~> "optTerm" ~>
   cases _Term (var "optTerm")
-    (Just (Monads.unexpected @@ string "optional value" @@ (ShowCore.term @@ var "optTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
     _Term_maybe>>: "m" ~>
-      produce $ Maybes.maybe
+      right $ Maybes.maybe
         (var "defaultTerm")
         ("val" ~> Core.termApplication $ Core.application (var "funTerm") (var "val"))
+        (var "m")]
+
+-- | Interpreter-friendly pure for Maybe terms.
+-- Wraps a value in Just.
+pure_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+pure_ = define "pure" $
+  doc "Interpreter-friendly pure for Maybe terms." $
+  "cx" ~> "g" ~>
+  "x" ~>
+  right $ Core.termMaybe $ just $ var "x"
+
+-- | Interpreter-friendly toList for Maybe terms.
+-- Just x -> [x], Nothing -> []
+toList_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+toList_ = define "toList" $
+  doc "Interpreter-friendly toList for Maybe terms." $
+  "cx" ~> "g" ~>
+  "optTerm" ~>
+  cases _Term (var "optTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "optional value") (ShowCore.term @@ var "optTerm"))) [
+    _Term_maybe>>: "m" ~>
+      right $ Core.termList $ Maybes.maybe
+        (list ([] :: [TTerm Term]))
+        ("val" ~> Lists.pure (var "val"))
         (var "m")]
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Pairs.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Pairs.hs
--- a/src/main/haskell/Hydra/Sources/Eval/Lib/Pairs.hs
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Pairs.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors     as Accessors
+import qualified Hydra.Dsl.Paths     as Paths
 import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
+import qualified Hydra.Dsl.Ast           as Ast
 import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
 import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
+import qualified Hydra.Dsl.Json.Model          as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
@@ -33,17 +30,17 @@
 import qualified Hydra.Dsl.Meta.Base     as MetaBase
 import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
 import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
+import qualified Hydra.Dsl.Module        as Module
 import           Hydra.Dsl.Meta.Phantoms as Phantoms
 import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
 import qualified Hydra.Dsl.Meta.Testing       as Testing
 import qualified Hydra.Dsl.Terms         as Terms
 import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
+import qualified Hydra.Dsl.Topology      as Topology
 import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
 import qualified Hydra.Dsl.Meta.Variants      as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -53,7 +50,7 @@
 import qualified Data.Set                as S
 import qualified Data.Maybe              as Y
 
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
+import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
 
 
@@ -65,24 +62,51 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Monads.ns, ShowCore.ns]
+    [ExtractCore.ns, ShowCore.ns]
     kernelTypesNamespaces $
     Just ("Evaluation-level implementations of Pair functions for the Hydra interpreter.")
   where
     elements = [
-      toBinding bimap_]
+      toTermDefinition bimap_,
+      toTermDefinition first_,
+      toTermDefinition second_]
 
 -- | Interpreter-friendly bimap for Pair terms.
 -- Applies firstFun to the first element and secondFun to the second element.
-bimap_ :: TBinding (Term -> Term -> Term -> Flow s Term)
+bimap_ :: TBinding (Context -> Graph -> Term -> Term -> Term -> Either (InContext Error) Term)
 bimap_ = define "bimap" $
   doc "Interpreter-friendly bimap for Pair terms." $
+  "cx" ~> "g" ~>
   "firstFun" ~> "secondFun" ~> "pairTerm" ~>
   cases _Term (var "pairTerm")
-    (Just (Monads.unexpected @@ string "pair value" @@ (ShowCore.term @@ var "pairTerm"))) [
+    (Just (ExtractCore.unexpected (var "cx") (string "pair value") (ShowCore.term @@ var "pairTerm"))) [
     _Term_pair>>: "p" ~>
       "fst" <~ Pairs.first (var "p") $
       "snd" <~ Pairs.second (var "p") $
-      produce $ Core.termPair $ pair
+      right $ Core.termPair $ pair
         (Core.termApplication $ Core.application (var "firstFun") (var "fst"))
         (Core.termApplication $ Core.application (var "secondFun") (var "snd"))]
+
+-- | Interpreter-friendly first for Pair terms.
+-- Extracts the first element of a pair.
+first_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+first_ = define "first" $
+  doc "Interpreter-friendly first for Pair terms." $
+  "cx" ~> "g" ~>
+  "pairTerm" ~>
+  cases _Term (var "pairTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "pair value") (ShowCore.term @@ var "pairTerm"))) [
+    _Term_pair>>: "p" ~>
+      right $ Pairs.first (var "p")]
+
+-- | Interpreter-friendly second for Pair terms.
+-- Extracts the second element of a pair.
+second_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+second_ = define "second" $
+  doc "Interpreter-friendly second for Pair terms." $
+  "cx" ~> "g" ~>
+  "pairTerm" ~>
+  cases _Term (var "pairTerm")
+    (Just (ExtractCore.unexpected (var "cx") (string "pair value") (ShowCore.term @@ var "pairTerm"))) [
+    _Term_pair>>: "p" ~>
+      right $ Pairs.second (var "p")]
diff --git a/src/main/haskell/Hydra/Sources/Eval/Lib/Sets.hs b/src/main/haskell/Hydra/Sources/Eval/Lib/Sets.hs
--- a/src/main/haskell/Hydra/Sources/Eval/Lib/Sets.hs
+++ b/src/main/haskell/Hydra/Sources/Eval/Lib/Sets.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (map)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors     as Accessors
+import qualified Hydra.Dsl.Paths     as Paths
 import qualified Hydra.Dsl.Annotations   as Annotations
-import qualified Hydra.Dsl.Meta.Ast           as Ast
+import qualified Hydra.Dsl.Ast           as Ast
 import qualified Hydra.Dsl.Bootstrap     as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders        as Coders
-import qualified Hydra.Dsl.Meta.Compute       as Compute
+import qualified Hydra.Dsl.Coders        as Coders
+import qualified Hydra.Dsl.Util       as Util
 import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Grammar       as Grammar
-import qualified Hydra.Dsl.Grammars      as Grammars
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Json          as Json
+import qualified Hydra.Dsl.Json.Model          as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers   as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows     as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals  as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic     as Logic
@@ -33,17 +30,17 @@
 import qualified Hydra.Dsl.Meta.Base     as MetaBase
 import qualified Hydra.Dsl.Meta.Terms    as MetaTerms
 import qualified Hydra.Dsl.Meta.Types    as MetaTypes
-import qualified Hydra.Dsl.Meta.Module        as Module
+import qualified Hydra.Dsl.Module        as Module
 import           Hydra.Dsl.Meta.Phantoms as Phantoms
 import qualified Hydra.Dsl.Prims         as Prims
-import qualified Hydra.Dsl.Tabular       as Tabular
+import qualified Hydra.Dsl.Meta.Tabular       as Tabular
 import qualified Hydra.Dsl.Meta.Testing       as Testing
 import qualified Hydra.Dsl.Terms         as Terms
 import qualified Hydra.Dsl.Tests         as Tests
-import qualified Hydra.Dsl.Meta.Topology      as Topology
+import qualified Hydra.Dsl.Topology      as Topology
 import qualified Hydra.Dsl.Types         as Types
-import qualified Hydra.Dsl.Meta.Typing        as Typing
-import qualified Hydra.Dsl.Meta.Util          as Util
+import qualified Hydra.Dsl.Typing        as Typing
+import qualified Hydra.Dsl.Util          as Util
 import qualified Hydra.Dsl.Meta.Variants      as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++), map)
@@ -54,10 +51,8 @@
 import qualified Data.Maybe              as Y
 
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
 
-
 ns :: Namespace
 ns = Namespace "hydra.eval.lib.sets"
 
@@ -66,23 +61,124 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [ExtractCore.ns, Monads.ns, ShowCore.ns]
+    [ExtractCore.ns, ShowCore.ns]
     kernelTypesNamespaces $
     Just ("Evaluation-level implementations of Set functions for the Hydra interpreter.")
   where
     elements = [
-      toBinding map_]
+      toTermDefinition difference_,
+      toTermDefinition intersection_,
+      toTermDefinition map_,
+      toTermDefinition union_,
+      toTermDefinition unions_]
 
+-- | Interpreter-friendly set difference.
+-- difference s1 s2: elements in s1 that are not in s2.
+difference_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+difference_ = define "difference" $
+  doc "Interpreter-friendly set difference." $
+  "cx" ~> "g" ~>
+  "set1Term" ~> "set2Term" ~>
+  "elements" <<~ (ExtractCore.set @@ var "cx" @@ var "g" @@ var "set1Term") $
+  -- Build: foldl (\acc el -> ifElse (member el set2) acc (insert el acc)) empty (toList set1)
+  right $ Lists.foldl
+    ("acc" ~> "el" ~>
+      Core.termApplication $ Core.application
+        (Core.termApplication $ Core.application
+          (Core.termApplication $ Core.application
+            (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
+            (Core.termApplication $ Core.application
+              (Core.termApplication $ Core.application
+                (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_member)
+                (var "el"))
+              (var "set2Term")))
+          (var "acc"))
+        (Core.termApplication $ Core.application
+          (Core.termApplication $ Core.application
+            (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_insert)
+            (var "el"))
+          (var "acc")))
+    (Core.termSet $ Sets.fromList (list ([] :: [TTerm Term])))
+    (Sets.toList $ var "elements")
+
+-- | Interpreter-friendly set intersection.
+-- intersection s1 s2: elements in both s1 and s2.
+intersection_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+intersection_ = define "intersection" $
+  doc "Interpreter-friendly set intersection." $
+  "cx" ~> "g" ~>
+  "set1Term" ~> "set2Term" ~>
+  "elements" <<~ (ExtractCore.set @@ var "cx" @@ var "g" @@ var "set1Term") $
+  -- Build: foldl (\acc el -> ifElse (member el set2) (insert el acc) acc) empty (toList set1)
+  right $ Lists.foldl
+    ("acc" ~> "el" ~>
+      Core.termApplication $ Core.application
+        (Core.termApplication $ Core.application
+          (Core.termApplication $ Core.application
+            (Core.termFunction $ Core.functionPrimitive $ encodedName _logic_ifElse)
+            (Core.termApplication $ Core.application
+              (Core.termApplication $ Core.application
+                (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_member)
+                (var "el"))
+              (var "set2Term")))
+          (Core.termApplication $ Core.application
+            (Core.termApplication $ Core.application
+              (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_insert)
+              (var "el"))
+            (var "acc")))
+        (var "acc"))
+    (Core.termSet $ Sets.fromList (list ([] :: [TTerm Term])))
+    (Sets.toList $ var "elements")
+
 -- | Interpreter-friendly map for Set terms.
 -- Applies fun to each element.
-map_ :: TBinding (Term -> Term -> Flow s Term)
+map_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
 map_ = define "map" $
   doc "Interpreter-friendly map for Set terms." $
+  "cx" ~> "g" ~>
   "fun" ~> "setTerm" ~>
-  "elements" <<~ ExtractCore.set @@ var "setTerm" $
+  "elements" <<~ (ExtractCore.set @@ var "cx" @@ var "g" @@ var "setTerm") $
   -- Build: fromList (map fun (toList elements))
-  produce $ Core.termApplication $ Core.application
+  right $ Core.termApplication $ Core.application
     (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_fromList)
     (Core.termList $ Lists.map
       ("el" ~> Core.termApplication $ Core.application (var "fun") (var "el"))
       (Sets.toList $ var "elements"))
+
+-- | Interpreter-friendly set union.
+-- union s1 s2: elements in either s1 or s2.
+union_ :: TBinding (Context -> Graph -> Term -> Term -> Either (InContext Error) Term)
+union_ = define "union" $
+  doc "Interpreter-friendly set union." $
+  "cx" ~> "g" ~>
+  "set1Term" ~> "set2Term" ~>
+  "elements" <<~ (ExtractCore.set @@ var "cx" @@ var "g" @@ var "set1Term") $
+  -- Build: foldl (\acc el -> insert el acc) set2 (toList set1)
+  right $ Lists.foldl
+    ("acc" ~> "el" ~>
+      Core.termApplication $ Core.application
+        (Core.termApplication $ Core.application
+          (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_insert)
+          (var "el"))
+        (var "acc"))
+    (var "set2Term")
+    (Sets.toList $ var "elements")
+
+-- | Interpreter-friendly unions for list of Set terms.
+-- unions [s1, s2, ...]: union of all sets.
+unions_ :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
+unions_ = define "unions" $
+  doc "Interpreter-friendly unions for list of Set terms." $
+  "cx" ~> "g" ~>
+  "listTerm" ~>
+  "elements" <<~ (ExtractCore.list @@ var "cx" @@ var "g" @@ var "listTerm") $
+  -- Build: foldl union empty sets
+  right $ Lists.foldl
+    ("acc" ~> "s" ~>
+      Core.termApplication $ Core.application
+        (Core.termApplication $ Core.application
+          (Core.termFunction $ Core.functionPrimitive $ encodedName _sets_union)
+          (var "acc"))
+        (var "s"))
+    (Core.termSet $ Sets.fromList (list ([] :: [TTerm Term])))
+    (var "elements")
diff --git a/src/main/haskell/Hydra/Sources/Haskell/Ast.hs b/src/main/haskell/Hydra/Sources/Haskell/Ast.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Haskell/Ast.hs
+++ /dev/null
@@ -1,919 +0,0 @@
--- | A Haskell syntax model, loosely based on Language.Haskell.Tools.AST
-
-module Hydra.Sources.Haskell.Ast where
-
--- Standard type-level imports
-import           Hydra.Kernel
-import           Hydra.Dsl.Annotations (doc)
-import           Hydra.Dsl.Bootstrap
-import           Hydra.Dsl.Types ((>:))
-import qualified Hydra.Dsl.Types as T
-import qualified Hydra.Sources.Kernel.Types.Core as Core
-
-
-ns :: Namespace
-ns = Namespace "hydra.ext.haskell.ast"
-
-define :: String -> Type -> Binding
-define = defineType ns
-
-module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
-    Just "A Haskell syntax model, loosely based on Language.Haskell.Tools.AST"
-  where
-    elements = [
-      alternative,
-      assertion,
-      classAssertion,
-      caseRhs,
-      constructor,
-      ordinaryConstructor,
-      recordConstructor,
-      constructorWithComments,
-      dataDeclaration,
-      dataOrNewtype,
-      declarationWithComments,
-      declaration,
-      declarationHead,
-      applicationDeclarationHead,
-      deriving_,
-      export,
-      expression,
-      applicationExpression,
-      caseExpression,
-      constructRecordExpression,
-      ifExpression,
-      infixApplicationExpression,
-      lambdaExpression,
-      letExpression,
-      prefixApplicationExpression,
-      sectionExpression,
-      typeSignatureExpression,
-      updateRecordExpression,
-      field,
-      fieldWithComments,
-      fieldUpdate,
-      import_,
-      specImport,
-      importModifier,
-      importExportSpec,
-      subspecImportExportSpec,
-      literal,
-      localBinding,
-      localBindings,
-      module',
-      moduleHead,
-      moduleName,
-      name,
-      namePart,
-      operator,
-      pattern,
-      applicationPattern,
-      asPattern,
-      recordPattern,
-      typedPattern,
-      patternField,
-      qualifiedName,
-      rightHandSide,
-      statement,
-      type_,
-      applicationType,
-      contextType,
-      functionType,
-      infixType,
-      typeDeclaration,
-      typeSignature,
-      typedBinding,
-      valueBinding,
-      simpleValueBinding,
-      variable]
-
-alternative :: Binding -- UAlt
-alternative = define "Alternative" $
-  doc "A pattern-matching alternative" $
-  T.record [
-    "pattern">:
-      doc "The pattern to match"
-      pattern,
-    "rhs">:
-      doc "The right-hand side of the alternative"
-      caseRhs,
-    "binds">:
-      doc "Optional local bindings" $
-      T.maybe localBindings]
-
-assertion :: Binding -- UAssertion (UClassAssert)
-assertion = define "Assertion" $
-  doc "A type assertion" $
-  T.union [
-    "class">:
-      doc "A class assertion"
-      classAssertion,
-    "tuple">:
-      doc "A tuple of assertions" $
-      T.list assertion]
-  -- omitted for now: implicit and infix assertions
-
-classAssertion :: Binding -- UClassAssert
-classAssertion = define "ClassAssertion" $
-  doc "A class assertion" $
-  T.record [
-    "name">:
-      doc "The name of the class"
-      name,
-    "types">:
-      doc "The types to which the class is applied" $
-      T.list type_]
-
-caseRhs :: Binding -- UCaseRhs'
-caseRhs = define "CaseRhs" $
-  doc "The right-hand side of a pattern-matching alternative" $
-  -- omitted for now: guarded
-  T.wrap expression
-
-constructor :: Binding -- UConDecl
-constructor = define "Constructor" $
-  doc "A data constructor" $
-  -- omitted for now: ordinary (positional), infix
-  T.union [
-    "ordinary">:
-      doc "An ordinary (positional) constructor"
-      ordinaryConstructor,
-    "record">:
-      doc "A record constructor"
-      recordConstructor]
-
-ordinaryConstructor :: Binding
-ordinaryConstructor = define "OrdinaryConstructor" $
-  doc "An ordinary (positional) data constructor" $
-  T.record [
-    "name">:
-      doc "The name of the constructor"
-      name,
-    "fields">:
-      doc "The types of the positional fields" $
-      T.list type_]
-
-recordConstructor :: Binding
-recordConstructor = define "RecordConstructor" $
-  doc "A record-style data constructor" $
-  T.record [
-    "name">:
-      doc "The name of the constructor"
-      name,
-    "fields">:
-      doc "The named fields of the record" $
-      T.list fieldWithComments]
-
-constructorWithComments :: Binding
-constructorWithComments = define "ConstructorWithComments" $
-  doc "A data constructor together with any comments" $
-  T.record [
-    "body">:
-      doc "The constructor"
-      constructor,
-    "comments">:
-      doc "Optional comments" $
-      T.maybe T.string]
-
-dataDeclaration :: Binding -- UDataDecl
-dataDeclaration = define "DataDeclaration" $
-  doc "A data type declaration" $
-  T.record [
-    "keyword">:
-      doc "The 'data' or 'newtype' keyword"
-      dataOrNewtype,
-    "context">:
-      doc "Type class constraints" $
-      T.list assertion,
-    "head">:
-      doc "The declaration head"
-      declarationHead,
-    "constructors">:
-      doc "The data constructors" $
-      T.list constructorWithComments,
-    "deriving">:
-      doc "Derived type class instances" $
-      T.list deriving_]
-
-dataOrNewtype :: Binding
-dataOrNewtype = define "DataOrNewtype" $
-  doc "The 'data' versus 'newtype keyword" $
-  T.enum ["data", "newtype"]
-
-declarationWithComments :: Binding
-declarationWithComments = define "DeclarationWithComments" $
-  doc "A data declaration together with any comments" $
-  T.record [
-    "body">:
-      doc "The declaration"
-      declaration,
-    "comments">:
-      doc "Optional comments" $
-      T.maybe T.string]
-
-declaration :: Binding -- UDecl
-declaration = define "Declaration" $
-  doc "A data or value declaration" $
-  -- omitted for now: typeFamily, typeSignature, closedTypeFamily, gDataDecl, typeInst, dataInst, gDataInst, class, inst,
-  --                  patternSynonym, deriv, fixity, default, patTypeSig, foreignImport, foreignExport, pragma,
-  --                  role, splice
-  T.union [
-    "data">:
-      doc "A data type declaration"
-      dataDeclaration,
-    "type">:
-      doc "A type synonym declaration"
-      typeDeclaration,
-    "valueBinding">:
-      doc "A value binding"
-      valueBinding,
-    "typedBinding">:
-      doc "A typed binding"
-      typedBinding]
-
-declarationHead :: Binding -- UDeclHead
-declarationHead = define "DeclarationHead" $
-  doc "The left-hand side of a declaration" $
-  -- omitted for now: infix application
-  T.union [
-    "application">:
-      doc "An application-style declaration head"
-      applicationDeclarationHead,
-    "parens">:
-      doc "A parenthesized declaration head"
-      declarationHead,
-    "simple">:
-      doc "A simple name"
-      name]
-
-applicationDeclarationHead :: Binding
-applicationDeclarationHead = define "ApplicationDeclarationHead" $
-  doc "An application-style declaration head" $
-  T.record [
-    "function">:
-      doc "The function being applied"
-      declarationHead,
-    "operand">:
-      doc "The type variable operand"
-      variable]
-
-deriving_ :: Binding -- UDeriving
-deriving_ = define "Deriving" $
-  doc "A 'deriving' statement" $
-  -- omitted for now: infix, parenthesized, and application instance heads
-  T.wrap $ T.list name
-
-export :: Binding -- UExportSpec
-export = define "Export" $
-  doc "An export statement" $
-  T.union [
-    "declaration">:
-      doc "An exported declaration"
-      importExportSpec,
-    "module">:
-      doc "An exported module"
-      moduleName]
-
-expression :: Binding -- UExpr
-expression = define "Expression" $
-  doc "A data expression" $
-  -- omitted for now: multi-if, unboxed tuple, tuple section, unboxed tuple section, parallel array,
-  --                  enum, parallel array enum, list comp, parallel array comp, type application,
-  --                  (all Template Haskell constructors), pragma, arrow definition, arrow application,
-  --                  lambda cases, static, unboxed sum, hole
-  T.union [
-    "application">:
-      doc "A function application"
-      applicationExpression,
-    "case">:
-      doc "A case expression"
-      caseExpression,
-    "constructRecord">:
-      doc "A record constructor expression"
-      constructRecordExpression,
-    "do">:
-      doc "A 'do' expression" $
-      T.list statement, -- omitted for now: do vs. mdo
-    "if">:
-      doc "An 'if' expression"
-      ifExpression,
-    "infixApplication">:
-      doc "An infix application"
-      infixApplicationExpression,
-    "literal">:
-      doc "A literal value"
-      literal,
-    "lambda">:
-      doc "A lambda expression"
-      lambdaExpression,
-    "leftSection">:
-      doc "A left section expression"
-      sectionExpression,
-    "let">:
-      doc "A 'let' expression"
-      letExpression,
-    "list">:
-      doc "A list expression" $
-      T.list expression,
-    "parens">:
-      doc "A parenthesized expression"
-      expression,
-    "prefixApplication">:
-      doc "A prefix application"
-      prefixApplicationExpression,
-    "rightSection">:
-      doc "A right section expression"
-      sectionExpression,
-    "tuple">:
-      doc "A tuple expression" $
-      T.list expression,
-    "typeSignature">:
-      doc "A type signature expression"
-      typeSignatureExpression,
-    "updateRecord">:
-      doc "A record update expression"
-      updateRecordExpression,
-    "variable">:
-      doc "A variable reference"
-      name]
-
-applicationExpression :: Binding
-applicationExpression = define "ApplicationExpression" $
-  doc "An application expression" $
-  T.record [
-    "function">:
-      doc "The function being applied"
-      expression,
-    "argument">:
-      doc "The argument"
-      expression]
-
-caseExpression :: Binding
-caseExpression = define "CaseExpression" $
-  doc "A case expression" $
-  T.record [
-    "case">:
-      doc "The expression being matched"
-      expression,
-    "alternatives">:
-      doc "The pattern-matching alternatives" $
-      T.list alternative]
-
-constructRecordExpression :: Binding
-constructRecordExpression = define "ConstructRecordExpression" $
-  doc "A record constructor expression" $
-  T.record [
-    "name">:
-      doc "The constructor name"
-      name,
-    "fields">:
-      doc "The field assignments" $
-      T.list fieldUpdate]
-
-ifExpression :: Binding
-ifExpression = define "IfExpression" $
-  doc "An 'if' expression" $
-  T.record [
-    "condition">:
-      doc "The condition expression"
-      expression,
-    "then">:
-      doc "The 'then' branch"
-      expression,
-    "else">:
-      doc "The 'else' branch"
-      expression]
-
-infixApplicationExpression :: Binding
-infixApplicationExpression = define "InfixApplicationExpression" $
-  doc "An infix application expression" $
-  T.record [
-    "lhs">:
-      doc "The left-hand operand"
-      expression,
-    "operator">:
-      doc "The infix operator"
-      operator,
-    "rhs">:
-      doc "The right-hand operand"
-      expression]
-
-lambdaExpression :: Binding
-lambdaExpression = define "LambdaExpression" $
-  doc "A lambda expression" $
-  T.record [
-    "bindings">:
-      doc "The patterns binding parameters" $
-      T.list pattern,
-    "inner">:
-      doc "The body of the lambda"
-      expression]
-
-letExpression :: Binding
-letExpression = define "LetExpression" $
-  doc "A 'let' expression" $
-  T.record [
-    "bindings">:
-      doc "The local bindings" $
-      T.list localBinding,
-    "inner">:
-      doc "The body of the let expression"
-      expression]
-
-prefixApplicationExpression :: Binding
-prefixApplicationExpression = define "PrefixApplicationExpression" $
-  doc "A prefix expression" $
-  T.record [
-    "operator">:
-      doc "The prefix operator"
-      operator,
-    "rhs">:
-      doc "The operand"
-      expression]
-
-sectionExpression :: Binding
-sectionExpression = define "SectionExpression" $
-  doc "A section expression" $
-  T.record [
-    "operator">:
-      doc "The operator"
-      operator,
-    "expression">:
-      doc "The operand"
-      expression]
-
-typeSignatureExpression :: Binding
-typeSignatureExpression = define "TypeSignatureExpression" $
-  doc "A type signature expression" $
-  T.record [
-    "inner">:
-      doc "The expression being typed"
-      expression,
-    "type">:
-      doc "The type signature"
-      type_]
-
-updateRecordExpression :: Binding
-updateRecordExpression = define "UpdateRecordExpression" $
-  doc "An update record expression" $
-  T.record [
-    "inner">:
-      doc "The record being updated"
-      expression,
-    "fields">:
-      doc "The field updates" $
-      T.list fieldUpdate]
-
-field :: Binding -- UFieldDecl
-field = define "Field" $
-  doc "A field (name/type pair)" $
-  T.record [
-    "name">:
-      doc "The field name"
-      name,
-    "type">:
-      doc "The field type"
-      type_]
-
-fieldWithComments :: Binding
-fieldWithComments = define "FieldWithComments" $
-  doc "A field together with any comments" $
-  T.record [
-    "field">:
-      doc "The field"
-      field,
-    "comments">:
-      doc "Optional comments" $
-      T.maybe T.string]
-
-fieldUpdate :: Binding -- UFieldUpdate
-fieldUpdate = define "FieldUpdate" $
-  doc "A field name and value" $
-  -- omitted for now: pun, wildcard
-  T.record [
-    "name">:
-      doc "The field name"
-      name,
-    "value">:
-      doc "The field value"
-      expression]
-
-import_ :: Binding -- UImportDecl
-import_ = define "Import" $
-  doc "An import statement" $
-  -- omitted for now: source, safe, pkg
-  T.record [
-    "qualified">:
-      doc "Whether the import is qualified"
-      T.boolean,
-    "module">:
-      doc "The module being imported"
-      moduleName,
-    "as">:
-      doc "Optional alias for the module" $
-      T.maybe moduleName,
-    "spec">:
-      doc "Optional import specification" $
-      T.maybe specImport]
-
-specImport :: Binding
-specImport = define "SpecImport" $
-  doc "An import specification" $
-  T.union [
-    "list">:
-      doc "A list of imports to include" $
-      T.list importExportSpec,
-    "hiding">:
-      doc "A list of imports to exclude" $
-      T.list importExportSpec]
-
-importModifier :: Binding -- UImportModifier
-importModifier = define "ImportModifier" $
-  doc "An import modifier ('pattern' or 'type')" $
-  T.enum ["pattern", "type"]
-
-importExportSpec :: Binding -- UIESpec
-importExportSpec = define "ImportExportSpec" $
-  doc "An import or export specification" $
-  T.record [
-    "modifier">:
-      doc "Optional import modifier" $
-      T.maybe importModifier,
-    "name">:
-      doc "The name being imported or exported"
-      name,
-    "subspec">:
-      doc "Optional subspecification" $
-      T.maybe subspecImportExportSpec]
-
-subspecImportExportSpec :: Binding
-subspecImportExportSpec = define "SubspecImportExportSpec" $
-  doc "A subspecification within an import/export" $
-  T.union [
-    "all">:
-      doc "Import/export all"
-      T.unit,
-    "list">:
-      doc "Import/export specific names" $
-      T.list name]
-
-literal :: Binding -- ULiteral
-literal = define "Literal" $
-  doc "A literal value" $
-  -- omitted for now: frac, primChar
-  T.union [
-    "char">:
-      doc "A character literal"
-      T.uint16,
-    "double">:
-      doc "A double-precision floating point literal"
-      T.float64,
-    "float">:
-      doc "A single-precision floating point literal"
-      T.float32,
-    "int">:
-      doc "A 32-bit integer literal"
-      T.int32,
-    "integer">:
-      doc "An arbitrary-precision integer literal"
-      T.bigint,
-    "string">:
-      doc "A string literal"
-      T.string]
-
-localBinding :: Binding -- ULocalBind
-localBinding = define "LocalBinding" $
-  doc "A local binding" $
-  -- omitted for now: fixity, pragma
-  T.union [
-    "signature">:
-      doc "A type signature"
-      typeSignature,
-    "value">:
-      doc "A value binding"
-      valueBinding]
-
-localBindings :: Binding -- ULocalBinds
-localBindings = define "LocalBindings" $
-  doc "A collection of local bindings" $
-  T.wrap $ T.list localBinding
-
-module' :: Binding -- UModule
-module' = define "Module" $
-  doc "A Haskell module" $
-  -- omitted for now: pragma
-  T.record [
-    "head">:
-      doc "Optional module head" $
-      T.maybe moduleHead,
-    "imports">:
-      doc "Import statements" $
-      T.list import_,
-    "declarations">:
-      doc "Module declarations" $
-      T.list declarationWithComments]
-
-moduleHead :: Binding -- UModuleHead
-moduleHead = define "ModuleHead" $
-  doc "A module head" $
-  -- omitted for now: pragma
-  T.record [
-    "comments">:
-      doc "Optional module-level comments" $
-      T.maybe T.string,
-    "name">:
-      doc "The module name"
-      moduleName,
-    "exports">:
-      doc "Export list" $
-      T.list export] -- UExportSpecs
-
-moduleName :: Binding -- UModuleName
-moduleName = define "ModuleName" $
-  doc "A module name" $
-  T.wrap T.string
-
-name :: Binding -- UName
-name = define "Name" $
-  doc "A name" $
-  T.union [
-    "implicit">:
-      doc "An implicit name"
-      qualifiedName,
-    "normal">:
-      doc "A normal name"
-      qualifiedName,
-    "parens">:
-      doc "A parenthesized name"
-      qualifiedName]
-
-namePart :: Binding -- UNamePart
-namePart = define "NamePart" $
-  doc "A component of a qualified name" $
-  T.wrap T.string
-
-operator :: Binding -- UOperator
-operator = define "Operator" $
-  doc "An operator" $
-  T.union [
-    "backtick">:
-      doc "A function used as an infix operator"
-      qualifiedName,
-    "normal">:
-      doc "A normal infix operator"
-      qualifiedName]
-
-pattern :: Binding -- UPattern
-pattern = define "Pattern" $
-  doc "A pattern" $
-  -- omitted for now: unboxed tuples, parallel arrays, irrefutable, bang, view, splice, quasiquote, plusk, unboxed sum
-  T.union [
-    "application">:
-      doc "An application pattern"
-      applicationPattern,
-    "as">:
-      doc "An 'as' pattern"
-      asPattern,
-    "list">:
-      doc "A list pattern" $
-      T.list pattern,
-    "literal">:
-      doc "A literal pattern"
-      literal,
-    "name">:
-      doc "A name pattern"
-      name,
-    "parens">:
-      doc "A parenthesized pattern"
-      pattern,
-    "record">:
-      doc "A record pattern"
-      recordPattern,
-    "tuple">:
-      doc "A tuple pattern" $
-      T.list pattern,
-    "typed">:
-      doc "A typed pattern"
-      typedPattern,
-    "wildcard">:
-      doc "A wildcard pattern"
-      T.unit]
-
-applicationPattern :: Binding
-applicationPattern = define "ApplicationPattern" $
-  doc "An application pattern" $
-  T.record [
-    "name">:
-      doc "The constructor name"
-      name,
-    "args">:
-      doc "The pattern arguments" $
-      T.list pattern]
-
-asPattern :: Binding
-asPattern = define "AsPattern" $
-  doc "An 'as' pattern" $
-  T.record [
-    "name">:
-      doc "The bound name"
-      name,
-    "inner">:
-      doc "The inner pattern"
-      pattern]
-
-recordPattern :: Binding
-recordPattern = define "RecordPattern" $
-  doc "A record pattern" $
-  T.record [
-    "name">:
-      doc "The constructor name"
-      name,
-    "fields">:
-      doc "The field patterns" $
-      T.list patternField]
-
-typedPattern :: Binding
-typedPattern = define "TypedPattern" $
-  doc "A typed pattern" $
-  T.record [
-    "inner">:
-      doc "The inner pattern"
-      pattern,
-    "type">:
-      doc "The type annotation"
-      type_]
-
-patternField :: Binding -- UPatternField
-patternField = define "PatternField" $
-  doc "A pattern field" $
-  -- omitted for now: puns, wildcards
-  T.record [
-    "name">:
-      doc "The field name"
-      name,
-    "pattern">:
-      doc "The field pattern"
-      pattern]
-
-qualifiedName :: Binding -- UQualifiedName
-qualifiedName = define "QualifiedName" $
-  doc "A qualified name" $
-  T.record [
-    "qualifiers">:
-      doc "The qualifier parts" $
-      T.list namePart,
-    "unqualified">:
-      doc "The unqualified name part"
-      namePart]
-
-rightHandSide :: Binding -- URhs
-rightHandSide = define "RightHandSide" $
-  doc "A right-hand side of a binding" $
-  -- omitted for now: guarded rhs
-  T.wrap expression
-
-statement :: Binding -- UStmt
-statement = define "Statement" $
-  doc "A do-notation statement" $
-  T.wrap expression
-
-type_ :: Binding -- UType
-type_ = define "Type" $
-  doc "A type expression" $
-  -- omitted for now: forall, unboxed tuple, parallel array, kinded, promoted, splice, quasiquote, bang,
-  --                  lazy, unpack, nounpack, wildcard, named wildcard, sum
-  T.union [
-    "application">:
-      doc "An application type"
-      applicationType,
-    "ctx">:
-      doc "A context type"
-      contextType,
-    "function">:
-      doc "A function type"
-      functionType,
-    "infix">:
-      doc "An infix type"
-      infixType,
-    "list">:
-      doc "A list type"
-      type_,
-    "parens">:
-      doc "A parenthesized type"
-      type_,
-    "tuple">:
-      doc "A tuple type" $
-      T.list type_,
-    "variable">:
-      doc "A type variable or type name"
-      name]
-
-applicationType :: Binding
-applicationType = define "ApplicationType" $
-  doc "An application type" $
-  T.record [
-    "context">:
-      doc "The type being applied"
-      type_,
-    "argument">:
-      doc "The type argument"
-      type_]
-
-contextType :: Binding
-contextType = define "ContextType" $
-  doc "A type with a context (type class constraints)" $
-  T.record [
-    "ctx">:
-      doc "The type class context"
-      assertion, -- UContext
-    "type">:
-      doc "The constrained type"
-      type_]
-
-functionType :: Binding
-functionType = define "FunctionType" $
-  doc "A function type" $
-  T.record [
-    "domain">:
-      doc "The domain type"
-      type_,
-    "codomain">:
-      doc "The codomain type"
-      type_]
-
-infixType :: Binding
-infixType = define "InfixType" $
-  doc "An infix type application" $
-  T.record [
-    "lhs">:
-      doc "The left-hand type"
-      type_,
-    "operator">:
-      doc "The type operator"
-      operator,
-    "rhs">:
-      doc "The right-hand operator"
-      operator]
-
-typeDeclaration :: Binding -- UTypeDecl
-typeDeclaration = define "TypeDeclaration" $
-  doc "A type synonym declaration" $
-  T.record [
-    "name">:
-      doc "The declaration head"
-      declarationHead,
-    "type">:
-      doc "The type being defined"
-      type_]
-
-typeSignature :: Binding -- UTypeSignature
-typeSignature = define "TypeSignature" $
-  doc "A type signature" $
-  T.record [
-    "name">:
-      doc "The name being typed"
-      name,
-    "type">:
-      doc "The type"
-      type_]
-
-typedBinding :: Binding -- Added for convenience
-typedBinding = define "TypedBinding" $
-  doc "A binding with its type signature" $
-  T.record [
-    "typeSignature">:
-      doc "The type signature"
-      typeSignature,
-    "valueBinding">:
-      doc "The value binding"
-      valueBinding]
-
-valueBinding :: Binding -- UValueBind
-valueBinding = define "ValueBinding" $
-  doc "A value binding" $
-  -- omitted for now: funBind
-  T.union [
-    "simple">:
-      doc "A simple value binding"
-      simpleValueBinding]
-
-simpleValueBinding :: Binding
-simpleValueBinding = define "SimpleValueBinding" $
-  doc "A simple value binding" $
-  T.record [
-    "pattern">:
-      doc "The pattern being bound"
-      pattern,
-    "rhs">:
-      doc "The right-hand side"
-      rightHandSide,
-    "localBindings">:
-      doc "Optional local bindings (where clause)" $
-      T.maybe localBindings]
-
-variable :: Binding
-variable = define "Variable" $
-  doc "A type variable" $
-  -- omitted for now: kind constraints
-  T.wrap name
diff --git a/src/main/haskell/Hydra/Sources/Haskell/Coder.hs b/src/main/haskell/Hydra/Sources/Haskell/Coder.hs
--- a/src/main/haskell/Hydra/Sources/Haskell/Coder.hs
+++ b/src/main/haskell/Hydra/Sources/Haskell/Coder.hs
@@ -8,22 +8,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -32,26 +29,24 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
+import qualified Hydra.Dsl.Meta.Context                    as Ctx
+import qualified Hydra.Dsl.Errors                     as Error
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -60,26 +55,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -91,13 +83,21 @@
 import qualified Data.Maybe                                as Y
 
 -- Additional imports
-import qualified Hydra.Ext.Haskell.Ast as H
+import qualified Hydra.Ext.Haskell.Syntax as H
 import qualified Hydra.Sources.Haskell.Language as HaskellLanguage
-import qualified Hydra.Sources.Haskell.Ast as HaskellAst
+import qualified Hydra.Sources.Haskell.Syntax as HaskellSyntax
 import qualified Hydra.Sources.Haskell.Serde as HaskellSerde
 import qualified Hydra.Sources.Haskell.Utils as HaskellUtils
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors as ShowError
 
 
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
+-- | Lift Either String to Either (InContext Error) using a context
+liftStringError :: TTerm Context -> TTerm (Either String a) -> TTerm (Either (InContext Error) a)
+liftStringError cx = Eithers.bimap ("_s" ~> Ctx.inContext (Error.errorOther $ Error.otherError $ var "_s") cx) ("_x" ~> var "_x")
+
 type HaskellNamespaces = Namespaces H.ModuleName
 
 haskellCoderDefinition :: String -> TTerm a -> TBinding a
@@ -106,55 +106,45 @@
 module_ :: Module
 module_ = Module ns elements
     [HaskellSerde.ns, HaskellUtils.ns,
-      AdaptModules.ns, Rewriting.ns, Serialization.ns]
-    (HaskellAst.ns:KernelTypes.kernelTypesNamespaces) $
+      Adapt.ns, Rewriting.ns, Serialization.ns, ShowError.ns]
+    (HaskellSyntax.ns:KernelTypes.kernelTypesNamespaces) $
     Just "Functions for encoding Hydra modules as Haskell modules"
   where
     ns = Namespace "hydra.ext.haskell.coder"
     elements = [
-      toBinding includeTypeDefinitions,
-      toBinding useCoreImport,
-      toBinding keyHaskellVar,
-      toBinding adaptTypeToHaskellAndEncode,
-      toBinding constantForFieldName,
-      toBinding constantForTypeName,
-      toBinding constructModule,
-      toBinding encodeFunction,
-      toBinding encodeLiteral,
-      toBinding encodeTerm,
-      toBinding encodeType,
-      toBinding encodeTypeWithClassAssertions,
-      toBinding findOrdVariables,
-      toBinding getImplicitTypeClasses,
-      toBinding moduleToHaskellModule,
-      toBinding moduleToHaskell,
-      toBinding nameDecls,
-      toBinding toDataDeclaration,
---      toBinding toTypeDeclarations,
-      toBinding toTypeDeclarationsFrom,
-      toBinding typeDecl,
-      toBinding typeSchemeConstraintsToClassMap]
-
--- TODO: make these settings configurable
-includeTypeDefinitions :: TBinding Bool
-includeTypeDefinitions = haskellCoderDefinition "includeTypeDefinitions" $
-  doc "Whether to include type definitions in generated Haskell modules" $
-  false
-useCoreImport :: TBinding Bool
-useCoreImport = haskellCoderDefinition "useCoreImport" $
-  doc "Whether to use the Hydra core import in generated modules" $
-  true
-
-keyHaskellVar :: TBinding Name
-keyHaskellVar = haskellCoderDefinition "keyHaskellVar" $
-  doc "The key used to track Haskell variable depth in annotations" $
-  wrap _Name $ string "haskellVar"
+      toTermDefinition adaptTypeToHaskellAndEncode,
+      toTermDefinition constantForFieldName,
+      toTermDefinition constantForTypeName,
+      toTermDefinition constructModule,
+      toTermDefinition encodeCaseExpression,
+      toTermDefinition encodeFunction,
+      toTermDefinition encodeLiteral,
+      toTermDefinition encodeTerm,
+      toTermDefinition encodeType,
+      toTermDefinition encodeTypeWithClassAssertions,
+      toTermDefinition findOrdVariables,
+      toTermDefinition getImplicitTypeClasses,
+      toTermDefinition includeTypeDefinitions,
+      toTermDefinition keyHaskellVar,
+      toTermDefinition moduleToHaskell,
+      toTermDefinition moduleToHaskellModule,
+      toTermDefinition nameDecls,
+      toTermDefinition toDataDeclaration,
+      toTermDefinition toTypeDeclarationsFrom,
+      toTermDefinition typeDecl,
+      toTermDefinition typeSchemeConstraintsToClassMap,
+      toTermDefinition useCoreImport]
 
-adaptTypeToHaskellAndEncode :: TBinding (HaskellNamespaces -> Type -> Flow Graph H.Type)
+adaptTypeToHaskellAndEncode :: TBinding (HaskellNamespaces -> Type -> Context -> Graph -> Either (InContext Error) H.Type)
 adaptTypeToHaskellAndEncode = haskellCoderDefinition "adaptTypeToHaskellAndEncode" $
   doc "Adapt a Hydra type to Haskell's type system and encode it" $
-  "namespaces" ~>
-    AdaptModules.adaptTypeToLanguageAndEncode @@ (HaskellLanguage.haskellLanguage) @@ (encodeType @@ var "namespaces")
+  "namespaces" ~> "typ" ~> "cx" ~> "g" ~>
+  "enc" <~ ("t" ~> encodeType @@ var "namespaces" @@ var "t" @@ var "cx" @@ var "g") $
+  cases _Type (Rewriting.deannotateType @@ var "typ")
+    (Just (
+      "adaptedType" <<~ liftStringError (var "cx") (Adapt.adaptTypeForLanguage @@ HaskellLanguage.haskellLanguage @@ var "typ") $
+      var "enc" @@ var "adaptedType")) [
+    _Type_variable>>: constant (var "enc" @@ var "typ")]
 
 constantForFieldName :: TBinding (Name -> Name -> String)
 constantForFieldName = haskellCoderDefinition "constantForFieldName" $
@@ -172,21 +162,21 @@
   "tname" ~>
     Strings.cat2 (string "_") (Names.localNameOf @@ var "tname")
 
-constructModule :: TBinding (HaskellNamespaces -> Module -> [Definition] -> Flow Graph H.Module)
+constructModule :: TBinding (HaskellNamespaces -> Module -> [Definition] -> Context -> Graph -> Either (InContext Error) H.Module)
 constructModule = haskellCoderDefinition "constructModule" $
   doc "Construct a Haskell module from a Hydra module and its definitions" $
-  "namespaces" ~> "mod" ~> "defs" ~> lets [
+  "namespaces" ~> "mod" ~> "defs" ~> "cx" ~> "g" ~> lets [
   "h">: "namespace" ~>
     unwrap _Namespace @@ var "namespace",
-  "createDeclarations">: "g" ~> "def" ~>
+  "createDeclarations">: "def" ~>
     cases _Definition (var "def") Nothing [
       _Definition_type>>: "type" ~> lets [
         "name">: Module.typeDefinitionName $ var "type",
         "typ">: Module.typeDefinitionType $ var "type"] $
-        toTypeDeclarationsFrom @@ var "namespaces" @@ var "name" @@ var "typ",
+        toTypeDeclarationsFrom @@ var "namespaces" @@ var "name" @@ var "typ" @@ var "cx" @@ var "g",
       _Definition_term>>: "term" ~>
-        "d" <<~ toDataDeclaration @@ var "namespaces" @@ var "term" $
-        Flows.pure $ list [var "d"]],
+        "d" <<~ toDataDeclaration @@ var "namespaces" @@ var "term" @@ var "cx" @@ var "g" $
+        right $ list [var "d"]],
     "importName">: "name" ~>
       wrap H._ModuleName $ Strings.intercalate (string ".") (Lists.map (Formatting.capitalize) (Strings.splitOn (string ".") (var "name"))),
     "imports">: Lists.concat2 (var "domainImports") (var "standardImports"),
@@ -230,11 +220,10 @@
         (Logic.ifElse (Schemas.moduleContainsBinaryLiterals @@ var "mod")
           (list [pair (pair (string "Hydra.Lib.Literals") (just $ string "Literals")) (list ([] :: [TTerm String]))])
           (list ([] :: [TTerm ((String, Maybe String), [String])])))] $
-    "g" <<~ Monads.getState $
-    "declLists" <<~ Flows.mapList (var "createDeclarations" @@ var "g") (var "defs") $ lets [
+    "declLists" <<~ Eithers.mapList (var "createDeclarations") (var "defs") $ lets [
     "decls">: Lists.concat $ var "declLists",
     "mc">: Module.moduleDescription $ var "mod"] $
-    Flows.pure $ record H._Module [
+    right $ record H._Module [
       H._Module_head>>: just $ record H._ModuleHead [
         H._ModuleHead_comments>>: var "mc",
         H._ModuleHead_name>>: var "importName" @@ (var "h" @@ (Module.moduleNamespace $ var "mod")),
@@ -242,201 +231,228 @@
       H._Module_imports>>: var "imports",
       H._Module_declarations>>: var "decls"]
 
-encodeFunction :: TBinding (HaskellNamespaces -> Function -> Flow Graph H.Expression)
+encodeCaseExpression :: TBinding (Int -> HaskellNamespaces -> CaseStatement -> H.Expression -> Context -> Graph -> Either (InContext Error) H.Expression)
+encodeCaseExpression = haskellCoderDefinition "encodeCaseExpression" $
+  doc "Encode a Hydra case statement as a Haskell case expression with a given scrutinee" $
+  "depth" ~> "namespaces" ~> "stmt" ~> "scrutinee" ~> "cx" ~> "g" ~> lets [
+    "dn">: Core.caseStatementTypeName $ var "stmt",
+    "def">: Core.caseStatementDefault $ var "stmt",
+    "fields">: Core.caseStatementCases $ var "stmt",
+    "toAlt">: "fieldMap" ~> "field" ~> lets [
+      "fn">: Core.fieldName $ var "field",
+      "fun'">: Core.fieldTerm $ var "field",
+      "v0">: Strings.cat2 (string "v") (Literals.showInt32 $ var "depth"),
+      "raw">: MetaTerms.apply (var "fun'") (Core.termVariable $ Core.name $ var "v0"),
+      "rhsTerm">: Rewriting.simplifyTerm @@ var "raw",
+      "v1">: Logic.ifElse (Rewriting.isFreeVariableInTerm @@ (wrap _Name $ var "v0") @@ var "rhsTerm")
+        (Constants.ignoredVariable)
+        (var "v0"),
+      "hname">: HaskellUtils.unionFieldReference @@ (Sets.union (Sets.fromList (Maps.keys (Graph.graphBoundTerms $ var "g"))) (Sets.fromList (Maps.keys (Graph.graphSchemaTypes $ var "g")))) @@ var "namespaces" @@ var "dn" @@ var "fn"] $
+          "args" <<~ (Maybes.cases (Maps.lookup (var "fn") (var "fieldMap"))
+              (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat $ list [string "field ", Literals.showString $ (Core.unName $ var "fn"),
+                string " not found in ", Literals.showString $ (Core.unName $ var "dn")])) (var "cx")) $
+              "fieldType" ~> lets [
+                "ft">: Core.fieldTypeType $ var "fieldType",
+                "noArgs">: list ([] :: [TTerm H.Pattern]),
+                "singleArg">: list [inject H._Pattern H._Pattern_name $ HaskellUtils.rawName @@ var "v1"]] $
+                cases _Type (Rewriting.deannotateType @@ var "ft")
+                  (Just $ right $ var "singleArg") [
+                  _Type_unit>>: constant $ right $ var "noArgs"]) $ lets [
+          "lhs">: HaskellUtils.applicationPattern @@ var "hname" @@ var "args"] $
+          "rhs" <<~ Eithers.map (unaryFunction $ wrap H._CaseRhs) (encodeTerm @@ (Math.add (var "depth") (int32 1)) @@ var "namespaces" @@ var "rhsTerm" @@ var "cx" @@ var "g") $
+          right $ record H._Alternative [
+            H._Alternative_pattern>>: var "lhs",
+            H._Alternative_rhs>>: var "rhs",
+            H._Alternative_binds>>: nothing]] $
+    "rt" <<~ Schemas.requireUnionType @@ var "cx" @@ var "g" @@ var "dn" $ lets [
+    "toFieldMapEntry">: "f" ~>
+      pair (Core.fieldTypeName $ var "f") (var "f"),
+    "fieldMap">: Maps.fromList $ Lists.map (var "toFieldMapEntry") (var "rt")] $
+    "ecases" <<~ Eithers.mapList (var "toAlt" @@ var "fieldMap") (var "fields") $
+    "dcases" <<~ (Maybes.cases (var "def")
+      (right $ list ([] :: [TTerm H.CaseRhs])) $
+      "d" ~>
+        "cs" <<~ Eithers.map (unaryFunction $ wrap H._CaseRhs) (encodeTerm @@ var "depth" @@ var "namespaces" @@ var "d" @@ var "cx" @@ var "g") $ lets [
+        "lhs">: inject H._Pattern H._Pattern_name $ HaskellUtils.rawName @@ (Constants.ignoredVariable),
+        "alt">: record H._Alternative [
+          H._Alternative_pattern>>: var "lhs",
+          H._Alternative_rhs>>: var "cs",
+          H._Alternative_binds>>: nothing]] $
+        right $ list [var "alt"]) $
+    right $ inject H._Expression H._Expression_case $ record H._CaseExpression [
+      H._CaseExpression_case>>: var "scrutinee",
+      H._CaseExpression_alternatives>>: Lists.concat2 (var "ecases") (var "dcases")]
+
+encodeFunction :: TBinding (Int -> HaskellNamespaces -> Function -> Context -> Graph -> Either (InContext Error) H.Expression)
 encodeFunction = haskellCoderDefinition "encodeFunction" $
   doc "Encode a Hydra function as a Haskell expression" $
-  "namespaces" ~> "fun" ~>
+  "depth" ~> "namespaces" ~> "fun" ~> "cx" ~> "g" ~>
     cases _Function (var "fun") Nothing [
       _Function_elimination>>: "e" ~>
         cases _Elimination (var "e") Nothing [
           _Elimination_wrap>>: "name" ~>
-            Flows.pure $ inject H._Expression H._Expression_variable $ HaskellUtils.elementReference @@ var "namespaces" @@
+            right $ inject H._Expression H._Expression_variable $ HaskellUtils.elementReference @@ var "namespaces" @@
               (Names.qname @@ (Maybes.fromJust $ Names.namespaceOf @@ var "name") @@ (HaskellUtils.newtypeAccessorName @@ var "name")),
           _Elimination_record>>: "proj" ~> lets [
             "dn">: Core.projectionTypeName $ var "proj",
             "fname">: Core.projectionField $ var "proj"] $
-            Flows.pure $ inject H._Expression H._Expression_variable $ HaskellUtils.recordFieldReference @@ var "namespaces" @@ var "dn" @@ var "fname",
-          _Elimination_union>>: "stmt" ~> lets [
-            "dn">: Core.caseStatementTypeName $ var "stmt",
-            "def">: Core.caseStatementDefault $ var "stmt",
-            "fields">: Core.caseStatementCases $ var "stmt",
-            "caseExpr">:
-              "rt" <<~ Lexical.withSchemaContext @@ (Schemas.requireUnionType @@ var "dn") $ lets [
-              "toFieldMapEntry">: "f" ~>
-                pair (Core.fieldTypeName $ var "f") (var "f"),
-              "fieldMap">: Maps.fromList $ Lists.map (var "toFieldMapEntry") (Core.rowTypeFields $ var "rt")] $
-              "ecases" <<~ Flows.mapList (var "toAlt" @@ var "fieldMap") (var "fields") $
-              "dcases" <<~ (Maybes.cases (var "def")
-                (Flows.pure $ list ([] :: [TTerm H.CaseRhs])) $
-                "d" ~>
-                  "cs" <<~ (Flows.map (unaryFunction $ wrap H._CaseRhs) $ encodeTerm @@ var "namespaces" @@ var "d") $ lets [
-                  "lhs">: inject H._Pattern H._Pattern_name $ HaskellUtils.rawName @@ (Constants.ignoredVariable),
-                  "alt">: record H._Alternative [
-                    H._Alternative_pattern>>: var "lhs",
-                    H._Alternative_rhs>>: var "cs",
-                    H._Alternative_binds>>: nothing]] $
-                  Flows.pure $ list [var "alt"]) $
-              Flows.pure $ inject H._Expression H._Expression_case $ record H._CaseExpression [
-                H._CaseExpression_case>>: HaskellUtils.hsvar @@ string "x",
-                H._CaseExpression_alternatives>>: Lists.concat2 (var "ecases") (var "dcases")],
-              "toAlt">: "fieldMap" ~> "field" ~> lets [
-                "fn">: Core.fieldName $ var "field",
-                "fun'">: Core.fieldTerm $ var "field"] $
-                Annotations.withDepth @@ keyHaskellVar @@ (
-                  "depth" ~> lets [
-                    "v0">: Strings.cat2 (string "v") (Literals.showInt32 $ var "depth"),
-                    "raw">: MetaTerms.apply (var "fun'") (Core.termVariable $ Core.name $ var "v0"),
-                    "rhsTerm">: Rewriting.simplifyTerm @@ var "raw",
-                    "v1">: Logic.ifElse (Rewriting.isFreeVariableInTerm @@ (wrap _Name $ var "v0") @@ var "rhsTerm")
-                      (Constants.ignoredVariable)
-                      (var "v0")] $
-                    "g_ufr" <<~ Monads.getState $ lets [
-                    "hname">: HaskellUtils.unionFieldReference @@ var "g_ufr" @@ var "namespaces" @@ var "dn" @@ var "fn"] $
-                    "args" <<~ (Maybes.cases (Maps.lookup (var "fn") (var "fieldMap"))
-                        (Flows.fail $ Strings.cat $ list [string "field ", Literals.showString $ (Core.unName $ var "fn"),
-                          string " not found in ", Literals.showString $ (Core.unName $ var "dn")]) $
-                        "fieldType" ~> lets [
-                          "ft">: Core.fieldTypeType $ var "fieldType",
-                          "noArgs">: Flows.pure $ list ([] :: [TTerm H.Pattern]),
-                          "singleArg">: Flows.pure $ list [inject H._Pattern H._Pattern_name $ HaskellUtils.rawName @@ var "v1"]] $
-                          cases _Type (Rewriting.deannotateType @@ var "ft")
-                            (Just $ var "singleArg") [
-                            _Type_unit>>: constant $ var "noArgs"]) $ lets [
-                    "lhs">: HaskellUtils.applicationPattern @@ var "hname" @@ var "args"] $
-                    "rhs" <<~ (Flows.map (unaryFunction $ wrap H._CaseRhs) $ encodeTerm @@ var "namespaces" @@ var "rhsTerm") $
-                    Flows.pure $ record H._Alternative [
-                      H._Alternative_pattern>>: var "lhs",
-                      H._Alternative_rhs>>: var "rhs",
-                      H._Alternative_binds>>: nothing])] $
-            Flows.map (HaskellUtils.hslambda @@ (HaskellUtils.rawName @@ string "x")) (var "caseExpr")],
+            right $ inject H._Expression H._Expression_variable $ HaskellUtils.recordFieldReference @@ var "namespaces" @@ var "dn" @@ var "fname",
+          _Elimination_union>>: "stmt" ~>
+            -- When used standalone (not applied to an argument), wrap in a lambda
+            Eithers.map (HaskellUtils.hslambda @@ (HaskellUtils.rawName @@ string "x"))
+              (encodeCaseExpression @@ var "depth" @@ var "namespaces" @@ var "stmt" @@ (HaskellUtils.hsvar @@ string "x") @@ var "cx" @@ var "g")],
       _Function_lambda>>: "lam" ~> lets [
         "v">: Core.lambdaParameter $ var "lam",
         "body">: Core.lambdaBody $ var "lam"] $
-        Flows.bind (encodeTerm @@ var "namespaces" @@ var "body") $ "hbody" ~>
-          Flows.pure $ HaskellUtils.hslambda @@ (HaskellUtils.elementReference @@ var "namespaces" @@ var "v") @@ var "hbody",
+        "hbody" <<~ encodeTerm @@ var "depth" @@ var "namespaces" @@ var "body" @@ var "cx" @@ var "g" $
+          right $ HaskellUtils.hslambda @@ (HaskellUtils.elementReference @@ var "namespaces" @@ var "v") @@ var "hbody",
       _Function_primitive>>: "name" ~>
-        Flows.pure $ inject H._Expression H._Expression_variable $ HaskellUtils.elementReference @@ var "namespaces" @@ var "name"]
+        right $ inject H._Expression H._Expression_variable $ HaskellUtils.elementReference @@ var "namespaces" @@ var "name"]
 
-encodeLiteral :: TBinding (Literal -> Flow Graph H.Expression)
+encodeLiteral :: TBinding (Literal -> Context -> Either (InContext Error) H.Expression)
 encodeLiteral = haskellCoderDefinition "encodeLiteral" $
   doc "Encode a Hydra literal as a Haskell expression" $
-  "l" ~>
+  "l" ~> "cx" ~>
     cases _Literal (var "l")
-      (Just $ Flows.fail $ Strings.cat2 (string "literal value ") (ShowCore.literal @@ var "l")) [
+      (Just $ Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "literal value ") (ShowCore.literal @@ var "l"))) (var "cx")) [
       _Literal_binary>>: "bs" ~>
-        -- Generate: Literals.stringToBinary "base64string"
-        -- Binary data is stored as a ByteString; we encode to base64 for the source and decode at runtime
-        -- Note: Literals.binaryToString is called at coder-execution time to convert ByteString to base64 String
-        Flows.pure $ HaskellUtils.hsapp
+        right $ HaskellUtils.hsapp
           @@ (HaskellUtils.hsvar @@ string "Literals.stringToBinary")
           @@ (HaskellUtils.hslit @@ (inject H._Literal H._Literal_string
               $ Literals.binaryToString $ var "bs")),
       _Literal_boolean>>: "b" ~>
-        Flows.pure $ HaskellUtils.hsvar @@ Logic.ifElse (var "b") (string "True") (string "False"),
+        right $ HaskellUtils.hsvar @@ Logic.ifElse (var "b") (string "True") (string "False"),
       _Literal_float>>: "fv" ~>
         cases _FloatValue (var "fv") Nothing [
           _FloatValue_float32>>: "f" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_float $ var "f"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_float $ var "f"),
           _FloatValue_float64>>: "f" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_double $ var "f"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_double $ var "f"),
           _FloatValue_bigfloat>>: "f" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_double $ Literals.bigfloatToFloat64 $ var "f")],
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_double $ Literals.bigfloatToFloat64 $ var "f")],
       _Literal_integer>>: "iv" ~>
         cases _IntegerValue (var "iv") Nothing [
           _IntegerValue_bigint>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ var "i"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ var "i"),
           _IntegerValue_int8>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.int8ToBigint $ var "i"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.int8ToBigint $ var "i"),
           _IntegerValue_int16>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.int16ToBigint $ var "i"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.int16ToBigint $ var "i"),
           _IntegerValue_int32>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_int $ var "i"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_int $ var "i"),
           _IntegerValue_int64>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.int64ToBigint $ var "i"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.int64ToBigint $ var "i"),
           _IntegerValue_uint8>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.uint8ToBigint $ var "i"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.uint8ToBigint $ var "i"),
           _IntegerValue_uint16>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.uint16ToBigint $ var "i"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.uint16ToBigint $ var "i"),
           _IntegerValue_uint32>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.uint32ToBigint $ var "i"),
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.uint32ToBigint $ var "i"),
           _IntegerValue_uint64>>: "i" ~>
-            Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.uint64ToBigint $ var "i")],
+            right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_integer $ Literals.uint64ToBigint $ var "i")],
       _Literal_string>>: "s" ~>
-        Flows.pure $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_string $ var "s")]
+        right $ HaskellUtils.hslit @@ (inject H._Literal H._Literal_string $ var "s")]
 
-encodeTerm :: TBinding (HaskellNamespaces -> Term -> Flow Graph H.Expression)
+encodeTerm :: TBinding (Int -> HaskellNamespaces -> Term -> Context -> Graph -> Either (InContext Error) H.Expression)
 encodeTerm = haskellCoderDefinition "encodeTerm" $
   doc "Encode a Hydra term as a Haskell expression" $
-  "namespaces" ~> "term" ~> lets [
-    "encode">: encodeTerm @@ var "namespaces"] $
+  "depth" ~> "namespaces" ~> "term" ~> "cx" ~> "g" ~> lets [
+    "encode">: "t" ~> encodeTerm @@ var "depth" @@ var "namespaces" @@ var "t" @@ var "cx" @@ var "g"] $
     "nonemptyMap" <~ ("m" ~> lets [
       "lhs">: HaskellUtils.hsvar @@ string "M.fromList",
       "encodePair">: "pair" ~> lets [
         "k">: Pairs.first $ var "pair",
-        "v">: Pairs.second $ var "pair",
-        "hk">: var "encode" @@ var "k",
-        "hv">: var "encode" @@ var "v"] $
-        Flows.map
-          (unaryFunction $ inject H._Expression H._Expression_tuple)
-          (Flows.sequence $ list [var "hk", var "hv"])] $
-      "rhs" <<~ Flows.map
+        "v">: Pairs.second $ var "pair"] $
+        "hk" <<~ var "encode" @@ var "k" $
+        "hv" <<~ var "encode" @@ var "v" $
+        right $ inject H._Expression H._Expression_tuple $ list [var "hk", var "hv"]] $
+      "rhs" <<~ Eithers.map
         (unaryFunction $ inject H._Expression H._Expression_list)
-        (Flows.mapList (var "encodePair") $ Maps.toList (var "m")) $
-      Flows.pure $ HaskellUtils.hsapp @@ var "lhs" @@ var "rhs") $
+        (Eithers.mapList (var "encodePair") $ Maps.toList (var "m")) $
+      right $ HaskellUtils.hsapp @@ var "lhs" @@ var "rhs") $
     "nonemptySet" <~ ("s" ~> lets [
       "lhs">: HaskellUtils.hsvar @@ string "S.fromList" ] $
-      "rhs" <<~ encodeTerm @@ var "namespaces" @@ (inject _Term _Term_list $ Sets.toList $ var "s") $
-      Flows.pure $ HaskellUtils.hsapp @@ var "lhs" @@ var "rhs") $
+      "rhs" <<~ encodeTerm @@ var "depth" @@ var "namespaces" @@ (inject _Term _Term_list $ Sets.toList $ var "s") @@ var "cx" @@ var "g" $
+      right $ HaskellUtils.hsapp @@ var "lhs" @@ var "rhs") $
     cases _Term (Rewriting.deannotateTerm @@ var "term")
-      (Just $ Flows.fail $ Strings.cat2 (string "unexpected term: ") (ShowCore.term @@ var "term")) [
+      (Just $ Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "unexpected term: ") (ShowCore.term @@ var "term"))) (var "cx")) [
       _Term_application>>: "app" ~> lets [
         "fun">: Core.applicationFunction $ var "app",
-        "arg">: Core.applicationArgument $ var "app"] $
-        Flows.bind (var "encode" @@ var "fun") $ "hfun" ~>
-          Flows.bind (var "encode" @@ var "arg") $ "harg" ~>
-            Flows.pure $ HaskellUtils.hsapp @@ var "hfun" @@ var "harg",
+        "arg">: Core.applicationArgument $ var "app",
+        "deannotatedFun">: Rewriting.deannotateTerm @@ (var "fun")] $
+        -- When the function is a union elimination, encode as a direct case expression
+        -- instead of (\x -> case x of ...) arg
+        cases _Term (var "deannotatedFun")
+          (Just $
+            "hfun" <<~ var "encode" @@ var "fun" $
+              "harg" <<~ var "encode" @@ var "arg" $
+                right $ HaskellUtils.hsapp @@ var "hfun" @@ var "harg") [
+          _Term_function>>: "f" ~>
+            cases _Function (var "f")
+              (Just $
+                "hfun" <<~ var "encode" @@ var "fun" $
+                  "harg" <<~ var "encode" @@ var "arg" $
+                    right $ HaskellUtils.hsapp @@ var "hfun" @@ var "harg") [
+              _Function_elimination>>: "e" ~>
+                cases _Elimination (var "e")
+                  (Just $
+                    "hfun" <<~ var "encode" @@ var "fun" $
+                      "harg" <<~ var "encode" @@ var "arg" $
+                        right $ HaskellUtils.hsapp @@ var "hfun" @@ var "harg") [
+                  _Elimination_union>>: "stmt" ~>
+                    "harg" <<~ var "encode" @@ var "arg" $
+                      encodeCaseExpression @@ var "depth" @@ var "namespaces" @@ var "stmt" @@ var "harg" @@ var "cx" @@ var "g"]]],
       _Term_either>>: "e" ~> Eithers.either_
           ("l" ~>
-            Flows.bind (var "encode" @@ var "l") $ "hl" ~>
-              Flows.pure $ HaskellUtils.hsapp @@ (HaskellUtils.hsvar @@ string "Left") @@ var "hl")
+            "hl" <<~ var "encode" @@ var "l" $
+              right $ HaskellUtils.hsapp @@ (HaskellUtils.hsvar @@ string "Left") @@ var "hl")
           ("r" ~>
-            Flows.bind (var "encode" @@ var "r") $ "hr" ~>
-              Flows.pure $ HaskellUtils.hsapp @@ (HaskellUtils.hsvar @@ string "Right") @@ var "hr")
+            "hr" <<~ var "encode" @@ var "r" $
+              right $ HaskellUtils.hsapp @@ (HaskellUtils.hsvar @@ string "Right") @@ var "hr")
           (var "e"),
       _Term_function>>: "f" ~>
-        encodeFunction @@ var "namespaces" @@ var "f",
+        encodeFunction @@ var "depth" @@ var "namespaces" @@ var "f" @@ var "cx" @@ var "g",
       _Term_let>>: "letTerm" ~> lets [
-        "bindings">: Core.letBindings $ var "letTerm",
-        "env">: Core.letBody $ var "letTerm",
+        "collectBindings">: "lt" ~>
+          "bs" <~ Core.letBindings (var "lt") $
+          "body" <~ Core.letBody (var "lt") $
+          cases _Term (Rewriting.deannotateTerm @@ var "body")
+            (Just $ pair (var "bs") (var "body")) [
+            _Term_let>>: "innerLt" ~>
+              "innerResult" <~ var "collectBindings" @@ var "innerLt" $
+              pair (Lists.concat2 (var "bs") (Pairs.first $ var "innerResult")) (Pairs.second $ var "innerResult")],
+        "collected">: var "collectBindings" @@ var "letTerm",
+        "allBindings">: Pairs.first $ var "collected",
+        "finalBody">: Pairs.second $ var "collected",
         "encodeBinding">: "binding" ~> lets [
           "name">: Core.bindingName $ var "binding",
           "term'">: Core.bindingTerm $ var "binding",
           "hname">: HaskellUtils.simpleName @@ (Core.unName $ var "name")] $
           "hexpr" <<~ var "encode" @@ var "term'" $
-          Flows.pure $ inject H._LocalBinding H._LocalBinding_value $ HaskellUtils.simpleValueBinding @@ var "hname" @@ var "hexpr" @@ nothing] $
-        "hbindings" <<~ Flows.mapList (var "encodeBinding") (var "bindings") $
-        "hinner" <<~ var "encode" @@ var "env" $
-        Flows.pure $ inject H._Expression H._Expression_let $ record H._LetExpression [
+          right $ inject H._LocalBinding H._LocalBinding_value $ HaskellUtils.simpleValueBinding @@ var "hname" @@ var "hexpr" @@ nothing] $
+        "hbindings" <<~ Eithers.mapList (var "encodeBinding") (var "allBindings") $
+        "hinner" <<~ var "encode" @@ var "finalBody" $
+        right $ inject H._Expression H._Expression_let $ record H._LetExpression [
           H._LetExpression_bindings>>: var "hbindings",
           H._LetExpression_inner>>: var "hinner"],
       _Term_list>>: "els" ~>
-        Flows.bind (Flows.mapList (var "encode") (var "els")) $ "helems" ~>
-          Flows.pure $ inject H._Expression H._Expression_list $ var "helems",
+        "helems" <<~ Eithers.mapList (var "encode") (var "els") $
+          right $ inject H._Expression H._Expression_list $ var "helems",
       _Term_literal>>: "v" ~>
-        encodeLiteral @@ var "v",
+        encodeLiteral @@ var "v" @@ var "cx",
       _Term_map>>: "m" ~> Logic.ifElse (Maps.null $ var "m")
-        (produce $ HaskellUtils.hsvar @@ string "M.empty")
+        (right $ HaskellUtils.hsvar @@ string "M.empty")
         (var "nonemptyMap" @@ var "m"),
       _Term_maybe>>: "m" ~>
         Maybes.cases (var "m")
-          (Flows.pure $ HaskellUtils.hsvar @@ string "Nothing") $
+          (right $ HaskellUtils.hsvar @@ string "Nothing") $
           "t" ~>
-            Flows.bind (var "encode" @@ var "t") $ "ht" ~>
-              Flows.pure $ HaskellUtils.hsapp @@ (HaskellUtils.hsvar @@ string "Just") @@ var "ht",
+            "ht" <<~ var "encode" @@ var "t" $
+              right $ HaskellUtils.hsapp @@ (HaskellUtils.hsvar @@ string "Just") @@ var "ht",
       _Term_pair>>: "p" ~>
         "f" <<~ var "encode" @@ Pairs.first (var "p") $
         "s" <<~ var "encode" @@ Pairs.second (var "p") $
-        Flows.pure $ inject H._Expression H._Expression_tuple $ list [var "f", var "s"],
+        right $ inject H._Expression H._Expression_tuple $ list [var "f", var "s"],
       _Term_record>>: "record" ~> lets [
         "sname">: Core.recordTypeName $ var "record",
         "fields">: Core.recordFields $ var "record",
@@ -445,16 +461,16 @@
           "ft">: Core.fieldTerm $ var "field",
           "fieldRef">: HaskellUtils.recordFieldReference @@ var "namespaces" @@ var "sname" @@ var "fn"] $
           "hft" <<~ var "encode" @@ var "ft" $
-          Flows.pure $ record H._FieldUpdate [
+          right $ record H._FieldUpdate [
             H._FieldUpdate_name>>: var "fieldRef",
             H._FieldUpdate_value>>: var "hft"],
           "typeName">: HaskellUtils.elementReference @@ var "namespaces" @@ var "sname"] $
-          "updates" <<~ Flows.mapList (var "toFieldUpdate") (var "fields") $
-          Flows.pure $ inject H._Expression H._Expression_constructRecord $ record H._ConstructRecordExpression [
+          "updates" <<~ Eithers.mapList (var "toFieldUpdate") (var "fields") $
+          right $ inject H._Expression H._Expression_constructRecord $ record H._ConstructRecordExpression [
             H._ConstructRecordExpression_name>>: var "typeName",
             H._ConstructRecordExpression_fields>>: var "updates"],
       _Term_set>>: "s" ~> Logic.ifElse (Sets.null $ var "s")
-        (produce $ HaskellUtils.hsvar @@ string "S.empty")
+        (right $ HaskellUtils.hsvar @@ string "S.empty")
         (var "nonemptySet" @@ var "s"),
       _Term_typeLambda>>: "abs" ~> lets [
         "term1">: Core.typeLambdaBody $ var "abs"] $
@@ -466,57 +482,55 @@
         "sname">: Core.injectionTypeName $ var "injection",
         "field">: Core.injectionField $ var "injection",
         "fn">: Core.fieldName $ var "field",
-        "ft">: Core.fieldTerm $ var "field"] $
-        "g_ufr2" <<~ Monads.getState $ lets [
-        "lhs">: inject H._Expression H._Expression_variable $ HaskellUtils.unionFieldReference @@ var "g_ufr2" @@ var "namespaces" @@ var "sname" @@ var "fn",
-        "dflt">: Flows.map (HaskellUtils.hsapp @@ var "lhs") (var "encode" @@ var "ft")] $
-        "ftyp" <<~ Schemas.requireUnionField_ @@ var "sname" @@ var "fn" $
+        "ft">: Core.fieldTerm $ var "field",
+        "lhs">: inject H._Expression H._Expression_variable $ HaskellUtils.unionFieldReference @@ (Sets.union (Sets.fromList (Maps.keys (Graph.graphBoundTerms $ var "g"))) (Sets.fromList (Maps.keys (Graph.graphSchemaTypes $ var "g")))) @@ var "namespaces" @@ var "sname" @@ var "fn",
+        "dflt">: Eithers.map (HaskellUtils.hsapp @@ var "lhs") (var "encode" @@ var "ft")] $
+        "ftyp" <<~ Schemas.requireUnionField_ @@ var "cx" @@ var "g" @@ var "sname" @@ var "fn" $
         cases _Type (Rewriting.deannotateType @@ var "ftyp")
           (Just $ var "dflt") [
-          _Type_unit>>: constant $ Flows.pure $ var "lhs"],
-      _Term_unit>>: constant $ Flows.pure $ inject H._Expression H._Expression_tuple $ list ([] :: [TTerm H.Expression]),
+          _Type_unit>>: constant $ right $ var "lhs"],
+      _Term_unit>>: constant $ right $ inject H._Expression H._Expression_tuple $ list ([] :: [TTerm H.Expression]),
       _Term_variable>>: "name" ~>
-        Flows.pure $ inject H._Expression H._Expression_variable $ HaskellUtils.elementReference @@ var "namespaces" @@ var "name",
+        right $ inject H._Expression H._Expression_variable $ HaskellUtils.elementReference @@ var "namespaces" @@ var "name",
       _Term_wrap>>: "wrapped" ~> lets [
         "tname">: Core.wrappedTermTypeName $ var "wrapped",
         "term'">: Core.wrappedTermBody $ var "wrapped",
         "lhs">: inject H._Expression H._Expression_variable $ HaskellUtils.elementReference @@ var "namespaces" @@ var "tname"] $
         "rhs" <<~ var "encode" @@ var "term'" $
-        Flows.pure $ HaskellUtils.hsapp @@ var "lhs" @@ var "rhs"]
+        right $ HaskellUtils.hsapp @@ var "lhs" @@ var "rhs"]
 
-encodeType :: TBinding (HaskellNamespaces -> Type -> Flow Graph H.Type)
+encodeType :: TBinding (HaskellNamespaces -> Type -> Context -> Graph -> Either (InContext Error) H.Type)
 encodeType = haskellCoderDefinition "encodeType" $
   doc "Encode a Hydra type as a Haskell type" $
   "namespaces" ~>
-  "typ" ~> lets [
-  "encode">: encodeType @@ var "namespaces",
+  "typ" ~> "cx" ~> "g" ~> lets [
+  "encode">: "t" ~> encodeType @@ var "namespaces" @@ var "t" @@ var "cx" @@ var "g",
   "ref">: "name" ~>
-    Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.elementReference @@ var "namespaces" @@ var "name",
+    right $ inject H._Type H._Type_variable $ HaskellUtils.elementReference @@ var "namespaces" @@ var "name",
   "unitTuple">: inject H._Type H._Type_tuple $ list ([] :: [TTerm H.Type])] $
-  trace (string "encode type") $
   cases _Type (Rewriting.deannotateType @@ var "typ")
-    (Just $ Flows.fail $ Strings.cat2 (string "unexpected type: ") (ShowCore.type_ @@ var "typ")) [
+    (Just $ Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "unexpected type: ") (ShowCore.type_ @@ var "typ"))) (var "cx")) [
     _Type_application>>: "app" ~> lets [
       "lhs">: Core.applicationTypeFunction $ var "app",
       "rhs">: Core.applicationTypeArgument $ var "app"] $
-      Flows.bind (var "encode" @@ var "lhs") $ "hlhs" ~>
-        Flows.bind (var "encode" @@ var "rhs") $ "hrhs" ~>
-          Flows.pure $ HaskellUtils.toTypeApplication @@ list [var "hlhs", var "hrhs"],
+      "hlhs" <<~ var "encode" @@ var "lhs" $
+        "hrhs" <<~ var "encode" @@ var "rhs" $
+          right $ HaskellUtils.toTypeApplication @@ list [var "hlhs", var "hrhs"],
     _Type_either>>: "eitherType" ~> lets [
-      "left">: Core.eitherTypeLeft $ var "eitherType",
-      "right">: Core.eitherTypeRight $ var "eitherType"] $
-      Flows.map
-        (HaskellUtils.toTypeApplication)
-        (Flows.sequence $ list [
-          Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Either",
-          var "encode" @@ var "left",
-          var "encode" @@ var "right"]),
+      "left'">: Core.eitherTypeLeft $ var "eitherType",
+      "right'">: Core.eitherTypeRight $ var "eitherType"] $
+      "hleft" <<~ var "encode" @@ var "left'" $
+      "hright" <<~ var "encode" @@ var "right'" $
+      right $ HaskellUtils.toTypeApplication @@ list [
+          inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Either",
+          var "hleft",
+          var "hright"],
     _Type_function>>: "funType" ~> lets [
       "dom">: Core.functionTypeDomain $ var "funType",
       "cod">: Core.functionTypeCodomain $ var "funType"] $
-      Flows.bind (var "encode" @@ var "dom") $ "hdom" ~>
-        Flows.bind (var "encode" @@ var "cod") $ "hcod" ~>
-          Flows.pure $ inject H._Type H._Type_function $ record H._FunctionType [
+      "hdom" <<~ var "encode" @@ var "dom" $
+        "hcod" <<~ var "encode" @@ var "cod" $
+          right $ inject H._Type H._Type_function $ record H._FunctionType [
             H._FunctionType_domain>>: var "hdom",
             H._FunctionType_codomain>>: var "hcod"],
     _Type_forall>>: "forallType" ~> lets [
@@ -524,77 +538,73 @@
       "body">: Core.forallTypeBody $ var "forallType"] $
       var "encode" @@ var "body",
     _Type_list>>: "lt" ~>
-      Flows.bind (var "encode" @@ var "lt") $ "hlt" ~>
-        Flows.pure $ inject H._Type H._Type_list $ var "hlt",
+      "hlt" <<~ var "encode" @@ var "lt" $
+        right $ inject H._Type H._Type_list $ var "hlt",
     _Type_literal>>: "lt" ~>
       cases _LiteralType (var "lt")
-        (Just $ Flows.fail $ Strings.cat2 (string "unexpected literal type: ") (ShowCore.literalType @@ var "lt")) [
+        (Just $ Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "unexpected literal type: ") (ShowCore.literalType @@ var "lt"))) (var "cx")) [
         _LiteralType_binary>>: constant $
-          Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "B.ByteString",
+          right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "B.ByteString",
         _LiteralType_boolean>>: constant $
-          Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Bool",
+          right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Bool",
         _LiteralType_float>>: "ft" ~>
           cases _FloatType (var "ft") Nothing [
             _FloatType_float32>>: constant $
-              Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Float",
+              right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Float",
             _FloatType_float64>>: constant $
-              Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Double",
+              right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Double",
             _FloatType_bigfloat>>: constant $
-              Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Double"],
+              right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Double"],
         _LiteralType_integer>>: "it" ~>
           cases _IntegerType (var "it")
-            (Just $ Flows.fail $ Strings.cat2 (string "unexpected integer type: ") (ShowCore.integerType @@ var "it")) [
+            (Just $ Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "unexpected integer type: ") (ShowCore.integerType @@ var "it"))) (var "cx")) [
             _IntegerType_bigint>>: constant $
-              Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Integer",
+              right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Integer",
             _IntegerType_int8>>: constant $
-              Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "I.Int8",
+              right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "I.Int8",
             _IntegerType_int16>>: constant $
-              Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "I.Int16",
+              right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "I.Int16",
             _IntegerType_int32>>: constant $
-              Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Int",
+              right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Int",
             _IntegerType_int64>>: constant $
-              Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "I.Int64"],
+              right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "I.Int64"],
         _LiteralType_string>>: constant $
-          Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "String"],
+          right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "String"],
     _Type_map>>: "mapType" ~> lets [
       "kt">: Core.mapTypeKeys $ var "mapType",
       "vt">: Core.mapTypeValues $ var "mapType"] $
-      Flows.map
-        (HaskellUtils.toTypeApplication)
-        (Flows.sequence $ list [
-          Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "M.Map",
-          var "encode" @@ var "kt",
-          var "encode" @@ var "vt"]),
+      "hkt" <<~ var "encode" @@ var "kt" $
+      "hvt" <<~ var "encode" @@ var "vt" $
+      right $ HaskellUtils.toTypeApplication @@ list [
+          inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "M.Map",
+          var "hkt",
+          var "hvt"],
     _Type_maybe>>: "ot" ~>
-      Flows.map
-        (HaskellUtils.toTypeApplication)
-        (Flows.sequence $ list [
-          Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Maybe",
-          var "encode" @@ var "ot"]),
+      "hot" <<~ var "encode" @@ var "ot" $
+      right $ HaskellUtils.toTypeApplication @@ list [
+          inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Maybe",
+          var "hot"],
     _Type_pair>>: "pt" ~>
       "f" <<~ var "encode" @@ (Core.pairTypeFirst $ var "pt") $
       "s" <<~ var "encode" @@ (Core.pairTypeSecond $ var "pt") $
-        Flows.pure $ inject H._Type H._Type_tuple $ list [var "f", var "s"],
-    _Type_record>>: "rt" ~> var "ref" @@ (Core.rowTypeTypeName $ var "rt"),
+        right $ inject H._Type H._Type_tuple $ list [var "f", var "s"],
+    _Type_record>>: constant (var "ref" @@ Core.name (string "placeholder")),
     _Type_set>>: "st" ~>
-      Flows.map
-        (HaskellUtils.toTypeApplication)
-        (Flows.sequence $ list [
-          Flows.pure $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "S.Set",
-          var "encode" @@ var "st"]),
-    _Type_union>>: "rt" ~> lets [
-      "typeName">: Core.rowTypeTypeName $ var "rt"] $
-      var "ref" @@ var "typeName",
-    _Type_unit>>: constant $ Flows.pure $ var "unitTuple",
+      "hst" <<~ var "encode" @@ var "st" $
+      right $ HaskellUtils.toTypeApplication @@ list [
+          inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "S.Set",
+          var "hst"],
+    _Type_union>>: constant (var "ref" @@ Core.name (string "placeholder")),
+    _Type_unit>>: constant $ right $ var "unitTuple",
     _Type_variable>>: "v1" ~> var "ref" @@ var "v1",
-    _Type_wrap>>: "wrapped" ~> lets [
-      "name">: Core.wrappedTypeTypeName $ var "wrapped"] $
-      var "ref" @@ var "name"]
+    _Type_void>>: constant $
+      right $ inject H._Type H._Type_variable $ HaskellUtils.rawName @@ string "Void",
+    _Type_wrap>>: constant (var "ref" @@ Core.name (string "placeholder"))]
 
-encodeTypeWithClassAssertions :: TBinding (HaskellNamespaces -> M.Map Name (S.Set TypeClass) -> Type -> Flow Graph H.Type)
+encodeTypeWithClassAssertions :: TBinding (HaskellNamespaces -> M.Map Name (S.Set TypeClass) -> Type -> Context -> Graph -> Either (InContext Error) H.Type)
 encodeTypeWithClassAssertions = haskellCoderDefinition "encodeTypeWithClassAssertions" $
   doc "Encode a Hydra type as a Haskell type with typeclass assertions" $
-  "namespaces" ~> "explicitClasses" ~> "typ" ~> lets [
+  "namespaces" ~> "explicitClasses" ~> "typ" ~> "cx" ~> "g" ~> lets [
     "classes">: Maps.union (var "explicitClasses") (getImplicitTypeClasses @@ var "typ"),
     "implicitClasses">: getImplicitTypeClasses @@ var "typ",
     "encodeAssertion">: "pair" ~> lets [
@@ -614,17 +624,16 @@
       "toPair">: "c" ~>
         pair (var "name") (var "c")] $
       Lists.map (var "toPair") (Sets.toList $ var "clsSet")] $
-    Monads.withTrace @@ (string "encode with assertions") @@
-      ("htyp" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "typ" $
+      "htyp" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "typ" @@ var "cx" @@ var "g" $
       Logic.ifElse (Lists.null $ var "assertPairs")
-        (Flows.pure $ var "htyp") (lets [
+        (right $ var "htyp") (lets [
           "encoded">: Lists.map (var "encodeAssertion") (var "assertPairs"),
           "hassert">: Logic.ifElse (Equality.equal (Lists.length $ var "encoded") (int32 1))
             (Lists.head $ var "encoded")
             (inject H._Assertion H._Assertion_tuple $ var "encoded")] $
-          Flows.pure $ inject H._Type H._Type_ctx $ record H._ContextType [
+          right $ inject H._Type H._Type_ctx $ record H._ContextType [
             H._ContextType_ctx>>: var "hassert",
-            H._ContextType_type>>: var "htyp"]))
+            H._ContextType_type>>: var "htyp"])
 
 findOrdVariables :: TBinding (Type -> S.Set Name)
 findOrdVariables = haskellCoderDefinition "findOrdVariables" $
@@ -638,11 +647,8 @@
           var "tryType" @@ var "names" @@ var "kt",
         _Type_set>>: "et" ~>
           var "tryType" @@ var "names" @@ var "et"],
-    "isTypeVariable">: "v" ~> lets [
-      "nameStr">: Core.unName $ var "v",
-      "hasNoNamespace">: Maybes.isNothing $ Names.namespaceOf @@ var "v",
-      "startsWithT">: Equality.equal (Strings.charAt (int32 0) (var "nameStr")) (int32 116)] $ -- 't' character
-      Logic.and (var "hasNoNamespace") (var "startsWithT"),
+    "isTypeVariable">: "v" ~>
+      Maybes.isNothing $ Names.namespaceOf @@ var "v",
     "tryType">: "names" ~> "t" ~>
       cases _Type (Rewriting.deannotateType @@ var "t")
         (Just $ var "names") [
@@ -660,26 +666,36 @@
       pair (var "name") (Sets.fromList $ list [Graph.typeClassOrdering])] $
     Maps.fromList $ Lists.map (var "toPair") (Sets.toList $ findOrdVariables @@ var "typ")
 
-moduleToHaskellModule :: TBinding (Module -> [Definition] -> Flow Graph H.Module)
-moduleToHaskellModule = haskellCoderDefinition "moduleToHaskellModule" $
-  doc "Convert a Hydra module and definitions to a Haskell module AST" $
-  "mod" ~> "defs" ~>
-    "namespaces" <<~ HaskellUtils.namespacesForModule @@ var "mod" $
-      constructModule @@ var "namespaces" @@ var "mod" @@ var "defs"
+includeTypeDefinitions :: TBinding Bool
+includeTypeDefinitions = haskellCoderDefinition "includeTypeDefinitions" $
+  doc "Whether to include type definitions in generated Haskell modules" $
+  false
 
-moduleToHaskell :: TBinding (Module -> [Definition] -> Flow Graph (M.Map String String))
+keyHaskellVar :: TBinding Name
+keyHaskellVar = haskellCoderDefinition "keyHaskellVar" $
+  doc "The key used to track Haskell variable depth in annotations" $
+  wrap _Name $ string "haskellVar"
+
+moduleToHaskell :: TBinding (Module -> [Definition] -> Context -> Graph -> Prelude.Either (InContext Error) (M.Map String String))
 moduleToHaskell = haskellCoderDefinition "moduleToHaskell" $
   doc "Convert a Hydra module to Haskell source code as a filepath-to-content map" $
-  "mod" ~> "defs" ~>
-  "hsmod" <<~ moduleToHaskellModule @@ var "mod" @@ var "defs" $ lets [
+  "mod" ~> "defs" ~> "cx" ~> "g" ~>
+  "hsmod" <<~ moduleToHaskellModule @@ var "mod" @@ var "defs" @@ var "cx" @@ var "g" $ lets [
   "s">: Serialization.printExpr @@ (Serialization.parenthesize @@ (HaskellSerde.moduleToExpr @@ var "hsmod")),
   "filepath">: Names.namespaceToFilePath @@ Util.caseConventionPascal @@ (wrap _FileExtension $ string "hs") @@ (Module.moduleNamespace $ var "mod")] $
-  Flows.pure $ Maps.singleton (var "filepath") (var "s")
+  right $ Maps.singleton (var "filepath") (var "s")
 
-nameDecls :: TBinding (Graph -> HaskellNamespaces -> Name -> Type -> [H.DeclarationWithComments])
+moduleToHaskellModule :: TBinding (Module -> [Definition] -> Context -> Graph -> Prelude.Either (InContext Error) H.Module)
+moduleToHaskellModule = haskellCoderDefinition "moduleToHaskellModule" $
+  doc "Convert a Hydra module and definitions to a Haskell module AST" $
+  "mod" ~> "defs" ~> "cx" ~> "g" ~>
+    "namespaces" <<~ HaskellUtils.namespacesForModule @@ var "mod" @@ var "cx" @@ var "g" $
+      constructModule @@ var "namespaces" @@ var "mod" @@ var "defs" @@ var "cx" @@ var "g"
+
+nameDecls :: TBinding (HaskellNamespaces -> Name -> Type -> [H.DeclarationWithComments])
 nameDecls = haskellCoderDefinition "nameDecls" $
   doc "Generate Haskell declarations for type and field name constants" $
-  "g" ~> "namespaces" ~> "name" ~> "typ" ~> lets [
+  "namespaces" ~> "name" ~> "typ" ~> lets [
     "nm">: Core.unName $ var "name",
     "toDecl">: "n" ~> "pair" ~> lets [
       "k">: Pairs.first $ var "pair",
@@ -702,10 +718,10 @@
       (Lists.cons (var "toDecl" @@ Core.nameLift _Name @@ var "nameDecl") (Lists.map (var "toDecl" @@ Core.nameLift _Name) (var "fieldDecls")))
       (list ([] :: [TTerm H.DeclarationWithComments]))
 
-toDataDeclaration :: TBinding (HaskellNamespaces -> TermDefinition -> Flow Graph H.DeclarationWithComments)
+toDataDeclaration :: TBinding (HaskellNamespaces -> TermDefinition -> Context -> Graph -> Either (InContext Error) H.DeclarationWithComments)
 toDataDeclaration = haskellCoderDefinition "toDataDeclaration" $
   doc "Convert a Hydra term definition to a Haskell declaration with comments" $
-  "namespaces" ~> "def" ~> lets [
+  "namespaces" ~> "def" ~> "cx" ~> "g" ~> lets [
     "name">: Module.termDefinitionName $ var "def",
     "term">: Module.termDefinitionTerm $ var "def",
     "typ">: Module.termDefinitionType $ var "def",
@@ -736,169 +752,47 @@
     "toDecl">: "comments" ~> "hname'" ~> "term'" ~> "bindings" ~>
       cases _Term (Rewriting.deannotateTerm @@ var "term'")
         (Just $
-          "hterm" <<~ encodeTerm @@ var "namespaces" @@ var "term'" $ lets [
+          "hterm" <<~ encodeTerm @@ int32 0 @@ var "namespaces" @@ var "term'" @@ var "cx" @@ var "g" $ lets [
          "vb">: HaskellUtils.simpleValueBinding @@ var "hname'" @@ var "hterm" @@ var "bindings",
          -- Extract constraints from the TypeScheme and convert to class assertions
-         "schemeConstraints">: Core.typeSchemeConstraints (var "typ"),
+         "schemeConstraints">: optCases (var "typ") Phantoms.nothing ("ts" ~> Core.typeSchemeConstraints (var "ts")),
          "schemeClasses">: typeSchemeConstraintsToClassMap @@ var "schemeConstraints"] $
-         "explicitClasses" <<~ Annotations.getTypeClasses @@ (Rewriting.removeTypesFromTerm @@ var "term") $
+         "explicitClasses" <<~ Annotations.getTypeClasses @@ var "cx" @@ var "g" @@ (Rewriting.removeTypesFromTerm @@ var "term") $
          -- Combine constraints from TypeScheme with any explicit annotations
          "combinedClasses" <~ Maps.union (var "schemeClasses") (var "explicitClasses") $
-         "htype" <<~ encodeTypeWithClassAssertions @@ var "namespaces" @@ var "combinedClasses" @@ (Core.typeSchemeType $ var "typ") $ lets [
+         "schemeType" <~ optCases (var "typ") Core.typeUnit ("ts" ~> Core.typeSchemeType (var "ts")) $
+         "htype" <<~ encodeTypeWithClassAssertions @@ var "namespaces" @@ var "combinedClasses" @@ var "schemeType" @@ var "cx" @@ var "g" $ lets [
          "decl">: inject H._Declaration H._Declaration_typedBinding $ record H._TypedBinding [
            H._TypedBinding_typeSignature>>: record H._TypeSignature [
              H._TypeSignature_name>>: var "hname'",
              H._TypeSignature_type>>: var "htype"],
            H._TypedBinding_valueBinding>>: var "rewriteValueBinding" @@ var "vb"]] $
-          Flows.pure $ record H._DeclarationWithComments [
+          right $ record H._DeclarationWithComments [
             H._DeclarationWithComments_body>>: var "decl",
             H._DeclarationWithComments_comments>>: var "comments"]) [
         _Term_let>>: "letTerm" ~> lets [
           -- For let terms, encode each binding's term directly
           "lbindings">: Core.letBindings $ var "letTerm",
           "env">: Core.letBody $ var "letTerm",
-          "toBinding">: "hname''" ~> "hterm'" ~>
+          "toTermDefinition">: "hname''" ~> "hterm'" ~>
             inject H._LocalBinding H._LocalBinding_value $ HaskellUtils.simpleValueBinding @@ var "hname''" @@ var "hterm'" @@ nothing,
           "hnames">: Lists.map ("binding" ~> HaskellUtils.simpleName @@ (Core.unName $ Core.bindingName $ var "binding")) (var "lbindings"),
           "terms">: Lists.map (unaryFunction $ Core.bindingTerm) (var "lbindings")] $
-          "hterms" <<~ Flows.mapList (encodeTerm @@ var "namespaces") (var "terms") $ lets [
-          "hbindings">: Lists.zipWith (var "toBinding") (var "hnames") (var "hterms"),
+          "hterms" <<~ Eithers.mapList ("t" ~> encodeTerm @@ int32 0 @@ var "namespaces" @@ var "t" @@ var "cx" @@ var "g") (var "terms") $ lets [
+          "hbindings">: Lists.zipWith (var "toTermDefinition") (var "hnames") (var "hterms"),
           -- Merge new bindings with any previously accumulated bindings from outer lets
           "prevBindings">: Maybes.maybe (list ([] :: [TTerm H.LocalBinding])) ("lb" ~> unwrap H._LocalBindings @@ var "lb") (var "bindings"),
           "allBindings">: Lists.concat2 (var "prevBindings") (var "hbindings")] $
           var "toDecl" @@ var "comments" @@ var "hname'" @@ var "env" @@ (just $ wrap H._LocalBindings $ var "allBindings")]] $
-    "comments" <<~ Annotations.getTermDescription @@ var "term" $
+    "comments" <<~ Annotations.getTermDescription @@ var "cx" @@ var "g" @@ var "term" $
     var "toDecl" @@ var "comments" @@ var "hname" @@ var "term" @@ nothing
 
---toTypeDeclarations :: TBinding (HaskellNamespaces -> Binding -> Term -> Flow Graph [H.DeclarationWithComments])
---toTypeDeclarations = haskellCoderDefinition "toTypeDeclarations" $
---  "namespaces" ~> "el" ~> "term" ~> lets [
---    "elementName">: Core.bindingName $ var "el",
---    "lname">: Names.localNameOf @@ var "elementName",
---    "hname">: HaskellUtils.simpleName @@ var "lname",
---    "declHead">: "name" ~> "vars'" ~> Logic.ifElse (Lists.null $ var "vars'")
---      (inject H._DeclarationHead H._DeclarationHead_simple $ var "name")
---      (lets [
---        "h">: Lists.head $ var "vars'",
---        "rest">: Lists.tail $ var "vars'",
---        "hvar">: wrap H._Variable $ HaskellUtils.simpleName @@ (Core.unName $ var "h")] $
---        inject H._DeclarationHead H._DeclarationHead_application $ record H._ApplicationDeclarationHead [
---          H._ApplicationDeclarationHead_function>>: var "declHead" @@ var "name" @@ var "rest",
---          H._ApplicationDeclarationHead_operand>>: var "hvar"]),
---    "newtypeCons">: "el'" ~> "typ'" ~> lets [
---      "hname">: HaskellUtils.simpleName @@ (HaskellUtils.newtypeAccessorName @@ (Core.bindingName $ var "el'"))] $
---      "htype" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "typ'" $ lets [
---      "hfield">: record H._FieldWithComments [
---        H._FieldWithComments_field>>: record H._Field [
---          H._Field_name>>: var "hname",
---          H._Field_type>>: var "htype"],
---        H._FieldWithComments_comments>>: nothing],
---      "constructorName">: HaskellUtils.simpleName @@ (Names.localNameOf @@ (Core.bindingName $ var "el'"))] $
---      Flows.pure $ record H._ConstructorWithComments [
---        H._ConstructorWithComments_body>>: inject H._Constructor H._Constructor_record $ record H._RecordConstructor [
---          H._RecordConstructor_name>>: var "constructorName",
---          H._RecordConstructor_fields>>: list [var "hfield"]],
---        H._ConstructorWithComments_comments>>: nothing],
---    "recordCons">: "lname'" ~> "fields" ~> lets [
---      "toField">: "fieldType" ~> lets [
---        "fname">: Core.fieldTypeName $ var "fieldType",
---        "ftype">: Core.fieldTypeType $ var "fieldType",
---        "hname'">: HaskellUtils.simpleName @@ Strings.cat2
---          (Formatting.decapitalize @@ var "lname'")
---          (Formatting.capitalize @@ (Core.unName $ var "fname"))] $
---        "htype" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "ftype" $
---        "comments" <<~ Annotations.getTypeDescription @@ var "ftype" $
---        Flows.pure $ record H._FieldWithComments [
---          H._FieldWithComments_field>>: record H._Field [
---            H._Field_name>>: var "hname'",
---            H._Field_type>>: var "htype"],
---          H._FieldWithComments_comments>>: var "comments"]] $
---      "hFields" <<~ Flows.mapList (var "toField") (var "fields") $
---      Flows.pure $ record H._ConstructorWithComments [
---        H._ConstructorWithComments_body>>: inject H._Constructor H._Constructor_record $ record H._RecordConstructor [
---          H._RecordConstructor_name>>: HaskellUtils.simpleName @@ var "lname'",
---          H._RecordConstructor_fields>>: var "hFields"],
---        H._ConstructorWithComments_comments>>: nothing],
---    "unionCons">: "g'" ~> "lname'" ~> "fieldType" ~> lets [
---      "fname">: Core.fieldTypeName $ var "fieldType",
---      "ftype">: Core.fieldTypeType $ var "fieldType",
---      "deconflict">: "name" ~> lets [
---        "tname">: Names.unqualifyName @@ record _QualifiedName [
---          _QualifiedName_namespace>>: just $ Pairs.first $ Module.namespacesFocus $ var "namespaces",
---          _QualifiedName_local>>: var "name"]] $
---        Logic.ifElse (Maybes.isJust $ Maps.lookup (var "tname") (Graph.graphElements $ var "g'"))
---          (var "deconflict" @@ Strings.cat2 (var "name") (string "_"))
---          (var "name")] $
---      "comments" <<~ Annotations.getTypeDescription @@ var "ftype" $ lets [
---      "nm">: var "deconflict" @@ Strings.cat2 (Formatting.capitalize @@ var "lname'") (Formatting.capitalize @@ (Core.unName $ var "fname"))] $
---      "typeList" <<~ (Logic.ifElse (Equality.equal (Rewriting.deannotateType @@ var "ftype") MetaTypes.unit)
---        (Flows.pure $ list ([] :: [TTerm H.CaseRhs])) $
---        Flows.bind (adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "ftype") $ "htype" ~>
---          Flows.pure $ list [var "htype"]) $
---      Flows.pure $ record H._ConstructorWithComments [
---        H._ConstructorWithComments_body>>: inject H._Constructor H._Constructor_ordinary $ record H._OrdinaryConstructor [
---          H._OrdinaryConstructor_name>>: HaskellUtils.simpleName @@ var "nm",
---          H._OrdinaryConstructor_fields>>: var "typeList"],
---        H._ConstructorWithComments_comments>>: var "comments"]] $
---    Monads.withTrace @@ (Strings.cat2 (string "type element ") (Core.unName $ var "elementName")) @@ (
---      "g" <<~ Monads.getState $
---      "t" <<~ (trace (string "to type declarations") $ DecodeCore.type_ @@ var "term") $
---      "isSer" <<~ (Schemas.isSerializable @@ var "el") $ lets [
---      "deriv">: wrap H._Deriving $ Logic.ifElse (var "isSer")
---        (Lists.map (HaskellUtils.rawName) (list [string "Eq", string "Ord", string "Read", string "Show"]))
---        (list ([] :: [TTerm H.Name])),
---      "unpackResult">: HaskellUtils.unpackForallType @@ var "g" @@ var "t",
---      "vars">: Pairs.first $ var "unpackResult",
---      "t'">: Pairs.second $ var "unpackResult",
---      "hd">: var "declHead" @@ var "hname" @@ (Lists.reverse $ var "vars")] $
---      "decl" <<~ (cases _Type (Rewriting.deannotateType @@ var "t'")
---        (Just $ "htype" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "t" $
---          Flows.pure $ inject H._Declaration H._Declaration_type $ record H._TypeDeclaration [
---            H._TypeDeclaration_name>>: var "hd",
---            H._TypeDeclaration_type>>: var "htype"]) [
---        _Type_record>>: "rt" ~>
---          "cons" <<~ (var "recordCons" @@ var "lname" @@ (Core.rowTypeFields $ var "rt")) $
---          Flows.pure $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
---            H._DataDeclaration_keyword>>: injectUnit H._DataOrNewtype H._DataOrNewtype_data,
---            H._DataDeclaration_context>>: list ([] :: [TTerm H.Assertion]),
---            H._DataDeclaration_head>>: var "hd",
---            H._DataDeclaration_constructors>>: list [var "cons"],
---            H._DataDeclaration_deriving>>: list [var "deriv"]],
---        _Type_union>>: "rt" ~>
---          "cons" <<~ Flows.mapList (var "unionCons" @@ var "g" @@ var "lname") (Core.rowTypeFields $ var "rt") $
---          Flows.pure $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
---            H._DataDeclaration_keyword>>: injectUnit H._DataOrNewtype H._DataOrNewtype_data,
---            H._DataDeclaration_context>>: list ([] :: [TTerm H.Assertion]),
---            H._DataDeclaration_head>>: var "hd",
---            H._DataDeclaration_constructors>>: var "cons",
---            H._DataDeclaration_deriving>>: list [var "deriv"]],
---        _Type_wrap>>: "wrapped" ~> lets [
---          "tname">: Core.wrappedTypeTypeName $ var "wrapped",
---          "wt">: Core.wrappedTypeBody $ var "wrapped"] $
---          "cons" <<~ var "newtypeCons" @@ var "el" @@ var "wt" $
---            Flows.pure $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
---              H._DataDeclaration_keyword>>: injectUnit H._DataOrNewtype H._DataOrNewtype_newtype,
---              H._DataDeclaration_context>>: list ([] :: [TTerm H.Assertion]),
---              H._DataDeclaration_head>>: var "hd",
---              H._DataDeclaration_constructors>>: list [var "cons"],
---              H._DataDeclaration_deriving>>: list [var "deriv"]]]) $
---      "comments" <<~ Annotations.getTermDescription @@ var "term" $
---      "tdecls" <<~ (Logic.ifElse (includeTypeDefinitions)
---        (Flows.bind (typeDecl @@ var "namespaces" @@ var "elementName" @@ var "t") $ "decl'" ~>
---          Flows.pure $ list [var "decl'"])
---        (Flows.pure $ list ([] :: [TTerm H.DeclarationWithComments]))) $ lets [
---      "mainDecl">: record H._DeclarationWithComments [
---        H._DeclarationWithComments_body>>: var "decl",
---        H._DeclarationWithComments_comments>>: var "comments"],
---      "nameDecls'">: nameDecls @@ var "g" @@ var "namespaces" @@ var "elementName" @@ var "t"] $
---      Flows.pure $ Lists.concat $ list [list [var "mainDecl"], var "nameDecls'", var "tdecls"])
-
 -- | Simplified version of toTypeDeclarations that works with Name and Type directly
 -- This is used with the new Definition-based API
-toTypeDeclarationsFrom :: TBinding (HaskellNamespaces -> Name -> Type -> Flow Graph [H.DeclarationWithComments])
+toTypeDeclarationsFrom :: TBinding (HaskellNamespaces -> Name -> Type -> Context -> Graph -> Either (InContext Error) [H.DeclarationWithComments])
 toTypeDeclarationsFrom = haskellCoderDefinition "toTypeDeclarationsFrom" $
   doc "Convert a Hydra type definition to Haskell declarations" $
-  "namespaces" ~> "elementName" ~> "typ" ~> lets [
+  "namespaces" ~> "elementName" ~> "typ" ~> "cx" ~> "g" ~> lets [
     "lname">: Names.localNameOf @@ var "elementName",
     "hname">: HaskellUtils.simpleName @@ var "lname",
     "declHead">: "name" ~> "vars'" ~> Logic.ifElse (Lists.null $ var "vars'")
@@ -911,15 +805,15 @@
           H._ApplicationDeclarationHead_function>>: var "declHead" @@ var "name" @@ var "rest",
           H._ApplicationDeclarationHead_operand>>: var "hvar"]),
     "newtypeCons">: "tname" ~> "typ'" ~> lets [
-      "hname">: HaskellUtils.simpleName @@ (HaskellUtils.newtypeAccessorName @@ var "tname")] $
-      "htype" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "typ'" $ lets [
+      "hname0">: HaskellUtils.simpleName @@ (HaskellUtils.newtypeAccessorName @@ var "tname")] $
+      "htype" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "typ'" @@ var "cx" @@ var "g" $ lets [
       "hfield">: record H._FieldWithComments [
         H._FieldWithComments_field>>: record H._Field [
-          H._Field_name>>: var "hname",
+          H._Field_name>>: var "hname0",
           H._Field_type>>: var "htype"],
         H._FieldWithComments_comments>>: nothing],
       "constructorName">: HaskellUtils.simpleName @@ (Names.localNameOf @@ var "tname")] $
-      Flows.pure $ record H._ConstructorWithComments [
+      right $ record H._ConstructorWithComments [
         H._ConstructorWithComments_body>>: inject H._Constructor H._Constructor_record $ record H._RecordConstructor [
           H._RecordConstructor_name>>: var "constructorName",
           H._RecordConstructor_fields>>: list [var "hfield"]],
@@ -931,95 +825,92 @@
         "hname'">: HaskellUtils.simpleName @@ Strings.cat2
           (Formatting.decapitalize @@ var "lname'")
           (Formatting.capitalize @@ (Core.unName $ var "fname"))] $
-        "htype" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "ftype" $
-        "comments" <<~ Annotations.getTypeDescription @@ var "ftype" $
-        Flows.pure $ record H._FieldWithComments [
+        "htype" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "ftype" @@ var "cx" @@ var "g" $
+        "comments" <<~ Annotations.getTypeDescription @@ var "cx" @@ var "g" @@ var "ftype" $
+        right $ record H._FieldWithComments [
           H._FieldWithComments_field>>: record H._Field [
             H._Field_name>>: var "hname'",
             H._Field_type>>: var "htype"],
           H._FieldWithComments_comments>>: var "comments"]] $
-      "hFields" <<~ Flows.mapList (var "toField") (var "fields") $
-      Flows.pure $ record H._ConstructorWithComments [
+      "hFields" <<~ Eithers.mapList (var "toField") (var "fields") $
+      right $ record H._ConstructorWithComments [
         H._ConstructorWithComments_body>>: inject H._Constructor H._Constructor_record $ record H._RecordConstructor [
           H._RecordConstructor_name>>: HaskellUtils.simpleName @@ var "lname'",
           H._RecordConstructor_fields>>: var "hFields"],
         H._ConstructorWithComments_comments>>: nothing],
-    "unionCons">: "g'" ~> "lname'" ~> "fieldType" ~> lets [
+    "unionCons">: "boundNames'" ~> "lname'" ~> "fieldType" ~> lets [
       "fname">: Core.fieldTypeName $ var "fieldType",
       "ftype">: Core.fieldTypeType $ var "fieldType",
       "deconflict">: "name" ~> lets [
         "tname">: Names.unqualifyName @@ record _QualifiedName [
           _QualifiedName_namespace>>: just $ Pairs.first $ Module.namespacesFocus $ var "namespaces",
           _QualifiedName_local>>: var "name"]] $
-        Logic.ifElse (Maybes.isJust $ Lists.find ("b" ~> Equality.equal (Core.bindingName (var "b")) (var "tname")) (Graph.graphElements $ var "g'"))
+        Logic.ifElse (Sets.member (var "tname") (var "boundNames'"))
           (var "deconflict" @@ Strings.cat2 (var "name") (string "_"))
           (var "name")] $
-      "comments" <<~ Annotations.getTypeDescription @@ var "ftype" $ lets [
+      "comments" <<~ Annotations.getTypeDescription @@ var "cx" @@ var "g" @@ var "ftype" $ lets [
       "nm">: var "deconflict" @@ Strings.cat2 (Formatting.capitalize @@ var "lname'") (Formatting.capitalize @@ (Core.unName $ var "fname"))] $
       "typeList" <<~ (Logic.ifElse (Equality.equal (Rewriting.deannotateType @@ var "ftype") MetaTypes.unit)
-        (Flows.pure $ list ([] :: [TTerm H.CaseRhs])) $
-        Flows.bind (adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "ftype") $ "htype" ~>
-          Flows.pure $ list [var "htype"]) $
-      Flows.pure $ record H._ConstructorWithComments [
+        (right $ list ([] :: [TTerm H.CaseRhs])) $
+        "htype" <<~ adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "ftype" @@ var "cx" @@ var "g" $
+          right $ list [var "htype"]) $
+      right $ record H._ConstructorWithComments [
         H._ConstructorWithComments_body>>: inject H._Constructor H._Constructor_ordinary $ record H._OrdinaryConstructor [
           H._OrdinaryConstructor_name>>: HaskellUtils.simpleName @@ var "nm",
           H._OrdinaryConstructor_fields>>: var "typeList"],
         H._ConstructorWithComments_comments>>: var "comments"]] $
-    Monads.withTrace @@ (Strings.cat2 (string "type definition ") (Core.unName $ var "elementName")) @@ (
-      "g" <<~ Monads.getState $
-      "isSer" <<~ (Schemas.isSerializableByName @@ var "elementName") $ lets [
+      "isSer" <<~ Schemas.isSerializableByName @@ var "cx" @@ var "g" @@ var "elementName" $ lets [
       "deriv">: wrap H._Deriving $ Logic.ifElse (var "isSer")
         (Lists.map (HaskellUtils.rawName) (list [string "Eq", string "Ord", string "Read", string "Show"]))
         (list ([] :: [TTerm H.Name])),
-      "unpackResult">: HaskellUtils.unpackForallType @@ var "g" @@ var "typ",
+      "unpackResult">: HaskellUtils.unpackForallType @@ var "typ",
       "vars">: Pairs.first $ var "unpackResult",
       "t'">: Pairs.second $ var "unpackResult",
       "hd">: var "declHead" @@ var "hname" @@ (Lists.reverse $ var "vars")] $
       "decl" <<~ (cases _Type (Rewriting.deannotateType @@ var "t'")
-        (Just $ "htype" <<~ (adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "typ") $
-          Flows.pure $ inject H._Declaration H._Declaration_type $ record H._TypeDeclaration [
+        (Just $ "htype" <<~ (adaptTypeToHaskellAndEncode @@ var "namespaces" @@ var "typ" @@ var "cx" @@ var "g") $
+          right $ inject H._Declaration H._Declaration_type $ record H._TypeDeclaration [
             H._TypeDeclaration_name>>: var "hd",
             H._TypeDeclaration_type>>: var "htype"]) [
         _Type_record>>: "rt" ~>
-          "cons" <<~ (var "recordCons" @@ var "lname" @@ (Core.rowTypeFields $ var "rt")) $
-          Flows.pure $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
+          "cons" <<~ (var "recordCons" @@ var "lname" @@ var "rt") $
+          right $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
             H._DataDeclaration_keyword>>: injectUnit H._DataOrNewtype H._DataOrNewtype_data,
             H._DataDeclaration_context>>: list ([] :: [TTerm H.Assertion]),
             H._DataDeclaration_head>>: var "hd",
             H._DataDeclaration_constructors>>: list [var "cons"],
             H._DataDeclaration_deriving>>: list [var "deriv"]],
         _Type_union>>: "rt" ~>
-          "cons" <<~ Flows.mapList (var "unionCons" @@ var "g" @@ var "lname") (Core.rowTypeFields $ var "rt") $
-          Flows.pure $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
+          "cons" <<~ Eithers.mapList (var "unionCons" @@ (Sets.fromList (Maps.keys (Graph.graphBoundTerms $ var "g"))) @@ var "lname") (var "rt") $
+          right $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
             H._DataDeclaration_keyword>>: injectUnit H._DataOrNewtype H._DataOrNewtype_data,
             H._DataDeclaration_context>>: list ([] :: [TTerm H.Assertion]),
             H._DataDeclaration_head>>: var "hd",
             H._DataDeclaration_constructors>>: var "cons",
             H._DataDeclaration_deriving>>: list [var "deriv"]],
-        _Type_wrap>>: "wrapped" ~> lets [
-          "wt">: Core.wrappedTypeBody $ var "wrapped"] $
-          "cons" <<~ var "newtypeCons" @@ var "elementName" @@ var "wt" $
-            Flows.pure $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
+        _Type_wrap>>: "wrapped" ~>
+          "cons" <<~ var "newtypeCons" @@ var "elementName" @@ var "wrapped" $
+            right $ inject H._Declaration H._Declaration_data $ record H._DataDeclaration [
               H._DataDeclaration_keyword>>: injectUnit H._DataOrNewtype H._DataOrNewtype_newtype,
               H._DataDeclaration_context>>: list ([] :: [TTerm H.Assertion]),
               H._DataDeclaration_head>>: var "hd",
               H._DataDeclaration_constructors>>: list [var "cons"],
               H._DataDeclaration_deriving>>: list [var "deriv"]]]) $
-      "comments" <<~ Annotations.getTypeDescription @@ var "typ" $
+      "comments" <<~ Annotations.getTypeDescription @@ var "cx" @@ var "g" @@ var "typ" $
       "tdecls" <<~ (Logic.ifElse (includeTypeDefinitions)
-        (Flows.bind (typeDecl @@ var "namespaces" @@ var "elementName" @@ var "typ") $ "decl'" ~>
-          Flows.pure $ list [var "decl'"])
-        (Flows.pure $ list ([] :: [TTerm H.DeclarationWithComments]))) $ lets [
+        ("decl'" <<~ typeDecl @@ var "namespaces" @@ var "elementName" @@ var "typ" @@ var "cx" @@ var "g" $
+          right $ list [var "decl'"])
+        (right $ list ([] :: [TTerm H.DeclarationWithComments]))) $ lets [
       "mainDecl">: record H._DeclarationWithComments [
         H._DeclarationWithComments_body>>: var "decl",
         H._DeclarationWithComments_comments>>: var "comments"],
-      "nameDecls'">: nameDecls @@ var "g" @@ var "namespaces" @@ var "elementName" @@ var "typ"] $
-      Flows.pure $ Lists.concat $ list [list [var "mainDecl"], var "nameDecls'", var "tdecls"])
+      "nameDecls'">: nameDecls @@ var "namespaces" @@ var "elementName" @@ var "typ"] $
+      right $ Lists.concat $ list [list [var "mainDecl"], var "nameDecls'", var "tdecls"]
 
-typeDecl :: TBinding (HaskellNamespaces -> Name -> Type -> Flow Graph H.DeclarationWithComments)
+typeDecl :: TBinding (HaskellNamespaces -> Name -> Type -> Context -> Graph -> Either (InContext Error) H.DeclarationWithComments)
 typeDecl = haskellCoderDefinition "typeDecl" $
   doc "Generate a Haskell declaration for a type definition constant" $
-  "namespaces" ~> "name" ~> "typ" ~> lets [
+  "namespaces" ~> "name" ~> "typ" ~> "cx" ~> "g" ~> lets [
     "typeName">: "ns" ~> "name'" ~>
       Names.qname @@ var "ns" @@ (var "typeNameLocal" @@ var "name'"),
     "typeNameLocal">: "name'" ~>
@@ -1056,9 +947,7 @@
         Maybes.map ("ns" ~> Core.termVariable $ Names.qname @@ var "ns" @@ (Strings.cat $ list [string "_", var "local", string "_type_"])) (var "mns")] $
       Maybes.fromMaybe (var "recurse" @@ var "term") (Maybes.bind (var "variantResult") (var "forType")),
     "finalTerm">: Rewriting.rewriteTerm @@ var "rewrite" @@ var "rawTerm"] $
-    -- Note: consider constructing this coder just once, then reusing it
-    "coder" <<~ AdaptModules.constructCoder @@ (HaskellLanguage.haskellLanguage) @@ (encodeTerm @@ var "namespaces") @@ (Core.typeVariable $ Core.nameLift _Type) $
-    "expr" <<~ Compute.coderEncode (var "coder") @@ var "finalTerm" $ lets [
+    "expr" <<~ encodeTerm @@ int32 0 @@ var "namespaces" @@ var "finalTerm" @@ var "cx" @@ var "g" $ lets [
     "rhs">: wrap H._RightHandSide $ var "expr",
     "hname">: HaskellUtils.simpleName @@ (var "typeNameLocal" @@ var "name"),
     "pat">: HaskellUtils.applicationPattern @@ var "hname" @@ list ([] :: [TTerm H.Pattern]),
@@ -1066,7 +955,7 @@
       H._SimpleValueBinding_pattern>>: var "pat",
       H._SimpleValueBinding_rhs>>: var "rhs",
       H._SimpleValueBinding_localBindings>>: nothing]] $
-    Flows.pure $ record H._DeclarationWithComments [
+    right $ record H._DeclarationWithComments [
       H._DeclarationWithComments_body>>: var "decl",
       H._DeclarationWithComments_comments>>: nothing]
 
@@ -1095,3 +984,8 @@
             Maybes.cat $ Lists.map (var "nameToTypeClass") $ Sets.toList $ Core.typeVariableMetadataClasses (var "meta"))
           (var "constraints"))
       (var "maybeConstraints")
+
+useCoreImport :: TBinding Bool
+useCoreImport = haskellCoderDefinition "useCoreImport" $
+  doc "Whether to use the Hydra core import in generated modules" $
+  true
diff --git a/src/main/haskell/Hydra/Sources/Haskell/Language.hs b/src/main/haskell/Hydra/Sources/Haskell/Language.hs
--- a/src/main/haskell/Hydra/Sources/Haskell/Language.hs
+++ b/src/main/haskell/Hydra/Sources/Haskell/Language.hs
@@ -7,22 +7,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -31,26 +28,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -59,26 +52,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -98,7 +88,7 @@
 
 module_ :: Module
 module_ = Module ns
-  [toBinding haskellLanguage, toBinding reservedWords]
+  [toTermDefinition haskellLanguage, toTermDefinition reservedWords]
   []
   KernelTypes.kernelTypesNamespaces $
   Just "Language constraints and reserved words for Haskell"
@@ -162,11 +152,12 @@
     Variants.typeVariantUnion,
     Variants.typeVariantUnit,
     Variants.typeVariantVariable,
+    Variants.typeVariantVoid,
     Variants.typeVariantWrap],
   "typePredicate">: constant true] $
   Coders.language
-    (Coders.languageName $ string "hydra.ext.haskell")
-    (Coders.languageConstraints
+    (Coders.languageName_ $ string "hydra.ext.haskell")
+    (Coders.languageConstraints_
       (var "eliminationVariants")
       (var "literalVariants")
       (var "floatTypes")
diff --git a/src/main/haskell/Hydra/Sources/Haskell/Operators.hs b/src/main/haskell/Hydra/Sources/Haskell/Operators.hs
--- a/src/main/haskell/Hydra/Sources/Haskell/Operators.hs
+++ b/src/main/haskell/Hydra/Sources/Haskell/Operators.hs
@@ -7,22 +7,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -31,26 +28,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -59,26 +52,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -106,40 +96,40 @@
     Just "AST operators for Haskell"
   where
     elements = [
-      toBinding andOp,
-      toBinding apOp,
-      toBinding appOp,
-      toBinding applyOp,
-      toBinding arrowOp,
-      toBinding assertOp,
-      toBinding bindOp,
-      toBinding caseOp,
-      toBinding composeOp,
-      toBinding concatOp,
-      toBinding consOp,
-      toBinding defineOp,
-      toBinding diamondOp,
-      toBinding divOp,
-      toBinding divideOp,
-      toBinding elemOp,
-      toBinding equalOp,
-      toBinding fmapOp,
-      toBinding gtOp,
-      toBinding gteOp,
-      toBinding indexOp,
-      toBinding lambdaOp,
-      toBinding ltOp,
-      toBinding lteOp,
-      toBinding minusOp,
-      toBinding modOp,
-      toBinding multOp,
-      toBinding neqOp,
-      toBinding notElemOp,
-      toBinding orOp,
-      toBinding plusOp,
-      toBinding quotOp,
-      toBinding remOp,
-      toBinding typeOp]
+      toTermDefinition andOp,
+      toTermDefinition apOp,
+      toTermDefinition appOp,
+      toTermDefinition applyOp,
+      toTermDefinition arrowOp,
+      toTermDefinition assertOp,
+      toTermDefinition bindOp,
+      toTermDefinition caseOp,
+      toTermDefinition composeOp,
+      toTermDefinition concatOp,
+      toTermDefinition consOp,
+      toTermDefinition defineOp,
+      toTermDefinition diamondOp,
+      toTermDefinition divOp,
+      toTermDefinition divideOp,
+      toTermDefinition elemOp,
+      toTermDefinition equalOp,
+      toTermDefinition fmapOp,
+      toTermDefinition gtOp,
+      toTermDefinition gteOp,
+      toTermDefinition indexOp,
+      toTermDefinition lambdaOp,
+      toTermDefinition ltOp,
+      toTermDefinition lteOp,
+      toTermDefinition minusOp,
+      toTermDefinition modOp,
+      toTermDefinition multOp,
+      toTermDefinition neqOp,
+      toTermDefinition notElemOp,
+      toTermDefinition orOp,
+      toTermDefinition plusOp,
+      toTermDefinition quotOp,
+      toTermDefinition remOp,
+      toTermDefinition typeOp]
 
 andOp :: TBinding Op
 andOp = haskellOperatorsDefinition "andOp" $
diff --git a/src/main/haskell/Hydra/Sources/Haskell/Serde.hs b/src/main/haskell/Hydra/Sources/Haskell/Serde.hs
--- a/src/main/haskell/Hydra/Sources/Haskell/Serde.hs
+++ b/src/main/haskell/Hydra/Sources/Haskell/Serde.hs
@@ -8,22 +8,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -32,26 +29,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -60,26 +53,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -92,8 +82,8 @@
 
 -- Additional imports
 import Hydra.Ast
-import qualified Hydra.Ext.Haskell.Ast as H
-import qualified Hydra.Sources.Haskell.Ast as HaskellAst
+import qualified Hydra.Ext.Haskell.Syntax as H
+import qualified Hydra.Sources.Haskell.Syntax as HaskellSyntax
 import qualified Hydra.Sources.Haskell.Operators as HaskellOperators
 
 
@@ -106,7 +96,7 @@
 module_ :: Module
 module_ = Module ns elements
     [Constants.ns, Serialization.ns, HaskellOperators.ns]
-    (HaskellAst.ns:KernelTypes.kernelTypesNamespaces) $
+    (HaskellSyntax.ns:KernelTypes.kernelTypesNamespaces) $
     Just ("Haskell operator precendence and associativity are drawn from:\n"
       <> "https://self-learning-java-tutorial.blogspot.com/2016/04/haskell-operator-precedence.html\n"
       <> "Other operators were investigated using GHCi, e.g. \":info (->)\"\n"
@@ -114,50 +104,52 @@
       <> "https://stackoverflow.com/questions/7746894/are-there-pronounceable-names-for-common-haskell-operators")
   where
     elements = [
-      toBinding alternativeToExpr,
-      toBinding applicationExpressionToExpr,
-      toBinding applicationPatternToExpr,
-      toBinding assertionToExpr,
-      toBinding caseExpressionToExpr,
-      toBinding caseRhsToExpr,
-      toBinding classAssertionToExpr,
-      toBinding constructorToExpr,
-      toBinding constructorWithCommentsToExpr,
-      toBinding dataOrNewtypeToExpr,
-      toBinding declarationHeadToExpr,
-      toBinding declarationToExpr,
-      toBinding declarationWithCommentsToExpr,
-      toBinding expressionToExpr,
-      toBinding constructRecordExpressionToExpr,
-      toBinding fieldToExpr,
-      toBinding fieldWithCommentsToExpr,
-      toBinding ifExpressionToExpr,
-      toBinding importExportSpecToExpr,
-      toBinding importToExpr,
-      toBinding lambdaExpressionToExpr,
-      toBinding literalToExpr,
-      toBinding localBindingToExpr,
-      toBinding moduleHeadToExpr,
-      toBinding moduleToExpr,
-      toBinding nameToExpr,
-      toBinding patternToExpr,
-      toBinding rightHandSideToExpr,
-      toBinding statementToExpr,
-      toBinding typeSignatureToExpr,
-      toBinding typeToExpr,
-      toBinding valueBindingToExpr,
-      toBinding variableToExpr,
-      toBinding toHaskellComments,
-      toBinding toSimpleComments,
-      toBinding writeQualifiedName]
+      toTermDefinition alternativeToExpr,
+      toTermDefinition applicationExpressionToExpr,
+      toTermDefinition applicationPatternToExpr,
+      toTermDefinition assertionToExpr,
+      toTermDefinition caseExpressionToExpr,
+      toTermDefinition caseRhsToExpr,
+      toTermDefinition classAssertionToExpr,
+      toTermDefinition constructRecordExpressionToExpr,
+      toTermDefinition constructorToExpr,
+      toTermDefinition constructorWithCommentsToExpr,
+      toTermDefinition dataOrNewtypeToExpr,
+      toTermDefinition declarationHeadToExpr,
+      toTermDefinition declarationToExpr,
+      toTermDefinition declarationWithCommentsToExpr,
+      toTermDefinition expressionToExpr,
+      toTermDefinition fieldToExpr,
+      toTermDefinition fieldWithCommentsToExpr,
+      toTermDefinition ifExpressionToExpr,
+      toTermDefinition importExportSpecToExpr,
+      toTermDefinition importToExpr,
+      toTermDefinition lambdaExpressionToExpr,
+      toTermDefinition literalToExpr,
+      toTermDefinition localBindingToExpr,
+      toTermDefinition moduleHeadToExpr,
+      toTermDefinition moduleToExpr,
+      toTermDefinition nameToExpr,
+      toTermDefinition patternToExpr,
+      toTermDefinition rightHandSideToExpr,
+      toTermDefinition statementToExpr,
+      toTermDefinition toHaskellComments,
+      toTermDefinition toSimpleComments,
+      toTermDefinition typeSignatureToExpr,
+      toTermDefinition typeToExpr,
+      toTermDefinition valueBindingToExpr,
+      toTermDefinition variableToExpr,
+      toTermDefinition writeQualifiedName]
 
 alternativeToExpr :: TBinding (H.Alternative -> Expr)
 alternativeToExpr = haskellSerdeDefinition "alternativeToExpr" $
   doc "Convert a pattern-matching alternative to an AST expression" $
-  lambda "alt" $ 
-    Serialization.ifx @@ HaskellOperators.caseOp @@
-      (patternToExpr @@ (project H._Alternative H._Alternative_pattern @@ var "alt")) @@
-      (caseRhsToExpr @@ (project H._Alternative H._Alternative_rhs @@ var "alt"))
+  lambda "alt" $
+    -- Use structuralSpaceSep to avoid triggering parenthesize on the RHS
+    Serialization.structuralSpaceSep @@ list [
+      patternToExpr @@ (project H._Alternative H._Alternative_pattern @@ var "alt"),
+      Serialization.cst @@ string "->",
+      caseRhsToExpr @@ (project H._Alternative H._Alternative_rhs @@ var "alt")]
 
 applicationExpressionToExpr :: TBinding (H.ApplicationExpression -> Expr)
 applicationExpressionToExpr = haskellSerdeDefinition "applicationExpressionToExpr" $
@@ -213,6 +205,20 @@
     Serialization.spaceSep @@ (Lists.cons (nameToExpr @@ var "name") (list [
       Serialization.commaSep @@ Serialization.halfBlockStyle @@ (Lists.map (typeToExpr) (var "types"))]))
 
+constructRecordExpressionToExpr :: TBinding (H.ConstructRecordExpression -> Expr)
+constructRecordExpressionToExpr = haskellSerdeDefinition "constructRecordExpressionToExpr" $
+  doc "Convert a record construction expression to an AST expression" $
+  lambda "constructRecord" $ lets [
+    "name">: project H._ConstructRecordExpression H._ConstructRecordExpression_name @@ var "constructRecord",
+    "updates">: project H._ConstructRecordExpression H._ConstructRecordExpression_fields @@ var "constructRecord",
+    "fromUpdate">: lambda "update" $ lets [
+      "fn">: project H._FieldUpdate H._FieldUpdate_name @@ var "update",
+      "val">: project H._FieldUpdate H._FieldUpdate_value @@ var "update"] $
+      Serialization.ifx @@ HaskellOperators.defineOp @@ (nameToExpr @@ var "fn") @@ (expressionToExpr @@ var "val"),
+    "body">: Serialization.commaSep @@ Serialization.halfBlockStyle @@ (Lists.map (var "fromUpdate") (var "updates"))] $
+    Serialization.spaceSep @@ (Lists.cons (nameToExpr @@ var "name") (list [
+      Serialization.brackets @@ Serialization.curlyBraces @@ Serialization.halfBlockStyle @@ var "body"]))
+
 constructorToExpr :: TBinding (H.Constructor -> Expr)
 constructorToExpr = haskellSerdeDefinition "constructorToExpr" $
   doc "Convert a data constructor to an AST expression" $
@@ -290,7 +296,7 @@
         "vb">: project H._TypedBinding H._TypedBinding_valueBinding @@ var "typedBinding",
         "name">: project H._TypeSignature H._TypeSignature_name @@ var "typeSig",
         "htype">: project H._TypeSignature H._TypeSignature_type @@ var "typeSig"] $
-        Serialization.newlineSep @@ (Lists.cons (Serialization.ifx @@ HaskellOperators.typeOp @@ (nameToExpr @@ var "name") @@ (typeToExpr @@ var "htype")) (list [
+        Serialization.newlineSep @@ (Lists.cons (Serialization.structuralSpaceSep @@ list [nameToExpr @@ var "name", Serialization.cst @@ string "::", typeToExpr @@ var "htype"]) (list [
           valueBindingToExpr @@ var "vb"]))]
 
 declarationWithCommentsToExpr :: TBinding (H.DeclarationWithComments -> Expr)
@@ -322,7 +328,7 @@
         "bindings">: project H._LetExpression H._LetExpression_bindings @@ var "letExpr",
         "inner">: project H._LetExpression H._LetExpression_inner @@ var "letExpr",
         "encodeBinding">: lambda "binding" $
-          Serialization.indentSubsequentLines @@ (string "      ") @@ (localBindingToExpr @@ var "binding")] $
+          Serialization.indentSubsequentLines @@ (string "    ") @@ (localBindingToExpr @@ var "binding")] $
         Serialization.indentBlock @@ (Lists.cons (Serialization.cst @@ (string "")) (Lists.cons
           (Serialization.spaceSep @@ (Lists.cons (Serialization.cst @@ (string "let")) (list [Serialization.customIndentBlock @@ (string "    ") @@ (Lists.map (var "encodeBinding") (var "bindings"))])))
           (list [Serialization.spaceSep @@ (Lists.cons (Serialization.cst @@ (string "in")) (list [expressionToExpr @@ var "inner"]))]))),
@@ -333,20 +339,6 @@
         Serialization.parenList @@ false @@ (Lists.map (expressionToExpr) (var "exprs")),
       H._Expression_variable>>: lambda "name" $ nameToExpr @@ var "name"]
 
-constructRecordExpressionToExpr :: TBinding (H.ConstructRecordExpression -> Expr)
-constructRecordExpressionToExpr = haskellSerdeDefinition "constructRecordExpressionToExpr" $
-  doc "Convert a record construction expression to an AST expression" $
-  lambda "constructRecord" $ lets [
-    "name">: project H._ConstructRecordExpression H._ConstructRecordExpression_name @@ var "constructRecord",
-    "updates">: project H._ConstructRecordExpression H._ConstructRecordExpression_fields @@ var "constructRecord",
-    "fromUpdate">: lambda "update" $ lets [
-      "fn">: project H._FieldUpdate H._FieldUpdate_name @@ var "update",
-      "val">: project H._FieldUpdate H._FieldUpdate_value @@ var "update"] $
-      Serialization.ifx @@ HaskellOperators.defineOp @@ (nameToExpr @@ var "fn") @@ (expressionToExpr @@ var "val"),
-    "body">: Serialization.commaSep @@ Serialization.halfBlockStyle @@ (Lists.map (var "fromUpdate") (var "updates"))] $
-    Serialization.spaceSep @@ (Lists.cons (nameToExpr @@ var "name") (list [
-      Serialization.brackets @@ Serialization.curlyBraces @@ Serialization.halfBlockStyle @@ var "body"]))
-
 fieldToExpr :: TBinding (H.Field -> Expr)
 fieldToExpr = haskellSerdeDefinition "fieldToExpr" $
   doc "Convert a field declaration to an AST expression" $
@@ -551,13 +543,31 @@
   doc "Convert a statement to an AST expression" $
   lambda "stmt" $ expressionToExpr @@ (unwrap H._Statement @@ var "stmt")
 
+toHaskellComments :: TBinding (String -> String)
+toHaskellComments = haskellSerdeDefinition "toHaskellComments" $
+  doc "Convert a string to Haddock documentation comments" $
+  lambda "c" $ Strings.intercalate (string "\n") $ Lists.map (lambda "s" $ Strings.cat2 (string "-- | ") (var "s")) (Strings.lines $ var "c")
+
+toSimpleComments :: TBinding (String -> String)
+toSimpleComments = haskellSerdeDefinition "toSimpleComments" $
+  doc "Convert a string to simple line comments" $
+  lambda "c" $ Strings.intercalate (string "\n") $ Lists.map (lambda "s" $ Strings.cat2 (string "-- ") (var "s")) (Strings.lines $ var "c")
+
 typeSignatureToExpr :: TBinding (H.TypeSignature -> Expr)
 typeSignatureToExpr = haskellSerdeDefinition "typeSignatureToExpr" $
   doc "Convert a type signature to an AST expression" $
   lambda "typeSig" $ lets [
     "name">: project H._TypeSignature H._TypeSignature_name @@ var "typeSig",
-    "typ">: project H._TypeSignature H._TypeSignature_type @@ var "typeSig"] $
-    Serialization.spaceSep @@ (Lists.cons (nameToExpr @@ var "name") (Lists.cons (Serialization.cst @@ (string "::")) (list [typeToExpr @@ var "typ"])))
+    "typ">: project H._TypeSignature H._TypeSignature_type @@ var "typeSig",
+    "nameExpr">: nameToExpr @@ var "name",
+    "typeExpr">: typeToExpr @@ var "typ",
+    "inlineSig">: Serialization.structuralSpaceSep @@ list [var "nameExpr", Serialization.cst @@ string "::", var "typeExpr"]] $
+    -- If the inline form exceeds 120 chars, break the type onto the next line with indentation
+    Logic.ifElse (Equality.gt (Serialization.expressionLength @@ var "inlineSig") (int32 120))
+      (Serialization.newlineSep @@ list [
+        Serialization.spaceSep @@ list [var "nameExpr", Serialization.cst @@ string "::"],
+        Serialization.tabIndent @@ var "typeExpr"])
+      (var "inlineSig")
 
 typeToExpr :: TBinding (H.Type -> Expr)
 typeToExpr = haskellSerdeDefinition "typeToExpr" $
@@ -591,7 +601,16 @@
         "pat">: project H._SimpleValueBinding H._SimpleValueBinding_pattern @@ var "simpleVB",
         "rhs">: project H._SimpleValueBinding H._SimpleValueBinding_rhs @@ var "simpleVB",
         "local">: project H._SimpleValueBinding H._SimpleValueBinding_localBindings @@ var "simpleVB",
-        "body">: Serialization.ifx @@ HaskellOperators.defineOp @@ (patternToExpr @@ var "pat") @@ (rightHandSideToExpr @@ var "rhs")] $
+        "lhsExpr">: patternToExpr @@ var "pat",
+        "rhsExpr">: rightHandSideToExpr @@ var "rhs",
+        -- Use structuralSpaceSep to avoid triggering parenthesize on the RHS
+        "inlineBody">: Serialization.structuralSpaceSep @@ list [var "lhsExpr", Serialization.cst @@ string "=", var "rhsExpr"],
+        -- If the inline form exceeds 120 chars, break the RHS onto the next line with indentation
+        "body">: Logic.ifElse (Equality.gt (Serialization.expressionLength @@ var "inlineBody") (int32 120))
+          (Serialization.newlineSep @@ list [
+            Serialization.spaceSep @@ list [var "lhsExpr", Serialization.cst @@ string "="],
+            Serialization.tabIndent @@ var "rhsExpr"])
+          (var "inlineBody")] $
         Maybes.maybe
           (var "body")
           (lambda "localBindings" $ lets [
@@ -605,16 +624,6 @@
 variableToExpr = haskellSerdeDefinition "variableToExpr" $
   doc "Convert a type variable to an AST expression" $
   lambda "variable" $ nameToExpr @@ (unwrap H._Variable @@ var "variable")
-
-toHaskellComments :: TBinding (String -> String)
-toHaskellComments = haskellSerdeDefinition "toHaskellComments" $
-  doc "Convert a string to Haddock documentation comments" $
-  lambda "c" $ Strings.intercalate (string "\n") $ Lists.map (lambda "s" $ Strings.cat2 (string "-- | ") (var "s")) (Strings.lines $ var "c")
-
-toSimpleComments :: TBinding (String -> String)
-toSimpleComments = haskellSerdeDefinition "toSimpleComments" $
-  doc "Convert a string to simple line comments" $
-  lambda "c" $ Strings.intercalate (string "\n") $ Lists.map (lambda "s" $ Strings.cat2 (string "-- ") (var "s")) (Strings.lines $ var "c")
 
 writeQualifiedName :: TBinding (H.QualifiedName -> String)
 writeQualifiedName = haskellSerdeDefinition "writeQualifiedName" $
diff --git a/src/main/haskell/Hydra/Sources/Haskell/Syntax.hs b/src/main/haskell/Hydra/Sources/Haskell/Syntax.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Haskell/Syntax.hs
@@ -0,0 +1,919 @@
+-- | A Haskell syntax model, loosely based on Language.Haskell.Tools.AST
+
+module Hydra.Sources.Haskell.Syntax where
+
+-- Standard type-level imports
+import           Hydra.Kernel
+import           Hydra.Dsl.Annotations (doc)
+import           Hydra.Dsl.Bootstrap
+import           Hydra.Dsl.Types ((>:))
+import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Core as Core
+
+
+ns :: Namespace
+ns = Namespace "hydra.ext.haskell.syntax"
+
+define :: String -> Type -> Binding
+define = defineType ns
+
+module_ :: Module
+module_ = Module ns (map toTypeDef elements) [Core.ns] [Core.ns] $
+    Just "A Haskell syntax model, loosely based on Language.Haskell.Tools.AST"
+  where
+    elements = [
+      alternative,
+      assertion,
+      classAssertion,
+      caseRhs,
+      constructor,
+      ordinaryConstructor,
+      recordConstructor,
+      constructorWithComments,
+      dataDeclaration,
+      dataOrNewtype,
+      declarationWithComments,
+      declaration,
+      declarationHead,
+      applicationDeclarationHead,
+      deriving_,
+      export,
+      expression,
+      applicationExpression,
+      caseExpression,
+      constructRecordExpression,
+      ifExpression,
+      infixApplicationExpression,
+      lambdaExpression,
+      letExpression,
+      prefixApplicationExpression,
+      sectionExpression,
+      typeSignatureExpression,
+      updateRecordExpression,
+      field,
+      fieldWithComments,
+      fieldUpdate,
+      import_,
+      specImport,
+      importModifier,
+      importExportSpec,
+      subspecImportExportSpec,
+      literal,
+      localBinding,
+      localBindings,
+      module',
+      moduleHead,
+      moduleName,
+      name,
+      namePart,
+      operator,
+      pattern,
+      applicationPattern,
+      asPattern,
+      recordPattern,
+      typedPattern,
+      patternField,
+      qualifiedName,
+      rightHandSide,
+      statement,
+      type_,
+      applicationType,
+      contextType,
+      functionType,
+      infixType,
+      typeDeclaration,
+      typeSignature,
+      typedBinding,
+      valueBinding,
+      simpleValueBinding,
+      variable]
+
+alternative :: Binding -- UAlt
+alternative = define "Alternative" $
+  doc "A pattern-matching alternative" $
+  T.record [
+    "pattern">:
+      doc "The pattern to match"
+      pattern,
+    "rhs">:
+      doc "The right-hand side of the alternative"
+      caseRhs,
+    "binds">:
+      doc "Optional local bindings" $
+      T.maybe localBindings]
+
+assertion :: Binding -- UAssertion (UClassAssert)
+assertion = define "Assertion" $
+  doc "A type assertion" $
+  T.union [
+    "class">:
+      doc "A class assertion"
+      classAssertion,
+    "tuple">:
+      doc "A tuple of assertions" $
+      T.list assertion]
+  -- omitted for now: implicit and infix assertions
+
+classAssertion :: Binding -- UClassAssert
+classAssertion = define "ClassAssertion" $
+  doc "A class assertion" $
+  T.record [
+    "name">:
+      doc "The name of the class"
+      name,
+    "types">:
+      doc "The types to which the class is applied" $
+      T.list type_]
+
+caseRhs :: Binding -- UCaseRhs'
+caseRhs = define "CaseRhs" $
+  doc "The right-hand side of a pattern-matching alternative" $
+  -- omitted for now: guarded
+  T.wrap expression
+
+constructor :: Binding -- UConDecl
+constructor = define "Constructor" $
+  doc "A data constructor" $
+  -- omitted for now: ordinary (positional), infix
+  T.union [
+    "ordinary">:
+      doc "An ordinary (positional) constructor"
+      ordinaryConstructor,
+    "record">:
+      doc "A record constructor"
+      recordConstructor]
+
+ordinaryConstructor :: Binding
+ordinaryConstructor = define "OrdinaryConstructor" $
+  doc "An ordinary (positional) data constructor" $
+  T.record [
+    "name">:
+      doc "The name of the constructor"
+      name,
+    "fields">:
+      doc "The types of the positional fields" $
+      T.list type_]
+
+recordConstructor :: Binding
+recordConstructor = define "RecordConstructor" $
+  doc "A record-style data constructor" $
+  T.record [
+    "name">:
+      doc "The name of the constructor"
+      name,
+    "fields">:
+      doc "The named fields of the record" $
+      T.list fieldWithComments]
+
+constructorWithComments :: Binding
+constructorWithComments = define "ConstructorWithComments" $
+  doc "A data constructor together with any comments" $
+  T.record [
+    "body">:
+      doc "The constructor"
+      constructor,
+    "comments">:
+      doc "Optional comments" $
+      T.maybe T.string]
+
+dataDeclaration :: Binding -- UDataDecl
+dataDeclaration = define "DataDeclaration" $
+  doc "A data type declaration" $
+  T.record [
+    "keyword">:
+      doc "The 'data' or 'newtype' keyword"
+      dataOrNewtype,
+    "context">:
+      doc "Type class constraints" $
+      T.list assertion,
+    "head">:
+      doc "The declaration head"
+      declarationHead,
+    "constructors">:
+      doc "The data constructors" $
+      T.list constructorWithComments,
+    "deriving">:
+      doc "Derived type class instances" $
+      T.list deriving_]
+
+dataOrNewtype :: Binding
+dataOrNewtype = define "DataOrNewtype" $
+  doc "The 'data' versus 'newtype keyword" $
+  T.enum ["data", "newtype"]
+
+declarationWithComments :: Binding
+declarationWithComments = define "DeclarationWithComments" $
+  doc "A data declaration together with any comments" $
+  T.record [
+    "body">:
+      doc "The declaration"
+      declaration,
+    "comments">:
+      doc "Optional comments" $
+      T.maybe T.string]
+
+declaration :: Binding -- UDecl
+declaration = define "Declaration" $
+  doc "A data or value declaration" $
+  -- omitted for now: typeFamily, typeSignature, closedTypeFamily, gDataDecl, typeInst, dataInst, gDataInst, class, inst,
+  --                  patternSynonym, deriv, fixity, default, patTypeSig, foreignImport, foreignExport, pragma,
+  --                  role, splice
+  T.union [
+    "data">:
+      doc "A data type declaration"
+      dataDeclaration,
+    "type">:
+      doc "A type synonym declaration"
+      typeDeclaration,
+    "valueBinding">:
+      doc "A value binding"
+      valueBinding,
+    "typedBinding">:
+      doc "A typed binding"
+      typedBinding]
+
+declarationHead :: Binding -- UDeclHead
+declarationHead = define "DeclarationHead" $
+  doc "The left-hand side of a declaration" $
+  -- omitted for now: infix application
+  T.union [
+    "application">:
+      doc "An application-style declaration head"
+      applicationDeclarationHead,
+    "parens">:
+      doc "A parenthesized declaration head"
+      declarationHead,
+    "simple">:
+      doc "A simple name"
+      name]
+
+applicationDeclarationHead :: Binding
+applicationDeclarationHead = define "ApplicationDeclarationHead" $
+  doc "An application-style declaration head" $
+  T.record [
+    "function">:
+      doc "The function being applied"
+      declarationHead,
+    "operand">:
+      doc "The type variable operand"
+      variable]
+
+deriving_ :: Binding -- UDeriving
+deriving_ = define "Deriving" $
+  doc "A 'deriving' statement" $
+  -- omitted for now: infix, parenthesized, and application instance heads
+  T.wrap $ T.list name
+
+export :: Binding -- UExportSpec
+export = define "Export" $
+  doc "An export statement" $
+  T.union [
+    "declaration">:
+      doc "An exported declaration"
+      importExportSpec,
+    "module">:
+      doc "An exported module"
+      moduleName]
+
+expression :: Binding -- UExpr
+expression = define "Expression" $
+  doc "A data expression" $
+  -- omitted for now: multi-if, unboxed tuple, tuple section, unboxed tuple section, parallel array,
+  --                  enum, parallel array enum, list comp, parallel array comp, type application,
+  --                  (all Template Haskell constructors), pragma, arrow definition, arrow application,
+  --                  lambda cases, static, unboxed sum, hole
+  T.union [
+    "application">:
+      doc "A function application"
+      applicationExpression,
+    "case">:
+      doc "A case expression"
+      caseExpression,
+    "constructRecord">:
+      doc "A record constructor expression"
+      constructRecordExpression,
+    "do">:
+      doc "A 'do' expression" $
+      T.list statement, -- omitted for now: do vs. mdo
+    "if">:
+      doc "An 'if' expression"
+      ifExpression,
+    "infixApplication">:
+      doc "An infix application"
+      infixApplicationExpression,
+    "literal">:
+      doc "A literal value"
+      literal,
+    "lambda">:
+      doc "A lambda expression"
+      lambdaExpression,
+    "leftSection">:
+      doc "A left section expression"
+      sectionExpression,
+    "let">:
+      doc "A 'let' expression"
+      letExpression,
+    "list">:
+      doc "A list expression" $
+      T.list expression,
+    "parens">:
+      doc "A parenthesized expression"
+      expression,
+    "prefixApplication">:
+      doc "A prefix application"
+      prefixApplicationExpression,
+    "rightSection">:
+      doc "A right section expression"
+      sectionExpression,
+    "tuple">:
+      doc "A tuple expression" $
+      T.list expression,
+    "typeSignature">:
+      doc "A type signature expression"
+      typeSignatureExpression,
+    "updateRecord">:
+      doc "A record update expression"
+      updateRecordExpression,
+    "variable">:
+      doc "A variable reference"
+      name]
+
+applicationExpression :: Binding
+applicationExpression = define "ApplicationExpression" $
+  doc "An application expression" $
+  T.record [
+    "function">:
+      doc "The function being applied"
+      expression,
+    "argument">:
+      doc "The argument"
+      expression]
+
+caseExpression :: Binding
+caseExpression = define "CaseExpression" $
+  doc "A case expression" $
+  T.record [
+    "case">:
+      doc "The expression being matched"
+      expression,
+    "alternatives">:
+      doc "The pattern-matching alternatives" $
+      T.list alternative]
+
+constructRecordExpression :: Binding
+constructRecordExpression = define "ConstructRecordExpression" $
+  doc "A record constructor expression" $
+  T.record [
+    "name">:
+      doc "The constructor name"
+      name,
+    "fields">:
+      doc "The field assignments" $
+      T.list fieldUpdate]
+
+ifExpression :: Binding
+ifExpression = define "IfExpression" $
+  doc "An 'if' expression" $
+  T.record [
+    "condition">:
+      doc "The condition expression"
+      expression,
+    "then">:
+      doc "The 'then' branch"
+      expression,
+    "else">:
+      doc "The 'else' branch"
+      expression]
+
+infixApplicationExpression :: Binding
+infixApplicationExpression = define "InfixApplicationExpression" $
+  doc "An infix application expression" $
+  T.record [
+    "lhs">:
+      doc "The left-hand operand"
+      expression,
+    "operator">:
+      doc "The infix operator"
+      operator,
+    "rhs">:
+      doc "The right-hand operand"
+      expression]
+
+lambdaExpression :: Binding
+lambdaExpression = define "LambdaExpression" $
+  doc "A lambda expression" $
+  T.record [
+    "bindings">:
+      doc "The patterns binding parameters" $
+      T.list pattern,
+    "inner">:
+      doc "The body of the lambda"
+      expression]
+
+letExpression :: Binding
+letExpression = define "LetExpression" $
+  doc "A 'let' expression" $
+  T.record [
+    "bindings">:
+      doc "The local bindings" $
+      T.list localBinding,
+    "inner">:
+      doc "The body of the let expression"
+      expression]
+
+prefixApplicationExpression :: Binding
+prefixApplicationExpression = define "PrefixApplicationExpression" $
+  doc "A prefix expression" $
+  T.record [
+    "operator">:
+      doc "The prefix operator"
+      operator,
+    "rhs">:
+      doc "The operand"
+      expression]
+
+sectionExpression :: Binding
+sectionExpression = define "SectionExpression" $
+  doc "A section expression" $
+  T.record [
+    "operator">:
+      doc "The operator"
+      operator,
+    "expression">:
+      doc "The operand"
+      expression]
+
+typeSignatureExpression :: Binding
+typeSignatureExpression = define "TypeSignatureExpression" $
+  doc "A type signature expression" $
+  T.record [
+    "inner">:
+      doc "The expression being typed"
+      expression,
+    "type">:
+      doc "The type signature"
+      type_]
+
+updateRecordExpression :: Binding
+updateRecordExpression = define "UpdateRecordExpression" $
+  doc "An update record expression" $
+  T.record [
+    "inner">:
+      doc "The record being updated"
+      expression,
+    "fields">:
+      doc "The field updates" $
+      T.list fieldUpdate]
+
+field :: Binding -- UFieldDecl
+field = define "Field" $
+  doc "A field (name/type pair)" $
+  T.record [
+    "name">:
+      doc "The field name"
+      name,
+    "type">:
+      doc "The field type"
+      type_]
+
+fieldWithComments :: Binding
+fieldWithComments = define "FieldWithComments" $
+  doc "A field together with any comments" $
+  T.record [
+    "field">:
+      doc "The field"
+      field,
+    "comments">:
+      doc "Optional comments" $
+      T.maybe T.string]
+
+fieldUpdate :: Binding -- UFieldUpdate
+fieldUpdate = define "FieldUpdate" $
+  doc "A field name and value" $
+  -- omitted for now: pun, wildcard
+  T.record [
+    "name">:
+      doc "The field name"
+      name,
+    "value">:
+      doc "The field value"
+      expression]
+
+import_ :: Binding -- UImportDecl
+import_ = define "Import" $
+  doc "An import statement" $
+  -- omitted for now: source, safe, pkg
+  T.record [
+    "qualified">:
+      doc "Whether the import is qualified"
+      T.boolean,
+    "module">:
+      doc "The module being imported"
+      moduleName,
+    "as">:
+      doc "Optional alias for the module" $
+      T.maybe moduleName,
+    "spec">:
+      doc "Optional import specification" $
+      T.maybe specImport]
+
+specImport :: Binding
+specImport = define "SpecImport" $
+  doc "An import specification" $
+  T.union [
+    "list">:
+      doc "A list of imports to include" $
+      T.list importExportSpec,
+    "hiding">:
+      doc "A list of imports to exclude" $
+      T.list importExportSpec]
+
+importModifier :: Binding -- UImportModifier
+importModifier = define "ImportModifier" $
+  doc "An import modifier ('pattern' or 'type')" $
+  T.enum ["pattern", "type"]
+
+importExportSpec :: Binding -- UIESpec
+importExportSpec = define "ImportExportSpec" $
+  doc "An import or export specification" $
+  T.record [
+    "modifier">:
+      doc "Optional import modifier" $
+      T.maybe importModifier,
+    "name">:
+      doc "The name being imported or exported"
+      name,
+    "subspec">:
+      doc "Optional subspecification" $
+      T.maybe subspecImportExportSpec]
+
+subspecImportExportSpec :: Binding
+subspecImportExportSpec = define "SubspecImportExportSpec" $
+  doc "A subspecification within an import/export" $
+  T.union [
+    "all">:
+      doc "Import/export all"
+      T.unit,
+    "list">:
+      doc "Import/export specific names" $
+      T.list name]
+
+literal :: Binding -- ULiteral
+literal = define "Literal" $
+  doc "A literal value" $
+  -- omitted for now: frac, primChar
+  T.union [
+    "char">:
+      doc "A character literal"
+      T.uint16,
+    "double">:
+      doc "A double-precision floating point literal"
+      T.float64,
+    "float">:
+      doc "A single-precision floating point literal"
+      T.float32,
+    "int">:
+      doc "A 32-bit integer literal"
+      T.int32,
+    "integer">:
+      doc "An arbitrary-precision integer literal"
+      T.bigint,
+    "string">:
+      doc "A string literal"
+      T.string]
+
+localBinding :: Binding -- ULocalBind
+localBinding = define "LocalBinding" $
+  doc "A local binding" $
+  -- omitted for now: fixity, pragma
+  T.union [
+    "signature">:
+      doc "A type signature"
+      typeSignature,
+    "value">:
+      doc "A value binding"
+      valueBinding]
+
+localBindings :: Binding -- ULocalBinds
+localBindings = define "LocalBindings" $
+  doc "A collection of local bindings" $
+  T.wrap $ T.list localBinding
+
+module' :: Binding -- UModule
+module' = define "Module" $
+  doc "A Haskell module" $
+  -- omitted for now: pragma
+  T.record [
+    "head">:
+      doc "Optional module head" $
+      T.maybe moduleHead,
+    "imports">:
+      doc "Import statements" $
+      T.list import_,
+    "declarations">:
+      doc "Module declarations" $
+      T.list declarationWithComments]
+
+moduleHead :: Binding -- UModuleHead
+moduleHead = define "ModuleHead" $
+  doc "A module head" $
+  -- omitted for now: pragma
+  T.record [
+    "comments">:
+      doc "Optional module-level comments" $
+      T.maybe T.string,
+    "name">:
+      doc "The module name"
+      moduleName,
+    "exports">:
+      doc "Export list" $
+      T.list export] -- UExportSpecs
+
+moduleName :: Binding -- UModuleName
+moduleName = define "ModuleName" $
+  doc "A module name" $
+  T.wrap T.string
+
+name :: Binding -- UName
+name = define "Name" $
+  doc "A name" $
+  T.union [
+    "implicit">:
+      doc "An implicit name"
+      qualifiedName,
+    "normal">:
+      doc "A normal name"
+      qualifiedName,
+    "parens">:
+      doc "A parenthesized name"
+      qualifiedName]
+
+namePart :: Binding -- UNamePart
+namePart = define "NamePart" $
+  doc "A component of a qualified name" $
+  T.wrap T.string
+
+operator :: Binding -- UOperator
+operator = define "Operator" $
+  doc "An operator" $
+  T.union [
+    "backtick">:
+      doc "A function used as an infix operator"
+      qualifiedName,
+    "normal">:
+      doc "A normal infix operator"
+      qualifiedName]
+
+pattern :: Binding -- UPattern
+pattern = define "Pattern" $
+  doc "A pattern" $
+  -- omitted for now: unboxed tuples, parallel arrays, irrefutable, bang, view, splice, quasiquote, plusk, unboxed sum
+  T.union [
+    "application">:
+      doc "An application pattern"
+      applicationPattern,
+    "as">:
+      doc "An 'as' pattern"
+      asPattern,
+    "list">:
+      doc "A list pattern" $
+      T.list pattern,
+    "literal">:
+      doc "A literal pattern"
+      literal,
+    "name">:
+      doc "A name pattern"
+      name,
+    "parens">:
+      doc "A parenthesized pattern"
+      pattern,
+    "record">:
+      doc "A record pattern"
+      recordPattern,
+    "tuple">:
+      doc "A tuple pattern" $
+      T.list pattern,
+    "typed">:
+      doc "A typed pattern"
+      typedPattern,
+    "wildcard">:
+      doc "A wildcard pattern"
+      T.unit]
+
+applicationPattern :: Binding
+applicationPattern = define "ApplicationPattern" $
+  doc "An application pattern" $
+  T.record [
+    "name">:
+      doc "The constructor name"
+      name,
+    "args">:
+      doc "The pattern arguments" $
+      T.list pattern]
+
+asPattern :: Binding
+asPattern = define "AsPattern" $
+  doc "An 'as' pattern" $
+  T.record [
+    "name">:
+      doc "The bound name"
+      name,
+    "inner">:
+      doc "The inner pattern"
+      pattern]
+
+recordPattern :: Binding
+recordPattern = define "RecordPattern" $
+  doc "A record pattern" $
+  T.record [
+    "name">:
+      doc "The constructor name"
+      name,
+    "fields">:
+      doc "The field patterns" $
+      T.list patternField]
+
+typedPattern :: Binding
+typedPattern = define "TypedPattern" $
+  doc "A typed pattern" $
+  T.record [
+    "inner">:
+      doc "The inner pattern"
+      pattern,
+    "type">:
+      doc "The type annotation"
+      type_]
+
+patternField :: Binding -- UPatternField
+patternField = define "PatternField" $
+  doc "A pattern field" $
+  -- omitted for now: puns, wildcards
+  T.record [
+    "name">:
+      doc "The field name"
+      name,
+    "pattern">:
+      doc "The field pattern"
+      pattern]
+
+qualifiedName :: Binding -- UQualifiedName
+qualifiedName = define "QualifiedName" $
+  doc "A qualified name" $
+  T.record [
+    "qualifiers">:
+      doc "The qualifier parts" $
+      T.list namePart,
+    "unqualified">:
+      doc "The unqualified name part"
+      namePart]
+
+rightHandSide :: Binding -- URhs
+rightHandSide = define "RightHandSide" $
+  doc "A right-hand side of a binding" $
+  -- omitted for now: guarded rhs
+  T.wrap expression
+
+statement :: Binding -- UStmt
+statement = define "Statement" $
+  doc "A do-notation statement" $
+  T.wrap expression
+
+type_ :: Binding -- UType
+type_ = define "Type" $
+  doc "A type expression" $
+  -- omitted for now: forall, unboxed tuple, parallel array, kinded, promoted, splice, quasiquote, bang,
+  --                  lazy, unpack, nounpack, wildcard, named wildcard, sum
+  T.union [
+    "application">:
+      doc "An application type"
+      applicationType,
+    "ctx">:
+      doc "A context type"
+      contextType,
+    "function">:
+      doc "A function type"
+      functionType,
+    "infix">:
+      doc "An infix type"
+      infixType,
+    "list">:
+      doc "A list type"
+      type_,
+    "parens">:
+      doc "A parenthesized type"
+      type_,
+    "tuple">:
+      doc "A tuple type" $
+      T.list type_,
+    "variable">:
+      doc "A type variable or type name"
+      name]
+
+applicationType :: Binding
+applicationType = define "ApplicationType" $
+  doc "An application type" $
+  T.record [
+    "context">:
+      doc "The type being applied"
+      type_,
+    "argument">:
+      doc "The type argument"
+      type_]
+
+contextType :: Binding
+contextType = define "ContextType" $
+  doc "A type with a context (type class constraints)" $
+  T.record [
+    "ctx">:
+      doc "The type class context"
+      assertion, -- UContext
+    "type">:
+      doc "The constrained type"
+      type_]
+
+functionType :: Binding
+functionType = define "FunctionType" $
+  doc "A function type" $
+  T.record [
+    "domain">:
+      doc "The domain type"
+      type_,
+    "codomain">:
+      doc "The codomain type"
+      type_]
+
+infixType :: Binding
+infixType = define "InfixType" $
+  doc "An infix type application" $
+  T.record [
+    "lhs">:
+      doc "The left-hand type"
+      type_,
+    "operator">:
+      doc "The type operator"
+      operator,
+    "rhs">:
+      doc "The right-hand operator"
+      operator]
+
+typeDeclaration :: Binding -- UTypeDecl
+typeDeclaration = define "TypeDeclaration" $
+  doc "A type synonym declaration" $
+  T.record [
+    "name">:
+      doc "The declaration head"
+      declarationHead,
+    "type">:
+      doc "The type being defined"
+      type_]
+
+typeSignature :: Binding -- UTypeSignature
+typeSignature = define "TypeSignature" $
+  doc "A type signature" $
+  T.record [
+    "name">:
+      doc "The name being typed"
+      name,
+    "type">:
+      doc "The type"
+      type_]
+
+typedBinding :: Binding -- Added for convenience
+typedBinding = define "TypedBinding" $
+  doc "A binding with its type signature" $
+  T.record [
+    "typeSignature">:
+      doc "The type signature"
+      typeSignature,
+    "valueBinding">:
+      doc "The value binding"
+      valueBinding]
+
+valueBinding :: Binding -- UValueBind
+valueBinding = define "ValueBinding" $
+  doc "A value binding" $
+  -- omitted for now: funBind
+  T.union [
+    "simple">:
+      doc "A simple value binding"
+      simpleValueBinding]
+
+simpleValueBinding :: Binding
+simpleValueBinding = define "SimpleValueBinding" $
+  doc "A simple value binding" $
+  T.record [
+    "pattern">:
+      doc "The pattern being bound"
+      pattern,
+    "rhs">:
+      doc "The right-hand side"
+      rightHandSide,
+    "localBindings">:
+      doc "Optional local bindings (where clause)" $
+      T.maybe localBindings]
+
+variable :: Binding
+variable = define "Variable" $
+  doc "A type variable" $
+  -- omitted for now: kind constraints
+  T.wrap name
diff --git a/src/main/haskell/Hydra/Sources/Haskell/Testing.hs b/src/main/haskell/Hydra/Sources/Haskell/Testing.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Haskell/Testing.hs
@@ -0,0 +1,570 @@
+-- | Haskell test code generation codec in Hydra DSL.
+-- This module provides DSL versions of Haskell test codec functions for HSpec-based generation tests.
+
+module Hydra.Sources.Haskell.Testing where
+
+-- Standard imports for term-level sources outside of the kernel
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import           Hydra.Dsl.Meta.Lib.Strings                as Strings
+import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
+import qualified Hydra.Dsl.Annotations                     as Annotations
+import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
+import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
+import qualified Hydra.Dsl.Literals                        as Literals
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
+import qualified Hydra.Dsl.Meta.Base                       as MetaBase
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
+import qualified Hydra.Dsl.Meta.Context                    as Ctx
+import qualified Hydra.Dsl.Meta.Core                       as Core
+import qualified Hydra.Dsl.Errors                     as Error
+import qualified Hydra.Dsl.Meta.Graph                      as Graph
+import qualified Hydra.Dsl.Json.Model                       as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps                   as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math                   as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
+import qualified Hydra.Dsl.Module                     as Module
+import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
+import qualified Hydra.Dsl.Meta.Testing                    as Testing
+import qualified Hydra.Dsl.Topology                   as Topology
+import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
+import qualified Hydra.Dsl.Meta.Variants                   as Variants
+import qualified Hydra.Dsl.Prims                           as Prims
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
+import qualified Hydra.Dsl.Terms                           as Terms
+import qualified Hydra.Dsl.Tests                           as Tests
+import qualified Hydra.Dsl.Types                           as Types
+import qualified Hydra.Sources.Decode.Core                 as DecodeCore
+import qualified Hydra.Sources.Encode.Core                 as EncodeCore
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
+import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
+import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
+import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
+import qualified Hydra.Sources.Kernel.Terms.Checking       as Checking
+import qualified Hydra.Sources.Kernel.Terms.Constants      as Constants
+import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
+import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
+import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
+import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
+import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
+import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
+import qualified Hydra.Sources.Kernel.Terms.Names          as Names
+import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
+import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
+import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
+import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors    as ShowError
+import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
+import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
+import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
+import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
+import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
+import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
+import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
+import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
+import           Prelude hiding ((++))
+import qualified Data.Int                                  as I
+import qualified Data.List                                 as L
+import qualified Data.Map                                  as M
+import qualified Data.Set                                  as S
+import qualified Data.Maybe                                as Y
+
+-- Additional imports
+import qualified Hydra.Ext.Haskell.Syntax as H
+import qualified Hydra.Sources.Haskell.Syntax as HaskellSyntax
+import qualified Hydra.Sources.Haskell.Coder as HaskellCoderSource
+import qualified Hydra.Sources.Haskell.Serde as HaskellSerdeSource
+import qualified Hydra.Sources.Haskell.Utils as HaskellUtilsSource
+import qualified Hydra.Sources.Test.Utils as TestUtils
+import qualified Hydra.Sources.Kernel.Terms.Serialization as SerializationSource
+
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+
+ns :: Namespace
+ns = Namespace "hydra.ext.haskell.testing"
+
+module_ :: Module
+module_ = Module ns elements
+    [Namespace "hydra.ext.haskell.coder", HaskellSerdeSource.ns, HaskellUtilsSource.ns,
+     SerializationSource.ns, TestUtils.ns, Formatting.ns, Names.ns,
+     Inference.ns, Constants.ns, Rewriting.ns, Substitution.ns, Schemas.ns, ShowError.ns, Lexical.ns]
+    (HaskellSyntax.ns:KernelTypes.kernelTypesNamespaces) $
+    Just "Haskell test code generation codec for HSpec-based generation tests"
+  where
+    elements = [
+      toTermDefinition addNamespacesToNamespaces,
+      toTermDefinition buildNamespacesForTestGroup,
+      toTermDefinition buildTestModuleWithCodec,
+      toTermDefinition collectNames,
+      toTermDefinition collectTestCases,
+      toTermDefinition containsTriviallyPolymorphic,
+      toTermDefinition extractEncodedTermVariableNames,
+      toTermDefinition extractTestTerms,
+      toTermDefinition findHaskellImports,
+      toTermDefinition generateHaskellTestFile,
+      toTermDefinition generateTestCaseWithCodec,
+      toTermDefinition generateTestFileWithCodec,
+      toTermDefinition generateTestGroupHierarchy,
+      toTermDefinition generateTypeAnnotationFor,
+      toTermDefinition haskellImportTemplate,
+      toTermDefinition haskellModuleTemplate,
+      toTermDefinition haskellTestCaseTemplate,
+      toTermDefinition haskellTestCodec,
+      toTermDefinition haskellTestGroupTemplate,
+      toTermDefinition indentContinuationLines,
+      toTermDefinition namespaceToModuleName,
+      toTermDefinition termToHaskell,
+      toTermDefinition tryInferTypeOf,
+      toTermDefinition typeToHaskell]
+
+
+-- | Add namespaces from a set of names to existing namespaces
+addNamespacesToNamespaces :: TBinding (Namespaces H.ModuleName -> S.Set Name -> Namespaces H.ModuleName)
+addNamespacesToNamespaces = define "addNamespacesToNamespaces" $
+  doc "Add namespaces from a set of names to existing namespaces" $
+  lambda "ns0" $ lambda "names" $ lets [
+    "newNamespaces">: Sets.fromList (Maybes.cat (Lists.map Names.namespaceOf (Sets.toList (var "names")))),
+    "toModuleName">: lambda "namespace" $
+      wrap H._ModuleName (Formatting.capitalize @@ Lists.last (Strings.splitOn (string ".") (unwrap _Namespace @@ var "namespace"))),
+    "newMappings">: Maps.fromList (Lists.map (lambda "ns_" $ pair (var "ns_") (var "toModuleName" @@ var "ns_")) (Sets.toList (var "newNamespaces")))] $
+    record _Namespaces [
+      _Namespaces_focus>>: project _Namespaces _Namespaces_focus @@ var "ns0",
+      _Namespaces_mapping>>: Maps.union (project _Namespaces _Namespaces_mapping @@ var "ns0") (var "newMappings")]
+
+
+-- | Build namespaces for a test group including encoded term references
+buildNamespacesForTestGroup :: TBinding (Module -> TestGroup -> Graph -> Either String (Namespaces H.ModuleName))
+buildNamespacesForTestGroup = define "buildNamespacesForTestGroup" $
+  doc "Build namespaces for a test group including encoded term references" $
+  lambda "mod" $ lambda "tgroup" $ lambda "graph_" $ lets [
+    "testCases_">: collectTestCases @@ var "tgroup",
+    "testTerms">: Lists.concat (Lists.map extractTestTerms (var "testCases_")),
+    "testBindings">: Lists.map
+      (lambda "term" $
+        record _Binding [
+          _Binding_name>>: wrap _Name (string "_test_"),
+          _Binding_term>>: var "term",
+          _Binding_type>>: nothing])
+      (var "testTerms"),
+    "tempModule">: record _Module [
+      _Module_namespace>>: Module.moduleNamespace (var "mod"),
+      _Module_definitions>>: Lists.map ("b" ~> Module.definitionTerm (Module.termDefinition
+        (Core.bindingName $ var "b") (Core.bindingTerm $ var "b")
+        (Core.bindingType $ var "b")))
+        (var "testBindings"),
+      _Module_termDependencies>>: project _Module _Module_termDependencies @@ var "mod",
+      _Module_typeDependencies>>: project _Module _Module_typeDependencies @@ var "mod",
+      _Module_description>>: project _Module _Module_description @@ var "mod"]] $
+    Eithers.bind
+      (Eithers.bimap
+        (lambda "ic" $ ShowError.error_ @@ Ctx.inContextObject (var "ic"))
+        (lambda "a" $ var "a")
+        (HaskellUtilsSource.namespacesForModule @@ var "tempModule" @@ asTerm Lexical.emptyContext @@ var "graph_"))
+      (lambda "baseNamespaces" $ lets [
+        "encodedNames">: Sets.unions (Lists.map (lambda "t" $ extractEncodedTermVariableNames @@ var "graph_" @@ var "t") (var "testTerms"))] $
+        right (addNamespacesToNamespaces @@ var "baseNamespaces" @@ var "encodedNames"))
+
+
+-- | Build the complete test module using a TestCodec
+buildTestModuleWithCodec :: TBinding (TestCodec -> Module -> TestGroup -> String -> Namespaces H.ModuleName -> String)
+buildTestModuleWithCodec = define "buildTestModuleWithCodec" $
+  doc "Build the complete test module using a TestCodec" $
+  lambda "codec" $ lambda "testModule" $ lambda "testGroup" $ lambda "testBody" $ lambda "namespaces" $ lets [
+    "ns_">: Module.moduleNamespace (var "testModule"),
+    "specNs">: wrap _Namespace (Strings.cat2 (unwrap _Namespace @@ var "ns_") (string "Spec")),
+    "moduleNameString">: project _TestCodec _TestCodec_formatModuleName @@ var "codec" @@ var "specNs",
+    "groupName_">: project _TestGroup _TestGroup_name @@ var "testGroup",
+    "domainImports">: project _TestCodec _TestCodec_findImports @@ var "codec" @@ Sets.empty,
+    "standardImports">: list [
+      string "import Hydra.Kernel",
+      string "import qualified Test.Hspec as H",
+      string "import qualified Data.List as L",
+      string "import qualified Data.Map as M",
+      string "import qualified Data.Set as S",
+      string "import qualified Data.Maybe as Y"],
+    "allImports">: Lists.concat2 (var "standardImports") (var "domainImports"),
+    "debugComments">: list [
+      string "-- DEBUG: Focus namespace = (see generated module)",
+      string "-- DEBUG: Namespace mappings: (see generated module)"],
+    "header">: Strings.intercalate (string "\n") (Lists.concat (list [
+      list [
+        Strings.cat2 (string "-- ") (asTerm Constants.warningAutoGeneratedFile),
+        string ""],
+      var "debugComments",
+      list [
+        string "",
+        Strings.cat (list [string "module ", var "moduleNameString", string " where"]),
+        string ""],
+      var "allImports",
+      list [
+        string "",
+        string "spec :: H.Spec",
+        Strings.cat (list [string "spec = H.describe ", Literals.showString (var "groupName_"), string " $ do"])]]))] $
+    Strings.cat (list [var "header", string "\n", var "testBody", string "\n"])
+
+
+-- | Collect variable names from encoded terms within a single term node
+collectNames :: TBinding (Graph -> S.Set Name -> Term -> S.Set Name)
+collectNames = define "collectNames" $
+  doc "Collect variable names from encoded terms within a single term node" $
+  lambda "graf" $ lambda "names" $ lambda "t" $
+    Logic.ifElse (Schemas.isEncodedTerm @@ (Rewriting.deannotateTerm @@ var "t"))
+      (Eithers.either_
+        (lambda "_" $ var "names")
+        (lambda "decodedTerm" $
+          Sets.union (var "names") (Rewriting.termDependencyNames @@ true @@ true @@ true @@ var "decodedTerm"))
+        (Eithers.bimap
+          (lambda "_e" $ var "_e")
+          (lambda "_a" $ var "_a")
+          (decoderFor _Term @@ var "graf" @@ var "t")))
+      (var "names")
+
+
+-- | Collect all test cases from a test group (recursively)
+collectTestCases :: TBinding (TestGroup -> [TestCaseWithMetadata])
+collectTestCases = define "collectTestCases" $
+  doc "Collect all test cases from a test group recursively" $
+  lambda "tg" $
+    Lists.concat2
+      (project _TestGroup _TestGroup_cases @@ var "tg")
+      (Lists.concat (Lists.map collectTestCases (project _TestGroup _TestGroup_subgroups @@ var "tg")))
+
+
+-- | Check if a term contains any trivially polymorphic sub-terms
+containsTriviallyPolymorphic :: TBinding (Term -> Bool)
+containsTriviallyPolymorphic = define "containsTriviallyPolymorphic" $
+  doc "Check if a term contains any trivially polymorphic sub-terms" $
+  lambda "term" $
+    cases _Term (var "term") (Just false) [
+      _Term_list>>: lambda "xs" $
+        Logic.or (Lists.null (var "xs"))
+          (Lists.foldl (binaryFunction Logic.or) false (Lists.map containsTriviallyPolymorphic (var "xs"))),
+      _Term_set>>: lambda "s" $
+        Logic.or (Sets.null (var "s"))
+          (Lists.foldl (binaryFunction Logic.or) false (Lists.map containsTriviallyPolymorphic (Sets.toList (var "s")))),
+      _Term_map>>: lambda "m" $
+        Logic.or (Maps.null (var "m"))
+          (Logic.or
+            (Lists.foldl (binaryFunction Logic.or) false (Lists.map containsTriviallyPolymorphic (Maps.keys (var "m"))))
+            (Lists.foldl (binaryFunction Logic.or) false (Lists.map containsTriviallyPolymorphic (Lists.map (lambda "p" $ Pairs.second (var "p")) (Maps.toList (var "m")))))),
+      _Term_maybe>>: lambda "mx" $
+        Maybes.maybe true containsTriviallyPolymorphic (var "mx"),
+      _Term_either>>: lambda "_" $ true,
+      _Term_union>>: lambda "inj" $
+        containsTriviallyPolymorphic @@ (project _Field _Field_term @@ (project _Injection _Injection_field @@ var "inj")),
+      _Term_pair>>: lambda "p" $
+        Logic.or
+          (containsTriviallyPolymorphic @@ Pairs.first (var "p"))
+          (containsTriviallyPolymorphic @@ Pairs.second (var "p")),
+      _Term_record>>: lambda "rec" $
+        Lists.foldl (binaryFunction Logic.or) false
+          (Lists.map (lambda "f" $ containsTriviallyPolymorphic @@ (project _Field _Field_term @@ var "f"))
+            (project _Record _Record_fields @@ var "rec")),
+      _Term_application>>: lambda "app" $
+        Logic.or
+          (containsTriviallyPolymorphic @@ (Core.applicationFunction (var "app")))
+          (containsTriviallyPolymorphic @@ (Core.applicationArgument (var "app")))]
+
+
+-- | Extract all variable names from term-encoded terms in a given term
+extractEncodedTermVariableNames :: TBinding (Graph -> Term -> S.Set Name)
+extractEncodedTermVariableNames = define "extractEncodedTermVariableNames" $
+  doc "Extract all variable names from term-encoded terms in a given term" $
+  lambda "graf" $ lambda "term" $
+    Rewriting.foldOverTerm @@ inject _TraversalOrder _TraversalOrder_pre unit @@ (collectNames @@ var "graf") @@ Sets.empty @@ var "term"
+
+
+-- | Extract terms from a test case
+extractTestTerms :: TBinding (TestCaseWithMetadata -> [Term])
+extractTestTerms = define "extractTestTerms" $
+  doc "Extract input and output terms from a test case" $
+  lambda "tcm" $
+    cases _TestCase (project _TestCaseWithMetadata _TestCaseWithMetadata_case @@ var "tcm") (Just (list ([] :: [TTerm Term]))) [
+      _TestCase_delegatedEvaluation>>: lambda "delCase" $
+        list [
+          project _DelegatedEvaluationTestCase _DelegatedEvaluationTestCase_input @@ var "delCase",
+          project _DelegatedEvaluationTestCase _DelegatedEvaluationTestCase_output @@ var "delCase"]]
+
+
+-- | Find necessary imports for Haskell based on referenced names
+findHaskellImports :: TBinding (Namespaces H.ModuleName -> S.Set Name -> [String])
+findHaskellImports = define "findHaskellImports" $
+  doc "Find necessary imports for Haskell based on referenced names" $
+  lambda "namespaces" $ lambda "names_" $ lets [
+    "mapping_">: project _Namespaces _Namespaces_mapping @@ var "namespaces",
+    "filtered">: Maps.filterWithKey
+      (lambda "ns_" $ lambda "_v" $
+        Logic.not (Equality.equal
+          (Lists.head (Strings.splitOn (string "hydra.test.") (unwrap _Namespace @@ var "ns_")))
+          (string "")))
+      (var "mapping_")] $
+    Lists.map
+      (lambda "entry" $ Strings.cat (list [
+        string "import qualified ",
+        Strings.intercalate (string ".") (Lists.map Formatting.capitalize (Strings.splitOn (string ".") (unwrap _Namespace @@ Pairs.first (var "entry")))),
+        string " as ",
+        unwrap H._ModuleName @@ Pairs.second (var "entry")]))
+      (Maps.toList (var "filtered"))
+
+
+-- | Generate a Haskell test file for a test group, with type inference and namespace building
+generateHaskellTestFile :: TBinding (Module -> TestGroup -> Graph -> Either String (String, String))
+generateHaskellTestFile = define "generateHaskellTestFile" $
+  doc "Generate a Haskell test file for a test group, with type inference and namespace building" $
+  lambda "testModule" $ lambda "testGroup" $ lambda "g" $
+    Eithers.bind
+      (buildNamespacesForTestGroup @@ var "testModule" @@ var "testGroup" @@ var "g")
+      (lambda "namespaces" $
+        generateTestFileWithCodec @@ (haskellTestCodec @@ var "namespaces") @@ var "testModule" @@ var "testGroup" @@ var "namespaces" @@ var "g")
+
+
+-- | Generate a single test case using a TestCodec
+generateTestCaseWithCodec :: TBinding (Graph -> Namespaces H.ModuleName -> TestCodec -> Int -> TestCaseWithMetadata -> Either String [String])
+generateTestCaseWithCodec = define "generateTestCaseWithCodec" $
+  doc "Generate a single test case using a TestCodec" $
+  lambda "g" $ lambda "namespaces" $ lambda "codec" $ lambda "depth" $ lambda "tcm" $ lets [
+    "name_">: project _TestCaseWithMetadata _TestCaseWithMetadata_name @@ var "tcm",
+    "tcase">: project _TestCaseWithMetadata _TestCaseWithMetadata_case @@ var "tcm"] $
+    cases _TestCase (var "tcase") (Just (right (list ([] :: [TTerm String])))) [
+      _TestCase_delegatedEvaluation>>: lambda "delCase" $ lets [
+        "input_">: project _DelegatedEvaluationTestCase _DelegatedEvaluationTestCase_input @@ var "delCase",
+        "output_">: project _DelegatedEvaluationTestCase _DelegatedEvaluationTestCase_output @@ var "delCase",
+        "formattedName">: project _TestCodec _TestCodec_formatTestName @@ var "codec" @@ var "name_",
+        "continuationIndent">: Math.add (Math.mul (var "depth") (int32 2)) (int32 4)] $
+        Eithers.bind
+          (project _TestCodec _TestCodec_encodeTerm @@ var "codec" @@ var "input_" @@ var "g")
+          (lambda "inputCode" $
+            Eithers.bind
+              (project _TestCodec _TestCodec_encodeTerm @@ var "codec" @@ var "output_" @@ var "g")
+              (lambda "outputCode" $
+                Eithers.bind
+                  (generateTypeAnnotationFor @@ var "g" @@ var "namespaces" @@ var "input_" @@ var "output_")
+                  (lambda "typeAnnotation" $ lets [
+                    "indentedInputCode">: indentContinuationLines @@ var "continuationIndent" @@ var "inputCode",
+                    "indentedOutputCode">: indentContinuationLines @@ var "continuationIndent" @@ var "outputCode",
+                    "finalOutputCode">: Maybes.maybe (var "indentedOutputCode")
+                      (lambda "anno" $ Strings.cat2 (var "indentedOutputCode") (var "anno"))
+                      (var "typeAnnotation")] $
+                    right (list [
+                      Strings.cat (list [string "H.it ", Literals.showString (var "formattedName"), string " $ H.shouldBe"]),
+                      Strings.cat (list [string "  (", var "indentedInputCode", string ")"]),
+                      Strings.cat (list [string "  (", var "finalOutputCode", string ")"])]))))]
+
+
+-- | Generate a test file using a TestCodec
+generateTestFileWithCodec :: TBinding (TestCodec -> Module -> TestGroup -> Namespaces H.ModuleName -> Graph -> Either String (String, String))
+generateTestFileWithCodec = define "generateTestFileWithCodec" $
+  doc "Generate a complete test file using a TestCodec" $
+  lambda "codec" $ lambda "testModule" $ lambda "testGroup" $ lambda "namespaces" $ lambda "g" $
+    Eithers.map
+      (lambda "testBody" $ lets [
+        "testModuleContent">: buildTestModuleWithCodec @@ var "codec" @@ var "testModule" @@ var "testGroup" @@ var "testBody" @@ var "namespaces",
+        "ext">: unwrap _FileExtension @@ (project _TestCodec _TestCodec_fileExtension @@ var "codec"),
+        "ns_">: Module.moduleNamespace (var "testModule"),
+        "specNs">: wrap _Namespace (Strings.cat2 (unwrap _Namespace @@ var "ns_") (string "Spec")),
+        "filePath">: Names.namespaceToFilePath @@ Util.caseConventionPascal @@ (wrap _FileExtension (var "ext")) @@ var "specNs"] $
+        pair (var "filePath") (var "testModuleContent"))
+      (generateTestGroupHierarchy @@ var "g" @@ var "namespaces" @@ var "codec" @@ int32 1 @@ var "testGroup")
+
+
+-- | Generate test hierarchy preserving the structure with H.describe blocks for subgroups
+generateTestGroupHierarchy :: TBinding (Graph -> Namespaces H.ModuleName -> TestCodec -> Int -> TestGroup -> Either String String)
+generateTestGroupHierarchy = define "generateTestGroupHierarchy" $
+  doc "Generate test hierarchy preserving the structure with H.describe blocks for subgroups" $
+  lambda "g" $ lambda "namespaces" $ lambda "codec" $ lambda "depth" $ lambda "testGroup" $ lets [
+    "cases_">: project _TestGroup _TestGroup_cases @@ var "testGroup",
+    "subgroups">: project _TestGroup _TestGroup_subgroups @@ var "testGroup",
+    "indent">: Strings.fromList (Lists.replicate (Math.mul (var "depth") (int32 2)) (int32 32))] $  -- space char
+    Eithers.bind
+      (Eithers.mapList
+        (lambda "tc" $ generateTestCaseWithCodec @@ var "g" @@ var "namespaces" @@ var "codec" @@ var "depth" @@ var "tc")
+        (var "cases_"))
+      (lambda "testCaseLinesRaw" $ lets [
+        "testCaseLines">: Lists.map
+          (lambda "lines_" $ Lists.map (lambda "line" $ Strings.cat2 (var "indent") (var "line")) (var "lines_"))
+          (var "testCaseLinesRaw"),
+        "testCasesStr">: Strings.intercalate (string "\n") (Lists.concat (var "testCaseLines"))] $
+        Eithers.map
+          (lambda "subgroupsStr" $
+            Strings.cat (list [
+              var "testCasesStr",
+              Logic.ifElse (Logic.or (Equality.equal (var "testCasesStr") (string "")) (Equality.equal (var "subgroupsStr") (string "")))
+                (string "")
+                (string "\n"),
+              var "subgroupsStr"]))
+          (Eithers.map
+            (lambda "blocks" $ Strings.intercalate (string "\n") (var "blocks"))
+            (Eithers.mapList
+              (lambda "subgroup" $ lets [
+                "groupName_">: project _TestGroup _TestGroup_name @@ var "subgroup"] $
+                Eithers.map
+                  (lambda "content" $
+                    Strings.cat (list [
+                      var "indent",
+                      string "H.describe ",
+                      Literals.showString (var "groupName_"),
+                      string " $ do\n",
+                      var "content"]))
+                  (generateTestGroupHierarchy @@ var "g" @@ var "namespaces" @@ var "codec" @@ Math.add (var "depth") (int32 1) @@ var "subgroup"))
+              (var "subgroups"))))
+
+
+-- | Generate a type annotation for polymorphic output values
+generateTypeAnnotationFor :: TBinding (Graph -> Namespaces H.ModuleName -> Term -> Term -> Either String (Maybe String))
+generateTypeAnnotationFor = define "generateTypeAnnotationFor" $
+  doc "Generate a type annotation for polymorphic output values" $
+  lambda "g" $ lambda "namespaces" $ lambda "inputTerm" $ lambda "outputTerm" $
+    Logic.ifElse
+      (Logic.not (containsTriviallyPolymorphic @@ var "outputTerm"))
+      (right nothing)
+      (Maybes.maybe
+        (right nothing)
+        (lambda "result" $ lets [
+          "typeScheme">: Pairs.second (var "result"),
+          "typ">: project _TypeScheme _TypeScheme_type @@ var "typeScheme",
+          "schemaVars">: Sets.fromList (Maps.keys (Graph.graphSchemaTypes (var "g"))),
+          "freeVars">: Sets.toList (Sets.difference (Rewriting.freeVariablesInType @@ var "typ") (var "schemaVars")),
+          "isEither">: cases _Term (Rewriting.deannotateTerm @@ var "outputTerm") (Just false) [
+            _Term_either>>: lambda "_" $ true]] $
+          Logic.ifElse
+            (Logic.or (var "isEither") (Logic.not (Lists.null (var "freeVars"))))
+            (lets [
+              "int32Type">: inject _Type _Type_literal (inject _LiteralType _LiteralType_integer (inject _IntegerType _IntegerType_int32 unit)),
+              "subst">: Typing.typeSubst (Maps.fromList (Lists.map (lambda "v" $ pair (var "v") (var "int32Type")) (var "freeVars"))),
+              "groundedType">: Substitution.substInType @@ var "subst" @@ var "typ"] $
+              Eithers.map
+                (lambda "typeStr" $ just (Strings.cat2 (string " :: ") (var "typeStr")))
+                (typeToHaskell @@ var "namespaces" @@ var "groundedType" @@ var "g"))
+            (right nothing))
+        (tryInferTypeOf @@ var "g" @@ var "inputTerm"))
+
+
+-- | Template for Haskell import statements
+haskellImportTemplate :: TBinding String
+haskellImportTemplate = define "haskellImportTemplate" $
+  doc "Template for Haskell import statements" $
+  string "import qualified {namespace} as {alias}"
+
+
+-- | Template for Haskell test module structure
+haskellModuleTemplate :: TBinding String
+haskellModuleTemplate = define "haskellModuleTemplate" $
+  doc "Template for Haskell test module structure" $
+  Strings.intercalate (string "\n") (list [
+    Strings.cat2 (string "-- ") (asTerm Constants.warningAutoGeneratedFile),
+    string "",
+    string "module {moduleName} where",
+    string "",
+    string "{imports}",
+    string "",
+    string "spec :: H.Spec",
+    string "{testGroup}",
+    string "{testCases}",
+    string ""])
+
+
+-- | Template for HSpec test case assertions
+haskellTestCaseTemplate :: TBinding String
+haskellTestCaseTemplate = define "haskellTestCaseTemplate" $
+  doc "Template for HSpec test case assertions" $
+  Strings.intercalate (string "\n") (list [
+    string "  H.it {name} $ H.shouldBe",
+    string "    ({input})",
+    string "    ({output})",
+    string ""])
+
+
+-- | Create a Haskell TestCodec that uses the real Haskell coder
+haskellTestCodec :: TBinding (Namespaces H.ModuleName -> TestCodec)
+haskellTestCodec = define "haskellTestCodec" $
+  doc "Create a Haskell TestCodec that uses the real Haskell coder" $
+  lambda "namespaces" $
+    record _TestCodec [
+      _TestCodec_language>>: Coders.languageName_ (string "haskell"),
+      _TestCodec_fileExtension>>: wrap _FileExtension (string "hs"),
+      _TestCodec_encodeTerm>>: termToHaskell @@ var "namespaces",
+      _TestCodec_encodeType>>: typeToHaskell @@ var "namespaces",
+      _TestCodec_formatTestName>>: lambda "n" $ var "n",  -- identity
+      _TestCodec_formatModuleName>>: namespaceToModuleName,
+      _TestCodec_testCaseTemplate>>: haskellTestCaseTemplate,
+      _TestCodec_testGroupTemplate>>: haskellTestGroupTemplate,
+      _TestCodec_moduleTemplate>>: haskellModuleTemplate,
+      _TestCodec_importTemplate>>: haskellImportTemplate,
+      _TestCodec_findImports>>: findHaskellImports @@ var "namespaces"]
+
+
+-- | Template for HSpec test group description
+haskellTestGroupTemplate :: TBinding String
+haskellTestGroupTemplate = define "haskellTestGroupTemplate" $
+  doc "Template for HSpec test group description" $
+  string "spec = H.describe {groupName} $ do"
+
+
+-- | Indent continuation lines of a multi-line string
+indentContinuationLines :: TBinding (Int -> String -> String)
+indentContinuationLines = define "indentContinuationLines" $
+  doc "Indent continuation lines of a multi-line string" $
+  lambda "n" $ lambda "s" $
+    Strings.intercalate
+      (Strings.cat2 (string "\n") (Strings.fromList (Lists.replicate (var "n") (int32 32))))
+      (Strings.splitOn (string "\n") (var "s"))
+
+
+-- | Convert namespace to Haskell module name
+namespaceToModuleName :: TBinding (Namespace -> String)
+namespaceToModuleName = define "namespaceToModuleName" $
+  doc "Convert namespace to Haskell module name" $
+  lambda "ns_" $
+    Strings.intercalate (string ".") (Lists.map Formatting.capitalize (Strings.splitOn (string ".") (unwrap _Namespace @@ var "ns_")))
+
+
+-- | Convert a Hydra term to a Haskell expression string
+termToHaskell :: TBinding (Namespaces H.ModuleName -> Term -> Graph -> Either String String)
+termToHaskell = define "termToHaskell" $
+  doc "Convert a Hydra term to a Haskell expression string" $
+  lambda "namespaces" $ lambda "term" $ lambda "g" $
+    Eithers.bimap
+      ("ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic"))
+      (Serialization.printExpr <.> Serialization.parenthesize <.> HaskellSerdeSource.expressionToExpr)
+      (HaskellCoderSource.encodeTerm @@ int32 0 @@ var "namespaces" @@ var "term" @@ asTerm Lexical.emptyContext @@ var "g")
+
+
+-- | Try to infer the type of a term, returning Nothing if inference fails
+tryInferTypeOf :: TBinding (Graph -> Term -> Maybe (Term, TypeScheme))
+tryInferTypeOf = define "tryInferTypeOf" $
+  doc "Try to infer the type of a term, returning Nothing if inference fails" $
+  lambda "g" $ lambda "term" $
+    Eithers.either_
+      (lambda "_" $ nothing)
+      (lambda "result" $ just (Pairs.first (var "result")))
+      (Inference.inferTypeOf @@ asTerm Lexical.emptyContext @@ var "g" @@ var "term")
+
+
+-- | Convert a Hydra type to a Haskell type expression string
+typeToHaskell :: TBinding (Namespaces H.ModuleName -> Type -> Graph -> Either String String)
+typeToHaskell = define "typeToHaskell" $
+  doc "Convert a Hydra type to a Haskell type expression string" $
+  lambda "namespaces" $ lambda "typ" $ lambda "g" $
+    Eithers.bimap
+      ("ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic"))
+      (Serialization.printExpr <.> Serialization.parenthesize <.> HaskellSerdeSource.typeToExpr)
+      (HaskellCoderSource.encodeType @@ var "namespaces" @@ var "typ" @@ asTerm Lexical.emptyContext @@ var "g")
diff --git a/src/main/haskell/Hydra/Sources/Haskell/Utils.hs b/src/main/haskell/Hydra/Sources/Haskell/Utils.hs
--- a/src/main/haskell/Hydra/Sources/Haskell/Utils.hs
+++ b/src/main/haskell/Hydra/Sources/Haskell/Utils.hs
@@ -7,22 +7,20 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
+import qualified Hydra.Dsl.Errors                     as Error
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -31,26 +29,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -59,26 +53,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -90,8 +81,8 @@
 import qualified Data.Maybe                                as Y
 
 -- Additional imports
-import qualified Hydra.Ext.Haskell.Ast as H
-import qualified Hydra.Sources.Haskell.Ast as HaskellAst
+import qualified Hydra.Ext.Haskell.Syntax as H
+import qualified Hydra.Sources.Haskell.Syntax as HaskellSyntax
 import qualified Hydra.Sources.Haskell.Language as HaskellLanguage
 import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
 
@@ -107,27 +98,27 @@
 module_ :: Module
 module_ = Module ns elements
     [Formatting.ns, HaskellLanguage.ns, Schemas.ns, Names.ns]
-    (HaskellAst.ns:KernelTypes.kernelTypesNamespaces) $
+    (HaskellSyntax.ns:KernelTypes.kernelTypesNamespaces) $
     Just "Utilities for working with Haskell syntax trees"
   where
     elements = [
-      toBinding applicationPattern,
-      toBinding elementReference,
-      toBinding hsapp,
-      toBinding hslambda,
-      toBinding hslit,
-      toBinding hsvar,
-      toBinding namespacesForModule,
-      toBinding newtypeAccessorName,
-      toBinding rawName,
-      toBinding recordFieldReference,
-      toBinding sanitizeHaskellName,
-      toBinding simpleName,
-      toBinding simpleValueBinding,
-      toBinding toTypeApplication,
-      toBinding typeNameForRecord,
-      toBinding unionFieldReference,
-      toBinding unpackForallType]
+      toTermDefinition applicationPattern,
+      toTermDefinition elementReference,
+      toTermDefinition hsapp,
+      toTermDefinition hslambda,
+      toTermDefinition hslit,
+      toTermDefinition hsvar,
+      toTermDefinition namespacesForModule,
+      toTermDefinition newtypeAccessorName,
+      toTermDefinition rawName,
+      toTermDefinition recordFieldReference,
+      toTermDefinition sanitizeHaskellName,
+      toTermDefinition simpleName,
+      toTermDefinition simpleValueBinding,
+      toTermDefinition toTypeApplication,
+      toTermDefinition typeNameForRecord,
+      toTermDefinition unionFieldReference,
+      toTermDefinition unpackForallType]
 
 applicationPattern :: TBinding (H.Name -> [H.Pattern] -> H.Pattern)
 applicationPattern = haskellUtilsDefinition "applicationPattern" $
@@ -194,11 +185,11 @@
   "s" ~>
     inject H._Expression H._Expression_variable $ (rawName @@ var "s")
 
-namespacesForModule :: TBinding (Module -> Flow Graph HaskellNamespaces)
+namespacesForModule :: TBinding (Module -> Context -> Graph -> Either (InContext Error) HaskellNamespaces)
 namespacesForModule = haskellUtilsDefinition "namespacesForModule" $
   doc "Compute the Haskell module namespaces for a Hydra module" $
-  "mod" ~>
-    "nss" <<~ Schemas.moduleDependencyNamespaces @@ true @@ true @@ true @@ true @@ var "mod" $
+  "mod" ~> "cx" ~> "g" ~>
+    "nss" <<~ Schemas.moduleDependencyNamespaces @@ var "cx" @@ var "g" @@ true @@ true @@ true @@ true @@ var "mod" $
     "ns" <~ (Module.moduleNamespace $ var "mod") $
     "toModuleName" <~ ("namespace" ~> lets [
       "namespaceStr">: unwrap _Namespace @@ var "namespace",
@@ -223,7 +214,7 @@
     "emptyState" <~ (pair Maps.empty Sets.empty) $
     "finalState" <~ (Lists.foldl (var "addPair") (var "emptyState") (var "nssPairs")) $
     "resultMap" <~ (Pairs.first $ var "finalState") $
-    Flows.pure $ Module.namespaces (var "focusPair") (var "resultMap")
+    right $ Module.namespaces (var "focusPair") (var "resultMap")
 
 newtypeAccessorName :: TBinding (Name -> String)
 newtypeAccessorName = haskellUtilsDefinition "newtypeAccessorName" $
@@ -302,10 +293,10 @@
     "parts">: Strings.splitOn (string ".") (var "snameStr")] $
     Lists.last $ var "parts"
 
-unionFieldReference :: TBinding (Graph -> HaskellNamespaces -> Name -> Name -> H.Name)
+unionFieldReference :: TBinding (S.Set Name -> HaskellNamespaces -> Name -> Name -> H.Name)
 unionFieldReference = haskellUtilsDefinition "unionFieldReference" $
   doc "Generate a Haskell name for a union variant constructor, with disambiguation" $
-  "g" ~> "namespaces" ~> "sname" ~> "fname" ~> lets [
+  "boundNames" ~> "namespaces" ~> "sname" ~> "fname" ~> lets [
     "fnameStr">: unwrap _Name @@ var "fname",
     "qname">: Names.qualifyName @@ var "sname",
     "ns">: Module.qualifiedNameNamespace $ var "qname",
@@ -316,7 +307,7 @@
       "tname">: Names.unqualifyName @@ record _QualifiedName [
         _QualifiedName_namespace>>: var "ns",
         _QualifiedName_local>>: var "name"]] $
-      Logic.ifElse (Maybes.isJust $ Lists.find ("b" ~> Equality.equal (Core.bindingName (var "b")) (var "tname")) (Graph.graphElements $ var "g"))
+      Logic.ifElse (Sets.member (var "tname") (var "boundNames"))
         (var "deconflict" @@ Strings.cat2 (var "name") (string "_"))
         (var "name"),
     "nm">: var "deconflict" @@ Strings.cat2 (var "capitalizedTypeName") (var "capitalizedFieldName"),
@@ -326,15 +317,15 @@
     "unqualName">: Names.unqualifyName @@ var "qualName"] $
     elementReference @@ var "namespaces" @@ var "unqualName"
 
-unpackForallType :: TBinding (Graph -> Type -> ([Name], Type))
+unpackForallType :: TBinding (Type -> ([Name], Type))
 unpackForallType = haskellUtilsDefinition "unpackForallType" $
   doc "Unpack nested forall types into a list of type variables and the inner type" $
-  "cx" ~> "t" ~> cases _Type (Rewriting.deannotateType @@ var "t")
+  "t" ~> cases _Type (Rewriting.deannotateType @@ var "t")
     (Just $ pair (list ([] :: [TTerm Name])) (var "t")) [
     _Type_forall>>: "fat" ~> lets [
       "v">: Core.forallTypeParameter $ var "fat",
       "tbody">: Core.forallTypeBody $ var "fat",
-      "recursiveResult">: unpackForallType @@ var "cx" @@ var "tbody",
+      "recursiveResult">: unpackForallType @@ var "tbody",
       "vars">: Pairs.first $ var "recursiveResult",
       "finalType">: Pairs.second $ var "recursiveResult"] $
       pair (Lists.cons (var "v") (var "vars")) (var "finalType")]
diff --git a/src/main/haskell/Hydra/Sources/Json/Bootstrap.hs b/src/main/haskell/Hydra/Sources/Json/Bootstrap.hs
--- a/src/main/haskell/Hydra/Sources/Json/Bootstrap.hs
+++ b/src/main/haskell/Hydra/Sources/Json/Bootstrap.hs
@@ -1,8 +1,9 @@
 -- | A module which provides a minimal typing environment for decoding other Modules from JSON.
 --
 -- This module contains a single binding, typesByName, which maps type Names to Types
--- for all types defined in the four kernel modules needed to decode the Module type:
--- hydra.core, hydra.compute, hydra.graph, and hydra.module.
+-- for all types defined in the kernel modules needed to decode the Module type
+-- and to provide schema types for inference tests:
+-- hydra.coders, hydra.context, hydra.core, hydra.error, hydra.graph, hydra.module, and hydra.util.
 --
 -- By consolidating these types into a single map, we avoid the need to generate
 -- individual Source modules for each kernel type module (which can exceed the JVM's
@@ -13,10 +14,13 @@
 -- Note: non-standard imports; this module is constructed dynamically from other modules.
 import Hydra.Kernel
 import qualified Hydra.Encode.Core as EncodeCore
+import qualified Hydra.Sources.Kernel.Types.Coders as Coders
+import qualified Hydra.Sources.Kernel.Types.Context as Context
 import qualified Hydra.Sources.Kernel.Types.Core as Core
-import qualified Hydra.Sources.Kernel.Types.Compute as Compute
+import qualified Hydra.Sources.Kernel.Types.Errors as Error
 import qualified Hydra.Sources.Kernel.Types.Graph as Graph
 import qualified Hydra.Sources.Kernel.Types.Module as Module
+import qualified Hydra.Sources.Kernel.Types.Util as Util
 
 import qualified Data.Map as M
 
@@ -24,16 +28,20 @@
 ns :: Namespace
 ns = Namespace "hydra.json.bootstrap"
 
--- | The four kernel type modules whose types are needed to decode Module from JSON.
+-- | The kernel type modules whose types are needed to decode Module from JSON
+-- and to provide schema types for inference tests.
 bootstrapTypeModules :: [Module]
 bootstrapTypeModules = [
+  Coders.module_,
+  Context.module_,
   Core.module_,
-  Compute.module_,
+  Error.module_,
   Graph.module_,
-  Module.module_]
+  Module.module_,
+  Util.module_]
 
 module_ :: Module
-module_ = Module ns [typesByNameBinding] [] [Namespace "hydra.core"] $
+module_ = Module ns [bindingToDefinition typesByNameBinding] [] [Namespace "hydra.core"] $
     Just ("A module which provides a minimal typing environment for decoding other modules from JSON."
       ++ " This avoids certain problems with generating entire source modules into target languages like Java,"
       ++ " which is subject to method size limits for large modules like hydra.core.")
@@ -51,5 +59,5 @@
 typesByNameTerm = TermMap $ M.fromList entries
   where
     entries = concatMap moduleEntries bootstrapTypeModules
-    moduleEntries mod = fmap bindingEntry (moduleElements mod)
+    moduleEntries mod = fmap bindingEntry (moduleBindings mod)
     bindingEntry b = (EncodeCore.name (bindingName b), bindingTerm b)
diff --git a/src/main/haskell/Hydra/Sources/Json/Coder.hs b/src/main/haskell/Hydra/Sources/Json/Coder.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Json/Coder.hs
+++ /dev/null
@@ -1,508 +0,0 @@
-
-module Hydra.Sources.Json.Coder where
-
--- Standard imports for term-level sources outside of the kernel
-import Hydra.Kernel
-import Hydra.Sources.Libraries
-import           Hydra.Dsl.Meta.Lib.Strings                as Strings
-import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
-import qualified Hydra.Dsl.Annotations                     as Annotations
-import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
-import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
-import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
-import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
-import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
-import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps                   as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math                   as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
-import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
-import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
-import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
-import qualified Hydra.Dsl.Meta.Variants                   as Variants
-import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
-import qualified Hydra.Dsl.Terms                           as Terms
-import qualified Hydra.Dsl.Tests                           as Tests
-import qualified Hydra.Dsl.Types                           as Types
-import qualified Hydra.Sources.Decode.Core                 as DecodeCore
-import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
-import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
-import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
-import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
-import qualified Hydra.Sources.Kernel.Terms.Checking       as Checking
-import qualified Hydra.Sources.Kernel.Terms.Constants      as Constants
-import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
-import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
-import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
-import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
-import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
-import qualified Hydra.Sources.Kernel.Terms.Names          as Names
-import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
-import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
-import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
-import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
-import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
-import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
-import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
-import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
-import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
-import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
-import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
-import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
-import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
-import           Prelude hiding ((++))
-import qualified Data.Int                                  as I
-import qualified Data.List                                 as L
-import qualified Data.Map                                  as M
-import qualified Data.Set                                  as S
-import qualified Data.Maybe                                as Y
-
--- Additional imports
-import Hydra.Json.Model
-import qualified Hydra.Sources.Json.Language as JsonLanguage
-import qualified Hydra.Sources.Kernel.Terms.Literals as HydraLiterals
-
-
-ns :: Namespace
-ns = Namespace "hydra.ext.org.json.coder"
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInNamespace ns
-
-module_ :: Module
-module_ = Module ns elements
-    [AdaptModules.ns, AdaptTerms.ns, AdaptUtils.ns, moduleNamespace EncodeCore.module_,
-     ExtractCore.ns, HydraLiterals.ns, JsonLanguage.ns, Monads.ns, Rewriting.ns]
-    KernelTypes.kernelTypesNamespaces $
-    Just "JSON encoding and decoding for Hydra terms"
-  where
-    elements = [
-      toBinding jsonCoder,
-      toBinding literalJsonCoder,
-      toBinding recordCoder,
-      toBinding encodeRecord,
-      toBinding decodeRecord,
-      toBinding termCoder,
-      toBinding unitCoder,
-      toBinding untypedTermToJson,
-      toBinding readStringStub,
-      toBinding showValue]
-
-jsonCoder :: TBinding (Type -> Flow Graph (Coder Graph Graph Term Value))
-jsonCoder = define "jsonCoder" $
-  doc "Create a JSON coder for a given type" $
-  "typ" ~>
-  "adapter" <<~ AdaptModules.languageAdapter @@ JsonLanguage.jsonLanguage @@ var "typ" $
-  "coder" <<~ termCoder @@ (Compute.adapterTarget $ var "adapter") $
-  produce $ AdaptUtils.composeCoders @@ (Compute.adapterCoder $ var "adapter") @@ var "coder"
-
-literalJsonCoder :: TBinding (LiteralType -> Flow Graph (Coder Graph Graph Literal Value))
-literalJsonCoder = define "literalJsonCoder" $
-  doc "Create a JSON coder for literal types" $
-  "lt" ~>
-  -- Define decoder functions that contain match expressions
-  "decodeBool" <~ ("s" ~>
-    cases _Value (var "s")
-      (Just $ Monads.unexpected @@ string "boolean" @@ (showValue @@ var "s")) [
-      _Value_boolean>>: "b" ~> produce $ Core.literalBoolean $ var "b"]) $
-  "decodeFloat" <~ ("s" ~>
-    cases _Value (var "s")
-      (Just $ Monads.unexpected @@ string "number" @@ (showValue @@ var "s")) [
-      _Value_number>>: "f" ~> produce $ Core.literalFloat $ Core.floatValueBigfloat $ var "f"]) $
-  "decodeInteger" <~ ("s" ~>
-    cases _Value (var "s")
-      (Just $ Monads.unexpected @@ string "number" @@ (showValue @@ var "s")) [
-      _Value_number>>: "f" ~>
-        "bi" <~ (Literals.bigfloatToBigint $ var "f") $
-        produce $ Core.literalInteger $ Core.integerValueBigint $ var "bi"]) $
-  "decodeString" <~ ("s" ~>
-    cases _Value (var "s")
-      (Just $ Monads.unexpected @@ string "string" @@ (showValue @@ var "s")) [
-      _Value_string>>: "s'" ~> produce $ Core.literalString $ var "s'"]) $
-  "encoded" <~ (cases _LiteralType (var "lt") Nothing [
-    _LiteralType_boolean>>: constant $ Compute.coder
-      ("lit" ~>
-        "b" <<~ ExtractCore.booleanLiteral @@ var "lit" $
-        produce $ Json.valueBoolean $ var "b")
-      (var "decodeBool"),
-    _LiteralType_float>>: constant $ Compute.coder
-      ("lit" ~>
-        "f" <<~ ExtractCore.floatLiteral @@ var "lit" $
-        "bf" <<~ ExtractCore.bigfloatValue @@ var "f" $
-        produce $ Json.valueNumber $ var "bf")
-      (var "decodeFloat"),
-    _LiteralType_integer>>: constant $ Compute.coder
-      ("lit" ~>
-        "i" <<~ ExtractCore.integerLiteral @@ var "lit" $
-        "bi" <<~ ExtractCore.bigintValue @@ var "i" $
-        produce $ Json.valueNumber $ Literals.bigintToBigfloat $ var "bi")
-      (var "decodeInteger"),
-    _LiteralType_string>>: constant $ Compute.coder
-      ("lit" ~>
-        "s" <<~ ExtractCore.stringLiteral @@ var "lit" $
-        produce $ Json.valueString $ var "s")
-      (var "decodeString")]) $
-  produce $ var "encoded"
-
-recordCoder :: TBinding (RowType -> Flow Graph (Coder Graph Graph Term Value))
-recordCoder = define "recordCoder" $
-  doc "Create a JSON coder for record types" $
-  "rt" ~>
-  "fields" <~ (Core.rowTypeFields $ var "rt") $
-  "getCoder" <~ ("f" ~>
-    "coder" <<~ termCoder @@ (Core.fieldTypeType $ var "f") $
-    produce $ pair (var "f") (var "coder")) $
-  "coders" <<~ Flows.mapList (var "getCoder") (var "fields") $
-  produce $ Compute.coder (encodeRecord @@ var "coders") (decodeRecord @@ var "rt" @@ var "coders")
-
-encodeRecord :: TBinding ([(FieldType, Coder Graph Graph Term Value)] -> Term -> Flow Graph Value)
-encodeRecord = define "encodeRecord" $
-  doc "Encode a record term to JSON" $
-  "coders" ~> "term" ~>
-  "stripped" <~ (Rewriting.deannotateTerm @@ var "term") $
-  -- Lift case expressions out of the encodeField lambda
-  "matchMaybeTerm" <~ ("fvalue" ~> "coder'" ~> "fname" ~> "dflt" ~>
-    cases _Term (var "fvalue")
-      (Just $ var "dflt") [
-      _Term_maybe>>: "opt" ~> optCases (var "opt")
-        (produce nothing)
-        ("v" ~>
-          "encoded" <<~ Compute.coderEncode (var "coder'") @@ var "v" $
-          produce $ just $ pair (Core.unName $ var "fname") (var "encoded"))]) $
-  "matchTypeForMaybe" <~ ("ft" ~> "forMaybe" ~> "dflt" ~>
-    cases _Type (Core.fieldTypeType $ var "ft")
-      (Just $ var "dflt") [
-      _Type_maybe>>: "ot" ~> var "forMaybe" @@ var "ot"]) $
-  "encodeField" <~ ("coderAndField" ~>
-    "coder" <~ (Pairs.first $ var "coderAndField") $
-    "field" <~ (Pairs.second $ var "coderAndField") $
-    "ft" <~ (Pairs.first $ var "coder") $
-    "coder'" <~ (Pairs.second $ var "coder") $
-    "fname" <~ (Core.fieldName $ var "field") $
-    "fvalue" <~ (Core.fieldTerm $ var "field") $
-    "forMaybe" <~ ("ot" ~>
-      "dflt" <~ (
-        "encoded" <<~ Compute.coderEncode (var "coder'") @@ var "fvalue" $
-        produce $ just $ pair (Core.unName $ var "fname") (var "encoded")) $
-      var "matchMaybeTerm" @@ var "fvalue" @@ var "coder'" @@ var "fname" @@ var "dflt") $
-    "dflt" <~ (
-      "encoded" <<~ Compute.coderEncode (var "coder'") @@ var "fvalue" $
-      produce $ just $ pair (Core.unName $ var "fname") (var "encoded")) $
-    var "matchTypeForMaybe" @@ var "ft" @@ var "forMaybe" @@ var "dflt") $
-  "record" <<~ ExtractCore.termRecord @@ var "stripped" $
-  "fields" <~ (Core.recordFields $ var "record") $
-  "maybeFields" <<~ Flows.mapList (var "encodeField") (Lists.zip (var "coders") (var "fields")) $
-  produce $ Json.valueObject $ Maps.fromList $ Maybes.cat $ var "maybeFields"
-
-decodeRecord :: TBinding (RowType -> [(FieldType, Coder Graph Graph Term Value)] -> Value -> Flow Graph Term)
-decodeRecord = define "decodeRecord" $
-  doc "Decode a JSON value to a record term" $
-  "rt" ~> "coders" ~> "n" ~>
-  -- Lift the object decoder body into a separate function to avoid lambdas with let-bindings inside cases
-  "decodeObjectBody" <~ ("m" ~>
-    "decodeField" <~ ("coder" ~>
-      "ft" <~ (Pairs.first $ var "coder") $
-      "coder'" <~ (Pairs.second $ var "coder") $
-      "fname" <~ (Core.fieldTypeName $ var "ft") $
-      "defaultValue" <~ Json.valueNull $
-      "jsonValue" <~ (Maybes.fromMaybe (var "defaultValue") $ Maps.lookup (Core.unName $ var "fname") (var "m")) $
-      "v" <<~ Compute.coderDecode (var "coder'") @@ var "jsonValue" $
-      produce $ Core.field (var "fname") (var "v")) $
-    "fields" <<~ Flows.mapList (var "decodeField") (var "coders") $
-    produce $ Core.termRecord $ Core.record (Core.rowTypeTypeName $ var "rt") (var "fields")) $
-  "result" <~ (cases _Value (var "n")
-    (Just $ Monads.unexpected @@ string "object" @@ (showValue @@ var "n")) [
-    _Value_object>>: var "decodeObjectBody"]) $
-  var "result"
-
-termCoder :: TBinding (Type -> Flow Graph (Coder Graph Graph Term Value))
-termCoder = define "termCoder" $
-  doc "Create a JSON coder for term types" $
-  "typ" ~>
-  "stripped" <~ (Rewriting.deannotateType @@ var "typ") $
-  -- Lift encoder/decoder functions that contain match expressions
-  "encodeLiteral" <~ ("ac" ~> "term" ~>
-    cases _Term (var "term")
-      (Just $ Monads.unexpected @@ string "literal term" @@ (ShowCore.term @@ var "term")) [
-      _Term_literal>>: "av" ~> Compute.coderEncode (var "ac") @@ var "av"]) $
-  "encodeList" <~ ("lc" ~> "term" ~>
-    cases _Term (var "term")
-      (Just $ Monads.unexpected @@ string "list term" @@ (ShowCore.term @@ var "term")) [
-      _Term_list>>: "els" ~>
-        "encodedEls" <<~ Flows.mapList (Compute.coderEncode $ var "lc") (var "els") $
-        produce $ Json.valueArray $ var "encodedEls"]) $
-  "decodeList" <~ ("lc" ~> "n" ~>
-    cases _Value (var "n")
-      (Just $ Monads.unexpected @@ string "sequence" @@ (showValue @@ var "n")) [
-      _Value_array>>: "nodes" ~>
-        "decodedNodes" <<~ Flows.mapList (Compute.coderDecode $ var "lc") (var "nodes") $
-        produce $ Core.termList $ var "decodedNodes"]) $
-  "matchLiteralString" <~ ("v" ~> "lit" ~>
-    cases _Literal (var "lit")
-      (Just $ ShowCore.term @@ var "v") [
-      _Literal_string>>: "s" ~> var "s"]) $
-  "matchTermLiteral" <~ ("v" ~>
-    cases _Term (Rewriting.deannotateTerm @@ var "v")
-      (Just $ ShowCore.term @@ var "v") [
-      _Term_literal>>: "lit" ~> var "matchLiteralString" @@ var "v" @@ var "lit"]) $
-  "encodeMap" <~ ("encodeEntry" ~> "term" ~>
-    cases _Term (var "term")
-      (Just $ Monads.unexpected @@ string "map term" @@ (ShowCore.term @@ var "term")) [
-      _Term_map>>: "m" ~>
-        "entries" <<~ Flows.mapList (var "encodeEntry") (Maps.toList $ var "m") $
-        produce $ Json.valueObject $ Maps.fromList $ var "entries"]) $
-  "decodeMap" <~ ("decodeEntry" ~> "n" ~>
-    cases _Value (var "n")
-      (Just $ Monads.unexpected @@ string "mapping" @@ (showValue @@ var "n")) [
-      _Value_object>>: "m" ~>
-        "entries" <<~ Flows.mapList (var "decodeEntry") (Maps.toList $ var "m") $
-        produce $ Core.termMap $ Maps.fromList $ var "entries"]) $
-  "encodeMaybe" <~ ("maybeElementCoder" ~> "maybeTerm" ~>
-    "strippedMaybeTerm" <~ (Rewriting.deannotateTerm @@ var "maybeTerm") $
-    cases _Term (var "strippedMaybeTerm")
-      (Just $ Monads.unexpected @@ string "optional term" @@ (ShowCore.term @@ var "maybeTerm")) [
-      _Term_maybe>>: "maybeContents" ~>
-        Logic.ifElse (Maybes.isNothing $ var "maybeContents")
-          (produce Json.valueNull)
-          ("encodedInner" <<~ Compute.coderEncode (var "maybeElementCoder") @@ (Maybes.fromJust $ var "maybeContents") $
-            produce $ var "encodedInner")]) $
-  "decodeMaybe" <~ ("maybeElementCoder" ~> "jsonVal" ~>
-    cases _Value (var "jsonVal")
-      (Just $
-        "decodedInner" <<~ Compute.coderDecode (var "maybeElementCoder") @@ var "jsonVal" $
-        produce $ Core.termMaybe $ just $ var "decodedInner") [
-      _Value_null>>: constant $ produce $ Core.termMaybe nothing]) $
-  "result" <~ (cases _Type (var "stripped")
-    (Just $ Flows.fail $ Strings.cat $ list [
-      string "unsupported type in JSON: ",
-      ShowCore.type_ @@ var "typ"]) [
-    _Type_literal>>: "at" ~>
-      "ac" <<~ literalJsonCoder @@ var "at" $
-      produce $ Compute.coder
-        (var "encodeLiteral" @@ var "ac")
-        ("n" ~>
-          "lit" <<~ Compute.coderDecode (var "ac") @@ var "n" $
-          produce $ Core.termLiteral $ var "lit"),
-    _Type_list>>: "lt" ~>
-      "lc" <<~ termCoder @@ var "lt" $
-      produce $ Compute.coder
-        (var "encodeList" @@ var "lc")
-        (var "decodeList" @@ var "lc"),
-    _Type_map>>: "mt" ~>
-      "kt" <~ (Core.mapTypeKeys $ var "mt") $
-      "vt" <~ (Core.mapTypeValues $ var "mt") $
-      "kc" <<~ termCoder @@ var "kt" $
-      "vc" <<~ termCoder @@ var "vt" $
-      "cx" <<~ Monads.getState $
-      "isStringKey" <~ Equality.equal (Rewriting.deannotateType @@ var "kt") (Core.typeLiteral Core.literalTypeString) $
-      "toString" <~ ("v" ~>
-        Logic.ifElse (var "isStringKey")
-          (var "matchTermLiteral" @@ var "v")
-          (ShowCore.term @@ var "v")) $
-      "fromString" <~ ("s" ~> Logic.ifElse (var "isStringKey")
-        (Core.termLiteral $ Core.literalString $ var "s")
-        (readStringStub @@ var "s")) $
-      "encodeEntry" <~ ("kv" ~>
-        "k" <~ (Pairs.first $ var "kv") $
-        "v" <~ (Pairs.second $ var "kv") $
-        "encodedV" <<~ Compute.coderEncode (var "vc") @@ var "v" $
-        produce $ pair (var "toString" @@ var "k") (var "encodedV")) $
-      "decodeEntry" <~ ("kv" ~>
-        "k" <~ (Pairs.first $ var "kv") $
-        "v" <~ (Pairs.second $ var "kv") $
-        "decodedV" <<~ Compute.coderDecode (var "vc") @@ var "v" $
-        produce $ pair (var "fromString" @@ var "k") (var "decodedV")) $
-      produce $ Compute.coder
-        (var "encodeMap" @@ var "encodeEntry")
-        (var "decodeMap" @@ var "decodeEntry"),
-    _Type_maybe>>: "maybeElementType" ~>
-      "maybeElementCoder" <<~ termCoder @@ var "maybeElementType" $
-      produce $ Compute.coder
-        (var "encodeMaybe" @@ var "maybeElementCoder")
-        (var "decodeMaybe" @@ var "maybeElementCoder"),
-    _Type_record>>: "rt" ~> recordCoder @@ var "rt",
-    _Type_unit>>: constant $ produce $ unitCoder,
-    _Type_variable>>: "name" ~> produce $ Compute.coder
-      ("term" ~> produce $ Json.valueString $ Strings.cat $ list [
-        string "variable '",
-        Core.unName $ var "name",
-        string "' for: ",
-        ShowCore.term @@ var "term"])
-      ("term" ~> Flows.fail $ Strings.cat $ list [
-        string "type variable ",
-        Core.unName $ var "name",
-        string " does not support decoding"])]) $
-  var "result"
-
-unitCoder :: TBinding (Coder Graph Graph Term Value)
-unitCoder = define "unitCoder" $
-  doc "JSON coder for unit values" $
-  -- Lift encoder/decoder functions that contain match expressions
-  "encodeUnit" <~ ("term" ~>
-    cases _Term (Rewriting.deannotateTerm @@ var "term")
-      (Just $ Monads.unexpected @@ string "unit" @@ (ShowCore.term @@ var "term")) [
-      _Term_unit>>: constant $ produce Json.valueNull]) $
-  "decodeUnit" <~ ("n" ~>
-    cases _Value (var "n")
-      (Just $ Monads.unexpected @@ string "null" @@ (showValue @@ var "n")) [
-      _Value_null>>: constant $ produce Core.termUnit]) $
-  Compute.coder (var "encodeUnit") (var "decodeUnit")
-
-untypedTermToJson :: TBinding (Term -> Flow s Value)
-untypedTermToJson = define "untypedTermToJson" $
-  doc "A simplistic, unidirectional encoding for terms as JSON values. Not type-aware; best used for human consumption." $
-  "term" ~>
-  "unexp" <~ ("msg" ~> produce $ Json.valueString $ Strings.cat2 (string "FAIL: ") (var "msg")) $
-  "asRecord" <~ ("fields" ~> untypedTermToJson @@ (Core.termRecord $ Core.record (Core.name $ string "") (var "fields"))) $
-  "asVariant" <~ ("name" ~> "term" ~> untypedTermToJson @@
-    (Core.termUnion $ Core.injection (Core.name $ string "") $ Core.field (Core.name $ var "name") (var "term"))) $
-  -- Lift case expressions out of nested lambdas
-  "matchTermMaybe" <~ ("forTerm" ~> "t" ~>
-    cases _Term (var "t")
-      (Just $ Flows.map (unaryFunction just) $ untypedTermToJson @@ var "t") [
-      _Term_maybe>>: "mt" ~> Maybes.maybe
-        (produce nothing)
-        (var "forTerm")
-        (var "mt")]) $
-  "matchElimination" <~ ("unexp" ~> "asVariant" ~> "elm" ~>
-    cases _Elimination (var "elm")
-      (Just $ var "unexp" @@ (Strings.cat $ list [
-        string "unexpected elimination variant: ",
-        ShowCore.elimination @@ var "elm"])) [
-      _Elimination_record>>: "proj" ~> var "asVariant" @@ string "project" @@
-        (Core.termVariable $ Core.projectionField $ var "proj")]) $
-  "matchFunction" <~ ("unexp" ~> "asRecord" ~> "asVariant" ~> "f" ~>
-    cases _Function (var "f") Nothing [
-      _Function_elimination>>: "elm" ~>
-        var "matchElimination" @@ var "unexp" @@ var "asVariant" @@ var "elm",
-      _Function_lambda>>: "l" ~> var "asRecord" @@ list [
-        Core.field (Core.name $ string "parameter") (Core.termVariable $ Core.lambdaParameter $ var "l"),
-        Core.field (Core.name $ string "domain") (Core.termMaybe $
-          Maybes.map (encoderFor _Type) (Core.lambdaDomain $ var "l")),
-        Core.field (Core.name $ string "body") (Core.lambdaBody $ var "l")],
-      _Function_primitive>>: "name" ~> produce $ Json.valueString $ Core.unName $ var "name"]) $
-  "matchLiteral" <~ ("lit" ~>
-    cases _Literal (var "lit") Nothing [
-      _Literal_binary>>: "b" ~> Json.valueString $ Literals.binaryToString $ var "b",
-      _Literal_boolean>>: "b" ~> Json.valueBoolean $ var "b",
-      _Literal_float>>: "f" ~> Json.valueNumber $ HydraLiterals.floatValueToBigfloat @@ var "f",
-      _Literal_integer>>: "i" ~>
-        "bf" <~ (HydraLiterals.integerValueToBigint @@ var "i") $
-        "f" <~ (Literals.bigintToBigfloat $ var "bf") $
-        Json.valueNumber $ var "f",
-      _Literal_string>>: "s" ~> Json.valueString $ var "s"]) $
-  "fieldToKeyval" <~ ("f" ~>
-    "forTerm" <~ ("t" ~> var "matchTermMaybe" @@ var "forTerm" @@ var "t") $
-    "mjson" <<~ var "forTerm" @@ (Core.fieldTerm $ var "f") $
-    produce $ Maybes.map
-      ("j" ~> pair (Core.unName $ Core.fieldName $ var "f") (var "j"))
-      (var "mjson")) $
-  "result" <~ (cases _Term (var "term")
-    (Just $ var "unexp" @@ (Strings.cat $ list [
-      string "unsupported term variant: ",
-      ShowCore.term @@ var "term"])) [
-    _Term_annotated>>: "at" ~>
-      "term1" <~ (Core.annotatedTermBody $ var "at") $
-      "ann" <~ (Core.annotatedTermAnnotation $ var "at") $
-      "encodePair" <~ ("kv" ~>
-        "k" <~ (Core.unName $ Pairs.first $ var "kv") $
-        "v" <~ (Pairs.second $ var "kv") $
-        "json" <<~ untypedTermToJson @@ var "v" $
-        produce $ pair (var "k") (var "json")) $
-      "json" <<~ untypedTermToJson @@ var "term1" $
-      "pairs" <<~ Flows.mapList (var "encodePair") (Maps.toList $ var "ann") $
-      produce $ Json.valueObject $ Maps.fromList $ list [
-        pair (string "term") (var "json"),
-        pair (string "annotations") (Json.valueObject $ Maps.fromList $ var "pairs")],
-    _Term_application>>: "app" ~> var "asRecord" @@ list [
-      Core.field (Core.name $ string "function") (Core.applicationFunction $ var "app"),
-      Core.field (Core.name $ string "argument") (Core.applicationArgument $ var "app")],
-    _Term_function>>: "f" ~>
-      var "matchFunction" @@ var "unexp" @@ var "asRecord" @@ var "asVariant" @@ var "f",
-    _Term_let>>: "lt" ~>
-      "bindings" <~ (Core.letBindings $ var "lt") $
-      "env" <~ (Core.letBody $ var "lt") $
-      "fromBinding" <~ ("b" ~> Core.field
-        (Core.bindingName $ var "b")
-        (Core.bindingTerm $ var "b")) $
-      var "asRecord" @@ list [
-        Core.field (Core.name $ string "bindings") (Core.termRecord $ Core.record
-          (Core.name $ string "")
-          (Lists.map (var "fromBinding") (var "bindings"))),
-        Core.field (Core.name $ string "environment") (var "env")],
-    _Term_list>>: "terms" ~>
-      "jsonTerms" <<~ Flows.mapList (untypedTermToJson) (var "terms") $
-      produce $ Json.valueArray $ var "jsonTerms",
-    _Term_literal>>: "lit" ~>
-      produce $ var "matchLiteral" @@ var "lit",
-    _Term_maybe>>: "mt" ~> Maybes.maybe
-      (produce Json.valueNull)
-      untypedTermToJson
-      (var "mt"),
-    _Term_record>>: "r" ~>
-      "fields" <~ (Core.recordFields $ var "r") $
-      "keyvals" <<~ Flows.mapList (var "fieldToKeyval") (var "fields") $
-      produce $ Json.valueObject $ Maps.fromList $ Maybes.cat $ var "keyvals",
-    _Term_set>>: "vals" ~> untypedTermToJson @@ (Core.termList $ Sets.toList $ var "vals"),
-    _Term_typeLambda>>: "ta" ~> var "asRecord" @@ list [
-      Core.field (Core.name $ string "parameter") (Core.termVariable $ Core.typeLambdaParameter $ var "ta"),
-      Core.field (Core.name $ string "body") (Core.typeLambdaBody $ var "ta")],
-    _Term_typeApplication>>: "tt" ~> var "asRecord" @@ list [
-      Core.field (Core.name $ string "term") (Core.typeApplicationTermBody $ var "tt"),
-      Core.field (Core.name $ string "type") (encoderFor _Type @@ (Core.typeApplicationTermType $ var "tt"))],
-    _Term_union>>: "i" ~>
-      "field" <~ (Core.injectionField $ var "i") $
-      Logic.ifElse (Equality.equal (Core.fieldTerm $ var "field") Core.termUnit)
-        (produce $ Json.valueString $ Core.unName $ Core.fieldName $ var "field")
-        ("mkeyval" <<~ var "fieldToKeyval" @@ var "field" $
-          produce $ Json.valueObject $ Maps.fromList $ Maybes.maybe
-            (list ([] :: [TTerm (String, Value)]))
-            ("keyval" ~> list [var "keyval"])
-            (var "mkeyval")),
-    _Term_variable>>: "v" ~> produce $ Json.valueString $ Core.unName $ var "v",
-    _Term_wrap>>: "wt" ~> untypedTermToJson @@ (Core.wrappedTermBody $ var "wt")]) $
-  var "result"
-
-readStringStub :: TBinding (String -> Term)
-readStringStub = define "readStringStub" $
-  doc "Placeholder for reading a string into a term (to be implemented)" $
-  "s" ~> Core.termLiteral $ Core.literalString $ Strings.cat2 (string "TODO: read ") (var "s")
-
--- TODO: implement this function, and deduplicate with hydra.json.coder.showValue
-showValue :: TBinding (Value -> String)
-showValue = define "showValue" $
-  doc "Show a JSON value as a string (placeholder implementation)" $
-  "value" ~> string "TODO: implement showValue"
diff --git a/src/main/haskell/Hydra/Sources/Json/Decode.hs b/src/main/haskell/Hydra/Sources/Json/Decode.hs
--- a/src/main/haskell/Hydra/Sources/Json/Decode.hs
+++ b/src/main/haskell/Hydra/Sources/Json/Decode.hs
@@ -8,22 +8,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -32,26 +29,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 --import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -60,26 +53,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -107,21 +97,193 @@
     Just "JSON decoding for Hydra terms. Converts JSON Values to Terms using Either for error handling."
   where
     elements = [
-      toBinding fromJson,
-      toBinding decodeLiteral,
-      toBinding decodeFloat,
-      toBinding decodeInteger,
-      toBinding expectString,
-      toBinding expectArray,
-      toBinding expectObject,
-      toBinding expectNumber]
+      toTermDefinition decodeFloat,
+      toTermDefinition decodeInteger,
+      toTermDefinition decodeLiteral,
+      toTermDefinition expectArray,
+      toTermDefinition expectNumber,
+      toTermDefinition expectObject,
+      toTermDefinition expectString,
+      toTermDefinition fromJson]
 
+-- | Decode a JSON value to a float term
+-- Float64 and Bigfloat are decoded from JSON numbers; Float32 from string
+decodeFloat :: TBinding (FloatType -> Value -> Either String Term)
+decodeFloat = define "decodeFloat" $
+  doc "Decode a JSON value to a float term. Float64/Bigfloat from numbers; Float32 from string." $
+  "ft" ~> "value" ~>
+  cases _FloatType (var "ft") Nothing [
+    -- Bigfloat: JSON number (Double) -> bigfloat
+    _FloatType_bigfloat>>: constant $
+      "numResult" <~ (expectNumber @@ var "value") $
+      Eithers.map
+        ("n" ~> Core.termLiteral $ Core.literalFloat $ Core.floatValueBigfloat $ var "n")
+        (var "numResult"),
+    -- Float32: JSON string -> parse as float32 (preserves exact precision)
+    _FloatType_float32>>: constant $
+      "strResult" <~ (expectString @@ var "value") $
+      Eithers.either_
+        ("err" ~> left $ var "err")
+        ("s" ~>
+          "parsed" <~ (Literals.readFloat32 $ var "s") $
+          Maybes.maybe
+            (left $ Strings.cat $ list [string "invalid float32: ", var "s"])
+            ("v" ~> right $ Core.termLiteral $ Core.literalFloat $ Core.floatValueFloat32 $ var "v")
+            (var "parsed"))
+        (var "strResult"),
+    -- Float64: JSON number (Double) -> float64
+    _FloatType_float64>>: constant $
+      "numResult" <~ (expectNumber @@ var "value") $
+      Eithers.map
+        ("n" ~> Core.termLiteral $ Core.literalFloat $ Core.floatValueFloat64 $ Literals.bigfloatToFloat64 $ var "n")
+        (var "numResult")]
+
+-- | Decode a JSON value to an integer term
+-- Small integers (int8, int16, int32, uint8, uint16) are decoded from JSON numbers
+-- Large integers (int64, uint32, uint64, bigint) are decoded from JSON strings
+decodeInteger :: TBinding (IntegerType -> Value -> Either String Term)
+decodeInteger = define "decodeInteger" $
+  doc "Decode a JSON value to an integer term. Small ints from numbers; large ints from strings." $
+  "it" ~> "value" ~>
+  cases _IntegerType (var "it") Nothing [
+    -- Large integers: decode from JSON string
+    _IntegerType_bigint>>: constant $
+      "strResult" <~ (expectString @@ var "value") $
+      Eithers.either_
+        ("err" ~> left $ var "err")
+        ("s" ~>
+          "parsed" <~ (Literals.readBigint $ var "s") $
+          Maybes.maybe
+            (left $ Strings.cat $ list [string "invalid bigint: ", var "s"])
+            ("v" ~> right $ Core.termLiteral $ Core.literalInteger $ Core.integerValueBigint $ var "v")
+            (var "parsed"))
+        (var "strResult"),
+    _IntegerType_int64>>: constant $
+      "strResult" <~ (expectString @@ var "value") $
+      Eithers.either_
+        ("err" ~> left $ var "err")
+        ("s" ~>
+          "parsed" <~ (Literals.readInt64 $ var "s") $
+          Maybes.maybe
+            (left $ Strings.cat $ list [string "invalid int64: ", var "s"])
+            ("v" ~> right $ Core.termLiteral $ Core.literalInteger $ Core.integerValueInt64 $ var "v")
+            (var "parsed"))
+        (var "strResult"),
+    _IntegerType_uint32>>: constant $
+      "strResult" <~ (expectString @@ var "value") $
+      Eithers.either_
+        ("err" ~> left $ var "err")
+        ("s" ~>
+          "parsed" <~ (Literals.readUint32 $ var "s") $
+          Maybes.maybe
+            (left $ Strings.cat $ list [string "invalid uint32: ", var "s"])
+            ("v" ~> right $ Core.termLiteral $ Core.literalInteger $ Core.integerValueUint32 $ var "v")
+            (var "parsed"))
+        (var "strResult"),
+    _IntegerType_uint64>>: constant $
+      "strResult" <~ (expectString @@ var "value") $
+      Eithers.either_
+        ("err" ~> left $ var "err")
+        ("s" ~>
+          "parsed" <~ (Literals.readUint64 $ var "s") $
+          Maybes.maybe
+            (left $ Strings.cat $ list [string "invalid uint64: ", var "s"])
+            ("v" ~> right $ Core.termLiteral $ Core.literalInteger $ Core.integerValueUint64 $ var "v")
+            (var "parsed"))
+        (var "strResult"),
+    -- Small integers: decode from JSON number
+    _IntegerType_int8>>: constant $
+      "numResult" <~ (expectNumber @@ var "value") $
+      Eithers.map
+        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueInt8 $
+          Literals.bigintToInt8 $ Literals.bigfloatToBigint $ var "n")
+        (var "numResult"),
+    _IntegerType_int16>>: constant $
+      "numResult" <~ (expectNumber @@ var "value") $
+      Eithers.map
+        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueInt16 $
+          Literals.bigintToInt16 $ Literals.bigfloatToBigint $ var "n")
+        (var "numResult"),
+    _IntegerType_int32>>: constant $
+      "numResult" <~ (expectNumber @@ var "value") $
+      Eithers.map
+        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueInt32 $
+          Literals.bigintToInt32 $ Literals.bigfloatToBigint $ var "n")
+        (var "numResult"),
+    _IntegerType_uint8>>: constant $
+      "numResult" <~ (expectNumber @@ var "value") $
+      Eithers.map
+        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueUint8 $
+          Literals.bigintToUint8 $ Literals.bigfloatToBigint $ var "n")
+        (var "numResult"),
+    _IntegerType_uint16>>: constant $
+      "numResult" <~ (expectNumber @@ var "value") $
+      Eithers.map
+        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueUint16 $
+          Literals.bigintToUint16 $ Literals.bigfloatToBigint $ var "n")
+        (var "numResult")]
+
+-- | Decode a JSON value to a literal term given a literal type
+decodeLiteral :: TBinding (LiteralType -> Value -> Either String Term)
+decodeLiteral = define "decodeLiteral" $
+  doc "Decode a JSON value to a literal term" $
+  "lt" ~> "value" ~>
+  cases _LiteralType (var "lt") Nothing [
+    _LiteralType_binary>>: constant $
+      "strResult" <~ (expectString @@ var "value") $
+      Eithers.map ("s" ~> Core.termLiteral $ Core.literalBinary $ Literals.stringToBinary $ var "s") (var "strResult"),
+
+    _LiteralType_boolean>>: constant $
+      cases _Value (var "value")
+        (Just $ left $ string "expected boolean") [
+        _Value_boolean>>: "b" ~> right $ Core.termLiteral $ Core.literalBoolean $ var "b"],
+
+    _LiteralType_float>>: "ft" ~> decodeFloat @@ var "ft" @@ var "value",
+
+    _LiteralType_integer>>: "it" ~> decodeInteger @@ var "it" @@ var "value",
+
+    _LiteralType_string>>: constant $
+      "strResult" <~ (expectString @@ var "value") $
+      Eithers.map ("s" ~> Core.termLiteral $ Core.literalString $ var "s") (var "strResult")]
+
+-- | Extract an array from a JSON value
+expectArray :: TBinding (Value -> Either String [Value])
+expectArray = define "expectArray" $
+  doc "Extract an array from a JSON value" $
+  "value" ~> cases _Value (var "value")
+    (Just $ left $ string "expected array") [
+    _Value_array>>: "arr" ~> right $ var "arr"]
+
+-- | Extract a number from a JSON value
+expectNumber :: TBinding (Value -> Either String Double)
+expectNumber = define "expectNumber" $
+  doc "Extract a number from a JSON value" $
+  "value" ~> cases _Value (var "value")
+    (Just $ left $ string "expected number") [
+    _Value_number>>: "n" ~> right $ var "n"]
+
+-- | Extract an object from a JSON value
+expectObject :: TBinding (Value -> Either String (M.Map String Value))
+expectObject = define "expectObject" $
+  doc "Extract an object from a JSON value" $
+  "value" ~> cases _Value (var "value")
+    (Just $ left $ string "expected object") [
+    _Value_object>>: "obj" ~> right $ var "obj"]
+
+-- | Extract a string from a JSON value
+expectString :: TBinding (Value -> Either String String)
+expectString = define "expectString" $
+  doc "Extract a string from a JSON value" $
+  "value" ~> cases _Value (var "value")
+    (Just $ left $ string "expected string") [
+    _Value_string>>: "s" ~> right $ var "s"]
+
 -- | Decode a JSON Value to a Term given a Type and type lookup table.
 -- Returns Left with an error message for type mismatches or invalid JSON.
-fromJson :: TBinding (M.Map Name Type -> Type -> Value -> Either String Term)
+fromJson :: TBinding (M.Map Name Type -> Name -> Type -> Value -> Either String Term)
 fromJson = define "fromJson" $
-  doc "Decode a JSON value to a Hydra term given a type. Returns Left for type mismatches." $
-  "types" ~> "typ" ~> "value" ~>
+  doc "Decode a JSON value to a Hydra term given a type and type name. Returns Left for type mismatches." $
+  "types" ~> "tname" ~> "typ" ~> "value" ~>
   "stripped" <~ (Rewriting.deannotateType @@ var "typ") $
   cases _Type (var "stripped")
     (Just $ left $ Strings.cat $ list [
@@ -133,7 +295,7 @@
 
     -- Lists
     _Type_list>>: "elemType" ~>
-      "decodeElem" <~ ("v" ~> fromJson @@ var "types" @@ var "elemType" @@ var "v") $
+      "decodeElem" <~ ("v" ~> fromJson @@ var "types" @@ var "tname" @@ var "elemType" @@ var "v") $
       "arrResult" <~ (expectArray @@ var "value") $
       Eithers.either_
         ("err" ~> left $ var "err")
@@ -144,7 +306,7 @@
 
     -- Sets
     _Type_set>>: "elemType" ~>
-      "decodeElem" <~ ("v" ~> fromJson @@ var "types" @@ var "elemType" @@ var "v") $
+      "decodeElem" <~ ("v" ~> fromJson @@ var "types" @@ var "tname" @@ var "elemType" @@ var "v") $
       "arrResult" <~ (expectArray @@ var "value") $
       Eithers.either_
         ("err" ~> left $ var "err")
@@ -158,7 +320,7 @@
       -- Helper to decode Just case (single element array)
       "decodeJust" <~ ("arr" ~>
         Eithers.map ("v" ~> Core.termMaybe $ just $ var "v")
-          (fromJson @@ var "types" @@ var "innerType" @@ (Lists.head $ var "arr"))) $
+          (fromJson @@ var "types" @@ var "tname" @@ var "innerType" @@ (Lists.head $ var "arr"))) $
       -- Decode array based on length: 0 -> Nothing, 1 -> Just, else error
       "decodeMaybeArray" <~ ("arr" ~>
         "len" <~ (Lists.length $ var "arr") $
@@ -185,12 +347,11 @@
             -- Use empty object as default for missing optional fields
             "defaultVal" <~ Json.valueNull $
             "jsonVal" <~ (Maybes.fromMaybe (var "defaultVal") (var "mval")) $
-            "decoded" <~ (fromJson @@ var "types" @@ var "ftype" @@ var "jsonVal") $
+            "decoded" <~ (fromJson @@ var "types" @@ var "tname" @@ var "ftype" @@ var "jsonVal") $
             Eithers.map ("v" ~> Core.field (var "fname") (var "v")) (var "decoded")) $
-          "fields" <~ (Core.rowTypeFields $ var "rt") $
-          "decodedFields" <~ (Eithers.mapList (var "decodeField") (var "fields")) $
+          "decodedFields" <~ (Eithers.mapList (var "decodeField") (var "rt")) $
           Eithers.map
-            ("fs" ~> Core.termRecord $ Core.record (Core.rowTypeTypeName $ var "rt") (var "fs"))
+            ("fs" ~> Core.termRecord $ Core.record (var "tname") (var "fs"))
             (var "decodedFields"))
         (var "objResult"),
 
@@ -199,10 +360,10 @@
       -- Helper to decode a field once found
       "decodeVariant" <~ ("key" ~> "val" ~> "ftype" ~>
         "jsonVal" <~ (Maybes.fromMaybe Json.valueNull (var "val")) $
-        "decoded" <~ (fromJson @@ var "types" @@ var "ftype" @@ var "jsonVal") $
+        "decoded" <~ (fromJson @@ var "types" @@ var "tname" @@ var "ftype" @@ var "jsonVal") $
         Eithers.map
           ("v" ~> Core.termUnion $ Core.injection
-            (Core.rowTypeTypeName $ var "rt")
+            (var "tname")
             (Core.field (Core.name $ var "key") (var "v")))
           (var "decoded")) $
       -- Helper to check if a field matches and decode it
@@ -223,7 +384,7 @@
         var "findAndDecode"
           @@ (Lists.head $ Maps.keys $ var "obj")
           @@ (Maps.lookup (Lists.head $ Maps.keys $ var "obj") (var "obj"))
-          @@ (Core.rowTypeFields $ var "rt")) $
+          @@ var "rt") $
       -- Process the union object
       "processUnion" <~ ("obj" ~>
         Logic.ifElse (Equality.equal (Lists.length $ Maps.keys $ var "obj") (int32 1))
@@ -242,24 +403,11 @@
 
     -- Wrapped types (look up in type table and extract inner type if needed)
     _Type_wrap>>: "wn" ~>
-      -- Extract inner type from a looked-up type (handles nested wraps)
-      "extractInnerType" <~ ("lt" ~>
-        cases _Type (var "lt") (Just $ var "lt") [
-          _Type_wrap>>: "wt" ~> Core.wrappedTypeBody $ var "wt"]) $
-      -- Decode using the inner type and wrap the result
-      "decodeAndWrap" <~ ("lt" ~>
-        "innerType" <~ (var "extractInnerType" @@ var "lt") $
-        "decoded" <~ (fromJson @@ var "types" @@ var "innerType" @@ var "value") $
-        Eithers.map
-          ("v" ~> Core.termWrap $ Core.wrappedTerm (Core.wrappedTypeTypeName $ var "wn") (var "v"))
-          (var "decoded")) $
-      "lookedUp" <~ (Maps.lookup (Core.wrappedTypeTypeName $ var "wn") (var "types")) $
-      Maybes.maybe
-        (left $ Strings.cat $ list [
-          string "unknown wrapped type: ",
-          Core.unName $ Core.wrappedTypeTypeName $ var "wn"])
-        ("lt" ~> var "decodeAndWrap" @@ var "lt")
-        (var "lookedUp"),
+      -- TypeWrap now directly holds the inner Type; decode with it and wrap the result
+      "decoded" <~ (fromJson @@ var "types" @@ var "tname" @@ var "wn" @@ var "value") $
+      Eithers.map
+        ("v" ~> Core.termWrap $ Core.wrappedTerm (var "tname") (var "v"))
+        (var "decoded"),
 
     -- Map -> array of {@key, @value}
     _Type_map>>: "mt" ~>
@@ -281,8 +429,8 @@
                   ("kj" ~> Maybes.maybe
                     (left $ string "missing @value in map entry")
                     ("vj" ~>
-                      "decodedKey" <~ (fromJson @@ var "types" @@ var "keyType" @@ var "kj") $
-                      "decodedVal" <~ (fromJson @@ var "types" @@ var "valType" @@ var "vj") $
+                      "decodedKey" <~ (fromJson @@ var "types" @@ var "tname" @@ var "keyType" @@ var "kj") $
+                      "decodedVal" <~ (fromJson @@ var "types" @@ var "tname" @@ var "valType" @@ var "vj") $
                       Eithers.either_
                         ("err" ~> left $ var "err")
                         ("k" ~> Eithers.map ("v" ~> pair (var "k") (var "v")) (var "decodedVal"))
@@ -309,8 +457,8 @@
             ("fj" ~> Maybes.maybe
               (left $ string "missing @second in pair")
               ("sj" ~>
-                "decodedFirst" <~ (fromJson @@ var "types" @@ var "firstType" @@ var "fj") $
-                "decodedSecond" <~ (fromJson @@ var "types" @@ var "secondType" @@ var "sj") $
+                "decodedFirst" <~ (fromJson @@ var "types" @@ var "tname" @@ var "firstType" @@ var "fj") $
+                "decodedSecond" <~ (fromJson @@ var "types" @@ var "tname" @@ var "secondType" @@ var "sj") $
                 Eithers.either_
                   ("err" ~> left $ var "err")
                   ("f" ~> Eithers.map ("s" ~> Core.termPair $ pair (var "f") (var "s")) (var "decodedSecond"))
@@ -333,11 +481,11 @@
             (Maybes.maybe
               (left $ string "expected @left or @right in Either")
               ("rj" ~>
-                "decoded" <~ (fromJson @@ var "types" @@ var "rightType" @@ var "rj") $
+                "decoded" <~ (fromJson @@ var "types" @@ var "tname" @@ var "rightType" @@ var "rj") $
                 Eithers.map ("v" ~> Core.termEither $ right $ var "v") (var "decoded"))
               (var "rightJson"))
             ("lj" ~>
-              "decoded" <~ (fromJson @@ var "types" @@ var "leftType" @@ var "lj") $
+              "decoded" <~ (fromJson @@ var "types" @@ var "tname" @@ var "leftType" @@ var "lj") $
               Eithers.map ("v" ~> Core.termEither $ left $ var "v") (var "decoded"))
             (var "leftJson"))
         (var "objResult"),
@@ -349,177 +497,5 @@
         (left $ Strings.cat $ list [
           string "unknown type variable: ",
           Core.unName $ var "name"])
-        ("resolvedType" ~> fromJson @@ var "types" @@ var "resolvedType" @@ var "value")
+        ("resolvedType" ~> fromJson @@ var "types" @@ var "name" @@ var "resolvedType" @@ var "value")
         (var "lookedUp")]
-
--- | Decode a JSON value to a literal term given a literal type
-decodeLiteral :: TBinding (LiteralType -> Value -> Either String Term)
-decodeLiteral = define "decodeLiteral" $
-  doc "Decode a JSON value to a literal term" $
-  "lt" ~> "value" ~>
-  cases _LiteralType (var "lt") Nothing [
-    _LiteralType_binary>>: constant $
-      "strResult" <~ (expectString @@ var "value") $
-      Eithers.map ("s" ~> Core.termLiteral $ Core.literalBinary $ Literals.stringToBinary $ var "s") (var "strResult"),
-
-    _LiteralType_boolean>>: constant $
-      cases _Value (var "value")
-        (Just $ left $ string "expected boolean") [
-        _Value_boolean>>: "b" ~> right $ Core.termLiteral $ Core.literalBoolean $ var "b"],
-
-    _LiteralType_float>>: "ft" ~> decodeFloat @@ var "ft" @@ var "value",
-
-    _LiteralType_integer>>: "it" ~> decodeInteger @@ var "it" @@ var "value",
-
-    _LiteralType_string>>: constant $
-      "strResult" <~ (expectString @@ var "value") $
-      Eithers.map ("s" ~> Core.termLiteral $ Core.literalString $ var "s") (var "strResult")]
-
--- | Decode a JSON value to a float term
--- Float64 and Bigfloat are decoded from JSON numbers; Float32 from string
-decodeFloat :: TBinding (FloatType -> Value -> Either String Term)
-decodeFloat = define "decodeFloat" $
-  doc "Decode a JSON value to a float term. Float64/Bigfloat from numbers; Float32 from string." $
-  "ft" ~> "value" ~>
-  cases _FloatType (var "ft") Nothing [
-    -- Bigfloat: JSON number (Double) -> bigfloat
-    _FloatType_bigfloat>>: constant $
-      "numResult" <~ (expectNumber @@ var "value") $
-      Eithers.map
-        ("n" ~> Core.termLiteral $ Core.literalFloat $ Core.floatValueBigfloat $ var "n")
-        (var "numResult"),
-    -- Float32: JSON string -> parse as float32 (preserves exact precision)
-    _FloatType_float32>>: constant $
-      "strResult" <~ (expectString @@ var "value") $
-      Eithers.either_
-        ("err" ~> left $ var "err")
-        ("s" ~>
-          "parsed" <~ (Literals.readFloat32 $ var "s") $
-          Maybes.maybe
-            (left $ Strings.cat $ list [string "invalid float32: ", var "s"])
-            ("v" ~> right $ Core.termLiteral $ Core.literalFloat $ Core.floatValueFloat32 $ var "v")
-            (var "parsed"))
-        (var "strResult"),
-    -- Float64: JSON number (Double) -> float64
-    _FloatType_float64>>: constant $
-      "numResult" <~ (expectNumber @@ var "value") $
-      Eithers.map
-        ("n" ~> Core.termLiteral $ Core.literalFloat $ Core.floatValueFloat64 $ Literals.bigfloatToFloat64 $ var "n")
-        (var "numResult")]
-
--- | Decode a JSON value to an integer term
--- Small integers (int8, int16, int32, uint8, uint16) are decoded from JSON numbers
--- Large integers (int64, uint32, uint64, bigint) are decoded from JSON strings
-decodeInteger :: TBinding (IntegerType -> Value -> Either String Term)
-decodeInteger = define "decodeInteger" $
-  doc "Decode a JSON value to an integer term. Small ints from numbers; large ints from strings." $
-  "it" ~> "value" ~>
-  cases _IntegerType (var "it") Nothing [
-    -- Large integers: decode from JSON string
-    _IntegerType_bigint>>: constant $
-      "strResult" <~ (expectString @@ var "value") $
-      Eithers.either_
-        ("err" ~> left $ var "err")
-        ("s" ~>
-          "parsed" <~ (Literals.readBigint $ var "s") $
-          Maybes.maybe
-            (left $ Strings.cat $ list [string "invalid bigint: ", var "s"])
-            ("v" ~> right $ Core.termLiteral $ Core.literalInteger $ Core.integerValueBigint $ var "v")
-            (var "parsed"))
-        (var "strResult"),
-    _IntegerType_int64>>: constant $
-      "strResult" <~ (expectString @@ var "value") $
-      Eithers.either_
-        ("err" ~> left $ var "err")
-        ("s" ~>
-          "parsed" <~ (Literals.readInt64 $ var "s") $
-          Maybes.maybe
-            (left $ Strings.cat $ list [string "invalid int64: ", var "s"])
-            ("v" ~> right $ Core.termLiteral $ Core.literalInteger $ Core.integerValueInt64 $ var "v")
-            (var "parsed"))
-        (var "strResult"),
-    _IntegerType_uint32>>: constant $
-      "strResult" <~ (expectString @@ var "value") $
-      Eithers.either_
-        ("err" ~> left $ var "err")
-        ("s" ~>
-          "parsed" <~ (Literals.readUint32 $ var "s") $
-          Maybes.maybe
-            (left $ Strings.cat $ list [string "invalid uint32: ", var "s"])
-            ("v" ~> right $ Core.termLiteral $ Core.literalInteger $ Core.integerValueUint32 $ var "v")
-            (var "parsed"))
-        (var "strResult"),
-    _IntegerType_uint64>>: constant $
-      "strResult" <~ (expectString @@ var "value") $
-      Eithers.either_
-        ("err" ~> left $ var "err")
-        ("s" ~>
-          "parsed" <~ (Literals.readUint64 $ var "s") $
-          Maybes.maybe
-            (left $ Strings.cat $ list [string "invalid uint64: ", var "s"])
-            ("v" ~> right $ Core.termLiteral $ Core.literalInteger $ Core.integerValueUint64 $ var "v")
-            (var "parsed"))
-        (var "strResult"),
-    -- Small integers: decode from JSON number
-    _IntegerType_int8>>: constant $
-      "numResult" <~ (expectNumber @@ var "value") $
-      Eithers.map
-        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueInt8 $
-          Literals.bigintToInt8 $ Literals.bigfloatToBigint $ var "n")
-        (var "numResult"),
-    _IntegerType_int16>>: constant $
-      "numResult" <~ (expectNumber @@ var "value") $
-      Eithers.map
-        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueInt16 $
-          Literals.bigintToInt16 $ Literals.bigfloatToBigint $ var "n")
-        (var "numResult"),
-    _IntegerType_int32>>: constant $
-      "numResult" <~ (expectNumber @@ var "value") $
-      Eithers.map
-        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueInt32 $
-          Literals.bigintToInt32 $ Literals.bigfloatToBigint $ var "n")
-        (var "numResult"),
-    _IntegerType_uint8>>: constant $
-      "numResult" <~ (expectNumber @@ var "value") $
-      Eithers.map
-        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueUint8 $
-          Literals.bigintToUint8 $ Literals.bigfloatToBigint $ var "n")
-        (var "numResult"),
-    _IntegerType_uint16>>: constant $
-      "numResult" <~ (expectNumber @@ var "value") $
-      Eithers.map
-        ("n" ~> Core.termLiteral $ Core.literalInteger $ Core.integerValueUint16 $
-          Literals.bigintToUint16 $ Literals.bigfloatToBigint $ var "n")
-        (var "numResult")]
-
--- | Extract a string from a JSON value
-expectString :: TBinding (Value -> Either String String)
-expectString = define "expectString" $
-  doc "Extract a string from a JSON value" $
-  "value" ~> cases _Value (var "value")
-    (Just $ left $ string "expected string") [
-    _Value_string>>: "s" ~> right $ var "s"]
-
--- | Extract an array from a JSON value
-expectArray :: TBinding (Value -> Either String [Value])
-expectArray = define "expectArray" $
-  doc "Extract an array from a JSON value" $
-  "value" ~> cases _Value (var "value")
-    (Just $ left $ string "expected array") [
-    _Value_array>>: "arr" ~> right $ var "arr"]
-
--- | Extract an object from a JSON value
-expectObject :: TBinding (Value -> Either String (M.Map String Value))
-expectObject = define "expectObject" $
-  doc "Extract an object from a JSON value" $
-  "value" ~> cases _Value (var "value")
-    (Just $ left $ string "expected object") [
-    _Value_object>>: "obj" ~> right $ var "obj"]
-
--- | Extract a number from a JSON value
-expectNumber :: TBinding (Value -> Either String Double)
-expectNumber = define "expectNumber" $
-  doc "Extract a number from a JSON value" $
-  "value" ~> cases _Value (var "value")
-    (Just $ left $ string "expected number") [
-    _Value_number>>: "n" ~> right $ var "n"]
diff --git a/src/main/haskell/Hydra/Sources/Json/Decoding.hs b/src/main/haskell/Hydra/Sources/Json/Decoding.hs
--- a/src/main/haskell/Hydra/Sources/Json/Decoding.hs
+++ b/src/main/haskell/Hydra/Sources/Json/Decoding.hs
@@ -8,22 +8,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -32,26 +29,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -60,26 +53,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -105,62 +95,62 @@
     Just "Decoding functions for JSON data"
   where
    elements = [
-     Phantoms.toBinding decodeArray,
-     Phantoms.toBinding decodeBoolean,
-     Phantoms.toBinding decodeField,
---     Phantoms.toBinding decodeNumber, TODO: restore
-     Phantoms.toBinding decodeObject,
-     Phantoms.toBinding decodeOptionalField,
-     Phantoms.toBinding decodeString]
+     Phantoms.toTermDefinition decodeArray,
+     Phantoms.toTermDefinition decodeBoolean,
+     Phantoms.toTermDefinition decodeField,
+--     Phantoms.toTermDefinition decodeNumber, TODO: restore
+     Phantoms.toTermDefinition decodeObject,
+     Phantoms.toTermDefinition decodeOptionalField,
+     Phantoms.toTermDefinition decodeString]
 
 define :: String -> TTerm a -> TBinding a
 define label = definitionInModule module_ ("decode" <> label)
 
-decodeArray :: TBinding ((Value -> Flow s a) -> Value -> Flow s [a])
+decodeArray :: TBinding ((Value -> Either String a) -> Value -> Either String [a])
 decodeArray  = define "Array" $
   doc "Decode a JSON array using a decoder for elements" $
-  lambda "decodeElem" $ match _Value (Just $ Flows.fail (string "expected an array")) [
-    _Value_array>>: lambda "a" $ Flows.mapList (var "decodeElem") $ var "a"]
+  lambda "decodeElem" $ match _Value (Just $ left (string "expected an array")) [
+    _Value_array>>: lambda "a" $ Eithers.mapList (var "decodeElem") $ var "a"]
 
-decodeBoolean :: TBinding (Value -> Flow s Bool)
+decodeBoolean :: TBinding (Value -> Either String Bool)
 decodeBoolean  = define "Boolean" $
   doc "Decode a JSON boolean value" $
-  match _Value (Just $ Flows.fail (string "expected a boolean")) [
-    _Value_boolean>>: lambda "b" $ Flows.pure $ var "b"]
+  match _Value (Just $ left (string "expected a boolean")) [
+    _Value_boolean>>: lambda "b" $ right $ var "b"]
 
-decodeField :: TBinding ((Value -> Flow s a) -> String -> (M.Map String Value) -> Flow s a)
+decodeField :: TBinding ((Value -> Either String a) -> String -> (M.Map String Value) -> Either String a)
 decodeField  = define "Field" $
   doc "Decode a required field from a JSON object" $
   lambda "decodeValue" $ lambda "name" $ lambda "m" $
-    Flows.bind
+    Eithers.bind
       (decodeOptionalField @@ var "decodeValue" @@ var "name" @@ var "m")
       (primitive _maybes_maybe
-        @@ (Flows.fail $ Strings.cat2 (string "missing field: ") (var "name"))
-        @@ (lambda "f" $ Flows.pure $ var "f"))
+        @@ (left $ Strings.cat2 (string "missing field: ") (var "name"))
+        @@ (lambda "f" $ right $ var "f"))
 
-decodeNumber :: TBinding (Value -> Flow s Double)
+decodeNumber :: TBinding (Value -> Either String Double)
 decodeNumber  = define "Number" $
   doc "Decode a JSON number value" $
-  match _Value (Just $ Flows.fail (string "expected a number")) [
-    _Value_number>>: lambda "n" $ Flows.pure $ var "n"]
+  match _Value (Just $ left (string "expected a number")) [
+    _Value_number>>: lambda "n" $ right $ var "n"]
 
-decodeObject :: TBinding (Value -> Flow s (M.Map String Value))
+decodeObject :: TBinding (Value -> Either String (M.Map String Value))
 decodeObject  = define "Object" $
   doc "Decode a JSON object value" $
-  match _Value (Just $ Flows.fail (string "expected an object")) [
-    _Value_object>>: lambda "o" $ Flows.pure $ var "o"]
+  match _Value (Just $ left (string "expected an object")) [
+    _Value_object>>: lambda "o" $ right $ var "o"]
 
-decodeOptionalField :: TBinding ((Value -> Flow s a) -> String -> (M.Map String Value) -> Flow s (Maybe a))
+decodeOptionalField :: TBinding ((Value -> Either String a) -> String -> (M.Map String Value) -> Either String (Maybe a))
 decodeOptionalField  = define "OptionalField" $
   doc "Decode an optional field from a JSON object" $
   lambda "decodeValue" $ lambda "name" $ lambda "m" $
     (primitive _maybes_maybe
-        @@ (Flows.pure nothing)
-        @@ (lambda "v" (Flows.map (lambda "x" (just $ var "x")) (var "decodeValue" @@ var "v"))))
+        @@ (right nothing)
+        @@ (lambda "v" (Eithers.map (lambda "x" (just $ var "x")) (var "decodeValue" @@ var "v"))))
       @@ (Maps.lookup (var "name") (var "m"))
 
-decodeString :: TBinding (Value -> Flow s String)
+decodeString :: TBinding (Value -> Either String String)
 decodeString  = define "String" $
   doc "Decode a JSON string value" $
-  match _Value (Just $ Flows.fail (string "expected a string")) [
-    _Value_string>>: lambda "s" $ Flows.pure $ var "s"]
+  match _Value (Just $ left (string "expected a string")) [
+    _Value_string>>: lambda "s" $ right $ var "s"]
diff --git a/src/main/haskell/Hydra/Sources/Json/Encode.hs b/src/main/haskell/Hydra/Sources/Json/Encode.hs
--- a/src/main/haskell/Hydra/Sources/Json/Encode.hs
+++ b/src/main/haskell/Hydra/Sources/Json/Encode.hs
@@ -8,22 +8,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -32,26 +29,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -60,26 +53,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -107,11 +97,51 @@
     Just "JSON encoding for Hydra terms. Converts Terms to JSON Values using Either for error handling."
   where
     elements = [
-      toBinding toJson,
-      toBinding encodeLiteral,
-      toBinding encodeFloat,
-      toBinding encodeInteger]
+      toTermDefinition encodeFloat,
+      toTermDefinition encodeInteger,
+      toTermDefinition encodeLiteral,
+      toTermDefinition toJson]
 
+-- | Encode a float value to JSON
+-- Float64 and Bigfloat use native JSON numbers; Float32 uses string to preserve exact precision
+encodeFloat :: TBinding (FloatValue -> Either String Value)
+encodeFloat = define "encodeFloat" $
+  doc "Encode a float value to JSON. Float64/Bigfloat use native numbers; Float32 uses string." $
+  "fv" ~> cases _FloatValue (var "fv") Nothing [
+    _FloatValue_bigfloat>>: "bf" ~> right $ Json.valueNumber $ var "bf",
+    _FloatValue_float32>>: "f" ~> right $ Json.valueString $ Literals.showFloat32 $ var "f",
+    _FloatValue_float64>>: "f" ~> right $ Json.valueNumber $ Literals.float64ToBigfloat $ var "f"]
+
+-- | Encode an integer value to JSON
+-- Small integers (int8, int16, int32, uint8, uint16) use native JSON numbers
+-- Large integers (int64, uint32, uint64, bigint) use strings to preserve precision
+encodeInteger :: TBinding (IntegerValue -> Either String Value)
+encodeInteger = define "encodeInteger" $
+  doc "Encode an integer value to JSON. Small ints use native numbers; large ints use strings." $
+  "iv" ~> cases _IntegerValue (var "iv") Nothing [
+    -- Large integers: use strings to preserve precision
+    _IntegerValue_bigint>>: "bi" ~> right $ Json.valueString $ Literals.showBigint $ var "bi",
+    _IntegerValue_int64>>: "i" ~> right $ Json.valueString $ Literals.showInt64 $ var "i",
+    _IntegerValue_uint32>>: "i" ~> right $ Json.valueString $ Literals.showUint32 $ var "i",
+    _IntegerValue_uint64>>: "i" ~> right $ Json.valueString $ Literals.showUint64 $ var "i",
+    -- Small integers: use native JSON numbers (convert to bigfloat for JSON)
+    _IntegerValue_int8>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.int8ToBigint $ var "i",
+    _IntegerValue_int16>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.int16ToBigint $ var "i",
+    _IntegerValue_int32>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.int32ToBigint $ var "i",
+    _IntegerValue_uint8>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.uint8ToBigint $ var "i",
+    _IntegerValue_uint16>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.uint16ToBigint $ var "i"]
+
+-- | Encode a literal value to JSON
+encodeLiteral :: TBinding (Literal -> Either String Value)
+encodeLiteral = define "encodeLiteral" $
+  doc "Encode a Hydra literal to a JSON value" $
+  "lit" ~> cases _Literal (var "lit") Nothing [
+    _Literal_binary>>: "b" ~> right $ Json.valueString $ Literals.binaryToString $ var "b",
+    _Literal_boolean>>: "b" ~> right $ Json.valueBoolean $ var "b",
+    _Literal_float>>: "f" ~> encodeFloat @@ var "f",
+    _Literal_integer>>: "i" ~> encodeInteger @@ var "i",
+    _Literal_string>>: "s" ~> right $ Json.valueString $ var "s"]
+
 -- | Encode a Term to a JSON Value.
 -- Returns Left with an error message for unsupported term constructs.
 toJson :: TBinding (Term -> Either String Value)
@@ -219,43 +249,3 @@
             ("v" ~> Json.valueObject $ Maps.fromList $ list [pair (string "@right") (var "v")])
             (var "encodedR"))
         (var "e")]
-
--- | Encode a literal value to JSON
-encodeLiteral :: TBinding (Literal -> Either String Value)
-encodeLiteral = define "encodeLiteral" $
-  doc "Encode a Hydra literal to a JSON value" $
-  "lit" ~> cases _Literal (var "lit") Nothing [
-    _Literal_binary>>: "b" ~> right $ Json.valueString $ Literals.binaryToString $ var "b",
-    _Literal_boolean>>: "b" ~> right $ Json.valueBoolean $ var "b",
-    _Literal_float>>: "f" ~> encodeFloat @@ var "f",
-    _Literal_integer>>: "i" ~> encodeInteger @@ var "i",
-    _Literal_string>>: "s" ~> right $ Json.valueString $ var "s"]
-
--- | Encode a float value to JSON
--- Float64 and Bigfloat use native JSON numbers; Float32 uses string to preserve exact precision
-encodeFloat :: TBinding (FloatValue -> Either String Value)
-encodeFloat = define "encodeFloat" $
-  doc "Encode a float value to JSON. Float64/Bigfloat use native numbers; Float32 uses string." $
-  "fv" ~> cases _FloatValue (var "fv") Nothing [
-    _FloatValue_bigfloat>>: "bf" ~> right $ Json.valueNumber $ var "bf",
-    _FloatValue_float32>>: "f" ~> right $ Json.valueString $ Literals.showFloat32 $ var "f",
-    _FloatValue_float64>>: "f" ~> right $ Json.valueNumber $ Literals.float64ToBigfloat $ var "f"]
-
--- | Encode an integer value to JSON
--- Small integers (int8, int16, int32, uint8, uint16) use native JSON numbers
--- Large integers (int64, uint32, uint64, bigint) use strings to preserve precision
-encodeInteger :: TBinding (IntegerValue -> Either String Value)
-encodeInteger = define "encodeInteger" $
-  doc "Encode an integer value to JSON. Small ints use native numbers; large ints use strings." $
-  "iv" ~> cases _IntegerValue (var "iv") Nothing [
-    -- Large integers: use strings to preserve precision
-    _IntegerValue_bigint>>: "bi" ~> right $ Json.valueString $ Literals.showBigint $ var "bi",
-    _IntegerValue_int64>>: "i" ~> right $ Json.valueString $ Literals.showInt64 $ var "i",
-    _IntegerValue_uint32>>: "i" ~> right $ Json.valueString $ Literals.showUint32 $ var "i",
-    _IntegerValue_uint64>>: "i" ~> right $ Json.valueString $ Literals.showUint64 $ var "i",
-    -- Small integers: use native JSON numbers (convert to bigfloat for JSON)
-    _IntegerValue_int8>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.int8ToBigint $ var "i",
-    _IntegerValue_int16>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.int16ToBigint $ var "i",
-    _IntegerValue_int32>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.int32ToBigint $ var "i",
-    _IntegerValue_uint8>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.uint8ToBigint $ var "i",
-    _IntegerValue_uint16>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ Literals.uint16ToBigint $ var "i"]
diff --git a/src/main/haskell/Hydra/Sources/Json/Extract.hs b/src/main/haskell/Hydra/Sources/Json/Extract.hs
--- a/src/main/haskell/Hydra/Sources/Json/Extract.hs
+++ b/src/main/haskell/Hydra/Sources/Json/Extract.hs
@@ -8,22 +8,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms hiding (opt)
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -32,26 +29,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -60,26 +53,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -92,7 +82,6 @@
 
 -- Additional imports
 import Hydra.Json.Model
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
 
 
 ns :: Namespace
@@ -100,107 +89,107 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Monads.ns]
+    []
     KernelTypes.kernelTypesNamespaces $
     Just "Utilities for extracting values from JSON objects"
   where
     elements = [
-      toBinding expectArray,
-      toBinding expectNumber,
-      toBinding expectObject,
-      toBinding expectString,
-      toBinding opt,
-      toBinding optArray,
-      toBinding optString,
-      toBinding require,
-      toBinding requireArray,
-      toBinding requireNumber,
-      toBinding requireString,
-      toBinding showValue]
+      toTermDefinition expectArray,
+      toTermDefinition expectNumber,
+      toTermDefinition expectObject,
+      toTermDefinition expectString,
+      toTermDefinition opt,
+      toTermDefinition optArray,
+      toTermDefinition optString,
+      toTermDefinition require,
+      toTermDefinition requireArray,
+      toTermDefinition requireNumber,
+      toTermDefinition requireString,
+      toTermDefinition showValue]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
-expectArray :: TBinding (Value -> Flow s [Value])
+expectArray :: TBinding (Value -> Either String [Value])
 expectArray = define "expectArray" $
   doc "Extract an array from a JSON value, failing if the value is not an array" $
   lambda "value" $ cases _Value (var "value")
-    (Just $ Monads.unexpected @@ string "JSON array" @@ (showValue @@ var "value")) [
-    _Value_array>>: lambda "els" $ Flows.pure $ var "els"]
+    (Just $ left $ Strings.cat2 (Strings.cat2 (string "expected ") (string "JSON array")) (Strings.cat2 (string " but found ") (showValue @@ var "value"))) [
+    _Value_array>>: lambda "els" $ right $ var "els"]
 
-expectNumber :: TBinding (Value -> Flow s Double)
+expectNumber :: TBinding (Value -> Either String Double)
 expectNumber = define "expectNumber" $
   doc "Extract a number from a JSON value, failing if the value is not a number" $
   lambda "value" $ cases _Value (var "value")
-    (Just $ Monads.unexpected @@ string "JSON number" @@ (showValue @@ var "value")) [
-    _Value_number>>: lambda "d" $ Flows.pure $ var "d"]
+    (Just $ left $ Strings.cat2 (Strings.cat2 (string "expected ") (string "JSON number")) (Strings.cat2 (string " but found ") (showValue @@ var "value"))) [
+    _Value_number>>: lambda "d" $ right $ var "d"]
 
-expectObject :: TBinding (Value -> Flow s (M.Map String Value))
+expectObject :: TBinding (Value -> Either String (M.Map String Value))
 expectObject = define "expectObject" $
   doc "Extract an object from a JSON value, failing if the value is not an object" $
   lambda "value" $ cases _Value (var "value")
-    (Just $ Monads.unexpected @@ string "JSON object" @@ (showValue @@ var "value")) [
-    _Value_object>>: lambda "m" $ Flows.pure $ var "m"]
+    (Just $ left $ Strings.cat2 (Strings.cat2 (string "expected ") (string "JSON object")) (Strings.cat2 (string " but found ") (showValue @@ var "value"))) [
+    _Value_object>>: lambda "m" $ right $ var "m"]
 
-expectString :: TBinding (Value -> Flow s String)
+expectString :: TBinding (Value -> Either String String)
 expectString = define "expectString" $
   doc "Extract a string from a JSON value, failing if the value is not a string" $
   lambda "value" $ cases _Value (var "value")
-    (Just $ Monads.unexpected @@ string "JSON string" @@ (showValue @@ var "value")) [
-    _Value_string>>: lambda "s" $ Flows.pure $ var "s"]
+    (Just $ left $ Strings.cat2 (Strings.cat2 (string "expected ") (string "JSON string")) (Strings.cat2 (string " but found ") (showValue @@ var "value"))) [
+    _Value_string>>: lambda "s" $ right $ var "s"]
 
 opt :: TBinding (String -> M.Map String Value -> Maybe Value)
 opt = define "opt" $
   doc "Look up an optional field in a JSON object" $
   lambdas ["fname", "m"] $ Maps.lookup (var "fname") (var "m")
 
-optArray :: TBinding (String -> M.Map String Value -> Flow s (Maybe [Value]))
+optArray :: TBinding (String -> M.Map String Value -> Either String (Maybe [Value]))
 optArray = define "optArray" $
   doc "Look up an optional array field in a JSON object" $
   lambdas ["fname", "m"] $ Maybes.maybe
-    (Flows.pure nothing)
-    (lambda "a" $ Flows.map (unaryFunction just) $ expectArray @@ var "a")
+    (right nothing)
+    (lambda "a" $ Eithers.map (lambda "x" (just $ var "x")) $ expectArray @@ var "a")
     (opt @@ var "fname" @@ var "m")
 
-optString :: TBinding (String -> M.Map String Value -> Flow s (Maybe String))
+optString :: TBinding (String -> M.Map String Value -> Either String (Maybe String))
 optString = define "optString" $
   doc "Look up an optional string field in a JSON object" $
   lambdas ["fname", "m"] $ Maybes.maybe
-    (Flows.pure nothing)
-    (lambda "s" $ Flows.map (unaryFunction just) $ expectString @@ var "s")
+    (right nothing)
+    (lambda "s" $ Eithers.map (lambda "x" (just $ var "x")) $ expectString @@ var "s")
     (opt @@ var "fname" @@ var "m")
 
-require :: TBinding (String -> M.Map String Value -> Flow s Value)
+require :: TBinding (String -> M.Map String Value -> Either String Value)
 require = define "require" $
   doc "Look up a required field in a JSON object, failing if not found" $
   lambdas ["fname", "m"] $ Maybes.maybe
-    (Flows.fail $ Strings.cat $ list [
+    (left $ Strings.cat $ list [
       string "required attribute ",
       showValue @@ var "fname",
       string " not found"])
-    (lambda "value" $ Flows.pure $ var "value")
+    (lambda "value" $ right $ var "value")
     (Maps.lookup (var "fname") (var "m"))
 
-requireArray :: TBinding (String -> M.Map String Value -> Flow s [Value])
+requireArray :: TBinding (String -> M.Map String Value -> Either String [Value])
 requireArray = define "requireArray" $
   doc "Look up a required array field in a JSON object" $
-  lambdas ["fname", "m"] $ Flows.bind
+  lambdas ["fname", "m"] $ Eithers.bind
     (require @@ var "fname" @@ var "m")
-    (expectArray)
+    (asTerm expectArray)
 
-requireNumber :: TBinding (String -> M.Map String Value -> Flow s Double)
+requireNumber :: TBinding (String -> M.Map String Value -> Either String Double)
 requireNumber = define "requireNumber" $
   doc "Look up a required number field in a JSON object" $
-  lambdas ["fname", "m"] $ Flows.bind
+  lambdas ["fname", "m"] $ Eithers.bind
     (require @@ var "fname" @@ var "m")
-    (expectNumber)
+    (asTerm expectNumber)
 
-requireString :: TBinding (String -> M.Map String Value -> Flow s String)
+requireString :: TBinding (String -> M.Map String Value -> Either String String)
 requireString = define "requireString" $
   doc "Look up a required string field in a JSON object" $
-  lambdas ["fname", "m"] $ Flows.bind
+  lambdas ["fname", "m"] $ Eithers.bind
     (require @@ var "fname" @@ var "m")
-    (expectString)
+    (asTerm expectString)
 
 -- TODO: implement this function, and deduplicate with hydra.json.coder.showValue
 showValue :: TBinding (Value -> String)
diff --git a/src/main/haskell/Hydra/Sources/Json/Language.hs b/src/main/haskell/Hydra/Sources/Json/Language.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Json/Language.hs
+++ /dev/null
@@ -1,149 +0,0 @@
-
-module Hydra.Sources.Json.Language where
-
--- Standard imports for term-level sources outside of the kernel
-import Hydra.Kernel
-import Hydra.Sources.Libraries
-import           Hydra.Dsl.Meta.Lib.Strings                as Strings
-import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
-import qualified Hydra.Dsl.Annotations                     as Annotations
-import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
-import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
-import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
-import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
-import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
-import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps                   as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math                   as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
-import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
-import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
-import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
-import qualified Hydra.Dsl.Meta.Variants                   as Variants
-import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
-import qualified Hydra.Dsl.Terms                           as Terms
-import qualified Hydra.Dsl.Tests                           as Tests
-import qualified Hydra.Dsl.Types                           as Types
-import qualified Hydra.Sources.Decode.Core                 as DecodeCore
-import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
-import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
-import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
-import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
-import qualified Hydra.Sources.Kernel.Terms.Checking       as Checking
-import qualified Hydra.Sources.Kernel.Terms.Constants      as Constants
-import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
-import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
-import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
-import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
-import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
-import qualified Hydra.Sources.Kernel.Terms.Names          as Names
-import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
-import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
-import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
-import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
-import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
-import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
-import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
-import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
-import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
-import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
-import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
-import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
-import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
-import           Prelude hiding ((++))
-import qualified Data.Int                                  as I
-import qualified Data.List                                 as L
-import qualified Data.Map                                  as M
-import qualified Data.Set                                  as S
-import qualified Data.Maybe                                as Y
-
-
-ns :: Namespace
-ns = Namespace "hydra.ext.org.json.language"
-
-module_ :: Module
-module_ = Module ns
-  [toBinding jsonLanguage]
-  [Rewriting.ns]
-  KernelTypes.kernelTypesNamespaces $
-  Just "Language constraints for JSON"
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-jsonLanguage :: TBinding Language
-jsonLanguage = define "jsonLanguage" $
-  doc "Language constraints for JSON" $ lets [
-  "eliminationVariants">: Sets.empty,
-  "literalVariants">: Sets.fromList $ list [
-    Variants.literalVariantBoolean,
-    Variants.literalVariantFloat,
-    Variants.literalVariantInteger,
-    Variants.literalVariantString],
-  "floatTypes">: Sets.fromList $ list [Core.floatTypeBigfloat],
-  "functionVariants">: Sets.empty,
-  "integerTypes">: Sets.fromList $ list [Core.integerTypeBigint],
-    -- Note: TermVariantUnit is excluded because JSON null is used for optionals
-  "termVariants">: Sets.fromList $ list [
-    Variants.termVariantList,
-    Variants.termVariantLiteral,
-    Variants.termVariantMap,
-    Variants.termVariantMaybe,
-    Variants.termVariantRecord],
-    -- Note: TypeVariantUnit is excluded because JSON null is used for optionals
-  "typeVariants">: Sets.fromList $ list [
-    Variants.typeVariantList,
-    Variants.typeVariantLiteral,
-    Variants.typeVariantMap,
-    Variants.typeVariantMaybe,
-    Variants.typeVariantRecord],
-  "typePredicate">: lambda "typ" $ cases _Type (Rewriting.deannotateType @@ var "typ")
-    (Just true) [
-    _Type_maybe>>: lambda "innerType" $
-      cases _Type (var "innerType")
-        (Just true) [
-        _Type_maybe>>: constant false]]] $
-  Coders.language
-    (Coders.languageName (string "hydra.ext.org.json"))
-    (Coders.languageConstraints
-      (var "eliminationVariants")
-      (var "literalVariants")
-      (var "floatTypes")
-      (var "functionVariants")
-      (var "integerTypes")
-      (var "termVariants")
-      (var "typeVariants")
-      (var "typePredicate"))
diff --git a/src/main/haskell/Hydra/Sources/Json/Model.hs b/src/main/haskell/Hydra/Sources/Json/Model.hs
--- a/src/main/haskell/Hydra/Sources/Json/Model.hs
+++ b/src/main/haskell/Hydra/Sources/Json/Model.hs
@@ -18,7 +18,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [] [Core.ns] $
     Just "A JSON syntax model. See the BNF at https://www.json.org"
   where
     elements = [
diff --git a/src/main/haskell/Hydra/Sources/Json/Parser.hs b/src/main/haskell/Hydra/Sources/Json/Parser.hs
--- a/src/main/haskell/Hydra/Sources/Json/Parser.hs
+++ b/src/main/haskell/Hydra/Sources/Json/Parser.hs
@@ -8,22 +8,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -32,26 +29,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -60,26 +53,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -91,7 +81,7 @@
 import qualified Data.Maybe                                as Y
 
 -- Additional imports
-import qualified Hydra.Dsl.Meta.Parsing                    as Parsing
+import qualified Hydra.Dsl.Parsing                    as Parsing
 import qualified Hydra.Sources.Kernel.Terms.Parsers        as Parsers
 import qualified Hydra.Json.Model as J
 
@@ -107,24 +97,24 @@
   where
     ns = Namespace "hydra.json.parser"
     elements = [
-      toBinding whitespace,
-      toBinding token,
-      toBinding jsonNull,
-      toBinding jsonBool,
-      toBinding digit,
-      toBinding digits,
-      toBinding jsonIntegerPart,
-      toBinding jsonFractionPart,
-      toBinding jsonExponentPart,
-      toBinding jsonNumber,
-      toBinding jsonEscapeChar,
-      toBinding jsonStringChar,
-      toBinding jsonString,
-      toBinding jsonArray,
-      toBinding jsonKeyValue,
-      toBinding jsonObject,
-      toBinding jsonValue,
-      toBinding parseJson]
+      toTermDefinition whitespace,
+      toTermDefinition token,
+      toTermDefinition jsonNull,
+      toTermDefinition jsonBool,
+      toTermDefinition digit,
+      toTermDefinition digits,
+      toTermDefinition jsonIntegerPart,
+      toTermDefinition jsonFractionPart,
+      toTermDefinition jsonExponentPart,
+      toTermDefinition jsonNumber,
+      toTermDefinition jsonEscapeChar,
+      toTermDefinition jsonStringChar,
+      toTermDefinition jsonString,
+      toTermDefinition jsonArray,
+      toTermDefinition jsonKeyValue,
+      toTermDefinition jsonObject,
+      toTermDefinition jsonValue,
+      toTermDefinition parseJson]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -383,10 +373,10 @@
 parseJson = define "parseJson" $
   doc "Parse a JSON document from a string" $
   "input" ~>
-    Parsing.runParser
+    unwrap _Parser @@
       (Parsers.bind @@ whitespace @@ (constant $
         Parsers.bind @@ jsonValue @@ ("v" ~>
           Parsers.bind @@ whitespace @@ (constant $
             Parsers.bind @@ Parsers.eof @@ (constant $
-              Parsers.pure @@ var "v")))))
+              Parsers.pure @@ var "v"))))) @@
       (var "input")
diff --git a/src/main/haskell/Hydra/Sources/Json/Writer.hs b/src/main/haskell/Hydra/Sources/Json/Writer.hs
--- a/src/main/haskell/Hydra/Sources/Json/Writer.hs
+++ b/src/main/haskell/Hydra/Sources/Json/Writer.hs
@@ -8,22 +8,19 @@
 import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
 import qualified Hydra.Dsl.Annotations                     as Annotations
 import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
-import qualified Hydra.Dsl.Grammars                        as Grammars
 import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
 import qualified Hydra.Dsl.Literals                        as Literals
-import qualified Hydra.Dsl.Meta.Accessors                  as Accessors
-import qualified Hydra.Dsl.Meta.Ast                        as Ast
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
 import qualified Hydra.Dsl.Meta.Base                       as MetaBase
-import qualified Hydra.Dsl.Meta.Coders                     as Coders
-import qualified Hydra.Dsl.Meta.Compute                    as Compute
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
 import qualified Hydra.Dsl.Meta.Core                       as Core
-import qualified Hydra.Dsl.Meta.Grammar                    as Grammar
 import qualified Hydra.Dsl.Meta.Graph                      as Graph
-import qualified Hydra.Dsl.Meta.Json                       as Json
+import qualified Hydra.Dsl.Json.Model                       as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows                  as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
@@ -32,26 +29,22 @@
 import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
 import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
 import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
-import qualified Hydra.Dsl.Meta.Module                     as Module
+import qualified Hydra.Dsl.Module                     as Module
 import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
 import qualified Hydra.Dsl.Meta.Testing                    as Testing
-import qualified Hydra.Dsl.Meta.Topology                   as Topology
+import qualified Hydra.Dsl.Topology                   as Topology
 import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
-import qualified Hydra.Dsl.Meta.Typing                     as Typing
-import qualified Hydra.Dsl.Meta.Util                       as Util
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
 import qualified Hydra.Dsl.Meta.Variants                   as Variants
 import qualified Hydra.Dsl.Prims                           as Prims
-import qualified Hydra.Dsl.Tabular                         as Tabular
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
 import qualified Hydra.Dsl.Terms                           as Terms
 import qualified Hydra.Dsl.Tests                           as Tests
 import qualified Hydra.Dsl.Types                           as Types
 import qualified Hydra.Sources.Decode.Core                 as DecodeCore
 import qualified Hydra.Sources.Encode.Core                 as EncodeCore
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules  as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple   as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms    as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
 import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
@@ -60,26 +53,23 @@
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars       as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
 import qualified Hydra.Sources.Kernel.Terms.Names          as Names
 import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
 import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan         as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
 import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
@@ -106,11 +96,11 @@
   where
     ns = Namespace "hydra.json.writer"
     elements = [
-      toBinding colonOp,
-      toBinding jsonString,
-      toBinding keyValueToExpr,
-      toBinding printJson,
-      toBinding valueToExpr]
+      toTermDefinition colonOp,
+      toTermDefinition jsonString,
+      toTermDefinition keyValueToExpr,
+      toTermDefinition printJson,
+      toTermDefinition valueToExpr]
 
 colonOp :: TBinding Op
 colonOp = jsonSerdeDefinition "colonOp" $
diff --git a/src/main/haskell/Hydra/Sources/Json/Yaml/Decode.hs b/src/main/haskell/Hydra/Sources/Json/Yaml/Decode.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Json/Yaml/Decode.hs
@@ -0,0 +1,158 @@
+
+module Hydra.Sources.Json.Yaml.Decode where
+
+-- Standard imports for term-level sources outside of the kernel
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import           Hydra.Dsl.Meta.Lib.Strings                as Strings
+import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
+import qualified Hydra.Dsl.Annotations                     as Annotations
+import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
+import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
+import qualified Hydra.Dsl.Literals                        as Literals
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
+import qualified Hydra.Dsl.Meta.Base                       as MetaBase
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
+import qualified Hydra.Dsl.Meta.Core                       as Core
+import qualified Hydra.Dsl.Meta.Graph                      as Graph
+import qualified Hydra.Dsl.Json.Model                       as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps                   as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math                   as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
+import qualified Hydra.Dsl.Module                     as Module
+import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
+import qualified Hydra.Dsl.Meta.Testing                    as Testing
+import qualified Hydra.Dsl.Topology                   as Topology
+import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
+import qualified Hydra.Dsl.Meta.Variants                   as Variants
+import qualified Hydra.Dsl.Prims                           as Prims
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
+import qualified Hydra.Dsl.Terms                           as Terms
+import qualified Hydra.Dsl.Tests                           as Tests
+import qualified Hydra.Dsl.Types                           as Types
+import qualified Hydra.Sources.Decode.Core                 as DecodeCore
+import qualified Hydra.Sources.Encode.Core                 as EncodeCore
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
+--import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
+import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
+import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
+import qualified Hydra.Sources.Kernel.Terms.Checking       as Checking
+import qualified Hydra.Sources.Kernel.Terms.Constants      as Constants
+import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
+import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
+import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
+import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
+import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
+import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
+import qualified Hydra.Sources.Kernel.Terms.Names          as Names
+import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
+import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
+import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
+import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
+import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
+import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
+import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
+import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
+import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
+import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
+import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
+import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
+import           Prelude hiding ((++))
+import qualified Data.Int                                  as I
+import qualified Data.List                                 as L
+import qualified Data.Map                                  as M
+import qualified Data.Set                                  as S
+import qualified Data.Maybe                                as Y
+
+-- Additional imports
+import Hydra.Json.Model
+import qualified Hydra.Ext.Org.Yaml.Model as YM
+import qualified Hydra.Sources.Json.Decode as JsonDecode
+import qualified Hydra.Sources.Yaml.Model as YamlModel
+
+
+ns :: Namespace
+ns = Namespace "hydra.json.yaml.decode"
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInNamespace ns
+
+module_ :: Module
+module_ = Module ns elements
+    [JsonDecode.ns, YamlModel.ns]
+    KernelTypes.kernelTypesNamespaces $
+    Just "YAML-to-JSON decoding. Converts YAML Nodes to JSON Values (may fail for non-JSON YAML), and YAML Nodes to Hydra Terms via JSON."
+  where
+    elements = [
+      toTermDefinition yamlToJson,
+      toTermDefinition fromYaml]
+
+-- | Convert a YAML Node to a JSON Value. Fails if the YAML uses non-JSON features
+-- (e.g. non-string mapping keys, integer scalars without a JSON number equivalent).
+yamlToJson :: TBinding (YM.Node -> Either String Value)
+yamlToJson = define "yamlToJson" $
+  doc "Convert a YAML node to a JSON value. Fails for non-JSON YAML features (e.g. non-string mapping keys)." $
+  "node" ~>
+  cases YM._Node (var "node")
+    Nothing [
+
+    YM._Node_mapping>>: "m" ~>
+      -- Convert each key-value pair; keys must be string scalars
+      "convertEntry" <~ ("kv" ~>
+        "keyNode" <~ (Pairs.first $ var "kv") $
+        "valNode" <~ (Pairs.second $ var "kv") $
+        -- Extract string key from the key node
+        "keyResult" <~ (cases YM._Node (var "keyNode")
+          (Just $ left $ string "non-scalar YAML mapping key") [
+          YM._Node_scalar>>: "s" ~>
+            cases YM._Scalar (var "s")
+              (Just $ left $ string "non-string YAML mapping key") [
+              YM._Scalar_str>>: "str" ~> right $ var "str"]]) $
+        Eithers.either_
+          ("err" ~> left $ var "err")
+          ("key" ~>
+            "valResult" <~ (yamlToJson @@ var "valNode") $
+            Eithers.map ("v" ~> pair (var "key") (var "v")) (var "valResult"))
+          (var "keyResult")) $
+      "entries" <~ (Eithers.mapList (var "convertEntry") (Maps.toList $ var "m")) $
+      Eithers.map ("es" ~> Json.valueObject $ Maps.fromList $ var "es") (var "entries"),
+
+    YM._Node_scalar>>: "s" ~>
+      cases YM._Scalar (var "s")
+        Nothing [
+        YM._Scalar_bool>>: "b" ~> right $ Json.valueBoolean $ var "b",
+        YM._Scalar_float>>: "f" ~> right $ Json.valueNumber $ var "f",
+        YM._Scalar_int>>: "i" ~> right $ Json.valueNumber $ Literals.bigintToBigfloat $ var "i",
+        YM._Scalar_null>>: constant $ right Json.valueNull,
+        YM._Scalar_str>>: "str" ~> right $ Json.valueString $ var "str"],
+
+    YM._Node_sequence>>: "nodes" ~>
+      "results" <~ (Eithers.mapList ("n" ~> yamlToJson @@ var "n") (var "nodes")) $
+      Eithers.map ("vs" ~> Json.valueArray $ var "vs") (var "results")]
+
+-- | Decode a YAML Node to a Hydra Term via JSON.
+fromYaml :: TBinding (M.Map Name Type -> Name -> Type -> YM.Node -> Either String Term)
+fromYaml = define "fromYaml" $
+  doc "Decode a YAML node to a Hydra term via JSON decoding." $
+  "types" ~> "tname" ~> "typ" ~> "node" ~>
+  "jsonResult" <~ (yamlToJson @@ var "node") $
+  Eithers.either_
+    ("err" ~> left $ var "err")
+    ("json" ~> JsonDecode.fromJson @@ var "types" @@ var "tname" @@ var "typ" @@ var "json")
+    (var "jsonResult")
diff --git a/src/main/haskell/Hydra/Sources/Json/Yaml/Encode.hs b/src/main/haskell/Hydra/Sources/Json/Yaml/Encode.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Json/Yaml/Encode.hs
@@ -0,0 +1,142 @@
+
+module Hydra.Sources.Json.Yaml.Encode where
+
+-- Standard imports for term-level sources outside of the kernel
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import           Hydra.Dsl.Meta.Lib.Strings                as Strings
+import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
+import qualified Hydra.Dsl.Annotations                     as Annotations
+import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
+import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
+import qualified Hydra.Dsl.Literals                        as Literals
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
+import qualified Hydra.Dsl.Meta.Base                       as MetaBase
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
+import qualified Hydra.Dsl.Meta.Core                       as Core
+import qualified Hydra.Dsl.Meta.Graph                      as Graph
+import qualified Hydra.Dsl.Json.Model                       as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps                   as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math                   as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
+import qualified Hydra.Dsl.Module                     as Module
+import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
+import qualified Hydra.Dsl.Meta.Testing                    as Testing
+import qualified Hydra.Dsl.Topology                   as Topology
+import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
+import qualified Hydra.Dsl.Meta.Variants                   as Variants
+import qualified Hydra.Dsl.Ext.Org.Yaml.Model                       as Yaml
+import qualified Hydra.Dsl.Prims                           as Prims
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
+import qualified Hydra.Dsl.Terms                           as Terms
+import qualified Hydra.Dsl.Tests                           as Tests
+import qualified Hydra.Dsl.Types                           as Types
+import qualified Hydra.Sources.Decode.Core                 as DecodeCore
+import qualified Hydra.Sources.Encode.Core                 as EncodeCore
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
+import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
+import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
+import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
+import qualified Hydra.Sources.Kernel.Terms.Checking       as Checking
+import qualified Hydra.Sources.Kernel.Terms.Constants      as Constants
+import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
+import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
+import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
+import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
+import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
+import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
+import qualified Hydra.Sources.Kernel.Terms.Names          as Names
+import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
+import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
+import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
+import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
+import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
+import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
+import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
+import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
+import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
+import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
+import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
+import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
+import           Prelude hiding ((++))
+import qualified Data.Int                                  as I
+import qualified Data.List                                 as L
+import qualified Data.Map                                  as M
+import qualified Data.Set                                  as S
+import qualified Data.Maybe                                as Y
+
+-- Additional imports
+import Hydra.Json.Model
+import qualified Hydra.Ext.Org.Yaml.Model as YM
+import qualified Hydra.Sources.Json.Encode as JsonEncode
+import qualified Hydra.Sources.Yaml.Model as YamlModel
+
+
+ns :: Namespace
+ns = Namespace "hydra.json.yaml.encode"
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInNamespace ns
+
+module_ :: Module
+module_ = Module ns elements
+    [JsonEncode.ns, YamlModel.ns]
+    KernelTypes.kernelTypesNamespaces $
+    Just "JSON-to-YAML encoding. Converts JSON Values to YAML Nodes (always succeeds), and Hydra Terms to YAML Nodes via JSON."
+  where
+    elements = [
+      toTermDefinition jsonToYaml,
+      toTermDefinition toYaml]
+
+-- | Convert a JSON Value to a YAML Node. This always succeeds since YAML is a superset of JSON.
+jsonToYaml :: TBinding (Value -> YM.Node)
+jsonToYaml = define "jsonToYaml" $
+  doc "Convert a JSON value to a YAML node. Always succeeds since YAML is a superset of JSON." $
+  "value" ~>
+  cases _Value (var "value")
+    Nothing [
+    _Value_array>>: "arr" ~>
+      Yaml.nodeSequence $ Lists.map ("v" ~> jsonToYaml @@ var "v") (var "arr"),
+
+    _Value_boolean>>: "b" ~>
+      Yaml.nodeScalar $ Yaml.scalarBool $ var "b",
+
+    _Value_null>>: constant $
+      Yaml.nodeScalar Yaml.scalarNull,
+
+    _Value_number>>: "n" ~>
+      Yaml.nodeScalar $ Yaml.scalarFloat $ var "n",
+
+    _Value_object>>: "obj" ~>
+      Yaml.nodeMapping $ Maps.fromList $
+        Lists.map
+          ("kv" ~> pair
+            (Yaml.nodeScalar $ Yaml.scalarStr $ Pairs.first $ var "kv")
+            (jsonToYaml @@ (Pairs.second $ var "kv")))
+          (Maps.toList $ var "obj"),
+
+    _Value_string>>: "s" ~>
+      Yaml.nodeScalar $ Yaml.scalarStr $ var "s"]
+
+-- | Encode a Hydra Term to a YAML Node via JSON.
+toYaml :: TBinding (Term -> Either String YM.Node)
+toYaml = define "toYaml" $
+  doc "Encode a Hydra term to a YAML node via JSON encoding." $
+  "term" ~>
+  Eithers.map ("v" ~> jsonToYaml @@ var "v") (JsonEncode.toJson @@ var "term")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Lib/Names.hs b/src/main/haskell/Hydra/Sources/Kernel/Lib/Names.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Lib/Names.hs
@@ -0,0 +1,642 @@
+-- | Namespaces and primitive names for the Hydra standard library
+
+module Hydra.Sources.Kernel.Lib.Names where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel hiding (qname)
+import Hydra.Sources.Libraries
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+
+
+ns :: Namespace
+ns = Namespace "hydra.lib.names"
+
+module_ :: Module
+module_ = Module ns elements
+    []
+    kernelTypesNamespaces $
+    Just "Namespaces and primitive names for the Hydra standard library"
+  where
+    elements = [
+      -- Namespace constants
+      toTermDefinition chars,
+      toTermDefinition eithers,
+      toTermDefinition equality,
+      toTermDefinition lists,
+      toTermDefinition literals,
+      toTermDefinition logic,
+      toTermDefinition maps,
+      toTermDefinition math,
+      toTermDefinition maybes,
+      toTermDefinition pairs,
+      toTermDefinition regex,
+      toTermDefinition sets,
+      toTermDefinition strings,
+      toTermDefinition typeclass,
+
+      -- chars primitives
+      toTermDefinition charsIsAlphaNum,
+      toTermDefinition charsIsLower,
+      toTermDefinition charsIsSpace,
+      toTermDefinition charsIsUpper,
+      toTermDefinition charsToLower,
+      toTermDefinition charsToUpper,
+
+      -- eithers primitives
+      toTermDefinition eithersBimap,
+      toTermDefinition eithersBind,
+      toTermDefinition eithersEither,
+      toTermDefinition eithersFoldl,
+      toTermDefinition eithersFromLeft,
+      toTermDefinition eithersFromRight,
+      toTermDefinition eithersIsLeft,
+      toTermDefinition eithersIsRight,
+      toTermDefinition eithersLefts,
+      toTermDefinition eithersMap,
+      toTermDefinition eithersMapList,
+      toTermDefinition eithersMapMaybe,
+      toTermDefinition eithersMapSet,
+      toTermDefinition eithersPartitionEithers,
+      toTermDefinition eithersRights,
+
+      -- equality primitives
+      toTermDefinition equalityCompare,
+      toTermDefinition equalityEqual,
+      toTermDefinition equalityGt,
+      toTermDefinition equalityGte,
+      toTermDefinition equalityIdentity,
+      toTermDefinition equalityLt,
+      toTermDefinition equalityLte,
+      toTermDefinition equalityMax,
+      toTermDefinition equalityMin,
+
+      -- lists primitives
+      toTermDefinition listsApply,
+      toTermDefinition listsAt,
+      toTermDefinition listsBind,
+      toTermDefinition listsConcat,
+      toTermDefinition listsConcat2,
+      toTermDefinition listsCons,
+      toTermDefinition listsDrop,
+      toTermDefinition listsDropWhile,
+      toTermDefinition listsElem,
+      toTermDefinition listsFilter,
+      toTermDefinition listsFind,
+      toTermDefinition listsFoldl,
+      toTermDefinition listsFoldr,
+      toTermDefinition listsGroup,
+      toTermDefinition listsHead,
+      toTermDefinition listsInit,
+      toTermDefinition listsIntercalate,
+      toTermDefinition listsIntersperse,
+      toTermDefinition listsLast,
+      toTermDefinition listsLength,
+      toTermDefinition listsMap,
+      toTermDefinition listsNub,
+      toTermDefinition listsNull,
+      toTermDefinition listsPartition,
+      toTermDefinition listsPure,
+      toTermDefinition listsReplicate,
+      toTermDefinition listsReverse,
+      toTermDefinition listsSafeHead,
+      toTermDefinition listsSingleton,
+      toTermDefinition listsSort,
+      toTermDefinition listsSortOn,
+      toTermDefinition listsSpan,
+      toTermDefinition listsTail,
+      toTermDefinition listsTake,
+      toTermDefinition listsTranspose,
+      toTermDefinition listsZip,
+      toTermDefinition listsZipWith,
+
+      -- literals primitives
+      toTermDefinition literalsBigfloatToBigint,
+      toTermDefinition literalsBigfloatToFloat32,
+      toTermDefinition literalsBigfloatToFloat64,
+      toTermDefinition literalsBigintToBigfloat,
+      toTermDefinition literalsBigintToInt16,
+      toTermDefinition literalsBigintToInt32,
+      toTermDefinition literalsBigintToInt64,
+      toTermDefinition literalsBigintToInt8,
+      toTermDefinition literalsBigintToUint16,
+      toTermDefinition literalsBigintToUint32,
+      toTermDefinition literalsBigintToUint64,
+      toTermDefinition literalsBigintToUint8,
+      toTermDefinition literalsBinaryToBytes,
+      toTermDefinition literalsBinaryToString,
+      toTermDefinition literalsFloat32ToBigfloat,
+      toTermDefinition literalsFloat64ToBigfloat,
+      toTermDefinition literalsInt16ToBigint,
+      toTermDefinition literalsInt32ToBigint,
+      toTermDefinition literalsInt64ToBigint,
+      toTermDefinition literalsInt8ToBigint,
+      toTermDefinition literalsReadBigfloat,
+      toTermDefinition literalsReadBigint,
+      toTermDefinition literalsReadBoolean,
+      toTermDefinition literalsReadFloat32,
+      toTermDefinition literalsReadFloat64,
+      toTermDefinition literalsReadInt16,
+      toTermDefinition literalsReadInt32,
+      toTermDefinition literalsReadInt64,
+      toTermDefinition literalsReadInt8,
+      toTermDefinition literalsReadString,
+      toTermDefinition literalsReadUint16,
+      toTermDefinition literalsReadUint32,
+      toTermDefinition literalsReadUint64,
+      toTermDefinition literalsReadUint8,
+      toTermDefinition literalsShowBigfloat,
+      toTermDefinition literalsShowBigint,
+      toTermDefinition literalsShowBoolean,
+      toTermDefinition literalsShowFloat32,
+      toTermDefinition literalsShowFloat64,
+      toTermDefinition literalsShowInt16,
+      toTermDefinition literalsShowInt32,
+      toTermDefinition literalsShowInt64,
+      toTermDefinition literalsShowInt8,
+      toTermDefinition literalsShowString,
+      toTermDefinition literalsShowUint16,
+      toTermDefinition literalsShowUint32,
+      toTermDefinition literalsShowUint64,
+      toTermDefinition literalsShowUint8,
+      toTermDefinition literalsStringToBinary,
+      toTermDefinition literalsUint16ToBigint,
+      toTermDefinition literalsUint32ToBigint,
+      toTermDefinition literalsUint64ToBigint,
+      toTermDefinition literalsUint8ToBigint,
+
+      -- logic primitives
+      toTermDefinition logicAnd,
+      toTermDefinition logicIfElse,
+      toTermDefinition logicNot,
+      toTermDefinition logicOr,
+
+      -- maps primitives
+      toTermDefinition mapsAlter,
+      toTermDefinition mapsBimap,
+      toTermDefinition mapsDelete,
+      toTermDefinition mapsElems,
+      toTermDefinition mapsEmpty,
+      toTermDefinition mapsFilter,
+      toTermDefinition mapsFilterWithKey,
+      toTermDefinition mapsFindWithDefault,
+      toTermDefinition mapsFromList,
+      toTermDefinition mapsInsert,
+      toTermDefinition mapsKeys,
+      toTermDefinition mapsLookup,
+      toTermDefinition mapsMap,
+      toTermDefinition mapsMapKeys,
+      toTermDefinition mapsMember,
+      toTermDefinition mapsNull,
+      toTermDefinition mapsSingleton,
+      toTermDefinition mapsSize,
+      toTermDefinition mapsToList,
+      toTermDefinition mapsUnion,
+
+      -- math primitives
+      toTermDefinition mathAbs,
+      toTermDefinition mathAcos,
+      toTermDefinition mathAcosh,
+      toTermDefinition mathAdd,
+      toTermDefinition mathAsin,
+      toTermDefinition mathAsinh,
+      toTermDefinition mathAtan,
+      toTermDefinition mathAtan2,
+      toTermDefinition mathAtanh,
+      toTermDefinition mathCeiling,
+      toTermDefinition mathCos,
+      toTermDefinition mathCosh,
+      toTermDefinition mathDiv,
+      toTermDefinition mathE,
+      toTermDefinition mathEven,
+      toTermDefinition mathExp,
+      toTermDefinition mathFloor,
+      toTermDefinition mathLog,
+      toTermDefinition mathLogBase,
+      toTermDefinition mathMax,
+      toTermDefinition mathMin,
+      toTermDefinition mathMod,
+      toTermDefinition mathMul,
+      toTermDefinition mathNegate,
+      toTermDefinition mathOdd,
+      toTermDefinition mathPi,
+      toTermDefinition mathPow,
+      toTermDefinition mathPred,
+      toTermDefinition mathRange,
+      toTermDefinition mathRem,
+      toTermDefinition mathRound,
+      toTermDefinition mathRoundBigfloat,
+      toTermDefinition mathRoundFloat32,
+      toTermDefinition mathRoundFloat64,
+      toTermDefinition mathSignum,
+      toTermDefinition mathSin,
+      toTermDefinition mathSinh,
+      toTermDefinition mathSqrt,
+      toTermDefinition mathSub,
+      toTermDefinition mathSucc,
+      toTermDefinition mathTan,
+      toTermDefinition mathTanh,
+      toTermDefinition mathTruncate,
+
+      -- maybes primitives
+      toTermDefinition maybesApply,
+      toTermDefinition maybesBind,
+      toTermDefinition maybesCases,
+      toTermDefinition maybesCat,
+      toTermDefinition maybesCompose,
+      toTermDefinition maybesFromJust,
+      toTermDefinition maybesFromMaybe,
+      toTermDefinition maybesIsJust,
+      toTermDefinition maybesIsNothing,
+      toTermDefinition maybesMap,
+      toTermDefinition maybesMapMaybe,
+      toTermDefinition maybesMaybe,
+      toTermDefinition maybesPure,
+      toTermDefinition maybesToList,
+
+      -- pairs primitives
+      toTermDefinition pairsBimap,
+      toTermDefinition pairsFirst,
+      toTermDefinition pairsSecond,
+
+      -- sets primitives
+      toTermDefinition setsDelete,
+      toTermDefinition setsDifference,
+      toTermDefinition setsEmpty,
+      toTermDefinition setsFromList,
+      toTermDefinition setsInsert,
+      toTermDefinition setsIntersection,
+      toTermDefinition setsMap,
+      toTermDefinition setsMember,
+      toTermDefinition setsNull,
+      toTermDefinition setsSingleton,
+      toTermDefinition setsSize,
+      toTermDefinition setsToList,
+      toTermDefinition setsUnion,
+      toTermDefinition setsUnions,
+
+      -- regex primitives
+      toTermDefinition regexFind,
+      toTermDefinition regexFindAll,
+      toTermDefinition regexMatches,
+      toTermDefinition regexReplace,
+      toTermDefinition regexReplaceAll,
+      toTermDefinition regexSplit,
+
+      -- strings primitives
+      toTermDefinition stringsCat,
+      toTermDefinition stringsCat2,
+      toTermDefinition stringsCharAt,
+      toTermDefinition stringsFromList,
+      toTermDefinition stringsIntercalate,
+      toTermDefinition stringsLength,
+      toTermDefinition stringsNull,
+      toTermDefinition stringsLines,
+      toTermDefinition stringsSplitOn,
+      toTermDefinition stringsToList,
+      toTermDefinition stringsToLower,
+      toTermDefinition stringsToUpper,
+      toTermDefinition stringsUnlines,
+
+      -- typeclass names
+      toTermDefinition typeclassEq,
+      toTermDefinition typeclassOrd]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+-- | Helper: define a namespace constant
+defineNs :: String -> String -> TBinding Namespace
+defineNs name nsStr = define name $
+  wrap _Namespace $ string nsStr
+
+-- | Helper: define a primitive name constant as a simple Name data constructor
+defineName :: String -> String -> String -> TBinding Name
+defineName name nsStr localName = define name $
+  wrap _Name $ string (nsStr <> "." <> localName)
+
+-- Namespace constants
+
+chars :: TBinding Namespace
+chars = defineNs "chars" "hydra.lib.chars"
+
+eithers :: TBinding Namespace
+eithers = defineNs "eithers" "hydra.lib.eithers"
+
+equality :: TBinding Namespace
+equality = defineNs "equality" "hydra.lib.equality"
+
+lists :: TBinding Namespace
+lists = defineNs "lists" "hydra.lib.lists"
+
+literals :: TBinding Namespace
+literals = defineNs "literals" "hydra.lib.literals"
+
+logic :: TBinding Namespace
+logic = defineNs "logic" "hydra.lib.logic"
+
+maps :: TBinding Namespace
+maps = defineNs "maps" "hydra.lib.maps"
+
+math :: TBinding Namespace
+math = defineNs "math" "hydra.lib.math"
+
+maybes :: TBinding Namespace
+maybes = defineNs "maybes" "hydra.lib.maybes"
+
+pairs :: TBinding Namespace
+pairs = defineNs "pairs" "hydra.lib.pairs"
+
+regex :: TBinding Namespace
+regex = defineNs "regex" "hydra.lib.regex"
+
+sets :: TBinding Namespace
+sets = defineNs "sets" "hydra.lib.sets"
+
+strings :: TBinding Namespace
+strings = defineNs "strings" "hydra.lib.strings"
+
+typeclass :: TBinding Namespace
+typeclass = defineNs "typeclass" "hydra.typeclass"
+
+-- Chars primitives
+
+charsIsAlphaNum = defineName "charsIsAlphaNum" "hydra.lib.chars" "isAlphaNum"
+charsIsLower    = defineName "charsIsLower" "hydra.lib.chars" "isLower"
+charsIsSpace    = defineName "charsIsSpace" "hydra.lib.chars" "isSpace"
+charsIsUpper    = defineName "charsIsUpper" "hydra.lib.chars" "isUpper"
+charsToLower    = defineName "charsToLower" "hydra.lib.chars" "toLower"
+charsToUpper    = defineName "charsToUpper" "hydra.lib.chars" "toUpper"
+
+-- Eithers primitives
+
+eithersBimap            = defineName "eithersBimap" "hydra.lib.eithers" "bimap"
+eithersBind             = defineName "eithersBind" "hydra.lib.eithers" "bind"
+eithersEither           = defineName "eithersEither" "hydra.lib.eithers" "either"
+eithersFoldl            = defineName "eithersFoldl" "hydra.lib.eithers" "foldl"
+eithersFromLeft         = defineName "eithersFromLeft" "hydra.lib.eithers" "fromLeft"
+eithersFromRight        = defineName "eithersFromRight" "hydra.lib.eithers" "fromRight"
+eithersIsLeft           = defineName "eithersIsLeft" "hydra.lib.eithers" "isLeft"
+eithersIsRight          = defineName "eithersIsRight" "hydra.lib.eithers" "isRight"
+eithersLefts            = defineName "eithersLefts" "hydra.lib.eithers" "lefts"
+eithersMap              = defineName "eithersMap" "hydra.lib.eithers" "map"
+eithersMapList          = defineName "eithersMapList" "hydra.lib.eithers" "mapList"
+eithersMapMaybe         = defineName "eithersMapMaybe" "hydra.lib.eithers" "mapMaybe"
+eithersMapSet           = defineName "eithersMapSet" "hydra.lib.eithers" "mapSet"
+eithersPartitionEithers = defineName "eithersPartitionEithers" "hydra.lib.eithers" "partitionEithers"
+eithersRights           = defineName "eithersRights" "hydra.lib.eithers" "rights"
+
+-- Equality primitives
+
+equalityCompare  = defineName "equalityCompare" "hydra.lib.equality" "compare"
+equalityEqual    = defineName "equalityEqual" "hydra.lib.equality" "equal"
+equalityGt       = defineName "equalityGt" "hydra.lib.equality" "gt"
+equalityGte      = defineName "equalityGte" "hydra.lib.equality" "gte"
+equalityIdentity = defineName "equalityIdentity" "hydra.lib.equality" "identity"
+equalityLt       = defineName "equalityLt" "hydra.lib.equality" "lt"
+equalityLte      = defineName "equalityLte" "hydra.lib.equality" "lte"
+equalityMax      = defineName "equalityMax" "hydra.lib.equality" "max"
+equalityMin      = defineName "equalityMin" "hydra.lib.equality" "min"
+
+-- Lists primitives
+
+listsApply       = defineName "listsApply" "hydra.lib.lists" "apply"
+listsAt          = defineName "listsAt" "hydra.lib.lists" "at"
+listsBind        = defineName "listsBind" "hydra.lib.lists" "bind"
+listsConcat      = defineName "listsConcat" "hydra.lib.lists" "concat"
+listsConcat2     = defineName "listsConcat2" "hydra.lib.lists" "concat2"
+listsCons        = defineName "listsCons" "hydra.lib.lists" "cons"
+listsDrop        = defineName "listsDrop" "hydra.lib.lists" "drop"
+listsDropWhile   = defineName "listsDropWhile" "hydra.lib.lists" "dropWhile"
+listsElem        = defineName "listsElem" "hydra.lib.lists" "elem"
+listsFilter      = defineName "listsFilter" "hydra.lib.lists" "filter"
+listsFind        = defineName "listsFind" "hydra.lib.lists" "find"
+listsFoldl       = defineName "listsFoldl" "hydra.lib.lists" "foldl"
+listsFoldr       = defineName "listsFoldr" "hydra.lib.lists" "foldr"
+listsGroup       = defineName "listsGroup" "hydra.lib.lists" "group"
+listsHead        = defineName "listsHead" "hydra.lib.lists" "head"
+listsInit        = defineName "listsInit" "hydra.lib.lists" "init"
+listsIntercalate = defineName "listsIntercalate" "hydra.lib.lists" "intercalate"
+listsIntersperse = defineName "listsIntersperse" "hydra.lib.lists" "intersperse"
+listsLast        = defineName "listsLast" "hydra.lib.lists" "last"
+listsLength      = defineName "listsLength" "hydra.lib.lists" "length"
+listsMap         = defineName "listsMap" "hydra.lib.lists" "map"
+listsNub         = defineName "listsNub" "hydra.lib.lists" "nub"
+listsNull        = defineName "listsNull" "hydra.lib.lists" "null"
+listsPartition   = defineName "listsPartition" "hydra.lib.lists" "partition"
+listsPure        = defineName "listsPure" "hydra.lib.lists" "pure"
+listsReplicate   = defineName "listsReplicate" "hydra.lib.lists" "replicate"
+listsReverse     = defineName "listsReverse" "hydra.lib.lists" "reverse"
+listsSafeHead    = defineName "listsSafeHead" "hydra.lib.lists" "safeHead"
+listsSingleton   = defineName "listsSingleton" "hydra.lib.lists" "singleton"
+listsSort        = defineName "listsSort" "hydra.lib.lists" "sort"
+listsSortOn      = defineName "listsSortOn" "hydra.lib.lists" "sortOn"
+listsSpan        = defineName "listsSpan" "hydra.lib.lists" "span"
+listsTail        = defineName "listsTail" "hydra.lib.lists" "tail"
+listsTake        = defineName "listsTake" "hydra.lib.lists" "take"
+listsTranspose   = defineName "listsTranspose" "hydra.lib.lists" "transpose"
+listsZip         = defineName "listsZip" "hydra.lib.lists" "zip"
+listsZipWith     = defineName "listsZipWith" "hydra.lib.lists" "zipWith"
+
+-- Literals primitives
+
+literalsBigfloatToBigint  = defineName "literalsBigfloatToBigint" "hydra.lib.literals" "bigfloatToBigint"
+literalsBigfloatToFloat32 = defineName "literalsBigfloatToFloat32" "hydra.lib.literals" "bigfloatToFloat32"
+literalsBigfloatToFloat64 = defineName "literalsBigfloatToFloat64" "hydra.lib.literals" "bigfloatToFloat64"
+literalsBigintToBigfloat  = defineName "literalsBigintToBigfloat" "hydra.lib.literals" "bigintToBigfloat"
+literalsBigintToInt16     = defineName "literalsBigintToInt16" "hydra.lib.literals" "bigintToInt16"
+literalsBigintToInt32     = defineName "literalsBigintToInt32" "hydra.lib.literals" "bigintToInt32"
+literalsBigintToInt64     = defineName "literalsBigintToInt64" "hydra.lib.literals" "bigintToInt64"
+literalsBigintToInt8      = defineName "literalsBigintToInt8" "hydra.lib.literals" "bigintToInt8"
+literalsBigintToUint16    = defineName "literalsBigintToUint16" "hydra.lib.literals" "bigintToUint16"
+literalsBigintToUint32    = defineName "literalsBigintToUint32" "hydra.lib.literals" "bigintToUint32"
+literalsBigintToUint64    = defineName "literalsBigintToUint64" "hydra.lib.literals" "bigintToUint64"
+literalsBigintToUint8     = defineName "literalsBigintToUint8" "hydra.lib.literals" "bigintToUint8"
+literalsBinaryToBytes     = defineName "literalsBinaryToBytes" "hydra.lib.literals" "binaryToBytes"
+literalsBinaryToString    = defineName "literalsBinaryToString" "hydra.lib.literals" "binaryToString"
+literalsFloat32ToBigfloat = defineName "literalsFloat32ToBigfloat" "hydra.lib.literals" "float32ToBigfloat"
+literalsFloat64ToBigfloat = defineName "literalsFloat64ToBigfloat" "hydra.lib.literals" "float64ToBigfloat"
+literalsInt16ToBigint     = defineName "literalsInt16ToBigint" "hydra.lib.literals" "int16ToBigint"
+literalsInt32ToBigint     = defineName "literalsInt32ToBigint" "hydra.lib.literals" "int32ToBigint"
+literalsInt64ToBigint     = defineName "literalsInt64ToBigint" "hydra.lib.literals" "int64ToBigint"
+literalsInt8ToBigint      = defineName "literalsInt8ToBigint" "hydra.lib.literals" "int8ToBigint"
+literalsReadBigfloat      = defineName "literalsReadBigfloat" "hydra.lib.literals" "readBigfloat"
+literalsReadBigint        = defineName "literalsReadBigint" "hydra.lib.literals" "readBigint"
+literalsReadBoolean       = defineName "literalsReadBoolean" "hydra.lib.literals" "readBoolean"
+literalsReadFloat32       = defineName "literalsReadFloat32" "hydra.lib.literals" "readFloat32"
+literalsReadFloat64       = defineName "literalsReadFloat64" "hydra.lib.literals" "readFloat64"
+literalsReadInt16         = defineName "literalsReadInt16" "hydra.lib.literals" "readInt16"
+literalsReadInt32         = defineName "literalsReadInt32" "hydra.lib.literals" "readInt32"
+literalsReadInt64         = defineName "literalsReadInt64" "hydra.lib.literals" "readInt64"
+literalsReadInt8          = defineName "literalsReadInt8" "hydra.lib.literals" "readInt8"
+literalsReadString        = defineName "literalsReadString" "hydra.lib.literals" "readString"
+literalsReadUint16        = defineName "literalsReadUint16" "hydra.lib.literals" "readUint16"
+literalsReadUint32        = defineName "literalsReadUint32" "hydra.lib.literals" "readUint32"
+literalsReadUint64        = defineName "literalsReadUint64" "hydra.lib.literals" "readUint64"
+literalsReadUint8         = defineName "literalsReadUint8" "hydra.lib.literals" "readUint8"
+literalsShowBigfloat      = defineName "literalsShowBigfloat" "hydra.lib.literals" "showBigfloat"
+literalsShowBigint        = defineName "literalsShowBigint" "hydra.lib.literals" "showBigint"
+literalsShowBoolean       = defineName "literalsShowBoolean" "hydra.lib.literals" "showBoolean"
+literalsShowFloat32       = defineName "literalsShowFloat32" "hydra.lib.literals" "showFloat32"
+literalsShowFloat64       = defineName "literalsShowFloat64" "hydra.lib.literals" "showFloat64"
+literalsShowInt16         = defineName "literalsShowInt16" "hydra.lib.literals" "showInt16"
+literalsShowInt32         = defineName "literalsShowInt32" "hydra.lib.literals" "showInt32"
+literalsShowInt64         = defineName "literalsShowInt64" "hydra.lib.literals" "showInt64"
+literalsShowInt8          = defineName "literalsShowInt8" "hydra.lib.literals" "showInt8"
+literalsShowString        = defineName "literalsShowString" "hydra.lib.literals" "showString"
+literalsShowUint16        = defineName "literalsShowUint16" "hydra.lib.literals" "showUint16"
+literalsShowUint32        = defineName "literalsShowUint32" "hydra.lib.literals" "showUint32"
+literalsShowUint64        = defineName "literalsShowUint64" "hydra.lib.literals" "showUint64"
+literalsShowUint8         = defineName "literalsShowUint8" "hydra.lib.literals" "showUint8"
+literalsStringToBinary    = defineName "literalsStringToBinary" "hydra.lib.literals" "stringToBinary"
+literalsUint16ToBigint    = defineName "literalsUint16ToBigint" "hydra.lib.literals" "uint16ToBigint"
+literalsUint32ToBigint    = defineName "literalsUint32ToBigint" "hydra.lib.literals" "uint32ToBigint"
+literalsUint64ToBigint    = defineName "literalsUint64ToBigint" "hydra.lib.literals" "uint64ToBigint"
+literalsUint8ToBigint     = defineName "literalsUint8ToBigint" "hydra.lib.literals" "uint8ToBigint"
+
+-- Logic primitives
+
+logicAnd    = defineName "logicAnd" "hydra.lib.logic" "and"
+logicIfElse = defineName "logicIfElse" "hydra.lib.logic" "ifElse"
+logicNot    = defineName "logicNot" "hydra.lib.logic" "not"
+logicOr     = defineName "logicOr" "hydra.lib.logic" "or"
+
+-- Maps primitives
+
+mapsAlter           = defineName "mapsAlter" "hydra.lib.maps" "alter"
+mapsBimap           = defineName "mapsBimap" "hydra.lib.maps" "bimap"
+mapsDelete          = defineName "mapsDelete" "hydra.lib.maps" "delete"
+mapsElems           = defineName "mapsElems" "hydra.lib.maps" "elems"
+mapsEmpty           = defineName "mapsEmpty" "hydra.lib.maps" "empty"
+mapsFilter          = defineName "mapsFilter" "hydra.lib.maps" "filter"
+mapsFilterWithKey   = defineName "mapsFilterWithKey" "hydra.lib.maps" "filterWithKey"
+mapsFindWithDefault = defineName "mapsFindWithDefault" "hydra.lib.maps" "findWithDefault"
+mapsFromList        = defineName "mapsFromList" "hydra.lib.maps" "fromList"
+mapsInsert          = defineName "mapsInsert" "hydra.lib.maps" "insert"
+mapsKeys            = defineName "mapsKeys" "hydra.lib.maps" "keys"
+mapsLookup          = defineName "mapsLookup" "hydra.lib.maps" "lookup"
+mapsMap             = defineName "mapsMap" "hydra.lib.maps" "map"
+mapsMapKeys         = defineName "mapsMapKeys" "hydra.lib.maps" "mapKeys"
+mapsMember          = defineName "mapsMember" "hydra.lib.maps" "member"
+mapsNull            = defineName "mapsNull" "hydra.lib.maps" "null"
+mapsSingleton       = defineName "mapsSingleton" "hydra.lib.maps" "singleton"
+mapsSize            = defineName "mapsSize" "hydra.lib.maps" "size"
+mapsToList          = defineName "mapsToList" "hydra.lib.maps" "toList"
+mapsUnion           = defineName "mapsUnion" "hydra.lib.maps" "union"
+
+-- Math primitives
+
+mathAbs      = defineName "mathAbs" "hydra.lib.math" "abs"
+mathAcos     = defineName "mathAcos" "hydra.lib.math" "acos"
+mathAcosh    = defineName "mathAcosh" "hydra.lib.math" "acosh"
+mathAdd      = defineName "mathAdd" "hydra.lib.math" "add"
+mathAsin     = defineName "mathAsin" "hydra.lib.math" "asin"
+mathAsinh    = defineName "mathAsinh" "hydra.lib.math" "asinh"
+mathAtan     = defineName "mathAtan" "hydra.lib.math" "atan"
+mathAtan2    = defineName "mathAtan2" "hydra.lib.math" "atan2"
+mathAtanh    = defineName "mathAtanh" "hydra.lib.math" "atanh"
+mathCeiling  = defineName "mathCeiling" "hydra.lib.math" "ceiling"
+mathCos      = defineName "mathCos" "hydra.lib.math" "cos"
+mathCosh     = defineName "mathCosh" "hydra.lib.math" "cosh"
+mathDiv      = defineName "mathDiv" "hydra.lib.math" "div"
+mathE        = defineName "mathE" "hydra.lib.math" "e"
+mathEven     = defineName "mathEven" "hydra.lib.math" "even"
+mathExp      = defineName "mathExp" "hydra.lib.math" "exp"
+mathFloor    = defineName "mathFloor" "hydra.lib.math" "floor"
+mathLog      = defineName "mathLog" "hydra.lib.math" "log"
+mathLogBase  = defineName "mathLogBase" "hydra.lib.math" "logBase"
+mathMax      = defineName "mathMax" "hydra.lib.math" "max"
+mathMin      = defineName "mathMin" "hydra.lib.math" "min"
+mathMod      = defineName "mathMod" "hydra.lib.math" "mod"
+mathMul      = defineName "mathMul" "hydra.lib.math" "mul"
+mathNegate   = defineName "mathNegate" "hydra.lib.math" "negate"
+mathOdd      = defineName "mathOdd" "hydra.lib.math" "odd"
+mathPi       = defineName "mathPi" "hydra.lib.math" "pi"
+mathPow      = defineName "mathPow" "hydra.lib.math" "pow"
+mathPred     = defineName "mathPred" "hydra.lib.math" "pred"
+mathRange    = defineName "mathRange" "hydra.lib.math" "range"
+mathRem          = defineName "mathRem" "hydra.lib.math" "rem"
+mathRound        = defineName "mathRound" "hydra.lib.math" "round"
+mathRoundBigfloat = defineName "mathRoundBigfloat" "hydra.lib.math" "roundBigfloat"
+mathRoundFloat32 = defineName "mathRoundFloat32" "hydra.lib.math" "roundFloat32"
+mathRoundFloat64 = defineName "mathRoundFloat64" "hydra.lib.math" "roundFloat64"
+mathSignum       = defineName "mathSignum" "hydra.lib.math" "signum"
+mathSin      = defineName "mathSin" "hydra.lib.math" "sin"
+mathSinh     = defineName "mathSinh" "hydra.lib.math" "sinh"
+mathSqrt     = defineName "mathSqrt" "hydra.lib.math" "sqrt"
+mathSub      = defineName "mathSub" "hydra.lib.math" "sub"
+mathSucc     = defineName "mathSucc" "hydra.lib.math" "succ"
+mathTan      = defineName "mathTan" "hydra.lib.math" "tan"
+mathTanh     = defineName "mathTanh" "hydra.lib.math" "tanh"
+mathTruncate = defineName "mathTruncate" "hydra.lib.math" "truncate"
+
+-- Maybes primitives
+
+maybesApply     = defineName "maybesApply" "hydra.lib.maybes" "apply"
+maybesBind      = defineName "maybesBind" "hydra.lib.maybes" "bind"
+maybesCases     = defineName "maybesCases" "hydra.lib.maybes" "cases"
+maybesCat       = defineName "maybesCat" "hydra.lib.maybes" "cat"
+maybesCompose   = defineName "maybesCompose" "hydra.lib.maybes" "compose"
+maybesFromJust  = defineName "maybesFromJust" "hydra.lib.maybes" "fromJust"
+maybesFromMaybe = defineName "maybesFromMaybe" "hydra.lib.maybes" "fromMaybe"
+maybesIsJust    = defineName "maybesIsJust" "hydra.lib.maybes" "isJust"
+maybesIsNothing = defineName "maybesIsNothing" "hydra.lib.maybes" "isNothing"
+maybesMap       = defineName "maybesMap" "hydra.lib.maybes" "map"
+maybesMapMaybe  = defineName "maybesMapMaybe" "hydra.lib.maybes" "mapMaybe"
+maybesMaybe     = defineName "maybesMaybe" "hydra.lib.maybes" "maybe"
+maybesPure      = defineName "maybesPure" "hydra.lib.maybes" "pure"
+maybesToList    = defineName "maybesToList" "hydra.lib.maybes" "toList"
+
+-- Pairs primitives
+
+pairsBimap  = defineName "pairsBimap" "hydra.lib.pairs" "bimap"
+pairsFirst  = defineName "pairsFirst" "hydra.lib.pairs" "first"
+pairsSecond = defineName "pairsSecond" "hydra.lib.pairs" "second"
+
+-- Sets primitives
+
+setsDelete       = defineName "setsDelete" "hydra.lib.sets" "delete"
+setsDifference   = defineName "setsDifference" "hydra.lib.sets" "difference"
+setsEmpty        = defineName "setsEmpty" "hydra.lib.sets" "empty"
+setsFromList     = defineName "setsFromList" "hydra.lib.sets" "fromList"
+setsInsert       = defineName "setsInsert" "hydra.lib.sets" "insert"
+setsIntersection = defineName "setsIntersection" "hydra.lib.sets" "intersection"
+setsMap          = defineName "setsMap" "hydra.lib.sets" "map"
+setsMember       = defineName "setsMember" "hydra.lib.sets" "member"
+setsNull         = defineName "setsNull" "hydra.lib.sets" "null"
+setsSingleton    = defineName "setsSingleton" "hydra.lib.sets" "singleton"
+setsSize         = defineName "setsSize" "hydra.lib.sets" "size"
+setsToList       = defineName "setsToList" "hydra.lib.sets" "toList"
+setsUnion        = defineName "setsUnion" "hydra.lib.sets" "union"
+setsUnions       = defineName "setsUnions" "hydra.lib.sets" "unions"
+
+-- Regex primitives
+
+regexFind       = defineName "regexFind" "hydra.lib.regex" "find"
+regexFindAll    = defineName "regexFindAll" "hydra.lib.regex" "findAll"
+regexMatches    = defineName "regexMatches" "hydra.lib.regex" "matches"
+regexReplace    = defineName "regexReplace" "hydra.lib.regex" "replace"
+regexReplaceAll = defineName "regexReplaceAll" "hydra.lib.regex" "replaceAll"
+regexSplit      = defineName "regexSplit" "hydra.lib.regex" "split"
+
+-- Strings primitives
+
+stringsCat         = defineName "stringsCat" "hydra.lib.strings" "cat"
+stringsCat2        = defineName "stringsCat2" "hydra.lib.strings" "cat2"
+stringsCharAt      = defineName "stringsCharAt" "hydra.lib.strings" "charAt"
+stringsFromList    = defineName "stringsFromList" "hydra.lib.strings" "fromList"
+stringsIntercalate = defineName "stringsIntercalate" "hydra.lib.strings" "intercalate"
+stringsLength      = defineName "stringsLength" "hydra.lib.strings" "length"
+stringsNull        = defineName "stringsNull" "hydra.lib.strings" "null"
+stringsLines       = defineName "stringsLines" "hydra.lib.strings" "lines"
+stringsSplitOn     = defineName "stringsSplitOn" "hydra.lib.strings" "splitOn"
+stringsToList      = defineName "stringsToList" "hydra.lib.strings" "toList"
+stringsToLower     = defineName "stringsToLower" "hydra.lib.strings" "toLower"
+stringsToUpper     = defineName "stringsToUpper" "hydra.lib.strings" "toUpper"
+stringsUnlines     = defineName "stringsUnlines" "hydra.lib.strings" "unlines"
+
+-- Type class names
+
+typeclassEq  = defineName "typeclassEq" "hydra.typeclass" "Eq"
+typeclassOrd = defineName "typeclassOrd" "hydra.typeclass" "Ord"
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt.hs
@@ -0,0 +1,951 @@
+
+module Hydra.Sources.Kernel.Terms.Adapt where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel hiding (
+  adaptFloatType, adaptDataGraph, adaptGraphSchema, adaptIntegerType, adaptLambdaDomains, adaptLiteral,
+  adaptLiteralType, adaptLiteralTypesMap, adaptLiteralValue, adaptNestedTypes, adaptPrimitive,
+  adaptTerm, adaptTermForLanguage, adaptType, adaptTypeForLanguage, adaptTypeScheme,
+  composeCoders, dataGraphToDefinitions, literalTypeSupported,
+  prepareFloatType, prepareIntegerType, prepareLiteralType, prepareType, prepareSame,
+  pushTypeAppsInward, schemaGraphToDefinitions,
+  simpleLanguageAdapter, termAlternatives, typeAlternatives)
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths    as Paths
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Ast          as Ast
+import qualified Hydra.Dsl.Bootstrap         as Bootstrap
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Errors       as Error
+import qualified Hydra.Dsl.Meta.Graph        as Graph
+import qualified Hydra.Dsl.Json.Model         as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Literals          as Literals
+import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base         as MetaBase
+import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
+import qualified Hydra.Dsl.Meta.Types        as MetaTypes
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms
+import qualified Hydra.Dsl.Prims             as Prims
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Testing      as Testing
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Tests             as Tests
+import qualified Hydra.Dsl.Topology     as Topology
+import qualified Hydra.Dsl.Types             as Types
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
+import qualified Hydra.Dsl.Meta.Variants     as Variants
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                    as I
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+import qualified Data.Maybe                  as Y
+
+import qualified Hydra.Sources.Kernel.Terms.Hoisting    as Hoisting
+import qualified Hydra.Sources.Kernel.Terms.Inference   as Inference
+import qualified Hydra.Sources.Kernel.Terms.Literals    as Literals
+import qualified Hydra.Sources.Kernel.Terms.Names       as Names
+import qualified Hydra.Sources.Kernel.Terms.Reduction   as Reduction
+import qualified Hydra.Sources.Kernel.Terms.Reflect     as Reflect
+import qualified Hydra.Sources.Kernel.Terms.Lexical      as Lexical
+
+import qualified Hydra.Sources.Kernel.Terms.Rewriting   as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Schemas     as Schemas
+import qualified Hydra.Sources.Kernel.Terms.Show.Core   as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors as ShowError
+import qualified Hydra.Sources.Kernel.Terms.Show.Graph  as ShowGraph
+
+
+ns :: Namespace
+ns = Namespace "hydra.adapt"
+
+module_ :: Module
+module_ = Module ns elements
+    [Hoisting.ns, Inference.ns, Lexical.ns, Literals.ns, Names.ns, Reduction.ns, Reflect.ns, Rewriting.ns, Schemas.ns,
+      ShowCore.ns, ShowError.ns, ShowGraph.ns]
+    kernelTypesNamespaces $
+    Just "Simple, one-way adapters for types and terms"
+  where
+    elements = [
+      toTermDefinition adaptFloatType,
+      toTermDefinition adaptDataGraph,
+      toTermDefinition adaptGraphSchema,
+      toTermDefinition adaptIntegerType,
+      toTermDefinition adaptLambdaDomains,
+      toTermDefinition adaptLiteral,
+      toTermDefinition adaptLiteralType,
+      toTermDefinition adaptLiteralTypesMap,
+      toTermDefinition adaptLiteralValue,
+      toTermDefinition adaptNestedTypes,
+      toTermDefinition adaptPrimitive,
+      toTermDefinition adaptTerm,
+      toTermDefinition adaptTermForLanguage,
+      toTermDefinition adaptType,
+      toTermDefinition adaptTypeForLanguage,
+      toTermDefinition adaptTypeScheme,
+      toTermDefinition composeCoders,
+      toTermDefinition dataGraphToDefinitions,
+      toTermDefinition literalTypeSupported,
+      -- TODO: the prepare* functions below duplicate logic already in adaptFloatType, adaptIntegerType,
+      -- adaptLiteralType, etc. They should be simplified or eliminated in favor of those functions.
+      -- They were moved here from hydra.ext.scala.prepare as part of the coder standardization effort.
+      toTermDefinition prepareFloatType,
+      toTermDefinition prepareIntegerType,
+      toTermDefinition prepareLiteralType,
+      toTermDefinition prepareType,
+      toTermDefinition prepareSame,
+      toTermDefinition pushTypeAppsInward,
+      toTermDefinition schemaGraphToDefinitions,
+      toTermDefinition simpleLanguageAdapter,
+      toTermDefinition termAlternatives,
+      toTermDefinition typeAlternatives]
+
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
+formatDecodingError :: TTerm (InContext DecodingError -> String)
+formatDecodingError = "ic" ~> unwrap _DecodingError @@ Ctx.inContextObject (var "ic")
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+adaptFloatType :: TBinding (LanguageConstraints -> FloatType -> Maybe FloatType)
+adaptFloatType = define "adaptFloatType" $
+  doc "Attempt to adapt a floating-point type using the given language constraints" $
+  "constraints" ~> "ft" ~>
+  "supported" <~ Sets.member (var "ft") (Coders.languageConstraintsFloatTypes $ var "constraints") $
+  "alt" <~ (adaptFloatType @@ var "constraints") $
+  "forUnsupported" <~ ("ft" ~> cases _FloatType (var "ft")
+    Nothing [
+--    _FloatType_bigfloat>>: constant nothing,
+    _FloatType_bigfloat>>: constant $ var "alt" @@ Core.floatTypeFloat64, -- TODO: temporary; the only non-lossy alternative for bigfloat is string, but some migration is needed
+    _FloatType_float32>>: constant $ var "alt" @@ Core.floatTypeFloat64,
+    _FloatType_float64>>: constant $ var "alt" @@ Core.floatTypeBigfloat]) $
+  Logic.ifElse (var "supported")
+    (just $ var "ft")
+    (var "forUnsupported" @@ var "ft")
+
+adaptDataGraph :: TBinding (LanguageConstraints -> Bool -> [Binding] -> Context -> Graph -> Prelude.Either String (Graph, [Binding]))
+adaptDataGraph = define "adaptDataGraph" $
+  doc ("Adapt a graph and its schema to the given language constraints."
+    <> " The doExpand flag controls eta expansion of partial applications."
+    <> " Adaptation is type-preserving: binding-level TypeSchemes are adapted (not stripped)."
+    <> " Note: case statement hoisting is done separately, prior to adaptation."
+    <> " The els0 parameter provides the original ordered bindings."
+    <> " Returns both the adapted graph and the ordered adapted bindings.") $
+  "constraints" ~> "doExpand" ~> "els0" ~> "cx" ~> "graph0" ~>
+  "transform" <~ ("g" ~> "gterm" ~>
+    "tx" <~ var "g" $
+    -- Order of operations:
+    -- 1. Unshadow variables first (prevents capture issues in eta expansion)
+    -- 2. Eta expand (needs type annotations; creates fully-applied functions)
+    -- 3. Lift lambdas above lets (structural cleanup)
+    "gterm1" <~ Rewriting.unshadowVariables @@ (pushTypeAppsInward @@ var "gterm") $
+    "gterm2" <~ Rewriting.unshadowVariables @@ (Logic.ifElse (var "doExpand")
+      (pushTypeAppsInward @@ (Reduction.etaExpandTermNew @@ var "tx" @@ var "gterm1"))
+      (var "gterm1")) $
+    Rewriting.liftLambdaAboveLet @@ var "gterm2") $
+  "litmap" <~ adaptLiteralTypesMap @@ var "constraints" $
+  "prims0" <~ Graph.graphPrimitives (var "graph0") $
+  "schemaTypes0" <~ Graph.graphSchemaTypes (var "graph0") $
+  -- Adapt schema types
+  "schemaBindings" <~ Schemas.typesToElements @@ Maps.map ("ts" ~> Rewriting.typeSchemeToFType @@ var "ts") (var "schemaTypes0") $
+  "schemaResult" <<~ Logic.ifElse (Maps.null (var "schemaTypes0"))
+    (right (Maps.empty :: TTerm (M.Map Name TypeScheme)))
+    ("tmap0" <<~ Eithers.bimap formatDecodingError ("x" ~> var "x") (Schemas.graphAsTypes @@ var "cx" @@ var "graph0" @@ var "schemaBindings") $
+      "tmap1" <<~ adaptGraphSchema @@ var "constraints" @@ var "litmap" @@ var "tmap0" $
+      right $ Maps.map ("t" ~> Schemas.typeToTypeScheme @@ var "t") (var "tmap1")) $
+  "adaptedSchemaTypes" <~ var "schemaResult" $
+  "gterm0" <~ Core.termLet (Core.let_ (var "els0") Core.termUnit) $
+  "gterm1" <~ Logic.ifElse (var "doExpand")
+    (var "transform" @@ var "graph0" @@ var "gterm0")
+    (var "gterm0") $
+  "gterm2" <<~ adaptTerm @@ var "constraints" @@ var "litmap" @@ var "cx" @@ var "graph0" @@ var "gterm1" $
+  -- Adapt lambda domains in the adapted term.
+  -- Lambda domains carry pre-adaptation types (e.g. bigfloat) that must be adapted to match
+  -- the post-adaptation terms (e.g. float64). This preserves type annotations.
+  "gterm3" <<~ Rewriting.rewriteTermM @@ (adaptLambdaDomains @@ var "constraints" @@ var "litmap") @@ var "gterm2" $
+  "els1Raw" <~ Schemas.termAsBindings @@ var "gterm3" $
+
+  -- Adapt nested let binding TypeSchemes within each top-level binding's term.
+  -- These TypeSchemes may carry stale types from JSON modules (e.g. bigfloat→float64).
+  -- Applied per-binding AFTER termAsBindings so that top-level binding TypeSchemes
+  -- (which carry type-class constraints like Ord) are preserved.
+  -- Process each binding: adapt nested let TypeSchemes AND adapt top-level TypeSchemes.
+  -- Adapting (rather than stripping) TypeSchemes converts stale types like bigfloat→float64
+  -- while preserving type-class constraints like Ord needed by decodeSet.
+  "processBinding" <~ ("el" ~>
+    "newTerm" <<~ Rewriting.rewriteTermM @@ (adaptNestedTypes @@ var "constraints" @@ var "litmap") @@ (Core.bindingTerm $ var "el") $
+    "adaptedType" <<~ optCases (Core.bindingType $ var "el")
+      (right nothing)
+      ("ts" ~>
+        "ts1" <<~ adaptTypeScheme @@ var "constraints" @@ var "litmap" @@ var "ts" $
+        right $ just $ var "ts1") $
+    right $ Core.binding
+      (Core.bindingName $ var "el")
+      (var "newTerm")
+      (var "adaptedType")) $
+  "els1" <<~ Eithers.mapList (var "processBinding") (var "els1Raw") $
+  "primPairs" <<~ Eithers.mapList ("kv" ~>
+    "prim1" <<~ adaptPrimitive @@ var "constraints" @@ var "litmap" @@ (Pairs.second $ var "kv") $
+    right $ pair (Pairs.first $ var "kv") (var "prim1")) (Maps.toList (var "prims0")) $
+  "prims1" <~ Maps.fromList (var "primPairs") $
+  "adaptedGraphRaw" <~ (Lexical.buildGraph @@ var "els1" @@ Maps.empty @@ var "prims1") $
+  "adaptedGraph" <~ Graph.graphWithSchemaTypes (var "adaptedGraphRaw") (var "adaptedSchemaTypes") $
+  right $ pair (var "adaptedGraph") (var "els1")
+
+-- | Rewrite callback for adapting lambda domains in a term.
+-- Dispatches on Term variants: for TermFunction, adapts the lambda domain type;
+-- for all other variants, returns the term unchanged.
+-- This is a top-level function (not inline) so the Python code generator can emit match statements.
+adaptLambdaDomains :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> (Term -> Prelude.Either String Term) -> Term -> Prelude.Either String Term)
+adaptLambdaDomains = define "adaptLambdaDomains" $
+  doc "Rewrite callback for adapting lambda domain types in a term" $
+  "constraints" ~> "litmap" ~> "recurse" ~> "term" ~>
+  "rewritten" <<~ var "recurse" @@ var "term" $
+  cases _Term (var "rewritten")
+    (Just $ right $ var "rewritten") [
+    _Term_function>>: "f" ~>
+      cases _Function (var "f")
+        (Just $ right $ Core.termFunction $ var "f") [
+        _Function_lambda>>: "l" ~>
+          "adaptedDomain" <<~ optCases (Core.lambdaDomain $ var "l")
+            (right nothing)
+            ("dom" ~>
+              "dom1" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ var "dom" $
+              right $ just $ var "dom1") $
+          right $ Core.termFunction $ Core.functionLambda $ Core.lambda
+            (Core.lambdaParameter $ var "l")
+            (var "adaptedDomain")
+            (Core.lambdaBody $ var "l")]]
+
+-- | Rewrite callback for adapting nested let binding TypeSchemes in a term.
+-- Dispatches on Term variants: for TermLet, adapts the binding TypeSchemes;
+-- for all other variants, returns the term unchanged.
+-- This is a top-level function (not inline) so the Python code generator can emit match statements.
+adaptNestedTypes :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> (Term -> Prelude.Either String Term) -> Term -> Prelude.Either String Term)
+adaptNestedTypes = define "adaptNestedTypes" $
+  doc "Rewrite callback for adapting nested let binding TypeSchemes in a term" $
+  "constraints" ~> "litmap" ~> "recurse" ~> "term" ~>
+  "rewritten" <<~ var "recurse" @@ var "term" $
+  cases _Term (var "rewritten")
+    (Just $ right $ var "rewritten") [
+    _Term_let>>: "lt" ~>
+      "adaptB" <~ ("b" ~>
+        "adaptedBType" <<~ optCases (Core.bindingType $ var "b")
+          (right nothing)
+          ("ts" ~>
+            "ts1" <<~ adaptTypeScheme @@ var "constraints" @@ var "litmap" @@ var "ts" $
+            right $ just $ var "ts1") $
+        right $ Core.binding
+          (Core.bindingName $ var "b")
+          (Core.bindingTerm $ var "b")
+          (var "adaptedBType")) $
+      "adaptedBindings" <<~ Eithers.mapList (var "adaptB") (Core.letBindings $ var "lt") $
+      right $ Core.termLet $ Core.let_
+        (var "adaptedBindings")
+        (Core.letBody $ var "lt")]
+
+adaptGraphSchema :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> M.Map Name Type -> Prelude.Either String (M.Map Name Type))
+adaptGraphSchema = define "adaptGraphSchema" $
+  doc "Adapt a schema graph to the given language constraints" $
+  "constraints" ~> "litmap" ~> "types0" ~>
+  "mapPair" <~ ("pair" ~>
+    "name" <~ Pairs.first (var "pair") $
+    "typ" <~ Pairs.second (var "pair") $
+    "typ1" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ var "typ" $
+    right $ pair (var "name") (var "typ1")) $
+  "pairs" <<~ Eithers.mapList (var "mapPair") (Maps.toList $ var "types0") $
+  right $ Maps.fromList (var "pairs")
+
+adaptIntegerType :: TBinding (LanguageConstraints -> IntegerType -> Maybe IntegerType)
+adaptIntegerType = define "adaptIntegerType" $
+  doc "Attempt to adapt an integer type using the given language constraints" $
+  "constraints" ~> "it" ~>
+  "supported" <~ Sets.member (var "it") (Coders.languageConstraintsIntegerTypes $ var "constraints") $
+  "alt" <~ (adaptIntegerType @@ var "constraints") $
+  "forUnsupported" <~ ("it" ~> cases _IntegerType (var "it")
+    Nothing [
+    _IntegerType_bigint>>: constant nothing,
+    _IntegerType_int8>>: constant $ var "alt" @@ Core.integerTypeUint16,
+    _IntegerType_int16>>: constant $ var "alt" @@ Core.integerTypeUint32,
+    _IntegerType_int32>>: constant $ var "alt" @@ Core.integerTypeUint64,
+    _IntegerType_int64>>: constant $ var "alt" @@ Core.integerTypeBigint,
+    _IntegerType_uint8>>: constant $ var "alt" @@ Core.integerTypeInt16,
+    _IntegerType_uint16>>: constant $ var "alt" @@ Core.integerTypeInt32,
+    _IntegerType_uint32>>: constant $ var "alt" @@ Core.integerTypeInt64,
+    _IntegerType_uint64>>: constant $ var "alt" @@ Core.integerTypeBigint]) $
+  Logic.ifElse (var "supported")
+    (just $ var "it")
+    (var "forUnsupported" @@ var "it")
+
+adaptLiteral :: TBinding (LiteralType -> Literal -> Literal)
+adaptLiteral = define "adaptLiteral" $
+  doc "Convert a literal to a different type" $
+  "lt" ~> "l" ~>
+  cases _Literal (var "l")
+    Nothing [
+    _Literal_binary>>: "b" ~> cases _LiteralType (var "lt")
+      Nothing [
+      _LiteralType_string>>: constant $ Core.literalString $ Literals.binaryToString $ var "b"],
+    _Literal_boolean>>: "b" ~> cases _LiteralType (var "lt")
+      Nothing [
+      _LiteralType_integer>>: "it" ~> Core.literalInteger $
+        Literals.bigintToIntegerValue @@ var "it" @@ Logic.ifElse (var "b") (bigint 1) (bigint 0)],
+    _Literal_float>>: "f" ~> cases _LiteralType (var "lt")
+      Nothing [
+      _LiteralType_float>>: "ft" ~> Core.literalFloat $
+        Literals.bigfloatToFloatValue @@ var "ft" @@ (Literals.floatValueToBigfloat @@ var "f")],
+    _Literal_integer>>: "i" ~> cases _LiteralType (var "lt")
+      Nothing [
+      _LiteralType_integer>>: "it" ~> Core.literalInteger $
+        Literals.bigintToIntegerValue @@ var "it" @@ (Literals.integerValueToBigint @@ var "i")]]
+
+adaptLiteralType :: TBinding (LanguageConstraints -> LiteralType -> Maybe LiteralType)
+adaptLiteralType = define "adaptLiteralType" $
+  doc "Attempt to adapt a literal type using the given language constraints" $
+  "constraints" ~> "lt" ~>
+  "forUnsupported" <~ ("lt" ~> cases _LiteralType (var "lt")
+    (Just nothing) [
+    _LiteralType_binary>>: constant $ just Core.literalTypeString,
+    _LiteralType_boolean>>: constant $ Maybes.map (unaryFunction Core.literalTypeInteger) $
+      adaptIntegerType @@ var "constraints" @@ Core.integerTypeInt8,
+    _LiteralType_float>>: "ft" ~> Maybes.map (unaryFunction Core.literalTypeFloat) $
+      adaptFloatType @@ var "constraints" @@ var "ft",
+    _LiteralType_integer>>: "it" ~> Maybes.map (unaryFunction Core.literalTypeInteger) $
+      adaptIntegerType @@ var "constraints" @@ var "it"]) $
+  Logic.ifElse (literalTypeSupported @@ var "constraints" @@ var "lt")
+    nothing
+    (var "forUnsupported" @@ var "lt")
+
+adaptLiteralTypesMap :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType)
+adaptLiteralTypesMap = define "adaptLiteralTypesMap" $
+  doc "Derive a map of adapted literal types for the given language constraints" $
+  "constraints" ~>
+  "tryType" <~ ("lt" ~> optCases (adaptLiteralType @@ var "constraints" @@ var "lt")
+    nothing
+    ("lt2" ~> just $ pair (var "lt") (var "lt2"))) $
+  Maps.fromList $ Maybes.cat $ Lists.map (var "tryType") (Reflect.literalTypes)
+
+adaptLiteralValue :: TBinding (M.Map LiteralType LiteralType -> LiteralType -> Literal -> Literal)
+adaptLiteralValue = define "adaptLiteralValue" $
+  doc "Adapt a literal value using the given language constraints" $
+  "litmap" ~> "lt" ~> "l" ~> optCases (Maps.lookup (var "lt") (var "litmap"))
+    (Core.literalString $ ShowCore.literal @@ var "l")
+    ("lt2" ~> adaptLiteral @@ var "lt2" @@ var "l")
+
+adaptPrimitive :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> Primitive -> Prelude.Either String Primitive)
+adaptPrimitive = define "adaptPrimitive" $
+  doc "Adapt a primitive to the given language constraints, prior to inference" $
+  "constraints" ~> "litmap" ~> "prim0" ~>
+  "ts0" <~ Graph.primitiveType (var "prim0") $
+  "ts1" <<~ adaptTypeScheme @@ var "constraints" @@ var "litmap" @@ var "ts0" $
+  right $ Graph.primitiveWithType (var "prim0") (var "ts1")
+
+-- Note: this function could be made more efficient through precomputation of alternatives,
+--       similar to what is done for literals.
+adaptTerm :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> Context -> Graph -> Term -> Prelude.Either String Term)
+adaptTerm = define "adaptTerm" $
+  doc "Adapt a term using the given language constraints" $
+  "constraints" ~> "litmap" ~> "cx" ~> "graph" ~> "term0" ~>
+  "rewrite" <~ ("recurse" ~> "term0" ~> lets [
+    "forSupported">: ("term" ~> cases _Term (var "term")
+      (Just $ right $ just $ var "term") [
+      _Term_literal>>: "l" ~>
+        "lt" <~ Reflect.literalType @@ var "l" $
+        right $ just $ Logic.ifElse (literalTypeSupported @@ var "constraints" @@ var "lt")
+          (var "term")
+          (Core.termLiteral $ adaptLiteralValue @@ var "litmap" @@ var "lt" @@ var "l")]),
+    "forUnsupported">: ("term" ~> lets [
+      "forNonNull">: ("alts" ~>
+        "mterm" <<~ var "tryTerm" @@ Lists.head (var "alts") $
+        optCases (var "mterm")
+          (var "tryAlts" @@ Lists.tail (var "alts"))
+          ("t" ~> right $ just $ var "t")),
+      "tryAlts">: ("alts" ~> Logic.ifElse (Lists.null $ var "alts")
+        (right nothing)
+        (var "forNonNull" @@ var "alts"))] $
+      "alts0" <<~ termAlternatives @@ var "cx" @@ var "graph" @@ var "term" $
+      var "tryAlts" @@ var "alts0"),
+    "tryTerm">: ("term" ~>
+      "supportedVariant" <~ Sets.member
+        (Reflect.termVariant @@ var "term")
+        (Coders.languageConstraintsTermVariants $ var "constraints") $
+      Logic.ifElse (var "supportedVariant")
+        (var "forSupported" @@ var "term")
+        (var "forUnsupported" @@ var "term"))] $
+    "term1" <<~ var "recurse" @@ var "term0" $
+    -- Type application/lambda wrappers pass through unconditionally.
+    -- fsub already recursed into their bodies; we must not strip the wrappers
+    -- because they carry type information needed by typeOf in the coders.
+    cases _Term (var "term1")
+      (Just $
+        "mterm" <<~ var "tryTerm" @@ var "term1" $
+        optCases (var "mterm")
+          (left $ (string "no alternatives for term: ") ++ (ShowCore.term @@ var "term1"))
+          ("term2" ~> right $ var "term2"))
+      [_Term_typeApplication>>: "ta" ~>
+         "atyp" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ (Core.typeApplicationTermType $ var "ta") $
+         right $ Core.termTypeApplication $ Core.typeApplicationTerm
+           (Core.typeApplicationTermBody $ var "ta")
+           (var "atyp"),
+       _Term_typeLambda>>:      "_" ~> right $ var "term1"]) $
+  Rewriting.rewriteTermM @@ var "rewrite" @@ var "term0"
+
+adaptType :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> Type -> Prelude.Either String Type)
+adaptType = define "adaptType" $
+  doc "Adapt a type using the given language constraints" $
+  "constraints" ~> "litmap" ~> "type0" ~>
+  lets [
+  "forSupported">: ("typ" ~> cases _Type (var "typ")
+    (Just $ just $ var "typ") [
+    _Type_literal>>: "lt" ~> Logic.ifElse (literalTypeSupported @@ var "constraints" @@ var "lt")
+      (just $ var "typ")
+      (optCases (Maps.lookup (var "lt") (var "litmap"))
+        (just $ Core.typeLiteral Core.literalTypeString)
+        ("lt2" ~> just $ Core.typeLiteral $ var "lt2"))]),
+  "forUnsupported">: ("typ" ~>
+    "tryAlts" <~ ("alts" ~> Logic.ifElse (Lists.null $ var "alts")
+      nothing
+      (optCases (var "tryType" @@ Lists.head (var "alts"))
+        (var "tryAlts" @@ Lists.tail (var "alts"))
+        ("t" ~> just $ var "t"))) $
+    "alts0" <~ typeAlternatives @@ var "typ" $
+    var "tryAlts" @@ var "alts0"),
+  "tryType">: ("typ" ~>
+    "supportedVariant" <~ Sets.member
+      (Reflect.typeVariant @@ var "typ")
+      (Coders.languageConstraintsTypeVariants $ var "constraints") $
+    Logic.ifElse (var "supportedVariant")
+      (var "forSupported" @@ var "typ")
+      (var "forUnsupported" @@ var "typ"))] $
+  "rewrite" <~ ("recurse" ~> "typ" ~>
+    "type1" <<~ var "recurse" @@ var "typ" $
+    optCases (var "tryType" @@ var "type1")
+      (left $ (string "no alternatives for type: ") ++ (ShowCore.type_ @@ var "typ"))
+      ("type2" ~> right $ var "type2")) $
+  Rewriting.rewriteTypeM @@ var "rewrite" @@ var "type0"
+
+adaptTypeScheme :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> TypeScheme -> Prelude.Either String TypeScheme)
+adaptTypeScheme = define "adaptTypeScheme" $
+  doc "Adapt a type scheme to the given language constraints, prior to inference" $
+  "constraints" ~> "litmap" ~> "ts0" ~>
+  "vars0" <~ Core.typeSchemeVariables (var "ts0") $
+  "t0" <~ Core.typeSchemeType (var "ts0") $
+  "t1" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ var "t0" $
+  right $ Core.typeScheme (var "vars0") (var "t1") (Core.typeSchemeConstraints (var "ts0"))
+
+pushTypeAppsInward :: TBinding (Term -> Term)
+pushTypeAppsInward = define "pushTypeAppsInward" $
+  doc ("Normalize a term by pushing TermTypeApplication inward past TermApplication and"
+    <> " TermFunction (Lambda). This corrects structures produced by poly-let hoisting and"
+    <> " eta expansion, where type applications from inference end up wrapping term"
+    <> " applications or lambda abstractions instead of being directly on the polymorphic variable.") $
+  "term" ~>
+  lets [
+  "push">: ("body" ~> "typ" ~> cases _Term (var "body")
+    -- Default: keep TypeApp as-is
+    (Just $ Core.termTypeApplication $ Core.typeApplicationTerm (var "body") (var "typ")) [
+    -- TypeApp(App(f, arg), τ) → go(App(TypeApp(f, τ), arg))
+    _Term_application>>: "a" ~> var "go" @@
+      (Core.termApplication $ Core.application
+        (Core.termTypeApplication $ Core.typeApplicationTerm
+          (Core.applicationFunction $ var "a")
+          (var "typ"))
+        (Core.applicationArgument $ var "a")),
+    -- TypeApp(Lambda(v, d, body), τ) → go(Lambda(v, d, TypeApp(body, τ)))
+    _Term_function>>: "f" ~> cases _Function (var "f")
+      (Just $ Core.termTypeApplication $ Core.typeApplicationTerm
+        (Core.termFunction $ var "f") (var "typ")) [
+      _Function_lambda>>: "l" ~> var "go" @@
+        (Core.termFunction $ Core.functionLambda $ Core.lambda
+          (Core.lambdaParameter $ var "l")
+          (Core.lambdaDomain $ var "l")
+          (Core.termTypeApplication $ Core.typeApplicationTerm
+            (Core.lambdaBody $ var "l")
+            (var "typ")))],
+    -- TypeApp(Let(bindings, body), τ) → go(Let(bindings, TypeApp(body, τ)))
+    _Term_let>>: "lt" ~> var "go" @@
+      (Core.termLet $ Core.let_
+        (Core.letBindings $ var "lt")
+        (Core.termTypeApplication $ Core.typeApplicationTerm
+          (Core.letBody $ var "lt")
+          (var "typ")))]),
+  "go">: ("t" ~>
+    "forField" <~ ("fld" ~> Core.fieldWithTerm (var "fld") (var "go" @@ (Core.fieldTerm $ var "fld"))) $
+    "forElimination" <~ ("elm" ~> cases _Elimination (var "elm") Nothing [
+      _Elimination_record>>: "p" ~> Core.eliminationRecord (var "p"),
+      _Elimination_union>>: "cs" ~> Core.eliminationUnion $ Core.caseStatement
+        (Core.caseStatementTypeName $ var "cs")
+        (Maybes.map (var "go") (Core.caseStatementDefault $ var "cs"))
+        (Lists.map (var "forField") (Core.caseStatementCases $ var "cs")),
+      _Elimination_wrap>>: "name" ~> Core.eliminationWrap $ var "name"]) $
+    "forFunction" <~ ("fun" ~> cases _Function (var "fun") Nothing [
+      _Function_elimination>>: "elm" ~> Core.functionElimination $ var "forElimination" @@ var "elm",
+      _Function_lambda>>: "l" ~> Core.functionLambda $ Core.lambda
+        (Core.lambdaParameter $ var "l")
+        (Core.lambdaDomain $ var "l")
+        (var "go" @@ (Core.lambdaBody $ var "l")),
+      _Function_primitive>>: "name" ~> Core.functionPrimitive $ var "name"]) $
+    "forLet" <~ ("lt" ~>
+      "mapBinding" <~ ("b" ~> Core.binding
+        (Core.bindingName $ var "b")
+        (var "go" @@ (Core.bindingTerm $ var "b"))
+        (Core.bindingType $ var "b")) $
+      Core.let_
+        (Lists.map (var "mapBinding") (Core.letBindings $ var "lt"))
+        (var "go" @@ (Core.letBody $ var "lt"))) $
+    "forMap" <~ ("m" ~>
+      "forPair" <~ ("p" ~> pair (var "go" @@ (Pairs.first $ var "p")) (var "go" @@ (Pairs.second $ var "p"))) $
+      Maps.fromList $ Lists.map (var "forPair") $ Maps.toList $ var "m") $
+    cases _Term (var "t") Nothing [
+      _Term_annotated>>: "at" ~> Core.termAnnotated $ Core.annotatedTerm
+        (var "go" @@ (Core.annotatedTermBody $ var "at"))
+        (Core.annotatedTermAnnotation $ var "at"),
+      _Term_application>>: "a" ~> Core.termApplication $ Core.application
+        (var "go" @@ (Core.applicationFunction $ var "a"))
+        (var "go" @@ (Core.applicationArgument $ var "a")),
+      _Term_either>>: "e" ~> Core.termEither $ Eithers.either_
+        ("l" ~> left $ var "go" @@ var "l")
+        ("r" ~> right $ var "go" @@ var "r")
+        (var "e"),
+      _Term_function>>: "fun" ~> Core.termFunction $ var "forFunction" @@ var "fun",
+      _Term_let>>: "lt" ~> Core.termLet $ var "forLet" @@ var "lt",
+      _Term_list>>: "els" ~> Core.termList $ Lists.map (var "go") (var "els"),
+      _Term_literal>>: "v" ~> Core.termLiteral $ var "v",
+      _Term_map>>: "m" ~> Core.termMap $ var "forMap" @@ var "m",
+      _Term_maybe>>: "m" ~> Core.termMaybe $ Maybes.map (var "go") (var "m"),
+      _Term_pair>>: "p" ~> Core.termPair $ pair
+        (var "go" @@ (Pairs.first $ var "p"))
+        (var "go" @@ (Pairs.second $ var "p")),
+      _Term_record>>: "r" ~> Core.termRecord $ Core.record
+        (Core.recordTypeName $ var "r")
+        (Lists.map (var "forField") (Core.recordFields $ var "r")),
+      _Term_set>>: "s" ~> Core.termSet $ Sets.fromList $ Lists.map (var "go") $ Sets.toList (var "s"),
+      _Term_typeApplication>>: "tt" ~>
+        "body1" <~ var "go" @@ (Core.typeApplicationTermBody $ var "tt") $
+        var "push" @@ var "body1" @@ (Core.typeApplicationTermType $ var "tt"),
+      _Term_typeLambda>>: "ta" ~> Core.termTypeLambda $ Core.typeLambda
+        (Core.typeLambdaParameter $ var "ta")
+        (var "go" @@ (Core.typeLambdaBody $ var "ta")),
+      _Term_union>>: "i" ~> Core.termUnion $ Core.injection
+        (Core.injectionTypeName $ var "i")
+        (var "forField" @@ (Core.injectionField $ var "i")),
+      _Term_unit>>: constant Core.termUnit,
+      _Term_variable>>: "v" ~> Core.termVariable $ var "v",
+      _Term_wrap>>: "wt" ~> Core.termWrap $ Core.wrappedTerm
+        (Core.wrappedTermTypeName $ var "wt")
+        (var "go" @@ (Core.wrappedTermBody $ var "wt"))])] $
+  var "go" @@ var "term"
+
+dataGraphToDefinitions :: TBinding (LanguageConstraints -> Bool -> Bool -> Bool -> Bool -> [Binding] -> Graph -> [Namespace] -> Context -> Prelude.Either String (Graph, [[TermDefinition]]))
+dataGraphToDefinitions = define "dataGraphToDefinitions" $
+  doc ("Given a data graph along with language constraints, original ordered bindings, and a designated list of namespaces,"
+    <> " adapt the graph to the language constraints,"
+    <> " then return the processed graph along with term definitions grouped by namespace (in the order of the input namespaces)."
+    <> " Inference is performed before adaptation if bindings lack type annotations."
+    <> " Hoisting must preserve type schemes; if any binding loses its type scheme after hoisting, the pipeline fails."
+    <> " Adaptation preserves type application/lambda wrappers and adapts embedded types."
+    <> " Post-adaptation inference is performed to ensure binding TypeSchemes are fully consistent."
+    <> " The doExpand flag controls eta expansion."
+    <> " The doHoistCaseStatements flag controls case statement hoisting (needed for Python)."
+    <> " The doHoistPolymorphicLetBindings flag controls polymorphic let binding hoisting (needed for Java)."
+    <> " The originalBindings parameter provides the original ordered bindings (from module elements).") $
+  "constraints" ~>
+  "doInfer" ~> "doExpand" ~> "doHoistCaseStatements" ~> "doHoistPolymorphicLetBindings" ~>
+  "originalBindings" ~> "graph0" ~> "namespaces" ~> "cx" ~>
+
+  "namespacesSet" <~ Sets.fromList (var "namespaces") $
+
+  "isParentBinding" <~ ("b" ~> optCases (Names.namespaceOf @@ (Core.bindingName $ var "b"))
+    false
+    ("ns" ~> Sets.member (var "ns") (var "namespacesSet"))) $
+
+  -- Steps 0a-2: Case statement hoisting pipeline (only for Python target, currently).
+  -- 0a: Strip type lambdas so case expressions are visible to the hoister
+  --     (the hoister does not traverse into type lambdas).
+  -- 0b: Unshadow variables to prevent capture issues after hoisting.
+  -- 1:  Hoist case statements before inference.
+  -- 2:  Unshadow again after hoisting (hoisting introduces new lambda wrappers).
+  "hoistCases" <~ ("bindings" ~>
+    -- 0a: Strip type lambdas from bindings
+    "stripped" <~ Lists.map ("b" ~>
+        Core.binding (Core.bindingName $ var "b")
+          (Rewriting.stripTypeLambdas @@ (Core.bindingTerm $ var "b"))
+          (Core.bindingType $ var "b"))
+        (var "bindings") $
+    -- 0b: Unshadow variables
+    "term0" <~ Core.termLet (Core.let_ (var "stripped") Core.termUnit) $
+    "unshadowed0" <~ Schemas.termAsBindings @@ (Rewriting.unshadowVariables @@ var "term0") $
+    -- 1: Hoist case statements
+    "hoisted" <~ Hoisting.hoistCaseStatementsInGraph @@ var "unshadowed0" $
+    -- 2: Unshadow again after hoisting
+    "term1" <~ Core.termLet (Core.let_ (var "hoisted") Core.termUnit) $
+    Schemas.termAsBindings @@ (Rewriting.unshadowVariables @@ var "term1")) $
+
+  "hoistPoly" <~ ("bindings" ~>
+    "letBefore" <~ Core.let_ (var "bindings") Core.termUnit $
+    "letAfter" <~ Hoisting.hoistPolymorphicLetBindings @@ var "isParentBinding" @@ var "letBefore" $
+    Core.letBindings $ var "letAfter") $
+
+  -- Note: this is a rough test of typedness, as it only checks that the top-level bindings are typed.
+  "checkBindingsTyped" <~ ("debugLabel" ~> "bindings" ~>
+    "untypedBindings" <~ Lists.map ("b" ~> Core.unName (Core.bindingName $ var "b"))
+      (Lists.filter ("b" ~> Logic.not $ Maybes.isJust (Core.bindingType $ var "b")) (var "bindings")) $
+    Logic.ifElse (Lists.null $ var "untypedBindings")
+      (right $ var "bindings")
+      (left $ Strings.concat [
+        string "Found untyped bindings (", var "debugLabel", string "): ",
+        Strings.intercalate (string ", ") (var "untypedBindings")])) $
+
+  -- Normalize: push type applications inward past applications and lambdas.
+  -- This corrects structures where TypeApp wraps App/Lambda after adaptation and eta expansion.
+  "normalizeBindings" <~ ("bindings" ~>
+    Lists.map ("b" ~> Core.binding
+      (Core.bindingName $ var "b")
+      (pushTypeAppsInward @@ (Core.bindingTerm $ var "b"))
+      (Core.bindingType $ var "b"))
+    (var "bindings")) $
+
+  -- Helper to rebuild a Graph from bindings, reusing graph0's context
+  "rebuildGraph" <~ ("bindings" ~>
+    "g" <~ (Lexical.buildGraph @@ var "bindings" @@ Maps.empty @@ Graph.graphPrimitives (var "graph0")) $
+    Graph.graphWithSchemaTypes (var "g") (Graph.graphSchemaTypes (var "graph0"))) $
+
+  -- Step 1: hoist case statements if needed (currently, for the Python target)
+  -- Use original ordered bindings instead of graphToBindings (which loses order)
+  "bins0" <~ var "originalBindings" $
+  "bins1" <~ Logic.ifElse (var "doHoistCaseStatements")
+    (var "hoistCases" @@ var "bins0")
+    (var "bins0") $
+
+  -- Step 2: infer types if necessary
+  -- inferGraphTypes now takes ordered bindings and returns (Graph, [Binding])
+  "bins2" <<~ Logic.ifElse (var "doInfer")
+     (Eithers.map ("result" ~> Pairs.second (Pairs.first (var "result")))
+       (Eithers.bimap formatError ("x" ~> var "x")
+         (Inference.inferGraphTypes @@ var "cx" @@ var "bins1" @@ (var "rebuildGraph" @@ var "bins1"))))
+     (var "checkBindingsTyped" @@ string "after case hoisting" @@ var "bins1") $
+
+  -- Step 3: hoist let bindings if necessary (currently, for the Java target)
+  "bins3" <<~ Logic.ifElse (var "doHoistPolymorphicLetBindings")
+    (var "checkBindingsTyped" @@ string "after let hoisting"
+      @@ (var "hoistPoly" @@ var "bins2"))
+    (right $ var "bins2") $
+
+  -- Step 4: adapt the graph (includes eta expansion if enabled).
+  -- Adaptation preserves type application/lambda wrappers and adapts embedded types
+  -- (literal types, lambda domains, TypeSchemes).
+  -- Pass ordered bins3 to adaptDataGraph so it uses them instead of graphToBindings.
+  -- adaptDataGraph returns (Graph, [Binding]) preserving binding order.
+  "adaptResult" <<~ adaptDataGraph @@ var "constraints" @@ var "doExpand" @@ var "bins3" @@ var "cx" @@ (var "rebuildGraph" @@ var "bins3") $
+  "adapted" <~ Pairs.first (var "adaptResult") $
+  "adaptedBindings" <~ Pairs.second (var "adaptResult") $
+  "bins4" <<~ var "checkBindingsTyped" @@ (string "after adaptation") @@ var "adaptedBindings" $
+
+  -- Step 5: normalize bindings
+  "bins5" <~ var "normalizeBindings" @@ var "bins4" $
+
+  -- Construct term definitions grouped by namespace
+  "toDef" <~ ("el" ~>
+    Maybes.map
+      ("ts" ~> Module.termDefinition
+        (Core.bindingName $ var "el")
+        (Core.bindingTerm $ var "el")
+        (just $ var "ts"))
+      (Core.bindingType $ var "el")) $
+  -- Filter to elements in the requested namespaces
+  "selectedElements" <~ Lists.filter
+    ("el" ~> optCases (Names.namespaceOf @@ (Core.bindingName $ var "el"))
+      false
+      ("ns" ~> Sets.member (var "ns") (var "namespacesSet")))
+    (var "bins5") $
+  -- Group elements by namespace
+  "elementsByNamespace" <~ Lists.foldl
+    ("acc" ~> "el" ~>
+      optCases (Names.namespaceOf @@ (Core.bindingName $ var "el"))
+        (var "acc")
+        ("ns" ~>
+          "existing" <~ Maybes.maybe (list ([] :: [TTerm Binding])) (unaryFunction Equality.identity) (Maps.lookup (var "ns") (var "acc")) $
+          Maps.insert (var "ns") (Lists.concat2 (var "existing") (list [var "el"])) (var "acc")))
+    Maps.empty
+    (var "selectedElements") $
+  -- Produce definitions in the order of the input namespaces
+  "defsGrouped" <~ Lists.map
+    ("ns" ~>
+      "elsForNs" <~ Maybes.maybe (list ([] :: [TTerm Binding])) (unaryFunction Equality.identity) (Maps.lookup (var "ns") (var "elementsByNamespace")) $
+      Maybes.cat (Lists.map (var "toDef") (var "elsForNs")))
+    (var "namespaces") $
+
+  "g" <~ (Lexical.buildGraph @@ var "bins5" @@ Maps.empty @@ Graph.graphPrimitives (var "adapted")) $
+  right $ pair
+    (Graph.graphWithSchemaTypes (var "g") (Graph.graphSchemaTypes (var "adapted")))
+    (var "defsGrouped")
+
+literalTypeSupported :: TBinding (LanguageConstraints -> LiteralType -> Bool)
+literalTypeSupported = define "literalTypeSupported" $
+  doc "Check if a literal type is supported by the given language constraints" $
+  "constraints" ~> "lt" ~>
+  "forType" <~ ("lt" ~> cases _LiteralType (var "lt")
+    (Just true) [
+      _LiteralType_float>>: "ft" ~> Sets.member (var "ft") (Coders.languageConstraintsFloatTypes $ var "constraints"),
+      _LiteralType_integer>>: "it" ~> Sets.member (var "it") (Coders.languageConstraintsIntegerTypes $ var "constraints")]) $
+  Logic.ifElse
+    (Sets.member
+      (Reflect.literalTypeVariant @@ var "lt")
+      (Coders.languageConstraintsLiteralVariants $ var "constraints"))
+    (var "forType" @@ var "lt")
+    false
+
+schemaGraphToDefinitions :: TBinding (LanguageConstraints -> Graph -> [[Name]] -> Context -> Prelude.Either String (M.Map Name Type, [[TypeDefinition]]))
+schemaGraphToDefinitions = define "schemaGraphToDefinitions" $
+  doc ("Given a schema graph along with language constraints and a designated list of element names,"
+    <> " adapt the graph to the language constraints,"
+    <> " then return a corresponding type definition for each element name.") $
+  "constraints" ~> "graph" ~> "nameLists" ~> "cx" ~>
+  "litmap" <~ adaptLiteralTypesMap @@ var "constraints" $
+  "tmap0" <<~ Eithers.bimap formatDecodingError ("x" ~> var "x") (Schemas.graphAsTypes @@ var "cx" @@ var "graph" @@ (Lexical.graphToBindings @@ var "graph")) $
+  "tmap1" <<~ adaptGraphSchema @@ var "constraints" @@ var "litmap" @@ var "tmap0" $
+  "toDef" <~ ("pair" ~> Module.typeDefinition (Pairs.first $ var "pair") (Pairs.second $ var "pair")) $
+  right $ pair
+    (var "tmap1")
+    (Lists.map
+      ("names" ~> Lists.map (var "toDef") $
+        Lists.map ("n" ~> pair (var "n") (Maybes.fromJust $ Maps.lookup (var "n") (var "tmap1"))) (var "names"))
+      (var "nameLists"))
+
+termAlternatives :: TBinding (Context -> Graph -> Term -> Prelude.Either String [Term])
+termAlternatives = define "termAlternatives" $
+  doc "Find a list of alternatives for a given term, if any" $
+  "cx" ~> "graph" ~> "term" ~> cases _Term (var "term")
+    (Just $ right $ list ([] :: [TTerm Term])) [
+    _Term_annotated>>: "at" ~>
+      "term2" <~ Core.annotatedTermBody (var "at") $
+      right $ list [
+        var "term2"], -- TODO: lossy
+    _Term_maybe>>: "ot" ~> right $ list [
+      Core.termList $ optCases (var "ot")
+        (list ([] :: [TTerm Term]))
+        ("term2" ~> list [var "term2"])],
+    _Term_typeLambda>>: "abs" ~>
+      "term2" <~ Core.typeLambdaBody (var "abs") $
+      right $ list [var "term2"],
+    _Term_typeApplication>>: "ta" ~>
+      "term2" <~ Core.typeApplicationTermBody (var "ta") $
+      right $ list [var "term2"],
+    _Term_union>>: "inj" ~>
+      "tname" <~ Core.injectionTypeName (var "inj") $
+      "field" <~ Core.injectionField (var "inj") $
+      "fname" <~ Core.fieldName (var "field") $
+      "fterm" <~ Core.fieldTerm (var "field") $
+      "forFieldType" <~ ("ft" ~>
+        "ftname" <~ Core.fieldTypeName (var "ft") $
+        Core.field (var "fname") $ Core.termMaybe $ Logic.ifElse (Equality.equal (var "ftname") (var "fname"))
+          (just $ var "fterm")
+          (nothing)) $
+      "rt" <<~ Eithers.bimap formatError ("x" ~> var "x") (Schemas.requireUnionType @@ var "cx" @@ var "graph" @@ var "tname") $
+      right $ list [
+        Core.termRecord $ Core.record (var "tname") (Lists.map (var "forFieldType") (var "rt"))],
+    _Term_unit>>: constant $ right $ list [
+      Core.termLiteral $ Core.literalBoolean true],
+    _Term_wrap>>: "wt" ~>
+      "term2" <~ Core.wrappedTermBody (var "wt") $
+      right $ list [
+         var "term2"]]
+
+typeAlternatives :: TBinding (Type -> [Type])
+typeAlternatives = define "typeAlternatives" $
+  doc "Find a list of alternatives for a given type, if any" $
+  "type" ~> cases _Type (var "type")
+    (Just $ list ([] :: [TTerm Type])) [
+    _Type_annotated>>: "at" ~>
+      "type2" <~ Core.annotatedTypeBody (var "at") $
+       list [var "type2"], -- TODO: lossy
+    _Type_maybe>>: "ot" ~> list [
+      Core.typeList $ var "ot"],
+    _Type_union>>: "rt" ~>
+      "toOptField" <~ ("f" ~> Core.fieldType (Core.fieldTypeName $ var "f") (MetaTypes.optional $ Core.fieldTypeType $ var "f")) $
+      "optFields" <~ Lists.map (var "toOptField") (var "rt") $
+      list [
+        Core.typeRecord (var "optFields")],
+    _Type_unit>>: constant $ list [
+      Core.typeLiteral $ Core.literalTypeBoolean],
+    _Type_void>>: constant $ list [
+      Core.typeUnit]]
+
+adaptTypeForLanguage :: TBinding (Language -> Type -> Prelude.Either String Type)
+adaptTypeForLanguage = define "adaptTypeForLanguage" $
+  doc "Adapt a type using the constraints of a given language" $
+  "lang" ~> "typ" ~>
+  "constraints" <~ Coders.languageConstraints (var "lang") $
+  "litmap" <~ adaptLiteralTypesMap @@ var "constraints" $
+  adaptType @@ var "constraints" @@ var "litmap" @@ var "typ"
+
+adaptTermForLanguage :: TBinding (Language -> Context -> Graph -> Term -> Prelude.Either String Term)
+adaptTermForLanguage = define "adaptTermForLanguage" $
+  doc "Adapt a term using the constraints of a given language" $
+  "lang" ~> "cx" ~> "g" ~> "term" ~>
+  "constraints" <~ Coders.languageConstraints (var "lang") $
+  "litmap" <~ adaptLiteralTypesMap @@ var "constraints" $
+  adaptTerm @@ var "constraints" @@ var "litmap" @@ var "cx" @@ var "g" @@ var "term"
+
+composeCoders :: TBinding (Coder a b -> Coder b c -> Coder a c)
+composeCoders = define "composeCoders" $
+  doc "Compose two coders into a single coder" $
+  "c1" ~> "c2" ~>
+  Util.coder
+    ("cx" ~> "a" ~>
+      "b1" <<~ Util.coderEncode (var "c1") @@ var "cx" @@ var "a" $
+      Util.coderEncode (var "c2") @@ var "cx" @@ var "b1")
+    ("cx" ~> "c" ~>
+      "b2" <<~ Util.coderDecode (var "c2") @@ var "cx" @@ var "c" $
+      Util.coderDecode (var "c1") @@ var "cx" @@ var "b2")
+
+simpleLanguageAdapter :: TBinding (Language -> Context -> Graph -> Type -> Prelude.Either String (Adapter Type Type Term Term))
+simpleLanguageAdapter = define "simpleLanguageAdapter" $
+  doc "Given a target language and a source type, produce an adapter which rewrites the type and its terms according to the language's constraints. The encode direction adapts terms; the decode direction is identity." $
+  "lang" ~> "cx" ~> "g" ~> "typ" ~>
+  "constraints" <~ Coders.languageConstraints (var "lang") $
+  "litmap" <~ adaptLiteralTypesMap @@ var "constraints" $
+  "adaptedType" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ var "typ" $
+  right $ Util.adapter
+    false
+    (var "typ")
+    (var "adaptedType")
+    (Util.coder
+      ("cx" ~> "term" ~>
+        Eithers.bimap ("_s" ~> Ctx.inContext (Error.errorOther $ Error.otherError $ var "_s") (var "cx")) ("_x" ~> var "_x")
+          (adaptTerm @@ var "constraints" @@ var "litmap" @@ var "cx" @@ var "g" @@ var "term"))
+      ("cx" ~> "term" ~> right $ var "term"))
+
+
+--------------------------------------------------------------------------------
+-- Type preparation functions
+-- TODO: these functions duplicate logic already in adaptFloatType, adaptIntegerType,
+-- adaptLiteralType, etc. above. They differ in that they return a triple of
+-- (adapted type, term transformer, diagnostic messages) rather than just the adapted type.
+-- They should be simplified or eliminated in a future refactoring pass.
+--------------------------------------------------------------------------------
+
+-- | Prepare a literal type, substituting unsupported types.
+-- Returns (adapted literal type, literal value transformer, diagnostic messages).
+prepareLiteralType :: TBinding (LiteralType -> (LiteralType, Literal -> Literal, S.Set String))
+prepareLiteralType = define "prepareLiteralType" $
+  doc "Prepare a literal type, substituting unsupported types" $
+  lambda "at" $
+    (cases _LiteralType (var "at") (Just (prepareSame @@ var "at")) [
+      _LiteralType_binary>>: (constant $
+        triple
+          (Core.literalTypeString)
+          ("v" ~> cases _Literal (var "v") (Just (var "v")) [
+            _Literal_binary>>: ("b" ~> inject _Literal _Literal_string (Literals.binaryToString (var "b")))])
+          (Sets.fromList $ list [string "replace binary strings with character strings"])),
+      _LiteralType_float>>: ("ft" ~> lets [
+        "result">: prepareFloatType @@ var "ft",
+        "rtyp">: Pairs.first (var "result"),
+        "rep">: Pairs.first (Pairs.second (var "result")),
+        "msgs">: Pairs.second (Pairs.second (var "result"))] $
+        triple
+          (Core.literalTypeFloat (var "rtyp"))
+          ("v" ~> cases _Literal (var "v") (Just (var "v")) [
+            _Literal_float>>: ("fv" ~> inject _Literal _Literal_float (var "rep" @@ var "fv"))])
+          (var "msgs")),
+      _LiteralType_integer>>: ("it" ~> lets [
+        "result">: prepareIntegerType @@ var "it",
+        "rtyp">: Pairs.first (var "result"),
+        "rep">: Pairs.first (Pairs.second (var "result")),
+        "msgs">: Pairs.second (Pairs.second (var "result"))] $
+        triple
+          (Core.literalTypeInteger (var "rtyp"))
+          ("v" ~> cases _Literal (var "v") (Just (var "v")) [
+            _Literal_integer>>: ("iv" ~> inject _Literal _Literal_integer (var "rep" @@ var "iv"))])
+          (var "msgs"))])
+
+-- | Prepare a float type, substituting unsupported types.
+prepareFloatType :: TBinding (FloatType -> (FloatType, FloatValue -> FloatValue, S.Set String))
+prepareFloatType = define "prepareFloatType" $
+  doc "Prepare a float type, substituting unsupported types" $
+  lambda "ft" $
+    (cases _FloatType (var "ft") (Just (prepareSame @@ var "ft")) [
+      _FloatType_bigfloat>>: (constant $
+        triple
+          Core.floatTypeFloat64
+          ("v" ~> cases _FloatValue (var "v") (Just (var "v")) [
+            _FloatValue_bigfloat>>: ("d" ~> inject _FloatValue _FloatValue_float64 (Literals.bigfloatToFloat64 (var "d")))])
+          (Sets.fromList $ list [string "replace arbitrary-precision floating-point numbers with 64-bit floating-point numbers (doubles)"]))])
+
+-- | Prepare an integer type, substituting unsupported types.
+prepareIntegerType :: TBinding (IntegerType -> (IntegerType, IntegerValue -> IntegerValue, S.Set String))
+prepareIntegerType = define "prepareIntegerType" $
+  doc "Prepare an integer type, substituting unsupported types" $
+  lambda "it" $
+    (cases _IntegerType (var "it") (Just (prepareSame @@ var "it")) [
+      _IntegerType_bigint>>: (constant $
+        triple
+          Core.integerTypeInt64
+          ("v" ~> cases _IntegerValue (var "v") (Just (var "v")) [
+            _IntegerValue_bigint>>: ("i" ~> inject _IntegerValue _IntegerValue_int64 (Literals.bigintToInt64 (var "i")))])
+          (Sets.fromList $ list [string "replace arbitrary-precision integers with 64-bit integers"])),
+      _IntegerType_uint8>>: (constant $
+        triple
+          Core.integerTypeInt8
+          ("v" ~> cases _IntegerValue (var "v") (Just (var "v")) [
+            _IntegerValue_uint8>>: ("i" ~> inject _IntegerValue _IntegerValue_int8 (Literals.bigintToInt8 (Literals.uint8ToBigint (var "i"))))])
+          (Sets.fromList $ list [string "replace unsigned 8-bit integers with signed 8-bit integers"])),
+      _IntegerType_uint32>>: (constant $
+        triple
+          Core.integerTypeInt32
+          ("v" ~> cases _IntegerValue (var "v") (Just (var "v")) [
+            _IntegerValue_uint32>>: ("i" ~> inject _IntegerValue _IntegerValue_int32 (Literals.bigintToInt32 (Literals.uint32ToBigint (var "i"))))])
+          (Sets.fromList $ list [string "replace unsigned 32-bit integers with signed 32-bit integers"])),
+      _IntegerType_uint64>>: (constant $
+        triple
+          Core.integerTypeInt64
+          ("v" ~> cases _IntegerValue (var "v") (Just (var "v")) [
+            _IntegerValue_uint64>>: ("i" ~> inject _IntegerValue _IntegerValue_int64 (Literals.bigintToInt64 (Literals.uint64ToBigint (var "i"))))])
+          (Sets.fromList $ list [string "replace unsigned 64-bit integers with signed 64-bit integers"]))])
+
+-- | Prepare a type, substituting unsupported literal types.
+prepareType :: TBinding (Graph -> Type -> (Type, Term -> Term, S.Set String))
+prepareType = define "prepareType" $
+  doc "Prepare a type, substituting unsupported literal types" $
+  lambda "cx" $ lambda "typ" $
+    (cases _Type (Rewriting.deannotateType @@ var "typ") (Just (prepareSame @@ var "typ")) [
+      _Type_literal>>: ("at" ~> lets [
+        "result">: prepareLiteralType @@ var "at",
+        "rtyp">: Pairs.first (var "result"),
+        "rep">: Pairs.first (Pairs.second (var "result")),
+        "msgs">: Pairs.second (Pairs.second (var "result"))] $
+        triple
+          (MetaTypes.literal (var "rtyp"))
+          ("v" ~> cases _Term (var "v") (Just (var "v")) [
+            _Term_literal>>: ("av" ~> inject _Term _Term_literal (var "rep" @@ var "av"))])
+          (var "msgs"))])
+
+-- | Return a value unchanged with identity transform and no messages.
+prepareSame :: TBinding (a -> (a, b -> b, S.Set c))
+prepareSame = define "prepareSame" $
+  doc "Return a value unchanged with identity transform and no messages" $
+  lambda "x" $
+    triple (var "x") ("y" ~> var "y") (Sets.empty)
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Literals.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Literals.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Literals.hs
+++ /dev/null
@@ -1,369 +0,0 @@
-
-module Hydra.Sources.Kernel.Terms.Adapt.Literals where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel hiding (comparePrecision, convertFloatValue, convertIntegerValue, disclaimer, floatAdapter, integerAdapter, literalAdapter)
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils  as AdaptUtils
-import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads       as Monads
-import qualified Hydra.Sources.Kernel.Terms.Reflect      as Reflect
-import qualified Hydra.Sources.Kernel.Terms.Show.Core    as ShowCore
-
-
-ns :: Namespace
-ns = Namespace "hydra.adapt.literals"
-
-module_ :: Module
-module_ = Module ns elements
-    [AdaptUtils.ns, ExtractCore.ns, Monads.ns, Reflect.ns, ShowCore.ns]
-    kernelTypesNamespaces $
-    Just "Adapter framework for literal types and terms"
-  where
-   elements = [
-     toBinding comparePrecision,
-     toBinding convertFloatValue,
-     toBinding convertIntegerValue,
-     toBinding disclaimer,
-     toBinding literalAdapter,
-     toBinding floatAdapter,
-     toBinding integerAdapter]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-comparePrecision :: TBinding (Precision -> Precision -> Comparison)
-comparePrecision = define "comparePrecision" $
-  doc "Compare two precision values" $
-  "p1" ~> "p2" ~>
-  cases _Precision (var "p1")
-    Nothing [
-    _Precision_arbitrary>>: constant (
-      cases _Precision (var "p2")
-        Nothing [
-        _Precision_arbitrary>>: constant Graph.comparisonEqualTo,
-        _Precision_bits>>: constant Graph.comparisonGreaterThan]),
-    _Precision_bits>>: "b1" ~>
-      cases _Precision (var "p2")
-        Nothing [
-        _Precision_arbitrary>>: constant Graph.comparisonLessThan,
-        _Precision_bits>>: "b2" ~>
-          Logic.ifElse (Equality.lt (var "b1") (var "b2"))
-            Graph.comparisonLessThan
-            Graph.comparisonGreaterThan]]
-
-convertFloatValue :: TBinding (FloatType -> FloatValue -> FloatValue)
-convertFloatValue = define "convertFloatValue" $
-  doc "Convert a float value to a different float type" $
-  "target" ~> "fv" ~>
-  "decoder" <~ ("fv" ~>
-    cases _FloatValue (var "fv")
-      Nothing [
-      _FloatValue_bigfloat>>: "d" ~> var "d",
-      _FloatValue_float32>>: "f" ~> Literals.float32ToBigfloat (var "f"),
-      _FloatValue_float64>>: "d" ~> Literals.float64ToBigfloat (var "d")]) $
-  "encoder" <~ ("d" ~>
-    cases _FloatType (var "target")
-      Nothing [
-      _FloatType_bigfloat>>: constant (Core.floatValueBigfloat (var "d")),
-      _FloatType_float32>>: constant (Core.floatValueFloat32 (Literals.bigfloatToFloat32 (var "d"))),
-      _FloatType_float64>>: constant (Core.floatValueFloat64 (Literals.bigfloatToFloat64 (var "d")))]) $
-  var "encoder" @@ (var "decoder" @@ var "fv")
-
-convertIntegerValue :: TBinding (IntegerType -> IntegerValue -> IntegerValue)
-convertIntegerValue = define "convertIntegerValue" $
-  doc "Convert an integer value to a different integer type" $
-  "target" ~> "iv" ~>
-  "decoder" <~ ("iv" ~>
-    cases _IntegerValue (var "iv")
-      Nothing [
-      _IntegerValue_bigint>>: "v" ~> var "v",
-      _IntegerValue_int8>>: "v" ~> Literals.int8ToBigint (var "v"),
-      _IntegerValue_int16>>: "v" ~> Literals.int16ToBigint (var "v"),
-      _IntegerValue_int32>>: "v" ~> Literals.int32ToBigint (var "v"),
-      _IntegerValue_int64>>: "v" ~> Literals.int64ToBigint (var "v"),
-      _IntegerValue_uint8>>: "v" ~> Literals.uint8ToBigint (var "v"),
-      _IntegerValue_uint16>>: "v" ~> Literals.uint16ToBigint (var "v"),
-      _IntegerValue_uint32>>: "v" ~> Literals.uint32ToBigint (var "v"),
-      _IntegerValue_uint64>>: "v" ~> Literals.uint64ToBigint (var "v")]) $
-  "encoder" <~ ("d" ~>
-    cases _IntegerType (var "target")
-      Nothing [
-      _IntegerType_bigint>>: constant (Core.integerValueBigint (var "d")),
-      _IntegerType_int8>>: constant (Core.integerValueInt8 (Literals.bigintToInt8 (var "d"))),
-      _IntegerType_int16>>: constant (Core.integerValueInt16 (Literals.bigintToInt16 (var "d"))),
-      _IntegerType_int32>>: constant (Core.integerValueInt32 (Literals.bigintToInt32 (var "d"))),
-      _IntegerType_int64>>: constant (Core.integerValueInt64 (Literals.bigintToInt64 (var "d"))),
-      _IntegerType_uint8>>: constant (Core.integerValueUint8 (Literals.bigintToUint8 (var "d"))),
-      _IntegerType_uint16>>: constant (Core.integerValueUint16 (Literals.bigintToUint16 (var "d"))),
-      _IntegerType_uint32>>: constant (Core.integerValueUint32 (Literals.bigintToUint32 (var "d"))),
-      _IntegerType_uint64>>: constant (Core.integerValueUint64 (Literals.bigintToUint64 (var "d")))]) $
-  var "encoder" @@ (var "decoder" @@ var "iv")
-
-disclaimer :: TBinding (Bool -> String -> String -> String)
-disclaimer = define "disclaimer" $
-  doc "Generate a disclaimer message for type conversions" $
-  "lossy" ~> "source" ~> "target" ~>
-  Strings.cat (list [
-    string "replace ",
-    var "source",
-    string " with ",
-    var "target",
-    Logic.ifElse (var "lossy") (string " (lossy)") (string "")])
-
-floatAdapter :: TBinding (FloatType -> Flow AdapterContext (SymmetricAdapter s FloatType FloatValue))
-floatAdapter = define "floatAdapter" $
-  doc "Create an adapter for float types" $
-  "ft" ~>
-  "makeAdapter" <~ ("source" ~> "target" ~>
-    "lossy" <~ Equality.equal
-      (comparePrecision
-        @@ (Reflect.floatTypePrecision @@ var "source")
-        @@ (Reflect.floatTypePrecision @@ var "target"))
-      Graph.comparisonGreaterThan $
-    "step" <~ Compute.coder
-      ("fv" ~> produce (convertFloatValue @@ var "target" @@ var "fv"))
-      ("fv" ~> produce (convertFloatValue @@ var "source" @@ var "fv")) $
-    "msg" <~ disclaimer
-      @@ var "lossy"
-      @@ (ShowCore.floatType @@ var "source")
-      @@ (ShowCore.floatType @@ var "target") $
-    Monads.warn
-      @@ var "msg"
-      @@ (produce (Compute.adapter (var "lossy") (var "source") (var "target") (var "step")))) $
-  "altTypes" <~ ("t" ~> cases _FloatType (var "t")
-    Nothing [
-    _FloatType_bigfloat>>: constant (list [Core.floatTypeFloat64, Core.floatTypeFloat32]),
-    _FloatType_float32>>: constant (list [Core.floatTypeFloat64, Core.floatTypeBigfloat]),
-    _FloatType_float64>>: constant (list [Core.floatTypeBigfloat, Core.floatTypeFloat32])]) $
-  "alts" <~ ("t" ~> Flows.mapList (var "makeAdapter" @@ var "t") (var "altTypes" @@ var "t")) $
-  "cx" <<~ Monads.getState $
-  "supported" <~ AdaptUtils.floatTypeIsSupported
-    @@ (Coders.languageConstraintsProjection (Coders.adapterContextLanguage (var "cx"))) $
-  AdaptUtils.chooseAdapter
-    @@ var "alts"
-    @@ var "supported"
-    @@ ShowCore.floatType
-    @@ ShowCore.floatType
-    @@ var "ft"
-
-integerAdapter :: TBinding (IntegerType -> Flow AdapterContext (SymmetricAdapter s IntegerType IntegerValue))
-integerAdapter = define "integerAdapter" $
-  doc "Create an adapter for integer types" $
-  "it" ~>
-  "interleave" <~ ("xs" ~> "ys" ~> Lists.concat (Lists.transpose (list [var "xs", var "ys"]))) $
-  "signedOrdered" <~ Lists.filter
-    ("v" ~> Logic.and
-      (Reflect.integerTypeIsSigned @@ var "v")
-      (Logic.not (Equality.equal (Reflect.integerTypePrecision @@ var "v") Util.precisionArbitrary)))
-    (Reflect.integerTypes) $
-  "unsignedOrdered" <~ Lists.filter
-    ("v" ~> Logic.and
-      (Logic.not (Reflect.integerTypeIsSigned @@ var "v"))
-      (Logic.not (Equality.equal (Reflect.integerTypePrecision @@ var "v") Util.precisionArbitrary)))
-    (Reflect.integerTypes) $
-  "signedPref" <~ var "interleave" @@ var "signedOrdered" @@ var "unsignedOrdered" $
-  "unsignedPref" <~ var "interleave" @@ var "unsignedOrdered" @@ var "signedOrdered" $
-  "signedNonPref" <~ Lists.reverse (var "unsignedPref") $
-  "unsignedNonPref" <~ Lists.reverse (var "signedPref") $
-  "signed" <~ ("i" ~> Lists.concat (list [
-    Lists.drop (Math.mul (var "i") (int32 2)) (var "signedPref"),
-    list [Core.integerTypeBigint],
-    Lists.drop (Math.add (Math.sub (int32 8) (Math.mul (var "i") (int32 2))) (int32 1)) (var "signedNonPref")])) $
-  "unsigned" <~ ("i" ~> Lists.concat (list [
-    Lists.drop (Math.mul (var "i") (int32 2)) (var "unsignedPref"),
-    list [Core.integerTypeBigint],
-    Lists.drop (Math.add (Math.sub (int32 8) (Math.mul (var "i") (int32 2))) (int32 1)) (var "unsignedNonPref")])) $
-  "makeAdapter" <~ ("source" ~> "target" ~>
-    "lossy" <~ Logic.not (Equality.equal
-      (comparePrecision
-        @@ (Reflect.integerTypePrecision @@ var "source")
-        @@ (Reflect.integerTypePrecision @@ var "target"))
-      Graph.comparisonLessThan) $
-    "step" <~ Compute.coder
-      ("iv" ~> produce (convertIntegerValue @@ var "target" @@ var "iv"))
-      ("iv" ~> produce (convertIntegerValue @@ var "source" @@ var "iv")) $
-    "msg" <~ disclaimer
-      @@ var "lossy"
-      @@ (ShowCore.integerType @@ var "source")
-      @@ (ShowCore.integerType @@ var "target") $
-    Monads.warn
-      @@ var "msg"
-      @@ (produce (Compute.adapter (var "lossy") (var "source") (var "target") (var "step")))) $
-  "altTypes" <~ ("t" ~> cases _IntegerType (var "t")
-    Nothing [
-    _IntegerType_bigint>>: constant (Lists.reverse (var "unsignedPref")),
-    _IntegerType_int8>>: constant (var "signed" @@ int32 1),
-    _IntegerType_int16>>: constant (var "signed" @@ int32 2),
-    _IntegerType_int32>>: constant (var "signed" @@ int32 3),
-    _IntegerType_int64>>: constant (var "signed" @@ int32 4),
-    _IntegerType_uint8>>: constant (var "unsigned" @@ int32 1),
-    _IntegerType_uint16>>: constant (var "unsigned" @@ int32 2),
-    _IntegerType_uint32>>: constant (var "unsigned" @@ int32 3),
-    _IntegerType_uint64>>: constant (var "unsigned" @@ int32 4)]) $
-  "alts" <~ ("t" ~> Flows.mapList (var "makeAdapter" @@ var "t") (var "altTypes" @@ var "t")) $
-  "cx" <<~ Monads.getState $
-  "supported" <~ AdaptUtils.integerTypeIsSupported
-    @@ (Coders.languageConstraintsProjection (Coders.adapterContextLanguage (var "cx"))) $
-  AdaptUtils.chooseAdapter
-    @@ var "alts"
-    @@ var "supported"
-    @@ ShowCore.integerType
-    @@ ShowCore.integerType
-    @@ var "it"
-
-literalAdapter :: TBinding (LiteralType -> Flow AdapterContext (SymmetricAdapter s LiteralType Literal))
-literalAdapter = define "literalAdapter" $
-  doc "Create an adapter for literal types" $
-  "lt" ~>
-  "forBinary" <~ ("t" ~>
-    "matchBinary" <~ ("lit" ~> cases _Literal (var "lit")
-      Nothing [
-      _Literal_binary>>: "b" ~> Flows.pure (Core.literalString (Literals.binaryToString (var "b")))]) $
-    "matchString" <~ ("lit" ~> cases _Literal (var "lit")
-      Nothing [
-      _Literal_string>>: "s" ~> Flows.pure (Core.literalBinary (Literals.stringToBinary (var "s")))]) $
-    "step" <~ Compute.coder (var "matchBinary") (var "matchString") $
-    produce (list [Compute.adapter false (var "t") Core.literalTypeString (var "step")])) $
-  "forBoolean" <~ ("t" ~>
-    "matchBoolean" <~ ("step'" ~> "lit" ~> cases _Literal (var "lit")
-      Nothing [
-      _Literal_boolean>>: "bv" ~>
-        "iv" <<~ Compute.coderEncode (var "step'") @@ (Core.integerValueUint8 (Logic.ifElse (var "bv") (uint8 1) (uint8 0))) $
-        produce (Core.literalInteger (var "iv"))]) $
-    "matchInteger" <~ ("step'" ~> "lit" ~>
-      "forValue" <~ ("val" ~> cases _IntegerValue (var "val")
-        Nothing [
-        _IntegerValue_uint8>>: "v" ~> Core.literalBoolean (Equality.equal (var "v") (uint8 1))]) $
-      cases _Literal (var "lit")
-        Nothing [
-        _Literal_integer>>: "iv" ~>
-          "val" <<~ Compute.coderDecode (var "step'") @@ var "iv" $
-          produce $ var "forValue" @@ var "val"]) $
-    "cx" <<~ Monads.getState $
-    "constraints" <~ Coders.languageConstraintsProjection (Coders.adapterContextLanguage (var "cx")) $
-    "hasIntegers" <~ Logic.not (Sets.null (Coders.languageConstraintsIntegerTypes (var "constraints"))) $
-    "hasStrings" <~ Sets.member Variants.literalVariantString (Coders.languageConstraintsLiteralVariants (var "constraints")) $
-    "withIntegers" <~ (
-      "withAdapter" <~ ("adapter" ~>
-        "step'" <~ Compute.adapterCoder (var "adapter") $
-        "step" <~ Compute.coder (var "matchBoolean" @@ var "step'") (var "matchInteger" @@ var "step'") $
-        produce (list [Compute.adapter false (var "t") (Core.literalTypeInteger (Compute.adapterTarget (var "adapter"))) (var "step")])) $
-      "adapter" <<~ integerAdapter @@ Core.integerTypeUint8 $
-      var "withAdapter" @@ var "adapter") $
-    "withStrings" <~ (
-      "encode" <~ ("lit" ~>
-        "b" <<~ ExtractCore.booleanLiteral @@ var "lit" $
-        produce (Core.literalString (Logic.ifElse (var "b") (string "true") (string "false")))) $
-      "decode" <~ ("lit" ~>
-        "s" <<~ ExtractCore.stringLiteral @@ var "lit" $
-        Logic.ifElse (Equality.equal (var "s") (string "true"))
-          (produce (Core.literalBoolean true))
-          (Logic.ifElse (Equality.equal (var "s") (string "false"))
-            (produce (Core.literalBoolean false))
-            (Monads.unexpected @@ (string "boolean literal") @@ var "s"))) $
-      list [Compute.adapter false (var "t") Core.literalTypeString (Compute.coder (var "encode") (var "decode"))]) $
-    Logic.ifElse (var "hasIntegers")
-      (var "withIntegers")
-      (Logic.ifElse (var "hasStrings")
-        (produce $ var "withStrings")
-        (Flows.fail (string "no alternatives available for boolean encoding")))) $
-  "forFloat" <~ ("t" ~> "ft" ~>
-      "withFloats" <~ (
-        "adapt" <~ ("adapter" ~> "dir" ~> "l" ~> cases _Literal (var "l")
-          (Just (Monads.unexpected
-            @@ (string "floating-point literal")
-            @@ (ShowCore.literal @@ var "l"))) [
-          _Literal_float>>: "fv" ~> Flows.map (unaryFunction Core.literalFloat) (
-            AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "adapter")) @@ var "fv")]) $
-        "adapter" <<~ floatAdapter @@ var "ft" $
-        "step" <~ AdaptUtils.bidirectional @@ (var "adapt" @@ var "adapter") $
-        produce (list [Compute.adapter (Compute.adapterIsLossy (var "adapter")) (var "t") (Core.literalTypeFloat (Compute.adapterTarget (var "adapter"))) (var "step")])) $
-      "cx" <<~ Monads.getState $
-      "constraints" <~ Coders.languageConstraintsProjection (Coders.adapterContextLanguage (var "cx")) $
-      "hasFloats" <~ Logic.not (Sets.null (Coders.languageConstraintsFloatTypes (var "constraints"))) $
-      Logic.ifElse (var "hasFloats")
-        (var "withFloats")
-        (Flows.fail (string "no float types available"))) $
-  "forInteger" <~ ("t" ~> "it" ~>
-      "withIntegers" <~ (
-        "adapt" <~ ("adapter" ~> "dir" ~> "lit" ~> cases _Literal (var "lit")
-          (Just (Monads.unexpected
-            @@ (string "integer literal")
-            @@ (ShowCore.literal @@ var "lit"))) [
-          _Literal_integer>>: "iv" ~> Flows.map (unaryFunction Core.literalInteger) (
-            AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "adapter")) @@ var "iv")]) $
-        "adapter" <<~ integerAdapter @@ var "it" $
-        "step" <~ AdaptUtils.bidirectional @@ (var "adapt" @@ var "adapter") $
-        produce (list [Compute.adapter (Compute.adapterIsLossy (var "adapter")) (var "t") (Core.literalTypeInteger (Compute.adapterTarget (var "adapter"))) (var "step")])) $
-      "cx" <<~ Monads.getState $
-      "constraints" <~ Coders.languageConstraintsProjection (Coders.adapterContextLanguage (var "cx")) $
-      "hasIntegers" <~ Logic.not (Sets.null (Coders.languageConstraintsIntegerTypes (var "constraints"))) $
-      Logic.ifElse (var "hasIntegers")
-        (var "withIntegers")
-        (Flows.fail (string "no integer types available"))) $
-  "alts" <~ ("t" ~> cases _LiteralType (var "t")
-    Nothing [
-    _LiteralType_binary>>: constant $ var "forBinary" @@ var "t",
-    _LiteralType_boolean>>: constant $ var "forBoolean" @@ var "t",
-    _LiteralType_float>>: "ft" ~> var "forFloat" @@ var "t" @@ var "ft",
-    _LiteralType_integer>>: "it" ~> var "forInteger" @@ var "t" @@ var "it",
-    _LiteralType_string>>: constant (Flows.fail (string "no substitute for the literal string type"))]) $
-  "cx" <<~ Monads.getState $
-  "supported" <~ AdaptUtils.literalTypeIsSupported @@ (Coders.languageConstraintsProjection (Coders.adapterContextLanguage (var "cx"))) $
-  AdaptUtils.chooseAdapter
-    @@ var "alts"
-    @@ var "supported"
-    @@ ShowCore.literalType
-    @@ ShowCore.literalType
-    @@ var "lt"
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Modules.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Modules.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Modules.hs
+++ /dev/null
@@ -1,182 +0,0 @@
-
-module Hydra.Sources.Kernel.Terms.Adapt.Modules where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel hiding (
-  adaptTypeToLanguageAndEncode, adaptTypeToLanguage, adaptedModuleDefinitions, constructCoder,
-  languageAdapter, transformModule)
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils as AdaptUtils
-import qualified Hydra.Sources.Kernel.Terms.Annotations as Annotations
-import qualified Hydra.Sources.Decode.Core as DecodeCore
-import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
-import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Schemas as Schemas
-import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
-
-
-ns :: Namespace
-ns = Namespace "hydra.adapt.modules"
-
-module_ :: Module
-module_ = Module ns elements
-    [AdaptTerms.ns, AdaptUtils.ns, Annotations.ns, moduleNamespace DecodeCore.module_,
-      Lexical.ns, Monads.ns, Rewriting.ns, Schemas.ns]
-    kernelTypesNamespaces $
-    Just "Entry point for Hydra's adapter (type/term rewriting) framework"
-  where
-   elements = [
-     toBinding adaptTypeToLanguageAndEncode,
-     toBinding adaptTypeToLanguage,
-     toBinding adaptedModuleDefinitions,
-     toBinding constructCoder,
-     toBinding languageAdapter,
-     toBinding transformModule]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-
-adaptTypeToLanguageAndEncode :: TBinding (Language -> (Type -> Flow Graph t) -> Type -> Flow Graph t)
-adaptTypeToLanguageAndEncode = define "adaptTypeToLanguageAndEncode" $
-  doc "Given a target language, an encoding function, and a type, adapt and encode the type" $
-  "lang" ~> "enc" ~> "typ" ~>
-  "dflt" <~ (
-    "adaptedType" <<~ adaptTypeToLanguage @@ var "lang" @@ var "typ" $
-    var "enc" @@ var "adaptedType") $
-  cases _Type (Rewriting.deannotateType @@ var "typ")
-    (Just $ var "dflt") [
-    _Type_variable>>: constant (var "enc" @@ var "typ")]
-
-adaptTypeToLanguage :: TBinding (Language -> Type -> Flow Graph Type)
-adaptTypeToLanguage = define "adaptTypeToLanguage" $
-  doc "Given a target language and a source type, find the target type to which the latter will be adapted" $
-  "lang" ~> "typ" ~>
-  "adapter" <<~ languageAdapter @@ var "lang" @@ var "typ" $
-  produce $ Compute.adapterTarget $ var "adapter"
-
-constructCoder :: TBinding (Language -> (Term -> Flow Graph c) -> Type -> Flow Graph (Coder Graph Graph Term c))
-constructCoder = define "constructCoder" $
-  doc "Given a target language, a unidirectional last-mile encoding, and a source type, construct a unidirectional adapting coder for terms of that type" $
-  "lang" ~> "encodeTerm" ~> "typ" ~>
-  trace (Strings.cat2 (string "coder for ") (ShowCore.type_ @@ var "typ")) $
-  "adapter" <<~ languageAdapter @@ var "lang" @@ var "typ" $
-  produce $ AdaptUtils.composeCoders
-    @@ (Compute.adapterCoder $ var "adapter")
-    @@ (AdaptUtils.unidirectionalCoder @@ var "encodeTerm")
-
-languageAdapter :: TBinding (Language -> Type -> Flow Graph (SymmetricAdapter Graph Type Term))
-languageAdapter = define "languageAdapter" $
-  doc "Given a target language and a source type, produce an adapter, which rewrites the type and its terms according to the language's constraints" $
-  "lang" ~> "typ" ~>
-  "getPair" <~ ("typ" ~>
-    "ad" <<~ AdaptTerms.termAdapter @@ var "typ" $
-    "cx" <<~ Monads.getState $
-    produce $ pair (var "ad") (var "cx")) $
-  "g" <<~ Monads.getState $
-  "cx0" <~ Coders.adapterContext (var "g") (var "lang") Maps.empty $
-  "result" <<~ Monads.withState @@ var "cx0" @@ (var "getPair" @@ var "typ") $
-  "adapter" <~ Pairs.first (var "result") $
-  "cx" <~ Pairs.second (var "result") $
-  "encode" <~ ("term" ~> Monads.withState @@ var "cx" @@
-    (Compute.coderEncode (Compute.adapterCoder $ var "adapter") @@ var "term")) $
-  "decode" <~ ("term" ~> Monads.withState @@ var "cx" @@
-    (Compute.coderDecode (Compute.adapterCoder $ var "adapter") @@ var "term")) $
-  produce $ Compute.adapterWithCoder (var "adapter") (Compute.coder (var "encode") (var "decode"))
-
-transformModule :: TBinding (Language -> (Term -> Flow Graph e) -> (Module -> M.Map Type (Coder Graph Graph Term e) -> [(Binding, TypeApplicationTerm)] -> Flow Graph d) -> Module -> Flow Graph d)
-transformModule = define "transformModule" $
-  doc "Given a target language, a unidirectional last mile encoding, and an intermediate helper function, transform a given module into a target representation" $
-  "lang" ~> "encodeTerm" ~> "createModule" ~> "mod" ~>
-  "els" <~ Module.moduleElements (var "mod") $
-  "transform" <~ (
-    "tterms" <<~ Lexical.withSchemaContext @@ (Flows.mapList (Schemas.elementAsTypeApplicationTerm) (var "els")) $
-    "types" <~ Lists.nub (Lists.map (unaryFunction Core.typeApplicationTermType) (var "tterms")) $
-    "cdrs" <<~ Flows.mapList (constructCoder @@ var "lang" @@ var "encodeTerm") (var "types") $
-    "coders" <~ Maps.fromList (Lists.zip (var "types") (var "cdrs")) $
-    var "createModule" @@ var "mod" @@ var "coders" @@ (Lists.zip (var "els") (var "tterms"))) $
-  trace (Strings.cat2 (string "transform module ") (unwrap _Namespace @@ (Module.moduleNamespace $ var "mod"))) $
-  var "transform"
-
-adaptedModuleDefinitions :: TBinding (Language -> Module -> Flow Graph [Definition])
-adaptedModuleDefinitions = define "adaptedModuleDefinitions" $
-  doc "Map a Hydra module to a list of type and/or term definitions which have been adapted to the target language" $
-  "lang" ~> "mod" ~>
-  "cx" <<~ Monads.getState $
-  "els" <~ Module.moduleElements (var "mod") $
-  "adaptersFor" <~ lambda "types" (
-    "adapters" <<~ Flows.mapList (languageAdapter @@ var "lang") (var "types") $
-    produce $ Maps.fromList $ Lists.zip (var "types") (var "adapters")) $
-  "classify" <~ ("adapters" ~> "pair" ~>
-    "el" <~ Pairs.first (var "pair") $
-    "tt" <~ Pairs.second (var "pair") $
-    "term" <~ Core.typeApplicationTermBody (var "tt") $
-    "typ" <~ Core.typeApplicationTermType (var "tt") $
-    "name" <~ Core.bindingName (var "el") $
-    Logic.ifElse (Annotations.isNativeType @@ var "el")
-      ("adaptedTyp" <<~ (
-        "coreTyp" <<~ (trace (string "adapt module definitions") $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ var "term")) $
-        adaptTypeToLanguage @@ var "lang" @@ var "coreTyp") $
-       produce $ Module.definitionType $ Module.typeDefinition (var "name") (var "adaptedTyp"))
-      (Maybes.maybe
-        (Flows.fail $ Strings.cat2 (string "no adapter for element ") (unwrap _Name @@ var "name"))
-        (lambda "adapter" (
-          "adapted" <<~ Compute.coderEncode (Compute.adapterCoder $ var "adapter") @@ var "term" $
-          produce $ Module.definitionTerm $ Module.termDefinition (var "name") (var "adapted") (Schemas.typeToTypeScheme @@ (Compute.adapterTarget $ var "adapter"))))
-        (Maps.lookup (var "typ") (var "adapters")))) $
-  "tterms" <<~ Lexical.withSchemaContext @@ (Flows.mapList (Schemas.elementAsTypeApplicationTerm) (var "els")) $
-  "types" <~ Sets.toList (Sets.fromList (Lists.map (Rewriting.deannotateType <.> unaryFunction Core.typeApplicationTermType) (var "tterms"))) $
-  "adapters" <<~ var "adaptersFor" @@ var "types" $
-  Flows.mapList (var "classify" @@ var "adapters") (Lists.zip (var "els") (var "tterms"))
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Simple.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Simple.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Simple.hs
+++ /dev/null
@@ -1,762 +0,0 @@
-
-module Hydra.Sources.Kernel.Terms.Adapt.Simple where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel hiding (
-  adaptFloatType, adaptDataGraph, adaptGraphSchema, adaptIntegerType, adaptLambdaDomains, adaptLiteral,
-  adaptLiteralType, adaptLiteralTypesMap, adaptLiteralValue, adaptNestedTypes, adaptPrimitive,
-  adaptTerm, adaptType, adaptTypeScheme,
-  dataGraphToDefinitions, literalTypeSupported, pushTypeAppsInward, schemaGraphToDefinitions,
-  termAlternatives, typeAlternatives)
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Hoisting    as Hoisting
-import qualified Hydra.Sources.Kernel.Terms.Inference   as Inference
-import qualified Hydra.Sources.Kernel.Terms.Literals    as Literals
-import qualified Hydra.Sources.Kernel.Terms.Names       as Names
-import qualified Hydra.Sources.Kernel.Terms.Reduction   as Reduction
-import qualified Hydra.Sources.Kernel.Terms.Reflect     as Reflect
-import qualified Hydra.Sources.Kernel.Terms.Rewriting   as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Schemas     as Schemas
-import qualified Hydra.Sources.Kernel.Terms.Show.Core   as ShowCore
-import qualified Hydra.Sources.Kernel.Terms.Show.Graph  as ShowGraph
-
-
-ns :: Namespace
-ns = Namespace "hydra.adapt.simple"
-
-module_ :: Module
-module_ = Module ns elements
-    [Hoisting.ns, Inference.ns, Literals.ns, Names.ns, Reduction.ns, Reflect.ns, Rewriting.ns, Schemas.ns,
-      ShowCore.ns, ShowGraph.ns]
-    kernelTypesNamespaces $
-    Just "Simple, one-way adapters for types and terms"
-  where
-    elements = [
-      toBinding adaptFloatType,
-      toBinding adaptDataGraph,
-      toBinding adaptGraphSchema,
-      toBinding adaptIntegerType,
-      toBinding adaptLambdaDomains,
-      toBinding adaptLiteral,
-      toBinding adaptLiteralType,
-      toBinding adaptLiteralTypesMap,
-      toBinding adaptLiteralValue,
-      toBinding adaptNestedTypes,
-      toBinding adaptPrimitive,
-      toBinding adaptTerm,
-      toBinding adaptType,
-      toBinding adaptTypeScheme,
-      toBinding dataGraphToDefinitions,
-      toBinding literalTypeSupported,
-      toBinding pushTypeAppsInward,
-      toBinding schemaGraphToDefinitions,
-      toBinding termAlternatives,
-      toBinding typeAlternatives]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-adaptFloatType :: TBinding (LanguageConstraints -> FloatType -> Maybe FloatType)
-adaptFloatType = define "adaptFloatType" $
-  doc "Attempt to adapt a floating-point type using the given language constraints" $
-  "constraints" ~> "ft" ~>
-  "supported" <~ Sets.member (var "ft") (Coders.languageConstraintsFloatTypes $ var "constraints") $
-  "alt" <~ (adaptFloatType @@ var "constraints") $
-  "forUnsupported" <~ ("ft" ~> cases _FloatType (var "ft")
-    Nothing [
---    _FloatType_bigfloat>>: constant nothing,
-    _FloatType_bigfloat>>: constant $ var "alt" @@ Core.floatTypeFloat64, -- TODO: temporary; the only non-lossy alternative for bigfloat is string, but some migration is needed
-    _FloatType_float32>>: constant $ var "alt" @@ Core.floatTypeFloat64,
-    _FloatType_float64>>: constant $ var "alt" @@ Core.floatTypeBigfloat]) $
-  Logic.ifElse (var "supported")
-    (just $ var "ft")
-    (var "forUnsupported" @@ var "ft")
-
-adaptDataGraph :: TBinding (LanguageConstraints -> Bool -> Graph -> Flow s Graph)
-adaptDataGraph = define "adaptDataGraph" $
-  doc ("Adapt a graph and its schema to the given language constraints."
-    <> " The doExpand flag controls eta expansion of partial applications."
-    <> " Adaptation is type-preserving: binding-level TypeSchemes are adapted (not stripped)."
-    <> " Note: case statement hoisting is done separately, prior to adaptation.") $
-  "constraints" ~> "doExpand" ~> "graph0" ~>
-  "transform" <~ ("graph" ~> "gterm" ~>
-    "tx" <<~ Schemas.graphToTypeContext @@ var "graph" $
-    -- Order of operations:
-    -- 1. Unshadow variables first (prevents capture issues in eta expansion)
-    -- 2. Eta expand (needs type annotations; creates fully-applied functions)
-    -- 3. Lift lambdas above lets (structural cleanup)
-    "gterm1" <~ Rewriting.unshadowVariables @@ (pushTypeAppsInward @@ var "gterm") $
-    "gterm2" <~ Rewriting.unshadowVariables @@ (Logic.ifElse (var "doExpand")
-      (pushTypeAppsInward @@ (Reduction.etaExpandTermNew @@ var "tx" @@ var "gterm1"))
-      (var "gterm1")) $
-    produce $ Rewriting.liftLambdaAboveLet @@ var "gterm2") $
-  "litmap" <~ adaptLiteralTypesMap @@ var "constraints" $
-  "els0" <~ Graph.graphElements (var "graph0") $
-  "env0" <~ Graph.graphEnvironment (var "graph0") $
-  "body0" <~ Graph.graphBody (var "graph0") $
-  "prims0" <~ Graph.graphPrimitives (var "graph0") $
-  "schema0" <~ Graph.graphSchema (var "graph0") $
-  "schema1" <<~ optCases (var "schema0")
-    (produce nothing)
---    ("sg" ~> Flows.fail $ "schema graph: " ++ (ShowGraph.graph @@ var "sg")) $
-    ( "sg" ~>
-      "tmap0" <<~ Schemas.graphAsTypes @@ var "sg" $
-      "tmap1" <<~ adaptGraphSchema @@ var "constraints" @@ var "litmap" @@ var "tmap0" $
-      "emap" <~ Schemas.typesToElements @@ var "tmap1" $
-      produce $ just $ Graph.graphWithElements (var "sg") (var "emap")) $
-  "gterm0" <~ Schemas.graphAsTerm @@ var "graph0" $
-  "gterm1" <<~ Logic.ifElse (var "doExpand")
-    (var "transform" @@ var "graph0" @@ var "gterm0")
-    (produce $ var "gterm0") $
-  "gterm2" <<~ adaptTerm @@ var "constraints" @@ var "litmap" @@ var "gterm1" $
-  -- Adapt lambda domains in the adapted term.
-  -- Lambda domains carry pre-adaptation types (e.g. bigfloat) that must be adapted to match
-  -- the post-adaptation terms (e.g. float64). This preserves type annotations.
-  "gterm3" <<~ Rewriting.rewriteTermM @@ (adaptLambdaDomains @@ var "constraints" @@ var "litmap") @@ var "gterm2" $
-  "els1Raw" <~ Schemas.termAsGraph @@ var "gterm3" $
-
-  -- Adapt nested let binding TypeSchemes within each top-level binding's term.
-  -- These TypeSchemes may carry stale types from JSON modules (e.g. bigfloat→float64).
-  -- Applied per-binding AFTER termAsGraph so that top-level binding TypeSchemes
-  -- (which carry type-class constraints like Ord) are preserved.
-  -- Process each binding: adapt nested let TypeSchemes AND adapt top-level TypeSchemes.
-  -- Adapting (rather than stripping) TypeSchemes converts stale types like bigfloat→float64
-  -- while preserving type-class constraints like Ord needed by decodeSet.
-  "processBinding" <~ ("el" ~>
-    "newTerm" <<~ Rewriting.rewriteTermM @@ (adaptNestedTypes @@ var "constraints" @@ var "litmap") @@ (Core.bindingTerm $ var "el") $
-    "adaptedType" <<~ optCases (Core.bindingType $ var "el")
-      (produce nothing)
-      ("ts" ~>
-        "ts1" <<~ adaptTypeScheme @@ var "constraints" @@ var "litmap" @@ var "ts" $
-        produce $ just $ var "ts1") $
-    produce $ Core.binding
-      (Core.bindingName $ var "el")
-      (var "newTerm")
-      (var "adaptedType")) $
-  "els1" <<~ Flows.mapList (var "processBinding") (var "els1Raw") $
-  "prims1" <<~ Flows.mapElems (adaptPrimitive @@ var "constraints" @@ var "litmap") (var "prims0") $
-
-  produce $ Graph.graph
-    (var "els1")
-    (var "env0")
-    Maps.empty
-    Core.termUnit
-    (var "prims1")
-    (var "schema1")
-
--- | Rewrite callback for adapting lambda domains in a term.
--- Dispatches on Term variants: for TermFunction, adapts the lambda domain type;
--- for all other variants, returns the term unchanged.
--- This is a top-level function (not inline) so the Python code generator can emit match statements.
-adaptLambdaDomains :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> (Term -> Flow s Term) -> Term -> Flow s Term)
-adaptLambdaDomains = define "adaptLambdaDomains" $
-  doc "Rewrite callback for adapting lambda domain types in a term" $
-  "constraints" ~> "litmap" ~> "recurse" ~> "term" ~>
-  "rewritten" <<~ var "recurse" @@ var "term" $
-  cases _Term (var "rewritten")
-    (Just $ produce $ var "rewritten") [
-    _Term_function>>: "f" ~>
-      cases _Function (var "f")
-        (Just $ produce $ Core.termFunction $ var "f") [
-        _Function_lambda>>: "l" ~>
-          "adaptedDomain" <<~ optCases (Core.lambdaDomain $ var "l")
-            (produce nothing)
-            ("dom" ~>
-              "dom1" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ var "dom" $
-              produce $ just $ var "dom1") $
-          produce $ Core.termFunction $ Core.functionLambda $ Core.lambda
-            (Core.lambdaParameter $ var "l")
-            (var "adaptedDomain")
-            (Core.lambdaBody $ var "l")]]
-
--- | Rewrite callback for adapting nested let binding TypeSchemes in a term.
--- Dispatches on Term variants: for TermLet, adapts the binding TypeSchemes;
--- for all other variants, returns the term unchanged.
--- This is a top-level function (not inline) so the Python code generator can emit match statements.
-adaptNestedTypes :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> (Term -> Flow s Term) -> Term -> Flow s Term)
-adaptNestedTypes = define "adaptNestedTypes" $
-  doc "Rewrite callback for adapting nested let binding TypeSchemes in a term" $
-  "constraints" ~> "litmap" ~> "recurse" ~> "term" ~>
-  "rewritten" <<~ var "recurse" @@ var "term" $
-  cases _Term (var "rewritten")
-    (Just $ produce $ var "rewritten") [
-    _Term_let>>: "lt" ~>
-      "adaptB" <~ ("b" ~>
-        "adaptedBType" <<~ optCases (Core.bindingType $ var "b")
-          (produce nothing)
-          ("ts" ~>
-            "ts1" <<~ adaptTypeScheme @@ var "constraints" @@ var "litmap" @@ var "ts" $
-            produce $ just $ var "ts1") $
-        produce $ Core.binding
-          (Core.bindingName $ var "b")
-          (Core.bindingTerm $ var "b")
-          (var "adaptedBType")) $
-      "adaptedBindings" <<~ Flows.mapList (var "adaptB") (Core.letBindings $ var "lt") $
-      produce $ Core.termLet $ Core.let_
-        (var "adaptedBindings")
-        (Core.letBody $ var "lt")]
-
-adaptGraphSchema :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> M.Map Name Type -> Flow s (M.Map Name Type))
-adaptGraphSchema = define "adaptGraphSchema" $
-  doc "Adapt a schema graph to the given language constraints" $
-  "constraints" ~> "litmap" ~> "types0" ~>
-  "mapPair" <~ ("pair" ~>
-    "name" <~ Pairs.first (var "pair") $
-    "typ" <~ Pairs.second (var "pair") $
-    "typ1" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ var "typ" $
-    produce $ pair (var "name") (var "typ1")) $
-  "pairs" <<~ Flows.mapList (var "mapPair") (Maps.toList $ var "types0") $
-  produce $ Maps.fromList (var "pairs")
-
-adaptIntegerType :: TBinding (LanguageConstraints -> IntegerType -> Maybe IntegerType)
-adaptIntegerType = define "adaptIntegerType" $
-  doc "Attempt to adapt an integer type using the given language constraints" $
-  "constraints" ~> "it" ~>
-  "supported" <~ Sets.member (var "it") (Coders.languageConstraintsIntegerTypes $ var "constraints") $
-  "alt" <~ (adaptIntegerType @@ var "constraints") $
-  "forUnsupported" <~ ("it" ~> cases _IntegerType (var "it")
-    Nothing [
-    _IntegerType_bigint>>: constant nothing,
-    _IntegerType_int8>>: constant $ var "alt" @@ Core.integerTypeUint16,
-    _IntegerType_int16>>: constant $ var "alt" @@ Core.integerTypeUint32,
-    _IntegerType_int32>>: constant $ var "alt" @@ Core.integerTypeUint64,
-    _IntegerType_int64>>: constant $ var "alt" @@ Core.integerTypeBigint,
-    _IntegerType_uint8>>: constant $ var "alt" @@ Core.integerTypeInt16,
-    _IntegerType_uint16>>: constant $ var "alt" @@ Core.integerTypeInt32,
-    _IntegerType_uint32>>: constant $ var "alt" @@ Core.integerTypeInt64,
-    _IntegerType_uint64>>: constant $ var "alt" @@ Core.integerTypeBigint]) $
-  Logic.ifElse (var "supported")
-    (just $ var "it")
-    (var "forUnsupported" @@ var "it")
-
-adaptLiteral :: TBinding (LiteralType -> Literal -> Literal)
-adaptLiteral = define "adaptLiteral" $
-  doc "Convert a literal to a different type" $
-  "lt" ~> "l" ~>
-  cases _Literal (var "l")
-    Nothing [
-    _Literal_binary>>: "b" ~> cases _LiteralType (var "lt")
-      Nothing [
-      _LiteralType_string>>: constant $ Core.literalString $ Literals.binaryToString $ var "b"],
-    _Literal_boolean>>: "b" ~> cases _LiteralType (var "lt")
-      Nothing [
-      _LiteralType_integer>>: "it" ~> Core.literalInteger $
-        Literals.bigintToIntegerValue @@ var "it" @@ Logic.ifElse (var "b") (bigint 1) (bigint 0)],
-    _Literal_float>>: "f" ~> cases _LiteralType (var "lt")
-      Nothing [
-      _LiteralType_float>>: "ft" ~> Core.literalFloat $
-        Literals.bigfloatToFloatValue @@ var "ft" @@ (Literals.floatValueToBigfloat @@ var "f")],
-    _Literal_integer>>: "i" ~> cases _LiteralType (var "lt")
-      Nothing [
-      _LiteralType_integer>>: "it" ~> Core.literalInteger $
-        Literals.bigintToIntegerValue @@ var "it" @@ (Literals.integerValueToBigint @@ var "i")]]
-
-adaptLiteralType :: TBinding (LanguageConstraints -> LiteralType -> Maybe LiteralType)
-adaptLiteralType = define "adaptLiteralType" $
-  doc "Attempt to adapt a literal type using the given language constraints" $
-  "constraints" ~> "lt" ~>
-  "forUnsupported" <~ ("lt" ~> cases _LiteralType (var "lt")
-    (Just nothing) [
-    _LiteralType_binary>>: constant $ just Core.literalTypeString,
-    _LiteralType_boolean>>: constant $ Maybes.map (unaryFunction Core.literalTypeInteger) $
-      adaptIntegerType @@ var "constraints" @@ Core.integerTypeInt8,
-    _LiteralType_float>>: "ft" ~> Maybes.map (unaryFunction Core.literalTypeFloat) $
-      adaptFloatType @@ var "constraints" @@ var "ft",
-    _LiteralType_integer>>: "it" ~> Maybes.map (unaryFunction Core.literalTypeInteger) $
-      adaptIntegerType @@ var "constraints" @@ var "it"]) $
-  Logic.ifElse (literalTypeSupported @@ var "constraints" @@ var "lt")
-    nothing
-    (var "forUnsupported" @@ var "lt")
-
-adaptLiteralTypesMap :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType)
-adaptLiteralTypesMap = define "adaptLiteralTypesMap" $
-  doc "Derive a map of adapted literal types for the given language constraints" $
-  "constraints" ~>
-  "tryType" <~ ("lt" ~> optCases (adaptLiteralType @@ var "constraints" @@ var "lt")
-    nothing
-    ("lt2" ~> just $ pair (var "lt") (var "lt2"))) $
-  Maps.fromList $ Maybes.cat $ Lists.map (var "tryType") (Reflect.literalTypes)
-
-adaptLiteralValue :: TBinding (M.Map LiteralType LiteralType -> LiteralType -> Literal -> Literal)
-adaptLiteralValue = define "adaptLiteralValue" $
-  doc "Adapt a literal value using the given language constraints" $
-  "litmap" ~> "lt" ~> "l" ~> optCases (Maps.lookup (var "lt") (var "litmap"))
-    (Core.literalString $ ShowCore.literal @@ var "l")
-    ("lt2" ~> adaptLiteral @@ var "lt2" @@ var "l")
-
-adaptPrimitive :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> Primitive -> Flow s Primitive)
-adaptPrimitive = define "adaptPrimitive" $
-  doc "Adapt a primitive to the given language constraints, prior to inference" $
-  "constraints" ~> "litmap" ~> "prim0" ~>
-  "ts0" <~ Graph.primitiveType (var "prim0") $
-  "ts1" <<~ adaptTypeScheme @@ var "constraints" @@ var "litmap" @@ var "ts0" $
-  produce $ Graph.primitiveWithType (var "prim0") (var "ts1")
-
--- Note: this function could be made more efficient through precomputation of alternatives,
---       similar to what is done for literals.
-adaptTerm :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> Term -> Flow Graph Term)
-adaptTerm = define "adaptTerm" $
-  doc "Adapt a term using the given language constraints" $
-  "constraints" ~> "litmap" ~> "term0" ~>
-  "rewrite" <~ ("recurse" ~> "term0" ~> lets [
-    "forSupported">: ("term" ~> cases _Term (var "term")
-      (Just $ produce $ just $ var "term") [
-      _Term_literal>>: "l" ~>
-        "lt" <~ Reflect.literalType @@ var "l" $
-        produce $ just $ Logic.ifElse (literalTypeSupported @@ var "constraints" @@ var "lt")
-          (var "term")
-          (Core.termLiteral $ adaptLiteralValue @@ var "litmap" @@ var "lt" @@ var "l")]),
-    "forUnsupported">: ("term" ~> lets [
-      "forNonNull">: ("alts" ~>
-        "mterm" <<~ var "tryTerm" @@ Lists.head (var "alts") $
-        optCases (var "mterm")
-          (var "tryAlts" @@ Lists.tail (var "alts"))
-          ("t" ~> produce $ just $ var "t")),
-      "tryAlts">: ("alts" ~> Logic.ifElse (Lists.null $ var "alts")
-        (produce nothing)
-        (var "forNonNull" @@ var "alts"))] $
-      "alts0" <<~ termAlternatives @@ var "term" $
-      var "tryAlts" @@ var "alts0"),
-    "tryTerm">: ("term" ~>
-      "supportedVariant" <~ Sets.member
-        (Reflect.termVariant @@ var "term")
-        (Coders.languageConstraintsTermVariants $ var "constraints") $
-      Logic.ifElse (var "supportedVariant")
-        (var "forSupported" @@ var "term")
-        (var "forUnsupported" @@ var "term"))] $
-    "term1" <<~ var "recurse" @@ var "term0" $
-    -- Type application/lambda wrappers pass through unconditionally.
-    -- fsub already recursed into their bodies; we must not strip the wrappers
-    -- because they carry type information needed by typeOf in the coders.
-    cases _Term (var "term1")
-      (Just $
-        "mterm" <<~ var "tryTerm" @@ var "term1" $
-        optCases (var "mterm")
-          (Flows.fail $ (string "no alternatives for term: ") ++ (ShowCore.term @@ var "term1"))
-          ("term2" ~> produce $ var "term2"))
-      [_Term_typeApplication>>: "ta" ~>
-         "atyp" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ (Core.typeApplicationTermType $ var "ta") $
-         produce $ Core.termTypeApplication $ Core.typeApplicationTerm
-           (Core.typeApplicationTermBody $ var "ta")
-           (var "atyp"),
-       _Term_typeLambda>>:      "_" ~> produce $ var "term1"]) $
-  Rewriting.rewriteTermM @@ var "rewrite" @@ var "term0"
-
-adaptType :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> Type -> Flow s Type)
-adaptType = define "adaptType" $
-  doc "Adapt a type using the given language constraints" $
-  "constraints" ~> "litmap" ~> "type0" ~>
-  lets [
-  "forSupported">: ("typ" ~> cases _Type (var "typ")
-    (Just $ just $ var "typ") [
-    _Type_literal>>: "lt" ~> Logic.ifElse (literalTypeSupported @@ var "constraints" @@ var "lt")
-      (just $ var "typ")
-      (optCases (Maps.lookup (var "lt") (var "litmap"))
-        (just $ Core.typeLiteral Core.literalTypeString)
-        ("lt2" ~> just $ Core.typeLiteral $ var "lt2"))]),
-  "forUnsupported">: ("typ" ~>
-    "tryAlts" <~ ("alts" ~> Logic.ifElse (Lists.null $ var "alts")
-      nothing
-      (optCases (var "tryType" @@ Lists.head (var "alts"))
-        (var "tryAlts" @@ Lists.tail (var "alts"))
-        ("t" ~> just $ var "t"))) $
-    "alts0" <~ typeAlternatives @@ var "typ" $
-    var "tryAlts" @@ var "alts0"),
-  "tryType">: ("typ" ~>
-    "supportedVariant" <~ Sets.member
-      (Reflect.typeVariant @@ var "typ")
-      (Coders.languageConstraintsTypeVariants $ var "constraints") $
-    Logic.ifElse (var "supportedVariant")
-      (var "forSupported" @@ var "typ")
-      (var "forUnsupported" @@ var "typ"))] $
-  "rewrite" <~ ("recurse" ~> "typ" ~>
-    "type1" <<~ var "recurse" @@ var "typ" $
-    optCases (var "tryType" @@ var "type1")
-      (Flows.fail $ (string "no alternatives for type: ") ++ (ShowCore.type_ @@ var "typ"))
-      ("type2" ~> produce $ var "type2")) $
-  Rewriting.rewriteTypeM @@ var "rewrite" @@ var "type0"
-
-adaptTypeScheme :: TBinding (LanguageConstraints -> M.Map LiteralType LiteralType -> TypeScheme -> Flow s TypeScheme)
-adaptTypeScheme = define "adaptTypeScheme" $
-  doc "Adapt a type scheme to the given language constraints, prior to inference" $
-  "constraints" ~> "litmap" ~> "ts0" ~>
-  "vars0" <~ Core.typeSchemeVariables (var "ts0") $
-  "t0" <~ Core.typeSchemeType (var "ts0") $
-  "t1" <<~ adaptType @@ var "constraints" @@ var "litmap" @@ var "t0" $
-  produce $ Core.typeScheme (var "vars0") (var "t1") (Core.typeSchemeConstraints (var "ts0"))
-
-pushTypeAppsInward :: TBinding (Term -> Term)
-pushTypeAppsInward = define "pushTypeAppsInward" $
-  doc ("Normalize a term by pushing TermTypeApplication inward past TermApplication and"
-    <> " TermFunction (Lambda). This corrects structures produced by poly-let hoisting and"
-    <> " eta expansion, where type applications from inference end up wrapping term"
-    <> " applications or lambda abstractions instead of being directly on the polymorphic variable.") $
-  "term" ~>
-  lets [
-  "push">: ("body" ~> "typ" ~> cases _Term (var "body")
-    -- Default: keep TypeApp as-is
-    (Just $ Core.termTypeApplication $ Core.typeApplicationTerm (var "body") (var "typ")) [
-    -- TypeApp(App(f, arg), τ) → go(App(TypeApp(f, τ), arg))
-    _Term_application>>: "a" ~> var "go" @@
-      (Core.termApplication $ Core.application
-        (Core.termTypeApplication $ Core.typeApplicationTerm
-          (Core.applicationFunction $ var "a")
-          (var "typ"))
-        (Core.applicationArgument $ var "a")),
-    -- TypeApp(Lambda(v, d, body), τ) → go(Lambda(v, d, TypeApp(body, τ)))
-    _Term_function>>: "f" ~> cases _Function (var "f")
-      (Just $ Core.termTypeApplication $ Core.typeApplicationTerm
-        (Core.termFunction $ var "f") (var "typ")) [
-      _Function_lambda>>: "l" ~> var "go" @@
-        (Core.termFunction $ Core.functionLambda $ Core.lambda
-          (Core.lambdaParameter $ var "l")
-          (Core.lambdaDomain $ var "l")
-          (Core.termTypeApplication $ Core.typeApplicationTerm
-            (Core.lambdaBody $ var "l")
-            (var "typ")))],
-    -- TypeApp(Let(bindings, body), τ) → go(Let(bindings, TypeApp(body, τ)))
-    _Term_let>>: "lt" ~> var "go" @@
-      (Core.termLet $ Core.let_
-        (Core.letBindings $ var "lt")
-        (Core.termTypeApplication $ Core.typeApplicationTerm
-          (Core.letBody $ var "lt")
-          (var "typ")))]),
-  "go">: ("t" ~>
-    "forField" <~ ("fld" ~> Core.fieldWithTerm (var "go" @@ (Core.fieldTerm $ var "fld")) (var "fld")) $
-    "forElimination" <~ ("elm" ~> cases _Elimination (var "elm") Nothing [
-      _Elimination_record>>: "p" ~> Core.eliminationRecord (var "p"),
-      _Elimination_union>>: "cs" ~> Core.eliminationUnion $ Core.caseStatement
-        (Core.caseStatementTypeName $ var "cs")
-        (Maybes.map (var "go") (Core.caseStatementDefault $ var "cs"))
-        (Lists.map (var "forField") (Core.caseStatementCases $ var "cs")),
-      _Elimination_wrap>>: "name" ~> Core.eliminationWrap $ var "name"]) $
-    "forFunction" <~ ("fun" ~> cases _Function (var "fun") Nothing [
-      _Function_elimination>>: "elm" ~> Core.functionElimination $ var "forElimination" @@ var "elm",
-      _Function_lambda>>: "l" ~> Core.functionLambda $ Core.lambda
-        (Core.lambdaParameter $ var "l")
-        (Core.lambdaDomain $ var "l")
-        (var "go" @@ (Core.lambdaBody $ var "l")),
-      _Function_primitive>>: "name" ~> Core.functionPrimitive $ var "name"]) $
-    "forLet" <~ ("lt" ~>
-      "mapBinding" <~ ("b" ~> Core.binding
-        (Core.bindingName $ var "b")
-        (var "go" @@ (Core.bindingTerm $ var "b"))
-        (Core.bindingType $ var "b")) $
-      Core.let_
-        (Lists.map (var "mapBinding") (Core.letBindings $ var "lt"))
-        (var "go" @@ (Core.letBody $ var "lt"))) $
-    "forMap" <~ ("m" ~>
-      "forPair" <~ ("p" ~> pair (var "go" @@ (Pairs.first $ var "p")) (var "go" @@ (Pairs.second $ var "p"))) $
-      Maps.fromList $ Lists.map (var "forPair") $ Maps.toList $ var "m") $
-    cases _Term (var "t") Nothing [
-      _Term_annotated>>: "at" ~> Core.termAnnotated $ Core.annotatedTerm
-        (var "go" @@ (Core.annotatedTermBody $ var "at"))
-        (Core.annotatedTermAnnotation $ var "at"),
-      _Term_application>>: "a" ~> Core.termApplication $ Core.application
-        (var "go" @@ (Core.applicationFunction $ var "a"))
-        (var "go" @@ (Core.applicationArgument $ var "a")),
-      _Term_either>>: "e" ~> Core.termEither $ Eithers.either_
-        ("l" ~> left $ var "go" @@ var "l")
-        ("r" ~> right $ var "go" @@ var "r")
-        (var "e"),
-      _Term_function>>: "fun" ~> Core.termFunction $ var "forFunction" @@ var "fun",
-      _Term_let>>: "lt" ~> Core.termLet $ var "forLet" @@ var "lt",
-      _Term_list>>: "els" ~> Core.termList $ Lists.map (var "go") (var "els"),
-      _Term_literal>>: "v" ~> Core.termLiteral $ var "v",
-      _Term_map>>: "m" ~> Core.termMap $ var "forMap" @@ var "m",
-      _Term_maybe>>: "m" ~> Core.termMaybe $ Maybes.map (var "go") (var "m"),
-      _Term_pair>>: "p" ~> Core.termPair $ pair
-        (var "go" @@ (Pairs.first $ var "p"))
-        (var "go" @@ (Pairs.second $ var "p")),
-      _Term_record>>: "r" ~> Core.termRecord $ Core.record
-        (Core.recordTypeName $ var "r")
-        (Lists.map (var "forField") (Core.recordFields $ var "r")),
-      _Term_set>>: "s" ~> Core.termSet $ Sets.fromList $ Lists.map (var "go") $ Sets.toList (var "s"),
-      _Term_typeApplication>>: "tt" ~>
-        "body1" <~ var "go" @@ (Core.typeApplicationTermBody $ var "tt") $
-        var "push" @@ var "body1" @@ (Core.typeApplicationTermType $ var "tt"),
-      _Term_typeLambda>>: "ta" ~> Core.termTypeLambda $ Core.typeLambda
-        (Core.typeLambdaParameter $ var "ta")
-        (var "go" @@ (Core.typeLambdaBody $ var "ta")),
-      _Term_union>>: "i" ~> Core.termUnion $ Core.injection
-        (Core.injectionTypeName $ var "i")
-        (var "forField" @@ (Core.injectionField $ var "i")),
-      _Term_unit>>: constant Core.termUnit,
-      _Term_variable>>: "v" ~> Core.termVariable $ var "v",
-      _Term_wrap>>: "wt" ~> Core.termWrap $ Core.wrappedTerm
-        (Core.wrappedTermTypeName $ var "wt")
-        (var "go" @@ (Core.wrappedTermBody $ var "wt"))])] $
-  var "go" @@ var "term"
-
-dataGraphToDefinitions :: TBinding (LanguageConstraints -> Bool -> Bool -> Bool -> Bool -> Graph -> [Namespace] -> Flow s (Graph, [[TermDefinition]]))
-dataGraphToDefinitions = define "dataGraphToDefinitions" $
-  doc ("Given a data graph along with language constraints and a designated list of namespaces,"
-    <> " adapt the graph to the language constraints,"
-    <> " then return the processed graph along with term definitions grouped by namespace (in the order of the input namespaces)."
-    <> " Inference is performed before adaptation if bindings lack type annotations."
-    <> " Hoisting must preserve type schemes; if any binding loses its type scheme after hoisting, the pipeline fails."
-    <> " Adaptation preserves type application/lambda wrappers and adapts embedded types."
-    <> " Post-adaptation inference is performed to ensure binding TypeSchemes are fully consistent."
-    <> " The doExpand flag controls eta expansion."
-    <> " The doHoistCaseStatements flag controls case statement hoisting (needed for Python)."
-    <> " The doHoistPolymorphicLetBindings flag controls polymorphic let binding hoisting (needed for Java).") $
-  "constraints" ~>
-  "doInfer" ~> "doExpand" ~> "doHoistCaseStatements" ~> "doHoistPolymorphicLetBindings" ~>
-  "graph0" ~> "namespaces" ~>
-
-  "namespacesSet" <~ Sets.fromList (var "namespaces") $
-
-  "isParentBinding" <~ ("b" ~> optCases (Names.namespaceOf @@ (Core.bindingName $ var "b"))
-    false
-    ("ns" ~> Sets.member (var "ns") (var "namespacesSet"))) $
-
-  -- Steps 0a-2: Case statement hoisting pipeline (only for Python target, currently).
-  -- 0a: Strip type lambdas so case expressions are visible to the hoister
-  --     (the hoister does not traverse into type lambdas).
-  -- 0b: Unshadow variables to prevent capture issues after hoisting.
-  -- 1:  Hoist case statements before inference.
-  -- 2:  Unshadow again after hoisting (hoisting introduces new lambda wrappers).
-  "hoistCases" <~ ("g" ~>
-    "graphDetyped" <~ Graph.graphWithElements (var "g")
-      (Lists.map ("b" ~>
-        Core.binding (Core.bindingName $ var "b")
-          (Rewriting.stripTypeLambdas @@ (Core.bindingTerm $ var "b"))
-          (Core.bindingType $ var "b"))
-        (Graph.graphElements $ var "g")) $
-    "gterm0" <~ Schemas.graphAsTerm @@ var "graphDetyped" $
-    "gterm1" <~ Rewriting.unshadowVariables @@ var "gterm0" $
-    "newElements" <~ Schemas.termAsGraph @@ var "gterm1" $
-    "graphu0" <~ Graph.graphWithElements (var "graphDetyped") (var "newElements") $
-    "graphh1" <<~ Hoisting.hoistCaseStatementsInGraph @@ var "graphu0" $
-    "gterm2" <~ Schemas.graphAsTerm @@ var "graphh1" $
-    "gterm3" <~ Rewriting.unshadowVariables @@ var "gterm2" $
-    "newElements2" <~ Schemas.termAsGraph @@ var "gterm3" $
-    produce $ Graph.graphWithElements (var "graphh1") (var "newElements2")) $
-
-  "hoistPoly" <~ ("graphBefore" ~>
---    "typeContext" <<~ Schemas.graphToTypeContext @@ var "gBefore" $
-    "letBefore" <~ Schemas.graphAsLet @@ var "graphBefore" $
-    "letAfter" <~ Hoisting.hoistPolymorphicLetBindings @@ var "isParentBinding" @@ var "letBefore" $
-    Graph.graphWithElements (var "graphBefore") (Core.letBindings $ var "letAfter")) $
-
-  -- Note: this is a rough test of typedness, as it only checks that the top-level bindings are typed.
-  "checkTyped" <~ ("debugLabel" ~> "g" ~>
-    "untypedBindings" <~ Lists.map ("b" ~> Core.unName (Core.bindingName $ var "b"))
-      (Lists.filter ("b" ~> Logic.not $ Maybes.isJust (Core.bindingType $ var "b")) (Graph.graphElements $ var "g")) $
-    Logic.ifElse (Lists.null $ var "untypedBindings")
-      (produce $ var "g")
-      (Flows.fail $ Strings.concat [
-        string "Found untyped bindings (", var "debugLabel", string "): ",
-        Strings.intercalate (string ", ") (var "untypedBindings")])) $
-
-  -- Normalize: push type applications inward past applications and lambdas.
-  -- This corrects structures where TypeApp wraps App/Lambda after adaptation and eta expansion.
-  "normalizeGraph" <~ ("g" ~> Graph.graphWithElements (var "g")
-    (Lists.map ("b" ~> Core.binding
-      (Core.bindingName $ var "b")
-      (pushTypeAppsInward @@ (Core.bindingTerm $ var "b"))
-      (Core.bindingType $ var "b"))
-    (Graph.graphElements $ var "g"))) $
-
-  -- Step 1: hoist case statements if needed (currently, for the Python target)
-  "graph1" <<~ Logic.ifElse (var "doHoistCaseStatements")
-    (var "hoistCases" @@ var "graph0")
-    (produce $ var "graph0") $
-
-  -- Step 2: infer types if necessary
-  "graph2" <<~ Logic.ifElse (var "doInfer")
-     (Inference.inferGraphTypes @@ var "graph1")
-     (var "checkTyped" @@ string "after case hoisting" @@ var "graph1") $
-
-  -- Step 3: hoist let bindings if necessary (currently, for the Java target)
-  "graph3" <<~ Logic.ifElse (var "doHoistPolymorphicLetBindings")
-    (var "checkTyped" @@ string "after let hoisting"
-      @@ (var "hoistPoly" @@ var "graph2"))
-    (produce $ var "graph2") $
-
-  -- Step 4: adapt the graph (includes eta expansion if enabled).
-  -- Adaptation preserves type application/lambda wrappers and adapts embedded types
-  -- (literal types, lambda domains, TypeSchemes).
-  "graph4" <<~ Flows.bind
-    (adaptDataGraph @@ var "constraints" @@ var "doExpand" @@ var "graph3")
-    (var "checkTyped" @@ (string "after adaptation")) $
-
-  -- Step 5: normalize the adapted graph
-  "graph5" <~ var "normalizeGraph" @@ var "graph4" $
-
-  -- Construct term definitions grouped by namespace
-  "toDef" <~ ("el" ~>
-    Maybes.map
-      ("ts" ~> Module.termDefinition
-        (Core.bindingName $ var "el")
-        (Core.bindingTerm $ var "el")
-        (var "ts"))
-      (Core.bindingType $ var "el")) $
-  -- Filter to elements in the requested namespaces
-  "selectedElements" <~ Lists.filter
-    ("el" ~> optCases (Names.namespaceOf @@ (Core.bindingName $ var "el"))
-      false
-      ("ns" ~> Sets.member (var "ns") (var "namespacesSet")))
-    (Graph.graphElements $ var "graph5") $
-  -- Group elements by namespace
-  "elementsByNamespace" <~ Lists.foldl
-    ("acc" ~> "el" ~>
-      optCases (Names.namespaceOf @@ (Core.bindingName $ var "el"))
-        (var "acc")
-        ("ns" ~>
-          "existing" <~ Maybes.maybe (list ([] :: [TTerm Binding])) (unaryFunction Equality.identity) (Maps.lookup (var "ns") (var "acc")) $
-          Maps.insert (var "ns") (Lists.concat2 (var "existing") (list [var "el"])) (var "acc")))
-    Maps.empty
-    (var "selectedElements") $
-  -- Produce definitions in the order of the input namespaces
-  "defsGrouped" <~ Lists.map
-    ("ns" ~>
-      "elsForNs" <~ Maybes.maybe (list ([] :: [TTerm Binding])) (unaryFunction Equality.identity) (Maps.lookup (var "ns") (var "elementsByNamespace")) $
-      Maybes.cat (Lists.map (var "toDef") (var "elsForNs")))
-    (var "namespaces") $
-
-  produce $ pair
-    (var "graph5")
-    (var "defsGrouped")
-
-literalTypeSupported :: TBinding (LanguageConstraints -> LiteralType -> Bool)
-literalTypeSupported = define "literalTypeSupported" $
-  doc "Check if a literal type is supported by the given language constraints" $
-  "constraints" ~> "lt" ~>
-  "forType" <~ ("lt" ~> cases _LiteralType (var "lt")
-    (Just true) [
-      _LiteralType_float>>: "ft" ~> Sets.member (var "ft") (Coders.languageConstraintsFloatTypes $ var "constraints"),
-      _LiteralType_integer>>: "it" ~> Sets.member (var "it") (Coders.languageConstraintsIntegerTypes $ var "constraints")]) $
-  Logic.ifElse
-    (Sets.member
-      (Reflect.literalTypeVariant @@ var "lt")
-      (Coders.languageConstraintsLiteralVariants $ var "constraints"))
-    (var "forType" @@ var "lt")
-    false
-
-schemaGraphToDefinitions :: TBinding (LanguageConstraints -> Graph -> [[Name]] -> Flow s (M.Map Name Type, [[TypeDefinition]]))
-schemaGraphToDefinitions = define "schemaGraphToDefinitions" $
-  doc ("Given a schema graph along with language constraints and a designated list of element names,"
-    <> " adapt the graph to the language constraints,"
-    <> " then return a corresponding type definition for each element name.") $
-  "constraints" ~> "graph" ~> "nameLists" ~>
-  "litmap" <~ adaptLiteralTypesMap @@ var "constraints" $
-  "tmap0" <<~ Schemas.graphAsTypes @@ var "graph" $
-  "tmap1" <<~ adaptGraphSchema @@ var "constraints" @@ var "litmap" @@ var "tmap0" $
-  "toDef" <~ ("pair" ~> Module.typeDefinition (Pairs.first $ var "pair") (Pairs.second $ var "pair")) $
-  produce $ pair
-    (var "tmap1")
-    (Lists.map
-      ("names" ~> Lists.map (var "toDef") $
-        Lists.map ("n" ~> pair (var "n") (Maybes.fromJust $ Maps.lookup (var "n") (var "tmap1"))) (var "names"))
-      (var "nameLists"))
---  Flows.fail $ "schema graph for definitions: " ++ (ShowGraph.graph @@ var "graph")
-
-termAlternatives :: TBinding (Term -> Flow Graph [Term])
-termAlternatives = define "termAlternatives" $
-  doc "Find a list of alternatives for a given term, if any" $
-  "term" ~> cases _Term (var "term")
-    (Just $ produce $ list ([] :: [TTerm Term])) [
-    _Term_annotated>>: "at" ~>
-      "term2" <~ Core.annotatedTermBody (var "at") $
-      produce $ list [
-        var "term2"], -- TODO: lossy
-    _Term_maybe>>: "ot" ~> produce $ list [
-      Core.termList $ optCases (var "ot")
-        (list ([] :: [TTerm Term]))
-        ("term2" ~> list [var "term2"])],
-    _Term_typeLambda>>: "abs" ~>
-      "term2" <~ Core.typeLambdaBody (var "abs") $
-      produce $ list [var "term2"],
-    _Term_typeApplication>>: "ta" ~>
-      "term2" <~ Core.typeApplicationTermBody (var "ta") $
-      produce $ list [var "term2"],
-    _Term_union>>: "inj" ~>
-      "tname" <~ Core.injectionTypeName (var "inj") $
-      "field" <~ Core.injectionField (var "inj") $
-      "fname" <~ Core.fieldName (var "field") $
-      "fterm" <~ Core.fieldTerm (var "field") $
-      "forFieldType" <~ ("ft" ~>
-        "ftname" <~ Core.fieldTypeName (var "ft") $
-        Core.field (var "fname") $ Core.termMaybe $ Logic.ifElse (Equality.equal (var "ftname") (var "fname"))
-          (just $ var "fterm")
-          (nothing)) $
-      "rt" <<~ Schemas.requireUnionType @@ var "tname" $
-      produce $ list [
-        Core.termRecord $ Core.record (var "tname") (Lists.map (var "forFieldType") (Core.rowTypeFields $ var "rt"))],
-    _Term_unit>>: constant $ produce $ list [
-      Core.termLiteral $ Core.literalBoolean true],
-    _Term_wrap>>: "wt" ~>
-      "term2" <~ Core.wrappedTermBody (var "wt") $
-      produce $ list [
-         var "term2"]]
-
-typeAlternatives :: TBinding (Type -> [Type])
-typeAlternatives = define "typeAlternatives" $
-  doc "Find a list of alternatives for a given type, if any" $
-  "type" ~> cases _Type (var "type")
-    (Just $ list ([] :: [TTerm Type])) [
-    _Type_annotated>>: "at" ~>
-      "type2" <~ Core.annotatedTypeBody (var "at") $
-       list [var "type2"], -- TODO: lossy
-    _Type_maybe>>: "ot" ~> list [
-      Core.typeList $ var "ot"],
-    _Type_union>>: "rt" ~>
-      "tname" <~ Core.rowTypeTypeName (var "rt") $
-      "fields" <~ Core.rowTypeFields (var "rt") $
-      "toOptField" <~ ("f" ~> Core.fieldType (Core.fieldTypeName $ var "f") (MetaTypes.optional $ Core.fieldTypeType $ var "f")) $
-      "optFields" <~ Lists.map (var "toOptField") (var "fields") $
-      list [
-        Core.typeRecord $ Core.rowType (var "tname") (var "optFields")],
-    _Type_unit>>: constant $ list [
-      Core.typeLiteral $ Core.literalTypeBoolean]]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Terms.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Terms.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Terms.hs
+++ /dev/null
@@ -1,853 +0,0 @@
-
-module Hydra.Sources.Kernel.Terms.Adapt.Terms where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel hiding (
-  fieldAdapter, forTypeReference, functionProxyName, functionProxyType, functionToUnion,
-  lambdaToMonotype, maybeToList, passApplication, passEither, passForall, passFunction, passList,
-  passLiteral, passMap, passOptional, passRecord, passSet, passUnion, passUnit, passWrapped,
-  setToList, simplifyApplication, unitToRecord, unionToRecord, unionTypeToRecordType, wrapToUnwrapped,
-  termAdapter, withGraphContext)
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils    as AdaptUtils
-import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
-import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads         as Monads
-import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
-import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
-import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
-
-
-ns :: Namespace
-ns = Namespace "hydra.adapt.terms"
-
-module_ :: Module
-module_ = Module ns elements
-    [AdaptLiterals.ns, AdaptUtils.ns, Annotations.ns, ExtractCore.ns, Monads.ns,
-      Reflect.ns, Rewriting.ns, Schemas.ns, ShowCore.ns]
-    kernelTypesNamespaces $
-    Just "Adapter framework for types and terms"
-  where
-    elements = [
-      toBinding fieldAdapter,
-      toBinding forTypeReference,
-      toBinding functionProxyName,
-      toBinding functionProxyType,
-      toBinding functionToUnion,
-      toBinding lambdaToMonotype,
-      toBinding maybeToList,
-      toBinding passApplication,
-      toBinding passEither,
-      toBinding passFunction,
-      toBinding passForall,
-      toBinding passLiteral,
-      toBinding passList,
-      toBinding passMap,
-      toBinding passOptional,
-      toBinding passRecord,
-      toBinding passSet,
-      toBinding passUnion,
-      toBinding passUnit,
-      toBinding passWrapped,
-      toBinding setToList,
-      toBinding simplifyApplication,
-      toBinding termAdapter,
-      toBinding unionToRecord,
-      toBinding unionTypeToRecordType,
-      toBinding unitToRecord,
-      toBinding wrapToUnwrapped,
-      toBinding withGraphContext]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-fieldAdapter :: TBinding (FieldType -> Flow AdapterContext (SymmetricAdapter AdapterContext FieldType Field))
-fieldAdapter = define "fieldAdapter" $
-  doc "Create an adapter for field types" $
-  "ftyp" ~>
-  "encdec" <~ ("ad" ~> "dir" ~> "field" ~>
-    "name" <~ Core.fieldName (var "field") $
-    "term" <~ Core.fieldTerm (var "field") $
-    "newTerm" <<~ AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "ad")) @@ var "term" $
-    produce $ Core.field (var "name") (var "newTerm")) $
-  "ad" <<~ termAdapter @@ (Core.fieldTypeType (var "ftyp")) $
-  produce (Compute.adapter
-    (Compute.adapterIsLossy (var "ad"))
-    (var "ftyp")
-    (Core.fieldType (Core.fieldTypeName (var "ftyp")) (Compute.adapterTarget (var "ad")))
-    (AdaptUtils.bidirectional @@ (var "encdec" @@ var "ad")))
-
-forTypeReference :: TBinding (Name -> Flow AdapterContext (SymmetricAdapter AdapterContext Type Term))
-forTypeReference = define "forTypeReference" $
-  doc "This function accounts for recursive type definitions" $
-  "name" ~>
-  "encdec" <~ ("name" ~> "dir" ~> "term" ~>
-    "cx" <<~ Monads.getState $
-    "adapters" <~ Coders.adapterContextAdapters (var "cx") $
-    Maybes.maybe
-      (Flows.fail (Strings.cat2 (string "no adapter for reference type ") (unwrap _Name @@ var "name")))
-      ("ad" ~> AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "ad")) @@ var "term")
-      (Maps.lookup (var "name") (var "adapters"))) $
-  "forType" <~ ("cx" ~> "adapters" ~> "t" ~>
-    "actual" <<~ termAdapter @@ var "t" $
-    "finalAdapters" <~ Maps.insert (var "name") (var "actual") (var "adapters") $
-    "finalCx" <~ Coders.adapterContext
-      (Coders.adapterContextGraph (var "cx"))
-      (Coders.adapterContextLanguage (var "cx"))
-      (var "finalAdapters") $
-    "ignored2" <<~ Monads.putState @@ var "finalCx" $
-    produce (var "actual")) $
-  "forMissingAdapter" <~ ("cx" ~> "lossy" ~> "adapters" ~> "placeholder" ~>
-    "newAdapters" <~ Maps.insert (var "name") (var "placeholder") (var "adapters") $
-    "newCx" <~ Coders.adapterContext
-      (Coders.adapterContextGraph (var "cx"))
-      (Coders.adapterContextLanguage (var "cx"))
-      (var "newAdapters") $
-    "ignored" <<~ Monads.putState @@ var "newCx" $
-    "mt" <<~ withGraphContext @@ (Schemas.resolveType @@ (Core.typeVariable (var "name"))) $
-    Maybes.maybe
-      (produce (Compute.adapter (var "lossy") (Core.typeVariable (var "name")) (Core.typeVariable (var "name"))
-        (AdaptUtils.bidirectional @@ ("dir" ~> "term" ~> produce (var "term")))))
-      (var "forType" @@ var "cx" @@ var "adapters")
-      (var "mt")) $
-  "flow" <~ (
-    "lossy" <~ false $
-    "placeholder" <~ Compute.adapter (var "lossy") (Core.typeVariable (var "name")) (Core.typeVariable (var "name"))
-      (AdaptUtils.bidirectional @@ (var "encdec" @@ var "name")) $
-    "cx" <<~ Monads.getState $
-    "adapters" <~ Coders.adapterContextAdapters (var "cx") $
-    Maybes.maybe
-      (var "forMissingAdapter" @@ var "cx" @@ var "lossy" @@ var "adapters" @@ var "placeholder")
-      (unaryFunction Flows.pure)
-      (Maps.lookup (var "name") (var "adapters"))) $
-  trace (Strings.cat2 (string "adapt named type ") (unwrap _Name @@ var "name")) $
-  var "flow"
-
-functionProxyName :: TBinding Name
-functionProxyName = define "functionProxyName" $
-  Core.name (string "hydra.core.FunctionProxy")
-
-functionProxyType :: TBinding (a -> Type)
-functionProxyType = define "functionProxyType" $
-  doc "Generate a function proxy type for a given domain type" $
-  constant (Core.typeUnion (Core.rowType (functionProxyName) (list [
-    Core.fieldType (Core.nameLift _Elimination_wrap) MetaTypes.string,
-    Core.fieldType (Core.nameLift _Elimination_record) MetaTypes.string,
-    Core.fieldType (Core.nameLift _Elimination_union) MetaTypes.string,
-    Core.fieldType (Core.nameLift _Function_lambda) MetaTypes.string,
-    Core.fieldType (Core.nameLift _Function_primitive) MetaTypes.string,
-    Core.fieldType (Core.nameLift _Term_variable) MetaTypes.string])))
-
-functionToUnion :: TBinding TypeAdapter
-functionToUnion = define "functionToUnion" $
-  doc "Convert function types to union types" $
-  "t" ~>
-  "encTerm" <~ ("term" ~> "strippedTerm" ~> cases _Term (var "strippedTerm")
-    Nothing [
-    _Term_function>>: "f" ~> cases _Function (var "f")
-      Nothing [
-      _Function_elimination>>: "e" ~> cases _Elimination (var "e")
-        Nothing [
-        _Elimination_wrap>>: "name" ~> Core.termUnion (Core.injection (functionProxyName)
-          (Core.field (Core.nameLift _Elimination_wrap) (MetaTerms.stringLift (unwrap _Name @@ var "name")))),
-        _Elimination_record>>: "r" ~> Core.termUnion (Core.injection (functionProxyName)
-          (Core.field (Core.nameLift _Elimination_record) (MetaTerms.stringLift (ShowCore.term @@ var "term")))),
-        _Elimination_union>>: "u" ~> Core.termUnion (Core.injection (functionProxyName)
-          (Core.field (Core.nameLift _Elimination_union) (MetaTerms.stringLift (ShowCore.term @@ var "term"))))],
-      _Function_lambda>>: "l" ~> Core.termUnion (Core.injection (functionProxyName)
-        (Core.field (Core.nameLift _Function_lambda) (MetaTerms.stringLift (ShowCore.term @@ var "term")))),
-      _Function_primitive>>: "name" ~> Core.termUnion (Core.injection (functionProxyName)
-        (Core.field (Core.nameLift _Function_primitive) (MetaTerms.stringLift (unwrap _Name @@ var "name"))))],
-    _Term_variable>>: "name" ~>
-      Core.termUnion (Core.injection (functionProxyName) (Core.field (Core.nameLift _Term_variable) (MetaTerms.stringLift (unwrap _Name @@ var "name"))))]) $
-  "encode" <~ ("ad" ~> "term" ~>
-    "strippedTerm" <~ Rewriting.deannotateTerm @@ var "term" $
-    Compute.coderEncode (Compute.adapterCoder (var "ad")) @@ (var "encTerm" @@ var "term" @@ var "strippedTerm")) $
-  "readFromString" <~ ("term" ~>
-    "s" <<~ ExtractCore.string @@ var "term" $
-    Maybes.maybe
-      (Flows.fail (Strings.cat2 (string "failed to parse term: ") (var "s")))
-      (unaryFunction Flows.pure)
-      (ShowCore.readTerm @@ var "s")) $
-  "decode" <~ ("ad" ~> "term" ~>
-    "notFound" <~ ("fname" ~> Flows.fail (Strings.cat2 (string "unexpected field: ") (unwrap _Name @@ var "fname"))) $
-    "forCases" <~ ("fterm" ~> withGraphContext @@ (var "readFromString" @@ var "fterm")) $
-    "forLambda" <~ ("fterm" ~> withGraphContext @@ (var "readFromString" @@ var "fterm")) $
-    "forWrapped" <~ ("fterm" ~> withGraphContext @@ (Flows.map ("s" ~> MetaTerms.unwrap (Core.name (var "s"))) (ExtractCore.string @@ var "fterm"))) $
-    "forPrimitive" <~ ("fterm" ~> withGraphContext @@ (Flows.map ("s" ~> MetaTerms.primitiveLift (Core.name (var "s"))) (ExtractCore.string @@ var "fterm"))) $
-    "forProjection" <~ ("fterm" ~> withGraphContext @@ (var "readFromString" @@ var "fterm")) $
-    "forVariable" <~ ("fterm" ~> withGraphContext @@ (Flows.map ("s" ~> Core.termVariable (Core.name (var "s"))) (ExtractCore.string @@ var "fterm"))) $
-    "injTerm" <<~ Compute.coderDecode (Compute.adapterCoder (var "ad")) @@ var "term" $
-    "field" <<~ withGraphContext @@ (ExtractCore.injection @@ (functionProxyName) @@ var "injTerm") $
-    "fname" <~ Core.fieldName (var "field") $
-    "fterm" <~ Core.fieldTerm (var "field") $
-    Maybes.fromMaybe (var "notFound" @@ var "fname") (Maps.lookup (var "fname") (Maps.fromList (list [
-      pair (Core.nameLift _Elimination_wrap) (var "forWrapped" @@ var "fterm"),
-      pair (Core.nameLift _Elimination_record) (var "forProjection" @@ var "fterm"),
-      pair (Core.nameLift _Elimination_union) (var "forCases" @@ var "fterm"),
-      pair (Core.nameLift _Function_lambda) (var "forLambda" @@ var "fterm"),
-      pair (Core.nameLift _Function_primitive) (var "forPrimitive" @@ var "fterm"),
-      pair (Core.nameLift _Term_variable) (var "forVariable" @@ var "fterm")])))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_function>>: "ft" ~>
-      "dom" <~ Core.functionTypeDomain (var "ft") $
-      "cod" <~ Core.functionTypeCodomain (var "ft") $
-      "unionType" <~ (
-        "domAd" <<~ termAdapter @@ var "dom" $
-        produce (Core.typeUnion (Core.rowType (functionProxyName) (list [
-          Core.fieldType (Core.nameLift _Elimination_wrap) MetaTypes.string,
-          Core.fieldType (Core.nameLift _Elimination_record) MetaTypes.string,
-          Core.fieldType (Core.nameLift _Elimination_union) MetaTypes.string,
-          Core.fieldType (Core.nameLift _Function_lambda) MetaTypes.string,
-          Core.fieldType (Core.nameLift _Function_primitive) MetaTypes.string,
-          Core.fieldType (Core.nameLift _Term_variable) MetaTypes.string])))) $
-      "ut" <<~ var "unionType" $
-      "ad" <<~ termAdapter @@ var "ut" $
-      produce (Compute.adapter
-        (Compute.adapterIsLossy (var "ad"))
-        (var "t")
-        (Compute.adapterTarget (var "ad"))
-        (Compute.coder (var "encode" @@ var "ad") (var "decode" @@ var "ad")))]
-
-lambdaToMonotype :: TBinding TypeAdapter
-lambdaToMonotype = define "lambdaToMonotype" $
-  doc "Convert forall types to monotypes" $
-  "t" ~> cases _Type (var "t")
-    Nothing [
-    _Type_forall>>: "ft" ~>
-      "body" <~ Core.forallTypeBody (var "ft") $
-      "ad" <<~ termAdapter @@ var "body" $
-      produce (Compute.adapter
-        (Compute.adapterIsLossy (var "ad"))
-        (var "t")
-        (Compute.adapterTarget (var "ad"))
-        (Compute.adapterCoder (var "ad")))]
-
-maybeToList :: TBinding TypeAdapter
-maybeToList = define "maybeToList" $
-  doc "Convert optional types to list types" $
-  "t" ~>
-  "encode" <~ ("ad" ~> "term" ~> cases _Term (var "term")
-    Nothing [
-    _Term_maybe>>: "m" ~> Maybes.maybe
-      (produce (MetaTerms.list []))
-      ("r" ~>
-        "encoded" <<~ Compute.coderEncode (Compute.adapterCoder (var "ad")) @@ var "r" $
-        produce (Core.termList (list [var "encoded"])))
-      (var "m")]) $
-  "decode" <~ ("ad" ~> "term" ~> cases _Term (var "term")
-    Nothing [
-    _Term_list>>: "l" ~> Flows.map (unaryFunction Core.termMaybe) (Logic.ifElse (Lists.null (var "l"))
-      (produce nothing)
-      ("decoded" <<~ Compute.coderDecode (Compute.adapterCoder (var "ad")) @@ (Lists.head (var "l")) $
-       produce (just (var "decoded"))))]) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_maybe>>: "ot" ~>
-      "ad" <<~ termAdapter @@ var "ot" $
-      produce (Compute.adapter
-        false
-        (var "t")
-        (Core.typeList (Compute.adapterTarget (var "ad")))
-        (Compute.coder (var "encode" @@ var "ad") (var "decode" @@ var "ad")))]
-
-passApplication :: TBinding TypeAdapter
-passApplication = define "passApplication" $
-  doc "Pass through application types" $
-  "t" ~>
-  "forApplicationType" <~ ("at" ~>
-    "lhs" <~ Core.applicationTypeFunction (var "at") $
-    "rhs" <~ Core.applicationTypeArgument (var "at") $
-    "lhsAd" <<~ termAdapter @@ var "lhs" $
-    "rhsAd" <<~ termAdapter @@ var "rhs" $
-    produce (Compute.adapter
-      (Logic.or (Compute.adapterIsLossy (var "lhsAd")) (Compute.adapterIsLossy (var "rhsAd")))
-      (var "t")
-      (Core.typeApplication (Core.applicationType (Compute.adapterTarget (var "lhsAd")) (Compute.adapterTarget (var "rhsAd"))))
-      (AdaptUtils.bidirectional @@
-        ("dir" ~> "term" ~> AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "lhsAd")) @@ var "term")))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_application>>: "at" ~> var "forApplicationType" @@ var "at"]
-
-passEither :: TBinding TypeAdapter
-passEither = define "passEither" $
-  doc "Pass through either types" $
-  "t" ~>
-  "forEitherType" <~ ("et" ~>
-    "left" <~ Core.eitherTypeLeft (var "et") $
-    "right" <~ Core.eitherTypeRight (var "et") $
-    "leftAd" <<~ termAdapter @@ var "left" $
-    "rightAd" <<~ termAdapter @@ var "right" $
-    produce (Compute.adapter
-      (Logic.or (Compute.adapterIsLossy (var "leftAd")) (Compute.adapterIsLossy (var "rightAd")))
-      (var "t")
-      (Core.typeEither (Core.eitherType (Compute.adapterTarget (var "leftAd")) (Compute.adapterTarget (var "rightAd"))))
-      (AdaptUtils.bidirectional @@
-        ("dir" ~> "term" ~> AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "leftAd")) @@ var "term")))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_either>>: "et" ~> var "forEitherType" @@ var "et"]
-
-passForall :: TBinding TypeAdapter
-passForall = define "passForall" $
-  doc "Pass through forall types" $
-  "t" ~>
-  "forForallType" <~ ("ft" ~>
-    "v" <~ Core.forallTypeParameter (var "ft") $
-    "body" <~ Core.forallTypeBody (var "ft") $
-    "ad" <<~ termAdapter @@ var "body" $
-    produce (Compute.adapter
-      (Compute.adapterIsLossy (var "ad"))
-      (var "t")
-      (Core.typeForall (Core.forallType (var "v") (Compute.adapterTarget (var "ad"))))
-      (AdaptUtils.bidirectional @@ ("dir" ~> "term" ~>
-        AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "ad")) @@ var "term")))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_forall>>: "ft" ~> var "forForallType" @@ var "ft"]
-
-passFunction :: TBinding TypeAdapter
-passFunction = define "passFunction" $
-  doc "Pass through function types with adaptation" $
-  "t" ~>
-  "toCaseAds" <~ ("dom" ~> "cod" ~> cases _Type (Rewriting.deannotateType @@ var "dom")
-    (Just (produce Maps.empty)) [
-    _Type_union >>: "rt" ~>
-      "pairs" <<~ Flows.mapList
-        ("f" ~>
-          "ad" <<~ fieldAdapter @@ Core.fieldType
-            (Core.fieldTypeName (var "f"))
-            (Core.typeFunction (Core.functionType
-              (Core.fieldTypeType (var "f"))
-              (var "cod"))) $
-          produce (pair (Core.fieldTypeName (var "f")) (var "ad")))
-        (Core.rowTypeFields (var "rt")) $
-      produce (Maps.fromList (var "pairs"))]) $
-  "toOptionAd" <~ ("dom" ~> "cod" ~> cases _Type (Rewriting.deannotateType @@ var "dom")
-    (Just (produce nothing)) [
-    _Type_maybe >>: "ot" ~>
-      Flows.map (unaryFunction just) (termAdapter @@ MetaTypes.function (var "ot") (var "cod"))]) $
-  "getCoder" <~ ("caseAds" ~> "fname" ~> Maybes.maybe
-    AdaptUtils.idCoder
-    (unaryFunction Compute.adapterCoder)
-    (Maps.lookup (var "fname") (var "caseAds"))) $
-  "forElimination" <~ ("dir" ~> "codAd" ~> "caseAds" ~> "e" ~> cases _Elimination (var "e")
-    Nothing [
-    _Elimination_union >>: "cs" ~>
-      "n" <~ Core.caseStatementTypeName (var "cs") $
-      "def" <~ Core.caseStatementDefault (var "cs") $
-      "cases" <~ Core.caseStatementCases (var "cs") $
-      "rcases" <<~ Flows.mapList
-        ("f" ~> AdaptUtils.encodeDecode @@ var "dir" @@ (var "getCoder" @@ var "caseAds" @@ Core.fieldName (var "f")) @@ var "f")
-        (var "cases") $
-      "rdef" <<~ Maybes.maybe
-        (produce nothing)
-        ("d" ~> Flows.map (unaryFunction just) (AdaptUtils.encodeDecode @@ var "dir" @@ Compute.adapterCoder (var "codAd") @@ var "d"))
-        (var "def") $
-      produce (Core.eliminationUnion (Core.caseStatement (var "n") (var "rdef") (var "rcases")))]) $
-  "forFunction" <~ ("dir" ~> "codAd" ~> "caseAds" ~> "f" ~> cases _Function (var "f")
-    Nothing [
-    _Function_elimination >>: "e" ~>
-      Flows.map (unaryFunction Core.functionElimination)
-        (var "forElimination" @@ var "dir" @@ var "codAd" @@ var "caseAds" @@ var "e"),
-    _Function_lambda >>: "l" ~>
-      "var" <~ Core.lambdaParameter (var "l") $
-      "d" <~ Core.lambdaDomain (var "l") $
-      "body" <~ Core.lambdaBody (var "l") $
-      "newBody" <<~ AdaptUtils.encodeDecode @@ var "dir" @@ Compute.adapterCoder (var "codAd") @@ var "body" $
-      produce (Core.functionLambda (Core.lambda (var "var") (var "d") (var "newBody"))),
-    _Function_primitive >>: "name" ~> produce (Core.functionPrimitive (var "name"))]) $
-  "encdec" <~ ("codAd" ~> "caseAds" ~> "dir" ~> "term" ~> cases _Term (Rewriting.deannotateTerm @@ var "term")
-    (Just (produce (var "term"))) [
-    _Term_function >>: "f" ~> Flows.map (unaryFunction Core.termFunction)
-      (var "forFunction" @@ var "dir" @@ var "codAd" @@ var "caseAds" @@ var "f")]) $
-  "forFunctionType" <~ ("ft" ~>
-    "dom" <~ Core.functionTypeDomain (var "ft") $
-    "cod" <~ Core.functionTypeCodomain (var "ft") $
-    "domAd" <<~ termAdapter @@ var "dom" $
-    "codAd" <<~ termAdapter @@ var "cod" $
-    "caseAds" <<~ var "toCaseAds" @@ var "dom" @@ var "cod" $
-    "optionAd" <<~ var "toOptionAd" @@ var "dom" @@ var "cod" $
-    "lossy" <~ Logic.or
-      (Compute.adapterIsLossy (var "codAd"))
-      (Logic.ors (Lists.map ("pair" ~> Compute.adapterIsLossy (Pairs.second (var "pair"))) (Maps.toList (var "caseAds")))) $
-    "target" <~ MetaTypes.function (Compute.adapterTarget (var "domAd")) (Compute.adapterTarget (var "codAd")) $
-    produce $ Compute.adapter (var "lossy") (var "t") (var "target")
-      (AdaptUtils.bidirectional @@ (var "encdec" @@ var "codAd" @@ var "caseAds"))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_function >>: "ft" ~> var "forFunctionType" @@ var "ft"]
-
-passList :: TBinding TypeAdapter
-passList = define "passList" $
-  doc "Pass through list types" $
-  "t" ~>
-  "encdec" <~ ("ad" ~> "dir" ~> "term" ~> cases _Term (var "term")
-    Nothing [
-    _Term_list>>: "terms" ~>
-      "newTerms" <<~ Flows.mapList (AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "ad"))) (var "terms") $
-      produce (Core.termList (var "newTerms"))]) $
-  "forListType" <~ ("lt" ~>
-    "ad" <<~ termAdapter @@ var "lt" $
-    produce (Compute.adapter
-      (Compute.adapterIsLossy (var "ad"))
-      (var "t")
-      (MetaTypes.list (Compute.adapterTarget (var "ad")))
-      (AdaptUtils.bidirectional @@ (var "encdec" @@ var "ad")))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_list>>: "lt" ~> var "forListType" @@ var "lt"]
-
-passLiteral :: TBinding TypeAdapter
-passLiteral = define "passLiteral" $
-  doc "Pass through literal types with literal adaptation" $
-  "t" ~>
-  "encdec" <~ ("ad" ~> "dir" ~> "term" ~>
-    "l" <<~ withGraphContext @@ (ExtractCore.literal @@ var "term") $
-    "l2" <<~ AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "ad")) @@ var "l" $
-    produce $ Core.termLiteral $ var "l2") $
-  "forLiteral" <~ ("lt" ~>
-    "ad" <<~ AdaptLiterals.literalAdapter @@ var "lt" $
-    "step" <~ AdaptUtils.bidirectional @@ (var "encdec" @@ var "ad") $
-    produce (Compute.adapter
-      (Compute.adapterIsLossy (var "ad"))
-      (Core.typeLiteral (Compute.adapterSource (var "ad")))
-      (Core.typeLiteral (Compute.adapterTarget (var "ad")))
-      (var "step"))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_literal>>: "lt" ~> var "forLiteral" @@ var "lt"]
-
-passMap :: TBinding TypeAdapter
-passMap = define "passMap" $
-  doc "Pass through map types" $
-  "t" ~>
-  "encdec" <~ ("kad" ~> "vad" ~> "dir" ~> "term" ~> cases _Term (var "term")
-    Nothing [
-    _Term_map>>: "m" ~>
-      "newPairs" <<~ Flows.mapList
-        ("pair" ~>
-          "k" <~ Pairs.first (var "pair") $
-          "v" <~ Pairs.second (var "pair") $
-          "newK" <<~ AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "kad")) @@ var "k" $
-          "newV" <<~ AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "vad")) @@ var "v" $
-          produce (pair (var "newK") (var "newV")))
-        (Maps.toList (var "m")) $
-      produce (Core.termMap (Maps.fromList (var "newPairs")))]) $
-  "forMapType" <~ ("mt" ~>
-    "kt" <~ Core.mapTypeKeys (var "mt") $
-    "vt" <~ Core.mapTypeValues (var "mt") $
-    "kad" <<~ termAdapter @@ var "kt" $
-    "vad" <<~ termAdapter @@ var "vt" $
-    produce (Compute.adapter
-      (Logic.or (Compute.adapterIsLossy (var "kad")) (Compute.adapterIsLossy (var "vad")))
-      (var "t")
-      (MetaTypes.map (Compute.adapterTarget (var "kad")) (Compute.adapterTarget (var "vad")))
-      (AdaptUtils.bidirectional @@ (var "encdec" @@ var "kad" @@ var "vad")))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_map>>: "mt" ~> var "forMapType" @@ var "mt"]
-
-passOptional :: TBinding TypeAdapter
-passOptional = define "passOptional" $
-  doc "Pass through optional types" $
-  "t" ~>
-  "mapTerm" <~ ("coder" ~> "dir" ~> "term" ~>
-    "opt" <<~ withGraphContext @@ (ExtractCore.maybeTerm @@ unaryFunction Flows.pure @@ var "term") $
-    "newOpt" <<~ Flows.mapMaybe (AdaptUtils.encodeDecode @@ var "dir" @@ var "coder") (var "opt") $
-    produce (Core.termMaybe (var "newOpt"))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_maybe>>: "ot" ~>
-      "adapter" <<~ termAdapter @@ var "ot" $
-      produce (Compute.adapter
-        (Compute.adapterIsLossy (var "adapter"))
-        (var "t")
-        (Core.typeMaybe (Compute.adapterTarget (var "adapter")))
-        (AdaptUtils.bidirectional @@ (var "mapTerm" @@ (Compute.adapterCoder (var "adapter")))))]
-
-passRecord :: TBinding TypeAdapter
-passRecord = define "passRecord" $
-  doc "Pass through record types" $
-  "t" ~>
-  "encdec" <~ ("rt" ~> "adapters" ~> "dir" ~> "term" ~> cases _Term (var "term")
-    Nothing [
-    _Term_record>>: "rec" ~>
-      "dfields" <~ Core.recordFields (var "rec") $
-      "newFields" <<~ Flows.sequence (Lists.zipWith
-        ("ad" ~> "f" ~> AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "ad")) @@ var "f")
-        (var "adapters")
-        (var "dfields")) $
-      produce (Core.termRecord (Core.record (Core.rowTypeTypeName (var "rt")) (var "newFields")))]) $
-  "forRecordType" <~ ("rt" ~>
-    "adapters" <<~ Flows.mapList (fieldAdapter) (Core.rowTypeFields (var "rt")) $
-    "lossy" <~ Logic.ors (Lists.map (unaryFunction Compute.adapterIsLossy) (var "adapters")) $
-    "sfields'" <~ Lists.map (unaryFunction Compute.adapterTarget) (var "adapters") $
-    produce (Compute.adapter
-      (var "lossy")
-      (var "t")
-      (Core.typeRecord (Core.rowType (Core.rowTypeTypeName (var "rt")) (var "sfields'")))
-      (AdaptUtils.bidirectional @@ (var "encdec" @@ var "rt" @@ var "adapters")))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_record>>: "rt" ~> var "forRecordType" @@ var "rt"]
-
-passSet :: TBinding TypeAdapter
-passSet = define "passSet" $
-  doc "Pass through set types" $
-  "t" ~>
-  "encdec" <~ ("ad" ~> "dir" ~> "term" ~> cases _Term (var "term")
-    Nothing [
-    _Term_set>>: "terms" ~>
-      "newTerms" <<~ Flows.mapList (AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "ad"))) (Sets.toList (var "terms")) $
-      produce (Core.termSet (Sets.fromList (var "newTerms")))]) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_set>>: "st" ~>
-      "ad" <<~ termAdapter @@ var "st" $
-      produce (Compute.adapter
-        (Compute.adapterIsLossy (var "ad"))
-        (var "t")
-        (MetaTypes.set (Compute.adapterTarget (var "ad")))
-        (AdaptUtils.bidirectional @@ (var "encdec" @@ var "ad")))]
-
-passUnion :: TBinding TypeAdapter
-passUnion = define "passUnion" $
-  doc "Pass through union types" $
-  "t" ~> cases _Type (var "t")
-    Nothing [
-    _Type_union>>: "rt" ~>
-      "sfields" <~ Core.rowTypeFields (var "rt") $
-      "tname" <~ Core.rowTypeTypeName (var "rt") $
-      "getAdapter" <~ ("adaptersMap" ~> "f" ~>
-        Maybes.maybe
-          (Flows.fail (Strings.cat2 (string "no such field: ") (unwrap _Name @@ (Core.fieldName (var "f")))))
-          (unaryFunction Flows.pure)
-          (Maps.lookup (Core.fieldName (var "f")) (var "adaptersMap"))) $
-      "adapters" <<~ Flows.mapList
-        ("f" ~>
-          "ad" <<~ fieldAdapter @@ var "f" $
-          produce (pair (Core.fieldTypeName (var "f")) (var "ad")))
-        (var "sfields") $
-      "adaptersMap" <~ Maps.fromList (var "adapters") $
-      "lossy" <~ Logic.ors (Lists.map ("pair" ~> Compute.adapterIsLossy (Pairs.second (var "pair"))) (var "adapters")) $
-      "sfields'" <~ Lists.map ("pair" ~> Compute.adapterTarget (Pairs.second (var "pair"))) (var "adapters") $
-      produce (Compute.adapter
-        (var "lossy")
-        (var "t")
-        (Core.typeUnion (Core.rowType (var "tname") (var "sfields'")))
-        (AdaptUtils.bidirectional @@ ("dir" ~> "term" ~>
-          -- Note: this is a shortcut, since we anticipate deprecating the current term adapter logic
-          produce (var "term"))))]
-          -- TODO: consider restoring the following
---          (AdaptUtils.bidirectional @@ (lambdas ["dir", "term"] $
---            "dfield" <<~ withGraphContext @@ (ExtractCore.injectionDef @@ var "tname" @@ var "term") $
---            "ad" <<~ var "getAdapter" @@ var "adaptersMap" @@ var "dfield" $
---            "newField" <<~ AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder $ var "ad") @@ var "dfield" $
---            produce $ Core.termUnion $ Core.injection (var "tname") (var "newField")))]
-
-passUnit :: TBinding TypeAdapter
-passUnit = define "passUnit" $
-  doc "Pass through unit types" $
-  constant (produce (Compute.adapter false Core.typeUnit Core.typeUnit
-    (Compute.coder
-      (constant (produce Core.termUnit))
-      (constant (produce Core.termUnit)))))
-
-passWrapped :: TBinding TypeAdapter
-passWrapped = define "passWrapped" $
-  doc "Pass through wrapped types" $
-  "t" ~> cases _Type (var "t")
-    Nothing [
-    _Type_wrap>>: "wt" ~>
-      "tname" <~ Core.wrappedTypeTypeName (var "wt") $
-      "ot" <~ Core.wrappedTypeBody (var "wt") $
-      "mapTerm" <~ ("coder" ~> "dir" ~> "term" ~>
-        "unwrapped" <<~ withGraphContext @@ (ExtractCore.wrap @@ var "tname" @@ var "term") $
-        "newTerm" <<~ AdaptUtils.encodeDecode @@ var "dir" @@ var "coder" @@ var "unwrapped" $
-        produce (Core.termWrap (Core.wrappedTerm (var "tname") (var "newTerm")))) $
-      "adapter" <<~ termAdapter @@ var "ot" $
-      produce (Compute.adapter
-        (Compute.adapterIsLossy (var "adapter"))
-        (var "t")
-        (Core.typeWrap (Core.wrappedType (var "tname") (Compute.adapterTarget (var "adapter"))))
-        (AdaptUtils.bidirectional @@ (var "mapTerm" @@ (Compute.adapterCoder (var "adapter")))))]
-
-setToList :: TBinding TypeAdapter
-setToList = define "setToList" $
-  doc "Convert set types to list types" $
-  "t" ~>
-  "encode" <~ ("ad" ~> "term" ~> cases _Term (var "term")
-    Nothing [
-    _Term_set>>: "s" ~> Compute.coderEncode (Compute.adapterCoder (var "ad")) @@ (Core.termList (Sets.toList (var "s")))]) $
-  "forListTerm" <~ ("t" ~> cases _Term (var "t")
-    Nothing [
-    _Term_list>>: "l" ~> produce (Core.termSet (Sets.fromList (var "l")))]) $
-  "decode" <~ ("ad" ~> "term" ~>
-    "listTerm" <<~ Compute.coderDecode (Compute.adapterCoder (var "ad")) @@ var "term" $
-    var "forListTerm" @@ var "listTerm") $
-  "forSetType" <~ ("st" ~>
-    "ad" <<~ termAdapter @@ (MetaTypes.list (var "st")) $
-    produce (Compute.adapter
-      (Compute.adapterIsLossy (var "ad"))
-      (var "t")
-      (Compute.adapterTarget (var "ad"))
-      (Compute.coder (var "encode" @@ var "ad") (var "decode" @@ var "ad")))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_set>>: "st" ~> var "forSetType" @@ var "st"]
-
-simplifyApplication :: TBinding TypeAdapter
-simplifyApplication = define "simplifyApplication" $
-  doc "Simplify application types" $
-  "t" ~>
-  "encdec" <~ ("ad" ~> "dir" ~> "term" ~>
-    AdaptUtils.encodeDecode @@ var "dir" @@ (Compute.adapterCoder (var "ad")) @@ var "term") $
-  "forApplicationType" <~ ("at" ~>
-    "lhs" <~ Core.applicationTypeFunction (var "at") $
-    "ad" <<~ termAdapter @@ var "lhs" $
-    produce (Compute.adapter
-      false
-      (var "t")
-      (Compute.adapterTarget (var "ad"))
-      (AdaptUtils.bidirectional @@ (var "encdec" @@ var "ad")))) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_application>>: "at" ~> var "forApplicationType" @@ var "at"]
-
-unitToRecord :: TBinding TypeAdapter
-unitToRecord = define "unitToRecord" $
-    doc "Convert unit terms to records" $
-    constant (produce
-      (Compute.adapter false Core.typeUnit (Core.typeRecord (Core.rowType unitName (list ([] :: [TTerm FieldType]))))
-        (Compute.coder
-          (constant (produce (Core.termRecord (Core.record unitName (list ([] :: [TTerm Field]))))))
-          (constant (produce Core.termUnit)))))
-  where
-    unitName = Core.name (string "_Unit")
-
-unionToRecord :: TBinding TypeAdapter
-unionToRecord = define "unionToRecord" $
-  doc "Convert union types to record types" $
-  "t" ~>
-  "forField" <~ ("field" ~>
-    "fn" <~ Core.fieldName (var "field") $
-    "fterm" <~ Core.fieldTerm (var "field") $
-    cases _Term (var "fterm")
-      Nothing [
-      _Term_maybe>>: "opt" ~> Maybes.bind (var "opt") ("t" ~>
-        just (Core.field (var "fn") (var "t")))]) $
-  "fromRecordFields" <~ ("term" ~> "term'" ~> "t'" ~> "fields" ~>
-    "matches" <~ Maybes.mapMaybe (var "forField") (var "fields") $
-    Logic.ifElse (Lists.null (var "matches"))
-      (Flows.fail (Strings.cat (list [
-        string "cannot convert term back to union: ",
-        ShowCore.term @@ var "term",
-        string " where type = ",
-        ShowCore.type_ @@ var "t",
-        string "    and target type = ",
-        ShowCore.type_ @@ var "t'"])))
-      (produce (Lists.head (var "matches")))) $
-  "forRecTerm" <~ ("nm" ~> "ad" ~> "term" ~> "recTerm" ~> cases _Term (var "recTerm")
-    Nothing [
-    _Term_record>>: "rec" ~>
-      "fields" <~ Core.recordFields (var "rec") $
-      "resultField" <<~
-        (var "fromRecordFields"
-          @@ var "term"
-          @@ (Core.termRecord (Core.record (var "nm") (var "fields")))
-          @@ (Compute.adapterTarget (var "ad"))
-          @@ var "fields") $
-      produce (Core.termUnion (Core.injection (var "nm") (var "resultField")))]) $
-  cases _Type (var "t")
-    Nothing [
-    _Type_union>>: "rt" ~>
-      "nm" <~ Core.rowTypeTypeName (var "rt") $
-      "sfields" <~ Core.rowTypeFields (var "rt") $
-      "target" <~ Core.typeRecord (unionTypeToRecordType @@ var "rt") $
-      "toRecordField" <~ ("term" ~> "fn" ~> "f" ~>
-        "fn'" <~ Core.fieldTypeName (var "f") $
-        Core.field (var "fn'") (Core.termMaybe (Logic.ifElse
-          (Equality.equal (var "fn'") (var "fn"))
-          (just (var "term"))
-          nothing))) $
-      "ad" <<~ termAdapter @@ var "target" $
-      produce (Compute.adapter
-        (Compute.adapterIsLossy (var "ad"))
-        (var "t")
-        (Compute.adapterTarget (var "ad"))
-        (Compute.coder
-          ("term'" ~>
-            "field" <<~ withGraphContext @@ (ExtractCore.injection @@ (Core.rowTypeTypeName (var "rt")) @@ var "term'") $
-            "fn" <~ Core.fieldName (var "field") $
-            "term" <~ Core.fieldTerm (var "field") $
-            Compute.coderEncode (Compute.adapterCoder (var "ad")) @@
-              (Core.termRecord (Core.record (var "nm") (Lists.map (var "toRecordField" @@ var "term" @@ var "fn") (var "sfields")))))
-          ("term" ~>
-            "recTerm" <<~ Compute.coderDecode (Compute.adapterCoder (var "ad")) @@ var "term" $
-            var "forRecTerm" @@ var "nm" @@ var "ad" @@ var "term" @@ var "recTerm")))]
-
-unionTypeToRecordType :: TBinding (RowType -> RowType)
-unionTypeToRecordType = define "unionTypeToRecordType" $
-  doc "Convert a union row type to a record row type" $
-  "rt" ~>
-  "makeOptional" <~ ("f" ~>
-    "fn" <~ Core.fieldTypeName (var "f") $
-    "ft" <~ Core.fieldTypeType (var "f") $
-    Core.fieldType (var "fn") (Rewriting.mapBeneathTypeAnnotations @@ unaryFunction Core.typeMaybe @@ var "ft")) $
-  Core.rowType (Core.rowTypeTypeName (var "rt")) (Lists.map (var "makeOptional") (Core.rowTypeFields (var "rt")))
-
-wrapToUnwrapped :: TBinding TypeAdapter
-wrapToUnwrapped = define "wrapToUnwrapped" $
-  doc "Convert wrapped types to unwrapped types" $
-  "t" ~> cases _Type (var "t")
-    Nothing [
-    _Type_wrap>>: "wt" ~>
-      "tname" <~ Core.wrappedTypeTypeName (var "wt") $
-      "typ" <~ Core.wrappedTypeBody (var "wt") $
-      "encode" <~ ("ad" ~> "term" ~>
-        "unwrapped" <<~ withGraphContext @@ (ExtractCore.wrap @@ var "tname" @@ var "term") $
-        Compute.coderEncode (Compute.adapterCoder (var "ad")) @@ var "unwrapped") $
-      "decode" <~ ("ad" ~> "term" ~>
-        "decoded" <<~ Compute.coderDecode (Compute.adapterCoder (var "ad")) @@ var "term" $
-        produce (Core.termWrap (Core.wrappedTerm (var "tname") (var "decoded")))) $
-      "ad" <<~ termAdapter @@ var "typ" $
-      produce (Compute.adapter
-        false
-        (var "t")
-        (Compute.adapterTarget (var "ad"))
-        (Compute.coder (var "encode" @@ var "ad") (var "decode" @@ var "ad")))]
-
--- Note: those constructors which cannot be mapped meaningfully at this time are simply
---       preserved as strings.
-termAdapter :: TBinding TypeAdapter
-termAdapter = define "termAdapter" $
-  doc "Create an adapter for any type" $
-  "typ" ~>
-  "constraints" <~ ("cx" ~> Coders.languageConstraintsProjection (Coders.adapterContextLanguage (var "cx"))) $
-  "supported" <~ ("cx" ~> AdaptUtils.typeIsSupported @@ (var "constraints" @@ var "cx")) $
-  "variantIsSupported" <~ ("cx" ~> "t" ~>
-    Sets.member (Reflect.typeVariant @@ var "t") (Coders.languageConstraintsTypeVariants (var "constraints" @@ var "cx"))) $
-  "supportedAtTopLevel" <~ ("cx" ~> "t" ~> Logic.and
-    (var "variantIsSupported" @@ var "cx" @@ var "t")
-    (Coders.languageConstraintsTypes (var "constraints" @@ var "cx") @@ var "t")) $
-  "pass" <~ ("t" ~> cases _TypeVariant (Reflect.typeVariant @@ (Rewriting.deannotateType @@ var "t"))
-    Nothing [
-    _TypeVariant_annotated>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_application>>: constant (list [passApplication]),
-    _TypeVariant_either>>: constant (list [passEither]),
-    _TypeVariant_forall>>: constant (list [passForall]),
-    _TypeVariant_function>>: constant (list [passFunction]),
-    _TypeVariant_list>>: constant (list [passList]),
-    _TypeVariant_literal>>: constant (list [passLiteral]),
-    _TypeVariant_map>>: constant (list [passMap]),
-    _TypeVariant_maybe>>: constant (list [passOptional, maybeToList]),
-    _TypeVariant_pair>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_record>>: constant (list [passRecord]),
-    _TypeVariant_set>>: constant (list [passSet]),
-    _TypeVariant_union>>: constant (list [passUnion]),
-    _TypeVariant_unit>>: constant (list [passUnit]),
-    _TypeVariant_variable>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_wrap>>: constant (list [passWrapped])]) $
-  "trySubstitution" <~ ("t" ~> cases _TypeVariant (Reflect.typeVariant @@ var "t")
-    Nothing [
-    _TypeVariant_annotated>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_application>>: constant (list [simplifyApplication]),
-    _TypeVariant_either>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_forall>>: constant (list [lambdaToMonotype]),
-    _TypeVariant_function>>: constant (list [functionToUnion]),
-    _TypeVariant_list>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_literal>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_map>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_maybe>>: constant (list [maybeToList]),
-    _TypeVariant_pair>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_record>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_set>>: constant (list [setToList]),
-    _TypeVariant_union>>: constant (list [unionToRecord]),
-    _TypeVariant_unit>>: constant (list [unitToRecord]),
-    _TypeVariant_variable>>: constant (list ([] :: [TTerm TypeAdapter])),
-    _TypeVariant_wrap>>: constant (list [wrapToUnwrapped])]) $
-  "alts" <~ ("cx" ~> "t" ~> Flows.mapList ("c" ~> var "c" @@ var "t")
-     (Logic.ifElse (var "supportedAtTopLevel" @@ var "cx" @@ var "t")
-       (var "pass" @@ var "t")
-       (var "trySubstitution" @@ var "t"))) $
-  "dflt" <~ (cases _Type (var "typ")
-    (Just (
-      "cx" <<~ Monads.getState $
-      AdaptUtils.chooseAdapter
-        @@ (var "alts" @@ var "cx")
-        @@ (var "supported" @@ var "cx")
-        @@ ShowCore.type_
-        @@ (ShowCore.type_)
-        @@ (var "typ"))) [
-    -- Account for let-bound variables
-    _Type_variable>>: "name" ~> forTypeReference @@ var "name"]) $
-  cases _Type (var "typ")
-    (Just (
-      trace (Strings.cat2 (string "adapter for ") (ShowCore.type_ @@ var "typ"))
-      (var "dflt"))) [
-    _Type_annotated>>: "at" ~>
-      "ad" <<~ termAdapter @@ Core.annotatedTypeBody (var "at") $
-      produce (Compute.adapterWithTarget (var "ad")
-        (Core.typeAnnotated (Core.annotatedType (Compute.adapterTarget (var "ad")) (Core.annotatedTypeAnnotation (var "at")))))]
-
-withGraphContext :: TBinding (Flow Graph a -> Flow AdapterContext a)
-withGraphContext = define "withGraphContext" $
-  doc "Execute a flow with graph context" $
-  "f" ~>
-  "cx" <<~ Monads.getState $
-  Monads.withState @@ (Coders.adapterContextGraph (var "cx")) @@ var "f"
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Utils.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Utils.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Adapt/Utils.hs
+++ /dev/null
@@ -1,250 +0,0 @@
-
-module Hydra.Sources.Kernel.Terms.Adapt.Utils where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel hiding (
-  bidirectional, chooseAdapter, composeCoders, encodeDecode, floatTypeIsSupported,
-  idAdapter, idCoder, integerTypeIsSupported, literalTypeIsSupported,
-  nameToFilePath, typeIsSupported, unidirectionalCoder)
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Names      as Names
-import qualified Hydra.Sources.Kernel.Terms.Reflect    as Reflect
-import qualified Hydra.Sources.Kernel.Terms.Rewriting  as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Show.Core  as ShowCore
-
-
-ns :: Namespace
-ns = Namespace "hydra.adapt.utils"
-
-module_ :: Module
-module_ = Module ns elements
-    [Formatting.ns, Names.ns, Reflect.ns, Rewriting.ns, ShowCore.ns]
-    kernelTypesNamespaces $
-    Just ("Additional adapter utilities, above and beyond the generated ones.")
-  where
-   elements = [
-     toBinding bidirectional,
-     toBinding chooseAdapter,
-     toBinding composeCoders,
-     toBinding encodeDecode,
-     toBinding floatTypeIsSupported,
-     toBinding idAdapter,
-     toBinding idCoder,
-     toBinding integerTypeIsSupported,
-     toBinding literalTypeIsSupported,
-     toBinding nameToFilePath,
-     toBinding typeIsSupported,
-     toBinding unidirectionalCoder]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-bidirectional :: TBinding ((CoderDirection -> b -> Flow s b) -> Coder s s b b)
-bidirectional = define "bidirectional" $
-  doc "Create a bidirectional coder from a direction-aware function" $
-  "f" ~> Compute.coder (var "f" @@ Coders.coderDirectionEncode) (var "f" @@ Coders.coderDirectionDecode)
-
-chooseAdapter :: TBinding ((t -> Flow so [SymmetricAdapter si t v]) -> (t -> Bool) -> (t -> String ) -> (t -> String) -> t -> Flow so (SymmetricAdapter si t v))
-chooseAdapter = define "chooseAdapter" $
-  doc "Choose an appropriate adapter for a type" $
-  "alts" ~> "supported" ~> "show" ~> "describe" ~> "typ" ~>
-  Logic.ifElse (var "supported" @@ var "typ")
-    (produce (Compute.adapter false (var "typ") (var "typ") idCoder))
-    ("raw" <<~ var "alts" @@ var "typ" $
-     "candidates" <~ Lists.filter ("adapter" ~> var "supported" @@ Compute.adapterTarget (var "adapter")) (var "raw") $
-     Logic.ifElse (Lists.null (var "candidates"))
-       (Flows.fail (Strings.cat (list [
-         string "no adapters found for ",
-         var "describe" @@ var "typ",
-         Logic.ifElse (Lists.null (var "raw"))
-           (string "")
-           (Strings.cat (list [
-             string " (discarded ",
-             Literals.showInt32 (Lists.length (var "raw")),
-             string " unsupported candidate types: ",
-             ShowCore.list_ @@ var "show" @@ (Lists.map (unaryFunction Compute.adapterTarget) (var "raw")),
-             string ")"])),
-         string ". Original type: ",
-         var "show" @@ var "typ"])))
-       (produce (Lists.head (var "candidates"))))
-
-composeCoders :: TBinding (Coder s s a b -> Coder s s b c -> Coder s s a c)
-composeCoders = define "composeCoders" $
-  doc "Compose two coders" $
-  "c1" ~> "c2" ~>
-  Compute.coder
-    ("a" ~> "b1" <<~ Compute.coderEncode (var "c1") @@ var "a" $ Compute.coderEncode (var "c2") @@ var "b1")
-    ("c" ~> "b2" <<~ Compute.coderDecode (var "c2") @@ var "c" $ Compute.coderDecode (var "c1") @@ var "b2")
-
-encodeDecode :: TBinding (CoderDirection -> Coder s s x x -> x -> Flow s x)
-encodeDecode = define "encodeDecode" $
-  doc "Apply coder in the specified direction" $
-  "dir" ~> "coder" ~> "term" ~>
-  cases _CoderDirection (var "dir")
-    Nothing [
-    _CoderDirection_encode>>: constant (Compute.coderEncode (var "coder") @@ var "term"),
-    _CoderDirection_decode>>: constant (Compute.coderDecode (var "coder") @@ var "term")]
-
-floatTypeIsSupported :: TBinding (LanguageConstraints -> FloatType -> Bool)
-floatTypeIsSupported = define "floatTypeIsSupported" $
-  doc "Check if float type is supported by language constraints" $
-  "constraints" ~> "ft" ~>
-  Sets.member (var "ft") (Coders.languageConstraintsFloatTypes (var "constraints"))
-
-idAdapter :: TBinding (t -> SymmetricAdapter s t v)
-idAdapter = define "idAdapter" $
-  doc "Identity adapter" $
-  "t" ~> Compute.adapter false (var "t") (var "t") idCoder
-
-idCoder :: TBinding (Coder s s a a)
-idCoder = define "idCoder" $
-  doc "Identity coder" $
-  Compute.coder (unaryFunction Flows.pure) (unaryFunction Flows.pure)
-
-integerTypeIsSupported :: TBinding (LanguageConstraints -> IntegerType -> Bool)
-integerTypeIsSupported = define "integerTypeIsSupported" $
-  doc "Check if integer type is supported by language constraints" $
-  "constraints" ~> "it" ~>
-  Sets.member (var "it") (Coders.languageConstraintsIntegerTypes (var "constraints"))
-
-literalTypeIsSupported :: TBinding (LanguageConstraints -> LiteralType -> Bool)
-literalTypeIsSupported = define "literalTypeIsSupported" $
-  doc "Check if literal type is supported by language constraints" $
-  "constraints" ~> "lt" ~>
-  "isSupported" <~ ("lt" ~> cases _LiteralType (var "lt")
-    (Just true) [
-    _LiteralType_float>>: "ft" ~> floatTypeIsSupported @@ var "constraints" @@ var "ft",
-    _LiteralType_integer>>: "it" ~> integerTypeIsSupported @@ var "constraints" @@ var "it"]) $
-  Logic.and
-    (Sets.member (Reflect.literalTypeVariant @@ var "lt") (Coders.languageConstraintsLiteralVariants (var "constraints")))
-    (var "isSupported" @@ var "lt")
-
-nameToFilePath :: TBinding (CaseConvention -> CaseConvention -> FileExtension -> Name -> FilePath)
-nameToFilePath = define "nameToFilePath" $
-  doc "Convert a name to file path, given case conventions for namespaces and local names, and assuming '/' as the file path separator" $
-  "nsConv" ~> "localConv" ~> "ext" ~> "name" ~>
-  "qualName" <~ Names.qualifyName @@ var "name" $
-  "ns" <~ Module.qualifiedNameNamespace (var "qualName") $
-  "local" <~ Module.qualifiedNameLocal (var "qualName") $
-  "nsToFilePath" <~ ("ns" ~>
-    Strings.intercalate (string "/") (Lists.map
-      ("part" ~> Formatting.convertCase @@ Util.caseConventionCamel @@ var "nsConv" @@ var "part")
-      (Strings.splitOn (string ".") (Module.unNamespace (var "ns"))))) $
-  "prefix" <~ Maybes.maybe (string "")
-    ("n" ~> Strings.cat2 (var "nsToFilePath" @@ var "n") (string "/"))
-    (var "ns") $
-  "suffix" <~ Formatting.convertCase @@ Util.caseConventionPascal @@ var "localConv" @@ var "local" $
-  Strings.cat (list [var "prefix", var "suffix", string ".", Module.unFileExtension (var "ext")])
-
-typeIsSupported :: TBinding (LanguageConstraints -> Type -> Bool)
-typeIsSupported = define "typeIsSupported" $
-  doc "Check if type is supported by language constraints" $
-  "constraints" ~> "t" ~>
-  "base" <~ Rewriting.deannotateType @@ var "t" $
-  "isVariable" <~ ("v" ~> cases _TypeVariant (var "v")
-    (Just false) [
-    _TypeVariant_variable>>: constant true]) $
-  "isSupportedVariant" <~ ("v" ~>
-    Logic.or
-      (var "isVariable" @@ var "v")
-      (Sets.member (var "v") (Coders.languageConstraintsTypeVariants (var "constraints")))) $
-  "isSupported" <~ ("base" ~> cases _Type (var "base")
-    Nothing [
-    _Type_annotated>>: "at" ~> typeIsSupported @@ var "constraints" @@ Core.annotatedTypeBody (var "at"),
-    _Type_application>>: "app" ~> Logic.and
-      (typeIsSupported @@ var "constraints" @@ Core.applicationTypeFunction (var "app"))
-      (typeIsSupported @@ var "constraints" @@ Core.applicationTypeArgument (var "app")),
-    _Type_either>>: "et" ~> Logic.and
-      (typeIsSupported @@ var "constraints" @@ Core.eitherTypeLeft (var "et"))
-      (typeIsSupported @@ var "constraints" @@ Core.eitherTypeRight (var "et")),
-    _Type_forall>>: "ft" ~> typeIsSupported @@ var "constraints" @@ Core.forallTypeBody (var "ft"),
-    _Type_function>>: "ft" ~> Logic.and
-      (typeIsSupported @@ var "constraints" @@ Core.functionTypeDomain (var "ft"))
-      (typeIsSupported @@ var "constraints" @@ Core.functionTypeCodomain (var "ft")),
-    _Type_list>>: "lt" ~> typeIsSupported @@ var "constraints" @@ var "lt",
-    _Type_literal>>: "at" ~> literalTypeIsSupported @@ var "constraints" @@ var "at",
-    _Type_map>>: "mt" ~> Logic.and
-      (typeIsSupported @@ var "constraints" @@ Core.mapTypeKeys (var "mt"))
-      (typeIsSupported @@ var "constraints" @@ Core.mapTypeValues (var "mt")),
-    _Type_maybe>>: "ot" ~> typeIsSupported @@ var "constraints" @@ var "ot",
-    _Type_pair>>: "pt" ~> Logic.and
-      (typeIsSupported @@ var "constraints" @@ Core.pairTypeFirst (var "pt"))
-      (typeIsSupported @@ var "constraints" @@ Core.pairTypeSecond (var "pt")),
-    _Type_record>>: "rt" ~>
-      andAll (Lists.map
-        ("field" ~> typeIsSupported @@ var "constraints" @@ Core.fieldTypeType (var "field"))
-        (Core.rowTypeFields (var "rt"))),
-    _Type_set>>: "st" ~> typeIsSupported @@ var "constraints" @@ var "st",
-    _Type_union>>: "rt" ~>
-      andAll (Lists.map
-        ("field" ~> typeIsSupported @@ var "constraints" @@ Core.fieldTypeType (var "field"))
-        (Core.rowTypeFields (var "rt"))),
-    _Type_unit>>: constant true,
-    _Type_wrap>>: "wt" ~> typeIsSupported @@ var "constraints" @@ Core.wrappedTypeBody (var "wt"),
-    _Type_variable>>: constant true]) $
-  Logic.and
-    (Coders.languageConstraintsTypes (var "constraints") @@ var "base")
-    (Logic.and
-      (var "isSupportedVariant" @@ (Reflect.typeVariant @@ var "base"))
-      (var "isSupported" @@ var "base"))
-  where
-    andAll = Lists.foldl (binaryFunction Logic.and) true
-
-unidirectionalCoder :: TBinding ((a -> Flow s b) -> Coder s s a b)
-unidirectionalCoder = define "unidirectionalCoder" $
-  doc "Create a unidirectional coder" $
-  "m" ~>
-  Compute.coder
-    (var "m")
-    (constant (Flows.fail (string "inbound mapping is unsupported")))
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/All.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/All.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/All.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/All.hs
@@ -3,29 +3,26 @@
 
 import Hydra.Kernel
 
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Literals  as AdaptLiterals
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Modules   as AdaptModules
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple    as AdaptSimple
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Terms     as AdaptTerms
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Utils     as AdaptUtils
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.Annotations     as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Arity           as Arity
 import qualified Hydra.Sources.Kernel.Terms.Checking        as Checking
 import qualified Hydra.Sources.Kernel.Terms.CodeGeneration  as CodeGeneration
 import qualified Hydra.Sources.Kernel.Terms.Constants       as Constants
 import qualified Hydra.Sources.Kernel.Terms.Decoding        as Decoding
+import qualified Hydra.Sources.Kernel.Terms.Dsls            as Dsls
 import qualified Hydra.Sources.Kernel.Terms.Encoding        as Encoding
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core    as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Extract.Helpers as ExtractHelpers
 import qualified Hydra.Sources.Kernel.Terms.Extract.Util    as ExtractUtil
 import qualified Hydra.Sources.Kernel.Terms.Formatting      as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Grammars        as Grammars
 import qualified Hydra.Sources.Kernel.Terms.Hoisting        as Hoisting
 import qualified Hydra.Sources.Kernel.Terms.Inference       as Inference
 import qualified Hydra.Sources.Kernel.Terms.Languages       as Languages
 import qualified Hydra.Sources.Kernel.Terms.Lexical         as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Literals        as Literals
-import qualified Hydra.Sources.Kernel.Terms.Monads          as Monads
+
+import qualified Hydra.Sources.Kernel.Lib.Names             as LibNames
 import qualified Hydra.Sources.Kernel.Terms.Names           as Names
 import qualified Hydra.Sources.Kernel.Terms.Parsers         as Parsers
 import qualified Hydra.Sources.Kernel.Terms.Reduction       as Reduction
@@ -33,27 +30,31 @@
 import qualified Hydra.Sources.Kernel.Terms.Rewriting       as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas         as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Serialization   as Serialization
-import qualified Hydra.Sources.Kernel.Terms.Show.Accessors  as ShowAccessors
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths      as ShowPaths
 import qualified Hydra.Sources.Kernel.Terms.Show.Core       as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors      as ShowErrors
+import qualified Hydra.Sources.Kernel.Terms.Show.Error.Core as ShowErrorCore
 import qualified Hydra.Sources.Kernel.Terms.Show.Graph      as ShowGraph
 import qualified Hydra.Sources.Kernel.Terms.Show.Meta       as ShowMeta
 import qualified Hydra.Sources.Kernel.Terms.Show.Typing     as ShowTyping
 import qualified Hydra.Sources.Kernel.Terms.Show.Util       as ShowUtil
 import qualified Hydra.Sources.Kernel.Terms.Sorting         as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution    as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Tarjan          as Tarjan
 import qualified Hydra.Sources.Kernel.Terms.Templates       as Templates
 import qualified Hydra.Sources.Kernel.Terms.Unification     as Unification
+import qualified Hydra.Sources.Kernel.Terms.Validate.Core      as ValidateCore
+import qualified Hydra.Sources.Kernel.Terms.Validate.Packaging as ValidatePackaging
 
 -- Secondary, generated decoding modules
-import qualified Hydra.Sources.Decode.Accessors     as DecodeAccessors
+import qualified Hydra.Sources.Decode.Paths          as DecodePaths
 import qualified Hydra.Sources.Decode.Ast           as DecodeAst
 import qualified Hydra.Sources.Decode.Classes       as DecodeClasses
 import qualified Hydra.Sources.Decode.Coders        as DecodeCoders
-import qualified Hydra.Sources.Decode.Compute       as DecodeCompute
-import qualified Hydra.Sources.Decode.Constraints   as DecodeConstraints
+import qualified Hydra.Sources.Decode.Context       as DecodeContext
 import qualified Hydra.Sources.Decode.Core          as DecodeCore
-import qualified Hydra.Sources.Decode.Grammar       as DecodeGrammar
+import qualified Hydra.Sources.Decode.Errors         as DecodeErrors
+import qualified Hydra.Sources.Decode.Error.Checking as DecodeErrorChecking
+import qualified Hydra.Sources.Decode.Error.Core   as DecodeErrorCore
 import qualified Hydra.Sources.Decode.Json.Model    as DecodeJson
 import qualified Hydra.Sources.Decode.Module        as DecodeModule
 import qualified Hydra.Sources.Decode.Parsing       as DecodeParsing
@@ -66,17 +67,17 @@
 import qualified Hydra.Sources.Decode.Typing        as DecodeTyping
 import qualified Hydra.Sources.Decode.Util          as DecodeUtil
 import qualified Hydra.Sources.Decode.Variants      as DecodeVariants
-import qualified Hydra.Sources.Decode.Workflow      as DecodeWorkflow
 
 -- Secondary, generated encoding modules
-import qualified Hydra.Sources.Encode.Accessors     as EncodeAccessors
+import qualified Hydra.Sources.Encode.Paths          as EncodePaths
 import qualified Hydra.Sources.Encode.Ast           as EncodeAst
 import qualified Hydra.Sources.Encode.Classes       as EncodeClasses
 import qualified Hydra.Sources.Encode.Coders        as EncodeCoders
-import qualified Hydra.Sources.Encode.Compute       as EncodeCompute
-import qualified Hydra.Sources.Encode.Constraints   as EncodeConstraints
+import qualified Hydra.Sources.Encode.Context       as EncodeContext
 import qualified Hydra.Sources.Encode.Core          as EncodeCore
-import qualified Hydra.Sources.Encode.Grammar       as EncodeGrammar
+import qualified Hydra.Sources.Encode.Errors         as EncodeErrors
+import qualified Hydra.Sources.Encode.Error.Checking as EncodeErrorChecking
+import qualified Hydra.Sources.Encode.Error.Core   as EncodeErrorCore
 import qualified Hydra.Sources.Encode.Json.Model    as EncodeJson
 import qualified Hydra.Sources.Encode.Module        as EncodeModule
 import qualified Hydra.Sources.Encode.Parsing       as EncodeParsing
@@ -89,7 +90,6 @@
 import qualified Hydra.Sources.Encode.Typing        as EncodeTyping
 import qualified Hydra.Sources.Encode.Util          as EncodeUtil
 import qualified Hydra.Sources.Encode.Variants      as EncodeVariants
-import qualified Hydra.Sources.Encode.Workflow      as EncodeWorkflow
 
 
 kernelTermsModules :: [Module]
@@ -97,29 +97,26 @@
 
 kernelPrimaryTermsModules :: [Module]
 kernelPrimaryTermsModules = [
-  AdaptLiterals.module_,
-  AdaptModules.module_,
-  AdaptSimple.module_,
-  AdaptTerms.module_,
-  AdaptUtils.module_,
+  Adapt.module_,
   Annotations.module_,
   Arity.module_,
   Checking.module_,
   CodeGeneration.module_,
   Constants.module_,
   Decoding.module_,
+--  Dsls.module_,
   Encoding.module_,
   ExtractCore.module_,
   ExtractHelpers.module_,
   ExtractUtil.module_,
   Formatting.module_,
-  Grammars.module_,
   Hoisting.module_,
   Inference.module_,
   Languages.module_,
   Lexical.module_,
+  LibNames.module_,
   Literals.module_,
-  Monads.module_,
+
   Names.module_,
   Parsers.module_,
   Reduction.module_,
@@ -127,28 +124,32 @@
   Rewriting.module_,
   Schemas.module_,
   Serialization.module_,
-  ShowAccessors.module_,
+  ShowPaths.module_,
   ShowCore.module_,
+  ShowErrors.module_,
+  ShowErrorCore.module_,
   ShowGraph.module_,
   ShowMeta.module_,
   ShowTyping.module_,
   ShowUtil.module_,
   Sorting.module_,
   Substitution.module_,
-  Tarjan.module_,
   Templates.module_,
-  Unification.module_]
+  Unification.module_,
+  ValidateCore.module_,
+  ValidatePackaging.module_]
 
 kernelDecodingModules :: [Module]
 kernelDecodingModules = [
-  DecodeAccessors.module_,
+  DecodePaths.module_,
   DecodeAst.module_,
   DecodeClasses.module_,
   DecodeCoders.module_,
-  DecodeCompute.module_,
-  DecodeConstraints.module_,
+  DecodeContext.module_,
   DecodeCore.module_,
-  DecodeGrammar.module_,
+  DecodeErrors.module_,
+  DecodeErrorChecking.module_,
+  DecodeErrorCore.module_,
   DecodeJson.module_,
   DecodeModule.module_,
   DecodeParsing.module_,
@@ -160,19 +161,19 @@
   DecodeTopology.module_,
   DecodeTyping.module_,
   DecodeUtil.module_,
-  DecodeVariants.module_,
-  DecodeWorkflow.module_]
+  DecodeVariants.module_]
 
 kernelEncodingModules :: [Module]
 kernelEncodingModules = [
-  EncodeAccessors.module_,
+  EncodePaths.module_,
   EncodeAst.module_,
   EncodeClasses.module_,
   EncodeCoders.module_,
-  EncodeCompute.module_,
-  EncodeConstraints.module_,
+  EncodeContext.module_,
   EncodeCore.module_,
-  EncodeGrammar.module_,
+  EncodeErrors.module_,
+  EncodeErrorChecking.module_,
+  EncodeErrorCore.module_,
   EncodeJson.module_,
   EncodeModule.module_,
   EncodeParsing.module_,
@@ -184,5 +185,4 @@
   EncodeTopology.module_,
   EncodeTyping.module_,
   EncodeUtil.module_,
-  EncodeVariants.module_,
-  EncodeWorkflow.module_]
+  EncodeVariants.module_]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Annotations.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Annotations.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Annotations.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Annotations.hs
@@ -3,28 +3,30 @@
 
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (
-  aggregateAnnotations, debugIf, failOnFlag, getDebugId, getAttr, getAttrWithDefault, getCount,
-  getDescription, getTermAnnotation, getTermDescription, getType, getTypeAnnotation, getTypeClasses,
-  getTypeDescription, isNativeType, hasDescription, hasFlag, hasTypeDescription, nextCount,
-  normalizeTermAnnotations, normalizeTypeAnnotations, putAttr, putCount, resetCount, setAnnotation,
+  aggregateAnnotations, debugIf, failOnFlag, getDebugId,
+  getAttr, getAttrWithDefault, getCount,
+  getDescription, getTermAnnotation, getTermDescription,
+  getType, getTypeAnnotation, getTypeClasses,
+  getTypeDescription, isNativeType, hasDescription, hasFlag,
+  hasTypeDescription, nextCount,
+  normalizeTermAnnotations, normalizeTypeAnnotations, putAttr, putCount,
+  resetCount, setAnnotation,
   setDescription, setTermAnnotation, setTermDescription, setType, setTypeAnnotation, setTypeClasses,
-  setTypeDescription, termAnnotationInternal, typeAnnotationInternal, typeElement, whenFlag, withDepth)
+  setTypeDescription, termAnnotationInternal, typeAnnotationInternal, typeElement, whenFlag)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Context      as Ctx
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -39,18 +41,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -63,9 +65,9 @@
 import qualified Hydra.Sources.Kernel.Terms.Constants    as Constants
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Lexical      as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads       as Monads
 import qualified Hydra.Sources.Kernel.Terms.Rewriting    as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Show.Core    as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors  as ShowError
 import qualified Hydra.Sources.Decode.Core            as DecodeCore
 import qualified Hydra.Sources.Encode.Core            as EncodeCore
 import Hydra.Encoding (encodeBindingName)
@@ -76,53 +78,55 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Constants.ns, moduleNamespace DecodeCore.module_, moduleNamespace EncodeCore.module_, ExtractCore.ns, Lexical.ns, Monads.ns,
-      Rewriting.ns, ShowCore.ns]
+    [Constants.ns, moduleNamespace DecodeCore.module_, moduleNamespace EncodeCore.module_, ExtractCore.ns, Lexical.ns,
+      Rewriting.ns, ShowCore.ns, ShowError.ns]
     kernelTypesNamespaces $
     Just "Utilities for reading and writing type and term annotations"
   where
    elements = [
-     toBinding aggregateAnnotations,
-     toBinding debugIf,
-     toBinding failOnFlag,
-     toBinding getDebugId,
-     toBinding getAttr,
-     toBinding getAttrWithDefault,
-     toBinding getCount,
-     toBinding getDescription,
-     toBinding getTermAnnotation,
-     toBinding getTermDescription,
-     toBinding getType,
-     toBinding getTypeAnnotation,
-     toBinding getTypeClasses,
-     toBinding getTypeDescription,
-     toBinding isNativeType,
-     toBinding hasDescription,
-     toBinding hasFlag,
-     toBinding hasTypeDescription,
-     toBinding nextCount,
-     toBinding normalizeTermAnnotations,
-     toBinding normalizeTypeAnnotations,
-     toBinding putAttr,
-     toBinding putCount,
-     toBinding resetCount,
-     toBinding setAnnotation,
-     toBinding setDescription,
-     toBinding setTermAnnotation,
-     toBinding setTermDescription,
-     toBinding setType,
-     toBinding setTypeAnnotation,
-     toBinding setTypeClasses,
-     toBinding setTypeDescription,
-     toBinding termAnnotationInternal,
-     toBinding typeAnnotationInternal,
-     toBinding typeElement,
-     toBinding whenFlag,
-     toBinding withDepth]
+     toTermDefinition aggregateAnnotations,
+     toTermDefinition debugIf,
+     toTermDefinition failOnFlag,
+     toTermDefinition getDebugId,
+     toTermDefinition getAttr,
+     toTermDefinition getAttrWithDefault,
+     toTermDefinition getCount,
+     toTermDefinition getDescription,
+     toTermDefinition getTermAnnotation,
+     toTermDefinition getTermDescription,
+     toTermDefinition getType,
+     toTermDefinition getTypeAnnotation,
+     toTermDefinition getTypeClasses,
+     toTermDefinition getTypeDescription,
+     toTermDefinition isNativeType,
+     toTermDefinition hasDescription,
+     toTermDefinition hasFlag,
+     toTermDefinition hasTypeDescription,
+     toTermDefinition nextCount,
+     toTermDefinition normalizeTermAnnotations,
+     toTermDefinition normalizeTypeAnnotations,
+     toTermDefinition putAttr,
+     toTermDefinition putCount,
+     toTermDefinition resetCount,
+     toTermDefinition setAnnotation,
+     toTermDefinition setDescription,
+     toTermDefinition setTermAnnotation,
+     toTermDefinition setTermDescription,
+     toTermDefinition setType,
+     toTermDefinition setTypeAnnotation,
+     toTermDefinition setTypeClasses,
+     toTermDefinition setTypeDescription,
+     toTermDefinition termAnnotationInternal,
+     toTermDefinition typeAnnotationInternal,
+     toTermDefinition typeElement,
+     toTermDefinition whenFlag]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
 aggregateAnnotations :: TBinding ((x -> Maybe y) -> (y -> x) -> (y -> M.Map Name Term) -> x -> M.Map Name Term)
 aggregateAnnotations = define "aggregateAnnotations" $
   doc "Aggregate annotations from nested structures" $
@@ -134,61 +138,64 @@
     (var "getValue" @@ var "t")) $
   Maps.fromList (Lists.concat (var "toPairs" @@ list ([] :: [TTerm [(Name, Term)]]) @@ var "t"))
 
-debugIf :: TBinding (String -> String -> Flow s ())
+debugIf :: TBinding (Context -> String -> String -> Prelude.Either (InContext Error) ())
 debugIf = define "debugIf" $
-  doc "Debug if the debug ID matches" $
-  "debugId" ~> "message" ~>
-  "checkAndFail" <~ ("desc" ~> Logic.ifElse
-    (Equality.equal (var "desc") (just $ string "debugId"))
-    (Flows.fail (var "message"))
-    (produce unit)) $
-  Flows.bind getDebugId (var "checkAndFail")
+  doc "Debug if the debug ID matches (Either version)" $
+  "cx" ~> "debugId" ~> "message" ~>
+  "mid" <<~ getDebugId @@ var "cx" $
+  Logic.ifElse (Equality.equal (var "mid") (just $ var "debugId"))
+    (Ctx.failInContext (Error.errorOther $ Error.otherError (var "message")) (var "cx"))
+    (right unit)
 
-failOnFlag :: TBinding (Name -> String -> Flow s ())
+failOnFlag :: TBinding (Context -> Name -> String -> Prelude.Either (InContext Error) ())
 failOnFlag = define "failOnFlag" $
-  doc "Fail if the given flag is set" $
-  "flag" ~> "msg" ~>
-  "val" <<~ hasFlag @@ var "flag" $
+  doc "Fail if the given flag is set (Either version)" $
+  "cx" ~> "flag" ~> "msg" ~>
+  "val" <<~ hasFlag @@ var "cx" @@ var "flag" $
   Logic.ifElse (var "val")
-    (Flows.fail (var "msg"))
-    (produce unit)
+    (Ctx.failInContext (Error.errorOther $ Error.otherError (var "msg")) (var "cx"))
+    (right unit)
 
-getAttr :: TBinding (Name -> Flow s (Maybe Term))
+getAttr :: TBinding (Name -> Context -> Maybe Term)
 getAttr = define "getAttr" $
-  doc "Get an attribute from the trace" $
-  "key" ~> Compute.flow (
-    "s0" ~> "t0" ~> Compute.flowState
-      (just (Maps.lookup (var "key") (Compute.traceOther (var "t0"))))
-      (var "s0")
-      (var "t0"))
+  doc "Get an attribute from a context (pure version)" $
+  "key" ~> "cx" ~>
+  Maps.lookup (var "key") (Ctx.contextOther (var "cx"))
 
-getAttrWithDefault :: TBinding (Name -> Term -> Flow s Term)
+getAttrWithDefault :: TBinding (Name -> Term -> Context -> Term)
 getAttrWithDefault = define "getAttrWithDefault" $
-  doc "Get an attribute with a default value" $
-  "key" ~> "def" ~> Flows.map
-    ("mval" ~> Maybes.fromMaybe (var "def") (var "mval"))
-    (getAttr @@ var "key")
+  doc "Get an attribute with a default value from context (pure version)" $
+  "key" ~> "def" ~> "cx" ~>
+  Maybes.fromMaybe (var "def") (getAttr @@ var "key" @@ var "cx")
 
-getCount :: TBinding (Name -> Flow s Int)
+getCount :: TBinding (Name -> Context -> Int)
 getCount = define "getCount" $
-  doc "Get a counter value" $
-  "key" ~> Lexical.withEmptyGraph @@ (Flows.bind
-    (getAttrWithDefault @@ var "key" @@ (Core.int32 0))
-    (ExtractCore.int32))
+  doc "Get a counter value from context (pure version)" $
+  "key" ~> "cx" ~>
+  Maybes.maybe
+    (int32 0)
+    ("term" ~> cases _Term (var "term") (Just (int32 0)) [
+      _Term_literal>>: "lit" ~> cases _Literal (var "lit") (Just (int32 0)) [
+        _Literal_integer>>: "iv" ~> cases _IntegerValue (var "iv") (Just (int32 0)) [
+          _IntegerValue_int32>>: "i" ~> var "i"]]])
+    (Maps.lookup (var "key") (Ctx.contextOther (var "cx")))
 
-getDebugId :: TBinding (Flow s (Maybe String))
+getDebugId :: TBinding (Context -> Prelude.Either (InContext Error) (Maybe String))
 getDebugId = define "getDebugId" $
-  doc "Get the debug ID from flow state" $
-  Lexical.withEmptyGraph @@ (Flows.bind
-    (getAttr @@ Constants.key_debugId)
-    ("desc" ~> Flows.mapMaybe (ExtractCore.string) (var "desc")))
+  doc "Get the debug ID from context (Either version)" $
+  "cx" ~>
+  Maybes.maybe
+    (right nothing)
+    ("term" ~> Eithers.map (unaryFunction just) (ExtractCore.string @@ var "cx" @@ Graph.emptyGraph @@ var "term"))
+    (getAttr @@ Constants.key_debugId @@ var "cx")
 
-getDescription :: TBinding (M.Map Name Term -> Flow Graph (Maybe String))
+getDescription :: TBinding (Context -> Graph -> M.Map Name Term -> Prelude.Either (InContext Error) (Maybe String))
 getDescription = define "getDescription" $
-  doc "Get description from annotations map" $
-  "anns" ~> Maybes.maybe
-    (produce nothing)
-    ("term" ~> Flows.map (unaryFunction just) (ExtractCore.string @@ var "term"))
+  doc "Get description from annotations map (Either version)" $
+  "cx" ~> "graph" ~> "anns" ~>
+  Maybes.maybe
+    (right nothing)
+    ("term" ~> Eithers.map (unaryFunction just) (ExtractCore.string @@ var "cx" @@ var "graph" @@ var "term"))
     (Maps.lookup (Core.nameLift key_description) (var "anns"))
 
 getTermAnnotation :: TBinding (Name -> Term -> Maybe Term)
@@ -196,24 +203,23 @@
   doc "Get a term annotation" $
   "key" ~> "term" ~> Maps.lookup (var "key") (termAnnotationInternal @@ var "term")
 
-getTermDescription :: TBinding (Term -> Flow Graph (Maybe String))
+getTermDescription :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) (Maybe String))
 getTermDescription = define "getTermDescription" $
-  doc "Get term description. Peels through TermTypeLambda and TermTypeApplication wrappers (added by inference for polymorphic bindings) to find the description annotation underneath." $
-  "term" ~>
+  doc "Get term description (Either version)" $
+  "cx" ~> "graph" ~> "term" ~>
   "peel" <~ ("t" ~> cases _Term (var "t")
     (Just $ var "t") [
     _Term_typeLambda>>: "tl" ~> var "peel" @@ Core.typeLambdaBody (var "tl"),
     _Term_typeApplication>>: "ta" ~> var "peel" @@ Core.typeApplicationTermBody (var "ta")]) $
-  getDescription @@ (termAnnotationInternal @@ (var "peel" @@ var "term"))
+  getDescription @@ var "cx" @@ var "graph" @@ (termAnnotationInternal @@ (var "peel" @@ var "term"))
 
-getType :: TBinding (M.Map Name Term -> Flow Graph (Maybe Type))
+getType :: TBinding (Graph -> M.Map Name Term -> Prelude.Either DecodingError (Maybe Type))
 getType = define "getType" $
   doc "Get type from annotations" $
-  "anns" ~>
-  "cx" <<~ Monads.getState $
+  "graph" ~> "anns" ~>
   Maybes.maybe
-    (produce nothing)
-    ("dat" ~> Flows.map (unaryFunction just) (trace (string "get type") $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ var "dat")))
+    (right nothing)
+    ("dat" ~> Eithers.map (unaryFunction just) (decoderFor _Type @@ var "graph" @@ var "dat"))
     (Maps.lookup (Constants.key_type) (var "anns"))
 
 getTypeAnnotation :: TBinding (Name -> Type -> Maybe Term)
@@ -221,32 +227,38 @@
   doc "Get a type annotation" $
   "key" ~> "typ" ~> Maps.lookup (var "key") (typeAnnotationInternal @@ var "typ")
 
-getTypeClasses :: TBinding (Term -> Flow Graph (M.Map Name (S.Set TypeClass)))
+getTypeClasses :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) (M.Map Name (S.Set TypeClass)))
 getTypeClasses = define "getTypeClasses" $
   doc "Get type classes from term" $
-  "term" ~>
-  "cx" <<~ Monads.getState $
+  "cx" ~> "graph" ~> "term" ~>
   "decodeClass" <~ ("term" ~>
     "byName" <~ Maps.fromList (list [
       pair (Core.nameLift _TypeClass_equality) Graph.typeClassEquality,
       pair (Core.nameLift _TypeClass_ordering) Graph.typeClassOrdering]) $
-    "fn" <<~ ExtractCore.unitVariant @@ Core.nameLift _TypeClass @@ var "term" $
+    "fn" <<~ ExtractCore.unitVariant @@ var "cx" @@ Core.nameLift _TypeClass @@ var "graph" @@ var "term" $
     Maybes.maybe
-      (Monads.unexpected @@ string "type class" @@ (ShowCore.term @@ var "term"))
-      (unaryFunction produce)
+      (Ctx.failInContext (Error.errorOther $ Error.otherError (string "unexpected: expected type class, got " ++ (ShowCore.term @@ var "term"))) (var "cx"))
+      (unaryFunction right)
       (Maps.lookup (var "fn") (var "byName"))) $
   Maybes.maybe
-    (produce Maps.empty)
-    ("term" ~> ExtractCore.map
-      @@ ("t" ~> Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Name @@ var "cx" @@ var "t"))
-      @@ (ExtractCore.setOf @@ var "decodeClass")
-      @@ (var "term"))
+    (right Maps.empty)
+    ("term" ~>
+      ExtractCore.map
+        @@ var "cx"
+        @@ ("t" ~> Eithers.bimap
+          ("de" ~> Ctx.inContext (Error.errorOther $ Error.otherError (unwrap _DecodingError @@ var "de")) (var "cx"))
+          ("x" ~> var "x")
+          (decoderFor _Name @@ var "graph" @@ var "t"))
+        @@ (ExtractCore.setOf @@ var "cx" @@ var "decodeClass" @@ var "graph")
+        @@ var "graph"
+        @@ (var "term"))
     (getTermAnnotation @@ Constants.key_classes @@ var "term")
 
-getTypeDescription :: TBinding (Type -> Flow Graph (Maybe String))
+getTypeDescription :: TBinding (Context -> Graph -> Type -> Prelude.Either (InContext Error) (Maybe String))
 getTypeDescription = define "getTypeDescription" $
-  doc "Get type description" $
-  "typ" ~> getDescription @@ (typeAnnotationInternal @@ var "typ")
+  doc "Get type description (Either version)" $
+  "cx" ~> "graph" ~> "typ" ~>
+  getDescription @@ var "cx" @@ var "graph" @@ (typeAnnotationInternal @@ var "typ")
 
 isNativeType :: TBinding (Binding -> Bool)
 isNativeType = define "isNativeType" $
@@ -268,26 +280,24 @@
   doc "Check if annotations contain description" $
   "anns" ~> Maybes.isJust (Maps.lookup (Constants.key_description) (var "anns"))
 
-hasFlag :: TBinding (Name -> Flow s Bool)
+hasFlag :: TBinding (Context -> Name -> Prelude.Either (InContext Error) Bool)
 hasFlag = define "hasFlag" $
-  doc "Check if flag is set" $
-  "flag" ~> Lexical.withEmptyGraph
-    @@ ("term" <<~ getAttrWithDefault @@ var "flag" @@ Core.false $
-        ExtractCore.boolean @@ var "term")
+  doc "Check if flag is set (Either version)" $
+  "cx" ~> "flag" ~>
+  "term" <~ getAttrWithDefault @@ var "flag" @@ Core.false @@ var "cx" $
+  ExtractCore.boolean @@ var "cx" @@ Graph.emptyGraph @@ var "term"
 
 hasTypeDescription :: TBinding (Type -> Bool)
 hasTypeDescription = define "hasTypeDescription" $
   doc "Check if type has description" $
   "typ" ~> hasDescription @@ (typeAnnotationInternal @@ var "typ")
 
-nextCount :: TBinding (Name -> Flow s Int)
+nextCount :: TBinding (Name -> Context -> (Int, Context))
 nextCount = define "nextCount" $
-  doc "Return a zero-indexed counter for the given key: 0, 1, 2, ..." $
-  "key" ~>
-  "count" <<~ getCount @@ var "key" $
-  Flows.map
-    (constant (var "count"))
-    (putCount @@ var "key" @@ Math.add (var "count") (int32 1))
+  doc "Return a zero-indexed counter for the given key and updated context (pure version)" $
+  "key" ~> "cx" ~>
+  "count" <~ getCount @@ var "key" @@ var "cx" $
+  pair (var "count") (putCount @@ var "key" @@ Math.add (var "count") (int32 1) @@ var "cx")
 
 normalizeTermAnnotations :: TBinding (Term -> Term)
 normalizeTermAnnotations = define "normalizeTermAnnotations" $
@@ -309,26 +319,22 @@
     (var "stripped")
     (Core.typeAnnotated (Core.annotatedType (var "stripped") (var "anns")))
 
-putAttr :: TBinding (Name -> Term -> Flow s ())
+putAttr :: TBinding (Name -> Term -> Context -> Context)
 putAttr = define "putAttr" $
-  doc "Set an attribute in the trace" $
-  "key" ~> "val" ~> Compute.flow (
-    "s0" ~> "t0" ~>
-    Compute.flowState
-      (just unit)
-      (var "s0")
-      (Compute.traceWithOther (var "t0") (Maps.insert (var "key") (var "val") (Compute.traceOther (var "t0")))))
+  doc "Set an attribute in a context" $
+  "key" ~> "val" ~> "cx" ~>
+  Ctx.contextWithOther (var "cx") (Maps.insert (var "key") (var "val") (Ctx.contextOther (var "cx")))
 
-putCount :: TBinding (Name -> Int -> Flow s ())
+putCount :: TBinding (Name -> Int -> Context -> Context)
 putCount = define "putCount" $
-  doc "Set counter value" $
-  "key" ~> "count" ~>
-  putAttr @@ var "key" @@ (Core.termLiteral (Core.literalInteger (Core.integerValueInt32 (var "count"))))
+  doc "Set counter value in context" $
+  "key" ~> "count" ~> "cx" ~>
+  putAttr @@ var "key" @@ (Core.termLiteral (Core.literalInteger (Core.integerValueInt32 (var "count")))) @@ var "cx"
 
-resetCount :: TBinding (Name -> Flow s ())
+resetCount :: TBinding (Name -> Context -> Context)
 resetCount = define "resetCount" $
-  doc "Reset counter to zero" $
-  "key" ~> putAttr @@ var "key" @@ MetaTerms.int32 0
+  doc "Reset counter to zero in context" $
+  "key" ~> "cx" ~> putAttr @@ var "key" @@ MetaTerms.int32 0 @@ var "cx"
 
 setAnnotation :: TBinding (Name -> Maybe Term -> M.Map Name Term -> M.Map Name Term)
 setAnnotation = define "setAnnotation" $
@@ -437,23 +443,9 @@
     (Maps.fromList (list [pair (Constants.key_type) (var "schemaTerm")])))) $
   Core.binding (var "name") (var "dataTerm") (just (Core.typeScheme (list ([] :: [TTerm Name])) (Core.typeVariable $ Core.nameLift _Type) Phantoms.nothing))
 
-whenFlag :: TBinding (Name -> Flow s a -> Flow s a -> Flow s a)
+whenFlag :: TBinding (Context -> Name -> Prelude.Either (InContext Error) a -> Prelude.Either (InContext Error) a -> Prelude.Either (InContext Error) a)
 whenFlag = define "whenFlag" $
-  doc "Execute different flows based on flag" $
-  "flag" ~> "fthen" ~> "felse" ~>
-  "b" <<~ hasFlag @@ var "flag" $
-  Logic.ifElse (var "b") (var "fthen") (var "felse")
-
-withDepth :: TBinding (Name -> (Int -> Flow s a) -> Flow s a)
-withDepth = define "withDepth" $
-  doc ("Provide an one-indexed, integer-valued 'depth' to a flow, where the depth is the number of nested calls."
-    <> " This is useful for generating variable names while avoiding conflicts between the variables of parents and children."
-    <> " E.g. a variable in an outer case/match statement might be \"v1\", whereas the variable of another case/match statement"
-    <> " inside of the first one becomes \"v2\". See also nextCount.") $
-  "key" ~> "f" ~>
-  "count" <<~ getCount @@ var "key" $
-  "inc" <~ Math.add (var "count") (int32 1) $
-  exec (putCount @@ var "key" @@ var "inc") $
-  "r" <<~ var "f" @@ var "inc" $
-  exec (putCount @@ var "key" @@ var "count") $
-  produce (var "r")
+  doc "Execute different branches based on flag (Either version)" $
+  "cx" ~> "flag" ~> "ethen" ~> "eelse" ~>
+  "b" <<~ hasFlag @@ var "cx" @@ var "flag" $
+  Logic.ifElse (var "b") (var "ethen") (var "eelse")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Arity.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Arity.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Arity.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Arity.hs
@@ -3,21 +3,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (functionArity, primitiveArity, termArity, typeArity, typeSchemeArity, uncurryType)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -32,18 +29,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -67,12 +64,12 @@
     Just "Functions dealing with arguments and arity."
   where
     elements = [
-      toBinding functionArity,
-      toBinding primitiveArity,
-      toBinding termArity,
-      toBinding typeArity,
-      toBinding typeSchemeArity,
-      toBinding uncurryType]
+      toTermDefinition functionArity,
+      toTermDefinition primitiveArity,
+      toTermDefinition termArity,
+      toTermDefinition typeArity,
+      toTermDefinition typeSchemeArity,
+      toTermDefinition uncurryType]
 
 functionArity :: TBinding (Function -> Int)
 functionArity = define "functionArity" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Checking.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Checking.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Checking.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Checking.hs
@@ -11,788 +11,869 @@
 
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (
-  allEqual, applyTypeArgumentsToType, checkForUnboundTypeVariables, checkNominalApplication,
-  checkSameType, checkType, checkTypeSubst, checkTypeVariables, containsInScopeTypeVars, normalizeTypeFreeVars, toFContext,
-  typeListsEffectivelyEqual, typeOf, typeOfAnnotatedTerm, typeOfApplication, typeOfCaseStatement,
-  typeOfEither, typeOfFunction, typeOfInjection, typeOfLambda, typeOfLet, typeOfLiteral, typeOfList,
-  typeOfMap, typeOfMaybe, typeOfPair, typeOfPrimitive, typeOfProjection, typeOfRecord, typeOfSet,
-  typeOfTypeApplication, typeOfTypeLambda, typeOfUnion, typeOfUnit, typeOfUnwrap, typeOfVariable,
-  typeOfWrap, typeOfWrappedTerm, typesAllEffectivelyEqual, typesEffectivelyEqual)
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Constants    as Constants
-import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Formatting   as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Lexical      as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Reflect      as Reflect
-import qualified Hydra.Sources.Kernel.Terms.Rewriting    as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Schemas      as Schemas
-import qualified Hydra.Sources.Kernel.Terms.Show.Core    as ShowCore
-import qualified Hydra.Sources.Kernel.Terms.Show.Meta    as ShowMeta
-import qualified Hydra.Sources.Kernel.Terms.Substitution as Substitution
-
-
-ns :: Namespace
-ns = Namespace "hydra.checking"
-
-module_ :: Module
-module_ = Module ns elements
-    [Constants.ns, ExtractCore.ns, Formatting.ns, Lexical.ns, Reflect.ns, Rewriting.ns,
-      Schemas.ns, ShowCore.ns, ShowMeta.ns, Substitution.ns]
-    kernelTypesNamespaces $
-    Just "Type checking and type reconstruction (type-of) for the results of Hydra unification and inference"
-  where
-    elements = [
-      toBinding allEqual,
-      toBinding applyTypeArgumentsToType,
-      toBinding checkForUnboundTypeVariables,
-      toBinding checkNominalApplication,
-      toBinding checkSameType,
-      toBinding checkType,
-      toBinding checkTypeSubst,
-      toBinding checkTypeVariables,
-      toBinding toFContext,
-      toBinding typeListsEffectivelyEqual,
-      toBinding typeOf,
-      toBinding typeOfAnnotatedTerm,
-      toBinding typeOfApplication,
-      toBinding typeOfCaseStatement,
-      toBinding typeOfEither,
-      toBinding typeOfInjection,
-      toBinding typeOfLambda,
-      toBinding typeOfLet,
-      toBinding typeOfList,
-      toBinding typeOfLiteral,
-      toBinding typeOfMap,
-      toBinding typeOfMaybe,
-      toBinding typeOfPair,
-      toBinding typeOfPrimitive,
-      toBinding typeOfProjection,
-      toBinding typeOfRecord,
-      toBinding typeOfSet,
-      toBinding typeOfTypeApplication,
-      toBinding typeOfTypeLambda,
-      toBinding typeOfUnit,
-      toBinding typeOfUnwrap,
-      toBinding typeOfVariable,
-      toBinding typeOfWrappedTerm,
-      toBinding containsInScopeTypeVars,
-      toBinding normalizeTypeFreeVars,
-      toBinding typesAllEffectivelyEqual,
-      toBinding typesEffectivelyEqual]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-noTypeArgs :: TTerm [Type]
-noTypeArgs = list ([] :: [TTerm Type])
-
---
-
--- TODO: move this
-allEqual :: TBinding ([a] -> Bool)
-allEqual = define "allEqual" $
-  "els" ~>
-  Logic.ifElse (Lists.null $ var "els")
-    true
-    (Lists.foldl
-       ("b" ~> "t" ~> Logic.and (var "b") (Equality.equal (var "t") (Lists.head (var "els"))))
-       true
-       (Lists.tail $ var "els"))
-
-applyTypeArgumentsToType :: TBinding (TypeContext -> [Type] -> Type -> Flow s Type)
-applyTypeArgumentsToType = define "applyTypeArgumentsToType" $
-  doc "Apply type arguments to a type, substituting forall-bound variables" $
-  "tx" ~> "typeArgs" ~> "t" ~>
-  "nonnull" <~ (cases _Type (var "t")
-    (Just $ Flows.fail $ Strings.cat $ list [
-      string "not a forall type: ",
-      ShowCore.type_ @@ var "t",
-      string ". Trying to apply ",
-      Literals.showInt32 (Lists.length $ var "typeArgs"),
-      string " type args: ",
-      Formatting.showList @@ ShowCore.type_ @@ var "typeArgs",
-      string ". Context has vars: {",
-      Strings.intercalate (string ", ") (Lists.map (unaryFunction $ Core.unName) $ Maps.keys $ Typing.typeContextTypes $ var "tx"),
-      string "}"]) [
-    _Type_forall>>: "ft" ~>
-      "v" <~ Core.forallTypeParameter (var "ft") $
-      "tbody" <~ Core.forallTypeBody (var "ft") $
-      applyTypeArgumentsToType
-        @@ var "tx"
-        @@ (Lists.tail $ var "typeArgs")
-        @@ (Substitution.substInType
-          @@ (Typing.typeSubst $ Maps.singleton (var "v") (Lists.head $ var "typeArgs"))
-          @@ (var "tbody"))]) $
-  -- Only check type variables when there are no more type arguments to apply.
-  -- When there ARE type arguments, the type may contain forall-bound variables that will
-  -- be substituted by the type arguments. Those variables aren't in scope yet but will be resolved.
-  Logic.ifElse (Lists.null $ var "typeArgs")
-    (exec (checkTypeVariables @@ var "tx" @@ var "t") $ produce $ var "t")
-    (var "nonnull")
-
-checkForUnboundTypeVariables :: TBinding (InferenceContext -> Term -> Flow s ())
-checkForUnboundTypeVariables = define "checkForUnboundTypeVariables" $
-  doc "Check that a term has no unbound type variables" $
-  "cx" ~> "term0" ~>
-  "svars" <~ Sets.fromList (Maps.keys $ Typing.inferenceContextSchemaTypes $ var "cx") $
-  "checkRecursive" <~ ("vars" ~> "trace" ~> "lbinding" ~> "term" ~>
-    "recurse" <~ var "checkRecursive" @@ var "vars" @@ var "trace" @@ var "lbinding" $
-    "dflt" <~ (
-      exec (Flows.mapList (var "recurse") (Rewriting.subterms @@ var "term")) $
-      produce unit) $
-    "check" <~ ("typ" ~>
-      "freevars" <~ Rewriting.freeVariablesInType @@ var "typ" $
-      "badvars" <~ Sets.difference (Sets.difference (var "freevars") (var "vars")) (var "svars") $
-      Logic.ifElse (Sets.null $ var "badvars")
-        (produce unit)
-        (Flows.fail $ (string "unbound type variables: {")
-          ++ (Strings.intercalate (string ", ") (Lists.map (unaryFunction Core.unName) $ Sets.toList $ var "badvars"))
-          ++ (string "} in type ") ++ (ShowCore.type_ @@ var "typ") ++ (string " at path: ") ++ (Strings.intercalate (string " >> ") (Lists.reverse $ var "trace"))
-          ++ (optCases (var "lbinding")
-            (string "none")
-            ("binding" ~>
-                 (string ". bound term = ") ++ (ShowCore.term @@ (Core.bindingTerm $ var "binding"))
-              ++ (string ". bound type = ") ++ (optCases (Core.bindingType $ var "binding") (string "none") (ShowCore.typeScheme)))))) $
-    "checkOptional" <~ ("m" ~>
-      exec (Flows.mapMaybe (var "check") (var "m")) $
-      produce unit) $
-    "checkOptionalList" <~ ("ml" ~>
-      exec (Flows.mapMaybe ("l" ~> Flows.mapList (var "check") (var "l")) (var "ml")) $
-      produce unit) $
-    cases _Term (var "term")
-      (Just $ var "dflt") [
-      _Term_function>>: "f" ~> cases _Function (var "f")
-        (Just $ var "dflt") [
-        _Function_elimination>>: "e" ~> var "dflt",
-        _Function_lambda>>: "l" ~>
-          exec (var "checkOptional" @@ (Core.lambdaDomain $ var "l")) $
-          var "recurse" @@ (Core.lambdaBody $ var "l")],
-      _Term_let>>: "l" ~>
-        "forBinding" <~ ("b" ~>
-          "bterm" <~ Core.bindingTerm (var "b") $
-          "newVars" <~ optCases (Core.bindingType $ var "b")
-             (var "vars")
-             ("ts" ~> Sets.union (var "vars") (Sets.fromList $ Core.typeSchemeVariables $ var "ts")) $
-          "newTrace" <~ Lists.cons (Core.unName $ Core.bindingName $ var "b") (var "trace") $
-          var "checkRecursive" @@ var "newVars" @@ var "newTrace" @@ (just $ var "b") @@ var "bterm") $
-        exec (Flows.mapList (var "forBinding") $ Core.letBindings $ var "l") $
-        var "recurse" @@ (Core.letBody $ var "l"),
-      _Term_typeApplication>>: "tt" ~>
-        exec (var "check" @@ (Core.typeApplicationTermType $ var "tt")) $
-        var "recurse" @@ (Core.typeApplicationTermBody $ var "tt"),
-      _Term_typeLambda>>: "tl" ~>
-        exec (var "check" @@ (Core.typeVariable $ Core.typeLambdaParameter $ var "tl")) $
-        var "recurse" @@ (Core.typeLambdaBody $ var "tl")]) $
-  var "checkRecursive" @@ Sets.empty @@ list [string "top level"] @@ nothing @@ var "term0"
-
-checkNominalApplication ::  TBinding (TypeContext -> Name -> [Type] -> Flow s ())
-checkNominalApplication = define "checkNominalApplication" $
-  doc "Check that a nominal type is applied to the correct number of type arguments" $
-  "tx" ~> "tname" ~> "typeArgs" ~>
-  "schemaType" <<~ Schemas.requireSchemaType @@ Typing.typeContextInferenceContext (var "tx") @@ var "tname" $
-  "vars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "body" <~ Core.typeSchemeType (var "schemaType") $
-  "varslen" <~ Lists.length (var "vars") $
-  "argslen" <~ Lists.length (var "typeArgs") $
-  Logic.ifElse (Equality.equal (var "varslen") (var "argslen"))
-    (produce unit)
-    (Flows.fail $ (string "nominal type ") ++ Core.unName (var "tname") ++ (string " applied to the wrong number of type arguments: ")
-      ++ (string "(expected ") ++ Literals.showInt32 (var "varslen") ++ (string " arguments, got ")
-      ++ Literals.showInt32 (var "argslen") ++ (string "): ")
-      ++ (Formatting.showList @@ (ShowCore.type_) @@ (var "typeArgs")))
-
-checkSameType :: TBinding (TypeContext -> String -> [Type] -> Flow s Type)
-checkSameType = define "checkSameType" $
-  doc "Ensure all types in a list are equal and return the common type" $
-  "tx" ~> "desc" ~> "types" ~>
-  Logic.ifElse (typesAllEffectivelyEqual @@ var "tx" @@ var "types")
-    (Flows.pure $ Lists.head $ var "types")
-    (Flows.fail $ Strings.cat $ list [
-      string "unequal types ",
-      (Formatting.showList @@ ShowCore.type_ @@ var "types"),
-      string " in ",
-      var "desc"])
-
--- TODO: unused
-checkType :: TBinding (TypeContext -> Term -> Type -> Flow s ())
-checkType = define "checkType" $
-  doc "Check that a term has the expected type" $
-  "tx" ~> "term" ~> "typ" ~>
-  "cx" <~ Typing.typeContextInferenceContext (var "tx") $
-  "vars" <~ Typing.typeContextTypeVariables (var "tx") $
-  Logic.ifElse (Constants.debugInference)
-    ("t0" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "term" $
-      Logic.ifElse (typesEffectivelyEqual @@ var "tx" @@ var "t0" @@ var "typ")
-        (Flows.pure unit)
-        (Flows.fail $ Strings.cat $ list [
-          string "type checking failed: expected ",
-          ShowCore.type_ @@ var "typ",
-          string " but found ",
-          ShowCore.type_ @@ var "t0"]))
-    (Flows.pure unit)
-
-checkTypeSubst :: TBinding (InferenceContext -> TypeSubst -> Flow s TypeSubst)
-checkTypeSubst = define "checkTypeSubst" $
-  doc ("Sanity-check a type substitution arising from unification. Specifically, check that schema types have not been"
-    <> " inappropriately unified with type variables inferred from terms.") $
-  "cx" ~> "subst" ~>
-  "s" <~ Typing.unTypeSubst (var "subst") $
-  "vars" <~ Sets.fromList (Maps.keys $ var "s") $
-  "suspectVars" <~ Sets.intersection (var "vars") (Sets.fromList $ Maps.keys $ Typing.inferenceContextSchemaTypes $ var "cx") $
-  "isNominal" <~ ("ts" ~> cases _Type (Rewriting.deannotateType @@ (Core.typeSchemeType $ var "ts"))
-    (Just false) [
-    _Type_record>>: constant true,
-    _Type_union>>: constant true,
-    _Type_wrap>>: constant true]) $
-  "badVars" <~ Sets.fromList (Lists.filter
-    ("v" ~> Maybes.maybe false (var "isNominal") $
-      Lexical.dereferenceSchemaType @@ var "v" @@ (Typing.inferenceContextSchemaTypes $ var "cx"))
-    (Sets.toList $ var "suspectVars")) $
-  "badPairs" <~ Lists.filter ("p" ~> Sets.member (Pairs.first $ var "p") (var "badVars")) (Maps.toList $ var "s") $
-  "printPair" <~ ("p" ~> (Core.unName $ Pairs.first $ var "p") ++ (string " --> ") ++ (ShowCore.type_ @@ Pairs.second (var "p"))) $
-  Logic.ifElse (Sets.null $ var "badVars")
-    (produce $ var "subst")
-    (Flows.fail $ (string "Schema type(s) incorrectly unified: {")
-      ++ (Strings.intercalate (string ", ") (Lists.map (var "printPair") (var "badPairs")))
-      ++ (string "}"))
-
-checkTypeVariables :: TBinding (TypeContext -> Type -> Flow s ())
-checkTypeVariables = define "checkTypeVariables" $
-  doc "Check that all type variables in a type are bound. NOTE: This check is currently disabled to allow phantom type variables from polymorphic instantiation to pass through. The proper fix is to ensure `typeOf` doesn't create fresh variables for post-inference code." $
-  "_tx" ~> "_typ" ~>
-  -- Disabled: phantom type variables from polymorphic instantiation cause false positives.
-  -- The inference pass has already validated type variables via checkForUnboundTypeVariables.
-  Flows.pure unit
-
--- TODO: unused (?). This function can be used to construct Typing.typeContextTypes from Typing.typeContextInferenceContext
-toFContext :: TBinding (InferenceContext -> M.Map Name Type)
-toFContext = define "toFContext" $
-  doc "Convert an inference context to a type environment by converting type schemes to System F types" $
-  "cx" ~> Maps.map (Schemas.typeSchemeToFType) $ Typing.inferenceContextDataTypes $ var "cx"
-
-typeListsEffectivelyEqual :: TBinding (TypeContext -> [Type] -> [Type] -> Bool)
-typeListsEffectivelyEqual = define "typeListsEffectivelyEqual" $
-  doc "Check whether two lists of types are effectively equal, disregarding type aliases" $
-  "tx" ~> "tlist1" ~> "tlist2" ~>
-  Logic.ifElse (Equality.equal (Lists.length (var "tlist1")) (Lists.length (var "tlist2")))
-    (Lists.foldl (binaryFunction Logic.and) true $
-      Lists.zipWith (typesEffectivelyEqual @@ var "tx") (var "tlist1") (var "tlist2"))
-    false
-
-typeOf :: TBinding (TypeContext -> [Type] -> Term -> Flow s Type)
-typeOf = define "typeOf" $
-  doc "Given a type context, reconstruct the type of a System F term" $
-  "tx" ~> "typeArgs" ~> "term" ~>
-  "check" <~ (cases _Term (var "term")
-    (Just $ Flows.fail $ Strings.cat $ list [
-      string "unsupported term variant in typeOf: ",
-      ShowMeta.termVariant @@ (Reflect.termVariant @@ var "term")]) [
-    _Term_annotated>>: typeOfAnnotatedTerm @@ var "tx" @@ var "typeArgs",
-    _Term_application>>: typeOfApplication @@ var "tx" @@ var "typeArgs",
-    _Term_either>>: typeOfEither @@ var "tx" @@ var "typeArgs",
-    _Term_function>>: "f" ~>
-      cases _Function (var "f") Nothing [
-        _Function_elimination>>: "elm" ~>
-          cases _Elimination (var "elm") Nothing [
-            _Elimination_record>>: typeOfProjection @@ var "tx" @@ var "typeArgs",
-            _Elimination_union>>: typeOfCaseStatement @@ var "tx" @@ var "typeArgs",
-            _Elimination_wrap>>: typeOfUnwrap @@ var "tx" @@ var "typeArgs"],
-        _Function_lambda>>: typeOfLambda @@ var "tx" @@ var "typeArgs",
-        _Function_primitive>>: typeOfPrimitive @@ var "tx" @@ var "typeArgs"],
-    _Term_let>>: typeOfLet @@ var "tx" @@ var "typeArgs",
-    _Term_list>>: typeOfList @@ var "tx" @@ var "typeArgs",
-    _Term_literal>>: typeOfLiteral @@ var "tx" @@ var "typeArgs",
-    _Term_map>>: typeOfMap @@ var "tx" @@ var "typeArgs",
-    _Term_maybe>>: typeOfMaybe @@ var "tx" @@ var "typeArgs",
-    _Term_pair>>: typeOfPair @@ var "tx" @@ var "typeArgs",
-    _Term_record>>: typeOfRecord @@ var "tx" @@ var "typeArgs",
-    _Term_set>>: typeOfSet @@ var "tx" @@ var "typeArgs",
-    _Term_typeApplication>>: typeOfTypeApplication @@ var "tx" @@ var "typeArgs",
-    _Term_typeLambda>>: typeOfTypeLambda @@ var "tx" @@ var "typeArgs",
-    _Term_union>>: typeOfInjection @@ var "tx" @@ var "typeArgs",
-    _Term_unit>>: constant $ typeOfUnit @@ var "tx" @@ var "typeArgs",
-    _Term_variable>>: typeOfVariable @@ var "tx" @@ var "typeArgs",
-    _Term_wrap>>: typeOfWrappedTerm @@ var "tx" @@ var "typeArgs"]) $
-  trace (string "typeOf") $
---  trace (string "typeOf " ++ (ShowCore.term @@ var "term")) $ -- For debugging only; risk of slow execution and stack overflow on deeply nested terms
-  var "check"
-
-typeOfAnnotatedTerm :: TBinding (TypeContext -> [Type] -> AnnotatedTerm -> Flow s Type)
-typeOfAnnotatedTerm = define "typeOfAnnotatedTerm" $
-  doc "Reconstruct the type of an annotated term" $
-  "tx" ~> "typeArgs" ~> "at" ~>
-  typeOf @@ var "tx" @@ var "typeArgs" @@ Core.annotatedTermBody (var "at")
-
-typeOfApplication :: TBinding (TypeContext -> [Type] -> Application -> Flow s Type)
-typeOfApplication = define "typeOfApplication" $
-  doc "Reconstruct the type of an application term" $
-  "tx" ~> "typeArgs" ~> "app" ~>
-  "fun" <~ Core.applicationFunction (var "app") $
-  "arg" <~ Core.applicationArgument (var "app") $
-  "tryType" <~ ("tfun" ~> "targ" ~> cases _Type (var "tfun")
-    (Just $ Flows.fail $ Strings.cat $ list [
-      string "left hand side of application (",
-      ShowCore.term @@ var "fun",
-      string ") is not function-typed (",
-      ShowCore.type_ @@ var "tfun",
-      string ")",
-      string ". types: ", Strings.intercalate (string ", ") (Lists.map
-        ("p" ~> Strings.cat $ list [Core.unName (Pairs.first $ var "p"), string ": ", ShowCore.type_ @@ (Pairs.second $ var "p")]) $
-        Maps.toList $ Typing.typeContextTypes $ var "tx")]) [
-    -- These forall types can arise from bindUnboundTypeVariables
-    _Type_forall>>: "ft" ~> var "tryType" @@ (Core.forallTypeBody (var "ft")) @@ var "targ",
-    _Type_function>>: "ft" ~>
-      "dom" <~ Core.functionTypeDomain (var "ft") $
-      "cod" <~ Core.functionTypeCodomain (var "ft") $
-      Logic.ifElse (typesEffectivelyEqual @@ var "tx" @@ var "dom" @@ var "targ")
-        (Flows.pure $ var "cod")
-        (Flows.fail $ Strings.cat $ list [
-          string "in application, expected ",
-          ShowCore.type_ @@ var "dom",
-          string " but found ",
-          ShowCore.type_ @@ var "targ"]),
-    -- Handle type variables: if the function type is a type variable, treat it as polymorphic
-    -- and return a fresh type variable as the result type. This can happen when inference
-    -- produces type variables that aren't fully resolved.
-    _Type_variable>>: "v" ~>
-      Flows.map (unaryFunction Core.typeVariable) (Schemas.freshName)]) $
-  -- Note: We don't call checkTypeVariables on tfun/targ because they may contain
-  -- phantom type variables from polymorphic instantiation that aren't in scope.
-  -- The type matching in tryType ensures type correctness.
-  "tfun" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "fun" $
-  "targ" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "arg" $
-  "t" <<~ var "tryType" @@ var "tfun" @@ var "targ" $
-  applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs" @@ var "t"
-
-typeOfCaseStatement :: TBinding (TypeContext -> [Type] -> CaseStatement -> Flow s Type)
-typeOfCaseStatement = define "typeOfCaseStatement" $
-  doc "Reconstruct the type of a case statement" $
-  "tx" ~> "typeArgs" ~> "cs" ~>
-  "tname" <~ Core.caseStatementTypeName (var "cs") $
-
-  "dflt" <~ Core.caseStatementDefault (var "cs") $
-  "cases" <~ Core.caseStatementCases (var "cs") $
-  "cterms" <~ Lists.map (unaryFunction Core.fieldTerm) (var "cases") $
-  "tdflt" <<~ Flows.mapMaybe ("e" ~> typeOf @@ var "tx" @@ noTypeArgs  @@ var "e") (var "dflt") $
-  "tcterms" <<~ Flows.mapList ("e" ~> typeOf @@ var "tx" @@ noTypeArgs  @@ var "e") (var "cterms") $
-  "fcods" <<~ Flows.mapList ("t" ~> Flows.map (unaryFunction Core.functionTypeCodomain) $ ExtractCore.functionType @@ var "t") (var "tcterms") $
-  "cods" <~ Maybes.cat (Lists.cons (var "tdflt") $ Lists.map (unaryFunction Maybes.pure) (var "fcods")) $
-  "cod" <<~ checkSameType @@ var "tx" @@ (string "case branches") @@ var "cods" $
---  "subst" <~ Typing.typeSubst (Maps.fromList $ Lists.zip (var "svars") (var "typeArgs")) $
---  "scod" <~ Substitution.substInType @@ var "subst" @@ var "cod" $
-
-  produce $ Core.typeFunction $ Core.functionType
-    (Schemas.nominalApplication @@ var "tname"  @@ var "typeArgs")
-    (var "cod")
-
-typeOfEither :: TBinding (TypeContext -> [Type] -> Prelude.Either Term Term -> Flow s Type)
-typeOfEither = define "typeOfEither" $
-  doc "Reconstruct the type of an either value" $
-  "tx" ~> "typeArgs" ~> "et" ~>
-  "checkLength" <~ (
-    "n" <~ Lists.length (var "typeArgs") $
-    Logic.ifElse (Equality.equal (var "n") (int32 2))
-      (Flows.pure unit)
-      (Flows.fail $ (string "either type requires 2 type arguments, got ") ++ Literals.showInt32 (var "n"))) $
-  exec (var "checkLength") $
-  Eithers.either_
-    ("leftTerm" ~>
-      "leftType" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "leftTerm" $
-      exec (checkTypeVariables @@ var "tx" @@ var "leftType") $
-      Flows.pure $ Core.typeEither $ Core.eitherType (var "leftType") (Lists.at (int32 1) $ var "typeArgs"))
-    ("rightTerm" ~>
-      "rightType" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "rightTerm" $
-      exec (checkTypeVariables @@ var "tx" @@ var "rightType") $
-      Flows.pure $ Core.typeEither $ Core.eitherType (Lists.at (int32 0) $ var "typeArgs") (var "rightType"))
-    (var "et")
-
-typeOfInjection :: TBinding (TypeContext -> [Type] -> Injection -> Flow s Type)
-typeOfInjection = define "typeOfInjection" $
-  doc "Reconstruct the type of a union injection" $
-  "tx" ~> "typeArgs" ~> "injection" ~>
-  "tname" <~ Core.injectionTypeName (var "injection") $
-
-  -- The following is only for checking, not for reconstruction
-  "field" <~ Core.injectionField (var "injection") $
-  "fname" <~ Core.fieldName (var "field") $
-  "fterm" <~ Core.fieldTerm (var "field") $
-  "schemaType" <<~ Schemas.requireSchemaType @@ Typing.typeContextInferenceContext (var "tx") @@ var "tname" $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "sbody" <~ Core.typeSchemeType (var "schemaType") $
-  "sfields" <<~ ExtractCore.unionType @@ var "tname" @@ var "sbody" $
-  "ftyp" <<~ Schemas.findFieldType @@ var "fname" @@ var "sfields" $
-
-  produce $ Schemas.nominalApplication @@ var "tname"  @@ var "typeArgs"
-
-typeOfLambda :: TBinding (TypeContext -> [Type] -> Lambda -> Flow s Type)
-typeOfLambda = define "typeOfLambda" $
-  doc "Reconstruct the type of a lambda function" $
-  "tx" ~> "typeArgs" ~> "l" ~>
-  "v" <~ Core.lambdaParameter (var "l") $
-  "mdom" <~ Core.lambdaDomain (var "l") $
-  "body" <~ Core.lambdaBody (var "l") $
-  "tbody" <<~ optCases (var "mdom")
-    (Flows.fail (string "untyped lambda"))
-    ("dom" ~>
-      exec (checkTypeVariables @@ var "tx" @@ var "dom") $
-      "types2" <~ Maps.insert (var "v") (var "dom") (Typing.typeContextTypes $ var "tx") $
-      "cod" <<~ typeOf @@ (Typing.typeContextWithTypes (var "tx") $ var "types2") @@ noTypeArgs  @@ var "body" $
-      exec (checkTypeVariables @@ var "tx" @@ var "cod") $
-      Flows.pure $ Core.typeFunction $ Core.functionType (var "dom") (var "cod")) $
-  applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs" @@ var "tbody"
-
-typeOfLet :: TBinding (TypeContext -> [Type] -> Let -> Flow s Type)
-typeOfLet = define "typeOfLet" $
-  doc "Reconstruct the type of a let binding" $
-  "tx" ~> "typeArgs" ~> "letTerm" ~>
-  "bs" <~ Core.letBindings (var "letTerm") $
-  "body" <~ Core.letBody (var "letTerm") $
-  "bnames" <~ Lists.map (unaryFunction Core.bindingName) (var "bs") $
-  "bterms" <~ Lists.map (unaryFunction Core.bindingTerm) (var "bs") $
-  "bindingType" <~ ("b" ~>
-    Maybes.maybe
-      (Flows.fail $ Strings.cat $ list [
-        string "untyped let binding: ",
-        ShowCore.binding @@ var "b"])
-      ("ts" ~> Flows.pure $ Schemas.typeSchemeToFType @@ var "ts")
-      (Core.bindingType $ var "b")) $
-  -- Previously inferred types for each binding
-  "btypes" <<~ Flows.mapList (var "bindingType") (var "bs") $
-  -- Extended type context (note: new bindings override old ones)
-  "tx2" <~ (Typing.typeContextWithTypes (var "tx")
-    (Maps.union
-      (Maps.fromList $ Lists.zip (var "bnames") (var "btypes"))
-      (Typing.typeContextTypes $ var "tx"))) $
-  -- Note: We trust the declared binding types (btypes) and use them to type-check the body.
-  -- Previously we also reconstructed types from terms and verified they match,
-  -- but this fails for terms that lack type application wrappers (e.g. after hoisting).
-  -- Since binding types come from inference and are authoritative, we skip the verification.
-  "t" <<~ typeOf @@ var "tx2" @@ noTypeArgs  @@ var "body" $
-  applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs" @@ var "t"
-
-typeOfList :: TBinding (TypeContext -> [Type] -> [Term] -> Flow s Type)
-typeOfList = define "typeOfList" $
-  doc "Reconstruct the type of a list" $
-  "tx" ~> "typeArgs" ~> "els" ~>
-  Logic.ifElse (Lists.null $ var "els")
-    -- Empty list is polymorphic
-    (Logic.ifElse (Equality.equal (Lists.length $ var "typeArgs") (int32 1))
-      (Flows.pure $ Core.typeList $ Lists.head $ var "typeArgs")
-      (Flows.fail (string "list type applied to more or less than one argument")))
-    -- Nonempty list must have elements of the same type
-    ( "eltypes" <<~ Flows.mapList
-       (typeOf @@ var "tx" @@ noTypeArgs )
-       (var "els") $
-       "unifiedType" <<~ checkSameType @@ var "tx" @@ (string "list elements") @@ var "eltypes" $
-       -- Verify the unified type is well-formed in the current scope
-       exec (checkTypeVariables @@ var "tx" @@ var "unifiedType") $
-       Flows.pure $ Core.typeList $ var "unifiedType")
-
-typeOfLiteral :: TBinding (TypeContext -> [Type] -> Literal -> Flow s Type)
-typeOfLiteral = define "typeOfLiteral" $
-  doc "Reconstruct the type of a literal" $
-  "tx" ~> "typeArgs" ~> "lit" ~>
-  "t" <~ Core.typeLiteral (Reflect.literalType @@ var "lit") $
-  applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs" @@ var "t"
-
-typeOfMap :: TBinding (TypeContext -> [Type] -> M.Map Term Term -> Flow s Type)
-typeOfMap = define "typeOfMap" $
-  doc "Reconstruct the type of a map" $
-  "tx" ~> "typeArgs" ~> "m" ~>
-  "nonnull" <~ (
-    "pairs" <~ Maps.toList (var "m") $
-    "kt" <<~ Flows.bind
-      (Flows.mapList (typeOf @@ var "tx" @@ noTypeArgs ) $
-        Lists.map (unaryFunction Pairs.first) (var "pairs"))
-      (checkSameType @@ var "tx" @@ (string "map keys")) $
-    "vt" <<~ Flows.bind
-      (Flows.mapList (typeOf @@ var "tx" @@ noTypeArgs ) $
-        Lists.map (unaryFunction Pairs.second) (var "pairs"))
-      (checkSameType @@ var "tx" @@ (string "map values")) $
-    exec (checkTypeVariables @@ var "tx" @@ var "kt") $
-    exec (checkTypeVariables @@ var "tx" @@ var "vt") $
-    applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs"
-      @@ (Core.typeMap $ Core.mapType (var "kt") (var "vt"))) $
-  Logic.ifElse (Maps.null $ var "m")
-    -- Empty map is polymorphic
-    (Logic.ifElse (Equality.equal (Lists.length $ var "typeArgs") (int32 2))
-      (Flows.pure $ Core.typeMap $ Core.mapType
-        (Lists.at (int32 0) $ var "typeArgs")
-        (Lists.at (int32 1) $ var "typeArgs"))
-      (Flows.fail (string "map type applied to more or less than two arguments")))
-    -- Nonempty map must have keys and values of the same type
-    (var "nonnull")
-
-typeOfMaybe :: TBinding (TypeContext -> [Type] -> Maybe Term -> Flow s Type)
-typeOfMaybe = define "typeOfMaybe" $
-  doc "Reconstruct the type of an optional value" $
-  "tx" ~> "typeArgs" ~> "mt" ~>
-    -- Nothing case is polymorphic
-  "forNothing" <~ (
-    "n" <~ Lists.length (var "typeArgs") $
-    Logic.ifElse (Equality.equal (var "n") (int32 1))
-      (Flows.pure $ Core.typeMaybe $ Lists.head $ var "typeArgs")
-      (Flows.fail $ (string "optional type applied to ") ++ Literals.showInt32 (var "n") ++ (string " argument(s). Expected 1."))) $
-    -- Just case: infer type of the contained term
-  "forJust" <~ ("term" ~>
-    "t" <<~ (
-      "termType" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "term" $
-       exec (checkTypeVariables @@ var "tx" @@ var "termType") $
-       Flows.pure $ Core.typeMaybe $ var "termType") $
-    applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs" @@ var "t") $
-  optCases (var "mt") (var "forNothing") (var "forJust")
-
-typeOfPair :: TBinding (TypeContext -> [Type] -> (Term, Term) -> Flow s Type)
-typeOfPair = define "typeOfPair" $
-  doc "Reconstruct the type of a pair" $
-  "tx" ~> "typeArgs" ~> "p" ~>
-  "checkLength" <~ (
-    "n" <~ Lists.length (var "typeArgs") $
-    Logic.ifElse (Equality.equal (var "n") (int32 2))
-      (Flows.pure unit)
-      (Flows.fail $ (string "pair type requires 2 type arguments, got ") ++ Literals.showInt32 (var "n"))) $
-  exec (var "checkLength") $
-  "pairFst" <~ Pairs.first (var "p") $
-  "pairSnd" <~ Pairs.second (var "p") $
-  "firstType" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "pairFst" $
-  exec (checkTypeVariables @@ var "tx" @@ var "firstType") $
-  "secondType" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "pairSnd" $
-  exec (checkTypeVariables @@ var "tx" @@ var "secondType") $
-  Flows.pure $ Core.typePair $ Core.pairType (var "firstType") (var "secondType")
-
-typeOfPrimitive :: TBinding (TypeContext -> [Type] -> Name -> Flow s Type)
-typeOfPrimitive = define "typeOfPrimitive" $
-  doc "Reconstruct the type of a primitive function" $
-  "tx" ~> "typeArgs" ~> "name" ~>
-  "ts" <<~ optCases
-    (Maps.lookup (var "name") (Typing.inferenceContextPrimitiveTypes $ Typing.typeContextInferenceContext $ var "tx"))
-    (Flows.fail $ Strings.cat $ list [
-      string "no such primitive: ",
-      Core.unName $ var "name"])
-    (Schemas.instantiateTypeScheme) $
-  "t" <~ Schemas.typeSchemeToFType @@ var "ts" $
-  applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs" @@ var "t"
-
-typeOfProjection :: TBinding (TypeContext -> [Type] -> Projection -> Flow s Type)
-typeOfProjection = define "typeOfProjection" $
-  doc "Reconstruct the type of a record projection" $
-  "tx" ~> "typeArgs" ~> "p" ~>
-  "tname" <~ Core.projectionTypeName (var "p") $
-  "fname" <~ Core.projectionField (var "p") $
-  "schemaType" <<~ Schemas.requireSchemaType @@ Typing.typeContextInferenceContext (var "tx") @@ var "tname" $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "sbody" <~ Core.typeSchemeType (var "schemaType") $
-  "sfields" <<~ ExtractCore.recordType @@ var "tname" @@ var "sbody" $
-  "ftyp" <<~ Schemas.findFieldType @@ var "fname" @@ var "sfields" $
-  "subst" <~ Typing.typeSubst (Maps.fromList $ Lists.zip (var "svars") (var "typeArgs")) $
-  "sftyp" <~ Substitution.substInType @@ var "subst" @@ var "ftyp" $
-  produce $ Core.typeFunction $ Core.functionType
-    (Schemas.nominalApplication @@ var "tname" @@ var "typeArgs")
-    (var "sftyp")
-
-typeOfRecord :: TBinding (TypeContext -> [Type] -> Record -> Flow s Type)
-typeOfRecord = define "typeOfRecord" $
-  doc "Reconstruct the type of a record" $
-  "tx" ~> "typeArgs" ~> "record" ~>
-  "tname" <~ Core.recordTypeName (var "record") $
-
-  -- The following is only for checking, not for reconstruction
-  "fields" <~ Core.recordFields (var "record") $
-  "ftypes" <<~ Flows.mapList
-    (typeOf @@ var "tx" @@ noTypeArgs )
-    (Lists.map (unaryFunction Core.fieldTerm) (var "fields")) $
-  exec (Flows.mapList (checkTypeVariables @@ var "tx") (var "ftypes")) $
-
-  produce $ Schemas.nominalApplication @@ var "tname" @@ var "typeArgs"
-
-typeOfSet :: TBinding (TypeContext -> [Type] -> S.Set Term -> Flow s Type)
-typeOfSet = define "typeOfSet" $
-  doc "Reconstruct the type of a set" $
-  "tx" ~> "typeArgs" ~> "els" ~>
-  Logic.ifElse (Sets.null $ var "els")
-    -- Empty set is polymorphic
-    (Logic.ifElse (Equality.equal (Lists.length $ var "typeArgs") (int32 1))
-      (Flows.pure $ Core.typeSet $ Lists.head $ var "typeArgs")
-      (Flows.fail (string "set type applied to more or less than one argument")))
-    -- Nonempty set must have elements of the same type
-    ( "eltypes" <<~ Flows.mapList
-       (typeOf @@ var "tx" @@ noTypeArgs )
-       (Sets.toList $ var "els") $
-       "unifiedType" <<~ checkSameType @@ var "tx" @@ (string "set elements") @@ var "eltypes" $
-       -- Verify the unified type is well-formed in the current scope
-       exec (checkTypeVariables @@ var "tx" @@ var "unifiedType") $
-       produce $ Core.typeSet $ var "unifiedType")
-
-typeOfTypeApplication :: TBinding (TypeContext -> [Type] -> TypeApplicationTerm -> Flow s Type)
-typeOfTypeApplication = define "typeOfTypeApplication" $
-  doc "Reconstruct the type of a type application term" $
-  "tx" ~> "typeArgs" ~> "tyapp" ~>
-  "body" <~ Core.typeApplicationTermBody (var "tyapp") $
-  "t" <~ Core.typeApplicationTermType (var "tyapp") $
-  typeOf @@ var "tx" @@ Lists.cons (var "t") (var "typeArgs") @@ var "body"
-
-typeOfTypeLambda :: TBinding (TypeContext -> [Type] -> TypeLambda -> Flow s Type)
-typeOfTypeLambda = define "typeOfTypeLambda" $
-  doc "Reconstruct the type of a type lambda (type abstraction) term" $
-  "tx" ~> "typeArgs" ~> "tl" ~>
-  "v" <~ Core.typeLambdaParameter (var "tl") $
-  "body" <~ Core.typeLambdaBody (var "tl") $
-  "vars" <~ Typing.typeContextTypeVariables (var "tx") $
-  "tx2" <~ Typing.typeContextWithTypeVariables (var "tx") (Sets.insert (var "v") (var "vars")) $
-  "t1" <<~ typeOf @@ var "tx2" @@ noTypeArgs  @@ var "body" $
-  exec (checkTypeVariables @@ var "tx2" @@ var "t1") $
-  applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs"
-    @@ (Core.typeForall $ Core.forallType (var "v") (var "t1"))
-
-typeOfUnit :: TBinding (TypeContext -> [Type] -> Flow s Type)
-typeOfUnit = define "typeOfUnit" $
-  doc "Reconstruct the type of the unit term" $
-  "tx" ~> "typeArgs" ~>
-  applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs" @@ Core.typeUnit
-
-typeOfUnwrap :: TBinding (TypeContext -> [Type] -> Name -> Flow s Type)
-typeOfUnwrap = define "typeOfUnwrap" $
-  doc "Reconstruct the type of an unwrap operation" $
-  "tx" ~> "typeArgs" ~> "tname" ~>
-  "schemaType" <<~ Schemas.requireSchemaType @@ Typing.typeContextInferenceContext (var "tx") @@ var "tname" $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "sbody" <~ Core.typeSchemeType (var "schemaType") $
-  "wrapped" <<~ ExtractCore.wrappedType @@ var "tname" @@ var "sbody" $
-  "subst" <~ Typing.typeSubst (Maps.fromList $ Lists.zip (var "svars") (var "typeArgs")) $
-  "swrapped" <~ Substitution.substInType @@ var "subst" @@ var "wrapped" $
-  produce $ MetaTypes.function
-    (Schemas.nominalApplication @@ var "tname" @@ var "typeArgs")
-    (var "swrapped")
-
-typeOfVariable :: TBinding (TypeContext -> [Type] -> Name -> Flow s Type)
-typeOfVariable = define "typeOfVariable" $
-  doc "Reconstruct the type of a variable" $
-  "tx" ~> "typeArgs" ~> "name" ~>
-  "rawType" <~ Maps.lookup (var "name") (Typing.typeContextTypes $ var "tx") $
-  "failMsg" <~ Flows.fail (Strings.cat $ list [
-      string "unbound variable: ",
-      Core.unName $ var "name",
-      string ". Variables: {",
-      Strings.intercalate (string ", ") (Lists.map (unaryFunction $ Core.unName) $ Maps.keys $ Typing.typeContextTypes $ var "tx"),
-      string "}"]) $
-  "t" <<~ optCases (var "rawType")
-    (var "failMsg")
-    ("t" ~> Logic.ifElse (Lists.null $ var "typeArgs")
-      (Schemas.instantiateType @@ var "t")
-      (Flows.pure $ var "t")) $
-  applyTypeArgumentsToType @@ var "tx" @@ var "typeArgs" @@ var "t"
-
-typeOfWrappedTerm :: TBinding (TypeContext -> [Type] -> WrappedTerm -> Flow s Type)
-typeOfWrappedTerm = define "typeOfWrappedTerm" $
-  doc "Reconstruct the type of a wrapped term" $
-  "tx" ~> "typeArgs" ~> "wt" ~>
-  "tname" <~ Core.wrappedTermTypeName (var "wt") $
-
-  -- The following is only for checking, not for reconstruction
-  "body" <~ Core.wrappedTermBody (var "wt") $
-  "btype" <<~ typeOf @@ var "tx" @@ noTypeArgs  @@ var "body" $
-  exec (checkTypeVariables @@ var "tx" @@ var "btype") $
-
-  produce $ Schemas.nominalApplication @@ var "tname" @@ var "typeArgs"
-
-normalizeTypeFreeVars :: TBinding (Type -> Type)
-normalizeTypeFreeVars = define "normalizeTypeFreeVars" $
-  doc "Normalize free type variables in a type to canonical names based on order of first occurrence. This allows comparing types that differ only in the naming of free type variables." $
-  "typ" ~>
-  "collectVars" <~ ("acc" ~> "t" ~>
-    cases _Type (var "t")
-      (Just $ var "acc") [
-      _Type_variable>>: "v" ~>
-        Logic.ifElse (Maps.member (var "v") (var "acc"))
-          (var "acc")
-          (Maps.insert (var "v") (Core.name $ Strings.cat2 (string "_tv") (Literals.showInt32 $ Maps.size $ var "acc")) (var "acc"))]) $
-  "subst" <~ Rewriting.foldOverType @@ Coders.traversalOrderPre @@ var "collectVars" @@ Maps.empty @@ var "typ" $
-  Rewriting.substituteTypeVariables @@ var "subst" @@ var "typ"
-
-typesAllEffectivelyEqual :: TBinding (TypeContext -> [Type] -> Bool)
-typesAllEffectivelyEqual = define "typesAllEffectivelyEqual" $
-  doc ("Check whether a list of types are effectively equal, disregarding type aliases and free type variable naming."
-    <> " Also treats free type variables (not in schema) as wildcards, since inference has already verified consistency.") $
-  "tx" ~> "tlist" ~>
-  "types" <~ Typing.inferenceContextSchemaTypes (Typing.typeContextInferenceContext $ var "tx") $
-  "containsFreeVar" <~ ("t" ~>
-    "allVars" <~ Rewriting.freeVariablesInTypeSimple @@ var "t" $
-    "schemaNames" <~ Sets.fromList (Maps.keys $ var "types") $
-    Logic.not $ Sets.null $ Sets.difference (var "allVars") (var "schemaNames")) $
-  "anyContainsFreeVar" <~ Lists.foldl ("acc" ~> "t" ~> Logic.or (var "acc") (var "containsFreeVar" @@ var "t")) false (var "tlist") $
-  Logic.ifElse (var "anyContainsFreeVar")
-    true
-    (Logic.ifElse (allEqual @@ (Lists.map ("t" ~> normalizeTypeFreeVars @@ var "t") (var "tlist")))
-      true
-      (allEqual @@ (Lists.map ("t" ~> normalizeTypeFreeVars @@ (Rewriting.deannotateTypeRecursive @@ (Rewriting.replaceTypedefs @@ var "types" @@ var "t"))) (var "tlist"))))
-
--- | Check if a type contains any type variable that's in scope (from typeContextTypeVariables)
-containsInScopeTypeVars :: TBinding (TypeContext -> Type -> Bool)
-containsInScopeTypeVars = define "containsInScopeTypeVars" $
-  doc "Check if a type contains any type variable from the current scope" $
-  "tx" ~> "t" ~>
-  "vars" <~ Typing.typeContextTypeVariables (var "tx") $
-  "freeVars" <~ Rewriting.freeVariablesInTypeSimple @@ var "t" $
-  Logic.not $ Sets.null $ Sets.intersection (var "vars") (var "freeVars")
-
-typesEffectivelyEqual :: TBinding (TypeContext -> Type -> Type -> Bool)
-typesEffectivelyEqual = define "typesEffectivelyEqual" $
-  doc "Check whether two types are effectively equal, disregarding type aliases, forall quantifiers, and treating in-scope type variables as wildcards" $
-  "tx" ~> "t1" ~> "t2" ~>
-  -- If either type contains in-scope type variables, treat them as matching
-  -- This handles the case where fresh type variables from instantiation haven't been substituted
-  Logic.or (containsInScopeTypeVars @@ var "tx" @@ var "t1") $
-  Logic.or (containsInScopeTypeVars @@ var "tx" @@ var "t2") $
-  typesAllEffectivelyEqual @@ var "tx" @@ list [
-    Schemas.fullyStripAndNormalizeType @@ var "t1",
-    Schemas.fullyStripAndNormalizeType @@ var "t2"]
+  allEqual, applyTypeArgumentsToType,
+  checkForUnboundTypeVariables, checkForUnboundTypeVariablesE,
+  checkNominalApplication, checkNominalApplicationE,
+  checkSameType, checkType, checkTypeSubst, checkTypeVariables, containsInScopeTypeVars, normalizeTypeFreeVars, toFContext,
+  typeListsEffectivelyEqual, typeOf, typeOfE, typesAllEffectivelyEqual, typesEffectivelyEqual,
+  typeOfAnnotatedTerm, typeOfAnnotatedTermE,
+  typeOfApplication, typeOfApplicationE,
+  typeOfCaseStatement, typeOfCaseStatementE,
+  typeOfEither, typeOfEitherE,
+  typeOfInjection, typeOfInjectionE,
+  typeOfLambda, typeOfLambdaE,
+  typeOfLet, typeOfLetE,
+  typeOfList, typeOfListE,
+  typeOfLiteral, typeOfLiteralE,
+  typeOfMap, typeOfMapE,
+  typeOfMaybe, typeOfMaybeE,
+  typeOfPair, typeOfPairE,
+  typeOfPrimitive, typeOfPrimitiveE,
+  typeOfProjection, typeOfProjectionE,
+  typeOfRecord, typeOfRecordE,
+  typeOfSet, typeOfSetE,
+  typeOfTypeApplication, typeOfTypeApplicationE,
+  typeOfTypeLambda, typeOfTypeLambdaE,
+  typeOfUnit, typeOfUnitE,
+  typeOfUnwrap, typeOfUnwrapE,
+  typeOfVariable, typeOfVariableE,
+  typeOfWrappedTerm, typeOfWrappedTermE)
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths    as Paths
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Ast          as Ast
+import qualified Hydra.Dsl.Bootstrap         as Bootstrap
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Meta.Graph        as Graph
+import qualified Hydra.Dsl.Json.Model         as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Literals          as Literals
+import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base         as MetaBase
+import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
+import qualified Hydra.Dsl.Meta.Types        as MetaTypes
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms
+import qualified Hydra.Dsl.Prims             as Prims
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Testing      as Testing
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Tests             as Tests
+import qualified Hydra.Dsl.Topology     as Topology
+import qualified Hydra.Dsl.Types             as Types
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
+import qualified Hydra.Dsl.Meta.Variants     as Variants
+import qualified Hydra.Dsl.Paths         as Paths
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors            as Error
+import qualified Hydra.Dsl.Error.Checking   as ErrorsChecking
+import qualified Hydra.Dsl.Error.Core       as ErrorsCore
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                    as I
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+import qualified Data.Maybe                  as Y
+
+import qualified Hydra.Sources.Kernel.Terms.Constants    as Constants
+import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
+import qualified Hydra.Sources.Kernel.Terms.Formatting   as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Lexical      as Lexical
+import qualified Hydra.Sources.Kernel.Terms.Reflect      as Reflect
+import qualified Hydra.Sources.Kernel.Terms.Rewriting    as Rewriting
+
+import qualified Hydra.Sources.Kernel.Terms.Schemas      as Schemas
+import qualified Hydra.Sources.Kernel.Terms.Show.Core    as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors  as ShowError
+import qualified Hydra.Sources.Kernel.Terms.Show.Meta    as ShowMeta
+import qualified Hydra.Sources.Kernel.Terms.Substitution as Substitution
+
+
+ns :: Namespace
+ns = Namespace "hydra.checking"
+
+module_ :: Module
+module_ = Module ns elements
+    [Constants.ns, ExtractCore.ns, Formatting.ns, Lexical.ns, Reflect.ns, Rewriting.ns,
+      Schemas.ns, ShowCore.ns, ShowError.ns, ShowMeta.ns, Substitution.ns]
+    kernelTypesNamespaces $
+    Just "Type checking and type reconstruction (type-of) for the results of Hydra unification and inference"
+  where
+    elements = [
+      toTermDefinition allEqual,
+      toTermDefinition applyTypeArgumentsToType,
+      toTermDefinition checkForUnboundTypeVariables,
+      toTermDefinition checkNominalApplication,
+      toTermDefinition checkSameType,
+      toTermDefinition checkType,
+      toTermDefinition checkTypeSubst,
+      toTermDefinition checkTypeVariables,
+      toTermDefinition containsInScopeTypeVars,
+      toTermDefinition normalizeTypeFreeVars,
+      toTermDefinition toFContext,
+      toTermDefinition typeListsEffectivelyEqual,
+      toTermDefinition typeOf,
+      toTermDefinition typeOfAnnotatedTerm,
+      toTermDefinition typeOfApplication,
+      toTermDefinition typeOfCaseStatement,
+      toTermDefinition typeOfEither,
+      toTermDefinition typeOfInjection,
+      toTermDefinition typeOfLambda,
+      toTermDefinition typeOfLet,
+      toTermDefinition typeOfList,
+      toTermDefinition typeOfLiteral,
+      toTermDefinition typeOfMap,
+      toTermDefinition typeOfMaybe,
+      toTermDefinition typeOfPair,
+      toTermDefinition typeOfPrimitive,
+      toTermDefinition typeOfProjection,
+      toTermDefinition typeOfRecord,
+      toTermDefinition typeOfSet,
+      toTermDefinition typeOfTypeApplication,
+      toTermDefinition typeOfTypeLambda,
+      toTermDefinition typeOfUnit,
+      toTermDefinition typeOfUnwrap,
+      toTermDefinition typeOfVariable,
+      toTermDefinition typeOfWrappedTerm,
+      toTermDefinition typesAllEffectivelyEqual,
+      toTermDefinition typesEffectivelyEqual]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+noTypeArgs :: TTerm [Type]
+noTypeArgs = list ([] :: [TTerm Type])
+
+--
+
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
+allEqual :: TBinding ([a] -> Bool)
+allEqual = define "allEqual" $
+  "els" ~>
+  Logic.ifElse (Lists.null $ var "els")
+    true
+    (Lists.foldl
+       ("b" ~> "t" ~> Logic.and (var "b") (Equality.equal (var "t") (Lists.head (var "els"))))
+       true
+       (Lists.tail $ var "els"))
+
+applyTypeArgumentsToType :: TBinding (Context -> Graph -> [Type] -> Type -> Prelude.Either (InContext Error) Type)
+applyTypeArgumentsToType = define "applyTypeArgumentsToType" $
+  doc "Apply type arguments to a type, substituting forall-bound variables" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "t" ~>
+  -- Check null typeArgs FIRST to avoid eager evaluation of head/tail on empty list
+  Logic.ifElse (Lists.null $ var "typeArgs")
+    (right $ var "t")
+    ("nonnull" <~ (cases _Type (var "t")
+      (Just $ Ctx.failInContext (Error.errorOther $ Error.otherError $ Strings.cat $ list [
+        string "not a forall type: ",
+        ShowCore.type_ @@ var "t",
+        string ". Trying to apply ",
+        Literals.showInt32 (Lists.length $ var "typeArgs"),
+        string " type args: ",
+        Formatting.showList @@ ShowCore.type_ @@ var "typeArgs",
+        string ". Context has vars: {",
+        Strings.intercalate (string ", ") (Lists.map (unaryFunction $ Core.unName) $ Maps.keys $ Graph.graphBoundTypes $ var "tx"),
+        string "}"]) (var "cx")) [
+      _Type_forall>>: "ft" ~>
+        "v" <~ Core.forallTypeParameter (var "ft") $
+        "tbody" <~ Core.forallTypeBody (var "ft") $
+        applyTypeArgumentsToType
+          @@ var "cx"
+          @@ var "tx"
+          @@ (Lists.tail $ var "typeArgs")
+          @@ (Substitution.substInType
+            @@ (Typing.typeSubst $ Maps.singleton (var "v") (Lists.head $ var "typeArgs"))
+            @@ (var "tbody"))]) $
+    var "nonnull")
+
+checkForUnboundTypeVariables :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) ())
+checkForUnboundTypeVariables = define "checkForUnboundTypeVariables" $
+  doc "Check that a term has no unbound type variables (Either version)" $
+  "cx" ~> "tx" ~> "term0" ~>
+  "svars" <~ Sets.fromList (Maps.keys $ Graph.graphSchemaTypes $ var "tx") $
+  "checkRecursive" <~ ("vars" ~> "trace" ~> "lbinding" ~> "term" ~>
+    "recurse" <~ var "checkRecursive" @@ var "vars" @@ var "trace" @@ var "lbinding" $
+    "dflt" <~ (
+      Eithers.bind (Eithers.mapList (var "recurse") (Rewriting.subterms @@ var "term"))
+        ("_" ~> right unit)) $
+    "check" <~ ("typ" ~>
+      "freevars" <~ Rewriting.freeVariablesInType @@ var "typ" $
+      "badvars" <~ Sets.difference (Sets.difference (var "freevars") (var "vars")) (var "svars") $
+      Logic.ifElse (Sets.null $ var "badvars")
+        (right unit)
+        (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorUnboundTypeVariables $ ErrorsChecking.unboundTypeVariablesError (var "badvars") (var "typ")) (var "cx"))) $
+    "checkOptional" <~ ("m" ~>
+      Eithers.bind (Eithers.mapMaybe (var "check") (var "m"))
+        ("_" ~> right unit)) $
+    cases _Term (var "term")
+      (Just $ var "dflt") [
+      _Term_function>>: "f" ~> cases _Function (var "f")
+        (Just $ var "dflt") [
+        _Function_elimination>>: "e" ~> var "dflt",
+        _Function_lambda>>: "l" ~>
+          Eithers.bind (var "checkOptional" @@ (Core.lambdaDomain $ var "l"))
+            ("_" ~> var "recurse" @@ (Core.lambdaBody $ var "l"))],
+      _Term_let>>: "l" ~>
+        "forBinding" <~ ("b" ~>
+          "bterm" <~ Core.bindingTerm (var "b") $
+          "newVars" <~ optCases (Core.bindingType $ var "b")
+             (var "vars")
+             ("ts" ~> Sets.union (var "vars") (Sets.fromList $ Core.typeSchemeVariables $ var "ts")) $
+          "newTrace" <~ Lists.cons (Core.unName $ Core.bindingName $ var "b") (var "trace") $
+          var "checkRecursive" @@ var "newVars" @@ var "newTrace" @@ (just $ var "b") @@ var "bterm") $
+        Eithers.bind (Eithers.mapList (var "forBinding") $ Core.letBindings $ var "l")
+          ("_" ~> var "recurse" @@ (Core.letBody $ var "l")),
+      _Term_typeApplication>>: "tt" ~>
+        Eithers.bind (var "check" @@ (Core.typeApplicationTermType $ var "tt"))
+          ("_" ~> var "recurse" @@ (Core.typeApplicationTermBody $ var "tt")),
+      _Term_typeLambda>>: "tl" ~>
+        Eithers.bind (var "check" @@ (Core.typeVariable $ Core.typeLambdaParameter $ var "tl"))
+          ("_" ~> var "recurse" @@ (Core.typeLambdaBody $ var "tl"))]) $
+  var "checkRecursive" @@ Sets.empty @@ list [string "top level"] @@ nothing @@ var "term0"
+
+checkNominalApplication :: TBinding (Context -> Graph -> Name -> [Type] -> Prelude.Either (InContext Error) ((), Context))
+checkNominalApplication = define "checkNominalApplication" $
+  doc "Check that a nominal type is applied to the correct number of type arguments (Either version)" $
+  "cx" ~> "tx" ~> "tname" ~> "typeArgs" ~>
+  "result" <<~ Schemas.requireSchemaType @@ var "cx" @@ (Graph.graphSchemaTypes $ var "tx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "result") $
+  "cx2" <~ Pairs.second (var "result") $
+  "vars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "varslen" <~ Lists.length (var "vars") $
+  "argslen" <~ Lists.length (var "typeArgs") $
+  Logic.ifElse (Equality.equal (var "varslen") (var "argslen"))
+    (right $ pair unit (var "cx2"))
+    (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeArityMismatch $ ErrorsChecking.typeArityMismatchError (Core.typeVariable (var "tname")) (var "varslen") (var "argslen") (var "typeArgs")) (var "cx2"))
+
+checkSameType :: TBinding (Context -> Graph -> String -> [Type] -> Prelude.Either (InContext Error) Type)
+checkSameType = define "checkSameType" $
+  doc "Ensure all types in a list are equal and return the common type" $
+  "cx" ~> "tx" ~> "desc" ~> "types" ~>
+  Logic.ifElse (typesAllEffectivelyEqual @@ var "tx" @@ var "types")
+    (right $ Lists.head $ var "types")
+    (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorUnequalTypes $ ErrorsChecking.unequalTypesError (var "types") (var "desc")) (var "cx"))
+
+-- TODO: unused
+checkType :: TBinding (Context -> Graph -> Term -> Type -> Prelude.Either (InContext Error) ())
+checkType = define "checkType" $
+  doc "Check that a term has the expected type" $
+  "cx" ~> "tx" ~> "term" ~> "typ" ~>
+  "vars" <~ Graph.graphTypeVariables (var "tx") $
+  Logic.ifElse (Constants.debugInference)
+    ("t0" <<~ (Eithers.map ("_p" ~> Pairs.first (var "_p")) (typeOf @@ var "cx" @@ var "tx" @@ noTypeArgs @@ var "term")) $
+      Logic.ifElse (typesEffectivelyEqual @@ var "tx" @@ var "t0" @@ var "typ")
+        (right unit)
+        (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeMismatch $ ErrorsChecking.typeMismatchError (var "typ") (var "t0")) (var "cx")))
+    (right unit)
+
+checkTypeSubst :: TBinding (Context -> Graph -> TypeSubst -> Prelude.Either (InContext Error) TypeSubst)
+checkTypeSubst = define "checkTypeSubst" $
+  doc ("Sanity-check a type substitution arising from unification. Specifically, check that schema types have not been"
+    <> " inappropriately unified with type variables inferred from terms.") $
+  "cx" ~> "tx" ~> "subst" ~>
+  "s" <~ Typing.unTypeSubst (var "subst") $
+  "vars" <~ Sets.fromList (Maps.keys $ var "s") $
+  "suspectVars" <~ Sets.intersection (var "vars") (Sets.fromList $ Maps.keys $ Graph.graphSchemaTypes $ var "tx") $
+  "isNominal" <~ ("ts" ~> cases _Type (Rewriting.deannotateType @@ (Core.typeSchemeType $ var "ts"))
+    (Just false) [
+    _Type_record>>: constant true,
+    _Type_union>>: constant true,
+    _Type_wrap>>: constant true]) $
+  "badVars" <~ Sets.fromList (Lists.filter
+    ("v" ~> Maybes.maybe false (var "isNominal") $
+      Lexical.dereferenceSchemaType @@ var "v" @@ (Graph.graphSchemaTypes $ var "tx"))
+    (Sets.toList $ var "suspectVars")) $
+  "badPairs" <~ Lists.filter ("p" ~> Sets.member (Pairs.first $ var "p") (var "badVars")) (Maps.toList $ var "s") $
+  "printPair" <~ ("p" ~> (Core.unName $ Pairs.first $ var "p") ++ (string " --> ") ++ (ShowCore.type_ @@ Pairs.second (var "p"))) $
+  Logic.ifElse (Sets.null $ var "badVars")
+    (right $ var "subst")
+    (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorIncorrectUnification $ ErrorsChecking.incorrectUnificationError (var "subst")) (var "cx"))
+
+checkTypeVariables :: TBinding (Graph -> Type -> ())
+checkTypeVariables = define "checkTypeVariables" $
+  doc "Check that all type variables in a type are bound. NOTE: This check is currently disabled to allow phantom type variables from polymorphic instantiation to pass through. The proper fix is to ensure `typeOf` doesn't create fresh variables for post-inference code." $
+  "_tx" ~> "_typ" ~>
+  -- Disabled: phantom type variables from polymorphic instantiation cause false positives.
+  -- The inference pass has already validated type variables via checkForUnboundTypeVariables.
+  unit
+
+-- Note: with Graph, this converts TypeSchemes back to System F types
+toFContext :: TBinding (Graph -> M.Map Name Type)
+toFContext = define "toFContext" $
+  doc "Get the bound types from a graph as a type environment" $
+  "cx" ~> Maps.map (Rewriting.typeSchemeToFType) $ Graph.graphBoundTypes $ var "cx"
+
+typeListsEffectivelyEqual :: TBinding (Graph -> [Type] -> [Type] -> Bool)
+typeListsEffectivelyEqual = define "typeListsEffectivelyEqual" $
+  doc "Check whether two lists of types are effectively equal, disregarding type aliases" $
+  "tx" ~> "tlist1" ~> "tlist2" ~>
+  Logic.ifElse (Equality.equal (Lists.length (var "tlist1")) (Lists.length (var "tlist2")))
+    (Lists.foldl (binaryFunction Logic.and) true $
+      Lists.zipWith (typesEffectivelyEqual @@ var "tx") (var "tlist1") (var "tlist2"))
+    false
+
+-- Old typeOf* variant functions removed; typeOf now uses Either-based typeOfE
+
+normalizeTypeFreeVars :: TBinding (Type -> Type)
+normalizeTypeFreeVars = define "normalizeTypeFreeVars" $
+  doc "Normalize free type variables in a type to canonical names based on order of first occurrence. This allows comparing types that differ only in the naming of free type variables." $
+  "typ" ~>
+  "collectVars" <~ ("acc" ~> "t" ~>
+    cases _Type (var "t")
+      (Just $ var "acc") [
+      _Type_variable>>: "v" ~>
+        Logic.ifElse (Maps.member (var "v") (var "acc"))
+          (var "acc")
+          (Maps.insert (var "v") (Core.name $ Strings.cat2 (string "_tv") (Literals.showInt32 $ Maps.size $ var "acc")) (var "acc"))]) $
+  "subst" <~ Rewriting.foldOverType @@ Coders.traversalOrderPre @@ var "collectVars" @@ Maps.empty @@ var "typ" $
+  Rewriting.substituteTypeVariables @@ var "subst" @@ var "typ"
+
+typesAllEffectivelyEqual :: TBinding (Graph -> [Type] -> Bool)
+typesAllEffectivelyEqual = define "typesAllEffectivelyEqual" $
+  doc ("Check whether a list of types are effectively equal, disregarding type aliases and free type variable naming."
+    <> " Also treats free type variables (not in schema) as wildcards, since inference has already verified consistency.") $
+  "tx" ~> "tlist" ~>
+  "types" <~ (Graph.graphSchemaTypes $ var "tx") $
+  "containsFreeVar" <~ ("t" ~>
+    "allVars" <~ Rewriting.freeVariablesInTypeSimple @@ var "t" $
+    "schemaNames" <~ Sets.fromList (Maps.keys $ var "types") $
+    Logic.not $ Sets.null $ Sets.difference (var "allVars") (var "schemaNames")) $
+  "anyContainsFreeVar" <~ Lists.foldl ("acc" ~> "t" ~> Logic.or (var "acc") (var "containsFreeVar" @@ var "t")) false (var "tlist") $
+  Logic.ifElse (var "anyContainsFreeVar")
+    true
+    (Logic.ifElse (allEqual @@ (Lists.map ("t" ~> normalizeTypeFreeVars @@ var "t") (var "tlist")))
+      true
+      (allEqual @@ (Lists.map ("t" ~> normalizeTypeFreeVars @@ (Rewriting.deannotateTypeRecursive @@ (Rewriting.replaceTypedefs @@ var "types" @@ var "t"))) (var "tlist"))))
+
+-- | Check if a type contains any type variable that's in scope (from graphTypeVariables)
+containsInScopeTypeVars :: TBinding (Graph -> Type -> Bool)
+containsInScopeTypeVars = define "containsInScopeTypeVars" $
+  doc "Check if a type contains any type variable from the current scope" $
+  "tx" ~> "t" ~>
+  "vars" <~ Graph.graphTypeVariables (var "tx") $
+  "freeVars" <~ Rewriting.freeVariablesInTypeSimple @@ var "t" $
+  Logic.not $ Sets.null $ Sets.intersection (var "vars") (var "freeVars")
+
+typesEffectivelyEqual :: TBinding (Graph -> Type -> Type -> Bool)
+typesEffectivelyEqual = define "typesEffectivelyEqual" $
+  doc "Check whether two types are effectively equal, disregarding type aliases, forall quantifiers, and treating in-scope type variables as wildcards" $
+  "tx" ~> "t1" ~> "t2" ~>
+  -- If either type contains in-scope type variables, treat them as matching
+  -- This handles the case where fresh type variables from instantiation haven't been substituted
+  Logic.or (containsInScopeTypeVars @@ var "tx" @@ var "t1") $
+  Logic.or (containsInScopeTypeVars @@ var "tx" @@ var "t2") $
+  typesAllEffectivelyEqual @@ var "tx" @@ list [
+    Schemas.fullyStripAndNormalizeType @@ var "t1",
+    Schemas.fullyStripAndNormalizeType @@ var "t2"]
+
+-- ============================================================================
+-- Either/Context-threading versions of typeOf* functions
+-- ============================================================================
+-- These functions thread a Context through to support pure fresh-name generation.
+-- The return type is (Type, Context) to propagate
+-- the updated counter.
+
+typeOf :: TBinding (Context -> Graph -> [Type] -> Term -> Prelude.Either (InContext Error) (Type, Context))
+typeOf = define "typeOf" $
+  doc "Given a type context, reconstruct the type of a System F term" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "term" ~>
+  "cx1" <~ Ctx.pushTrace (string "typeOf") (var "cx") $
+  cases _Term (var "term")
+    (Just $ Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorUnsupportedTermVariant $ ErrorsChecking.unsupportedTermVariantError (Reflect.termVariant @@ var "term")) (var "cx1")) [
+    _Term_annotated>>: typeOfAnnotatedTerm @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_application>>: typeOfApplication @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_either>>: typeOfEither @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_function>>: "f" ~>
+      cases _Function (var "f") Nothing [
+        _Function_elimination>>: "elm" ~>
+          cases _Elimination (var "elm") Nothing [
+            _Elimination_record>>: typeOfProjection @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+            _Elimination_union>>: typeOfCaseStatement @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+            _Elimination_wrap>>: typeOfUnwrap @@ var "cx1" @@ var "tx" @@ var "typeArgs"],
+        _Function_lambda>>: typeOfLambda @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+        _Function_primitive>>: typeOfPrimitive @@ var "cx1" @@ var "tx" @@ var "typeArgs"],
+    _Term_let>>: typeOfLet @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_list>>: typeOfList @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_literal>>: typeOfLiteral @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_map>>: typeOfMap @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_maybe>>: typeOfMaybe @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_pair>>: typeOfPair @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_record>>: typeOfRecord @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_set>>: typeOfSet @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_typeApplication>>: typeOfTypeApplication @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_typeLambda>>: typeOfTypeLambda @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_union>>: typeOfInjection @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_unit>>: constant $ typeOfUnit @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_variable>>: typeOfVariable @@ var "cx1" @@ var "tx" @@ var "typeArgs",
+    _Term_wrap>>: typeOfWrappedTerm @@ var "cx1" @@ var "tx" @@ var "typeArgs"]
+
+typeOfAnnotatedTerm :: TBinding (Context -> Graph -> [Type] -> AnnotatedTerm -> Prelude.Either (InContext Error) (Type, Context))
+typeOfAnnotatedTerm = define "typeOfAnnotatedTerm" $
+  doc "Reconstruct the type of an annotated term (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "at" ~>
+  typeOf @@ var "cx" @@ var "tx" @@ var "typeArgs" @@ Core.annotatedTermBody (var "at")
+
+typeOfApplication :: TBinding (Context -> Graph -> [Type] -> Application -> Prelude.Either (InContext Error) (Type, Context))
+typeOfApplication = define "typeOfApplication" $
+  doc "Reconstruct the type of an application term (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "app" ~>
+  "fun" <~ Core.applicationFunction (var "app") $
+  "arg" <~ Core.applicationArgument (var "app") $
+  "tryType" <~ ("cx0" ~> "tfun" ~> "targ" ~> cases _Type (var "tfun")
+    (Just $ Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorNotAFunctionType $ ErrorsChecking.notAFunctionTypeError (var "tfun")) (var "cx0")) [
+    _Type_forall>>: "ft" ~> var "tryType" @@ var "cx0" @@ (Core.forallTypeBody (var "ft")) @@ var "targ",
+    _Type_function>>: "ft" ~>
+      "dom" <~ Core.functionTypeDomain (var "ft") $
+      "cod" <~ Core.functionTypeCodomain (var "ft") $
+      Logic.ifElse (typesEffectivelyEqual @@ var "tx" @@ var "dom" @@ var "targ")
+        (right $ pair (var "cod") (var "cx0"))
+        (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeMismatch $ ErrorsChecking.typeMismatchError (var "dom") (var "targ")) (var "cx0")),
+    _Type_variable>>: "v" ~>
+      "nameResult" <~ Schemas.freshName @@ var "cx0" $
+      "freshN" <~ Pairs.first (var "nameResult") $
+      "cx1" <~ Pairs.second (var "nameResult") $
+      right $ pair (Core.typeVariable $ var "freshN") (var "cx1")]) $
+  "result1" <<~ typeOf @@ var "cx" @@ var "tx" @@ noTypeArgs @@ var "fun" $
+  "tfun" <~ Pairs.first (var "result1") $
+  "cx2" <~ Pairs.second (var "result1") $
+  "result2" <<~ typeOf @@ var "cx2" @@ var "tx" @@ noTypeArgs @@ var "arg" $
+  "targ" <~ Pairs.first (var "result2") $
+  "cx3" <~ Pairs.second (var "result2") $
+  "result3" <<~ var "tryType" @@ var "cx3" @@ var "tfun" @@ var "targ" $
+  "t" <~ Pairs.first (var "result3") $
+  "cx4" <~ Pairs.second (var "result3") $
+  "applied" <<~ applyTypeArgumentsToType @@ var "cx4" @@ var "tx" @@ var "typeArgs" @@ var "t" $
+  right $ pair (var "applied") (var "cx4")
+
+typeOfCaseStatement :: TBinding (Context -> Graph -> [Type] -> CaseStatement -> Prelude.Either (InContext Error) (Type, Context))
+typeOfCaseStatement = define "typeOfCaseStatement" $
+  doc "Reconstruct the type of a case statement (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "cs" ~>
+  "tname" <~ Core.caseStatementTypeName (var "cs") $
+  "dflt" <~ Core.caseStatementDefault (var "cs") $
+  "cases" <~ Core.caseStatementCases (var "cs") $
+  "cterms" <~ Lists.map (unaryFunction Core.fieldTerm) (var "cases") $
+  -- Type the default case if present
+  "dfltResult" <<~ Eithers.mapMaybe ("e" ~> typeOf @@ var "cx" @@ var "tx" @@ noTypeArgs @@ var "e") (var "dflt") $
+  -- dfltResult :: Maybe (Type, Context)
+  "tdflt" <~ Maybes.map (unaryFunction Pairs.first) (var "dfltResult") $
+  "cx2" <~ Maybes.maybe (var "cx") (unaryFunction Pairs.second) (var "dfltResult") $
+  -- Type all case terms, threading context through the list
+  "foldResult" <~ Lists.foldl
+    ("acc" ~> "term" ~>
+      -- acc is Either (InContext Error) ([Type], Context)
+      "accR" <<~ var "acc" $
+      "types" <~ Pairs.first (var "accR") $
+      "cxA" <~ Pairs.second (var "accR") $
+      "tResult" <<~ typeOf @@ var "cxA" @@ var "tx" @@ noTypeArgs @@ var "term" $
+      "t" <~ Pairs.first (var "tResult") $
+      "cxB" <~ Pairs.second (var "tResult") $
+      right $ pair (Lists.concat2 (var "types") (Lists.pure $ var "t")) (var "cxB"))
+    (right $ pair (list ([] :: [TTerm Type])) (var "cx2"))
+    (var "cterms") $
+  "foldR" <<~ var "foldResult" $
+  "tcterms" <~ Pairs.first (var "foldR") $
+  "cx3" <~ Pairs.second (var "foldR") $
+  -- Extract function codomains
+  "fcodsResult" <~ Lists.foldl
+    ("acc" ~> "t" ~>
+      "accR" <<~ var "acc" $
+      "cods" <~ Pairs.first (var "accR") $
+      "ft" <<~ ExtractCore.functionType @@ var "cx3" @@ var "t" $
+      right $ pair (Lists.concat2 (var "cods") (Lists.pure $ Core.functionTypeCodomain $ var "ft")) (var "cx3"))
+    (right $ pair (list ([] :: [TTerm Type])) (var "cx3"))
+    (var "tcterms") $
+  "fcodsR" <<~ var "fcodsResult" $
+  "fcods" <~ Pairs.first (var "fcodsR") $
+  "cods" <~ Maybes.cat (Lists.cons (var "tdflt") $ Lists.map (unaryFunction Maybes.pure) (var "fcods")) $
+  "cod" <<~ checkSameType @@ var "cx3" @@ var "tx" @@ (string "case branches") @@ var "cods" $
+  right $ pair (Core.typeFunction $ Core.functionType
+    (Schemas.nominalApplication @@ var "tname" @@ var "typeArgs")
+    (var "cod")) (var "cx3")
+
+typeOfEither :: TBinding (Context -> Graph -> [Type] -> Prelude.Either Term Term -> Prelude.Either (InContext Error) (Type, Context))
+typeOfEither = define "typeOfEither" $
+  doc "Reconstruct the type of an either value (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "et" ~>
+  "n" <~ Lists.length (var "typeArgs") $
+  Logic.ifElse (Equality.equal (var "n") (int32 2))
+    (Eithers.either_
+      ("leftTerm" ~>
+        "result" <<~ typeOf @@ var "cx" @@ var "tx" @@ noTypeArgs @@ var "leftTerm" $
+        "leftType" <~ Pairs.first (var "result") $
+        "cx2" <~ Pairs.second (var "result") $
+        right $ pair (Core.typeEither $ Core.eitherType (var "leftType") (Lists.at (int32 1) $ var "typeArgs")) (var "cx2"))
+      ("rightTerm" ~>
+        "result" <<~ typeOf @@ var "cx" @@ var "tx" @@ noTypeArgs @@ var "rightTerm" $
+        "rightType" <~ Pairs.first (var "result") $
+        "cx2" <~ Pairs.second (var "result") $
+        right $ pair (Core.typeEither $ Core.eitherType (Lists.at (int32 0) $ var "typeArgs") (var "rightType")) (var "cx2"))
+      (var "et"))
+    (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeArityMismatch $ ErrorsChecking.typeArityMismatchError (Core.typeEither $ Core.eitherType Core.typeUnit Core.typeUnit) (int32 2) (var "n") (var "typeArgs")) (var "cx"))
+
+typeOfInjection :: TBinding (Context -> Graph -> [Type] -> Injection -> Prelude.Either (InContext Error) (Type, Context))
+typeOfInjection = define "typeOfInjection" $
+  doc "Reconstruct the type of a union injection (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "injection" ~>
+  "tname" <~ Core.injectionTypeName (var "injection") $
+  "field" <~ Core.injectionField (var "injection") $
+  "fname" <~ Core.fieldName (var "field") $
+  "fterm" <~ Core.fieldTerm (var "field") $
+  "schemaResult" <<~ Schemas.requireSchemaType @@ var "cx" @@ (Graph.graphSchemaTypes $ var "tx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "schemaResult") $
+  "cx2" <~ Pairs.second (var "schemaResult") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "sbody" <~ Core.typeSchemeType (var "schemaType") $
+  "sfields" <<~ ExtractCore.unionType @@ var "cx2" @@ var "tname" @@ var "sbody" $
+  "ftyp" <<~ Schemas.findFieldType @@ var "cx2" @@ var "fname" @@ var "sfields" $
+  right $ pair (Schemas.nominalApplication @@ var "tname" @@ var "typeArgs") (var "cx2")
+
+typeOfLambda :: TBinding (Context -> Graph -> [Type] -> Lambda -> Prelude.Either (InContext Error) (Type, Context))
+typeOfLambda = define "typeOfLambda" $
+  doc "Reconstruct the type of a lambda function (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "l" ~>
+  "v" <~ Core.lambdaParameter (var "l") $
+  "mdom" <~ Core.lambdaDomain (var "l") $
+  "body" <~ Core.lambdaBody (var "l") $
+  "tbodyResult" <<~ optCases (var "mdom")
+    (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorUntypedLambda ErrorsChecking.untypedLambdaError) (var "cx"))
+    ("dom" ~>
+      "types2" <~ Maps.insert (var "v") (Rewriting.fTypeToTypeScheme @@ var "dom") (Graph.graphBoundTypes $ var "tx") $
+      "codResult" <<~ typeOf @@ var "cx" @@ (Graph.graphWithBoundTypes (var "tx") $ var "types2") @@ noTypeArgs @@ var "body" $
+      "cod" <~ Pairs.first (var "codResult") $
+      "cx2" <~ Pairs.second (var "codResult") $
+      right $ pair (Core.typeFunction $ Core.functionType (var "dom") (var "cod")) (var "cx2")) $
+  "tbody" <~ Pairs.first (var "tbodyResult") $
+  "cx3" <~ Pairs.second (var "tbodyResult") $
+  "applied" <<~ applyTypeArgumentsToType @@ var "cx3" @@ var "tx" @@ var "typeArgs" @@ var "tbody" $
+  right $ pair (var "applied") (var "cx3")
+
+typeOfLet :: TBinding (Context -> Graph -> [Type] -> Let -> Prelude.Either (InContext Error) (Type, Context))
+typeOfLet = define "typeOfLet" $
+  doc "Reconstruct the type of a let binding (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "letTerm" ~>
+  "bs" <~ Core.letBindings (var "letTerm") $
+  "body" <~ Core.letBody (var "letTerm") $
+  "bnames" <~ Lists.map (unaryFunction Core.bindingName) (var "bs") $
+  "bindingType" <~ ("b" ~>
+    Maybes.maybe
+      (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorUntypedLetBinding $ ErrorsChecking.untypedLetBindingError (var "b")) (var "cx"))
+      ("ts" ~> right $ Rewriting.typeSchemeToFType @@ var "ts")
+      (Core.bindingType $ var "b")) $
+  -- Get binding types, threading errors through the fold
+  "btypesResult" <~ Lists.foldl
+    ("acc" ~> "b" ~>
+      "accR" <<~ var "acc" $
+      "types" <~ Pairs.first (var "accR") $
+      "btype" <<~ var "bindingType" @@ var "b" $
+      right $ pair (Lists.concat2 (var "types") (Lists.pure $ var "btype")) unit)
+    (right $ pair (list ([] :: [TTerm Type])) unit)
+    (var "bs") $
+  "btypesR" <<~ var "btypesResult" $
+  "btypes" <~ Pairs.first (var "btypesR") $
+  -- Extended type context
+  "tx2" <~ (Graph.graphWithBoundTypes (var "tx")
+    (Maps.union
+      (Maps.fromList $ Lists.zip (var "bnames") (Lists.map (Rewriting.fTypeToTypeScheme) $ var "btypes"))
+      (Graph.graphBoundTypes $ var "tx"))) $
+  "tResult" <<~ typeOf @@ var "cx" @@ var "tx2" @@ noTypeArgs @@ var "body" $
+  "t" <~ Pairs.first (var "tResult") $
+  "cx2" <~ Pairs.second (var "tResult") $
+  "applied" <<~ applyTypeArgumentsToType @@ var "cx2" @@ var "tx" @@ var "typeArgs" @@ var "t" $
+  right $ pair (var "applied") (var "cx2")
+
+typeOfList :: TBinding (Context -> Graph -> [Type] -> [Term] -> Prelude.Either (InContext Error) (Type, Context))
+typeOfList = define "typeOfList" $
+  doc "Reconstruct the type of a list (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "els" ~>
+  Logic.ifElse (Lists.null $ var "els")
+    (Logic.ifElse (Equality.equal (Lists.length $ var "typeArgs") (int32 1))
+      (right $ pair (Core.typeList $ Lists.head $ var "typeArgs") (var "cx"))
+      (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeArityMismatch $ ErrorsChecking.typeArityMismatchError (Core.typeList Core.typeUnit) (int32 1) (Lists.length $ var "typeArgs") (var "typeArgs")) (var "cx")))
+    -- Nonempty list: type all elements, threading context
+    ("foldResult" <~ Lists.foldl
+      ("acc" ~> "term" ~>
+        "accR" <<~ var "acc" $
+        "types" <~ Pairs.first (var "accR") $
+        "cxA" <~ Pairs.second (var "accR") $
+        "tResult" <<~ typeOf @@ var "cxA" @@ var "tx" @@ noTypeArgs @@ var "term" $
+        "t" <~ Pairs.first (var "tResult") $
+        "cxB" <~ Pairs.second (var "tResult") $
+        right $ pair (Lists.concat2 (var "types") (Lists.pure $ var "t")) (var "cxB"))
+      (right $ pair (list ([] :: [TTerm Type])) (var "cx"))
+      (var "els") $
+    "foldR" <<~ var "foldResult" $
+    "eltypes" <~ Pairs.first (var "foldR") $
+    "cx2" <~ Pairs.second (var "foldR") $
+    "unifiedType" <<~ checkSameType @@ var "cx2" @@ var "tx" @@ (string "list elements") @@ var "eltypes" $
+    right $ pair (Core.typeList $ var "unifiedType") (var "cx2"))
+
+typeOfLiteral :: TBinding (Context -> Graph -> [Type] -> Literal -> Prelude.Either (InContext Error) (Type, Context))
+typeOfLiteral = define "typeOfLiteral" $
+  doc "Reconstruct the type of a literal (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "lit" ~>
+  "t" <~ Core.typeLiteral (Reflect.literalType @@ var "lit") $
+  "applied" <<~ applyTypeArgumentsToType @@ var "cx" @@ var "tx" @@ var "typeArgs" @@ var "t" $
+  right $ pair (var "applied") (var "cx")
+
+typeOfMap :: TBinding (Context -> Graph -> [Type] -> M.Map Term Term -> Prelude.Either (InContext Error) (Type, Context))
+typeOfMap = define "typeOfMap" $
+  doc "Reconstruct the type of a map (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "m" ~>
+  Logic.ifElse (Maps.null $ var "m")
+    (Logic.ifElse (Equality.equal (Lists.length $ var "typeArgs") (int32 2))
+      (right $ pair (Core.typeMap $ Core.mapType
+        (Lists.at (int32 0) $ var "typeArgs")
+        (Lists.at (int32 1) $ var "typeArgs")) (var "cx"))
+      (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeArityMismatch $ ErrorsChecking.typeArityMismatchError (Core.typeMap $ Core.mapType Core.typeUnit Core.typeUnit) (int32 2) (Lists.length $ var "typeArgs") (var "typeArgs")) (var "cx")))
+    -- Nonempty map: type keys and values
+    ("pairs" <~ Maps.toList (var "m") $
+    -- Fold over keys
+    "keyFoldResult" <~ Lists.foldl
+      ("acc" ~> "p" ~>
+        "accR" <<~ var "acc" $
+        "types" <~ Pairs.first (var "accR") $
+        "cxA" <~ Pairs.second (var "accR") $
+        "tResult" <<~ typeOf @@ var "cxA" @@ var "tx" @@ noTypeArgs @@ (Pairs.first $ var "p") $
+        "t" <~ Pairs.first (var "tResult") $
+        "cxB" <~ Pairs.second (var "tResult") $
+        right $ pair (Lists.concat2 (var "types") (Lists.pure $ var "t")) (var "cxB"))
+      (right $ pair (list ([] :: [TTerm Type])) (var "cx"))
+      (var "pairs") $
+    "keyFoldR" <<~ var "keyFoldResult" $
+    "keyTypes" <~ Pairs.first (var "keyFoldR") $
+    "cx2" <~ Pairs.second (var "keyFoldR") $
+    "kt" <<~ checkSameType @@ var "cx2" @@ var "tx" @@ (string "map keys") @@ var "keyTypes" $
+    -- Fold over values
+    "valFoldResult" <~ Lists.foldl
+      ("acc" ~> "p" ~>
+        "accR" <<~ var "acc" $
+        "types" <~ Pairs.first (var "accR") $
+        "cxA" <~ Pairs.second (var "accR") $
+        "tResult" <<~ typeOf @@ var "cxA" @@ var "tx" @@ noTypeArgs @@ (Pairs.second $ var "p") $
+        "t" <~ Pairs.first (var "tResult") $
+        "cxB" <~ Pairs.second (var "tResult") $
+        right $ pair (Lists.concat2 (var "types") (Lists.pure $ var "t")) (var "cxB"))
+      (right $ pair (list ([] :: [TTerm Type])) (var "cx2"))
+      (var "pairs") $
+    "valFoldR" <<~ var "valFoldResult" $
+    "valTypes" <~ Pairs.first (var "valFoldR") $
+    "cx3" <~ Pairs.second (var "valFoldR") $
+    "vt" <<~ checkSameType @@ var "cx3" @@ var "tx" @@ (string "map values") @@ var "valTypes" $
+    "applied" <<~ applyTypeArgumentsToType @@ var "cx3" @@ var "tx" @@ var "typeArgs"
+      @@ (Core.typeMap $ Core.mapType (var "kt") (var "vt")) $
+    right $ pair (var "applied") (var "cx3"))
+
+typeOfMaybe :: TBinding (Context -> Graph -> [Type] -> Maybe Term -> Prelude.Either (InContext Error) (Type, Context))
+typeOfMaybe = define "typeOfMaybe" $
+  doc "Reconstruct the type of an optional value (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "mt" ~>
+  "forNothing" <~ (
+    "n" <~ Lists.length (var "typeArgs") $
+    Logic.ifElse (Equality.equal (var "n") (int32 1))
+      (right $ pair (Core.typeMaybe $ Lists.head $ var "typeArgs") (var "cx"))
+      (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeArityMismatch $ ErrorsChecking.typeArityMismatchError (Core.typeMaybe Core.typeUnit) (int32 1) (var "n") (var "typeArgs")) (var "cx"))) $
+  "forJust" <~ ("term" ~>
+    "tResult" <<~ typeOf @@ var "cx" @@ var "tx" @@ noTypeArgs @@ var "term" $
+    "termType" <~ Pairs.first (var "tResult") $
+    "cx2" <~ Pairs.second (var "tResult") $
+    "t" <~ Core.typeMaybe (var "termType") $
+    "applied" <<~ applyTypeArgumentsToType @@ var "cx2" @@ var "tx" @@ var "typeArgs" @@ var "t" $
+    right $ pair (var "applied") (var "cx2")) $
+  optCases (var "mt") (var "forNothing") (var "forJust")
+
+typeOfPair :: TBinding (Context -> Graph -> [Type] -> (Term, Term) -> Prelude.Either (InContext Error) (Type, Context))
+typeOfPair = define "typeOfPair" $
+  doc "Reconstruct the type of a pair (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "p" ~>
+  "n" <~ Lists.length (var "typeArgs") $
+  Logic.ifElse (Equality.equal (var "n") (int32 2))
+    ("pairFst" <~ Pairs.first (var "p") $
+    "pairSnd" <~ Pairs.second (var "p") $
+    "result1" <<~ typeOf @@ var "cx" @@ var "tx" @@ noTypeArgs @@ var "pairFst" $
+    "firstType" <~ Pairs.first (var "result1") $
+    "cx2" <~ Pairs.second (var "result1") $
+    "result2" <<~ typeOf @@ var "cx2" @@ var "tx" @@ noTypeArgs @@ var "pairSnd" $
+    "secondType" <~ Pairs.first (var "result2") $
+    "cx3" <~ Pairs.second (var "result2") $
+    right $ pair (Core.typePair $ Core.pairType (var "firstType") (var "secondType")) (var "cx3"))
+    (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeArityMismatch $ ErrorsChecking.typeArityMismatchError (Core.typePair $ Core.pairType Core.typeUnit Core.typeUnit) (int32 2) (var "n") (var "typeArgs")) (var "cx"))
+
+typeOfPrimitive :: TBinding (Context -> Graph -> [Type] -> Name -> Prelude.Either (InContext Error) (Type, Context))
+typeOfPrimitive = define "typeOfPrimitive" $
+  doc "Reconstruct the type of a primitive function (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "name" ~>
+  -- Look up the primitive directly in the graph's primitives map and extract its type.
+  -- This avoids reconstructing a Map Name TypeScheme on every call (O(p) per call).
+  "rawTs" <~ Maybes.map ("_p" ~> Graph.primitiveType (var "_p"))
+    (Maps.lookup (var "name") (Graph.graphPrimitives $ var "tx")) $
+  Maybes.maybe
+    (Ctx.failInContext (Error.errorUndefinedTermVariable $ ErrorsCore.undefinedTermVariableError (Paths.subtermPath $ list ([] :: [TTerm SubtermStep])) (var "name")) (var "cx"))
+    ("tsRaw" ~>
+      "instResult" <~ Schemas.instantiateTypeScheme @@ var "cx" @@ var "tsRaw" $
+      "ts" <~ Pairs.first (var "instResult") $
+      "cx2" <~ Pairs.second (var "instResult") $
+      "t" <~ Rewriting.typeSchemeToFType @@ var "ts" $
+      "applied" <<~ applyTypeArgumentsToType @@ var "cx2" @@ var "tx" @@ var "typeArgs" @@ var "t" $
+      right $ pair (var "applied") (var "cx2"))
+    (var "rawTs")
+
+typeOfProjection :: TBinding (Context -> Graph -> [Type] -> Projection -> Prelude.Either (InContext Error) (Type, Context))
+typeOfProjection = define "typeOfProjection" $
+  doc "Reconstruct the type of a record projection (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "p" ~>
+  "tname" <~ Core.projectionTypeName (var "p") $
+  "fname" <~ Core.projectionField (var "p") $
+  "schemaResult" <<~ Schemas.requireSchemaType @@ var "cx" @@ (Graph.graphSchemaTypes $ var "tx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "schemaResult") $
+  "cx2" <~ Pairs.second (var "schemaResult") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "sbody" <~ Core.typeSchemeType (var "schemaType") $
+  "sfields" <<~ ExtractCore.recordType @@ var "cx2" @@ var "tname" @@ var "sbody" $
+  "ftyp" <<~ Schemas.findFieldType @@ var "cx2" @@ var "fname" @@ var "sfields" $
+  "subst" <~ Typing.typeSubst (Maps.fromList $ Lists.zip (var "svars") (var "typeArgs")) $
+  "sftyp" <~ Substitution.substInType @@ var "subst" @@ var "ftyp" $
+  right $ pair (Core.typeFunction $ Core.functionType
+    (Schemas.nominalApplication @@ var "tname" @@ var "typeArgs")
+    (var "sftyp")) (var "cx2")
+
+typeOfRecord :: TBinding (Context -> Graph -> [Type] -> Record -> Prelude.Either (InContext Error) (Type, Context))
+typeOfRecord = define "typeOfRecord" $
+  doc "Reconstruct the type of a record (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "record" ~>
+  "tname" <~ Core.recordTypeName (var "record") $
+  "fields" <~ Core.recordFields (var "record") $
+  -- Type all field terms, threading context (for checking only)
+  "foldResult" <~ Lists.foldl
+    ("acc" ~> "term" ~>
+      "accR" <<~ var "acc" $
+      "types" <~ Pairs.first (var "accR") $
+      "cxA" <~ Pairs.second (var "accR") $
+      "tResult" <<~ typeOf @@ var "cxA" @@ var "tx" @@ noTypeArgs @@ var "term" $
+      "t" <~ Pairs.first (var "tResult") $
+      "cxB" <~ Pairs.second (var "tResult") $
+      right $ pair (Lists.concat2 (var "types") (Lists.pure $ var "t")) (var "cxB"))
+    (right $ pair (list ([] :: [TTerm Type])) (var "cx"))
+    (Lists.map (unaryFunction Core.fieldTerm) (var "fields")) $
+  "foldR" <<~ var "foldResult" $
+  "cx2" <~ Pairs.second (var "foldR") $
+  right $ pair (Schemas.nominalApplication @@ var "tname" @@ var "typeArgs") (var "cx2")
+
+typeOfSet :: TBinding (Context -> Graph -> [Type] -> S.Set Term -> Prelude.Either (InContext Error) (Type, Context))
+typeOfSet = define "typeOfSet" $
+  doc "Reconstruct the type of a set (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "els" ~>
+  Logic.ifElse (Sets.null $ var "els")
+    (Logic.ifElse (Equality.equal (Lists.length $ var "typeArgs") (int32 1))
+      (right $ pair (Core.typeSet $ Lists.head $ var "typeArgs") (var "cx"))
+      (Ctx.failInContext (Error.errorChecking $ ErrorsChecking.checkingErrorTypeArityMismatch $ ErrorsChecking.typeArityMismatchError (Core.typeSet Core.typeUnit) (int32 1) (Lists.length $ var "typeArgs") (var "typeArgs")) (var "cx")))
+    -- Nonempty set: type all elements, threading context
+    ("foldResult" <~ Lists.foldl
+      ("acc" ~> "term" ~>
+        "accR" <<~ var "acc" $
+        "types" <~ Pairs.first (var "accR") $
+        "cxA" <~ Pairs.second (var "accR") $
+        "tResult" <<~ typeOf @@ var "cxA" @@ var "tx" @@ noTypeArgs @@ var "term" $
+        "t" <~ Pairs.first (var "tResult") $
+        "cxB" <~ Pairs.second (var "tResult") $
+        right $ pair (Lists.concat2 (var "types") (Lists.pure $ var "t")) (var "cxB"))
+      (right $ pair (list ([] :: [TTerm Type])) (var "cx"))
+      (Sets.toList $ var "els") $
+    "foldR" <<~ var "foldResult" $
+    "eltypes" <~ Pairs.first (var "foldR") $
+    "cx2" <~ Pairs.second (var "foldR") $
+    "unifiedType" <<~ checkSameType @@ var "cx2" @@ var "tx" @@ (string "set elements") @@ var "eltypes" $
+    right $ pair (Core.typeSet $ var "unifiedType") (var "cx2"))
+
+typeOfTypeApplication :: TBinding (Context -> Graph -> [Type] -> TypeApplicationTerm -> Prelude.Either (InContext Error) (Type, Context))
+typeOfTypeApplication = define "typeOfTypeApplication" $
+  doc "Reconstruct the type of a type application term (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "tyapp" ~>
+  "body" <~ Core.typeApplicationTermBody (var "tyapp") $
+  "t" <~ Core.typeApplicationTermType (var "tyapp") $
+  typeOf @@ var "cx" @@ var "tx" @@ Lists.cons (var "t") (var "typeArgs") @@ var "body"
+
+typeOfTypeLambda :: TBinding (Context -> Graph -> [Type] -> TypeLambda -> Prelude.Either (InContext Error) (Type, Context))
+typeOfTypeLambda = define "typeOfTypeLambda" $
+  doc "Reconstruct the type of a type lambda (type abstraction) term (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "tl" ~>
+  "v" <~ Core.typeLambdaParameter (var "tl") $
+  "body" <~ Core.typeLambdaBody (var "tl") $
+  "vars" <~ Graph.graphTypeVariables (var "tx") $
+  "tx2" <~ Graph.graphWithTypeVariables (var "tx") (Sets.insert (var "v") (var "vars")) $
+  "result1" <<~ typeOf @@ var "cx" @@ var "tx2" @@ noTypeArgs @@ var "body" $
+  "t1" <~ Pairs.first (var "result1") $
+  "cx2" <~ Pairs.second (var "result1") $
+  "applied" <<~ applyTypeArgumentsToType @@ var "cx2" @@ var "tx" @@ var "typeArgs"
+    @@ (Core.typeForall $ Core.forallType (var "v") (var "t1")) $
+  right $ pair (var "applied") (var "cx2")
+
+typeOfUnit :: TBinding (Context -> Graph -> [Type] -> Prelude.Either (InContext Error) (Type, Context))
+typeOfUnit = define "typeOfUnit" $
+  doc "Reconstruct the type of the unit term (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~>
+  "applied" <<~ applyTypeArgumentsToType @@ var "cx" @@ var "tx" @@ var "typeArgs" @@ Core.typeUnit $
+  right $ pair (var "applied") (var "cx")
+
+typeOfUnwrap :: TBinding (Context -> Graph -> [Type] -> Name -> Prelude.Either (InContext Error) (Type, Context))
+typeOfUnwrap = define "typeOfUnwrap" $
+  doc "Reconstruct the type of an unwrap operation (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "tname" ~>
+  "schemaResult" <<~ Schemas.requireSchemaType @@ var "cx" @@ (Graph.graphSchemaTypes $ var "tx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "schemaResult") $
+  "cx2" <~ Pairs.second (var "schemaResult") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "sbody" <~ Core.typeSchemeType (var "schemaType") $
+  "wrapped" <<~ ExtractCore.wrappedType @@ var "cx2" @@ var "tname" @@ var "sbody" $
+  "subst" <~ Typing.typeSubst (Maps.fromList $ Lists.zip (var "svars") (var "typeArgs")) $
+  "swrapped" <~ Substitution.substInType @@ var "subst" @@ var "wrapped" $
+  right $ pair (MetaTypes.function
+    (Schemas.nominalApplication @@ var "tname" @@ var "typeArgs")
+    (var "swrapped")) (var "cx2")
+
+typeOfVariable :: TBinding (Context -> Graph -> [Type] -> Name -> Prelude.Either (InContext Error) (Type, Context))
+typeOfVariable = define "typeOfVariable" $
+  doc "Reconstruct the type of a variable (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "name" ~>
+  "rawTypeScheme" <~ Maps.lookup (var "name") (Graph.graphBoundTypes $ var "tx") $
+  Maybes.maybe
+    (Ctx.failInContext (Error.errorUntypedTermVariable $ ErrorsCore.untypedTermVariableError (Paths.subtermPath $ list ([] :: [TTerm SubtermStep])) (var "name")) (var "cx"))
+    ("ts" ~>
+      "tResult" <~ Logic.ifElse (Lists.null $ var "typeArgs")
+        (Schemas.instantiateType @@ var "cx" @@ (Rewriting.typeSchemeToFType @@ var "ts"))
+        (pair (Rewriting.typeSchemeToFType @@ var "ts") (var "cx")) $
+      "t" <~ Pairs.first (var "tResult") $
+      "cx2" <~ Pairs.second (var "tResult") $
+      "applied" <<~ applyTypeArgumentsToType @@ var "cx2" @@ var "tx" @@ var "typeArgs" @@ var "t" $
+      right $ pair (var "applied") (var "cx2"))
+    (var "rawTypeScheme")
+
+typeOfWrappedTerm :: TBinding (Context -> Graph -> [Type] -> WrappedTerm -> Prelude.Either (InContext Error) (Type, Context))
+typeOfWrappedTerm = define "typeOfWrappedTerm" $
+  doc "Reconstruct the type of a wrapped term (Either/Context version)" $
+  "cx" ~> "tx" ~> "typeArgs" ~> "wt" ~>
+  "tname" <~ Core.wrappedTermTypeName (var "wt") $
+  "body" <~ Core.wrappedTermBody (var "wt") $
+  -- Type the body for checking purposes
+  "result" <<~ typeOf @@ var "cx" @@ var "tx" @@ noTypeArgs @@ var "body" $
+  "cx2" <~ Pairs.second (var "result") $
+  right $ pair (Schemas.nominalApplication @@ var "tname" @@ var "typeArgs") (var "cx2")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/CodeGeneration.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/CodeGeneration.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/CodeGeneration.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/CodeGeneration.hs
@@ -15,21 +15,19 @@
   moduleTermDepsTransitive, moduleTypeDepsTransitive,
   namespaceToPath, stripModuleTypeSchemes, transitiveDeps)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Context      as Ctx
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -44,18 +42,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import qualified Hydra.Json.Model                as JsonModel
@@ -68,15 +66,16 @@
 
 -- Dependencies on other term modules
 import qualified Hydra.Sources.Json.Decode                  as JsonDecode
-import qualified Hydra.Sources.Kernel.Terms.Adapt.Simple    as AdaptSimple
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
 import qualified Hydra.Sources.Kernel.Terms.Annotations     as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Inference       as Inference
 import qualified Hydra.Sources.Kernel.Terms.Lexical         as Lexical
 import qualified Hydra.Sources.Kernel.Terms.Names           as Names
-import qualified Hydra.Sources.Kernel.Terms.Monads          as Monads
+
 import qualified Hydra.Sources.Kernel.Terms.Rewriting       as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas         as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Show.Core       as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors     as ShowError
 
 -- Dependencies on secondary generated modules (decode/encode)
 import qualified Hydra.Sources.Decode.Core                  as DecodeCore
@@ -89,8 +88,8 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [AdaptSimple.ns, Annotations.ns, Inference.ns, JsonDecode.ns, Lexical.ns, Monads.ns, Names.ns,
-     Rewriting.ns, Schemas.ns, ShowCore.ns,
+    [Adapt.ns, Annotations.ns, Inference.ns, JsonDecode.ns, Lexical.ns, Names.ns,
+     Rewriting.ns, Schemas.ns, ShowCore.ns, ShowError.ns,
      Namespace "hydra.decoding", Namespace "hydra.encoding",
      Namespace "hydra.json.decode", Namespace "hydra.json.encode", Namespace "hydra.json.writer",
      moduleNamespace DecodeCore.module_, moduleNamespace DecodeModule.module_, moduleNamespace EncodeModule.module_]
@@ -98,275 +97,393 @@
     Just "Pure code generation pipeline for bootstrapping Hydra across languages."
   where
     elements = [
-      toBinding namespaceToPath,
-      toBinding stripModuleTypeSchemes,
-      toBinding transitiveDeps,
-      toBinding moduleTermDepsTransitive,
-      toBinding moduleTypeDepsTransitive,
-      toBinding modulesToGraph,
-      toBinding generateSourceFiles,
-      toBinding formatTermBinding,
-      toBinding formatPrimitive,
-      toBinding formatTypeBinding,
-      toBinding buildSchemaMap,
-      toBinding moduleToSourceModule,
-      toBinding generateLexicon,
-      toBinding moduleToJson,
-      toBinding inferModules,
-      toBinding generateCoderModules,
-      toBinding inferAndGenerateLexicon,
-      toBinding escapeControlCharsInJson,
-      toBinding decodeModuleFromJson]
+      toTermDefinition buildSchemaMap,
+      toTermDefinition decodeModuleFromJson,
+      toTermDefinition escapeControlCharsInJson,
+      toTermDefinition formatPrimitive,
+      toTermDefinition formatTermBinding,
+      toTermDefinition formatTypeBinding,
+      toTermDefinition generateCoderModules,
+      toTermDefinition generateLexicon,
+      toTermDefinition generateSourceFiles,
+      toTermDefinition inferAndGenerateLexicon,
+      toTermDefinition inferModules,
+      toTermDefinition moduleTermDepsTransitive,
+      toTermDefinition moduleToJson,
+      toTermDefinition moduleToSourceModule,
+      toTermDefinition moduleTypeDepsTransitive,
+      toTermDefinition modulesToGraph,
+      toTermDefinition namespaceToPath,
+      toTermDefinition stripModuleTypeSchemes,
+      toTermDefinition transitiveDeps]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
+-- | Extract type definitions from a module as Bindings (for elementsToGraph compatibility).
+-- Each TypeDefinition is converted to a Binding by encoding the type as a term.
+moduleTypeBindings :: TTerm Module -> TTerm [Binding]
+moduleTypeBindings m = Maybes.cat $ Lists.map
+  ("d" ~> cases _Definition (var "d") (Just nothing) [
+    _Definition_type>>: "td" ~>
+      just (Annotations.typeElement @@ (Module.typeDefinitionName $ var "td") @@ (Module.typeDefinitionType $ var "td"))])
+  (Module.moduleDefinitions m)
 
--- | Convert a namespace to a file path (e.g., "hydra.core" -> "hydra/core").
-namespaceToPath :: TBinding (Namespace -> String)
-namespaceToPath = define "namespaceToPath" $
-  doc "Convert a namespace to a file path (e.g., hydra.core -> hydra/core)" $
-  "ns" ~>
-  Strings.intercalate (string "/") (Strings.splitOn (string ".") (Module.unNamespace $ var "ns"))
+-- | Extract term definitions from a module as Bindings (for elementsToGraph compatibility).
+moduleTermBindings :: TTerm Module -> TTerm [Binding]
+moduleTermBindings m = Maybes.cat $ Lists.map
+  ("d" ~> cases _Definition (var "d") (Just nothing) [
+    _Definition_term>>: "td" ~>
+      just (Core.binding
+        (Module.termDefinitionName $ var "td")
+        (Module.termDefinitionTerm $ var "td")
+        (Module.termDefinitionType $ var "td"))])
+  (Module.moduleDefinitions m)
 
--- | Strip TypeSchemes from term bindings in a module, preserving type binding TypeSchemes.
-stripModuleTypeSchemes :: TBinding (Module -> Module)
-stripModuleTypeSchemes = define "stripModuleTypeSchemes" $
-  doc ("Strip TypeSchemes from term bindings in a module, preserving type binding TypeSchemes."
-    <> " JSON-loaded modules carry inferred TypeSchemes from the original compilation."
-    <> " After adaptation (e.g., bigfloat -> float64), these TypeSchemes become stale"
-    <> " and can cause inference errors. Stripping them allows the inference engine"
-    <> " to reconstruct correct TypeSchemes from scratch.") $
-  "m" ~>
-  "stripIfTerm" <~ ("b" ~> Logic.ifElse (Annotations.isNativeType @@ var "b")
-    (var "b")
-    (Core.binding
-      (Core.bindingName $ var "b")
-      (Core.bindingTerm $ var "b")
-      nothing)) $
-  Module.module_
-    (Module.moduleNamespace $ var "m")
-    (Lists.map (var "stripIfTerm") (Module.moduleElements $ var "m"))
-    (Module.moduleTermDependencies $ var "m")
-    (Module.moduleTypeDependencies $ var "m")
-    (Module.moduleDescription $ var "m")
+-- | Extract all definitions from a module as Bindings.
+moduleAllBindings :: TTerm Module -> TTerm [Binding]
+moduleAllBindings m = Lists.concat2 (moduleTypeBindings m) (moduleTermBindings m)
 
--- | Compute transitive closure of dependencies.
--- Given a function that extracts dependency namespaces from a module,
--- a namespace-to-module map, and starting modules, returns the transitive closure
--- of all reachable namespaces (excluding self-references from start modules).
-transitiveDeps :: TBinding ((Module -> [Namespace]) -> M.Map Namespace Module -> [Module] -> S.Set Namespace)
-transitiveDeps = define "transitiveDeps" $
-  doc "Compute transitive closure of module dependencies" $
-  "getDeps" ~> "nsMap" ~> "startMods" ~>
-  -- Start with dependencies of start modules, excluding self-references
-  "initialDeps" <~ Sets.fromList (Lists.concat (Lists.map
-    ("m" ~> Lists.filter
-      ("dep" ~> Logic.not $ Equality.equal (var "dep") (Module.moduleNamespace $ var "m"))
-      (var "getDeps" @@ var "m"))
-    (var "startMods"))) $
-  -- Iterative closure: go pending visited
-  "go" <~ ("pending" ~> "visited" ~>
-    Logic.ifElse (Sets.null $ var "pending")
-      (var "visited")
-      ("newVisited" <~ Sets.union (var "visited") (var "pending") $
-       "nextDeps" <~ Sets.fromList (Lists.concat (Lists.map
-         ("nsv" ~> optCases (Maps.lookup (var "nsv") (var "nsMap"))
-           (TTerm (Terms.list []) :: TTerm [Namespace])
-           ("depMod" ~> var "getDeps" @@ var "depMod"))
-         (Sets.toList $ var "pending"))) $
-       "newPending" <~ Sets.difference (var "nextDeps") (var "newVisited") $
-       var "go" @@ var "newPending" @@ var "newVisited")) $
-  var "go" @@ var "initialDeps" @@ (Sets.empty :: TTerm (S.Set Namespace))
+-- | Check whether a module has any type definitions.
+hasTypeDefinitions :: TTerm Module -> TTerm Bool
+hasTypeDefinitions m = Logic.not $ Lists.null $ moduleTypeBindings m
 
--- | Compute the transitive closure of term dependencies for a set of modules.
--- Returns the modules that are transitively depended upon (including the input modules).
-moduleTermDepsTransitive :: TBinding (M.Map Namespace Module -> [Module] -> [Module])
-moduleTermDepsTransitive = define "moduleTermDepsTransitive" $
-  doc "Compute transitive closure of term dependencies for a set of modules" $
-  "nsMap" ~> "modules" ~>
-  "closure" <~ Sets.union
-    (transitiveDeps @@ ("m" ~> Module.moduleTermDependencies (var "m")) @@ var "nsMap" @@ var "modules")
-    (Sets.fromList $ Lists.map ("m" ~> Module.moduleNamespace (var "m")) (var "modules")) $
-  Maybes.cat $ Lists.map
-    ("n" ~> Maps.lookup (var "n") (var "nsMap"))
-    (Sets.toList $ var "closure")
+-- | Check whether a module has any term definitions.
+hasTermDefinitions :: TTerm Module -> TTerm Bool
+hasTermDefinitions m = Logic.not $ Lists.null $ moduleTermBindings m
 
--- | Compute the transitive closure of type dependencies for a set of modules.
--- First computes transitive term deps, then type deps from those.
-moduleTypeDepsTransitive :: TBinding (M.Map Namespace Module -> [Module] -> [Module])
-moduleTypeDepsTransitive = define "moduleTypeDepsTransitive" $
-  doc "Compute transitive closure of type dependencies for a set of modules" $
-  "nsMap" ~> "modules" ~>
-  "termMods" <~ moduleTermDepsTransitive @@ var "nsMap" @@ var "modules" $
-  "typeNamespaces" <~ Sets.toList (transitiveDeps @@ ("m" ~> Module.moduleTypeDependencies (var "m")) @@ var "nsMap" @@ var "termMods") $
-  Maybes.cat $ Lists.map
-    ("n" ~> Maps.lookup (var "n") (var "nsMap"))
-    (var "typeNamespaces")
+-- | Extract type definition names from a module.
+moduleTypeNames :: TTerm Module -> TTerm [Name]
+moduleTypeNames m = Maybes.cat $ Lists.map
+  ("d" ~> cases _Definition (var "d") (Just nothing) [
+    _Definition_type>>: "td" ~> just (Module.typeDefinitionName $ var "td")])
+  (Module.moduleDefinitions m)
 
--- | Build a graph from a list of modules, using an explicit bootstrap graph.
--- Elements are partitioned into schema (type definitions) and data (term definitions)
--- based on the isNativeType predicate.
-modulesToGraph :: TBinding (Graph -> [Module] -> [Module] -> Graph)
-modulesToGraph = define "modulesToGraph" $
-  doc "Build a graph from universe modules and working modules, using an explicit bootstrap graph" $
-  "bsGraph" ~> "universeModules" ~> "modules" ~>
+-- | Build a schema map (Name -> Type) from a graph's schema types.
+-- Used by the JSON decoder to resolve type variables.
+buildSchemaMap :: TBinding (Graph -> M.Map Name Type)
+buildSchemaMap = define "buildSchemaMap" $
+  doc "Build a schema map (Name -> Type) from a graph's schema types" $
+  "g" ~>
+  Maps.map ("ts" ~> Rewriting.deannotateType @@ (Core.typeSchemeType $ var "ts"))
+    (Graph.graphSchemaTypes $ var "g")
+
+-- | Decode a single module from a JSON value.
+-- Given a bootstrap graph, universe modules, whether to strip TypeSchemes,
+-- and a JSON value, decodes it to a Module.
+-- This is the pure core of the JSON module loading pipeline.
+decodeModuleFromJson :: TBinding (Graph -> [Module] -> Bool -> JsonModel.Value -> Either String Module)
+decodeModuleFromJson = define "decodeModuleFromJson" $
+  doc "Decode a single module from a JSON value" $
+  "bsGraph" ~> "universeModules" ~> "doStripTypeSchemes" ~> "jsonVal" ~>
+  "graph" <~ modulesToGraph @@ var "bsGraph" @@ var "universeModules" @@ var "universeModules" $
+  "schemaMap" <~ buildSchemaMap @@ var "graph" $
+  "modType" <~ Core.typeVariable (wrap _Name (string "hydra.module.Module")) $
+  -- Step 1: JSON -> Term
+  Eithers.either_
+    ("err" ~> left (var "err"))
+    ("term" ~>
+      -- Step 2: Term -> Module (via decoderFor _Module)
+      Eithers.either_
+        ("decErr" ~> left (unwrap _DecodingError @@ var "decErr"))
+        ("mod" ~> right (Logic.ifElse (var "doStripTypeSchemes")
+          (stripModuleTypeSchemes @@ var "mod")
+          (var "mod")))
+        (decoderFor _Module @@ var "graph" @@ var "term"))
+    (JsonDecode.fromJson @@ var "schemaMap" @@ Core.nameLift _Module @@ var "modType" @@ var "jsonVal")
+
+-- | Escape unescaped control characters (< 0x20) inside JSON string literals.
+-- Operates on a list of int32 character codes (bytes).
+-- Walks through the list tracking whether we're inside a string and
+-- replaces raw control chars with \\uXXXX escape sequences.
+escapeControlCharsInJson :: TBinding ([Int] -> [Int])
+escapeControlCharsInJson = define "escapeControlCharsInJson" $
+  doc "Escape unescaped control characters inside JSON string literals" $
+  "input" ~>
+  "hexDigit" <~ ("n" ~>
+    Logic.ifElse (Equality.lt (var "n") (int32 10))
+      (Math.add (int32 0x30) (var "n"))       -- '0' + n
+      (Math.add (int32 0x61) (Math.sub (var "n") (int32 10)))) $ -- 'a' + (n - 10)
+  "escapeToUnicode" <~ ("b" ~>
+    list [int32 0x5C, int32 0x75, int32 0x30, int32 0x30,
+          var "hexDigit" @@ Math.div (var "b") (int32 16),
+          var "hexDigit" @@ Math.mod (var "b") (int32 16)]) $
+  -- go :: Bool -> Bool -> [Int32] -> [Int32]
+  "go" <~ ("inStr" ~> "esc" ~> "bytes" ~>
+    Logic.ifElse (Lists.null $ var "bytes")
+      (TTerm (Terms.list []) :: TTerm [Int])
+      ("b" <~ Lists.head (var "bytes") $
+       "bs" <~ Lists.tail (var "bytes") $
+       Logic.ifElse (var "esc")
+         -- after backslash, pass through next byte
+         (Lists.cons (var "b") (var "go" @@ var "inStr" @@ boolean False @@ var "bs"))
+         (Logic.ifElse (Logic.and (Equality.equal (var "b") (int32 0x5C)) (var "inStr"))
+           -- backslash inside string
+           (Lists.cons (var "b") (var "go" @@ var "inStr" @@ boolean True @@ var "bs"))
+           (Logic.ifElse (Equality.equal (var "b") (int32 0x22))
+             -- quote toggles string mode
+             (Lists.cons (var "b") (var "go" @@ (Logic.not $ var "inStr") @@ boolean False @@ var "bs"))
+             (Logic.ifElse (Logic.and (var "inStr") (Equality.lt (var "b") (int32 0x20)))
+               -- control char: replace with \uXXXX
+               (Lists.concat2 (var "escapeToUnicode" @@ var "b") (var "go" @@ var "inStr" @@ boolean False @@ var "bs"))
+               -- normal byte
+               (Lists.cons (var "b") (var "go" @@ var "inStr" @@ boolean False @@ var "bs"))))))) $
+  var "go" @@ boolean False @@ boolean False @@ var "input"
+
+-- | Format a primitive for the lexicon: "  name : typeScheme"
+formatPrimitive :: TBinding (Primitive -> String)
+formatPrimitive = define "formatPrimitive" $
+  doc "Format a primitive for the lexicon" $
+  "prim" ~>
+  "name" <~ Core.unName (Graph.primitiveName $ var "prim") $
+  "typeStr" <~ ShowCore.typeScheme @@ (Graph.primitiveType $ var "prim") $
+  (string "  ") ++ var "name" ++ (string " : ") ++ var "typeStr"
+
+-- | Format a term binding for the lexicon: "  name : typeScheme"
+formatTermBinding :: TBinding (Binding -> String)
+formatTermBinding = define "formatTermBinding" $
+  doc "Format a term binding for the lexicon" $
+  "binding" ~>
+  "name" <~ Core.unName (Core.bindingName $ var "binding") $
+  "typeStr" <~ optCases (Core.bindingType $ var "binding")
+    (string "?")
+    ("scheme" ~> ShowCore.typeScheme @@ var "scheme") $
+  (string "  ") ++ var "name" ++ (string " : ") ++ var "typeStr"
+
+-- | Format a type binding for the lexicon: "  name = type"
+formatTypeBinding :: TBinding (Graph -> Binding -> Prelude.Either DecodingError String)
+formatTypeBinding = define "formatTypeBinding" $
+  doc "Format a type binding for the lexicon" $
+  "graph" ~> "binding" ~>
+  "typ" <<~ decoderFor _Type @@ var "graph" @@ (Core.bindingTerm $ var "binding") $
+  right $
+    (string "  ") ++ Core.unName (Core.bindingName $ var "binding") ++ (string " = ") ++ (ShowCore.type_ @@ var "typ")
+
+-- | Generate encoder or decoder modules for a list of type modules.
+-- Takes a codec function, bootstrap graph, universe modules, and type modules.
+-- Returns the generated coder modules (Nothing results are filtered out).
+generateCoderModules
+  :: TBinding ((Context -> Graph -> Module -> Prelude.Either (InContext Error) (Maybe Module)) -> Graph -> [Module] -> [Module]
+    -> Context -> Prelude.Either (InContext Error) [Module])
+generateCoderModules = define "generateCoderModules" $
+  doc "Generate encoder or decoder modules for a list of type modules" $
+  "codec" ~> "bsGraph" ~> "universeModules" ~> "typeModules" ~> "cx" ~>
+  -- Build a graph that includes both schema and data elements, since codecs need to dereference type elements
   "universe" <~ Maps.fromList (Lists.map
     ("m" ~> pair (Module.moduleNamespace $ var "m") (var "m"))
-    (Lists.concat2 (var "universeModules") (var "modules"))) $
-  "schemaModules" <~ moduleTypeDepsTransitive @@ var "universe" @@ var "modules" $
-  "dataModules" <~ moduleTermDepsTransitive @@ var "universe" @@ var "modules" $
-  -- Include type elements from both transitive type dependencies AND the input modules themselves
-  "schemaElements" <~ Lists.filter ("e" ~> Annotations.isNativeType @@ var "e")
-    (Lists.concat $ Lists.map ("m" ~> Module.moduleElements (var "m"))
-      (Lists.concat2 (var "schemaModules") (var "modules"))) $
-  "dataElements" <~ Lists.filter ("e" ~> Logic.not $ Annotations.isNativeType @@ var "e")
-    (Lists.concat $ Lists.map ("m" ~> Module.moduleElements (var "m")) (var "dataModules")) $
-  "schemaGraph" <~ Lexical.elementsToGraph @@ var "bsGraph" @@ nothing @@ var "schemaElements" $
-  Lexical.elementsToGraph @@ var "bsGraph" @@ (just $ var "schemaGraph") @@ var "dataElements"
+    (Lists.concat2 (var "universeModules") (var "universeModules"))) $
+  "schemaModules" <~ moduleTypeDepsTransitive @@ var "universe" @@ var "universeModules" $
+  "dataModules" <~ moduleTermDepsTransitive @@ var "universe" @@ var "universeModules" $
+  "schemaElements" <~ Lists.concat (Lists.map ("m" ~> moduleTypeBindings (var "m"))
+      (Lists.concat2 (var "schemaModules") (var "universeModules"))) $
+  "dataElements" <~ Lists.concat (Lists.map ("m" ~> moduleTermBindings (var "m")) (var "dataModules")) $
+  "schemaGraph" <~ Lexical.elementsToGraph @@ var "bsGraph" @@ Maps.empty @@ var "schemaElements" $
+  "schemaTypes" <~ Eithers.either_
+    (constant (Maps.empty :: TTerm (M.Map Name TypeScheme)))
+    ("_r" ~> var "_r")
+    (Schemas.schemaGraphToTypingEnvironment @@ Lexical.emptyContext @@ var "schemaGraph") $
+  "allElements" <~ Lists.concat2 (var "schemaElements") (var "dataElements") $
+  "graph" <~ Lexical.elementsToGraph @@ var "bsGraph" @@ var "schemaTypes" @@ var "allElements" $
+  Eithers.map ("results" ~> Maybes.cat (var "results")) $
+    Eithers.mapList ("m" ~> var "codec" @@ var "cx" @@ var "graph" @@ var "m") (var "typeModules")
 
+-- | Generate the lexicon content from a graph.
+-- Lists all primitives, types, and terms with their types.
+generateLexicon :: TBinding (Graph -> Prelude.Either DecodingError String)
+generateLexicon = define "generateLexicon" $
+  doc "Generate the lexicon content from a graph" $
+  "graph" ~>
+  "bindings" <~ Lexical.graphToBindings @@ var "graph" $
+  "primitives" <~ Maps.elems (Graph.graphPrimitives $ var "graph") $
+  "partitioned" <~ Lists.partition ("b" ~> Annotations.isNativeType @@ var "b") (var "bindings") $ -- TODO: refactor lexicon to use Definition directly
+  "typeBindings" <~ Pairs.first (var "partitioned") $
+  "termBindings" <~ Pairs.second (var "partitioned") $
+  "sortedPrimitives" <~ Lists.sortOn ("p" ~> Graph.primitiveName (var "p")) (var "primitives") $
+  "sortedTypes" <~ Lists.sortOn ("b" ~> Core.bindingName (var "b")) (var "typeBindings") $
+  "sortedTerms" <~ Lists.sortOn ("b" ~> Core.bindingName (var "b")) (var "termBindings") $
+  "typeLines" <<~ Eithers.mapList ("b" ~> formatTypeBinding @@ var "graph" @@ var "b") (var "sortedTypes") $
+  "termLines" <~ Lists.map ("b" ~> formatTermBinding @@ var "b") (var "sortedTerms") $
+  "primitiveLines" <~ Lists.map ("p" ~> formatPrimitive @@ var "p") (var "sortedPrimitives") $
+  right $
+    (string "Primitives:\n") ++ Strings.unlines (var "primitiveLines")
+    ++ (string "\nTypes:\n") ++ Strings.unlines (var "typeLines")
+    ++ (string "\nTerms:\n") ++ Strings.unlines (var "termLines")
+
 -- | Pure core of code generation: given a coder, language, flags, bootstrap graph, universe,
 -- and modules to generate, produce a list of (filePath, content) pairs.
 -- This function contains no I/O and can be generated to other languages.
 generateSourceFiles
-  :: TBinding ((Module -> [Definition] -> Flow Graph (M.Map String String))
+  :: TBinding ((Module -> [Definition] -> Context -> Graph -> Prelude.Either (InContext Error) (M.Map String String))
     -> Language
     -> Bool -> Bool -> Bool -> Bool
     -> Graph -> [Module] -> [Module]
-    -> Flow Graph [(String, String)])
+    -> Context -> Prelude.Either (InContext Error) [(String, String)])
 generateSourceFiles = define "generateSourceFiles" $
   doc ("Pure core of code generation: given a coder, language, flags, bootstrap graph, universe,"
     <> " and modules to generate, produce a list of (filePath, content) pairs.") $
   "printDefinitions" ~> "lang" ~>
   "doInfer" ~> "doExpand" ~> "doHoistCaseStatements" ~> "doHoistPolymorphicLetBindings" ~>
-  "bsGraph" ~> "universeModules" ~> "modsToGenerate" ~>
+  "bsGraph" ~> "universeModules" ~> "modsToGenerate" ~> "cx" ~>
 
   "namespaceMap" <~ Maps.fromList (Lists.map
     ("m" ~> pair (Module.moduleNamespace $ var "m") (var "m"))
     (Lists.concat2 (var "universeModules") (var "modsToGenerate"))) $
 
-  "constraints" <~ Coders.languageConstraintsProjection (var "lang") $
+  "constraints" <~ Coders.languageConstraints (var "lang") $
 
-  -- Partition modules into type and term modules
-  "isTypeModule" <~ ("mod" ~> Logic.not $ Lists.null $
-    Lists.filter ("e" ~> Annotations.isNativeType @@ var "e") (Module.moduleElements $ var "mod")) $
-  "partitioned" <~ Lists.partition (var "isTypeModule") (var "modsToGenerate") $
-  "typeModulesToGenerate" <~ Pairs.first (var "partitioned") $
-  "termModulesToGenerate" <~ Pairs.second (var "partitioned") $
+  -- Filter modules into type and term categories (a module can appear in both)
+  "typeModulesToGenerate" <~ Lists.filter ("mod" ~> hasTypeDefinitions (var "mod")) (var "modsToGenerate") $
+  "termModulesToGenerate" <~ Lists.filter ("mod" ~> hasTermDefinitions (var "mod")) (var "modsToGenerate") $
 
   -- Compute transitive deps and build graphs
   "schemaMods" <~ moduleTypeDepsTransitive @@ var "namespaceMap" @@ var "modsToGenerate" $
-  "schemaElements" <~ Lists.filter ("e" ~> Annotations.isNativeType @@ var "e")
-    (Lists.concat $ Lists.map ("m" ~> Module.moduleElements (var "m"))
+  "schemaElements" <~ Lists.concat (Lists.map ("m" ~> moduleTypeBindings (var "m"))
       (Lists.concat2 (var "schemaMods") (var "typeModulesToGenerate"))) $
   "dataMods" <~ moduleTermDepsTransitive @@ var "namespaceMap" @@ var "modsToGenerate" $
-  "dataElements" <~ Lists.concat (Lists.map ("m" ~> Module.moduleElements (var "m")) (var "dataMods")) $
-  "schemaGraph" <~ Lexical.elementsToGraph @@ var "bsGraph" @@ nothing @@ var "schemaElements" $
-  "dataGraph" <~ Lexical.elementsToGraph @@ var "bsGraph" @@ (just $ var "schemaGraph") @@ var "dataElements" $
+  "dataElements" <~ Lists.concat (Lists.map ("m" ~> moduleTermBindings (var "m")) (var "dataMods")) $
+  "schemaGraph" <~ Lexical.elementsToGraph @@ var "bsGraph" @@ Maps.empty @@ var "schemaElements" $
+  "schemaTypes2" <~ Eithers.either_
+    (constant (Maps.empty :: TTerm (M.Map Name TypeScheme)))
+    ("_r" ~> var "_r")
+    (Schemas.schemaGraphToTypingEnvironment @@ Lexical.emptyContext @@ var "schemaGraph") $
+  "dataGraph" <~ Lexical.elementsToGraph @@ var "bsGraph" @@ var "schemaTypes2" @@ var "dataElements" $
 
   -- Generate type modules
   "schemaFiles" <<~ Logic.ifElse (Lists.null $ var "typeModulesToGenerate")
-    (Flows.pure (TTerm (Terms.list []) :: TTerm [(String, String)]))
-    (trace (string "generate type modules") $
-      "nameLists" <~ Lists.map
-        ("m" ~> Lists.map ("e" ~> Core.bindingName $ var "e")
-          (Lists.filter ("e" ~> Annotations.isNativeType @@ var "e") (Module.moduleElements $ var "m")))
+    (right (TTerm (Terms.list []) :: TTerm [(String, String)]))
+    ("nameLists" <~ Lists.map ("m" ~> moduleTypeNames (var "m"))
         (var "typeModulesToGenerate") $
-      "schemaResult" <<~ AdaptSimple.schemaGraphToDefinitions @@ var "constraints" @@ var "schemaGraph" @@ var "nameLists" $
+      "schemaResult" <<~ Eithers.bimap ("s" ~> Ctx.inContext (Error.errorOther $ Error.otherError (var "s")) (var "cx")) ("r" ~> var "r")
+        (Adapt.schemaGraphToDefinitions @@ var "constraints" @@ var "schemaGraph" @@ var "nameLists" @@ var "cx") $
       "defLists" <~ Pairs.second (var "schemaResult") $
-      Monads.withState @@ var "schemaGraph" @@
-        (Flows.map ("xs" ~> Lists.concat (var "xs")) $
-          Flows.mapList ("p" ~>
-            "mod" <~ Pairs.first (var "p") $
-            "defs" <~ Pairs.second (var "p") $
-            trace (Strings.cat2 (string "type module ") (Module.unNamespace $ Module.moduleNamespace $ var "mod")) $
-              Flows.map ("m" ~> Maps.toList (var "m")) $
-                var "printDefinitions" @@ var "mod" @@ Lists.map ("d" ~> Module.definitionType (var "d")) (var "defs"))
-          (Lists.zip (var "typeModulesToGenerate") (var "defLists")))) $
+      "schemaGraphWithTypes" <~ Graph.graphWithSchemaTypes (var "schemaGraph") (var "schemaTypes2") $
+      Eithers.map ("xs" ~> Lists.concat (var "xs")) $
+        Eithers.mapList ("p" ~>
+          "mod" <~ Pairs.first (var "p") $
+          "defs" <~ Pairs.second (var "p") $
+          Eithers.map ("m" ~> Maps.toList (var "m")) $
+            var "printDefinitions" @@ var "mod" @@ Lists.map ("d" ~> Module.definitionType (var "d")) (var "defs") @@ var "cx" @@ var "schemaGraphWithTypes")
+        (Lists.zip (var "typeModulesToGenerate") (var "defLists"))) $
 
   -- Generate term modules
   "termFiles" <<~ Logic.ifElse (Lists.null $ var "termModulesToGenerate")
-    (Flows.pure (TTerm (Terms.list []) :: TTerm [(String, String)]))
-    (trace (string "generate term modules") $
-      "namespaces" <~ Lists.map ("m" ~> Module.moduleNamespace (var "m")) (var "termModulesToGenerate") $
-      "dataResult" <<~ AdaptSimple.dataGraphToDefinitions
-        @@ var "constraints"
-        @@ var "doInfer" @@ var "doExpand" @@ var "doHoistCaseStatements" @@ var "doHoistPolymorphicLetBindings"
-        @@ var "dataGraph" @@ var "namespaces" $
+    (right (TTerm (Terms.list []) :: TTerm [(String, String)]))
+    ("namespaces" <~ Lists.map ("m" ~> Module.moduleNamespace (var "m")) (var "termModulesToGenerate") $
+      "dataResult" <<~ Eithers.bimap ("s" ~> Ctx.inContext (Error.errorOther $ Error.otherError (var "s")) (var "cx")) ("r" ~> var "r")
+        (Adapt.dataGraphToDefinitions
+          @@ var "constraints"
+          @@ var "doInfer" @@ var "doExpand" @@ var "doHoistCaseStatements" @@ var "doHoistPolymorphicLetBindings"
+          @@ var "dataElements" @@ var "dataGraph" @@ var "namespaces" @@ var "cx") $
       "g1" <~ Pairs.first (var "dataResult") $
       "defLists" <~ Pairs.second (var "dataResult") $
       -- Refresh modules with elements from the inferred graph
+      "defName" <~ ("d" ~> cases _Definition (var "d") Nothing [
+        _Definition_term>>: "td" ~> Module.termDefinitionName (var "td"),
+        _Definition_type>>: "td" ~> Module.typeDefinitionName (var "td")]) $
       "refreshModule" <~ ("els" ~> "m" ~>
         Module.module_
           (Module.moduleNamespace $ var "m")
           (Maybes.cat $ Lists.map
-            ("e" ~> Lists.find ("b" ~> Equality.equal (Core.bindingName $ var "b") (Core.bindingName $ var "e")) (var "els"))
-            (Module.moduleElements $ var "m"))
+            ("d" ~> cases _Definition (var "d") Nothing [
+              _Definition_type>>: "td" ~> just (Module.definitionType (var "td")),
+              _Definition_term>>: "td" ~> Maybes.map
+                ("b" ~> Module.definitionTerm (Module.termDefinition
+                  (Core.bindingName $ var "b")
+                  (Core.bindingTerm $ var "b")
+                  (Core.bindingType $ var "b")))
+                (Lists.find ("b" ~> Equality.equal (Core.bindingName $ var "b") (Module.termDefinitionName $ var "td")) (var "els"))])
+            (Module.moduleDefinitions $ var "m"))
           (Module.moduleTermDependencies $ var "m")
           (Module.moduleTypeDependencies $ var "m")
           (Module.moduleDescription $ var "m")) $
-      "refreshedMods" <~ Lists.map ("m" ~> var "refreshModule" @@ (Graph.graphElements $ var "g1") @@ var "m") (var "termModulesToGenerate") $
-      Monads.withState @@ var "g1" @@
-        (Flows.map ("xs" ~> Lists.concat (var "xs")) $
-          Flows.mapList ("p" ~>
-            "mod" <~ Pairs.first (var "p") $
-            "defs" <~ Pairs.second (var "p") $
-            trace (Strings.cat2 (string "term module ") (Module.unNamespace $ Module.moduleNamespace $ var "mod")) $
-              Flows.map ("m" ~> Maps.toList (var "m")) $
-                var "printDefinitions" @@ var "mod" @@ Lists.map ("d" ~> Module.definitionTerm (var "d")) (var "defs"))
-          (Lists.zip (var "refreshedMods") (var "defLists")))) $
+      "allBindings" <~ Lexical.graphToBindings @@ var "g1" $
+      "refreshedMods" <~ Lists.map ("m" ~> var "refreshModule" @@ var "allBindings" @@ var "m") (var "termModulesToGenerate") $
+      -- Deduplicate definitions by name to avoid duplicate functions in generated code
+      "dedupDefs" <~ ("defs" ~> Maps.elems (Maps.fromList (Lists.map ("d" ~> pair (Module.termDefinitionName (var "d")) (var "d")) (var "defs")))) $
+      "dedupedDefLists" <~ Lists.map (var "dedupDefs") (var "defLists") $
+      Eithers.map ("xs" ~> Lists.concat (var "xs")) $
+        Eithers.mapList ("p" ~>
+          "mod" <~ Pairs.first (var "p") $
+          "defs" <~ Pairs.second (var "p") $
+          Eithers.map ("m" ~> Maps.toList (var "m")) $
+            var "printDefinitions" @@ var "mod" @@ Lists.map ("d" ~> Module.definitionTerm (var "d")) (var "defs") @@ var "cx" @@ var "g1")
+        (Lists.zip (var "refreshedMods") (var "dedupedDefLists"))) $
 
   -- Combine results
-  produce $ Lists.concat2 (var "schemaFiles") (var "termFiles")
+  right $ Lists.concat2 (var "schemaFiles") (var "termFiles")
 
--- | Format a term binding for the lexicon: "  name : typeScheme"
-formatTermBinding :: TBinding (Binding -> String)
-formatTermBinding = define "formatTermBinding" $
-  doc "Format a term binding for the lexicon" $
-  "binding" ~>
-  "name" <~ Core.unName (Core.bindingName $ var "binding") $
-  "typeStr" <~ optCases (Core.bindingType $ var "binding")
-    (string "?")
-    ("scheme" ~> ShowCore.typeScheme @@ var "scheme") $
-  (string "  ") ++ var "name" ++ (string " : ") ++ var "typeStr"
+-- | Perform type inference on a graph and generate its lexicon.
+-- Composes inferGraphTypes and generateLexicon into a single computation.
+inferAndGenerateLexicon :: TBinding (Context -> Graph -> [Module] -> Prelude.Either String String)
+inferAndGenerateLexicon = define "inferAndGenerateLexicon" $
+  doc "Perform type inference and generate the lexicon for a set of modules" $
+  "cx" ~> "bsGraph" ~> "kernelModules" ~>
+  "g0" <~ modulesToGraph @@ var "bsGraph" @@ var "kernelModules" @@ var "kernelModules" $
+  "dataElements" <~ Lists.concat (Lists.map ("m" ~> moduleTermBindings (var "m")) (var "kernelModules")) $
+  "inferResultWithCx" <<~ Eithers.bimap ("ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")) ("x" ~> var "x") (Inference.inferGraphTypes @@ var "cx" @@ var "dataElements" @@ var "g0") $
+  "g1" <~ Pairs.first (Pairs.first $ var "inferResultWithCx") $
+  Eithers.bimap (unwrap _DecodingError) ("x" ~> var "x") (generateLexicon @@ var "g1")
 
--- | Format a primitive for the lexicon: "  name : typeScheme"
-formatPrimitive :: TBinding (Primitive -> String)
-formatPrimitive = define "formatPrimitive" $
-  doc "Format a primitive for the lexicon" $
-  "prim" ~>
-  "name" <~ Core.unName (Graph.primitiveName $ var "prim") $
-  "typeStr" <~ ShowCore.typeScheme @@ (Graph.primitiveType $ var "prim") $
-  (string "  ") ++ var "name" ++ (string " : ") ++ var "typeStr"
+-- | Perform type inference on a set of modules and reconstruct the target modules
+-- with inferred types. Type-only modules (containing only native type definitions)
+-- are passed through unchanged.
+inferModules :: TBinding (Context -> Graph -> [Module] -> [Module] -> Prelude.Either (InContext Error) [Module])
+inferModules = define "inferModules" $
+  doc "Perform type inference on modules and reconstruct with inferred types" $
+  "cx" ~> "bsGraph" ~> "universeMods" ~> "targetMods" ~>
+  "g0" <~ modulesToGraph @@ var "bsGraph" @@ var "universeMods" @@ var "universeMods" $
+  "dataElements" <~ Lists.concat (Lists.map ("m" ~> moduleTermBindings (var "m")) (var "universeMods")) $
+  "inferResultWithCx" <<~ Inference.inferGraphTypes @@ var "cx" @@ var "dataElements" @@ var "g0" $
+  "inferResult" <~ Pairs.first (var "inferResultWithCx") $
+  "g1" <~ Pairs.first (var "inferResult") $
+  "inferredElements" <~ Pairs.second (var "inferResult") $
+  "isTypeOnlyModule" <~ ("mod" ~> Logic.not $ hasTermDefinitions (var "mod")) $
+  "defName" <~ ("d" ~> cases _Definition (var "d") Nothing [
+    _Definition_term>>: "td" ~> Module.termDefinitionName (var "td"),
+    _Definition_type>>: "td" ~> Module.typeDefinitionName (var "td")]) $
+  "refreshModule" <~ ("m" ~>
+    Logic.ifElse (var "isTypeOnlyModule" @@ var "m")
+      (var "m")
+      (Module.module_
+        (Module.moduleNamespace $ var "m")
+        (Maybes.cat $ Lists.map
+          ("d" ~> cases _Definition (var "d") Nothing [
+            _Definition_type>>: "td" ~> just (Module.definitionType (var "td")),
+            _Definition_term>>: "td" ~> Maybes.map
+              ("b" ~> Module.definitionTerm (Module.termDefinition
+                (Core.bindingName $ var "b")
+                (Core.bindingTerm $ var "b")
+                (Core.bindingType $ var "b")))
+              (Lists.find ("b" ~> Equality.equal (Core.bindingName $ var "b") (Module.termDefinitionName $ var "td"))
+                (var "inferredElements"))])
+          (Module.moduleDefinitions $ var "m"))
+        (Module.moduleTermDependencies $ var "m")
+        (Module.moduleTypeDependencies $ var "m")
+        (Module.moduleDescription $ var "m"))) $
+  right $ Lists.map (var "refreshModule") (var "targetMods")
 
--- | Format a type binding for the lexicon: "  name = type"
-formatTypeBinding :: TBinding (Binding -> Flow Graph String)
-formatTypeBinding = define "formatTypeBinding" $
-  doc "Format a type binding for the lexicon" $
-  "binding" ~>
-  "g" <<~ Monads.getState $
-  "typ" <<~ Monads.eitherToFlow_ @@ Util.unDecodingError
-    @@ (decoderFor _Type @@ var "g" @@ (Core.bindingTerm $ var "binding")) $
-  produce $
-    (string "  ") ++ Core.unName (Core.bindingName $ var "binding") ++ (string " = ") ++ (ShowCore.type_ @@ var "typ")
+-- | Compute the transitive closure of term dependencies for a set of modules.
+-- Returns the modules that are transitively depended upon (including the input modules).
+moduleTermDepsTransitive :: TBinding (M.Map Namespace Module -> [Module] -> [Module])
+moduleTermDepsTransitive = define "moduleTermDepsTransitive" $
+  doc "Compute transitive closure of term dependencies for a set of modules" $
+  "nsMap" ~> "modules" ~>
+  "closure" <~ Sets.union
+    (transitiveDeps @@ ("m" ~> Module.moduleTermDependencies (var "m")) @@ var "nsMap" @@ var "modules")
+    (Sets.fromList $ Lists.map ("m" ~> Module.moduleNamespace (var "m")) (var "modules")) $
+  Maybes.cat $ Lists.map
+    ("n" ~> Maps.lookup (var "n") (var "nsMap"))
+    (Sets.toList $ var "closure")
 
--- | Build a schema map (Name -> Type) from a graph's schema.
--- Used by the JSON decoder to resolve type variables.
-buildSchemaMap :: TBinding (Graph -> M.Map Name Type)
-buildSchemaMap = define "buildSchemaMap" $
-  doc "Build a schema map (Name -> Type) from a graph's schema" $
-  "g" ~>
-  optCases (Graph.graphSchema $ var "g")
-    (Maps.empty :: TTerm (M.Map Name Type))
-    ("schemaGraph" ~>
-      Maps.fromList $ Maybes.cat $ Lists.map
-        ("binding" ~>
-          "result" <~ decoderFor _Type @@ var "schemaGraph" @@ (Core.bindingTerm $ var "binding") $
-          Eithers.either_
-            ("_err" ~> (nothing :: TTerm (Maybe (Name, Type))))
-            ("typ" ~> just $ pair (Core.bindingName $ var "binding") (Rewriting.deannotateType @@ var "typ"))
-            (var "result"))
-        (Graph.graphElements $ var "schemaGraph"))
+-- | Convert a Module to a JSON string.
+-- Encodes the Module as a Term, converts to JSON, then serializes to a string.
+moduleToJson :: TBinding (Module -> Either String String)
+moduleToJson = define "moduleToJson" $
+  doc "Convert a Module to a JSON string" $
+  "m" ~>
+  "term" <~ encoderFor _Module @@ var "m" $
+  Eithers.map ("json" ~> var "hydra.json.writer.printJson" @@ var "json")
+    (var "hydra.json.encode.toJson" @@ var "term")
 
 -- | Convert a generated Module into a Source module.
 -- The Source module contains a single binding `module_` which holds the Module encoded as a Term.
@@ -382,161 +499,105 @@
   -- The module type namespace
   "modTypeNs" <~ (wrap _Namespace (string "hydra.module") :: TTerm Namespace) $
   -- Create binding: module_ = <encoded Module term>
-  "moduleBinding" <~ Core.binding
+  "moduleDef" <~ Module.definitionTerm (Module.termDefinition
     (wrap _Name (Module.unNamespace (var "sourceNs") ++ (string ".module_")))
     (encoderFor _Module @@ var "m")
-    nothing $
+    nothing) $
   Module.module_
     (var "sourceNs")
-    (list [var "moduleBinding"])
+    (list [var "moduleDef"])
     (list [var "modTypeNs"])
     (list [var "modTypeNs"])
     (just $ (string "Source module for ") ++ Module.unNamespace (Module.moduleNamespace $ var "m"))
 
--- | Generate the lexicon content from a graph.
--- Lists all primitives, types, and terms with their types.
-generateLexicon :: TBinding (Graph -> Flow Graph String)
-generateLexicon = define "generateLexicon" $
-  doc "Generate the lexicon content from a graph" $
-  "graph" ~>
-  "bindings" <~ Graph.graphElements (var "graph") $
-  "primitives" <~ Maps.elems (Graph.graphPrimitives $ var "graph") $
-  "partitioned" <~ Lists.partition ("b" ~> Annotations.isNativeType @@ var "b") (var "bindings") $
-  "typeBindings" <~ Pairs.first (var "partitioned") $
-  "termBindings" <~ Pairs.second (var "partitioned") $
-  "sortedPrimitives" <~ Lists.sortOn ("p" ~> Graph.primitiveName (var "p")) (var "primitives") $
-  "sortedTypes" <~ Lists.sortOn ("b" ~> Core.bindingName (var "b")) (var "typeBindings") $
-  "sortedTerms" <~ Lists.sortOn ("b" ~> Core.bindingName (var "b")) (var "termBindings") $
-  "typeLines" <<~ Flows.mapList ("b" ~> formatTypeBinding @@ var "b") (var "sortedTypes") $
-  "termLines" <~ Lists.map ("b" ~> formatTermBinding @@ var "b") (var "sortedTerms") $
-  "primitiveLines" <~ Lists.map ("p" ~> formatPrimitive @@ var "p") (var "sortedPrimitives") $
-  produce $
-    (string "Primitives:\n") ++ Strings.unlines (var "primitiveLines")
-    ++ (string "\nTypes:\n") ++ Strings.unlines (var "typeLines")
-    ++ (string "\nTerms:\n") ++ Strings.unlines (var "termLines")
-
--- | Convert a Module to a JSON string.
--- Encodes the Module as a Term, converts to JSON, then serializes to a string.
-moduleToJson :: TBinding (Module -> Either String String)
-moduleToJson = define "moduleToJson" $
-  doc "Convert a Module to a JSON string" $
-  "m" ~>
-  "term" <~ encoderFor _Module @@ var "m" $
-  Eithers.map ("json" ~> var "hydra.json.writer.printJson" @@ var "json")
-    (var "hydra.json.encode.toJson" @@ var "term")
-
--- | Perform type inference on a set of modules and reconstruct the target modules
--- with inferred types. Type-only modules (containing only native type definitions)
--- are passed through unchanged.
-inferModules :: TBinding (Graph -> [Module] -> [Module] -> Flow Graph [Module])
-inferModules = define "inferModules" $
-  doc "Perform type inference on modules and reconstruct with inferred types" $
-  "bsGraph" ~> "universeMods" ~> "targetMods" ~>
-  "g0" <~ modulesToGraph @@ var "bsGraph" @@ var "universeMods" @@ var "universeMods" $
-  "g1" <<~ Inference.inferGraphTypes @@ var "g0" $
-  "inferredElements" <~ Graph.graphElements (var "g1") $
-  "isTypeModule" <~ ("mod" ~> Lists.null $
-    Lists.filter ("e" ~> Logic.not $ Annotations.isNativeType @@ var "e")
-      (Module.moduleElements $ var "mod")) $
-  "refreshModule" <~ ("m" ~>
-    Logic.ifElse (var "isTypeModule" @@ var "m")
-      (var "m")
-      (Module.module_
-        (Module.moduleNamespace $ var "m")
-        (Maybes.cat $ Lists.map
-          ("e" ~> Lists.find ("b" ~> Equality.equal (Core.bindingName $ var "b") (Core.bindingName $ var "e"))
-            (var "inferredElements"))
-          (Module.moduleElements $ var "m"))
-        (Module.moduleTermDependencies $ var "m")
-        (Module.moduleTypeDependencies $ var "m")
-        (Module.moduleDescription $ var "m"))) $
-  produce $ Lists.map (var "refreshModule") (var "targetMods")
+-- | Compute the transitive closure of type dependencies for a set of modules.
+-- First computes transitive term deps, then type deps from those.
+moduleTypeDepsTransitive :: TBinding (M.Map Namespace Module -> [Module] -> [Module])
+moduleTypeDepsTransitive = define "moduleTypeDepsTransitive" $
+  doc "Compute transitive closure of type dependencies for a set of modules" $
+  "nsMap" ~> "modules" ~>
+  "termMods" <~ moduleTermDepsTransitive @@ var "nsMap" @@ var "modules" $
+  "typeNamespaces" <~ Sets.toList (transitiveDeps @@ ("m" ~> Module.moduleTypeDependencies (var "m")) @@ var "nsMap" @@ var "termMods") $
+  Maybes.cat $ Lists.map
+    ("n" ~> Maps.lookup (var "n") (var "nsMap"))
+    (var "typeNamespaces")
 
--- | Generate encoder or decoder modules for a list of type modules.
--- Takes a codec function, bootstrap graph, universe modules, and type modules.
--- Returns the generated coder modules (Nothing results are filtered out).
-generateCoderModules
-  :: TBinding ((Module -> Flow Graph (Maybe Module)) -> Graph -> [Module] -> [Module]
-    -> Flow Graph [Module])
-generateCoderModules = define "generateCoderModules" $
-  doc "Generate encoder or decoder modules for a list of type modules" $
-  "codec" ~> "bsGraph" ~> "universeModules" ~> "typeModules" ~>
-  "graph" <~ modulesToGraph @@ var "bsGraph" @@ var "universeModules" @@ var "universeModules" $
-  optCases (Graph.graphSchema $ var "graph")
-    (Flows.fail $ string "No schema graph available")
-    ("schemaGraph" ~>
-      Monads.withState @@ var "schemaGraph" @@
-        (Flows.map ("results" ~> Maybes.cat (var "results")) $
-          Flows.mapList (var "codec") (var "typeModules")))
+-- | Build a graph from a list of modules, using an explicit bootstrap graph.
+-- Type definitions become schema elements and term definitions become data elements.
+modulesToGraph :: TBinding (Graph -> [Module] -> [Module] -> Graph)
+modulesToGraph = define "modulesToGraph" $
+  doc "Build a graph from universe modules and working modules, using an explicit bootstrap graph" $
+  "bsGraph" ~> "universeModules" ~> "modules" ~>
+  "universe" <~ Maps.fromList (Lists.map
+    ("m" ~> pair (Module.moduleNamespace $ var "m") (var "m"))
+    (Lists.concat2 (var "universeModules") (var "modules"))) $
+  "schemaModules" <~ moduleTypeDepsTransitive @@ var "universe" @@ var "modules" $
+  "dataModules" <~ moduleTermDepsTransitive @@ var "universe" @@ var "modules" $
+  -- Include type elements from both transitive type dependencies AND the input modules themselves
+  "schemaElements" <~ Lists.concat (Lists.map ("m" ~> moduleTypeBindings (var "m"))
+      (Lists.concat2 (var "schemaModules") (var "modules"))) $
+  "dataElements" <~ Lists.concat (Lists.map ("m" ~> moduleTermBindings (var "m")) (var "dataModules")) $
+  "schemaGraph" <~ Lexical.elementsToGraph @@ var "bsGraph" @@ Maps.empty @@ var "schemaElements" $
+  -- Decode the schema graph to a Map Name TypeScheme (interim solution until schema graphs are eliminated)
+  "schemaTypes" <~ Eithers.either_
+    (constant (Maps.empty :: TTerm (M.Map Name TypeScheme)))
+    ("_r" ~> var "_r")
+    (Schemas.schemaGraphToTypingEnvironment @@ Lexical.emptyContext @@ var "schemaGraph") $
+  Lexical.elementsToGraph @@ var "bsGraph" @@ var "schemaTypes" @@ var "dataElements"
 
--- | Perform type inference on a graph and generate its lexicon.
--- Composes inferGraphTypes and generateLexicon into a single Flow.
-inferAndGenerateLexicon :: TBinding (Graph -> [Module] -> Flow Graph String)
-inferAndGenerateLexicon = define "inferAndGenerateLexicon" $
-  doc "Perform type inference and generate the lexicon for a set of modules" $
-  "bsGraph" ~> "kernelModules" ~>
-  "g0" <~ modulesToGraph @@ var "bsGraph" @@ var "kernelModules" @@ var "kernelModules" $
-  "g1" <<~ Inference.inferGraphTypes @@ var "g0" $
-  Monads.withState @@ var "g1" @@ (generateLexicon @@ var "g1")
+-- | Convert a namespace to a file path (e.g., "hydra.core" -> "hydra/core").
+namespaceToPath :: TBinding (Namespace -> String)
+namespaceToPath = define "namespaceToPath" $
+  doc "Convert a namespace to a file path (e.g., hydra.core -> hydra/core)" $
+  "ns" ~>
+  Strings.intercalate (string "/") (Strings.splitOn (string ".") (Module.unNamespace $ var "ns"))
 
--- | Escape unescaped control characters (< 0x20) inside JSON string literals.
--- Operates on a list of int32 character codes (bytes).
--- Walks through the list tracking whether we're inside a string and
--- replaces raw control chars with \\uXXXX escape sequences.
-escapeControlCharsInJson :: TBinding ([Int] -> [Int])
-escapeControlCharsInJson = define "escapeControlCharsInJson" $
-  doc "Escape unescaped control characters inside JSON string literals" $
-  "input" ~>
-  "hexDigit" <~ ("n" ~>
-    Logic.ifElse (Equality.lt (var "n") (int32 10))
-      (Math.add (int32 0x30) (var "n"))       -- '0' + n
-      (Math.add (int32 0x61) (Math.sub (var "n") (int32 10)))) $ -- 'a' + (n - 10)
-  "escapeToUnicode" <~ ("b" ~>
-    list [int32 0x5C, int32 0x75, int32 0x30, int32 0x30,
-          var "hexDigit" @@ Math.div (var "b") (int32 16),
-          var "hexDigit" @@ Math.mod (var "b") (int32 16)]) $
-  -- go :: Bool -> Bool -> [Int32] -> [Int32]
-  "go" <~ ("inStr" ~> "esc" ~> "bytes" ~>
-    Logic.ifElse (Lists.null $ var "bytes")
-      (TTerm (Terms.list []) :: TTerm [Int])
-      ("b" <~ Lists.head (var "bytes") $
-       "bs" <~ Lists.tail (var "bytes") $
-       Logic.ifElse (var "esc")
-         -- after backslash, pass through next byte
-         (Lists.cons (var "b") (var "go" @@ var "inStr" @@ boolean False @@ var "bs"))
-         (Logic.ifElse (Logic.and (Equality.equal (var "b") (int32 0x5C)) (var "inStr"))
-           -- backslash inside string
-           (Lists.cons (var "b") (var "go" @@ var "inStr" @@ boolean True @@ var "bs"))
-           (Logic.ifElse (Equality.equal (var "b") (int32 0x22))
-             -- quote toggles string mode
-             (Lists.cons (var "b") (var "go" @@ (Logic.not $ var "inStr") @@ boolean False @@ var "bs"))
-             (Logic.ifElse (Logic.and (var "inStr") (Equality.lt (var "b") (int32 0x20)))
-               -- control char: replace with \uXXXX
-               (Lists.concat2 (var "escapeToUnicode" @@ var "b") (var "go" @@ var "inStr" @@ boolean False @@ var "bs"))
-               -- normal byte
-               (Lists.cons (var "b") (var "go" @@ var "inStr" @@ boolean False @@ var "bs"))))))) $
-  var "go" @@ boolean False @@ boolean False @@ var "input"
+-- | Strip TypeSchemes from term definitions in a module, preserving type definitions.
+stripModuleTypeSchemes :: TBinding (Module -> Module)
+stripModuleTypeSchemes = define "stripModuleTypeSchemes" $
+  doc ("Strip TypeSchemes from term definitions in a module, preserving type definitions."
+    <> " JSON-loaded modules carry inferred TypeSchemes from the original compilation."
+    <> " After adaptation (e.g., bigfloat -> float64), these TypeSchemes become stale"
+    <> " and can cause inference errors. Stripping them allows the inference engine"
+    <> " to reconstruct correct TypeSchemes from scratch.") $
+  "m" ~>
+  "stripDef" <~ ("d" ~> cases _Definition (var "d") (Just (var "d")) [
+    _Definition_term>>: "td" ~>
+      Module.definitionTerm (Module.termDefinition
+        (Module.termDefinitionName $ var "td")
+        (Module.termDefinitionTerm $ var "td")
+        nothing)]) $
+  Module.module_
+    (Module.moduleNamespace $ var "m")
+    (Lists.map (var "stripDef") (Module.moduleDefinitions $ var "m"))
+    (Module.moduleTermDependencies $ var "m")
+    (Module.moduleTypeDependencies $ var "m")
+    (Module.moduleDescription $ var "m")
 
--- | Decode a single module from a JSON value.
--- Given a bootstrap graph, universe modules, whether to strip TypeSchemes,
--- and a JSON value, decodes it to a Module.
--- This is the pure core of the JSON module loading pipeline.
-decodeModuleFromJson :: TBinding (Graph -> [Module] -> Bool -> JsonModel.Value -> Either String Module)
-decodeModuleFromJson = define "decodeModuleFromJson" $
-  doc "Decode a single module from a JSON value" $
-  "bsGraph" ~> "universeModules" ~> "doStripTypeSchemes" ~> "jsonVal" ~>
-  "graph" <~ modulesToGraph @@ var "bsGraph" @@ var "universeModules" @@ var "universeModules" $
-  "schemaMap" <~ buildSchemaMap @@ var "graph" $
-  "modType" <~ Core.typeVariable (wrap _Name (string "hydra.module.Module")) $
-  -- Step 1: JSON -> Term
-  Eithers.either_
-    ("err" ~> left (var "err"))
-    ("term" ~>
-      -- Step 2: Term -> Module (via decoderFor _Module)
-      Eithers.either_
-        ("decErr" ~> left (Util.unDecodingError @@ var "decErr"))
-        ("mod" ~> right (Logic.ifElse (var "doStripTypeSchemes")
-          (stripModuleTypeSchemes @@ var "mod")
-          (var "mod")))
-        (decoderFor _Module @@ var "graph" @@ var "term"))
-    (JsonDecode.fromJson @@ var "schemaMap" @@ var "modType" @@ var "jsonVal")
+-- | Compute transitive closure of dependencies.
+-- Given a function that extracts dependency namespaces from a module,
+-- a namespace-to-module map, and starting modules, returns the transitive closure
+-- of all reachable namespaces (excluding self-references from start modules).
+transitiveDeps :: TBinding ((Module -> [Namespace]) -> M.Map Namespace Module -> [Module] -> S.Set Namespace)
+transitiveDeps = define "transitiveDeps" $
+  doc "Compute transitive closure of module dependencies" $
+  "getDeps" ~> "nsMap" ~> "startMods" ~>
+  -- Start with dependencies of start modules, excluding self-references
+  "initialDeps" <~ Sets.fromList (Lists.concat (Lists.map
+    ("m" ~> Lists.filter
+      ("dep" ~> Logic.not $ Equality.equal (var "dep") (Module.moduleNamespace $ var "m"))
+      (var "getDeps" @@ var "m"))
+    (var "startMods"))) $
+  -- Iterative closure: go pending visited
+  "go" <~ ("pending" ~> "visited" ~>
+    Logic.ifElse (Sets.null $ var "pending")
+      (var "visited")
+      ("newVisited" <~ Sets.union (var "visited") (var "pending") $
+       "nextDeps" <~ Sets.fromList (Lists.concat (Lists.map
+         ("nsv" ~> optCases (Maps.lookup (var "nsv") (var "nsMap"))
+           (TTerm (Terms.list []) :: TTerm [Namespace])
+           ("depMod" ~> var "getDeps" @@ var "depMod"))
+         (Sets.toList $ var "pending"))) $
+       "newPending" <~ Sets.difference (var "nextDeps") (var "newVisited") $
+       var "go" @@ var "newPending" @@ var "newVisited")) $
+  var "go" @@ var "initialDeps" @@ (Sets.empty :: TTerm (S.Set Namespace))
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Constants.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Constants.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Constants.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Constants.hs
@@ -4,24 +4,21 @@
 import Hydra.Kernel hiding (
   debugInference, ignoredVariable, key_classes, key_debugId, key_deprecated, key_description,
   key_exclude, key_firstClassType, key_maxLength, key_minLength, key_preserveFieldName,
-  key_type, key_freshTypeVariableCount, maxInt32, placeholderName, maxTraceDepth,
+  key_type, key_freshTypeVariableCount, maxInt32, maxTraceDepth,
   warningAutoGeneratedFile)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -36,18 +33,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -68,24 +65,23 @@
     Just ("A module for tier-0 constants.")
   where
    elements = [
---     toBinding tryMe,
-     toBinding debugInference,
-     toBinding ignoredVariable,
-     toBinding key_classes,
-     toBinding key_debugId,
-     toBinding key_deprecated,
-     toBinding key_description,
-     toBinding key_exclude,
-     toBinding key_firstClassType,
-     toBinding key_maxLength,
-     toBinding key_minLength,
-     toBinding key_preserveFieldName,
-     toBinding key_type,
-     toBinding key_freshTypeVariableCount,
-     toBinding maxInt32,
-     toBinding placeholderName,
-     toBinding maxTraceDepth,
-     toBinding warningAutoGeneratedFile]
+--     toTermDefinition tryMe,
+     toTermDefinition debugInference,
+     toTermDefinition ignoredVariable,
+     toTermDefinition key_classes,
+     toTermDefinition key_debugId,
+     toTermDefinition key_deprecated,
+     toTermDefinition key_description,
+     toTermDefinition key_exclude,
+     toTermDefinition key_firstClassType,
+     toTermDefinition key_maxLength,
+     toTermDefinition key_minLength,
+     toTermDefinition key_preserveFieldName,
+     toTermDefinition key_type,
+     toTermDefinition key_freshTypeVariableCount,
+     toTermDefinition maxInt32,
+     toTermDefinition maxTraceDepth,
+     toTermDefinition warningAutoGeneratedFile]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -136,15 +132,10 @@
   doc "The maximum value of a 32-bit integer" $
   int32 2147483647 -- 2^31 - 1
 
-placeholderName :: TBinding Name
-placeholderName = define "placeholderName" $
-  doc "A placeholder name for row types as they are being constructed" $
-  wrap _Name $ string "Placeholder"
-
 maxTraceDepth :: TBinding Int
 maxTraceDepth = define "maxTraceDepth" $
-  doc ("A maximum depth for nested flows."
-    <> " Currently, this is set very high because deep flows are common in type inference over the Hydra kernel.") $
+  doc ("A maximum depth for nested computations."
+    <> " Currently, this is set very high because deep recursion is common in type inference over the Hydra kernel.") $
   int32 5000
 
 warningAutoGeneratedFile :: TBinding String
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Decoding.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Decoding.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Decoding.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Decoding.hs
@@ -5,21 +5,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (literalType, matchRecord, matchUnion)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -34,30 +31,32 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import qualified Hydra.Dsl.Meta.Phantoms     as Phantoms
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (
   elimination, field, fieldType, floatType, floatValue, function, injection, integerType, integerValue, literal,
   literalType, record, term, type_, typeScheme)
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import qualified Hydra.Sources.Kernel.Terms.Annotations as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
 import qualified Hydra.Sources.Kernel.Terms.Extract.Helpers as Helpers
 import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
+
 import qualified Hydra.Sources.Kernel.Terms.Names as Names
 import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Constants as Constants
 import qualified Hydra.Sources.Kernel.Terms.Schemas as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
 import           Prelude hiding ((++))
@@ -76,43 +75,55 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Annotations.ns, Formatting.ns, Helpers.ns, Lexical.ns, Monads.ns, Names.ns, Rewriting.ns, Schemas.ns, ShowCore.ns]
+    [Annotations.ns, Formatting.ns, Helpers.ns, Lexical.ns, Names.ns, Rewriting.ns, Schemas.ns, ShowCore.ns]
     kernelTypesNamespaces $
     Just "Functions for generating term decoders from type modules"
   where
     elements = [
-      toBinding collectForallVariables,
-      toBinding collectOrdConstrainedVariables,
-      toBinding collectTypeVariables,
-      toBinding collectTypeVariablesFromType,
-      toBinding decodeBinding,
-      toBinding decodeBindingName,
-      toBinding decodeEitherType,
-      toBinding decodeForallType,
-      toBinding decodeListType,
-      toBinding decodeLiteralType,
-      toBinding decodeMapType,
-      toBinding decodeMaybeType,
-      toBinding decodeModule,
-      toBinding decodeNamespace,
-      toBinding decodePairType,
-      toBinding decodeRecordType,
-      toBinding decodeSetType,
-      toBinding decodeType,
-      toBinding decodeUnitType,
-      toBinding decodeUnionType,
-      toBinding decodeWrappedType,
-      toBinding decoderFullResultType,
-      toBinding decoderResultType,
-      toBinding decoderType,
-      toBinding decoderTypeScheme,
-      toBinding filterTypeBindings,
-      toBinding isDecodableBinding,
-      toBinding prependForallDecoders]
+      toTermDefinition collectForallVariables,
+      toTermDefinition collectOrdConstrainedVariables,
+      toTermDefinition collectTypeVariables,
+      toTermDefinition collectTypeVariablesFromType,
+      toTermDefinition decodeBinding,
+      toTermDefinition decodeBindingName,
+      toTermDefinition decodeEitherType,
+      toTermDefinition decodeForallType,
+      toTermDefinition decodeListType,
+      toTermDefinition decodeLiteralType,
+      toTermDefinition decodeMapType,
+      toTermDefinition decodeMaybeType,
+      toTermDefinition decodeModule,
+      toTermDefinition decodeNamespace,
+      toTermDefinition decodePairType,
+      toTermDefinition decodeRecordType,
+      toTermDefinition decodeRecordTypeImpl,
+      toTermDefinition decodeRecordTypeNamed,
+      toTermDefinition decodeSetType,
+      toTermDefinition decodeType,
+      toTermDefinition decodeTypeNamed,
+      toTermDefinition decodeUnitType,
+      toTermDefinition decodeUnionType,
+      toTermDefinition decodeUnionTypeNamed,
+      toTermDefinition decodeWrappedType,
+      toTermDefinition decodeWrappedTypeNamed,
+      toTermDefinition decoderFullResultType,
+      toTermDefinition decoderFullResultTypeNamed,
+      toTermDefinition decoderResultType,
+      toTermDefinition decoderType,
+      toTermDefinition decoderTypeNamed,
+      toTermDefinition decoderTypeScheme,
+      toTermDefinition decoderTypeSchemeNamed,
+      toTermDefinition filterTypeBindings,
+      toTermDefinition isDecodableBinding,
+      toTermDefinition prependForallDecoders]
 
 define :: String -> TTerm x -> TBinding x
 define = definitionInModule module_
 
+-- | Bridge helper: format InContext DecodingError as a string
+formatDecodingError :: TTerm (InContext DecodingError -> String)
+formatDecodingError = "ic" ~> unwrap _DecodingError @@ Ctx.inContextObject (var "ic")
+
 --------------------------------------------------------------------------------
 -- Helper functions
 --------------------------------------------------------------------------------
@@ -144,7 +155,7 @@
 -- | Helper to convert Either String Term to Either DecodingError Term
 stripWithDecodingError :: TTerm Graph -> TTerm Term -> TTerm (Either DecodingError Term)
 stripWithDecodingError g term = Eithers.bimap
-  (unaryFunction Util.decodingError)
+  (unaryFunction Error.decodingError)
   ("x" ~> var "x")
   (Lexical.stripAndDereferenceTermEither @@ g @@ term)
 
@@ -169,12 +180,9 @@
       decoderResultType @@ (Core.forallTypeBody (var "ft")),
     _Type_literal>>: "_" ~>
       Core.nameLift _Literal,
-    _Type_record>>: "rt" ~>
-      Core.rowTypeTypeName (var "rt"),
-    _Type_union>>: "rt" ~>
-      Core.rowTypeTypeName (var "rt"),
-    _Type_wrap>>: "wt" ~>
-      Core.wrappedTypeTypeName (var "wt")]
+    _Type_record>>: constant (Core.nameLift _Term),
+    _Type_union>>: constant (Core.nameLift _Term),
+    _Type_wrap>>: constant (Core.nameLift _Term)]
 
 -- | Build a decoder type scheme: Term -> Either DecodingError ResultType
 -- For polymorphic types, adds extra arguments for the decoders of type parameters
@@ -202,6 +210,86 @@
       (decoderType @@ var "typ")
       (var "constraints")
 
+-- | Build a decoder type scheme with element name for nominal types
+decoderTypeSchemeNamed :: TBinding (Name -> Type -> TypeScheme)
+decoderTypeSchemeNamed = define "decoderTypeSchemeNamed" $
+  doc "Build type scheme for a decoder function with element name" $
+  "ename" ~> "typ" ~>
+    "typeVars" <~ collectTypeVariables @@ var "typ" $
+    "allOrdVars" <~ collectOrdConstrainedVariables @@ var "typ" $
+    "ordVars" <~ Lists.filter
+      ("v" ~> Lists.elem (var "v" :: TTerm Name) (var "typeVars" :: TTerm [Name]))
+      (var "allOrdVars") $
+    "constraints" <~ (
+      Logic.ifElse (Lists.null (var "ordVars"))
+        Phantoms.nothing
+        (just $ Maps.fromList $ Lists.map
+          ("v" ~> pair (var "v") (Core.typeVariableMetadata $ Sets.singleton $ Core.nameLift _TypeClass_ordering))
+          (var "ordVars"))) $
+    Core.typeScheme
+      (var "typeVars")
+      (decoderTypeNamed @@ var "ename" @@ var "typ")
+      (var "constraints")
+
+-- | Build decoder function type with element name
+decoderTypeNamed :: TBinding (Name -> Type -> Type)
+decoderTypeNamed = define "decoderTypeNamed" $
+  doc "Build decoder function type with element name" $
+  "ename" ~> "typ" ~>
+    "resultType" <~ (decoderFullResultTypeNamed @@ var "ename" @@ var "typ") $
+    "baseType" <~ Core.typeFunction (Core.functionType
+      (Core.typeVariable (Core.nameLift _Graph))
+      (Core.typeFunction (Core.functionType
+        (Core.typeVariable (Core.nameLift _Term))
+        (Core.typeEither (Core.eitherType
+          (Core.typeVariable (Core.nameLift _DecodingError))
+          (var "resultType")))))) $
+    prependForallDecoders @@ var "baseType" @@ var "typ"
+
+-- | Get full result type for decoder with element name
+decoderFullResultTypeNamed :: TBinding (Name -> Type -> Type)
+decoderFullResultTypeNamed = define "decoderFullResultTypeNamed" $
+  doc "Get full result type for decoder with element name" $
+  "ename" ~> "typ" ~>
+  cases _Type (var "typ") (Just $ Core.typeVariable (Core.nameLift _Term)) [
+    _Type_annotated>>: "at" ~>
+      decoderFullResultTypeNamed @@ var "ename" @@ (Core.annotatedTypeBody (var "at")),
+    _Type_forall>>: "ft" ~>
+      Core.typeApplication $ Core.applicationType
+        (decoderFullResultTypeNamed @@ var "ename" @@ Core.forallTypeBody (var "ft"))
+        (Core.typeVariable (Core.forallTypeParameter (var "ft"))),
+    _Type_record>>: constant (Core.typeVariable (var "ename")),
+    _Type_union>>: constant (Core.typeVariable (var "ename")),
+    _Type_wrap>>: constant (Core.typeVariable (var "ename")),
+    _Type_application>>: "appType" ~>
+      Core.typeApplication $ Core.applicationType
+        (decoderFullResultType @@ Core.applicationTypeFunction (var "appType"))
+        (Core.applicationTypeArgument (var "appType")),
+    _Type_either>>: "et" ~>
+      Core.typeEither $ Core.eitherType
+        (decoderFullResultType @@ Core.eitherTypeLeft (var "et"))
+        (decoderFullResultType @@ Core.eitherTypeRight (var "et")),
+    _Type_list>>: "elemType" ~>
+      Core.typeList (decoderFullResultType @@ var "elemType"),
+    _Type_literal>>: "_" ~>
+      Core.typeVariable (Core.nameLift _Literal),
+    _Type_map>>: "mt" ~>
+      Core.typeMap $ Core.mapType
+        (decoderFullResultType @@ Core.mapTypeKeys (var "mt"))
+        (decoderFullResultType @@ Core.mapTypeValues (var "mt")),
+    _Type_maybe>>: "elemType" ~>
+      Core.typeMaybe (decoderFullResultType @@ var "elemType"),
+    _Type_pair>>: "pt" ~>
+      Core.typePair $ Core.pairType
+        (decoderFullResultType @@ Core.pairTypeFirst (var "pt"))
+        (decoderFullResultType @@ Core.pairTypeSecond (var "pt")),
+    _Type_set>>: "elemType" ~>
+      Core.typeSet (decoderFullResultType @@ var "elemType"),
+    _Type_unit>>: constant Core.typeUnit,
+    _Type_variable>>: "name" ~>
+      Core.typeVariable (var "name"),
+    _Type_void>>: constant Core.typeVoid]
+
 -- | Collect type variables from forall types
 -- Note: Graph is NOT included as a type variable - it's a concrete type
 collectTypeVariables :: TBinding (Type -> [Name])
@@ -222,13 +310,13 @@
       Lists.cons (Core.forallTypeParameter (var "ft"))
         (collectForallVariables @@ Core.forallTypeBody (var "ft"))]
 
--- | Collect type variables that appear in Set element positions and need Ord constraints.
+-- | Collect type variables that need Ord constraints (from Map key or Set element positions).
 -- This is a pure function that traverses the type structure without dereferencing type names.
 -- The collected variables use their original names; normalization will rename them later.
 -- Note: Uses 'cases' instead of 'match' to avoid variable shadowing from eta expansion
 collectOrdConstrainedVariables :: TBinding (Type -> [Name])
 collectOrdConstrainedVariables = define "collectOrdConstrainedVariables" $
-  doc "Collect type variables needing Ord constraints (from Set element types)" $
+  doc "Collect type variables needing Ord constraints (from Map key and Set element types)" $
   "typ" ~>
   cases _Type (var "typ") (Just $ list ([] :: [TTerm Name])) [
     _Type_annotated>>: "at" ~>
@@ -245,10 +333,13 @@
       collectOrdConstrainedVariables @@ Core.forallTypeBody (var "ft"),
     _Type_list>>: "elemType" ~>
       collectOrdConstrainedVariables @@ var "elemType",
+    -- For Map<K, V>, collect all type variables from K (they need Ord)
+    -- plus recurse into both K and V for nested Maps/Sets
     _Type_map>>: "mt" ~>
-      Lists.concat2
-        (collectOrdConstrainedVariables @@ Core.mapTypeKeys (var "mt"))
-        (collectOrdConstrainedVariables @@ Core.mapTypeValues (var "mt")),
+      Lists.concat (list [
+        collectTypeVariablesFromType @@ Core.mapTypeKeys (var "mt"),
+        collectOrdConstrainedVariables @@ Core.mapTypeKeys (var "mt"),
+        collectOrdConstrainedVariables @@ Core.mapTypeValues (var "mt")]),
     _Type_maybe>>: "elemType" ~>
       collectOrdConstrainedVariables @@ var "elemType",
     _Type_pair>>: "pt" ~>
@@ -258,7 +349,7 @@
     _Type_record>>: "rt" ~>
       Lists.concat $ Lists.map
         ("ft" ~> collectOrdConstrainedVariables @@ Core.fieldTypeType (var "ft"))
-        (Core.rowTypeFields (var "rt")),
+        (var "rt"),
     -- For Set<T>, collect all type variables from T (they all need Ord)
     -- plus recurse into T for nested Sets
     _Type_set>>: "elemType" ~>
@@ -268,9 +359,9 @@
     _Type_union>>: "rt" ~>
       Lists.concat $ Lists.map
         ("ft" ~> collectOrdConstrainedVariables @@ Core.fieldTypeType (var "ft"))
-        (Core.rowTypeFields (var "rt")),
+        (var "rt"),
     _Type_wrap>>: "wt" ~>
-      collectOrdConstrainedVariables @@ Core.wrappedTypeBody (var "wt")]
+      collectOrdConstrainedVariables @@ var "wt"]
 
 -- | Collect all type variables from a type expression (for use in Set element types)
 -- Note: Uses 'cases' instead of 'match' to avoid variable shadowing from eta expansion
@@ -306,17 +397,17 @@
     _Type_record>>: "rt" ~>
       Lists.concat $ Lists.map
         ("ft" ~> collectTypeVariablesFromType @@ Core.fieldTypeType (var "ft"))
-        (Core.rowTypeFields (var "rt")),
+        (var "rt"),
     _Type_set>>: "elemType" ~>
       collectTypeVariablesFromType @@ var "elemType",
     _Type_union>>: "rt" ~>
       Lists.concat $ Lists.map
         ("ft" ~> collectTypeVariablesFromType @@ Core.fieldTypeType (var "ft"))
-        (Core.rowTypeFields (var "rt")),
+        (var "rt"),
     _Type_variable>>: "name" ~>
       list [var "name"],
     _Type_wrap>>: "wt" ~>
-      collectTypeVariablesFromType @@ Core.wrappedTypeBody (var "wt")]
+      collectTypeVariablesFromType @@ var "wt"]
 
 -- | Build the decoder function type for a given type
 -- For monomorphic types: Graph -> Term -> Either DecodingError ResultType
@@ -405,32 +496,29 @@
       Core.typePair $ Core.pairType
         (decoderFullResultType @@ Core.pairTypeFirst (var "pt"))
         (decoderFullResultType @@ Core.pairTypeSecond (var "pt")),
-    _Type_record>>: "rt" ~>
-      Core.typeVariable (Core.rowTypeTypeName (var "rt")),
+    _Type_record>>: constant (Core.typeVariable (Core.nameLift _Term)),
     _Type_set>>: "elemType" ~>
       -- Set a -> Set (decoded a)
       Core.typeSet (decoderFullResultType @@ var "elemType"),
-    _Type_union>>: "rt" ~>
-      Core.typeVariable (Core.rowTypeTypeName (var "rt")),
+    _Type_union>>: constant (Core.typeVariable (Core.nameLift _Term)),
     _Type_unit>>: constant Core.typeUnit,
     _Type_variable>>: "name" ~>
       Core.typeVariable (var "name"),
-    _Type_wrap>>: "wt" ~>
-      Core.typeVariable (Core.wrappedTypeTypeName (var "wt"))]
+    _Type_void>>: constant Core.typeVoid,
+    _Type_wrap>>: constant (Core.typeVariable (Core.nameLift _Term))]
 
 -- | Decode a single type binding into a decoder binding
--- Uses Flow to decode the Type from the binding's term, then generates decoder
-decodeBinding :: TBinding (Binding -> Flow Graph Binding)
+-- Decodes the Type from the binding's term, then generates decoder
+decodeBinding :: TBinding (Context -> Graph -> Binding -> Either (InContext DecodingError) Binding)
 decodeBinding = define "decodeBinding" $
   doc "Transform a type binding into a decoder binding" $
-  "b" ~>
-    "cx" <<~ Monads.getState $
-    Flows.bind (Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ (Core.bindingTerm (var "b")))) $
+  "cx" ~> "graph" ~> "b" ~>
+    Eithers.bind (Ctx.withContext (var "cx") (decoderFor _Type @@ var "graph" @@ (Core.bindingTerm (var "b")))) (
       "typ" ~>
-      Flows.pure (Core.binding
+      right (Core.binding
         (decodeBindingName @@ (Core.bindingName (var "b")))
-        (decodeType @@ (var "typ"))
-        (just (decoderTypeScheme @@ var "typ")))
+        (decodeTypeNamed @@ (Core.bindingName (var "b")) @@ (var "typ"))
+        (just (decoderTypeSchemeNamed @@ (Core.bindingName (var "b")) @@ var "typ"))))
 
 -- | Generate a fully qualified binding name for a decoder function from a type name
 -- For example, "hydra.util.CaseConvention" -> "hydra.decode.util.caseConvention"
@@ -520,15 +608,23 @@
 
 -- | Transform a type module into a decoder module
 -- Returns Nothing if the module has no decodable type definitions
-decodeModule :: TBinding (Module -> Flow Graph (Maybe Module))
+decodeModule :: TBinding (Context -> Graph -> Module -> Prelude.Either (InContext Error) (Maybe Module))
 decodeModule = define "decodeModule" $
   doc "Transform a type module into a decoder module" $
-  "mod" ~>
-    "typeBindings" <<~ (filterTypeBindings @@ (Module.moduleElements (var "mod"))) $
+  "cx" ~> "graph" ~> "mod" ~>
+    "typeBindings" <<~ (filterTypeBindings @@ var "cx" @@ var "graph" @@
+      (Maybes.cat $ Lists.map
+        ("d" ~> cases _Definition (var "d") (Just nothing) [
+          _Definition_type>>: "td" ~>
+            just (Annotations.typeElement @@ (Module.typeDefinitionName $ var "td") @@ (Module.typeDefinitionType $ var "td"))])
+        (Module.moduleDefinitions (var "mod")))) $
     Logic.ifElse (Lists.null (var "typeBindings"))
-      (Flows.pure nothing)
-      (Flows.bind (Flows.mapList decodeBinding (var "typeBindings")) $
-        "decodedBindings" ~>
+      (right nothing)
+      ("decodedBindings" <<~ Eithers.mapList ("b" ~>
+        Eithers.bimap
+          ("ic" ~> Ctx.inContext (Error.errorOther $ Error.otherError (unwrap _DecodingError @@ Ctx.inContextObject (var "ic"))) (Ctx.inContextContext (var "ic")))
+          ("x" ~> var "x")
+          (decodeBinding @@ var "cx" @@ var "graph" @@ var "b")) (var "typeBindings") $
         -- Decoder modules need:
         -- 1. hydra.lexical (for strip_and_dereference_term_either)
         -- 2. hydra.rewriting (for rewriting utilities)
@@ -540,9 +636,12 @@
         "decodedTermDeps" <~ (Lists.map decodeNamespace (Module.moduleTermDependencies (var "mod"))) $
         -- Use nub to remove duplicates (a module may appear in both type and term dependencies)
         "allDecodedDeps" <~ (primitive _lists_nub @@ Lists.concat2 (var "decodedTypeDeps") (var "decodedTermDeps")) $
-        Flows.pure (just (Module.module_
+        right (just (Module.module_
           (decodeNamespace @@ (Module.moduleNamespace (var "mod")))
-          (var "decodedBindings")
+          (Lists.map ("b" ~> Module.definitionTerm (Module.termDefinition
+            (Core.bindingName $ var "b") (Core.bindingTerm $ var "b")
+            (Core.bindingType $ var "b")))
+            (var "decodedBindings"))
           (Lists.concat2
             (list [
               (Module.namespace $ string "hydra.extract.helpers"),
@@ -568,15 +667,23 @@
         Strings.intercalate (string ".")
           (Lists.tail (Strings.splitOn (string ".") (Module.unNamespace (var "ns"))))]))
 
--- | Generate a decoder for a record type
--- Matches Term.record and extracts the Record with the expected type name
--- Returns Either DecodingError <RecordType>
-decodeRecordType :: TBinding (RowType -> Term)
+-- | Generate a decoder for a record type with element name
+decodeRecordTypeNamed :: TBinding (Name -> [FieldType] -> Term)
+decodeRecordTypeNamed = define "decodeRecordTypeNamed" $
+  doc "Generate a decoder for a record type with element name" $
+  "ename" ~> "rt" ~> decodeRecordTypeImpl @@ var "ename" @@ var "rt"
+
+-- | Generate a decoder for a record type (no element name)
+decodeRecordType :: TBinding ([FieldType] -> Term)
 decodeRecordType = define "decodeRecordType" $
   doc "Generate a decoder for a record type" $
-  "rt" ~>
-  "typeName" <~ (Core.rowTypeTypeName $ var "rt") $
-  "fieldTypes" <~ (Core.rowTypeFields $ var "rt") $
+  "rt" ~> decodeRecordTypeImpl @@ Core.name (string "unknown") @@ var "rt"
+
+-- | Generate a decoder for a record type (implementation with name parameter)
+decodeRecordTypeImpl :: TBinding (Name -> [FieldType] -> Term)
+decodeRecordTypeImpl = define "decodeRecordTypeImpl" $
+  doc "Generate a decoder for a record type with a type name" $
+  "tname" ~> "rt" ~>
   -- For each field, build a term that decodes it from fieldMap using requireField helper
   -- Returns: Either DecodingError fieldValue
   "decodeFieldTerm" <~ ("ft" ~>
@@ -599,14 +706,13 @@
         DC.primitive _eithers_bind
           @@@ (var "decodeFieldTerm" @@ var "ft")
           @@@ (var "toFieldLambda" @@ var "ft" @@ var "acc"))
-      -- Base case: Right with the constructed record (wrapped as Term)
-      (DC.right $ Core.termRecord $ Core.record (var "typeName") $
+      -- Base case: Right with the decoded record value
+      (DC.right $ Core.termRecord $ Core.record (var "tname") $
         Lists.map ("ft" ~> Core.field (Core.fieldTypeName $ var "ft") $ Core.termVariable $ var "localVarName" @@ var "ft")
-          (var "fieldTypes"))
-      (Lists.reverse $ var "fieldTypes")) $
+          (var "rt"))
+      (Lists.reverse $ var "rt")) $
   deannotateAndMatch
-    (just $ leftError (
-      Strings.cat $ list [string "expected record of type ", Core.unName (var "typeName")])) [
+    (just $ leftError (string "expected record")) [
     DC.field _Term_record $ DC.lambda "record" $
       DC.lets [
         -- Build Map Name Term from the record's fields using toFieldMap helper
@@ -678,7 +784,36 @@
   "elemDecoder" <~ decodeType @@ var "elemType" $
   DC.ref Helpers.decodeSet @@@ var "elemDecoder"
 
--- | Generate a decoder term for a given Type
+-- | Generate a decoder term for a given Type with element name context
+decodeTypeNamed :: TBinding (Name -> Type -> Term)
+decodeTypeNamed = define "decodeTypeNamed" $
+  doc "Generate a decoder term for a Type, with element name for nominal types" $
+  "ename" ~> "typ" ~>
+  cases _Type (var "typ")
+    (Just $ DC.lambda "cx" $ DC.lambda "t" $ leftError $ string "unsupported type variant") [
+    _Type_annotated>>: "at" ~> decodeTypeNamed @@ var "ename" @@ (Core.annotatedTypeBody (var "at")),
+    _Type_application>>: "appType" ~>
+      (decodeType @@ Core.applicationTypeFunction (var "appType"))
+        @@@ (decodeType @@ Core.applicationTypeArgument (var "appType")),
+    _Type_either>>: "et" ~> decodeEitherType @@ var "et",
+    _Type_forall>>: "ft" ~>
+      Core.termFunction $ Core.functionLambda $
+        Core.lambda (decodeBindingName @@ Core.forallTypeParameter (var "ft")) nothing
+          (decodeTypeNamed @@ var "ename" @@ Core.forallTypeBody (var "ft")),
+    _Type_list>>: "elemType" ~> decodeListType @@ var "elemType",
+    _Type_literal>>: "lt" ~> decodeLiteralType @@ var "lt",
+    _Type_map>>: "mt" ~> decodeMapType @@ var "mt",
+    _Type_maybe>>: "elemType" ~> decodeMaybeType @@ var "elemType",
+    _Type_pair>>: "pt" ~> decodePairType @@ var "pt",
+    _Type_record>>: "rt" ~> decodeRecordTypeNamed @@ var "ename" @@ var "rt",
+    _Type_set>>: "elemType" ~> decodeSetType @@ var "elemType",
+    _Type_union>>: "rt" ~> decodeUnionTypeNamed @@ var "ename" @@ var "rt",
+    _Type_unit>>: constant decodeUnitType,
+    _Type_void>>: constant decodeUnitType,
+    _Type_wrap>>: "wt" ~> decodeWrappedTypeNamed @@ var "ename" @@ var "wt",
+    _Type_variable>>: "typeName" ~> Core.termVariable (decodeBindingName @@ var "typeName")]
+
+-- | Generate a decoder term for a given Type (without element name context)
 decodeType :: TBinding (Type -> Term)
 decodeType = define "decodeType" $
   doc "Generate a decoder term for a Type" $
@@ -700,6 +835,7 @@
     _Type_set>>: "elemType" ~> decodeSetType @@ var "elemType",
     _Type_union>>: "rt" ~> decodeUnionType @@ var "rt",
     _Type_unit>>: constant decodeUnitType,
+    _Type_void>>: constant decodeUnitType,
     _Type_wrap>>: "wt" ~> decodeWrappedType @@ var "wt",
     _Type_variable>>: "typeName" ~> Core.termVariable (decodeBindingName @@ var "typeName")]
 
@@ -709,73 +845,75 @@
   doc "Generate a decoder for the unit type" $
   DC.ref Helpers.decodeUnit
 
--- | Generate a decoder for a union type (including enums)
-decodeUnionType :: TBinding (RowType -> Term)
-decodeUnionType = define "decodeUnionType" $
-  doc "Generate a decoder for a union type" $
-  "rt" ~>
-  "typeName" <~ (Core.rowTypeTypeName $ var "rt") $
+-- | Generate a decoder for a union type with element name
+decodeUnionTypeNamed :: TBinding (Name -> [FieldType] -> Term)
+decodeUnionTypeNamed = define "decodeUnionTypeNamed" $
+  doc "Generate a decoder for a union type with the given element name" $
+  "ename" ~> "rt" ~>
   "toVariantPair" <~ ("ft" ~>
     DC.pair
       (DC.wrap _Name $ DC.string $ Core.unName $ Core.fieldTypeName $ var "ft")
       (DC.lambda "input" $ DC.primitive _eithers_map
-        @@@ (DC.lambda "t" $ Core.termUnion $ Core.injection (var "typeName") $ Core.field (Core.fieldTypeName $ var "ft") $ DC.var "t")
+        @@@ (DC.lambda "t" $ Core.termUnion $ Core.injection (var "ename") $ Core.field (Core.fieldTypeName $ var "ft") $ DC.var "t")
         @@@ ((decodeType @@ (Core.fieldTypeType $ var "ft")) @@@ DC.var "cx" @@@ DC.var "input"))) $
   deannotateAndMatch
-    (just $ leftError $
-      Strings.cat $ list [string "expected union of type ", Core.unName (var "typeName")]) [
+    (just $ leftError $ string "expected union") [
     DC.field _Term_union $ DC.lambda "inj" $ DC.lets [
-      ("tname", DC.project _Injection _Injection_typeName @@@ DC.var "inj"),
       ("field", DC.project _Injection _Injection_field @@@ DC.var "inj"),
       ("fname", DC.project _Field _Field_name @@@ DC.var "field"),
       ("fterm", DC.project _Field _Field_term @@@ DC.var "field"),
       ("variantMap", DC.primitive _maps_fromList
-        @@@ (DC.list $ Lists.map (var "toVariantPair") $ Core.rowTypeFields $ var "rt"))] $
+        @@@ (DC.list $ Lists.map (var "toVariantPair") $ var "rt"))] $
       DC.primitive _maybes_maybe
         @@@ (DC.left $ DC.wrap _DecodingError $ DC.primitive _strings_cat
           @@@ (DC.list $ list [
             DC.string $ string "no such field ",
             DC.unwrap _Name @@@ DC.var "fname",
-            DC.string $ string " in union type ",
-            DC.unwrap _Name @@@ DC.var "tname"]))
+            DC.string $ string " in union"]))
         @@@ (DC.lambda "f" $ DC.var "f" @@@ DC.var "fterm")
         @@@ (DC.primitive _maps_lookup
           @@@ DC.var "fname"
           @@@ DC.var "variantMap")]
 
--- | Generate a decoder for a wrapped type
-decodeWrappedType :: TBinding (WrappedType -> Term)
-decodeWrappedType = define "decodeWrappedType" $
-  doc "Generate a decoder for a wrapped type" $
-  "wt" ~>
-  "bodyDecoder" <~ decodeType @@ Core.wrappedTypeBody (var "wt") $
-  -- Note: We can't use decodeWrapped directly because we need to re-wrap the result
-  -- with the specific type name. This is one case where the helper pattern doesn't fully apply.
+-- | Generate a decoder for a union type (without element name)
+decodeUnionType :: TBinding ([FieldType] -> Term)
+decodeUnionType = define "decodeUnionType" $
+  doc "Generate a decoder for a union type" $
+  "rt" ~> decodeUnionTypeNamed @@ Core.name (string "unknown") @@ var "rt"
+
+-- | Generate a decoder for a wrapped type with element name
+decodeWrappedTypeNamed :: TBinding (Name -> Type -> Term)
+decodeWrappedTypeNamed = define "decodeWrappedTypeNamed" $
+  doc "Generate a decoder for a wrapped type with the given element name" $
+  "ename" ~> "wt" ~>
+  "bodyDecoder" <~ decodeType @@ var "wt" $
   deannotateAndMatch
-    (just $ leftError (
-      Strings.cat $ list [
-        string "expected wrapped type ",
-        Core.unName (Core.wrappedTypeTypeName (var "wt"))])) [
+    (just $ leftError (string "expected wrapped type")) [
     DC.field _Term_wrap $ DC.lambda "wrappedTerm" $
       DC.primitive _eithers_map
-        @@@ (DC.lambda "b" $ DC.wrapDynamic (Core.wrappedTypeTypeName $ var "wt") (DC.var "b"))
+        @@@ (DC.lambda "b" $ DC.wrapDynamic (var "ename") (DC.var "b"))
         @@@ (var "bodyDecoder" @@@ DC.var "cx"
           @@@ (DC.project _WrappedTerm _WrappedTerm_body @@@ DC.var "wrappedTerm"))]
 
+-- | Generate a decoder for a wrapped type (without element name)
+decodeWrappedType :: TBinding (Type -> Term)
+decodeWrappedType = define "decodeWrappedType" $
+  doc "Generate a decoder for a wrapped type" $
+  "wt" ~> decodeWrappedTypeNamed @@ Core.name (string "unknown") @@ var "wt"
+
 -- | Filter bindings to only decodable type definitions
-filterTypeBindings :: TBinding ([Binding] -> Flow Graph [Binding])
+filterTypeBindings :: TBinding (Context -> Graph -> [Binding] -> Prelude.Either (InContext Error) [Binding])
 filterTypeBindings = define "filterTypeBindings" $
   doc "Filter bindings to only decodable type definitions" $
-  "bindings" ~>
-  Flows.map (primitive _maybes_cat) $
-    Flows.mapList isDecodableBinding $
+  "cx" ~> "graph" ~> "bindings" ~>
+  Eithers.map (primitive _maybes_cat) $
+    Eithers.mapList (isDecodableBinding @@ var "cx" @@ var "graph") $
       primitive _lists_filter @@ Annotations.isNativeType @@ var "bindings"
 
 -- | Check if a binding is decodable and return Just binding if so, Nothing otherwise
-isDecodableBinding :: TBinding (Binding -> Flow Graph (Maybe Binding))
+isDecodableBinding :: TBinding (Context -> Graph -> Binding -> Prelude.Either (InContext Error) (Maybe Binding))
 isDecodableBinding = define "isDecodableBinding" $
   doc "Check if a binding is decodable (serializable type)" $
-  "b" ~>
-  Flows.map
-    ("serializable" ~> Logic.ifElse (var "serializable") (just (var "b")) nothing)
-    (Schemas.isSerializableByName @@ (Core.bindingName (var "b")))
+  "cx" ~> "graph" ~> "b" ~>
+    "serializable" <<~ Schemas.isSerializableByName @@ var "cx" @@ var "graph" @@ (Core.bindingName (var "b")) $
+    right (Logic.ifElse (var "serializable") (just (var "b")) nothing)
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Dsls.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Dsls.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Dsls.hs
@@ -0,0 +1,578 @@
+{-# LANGUAGE FlexibleContexts #-}
+
+module Hydra.Sources.Kernel.Terms.Dsls where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Meta.Phantoms     as Phantoms
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (
+  elimination, field, fieldType, floatType, floatValue, function, injection, integerType, integerValue, lambda, literal,
+  literalType, record, term, type_, typeScheme, wrap)
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
+import           Hydra.Sources.Kernel.Types.All
+import qualified Hydra.Sources.Kernel.Terms.Annotations as Annotations
+import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Names as Names
+import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Schemas as Schemas
+import qualified Hydra.Dsl.Meta.DeepCore as DC
+import           Hydra.Dsl.Meta.DeepCore ((@@@))
+import           Prelude hiding ((++))
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+
+
+ns :: Namespace
+ns = Namespace "hydra.dsls"
+
+module_ :: Module
+module_ = Module ns elements
+    [Annotations.ns, Formatting.ns, Names.ns, Rewriting.ns, Schemas.ns]
+    kernelTypesNamespaces $
+    Just "Functions for generating domain-specific DSL modules from type modules"
+  where
+    elements = [
+      toTermDefinition dslBindingName,
+      toTermDefinition dslElementName,
+      toTermDefinition dslModule,
+      toTermDefinition dslNamespace,
+      toTermDefinition filterTypeBindings,
+      toTermDefinition generateBindingsForType,
+      toTermDefinition generateRecordAccessor,
+      toTermDefinition generateRecordConstructor,
+      toTermDefinition generateRecordWithUpdater,
+      toTermDefinition generateUnionInjector,
+      toTermDefinition generateWrappedTypeAccessors,
+      toTermDefinition deduplicateBindings,
+      toTermDefinition findUniqueName,
+      toTermDefinition isDslEligibleBinding,
+      toTermDefinition dslTypeScheme,
+      toTermDefinition collectForallVars,
+      toTermDefinition nominalResultType]
+
+define :: String -> TTerm x -> TBinding x
+define = definitionInModule module_
+
+-- | Wrap a type in TTerm: TypeApplication (TypeVariable "hydra.phantoms.TTerm") innerType
+wrapInTTerm :: TTerm Type -> TTerm Type
+wrapInTTerm t = Core.typeApplication $ Core.applicationType (Core.typeVariable (Core.nameLift _TTerm)) t
+
+-- | Build a TypeScheme from a list of parameter types and a result type.
+-- All types are wrapped in TTerm. Forall variables are collected from the original type.
+dslTypeScheme :: TBinding (Type -> [Type] -> Type -> TypeScheme)
+dslTypeScheme = define "dslTypeScheme" $
+  doc "Build a TypeScheme with TTerm-wrapped parameter and result types" $
+  "origType" ~> "paramTypes" ~> "resultType" ~>
+  "typeVars" <~ (collectForallVars @@ var "origType") $
+  "wrappedResult" <~ (wrapInTTerm (var "resultType")) $
+  "funType" <~ (Lists.foldr
+    ("paramType" ~> "acc" ~> Core.typeFunction $ Core.functionType (wrapInTTerm (var "paramType")) (var "acc"))
+    (var "wrappedResult")
+    (var "paramTypes")) $
+  Core.typeScheme (var "typeVars") (var "funType") nothing
+
+-- | Collect forall type variables from a type (stripping annotations)
+collectForallVars :: TBinding (Type -> [Name])
+collectForallVars = define "collectForallVars" $
+  doc "Collect forall type variable names from a type" $
+  "typ" ~> cases _Type (var "typ") (Just $ list ([] :: [TTerm Name])) [
+    _Type_annotated>>: "at" ~>
+      collectForallVars @@ Core.annotatedTypeBody (var "at"),
+    _Type_forall>>: "ft" ~>
+      Lists.cons (Core.forallTypeParameter (var "ft"))
+        (collectForallVars @@ Core.forallTypeBody (var "ft"))]
+
+-- | Build the nominal result type for a type definition.
+-- For non-polymorphic types: TypeVariable typeName
+-- For polymorphic types like (forall n. Namespaces n): TypeApplication (TypeVariable typeName) (TypeVariable n)
+nominalResultType :: TBinding (Name -> Type -> Type)
+nominalResultType = define "nominalResultType" $
+  doc "Build the nominal result type with type applications for forall variables" $
+  "typeName" ~> "origType" ~>
+  "vars" <~ (collectForallVars @@ var "origType") $
+  Lists.foldl
+    ("acc" ~> "v" ~> Core.typeApplication $ Core.applicationType (var "acc") (Core.typeVariable (var "v")))
+    (Core.typeVariable (var "typeName"))
+    (var "vars")
+
+-- | Inject a Record-typed term into the Term.record variant
+-- Produces TermUnion(Injection _Term (Field _Term_record innerRecord))
+injectTermRecord :: TTerm Term -> TTerm Term
+injectTermRecord t = Core.termUnion $ Core.injection (Core.nameLift _Term) (Core.field (Core.nameLift _Term_record) t)
+
+-- | Inject a term into the Term.function variant
+injectTermFunction :: TTerm Term -> TTerm Term
+injectTermFunction t = Core.termUnion $ Core.injection (Core.nameLift _Term) (Core.field (Core.nameLift _Term_function) t)
+
+-- | Inject a term into the Term.application variant
+injectTermApplication :: TTerm Term -> TTerm Term
+injectTermApplication t = Core.termUnion $ Core.injection (Core.nameLift _Term) (Core.field (Core.nameLift _Term_application) t)
+
+-- | Inject a term into the Term.union variant
+injectTermUnion :: TTerm Term -> TTerm Term
+injectTermUnion t = Core.termUnion $ Core.injection (Core.nameLift _Term) (Core.field (Core.nameLift _Term_union) t)
+
+-- | Inject a term into the Term.wrap variant
+injectTermWrap :: TTerm Term -> TTerm Term
+injectTermWrap t = Core.termUnion $ Core.injection (Core.nameLift _Term) (Core.field (Core.nameLift _Term_wrap) t)
+
+-- | Inject into Function.elimination
+injectFunctionElimination :: TTerm Term -> TTerm Term
+injectFunctionElimination t = Core.termUnion $ Core.injection (Core.nameLift _Function) (Core.field (Core.nameLift _Function_elimination) t)
+
+-- | Inject into Elimination.record
+injectEliminationRecord :: TTerm Term -> TTerm Term
+injectEliminationRecord t = Core.termUnion $ Core.injection (Core.nameLift _Elimination) (Core.field (Core.nameLift _Elimination_record) t)
+
+-- | Inject into Elimination.wrap
+injectEliminationWrap :: TTerm Term -> TTerm Term
+injectEliminationWrap t = Core.termUnion $ Core.injection (Core.nameLift _Elimination) (Core.field (Core.nameLift _Elimination_wrap) t)
+
+-- | Build a deep Name: TermWrap(_Name, TermLiteral(LiteralString(s)))
+deepName :: TTerm String -> TTerm Term
+deepName s = Core.termWrap $ Core.wrappedTerm (Core.nameLift _Name) (Core.termLiteral $ Core.literalString s)
+
+-- | Build a deep Projection as a Term value
+deepProjection :: TTerm Name -> TTerm Name -> TTerm Term
+deepProjection typeName fieldName =
+  injectTermFunction $ injectFunctionElimination $ injectEliminationRecord $
+    Core.termRecord $ Core.record (Core.nameLift _Projection) (list [
+      Core.field (Core.nameLift _Projection_typeName) (deepName (Core.unName typeName)),
+      Core.field (Core.nameLift _Projection_field) (deepName (Core.unName fieldName))])
+
+-- | Build a deep Application as a Term value
+deepApplication :: TTerm Term -> TTerm Term -> TTerm Term
+deepApplication fun arg =
+  injectTermApplication $
+    Core.termRecord $ Core.record (Core.nameLift _Application) (list [
+      Core.field (Core.nameLift _Application_function) fun,
+      Core.field (Core.nameLift _Application_argument) arg])
+
+-- | Build a deep Field record
+deepField :: TTerm Name -> TTerm Term -> TTerm Term
+deepField name term =
+  Core.termRecord $ Core.record (Core.nameLift _Field) (list [
+    Core.field (Core.nameLift _Field_name) (deepName (Core.unName name)),
+    Core.field (Core.nameLift _Field_term) term])
+
+-- | Build a deep Record as a Term value (injected into Term.record)
+deepRecord :: TTerm Name -> TTerm [Term] -> TTerm Term
+deepRecord typeName fields =
+  injectTermRecord $
+    Core.termRecord $ Core.record (Core.nameLift _Record) (list [
+      Core.field (Core.nameLift _Record_typeName) (deepName (Core.unName typeName)),
+      Core.field (Core.nameLift _Record_fields) (Core.termList fields)])
+
+-- | Build a deep Injection as a Term value (injected into Term.union)
+deepInjection :: TTerm Name -> TTerm Term -> TTerm Term
+deepInjection typeName fieldTerm =
+  injectTermUnion $
+    Core.termRecord $ Core.record (Core.nameLift _Injection) (list [
+      Core.field (Core.nameLift _Injection_typeName) (deepName (Core.unName typeName)),
+      Core.field (Core.nameLift _Injection_field) fieldTerm])
+
+-- | Build a deep WrappedTerm as a Term value (injected into Term.wrap)
+deepWrap :: TTerm Name -> TTerm Term -> TTerm Term
+deepWrap typeName body =
+  injectTermWrap $
+    Core.termRecord $ Core.record (Core.nameLift _WrappedTerm) (list [
+      Core.field (Core.nameLift _WrappedTerm_typeName) (deepName (Core.unName typeName)),
+      Core.field (Core.nameLift _WrappedTerm_body) body])
+
+-- | Build a deep EliminationWrap as a Term.function value
+deepUnwrap :: TTerm Name -> TTerm Term
+deepUnwrap typeName =
+  injectTermFunction $ injectFunctionElimination $ injectEliminationWrap $
+    deepName (Core.unName typeName)
+
+-- | Unwrap a TTerm argument: apply (EliminationWrap _TTerm) to the variable
+unwrapTTerm :: TTerm Term -> TTerm Term
+unwrapTTerm v = Core.termApplication $ Core.application
+  (Core.termFunction $ Core.functionElimination $ Core.eliminationWrap (Core.nameLift _TTerm))
+  v
+
+-- | Wrap a term in TTerm: WrappedTerm _TTerm term
+wrapTermInTTerm :: TTerm Term -> TTerm Term
+wrapTermInTTerm t = Core.termWrap $ Core.wrappedTerm (Core.nameLift _TTerm) t
+
+
+
+-- | Generate a DSL module namespace from a source module namespace
+-- For example, "hydra.core" -> "hydra.dsl.core"
+dslNamespace :: TBinding (Namespace -> Namespace)
+dslNamespace = define "dslNamespace" $
+  doc "Generate a DSL module namespace from a source module namespace" $
+  "ns" ~>
+  "parts" <~ (Strings.splitOn (string ".") (Module.unNamespace (var "ns"))) $
+  -- For hydra.* namespaces: hydra.foo -> hydra.dsl.foo
+  -- For other namespaces: foo.bar -> hydra.dsl.foo.bar (preserve full path)
+  Logic.ifElse (Equality.equal (Lists.head (var "parts")) (string "hydra"))
+    (Module.namespace (Strings.cat $ list [
+      string "hydra.dsl.",
+      Strings.intercalate (string ".") (Lists.tail (var "parts"))]))
+    (Module.namespace (Strings.cat $ list [
+      string "hydra.dsl.",
+      Module.unNamespace (var "ns")]))
+
+-- | Generate a fully qualified binding name for a DSL function from a type name
+-- For example, "hydra.core.AnnotatedTerm" -> "hydra.dsl.core.annotatedTerm"
+-- For local types (no namespace), returns just the decapitalized local name
+dslBindingName :: TBinding (Name -> Name)
+dslBindingName = define "dslBindingName" $
+  doc "Generate a binding name for a DSL function from a type name" $
+  "n" ~>
+  "parts" <~ (Strings.splitOn (string ".") (Core.unName (var "n"))) $
+  -- Check if name has a namespace (contains ".")
+  Logic.ifElse (Logic.not (Lists.null (Lists.tail (var "parts"))))
+    -- Qualified type: check if namespace starts with "hydra"
+    (Logic.ifElse (Equality.equal (Lists.head (var "parts")) (string "hydra"))
+      -- hydra.core.Foo -> hydra.dsl.core.foo
+      (Core.name (Strings.intercalate (string ".") (Lists.concat2
+        (list [string "hydra", string "dsl"])
+        (Lists.concat2
+          (Lists.tail (Lists.init (var "parts")))
+          (list [Formatting.decapitalize @@ (Names.localNameOf @@ (var "n"))])))))
+      -- openGql.grammar.Foo -> hydra.dsl.openGql.grammar.foo
+      (Core.name (Strings.intercalate (string ".") (Lists.concat2
+        (list [string "hydra", string "dsl"])
+        (Lists.concat2
+          (Lists.init (var "parts"))
+          (list [Formatting.decapitalize @@ (Names.localNameOf @@ (var "n"))]))))))
+    -- Local type: just decapitalize
+    (Core.name (Formatting.decapitalize @@ (Names.localNameOf @@ (var "n"))))
+
+-- | Generate a DSL element name from a type name and a local element name.
+-- For example, ("hydra.core.AnnotatedTerm", "annotatedTermBody") -> "hydra.dsl.core.annotatedTermBody"
+-- This extracts the namespace from the type name, transforms it to the DSL namespace,
+-- and appends the local element name.
+dslElementName :: TBinding (Name -> String -> Name)
+dslElementName = define "dslElementName" $
+  doc "Generate a qualified DSL element name from a type name and local element name" $
+  "typeName" ~> "localName" ~>
+  "parts" <~ (Strings.splitOn (string ".") (Core.unName (var "typeName"))) $
+  -- Extract namespace parts (all but last), transform to DSL namespace
+  "nsParts" <~ (Lists.init (var "parts")) $
+  "dslNsParts" <~ (Logic.ifElse (Equality.equal (Lists.head (var "nsParts")) (string "hydra"))
+    -- hydra.core -> hydra.dsl.core
+    (Lists.concat2 (list [string "hydra", string "dsl"]) (Lists.tail (var "nsParts")))
+    -- openGql.grammar -> hydra.dsl.openGql.grammar
+    (Lists.concat2 (list [string "hydra", string "dsl"]) (var "nsParts"))) $
+  Core.name (Strings.intercalate (string ".") (Lists.concat2 (var "dslNsParts") (list [var "localName"])))
+
+-- | Generate a record constructor function.
+-- For a record type like {body: Term, annotation: Map(Name, Term)},
+-- produces a deep (meta) term:
+--   \body -> \annotation -> TermRecord (Record "hydra.core.AnnotatedTerm" [Field "body" body, ...])
+-- When code-generated into Haskell, this becomes:
+--   annotatedTerm body annotation = Core.TermRecord (Core.Record { ... })
+generateRecordConstructor :: TBinding (Type -> Name -> [FieldType] -> [Binding])
+generateRecordConstructor = define "generateRecordConstructor" $
+  doc "Generate a record constructor function" $
+  "origType" ~> "typeName" ~> "fieldTypes" ~>
+  -- Build deep fields and record using helpers
+  "dFields" <~ (Lists.map
+    ("ft" ~> deepField (Core.fieldTypeName (var "ft"))
+      (unwrapTTerm (Core.termVariable (Core.name (Formatting.decapitalize @@ (Names.localNameOf @@ Core.fieldTypeName (var "ft")))))))
+    (var "fieldTypes")) $
+  "recordTerm" <~ (wrapTermInTTerm (deepRecord (var "typeName") (var "dFields"))) $
+  -- Build (paramName, TTerm<fieldType>) pairs for lambda construction
+  "paramPairs" <~ (Lists.map
+    ("ft" ~> pair
+      (Formatting.decapitalize @@ (Names.localNameOf @@ Core.fieldTypeName (var "ft")))
+      (wrapInTTerm (Core.fieldTypeType (var "ft"))))
+    (var "fieldTypes")) $
+  -- Wrap in typed lambdas for each parameter (right to left)
+  "body" <~ (Lists.foldl
+    ("acc" ~> "pp" ~>
+      Core.termFunction $ Core.functionLambda $
+        Core.lambda (Core.name (Pairs.first (var "pp"))) (just (Pairs.second (var "pp"))) (var "acc"))
+    (var "recordTerm")
+    (Lists.reverse (var "paramPairs"))) $
+  -- Type: TTerm<FieldType1> -> TTerm<FieldType2> -> ... -> TTerm<RecordType>
+  "paramTypes" <~ (Lists.map ("ft" ~> Core.fieldTypeType (var "ft")) (var "fieldTypes")) $
+  "resultType" <~ (nominalResultType @@ var "typeName" @@ var "origType") $
+  "ts" <~ (dslTypeScheme @@ var "origType" @@ var "paramTypes" @@ var "resultType") $
+  -- Return as a single-element list with the constructor binding
+  list [Core.binding
+    (dslBindingName @@ var "typeName")
+    (var "body")
+    (just (var "ts"))]
+
+-- | Generate a record field accessor function.
+-- For a field "name" in record type "Binding", produces:
+--   bindingName :: Binding -> Name
+--   bindingName x = x.name
+generateRecordAccessor :: TBinding (Type -> Name -> FieldType -> Binding)
+generateRecordAccessor = define "generateRecordAccessor" $
+  doc "Generate a record field accessor function" $
+  "origType" ~> "typeName" ~> "ft" ~>
+  "fieldName" <~ (Core.fieldTypeName (var "ft")) $
+  "accessorLocalName" <~ (Strings.cat $ list [
+    Formatting.decapitalize @@ (Names.localNameOf @@ var "typeName"),
+    Strings.intercalate (string "") (Lists.map ("s" ~> Formatting.capitalize @@ var "s") (Strings.splitOn (string ".") (Core.unName (var "fieldName"))))]) $
+  "accessorName" <~ (dslElementName @@ var "typeName" @@ var "accessorLocalName") $
+  -- Body: projection as a simple elimination
+  "paramDomain" <~ (wrapInTTerm (nominalResultType @@ var "typeName" @@ var "origType")) $
+  "body" <~ (Core.termFunction $ Core.functionLambda $
+    Core.lambda (Core.name (string "x")) (just (var "paramDomain")) $
+      wrapTermInTTerm (deepApplication
+        (deepProjection (var "typeName") (var "fieldName"))
+        (unwrapTTerm (Core.termVariable (Core.name (string "x")))))) $
+  "ts" <~ (dslTypeScheme @@ var "origType"
+    @@ list [nominalResultType @@ var "typeName" @@ var "origType"]
+    @@ Core.fieldTypeType (var "ft")) $
+  Core.binding
+    (var "accessorName")
+    (var "body")
+    (just (var "ts"))
+
+-- | Generate a "withXxx" record field updater function.
+-- For a field "name" in record type "Binding" (with fields name, term, type), produces:
+--   bindingWithName :: Binding -> Name -> Binding
+--   bindingWithName b newName = Binding newName (bindingTerm b) (bindingType b)
+-- This constructs a new record with the specified field replaced and all others projected.
+generateRecordWithUpdater :: TBinding (Type -> Name -> [FieldType] -> FieldType -> Binding)
+generateRecordWithUpdater = define "generateRecordWithUpdater" $
+  doc "Generate a withXxx record field updater function" $
+  "origType" ~> "typeName" ~> "allFields" ~> "targetField" ~>
+  "targetFieldName" <~ (Core.fieldTypeName (var "targetField")) $
+  -- Build the updater name: e.g., "bindingWithName"
+  "updaterLocalName" <~ (Strings.cat $ list [
+    Formatting.decapitalize @@ (Names.localNameOf @@ var "typeName"),
+    string "With",
+    Strings.intercalate (string "") (Lists.map ("s" ~> Formatting.capitalize @@ var "s") (Strings.splitOn (string ".") (Core.unName (var "targetFieldName"))))]) $
+  "updaterName" <~ (dslElementName @@ var "typeName" @@ var "updaterLocalName") $
+  -- Build deep fields: project from unwrapped original, except target uses unwrapped newVal
+  "dFields" <~ (Lists.map
+    ("ft" ~> deepField (Core.fieldTypeName (var "ft"))
+      (Logic.ifElse (Equality.equal
+        (Core.unName (Core.fieldTypeName (var "ft")))
+        (Core.unName (var "targetFieldName")))
+        (unwrapTTerm (Core.termVariable (Core.name (string "newVal"))))
+        (deepApplication
+          (deepProjection (var "typeName") (Core.fieldTypeName (var "ft")))
+          (unwrapTTerm (Core.termVariable (Core.name (string "original")))))))
+    (var "allFields")) $
+  "recDomain" <~ (wrapInTTerm (nominalResultType @@ var "typeName" @@ var "origType")) $
+  "fieldDomain" <~ (wrapInTTerm (Core.fieldTypeType (var "targetField"))) $
+  "body" <~ (
+    Core.termFunction $ Core.functionLambda $ Core.lambda (Core.name (string "original")) (just (var "recDomain")) $
+    Core.termFunction $ Core.functionLambda $ Core.lambda (Core.name (string "newVal")) (just (var "fieldDomain")) $
+    wrapTermInTTerm (deepRecord (var "typeName") (var "dFields"))) $
+  "recType" <~ (nominalResultType @@ var "typeName" @@ var "origType") $
+  "ts" <~ (dslTypeScheme @@ var "origType"
+    @@ list [var "recType", Core.fieldTypeType (var "targetField")]
+    @@ var "recType") $
+  Core.binding
+    (var "updaterName")
+    (var "body")
+    (just (var "ts"))
+
+-- | Generate a union injection helper.
+-- For a variant "lambda" in union type "Function", produces:
+--   functionLambda :: Lambda -> Function
+--   functionLambda x = Function.lambda x
+-- For unit variants (field type is unit), produces:
+--   comparisonLessThan :: Comparison
+--   comparisonLessThan = Comparison.lessThan ()
+generateUnionInjector :: TBinding (Type -> Name -> FieldType -> Binding)
+generateUnionInjector = define "generateUnionInjector" $
+  doc "Generate a union injection helper" $
+  "origType" ~> "typeName" ~> "ft" ~>
+  "fieldName" <~ (Core.fieldTypeName (var "ft")) $
+  "fieldType" <~ (Core.fieldTypeType (var "ft")) $
+  -- Build the injector name: e.g., "functionLambda" or "comparisonLessThan"
+  "injectorLocalName" <~ (Strings.cat $ list [
+    Formatting.decapitalize @@ (Names.localNameOf @@ var "typeName"),
+    Strings.intercalate (string "") (Lists.map ("s" ~> Formatting.capitalize @@ var "s") (Strings.splitOn (string ".") (Core.unName (var "fieldName"))))]) $
+  "injectorName" <~ (dslElementName @@ var "typeName" @@ var "injectorLocalName") $
+  -- Check if field type is unit (for unit variants like enum members)
+  "isUnit" <~ (isUnitType_ @@ var "fieldType") $
+  -- Build simple injection
+  -- Build deep injection: deepField for the variant, then deepInjection into the union type
+  "dFieldValue" <~ (Logic.ifElse (var "isUnit")
+    (Core.termUnion $ Core.injection (Core.nameLift _Term) (Core.field (Core.nameLift _Term_unit) Core.termUnit))
+    (unwrapTTerm (Core.termVariable (Core.name (string "x"))))) $
+  "injectionTerm" <~ (wrapTermInTTerm (deepInjection (var "typeName") (deepField (var "fieldName") (var "dFieldValue")))) $
+  -- For non-unit variants, wrap in a typed lambda; for unit, it's a constant TTerm
+  "variantDomain" <~ (wrapInTTerm (Core.fieldTypeType (var "ft"))) $
+  "body" <~ (Logic.ifElse (var "isUnit")
+    (var "injectionTerm")
+    (Core.termFunction $ Core.functionLambda $
+      Core.lambda (Core.name (string "x")) (just (var "variantDomain")) (var "injectionTerm"))) $
+  "unionType" <~ (nominalResultType @@ var "typeName" @@ var "origType") $
+  "ts" <~ (Logic.ifElse (var "isUnit")
+    (dslTypeScheme @@ var "origType" @@ list ([] :: [TTerm Type]) @@ var "unionType")
+    (dslTypeScheme @@ var "origType" @@ list [Core.fieldTypeType (var "ft")] @@ var "unionType")) $
+  Core.binding
+    (var "injectorName")
+    (var "body")
+    (just (var "ts"))
+
+-- | Check if a type is the unit type (stripping annotations first)
+-- Note: uses stripAnnotations to avoid recursive Haskell-level DSL terms,
+-- which would cause infinite recursion during code generation.
+isUnitType_ :: TTerm (Type -> Bool)
+isUnitType_ = "t" ~> cases _Type (Rewriting.deannotateType @@ var "t") (Just Phantoms.false) [
+  _Type_unit>>: constant Phantoms.true]
+
+-- | Generate wrap/unwrap accessors for a wrapped type.
+-- For a wrapped type like "Name" wrapping String, produces:
+--   name :: String -> Name      (constructor/wrap)
+--   unName :: Name -> String    (unwrap)
+generateWrappedTypeAccessors :: TBinding (Type -> Name -> Type -> [Binding])
+generateWrappedTypeAccessors = define "generateWrappedTypeAccessors" $
+  doc "Generate wrap/unwrap accessors for a wrapped type" $
+  "origType" ~> "typeName" ~> "innerType" ~>
+  "localName" <~ (Names.localNameOf @@ var "typeName") $
+  -- Wrap function: decapitalized type name
+  "wrapName" <~ (dslElementName @@ var "typeName" @@ (Formatting.decapitalize @@ var "localName")) $
+  -- Unwrap function: "un" + type local name
+  "unwrapLocalName" <~ (Strings.cat $ list [string "un", var "localName"]) $
+  "unwrapName" <~ (dslElementName @@ var "typeName" @@ var "unwrapLocalName") $
+  "wrapperType" <~ (nominalResultType @@ var "typeName" @@ var "origType") $
+  -- Wrap: \(x :: TTerm<InnerType>) -> WrappedTerm typeName x
+  "wrapDomain" <~ (wrapInTTerm (var "innerType")) $
+  "wrapBody" <~ (
+    Core.termFunction $ Core.functionLambda $
+      Core.lambda (Core.name (string "x")) (just (var "wrapDomain")) $
+        wrapTermInTTerm (deepWrap (var "typeName")
+          (unwrapTTerm (Core.termVariable (Core.name (string "x")))))) $
+  -- Unwrap: \(x :: TTerm<WrapperType>) -> TTerm(apply (unwrap typeName) (unTTerm x))
+  "unwrapDomain" <~ (wrapInTTerm (var "wrapperType")) $
+  "unwrapBody" <~ (
+    Core.termFunction $ Core.functionLambda $
+      Core.lambda (Core.name (string "x")) (just (var "unwrapDomain")) $
+        wrapTermInTTerm (deepApplication
+          (deepUnwrap (var "typeName"))
+          (unwrapTTerm (Core.termVariable (Core.name (string "x")))))) $
+  "wrapTs" <~ (dslTypeScheme @@ var "origType" @@ list [var "innerType"] @@ var "wrapperType") $
+  "unwrapTs" <~ (dslTypeScheme @@ var "origType" @@ list [var "wrapperType"] @@ var "innerType") $
+  list [
+    Core.binding (var "wrapName") (var "wrapBody") (just (var "wrapTs")),
+    Core.binding (var "unwrapName") (var "unwrapBody") (just (var "unwrapTs"))]
+
+-- | Generate all DSL bindings for a single type binding.
+-- Inspects the type definition and generates appropriate helpers:
+-- - Records: constructor + accessors + withXxx updaters
+-- - Unions: injection helpers
+-- - Wrapped types: wrap + unwrap
+generateBindingsForType :: TBinding (Context -> Graph -> Binding -> Either (InContext DecodingError) [Binding])
+generateBindingsForType = define "generateBindingsForType" $
+  doc "Generate all DSL bindings for a type binding" $
+  "cx" ~> "graph" ~> "b" ~>
+  "typeName" <~ (Core.bindingName (var "b")) $
+  Eithers.bind (Ctx.withContext (var "cx") (decoderFor _Type @@ var "graph" @@ (Core.bindingTerm (var "b")))) (
+    "rawType" ~>
+    "typ" <~ (Rewriting.deannotateTypeParameters @@ (Rewriting.deannotateType @@ var "rawType")) $
+    right (cases _Type (var "typ") (Just $ list ([] :: [TTerm Binding])) [
+      _Type_record>>: "fts" ~>
+        Lists.concat $ list [
+          generateRecordConstructor @@ var "rawType" @@ var "typeName" @@ var "fts",
+          Lists.map (generateRecordAccessor @@ var "rawType" @@ var "typeName") (var "fts"),
+          Lists.map (generateRecordWithUpdater @@ var "rawType" @@ var "typeName" @@ var "fts")
+            (var "fts")],
+      _Type_union>>: "fts" ~>
+        Lists.map (generateUnionInjector @@ var "rawType" @@ var "typeName") (var "fts"),
+      _Type_wrap>>: "innerType" ~>
+        generateWrappedTypeAccessors @@ var "rawType" @@ var "typeName" @@ var "innerType"]))
+
+-- | Deduplicate bindings by appending "_" suffixes to duplicate names.
+-- Later bindings get suffixes; earlier ones keep their name.
+-- Multiple duplicates get increasing suffixes: name_, name__, name___, etc.
+deduplicateBindings :: TBinding ([Binding] -> [Binding])
+deduplicateBindings = define "deduplicateBindings" $
+  doc "Deduplicate bindings by appending underscore suffixes to duplicate names" $
+  "bindings" ~>
+  Lists.foldl
+    ("acc" ~> "b" ~>
+      "n" <~ (Core.unName (Core.bindingName (var "b"))) $
+      "usedNames" <~ (Lists.map ("a" ~> Core.unName (Core.bindingName (var "a"))) (var "acc")) $
+      "uniqueName" <~ (findUniqueName @@ var "n" @@ var "usedNames") $
+      Lists.concat2 (var "acc") (list [
+        Core.binding
+          (Core.name (var "uniqueName"))
+          (Core.bindingTerm (var "b"))
+          (Core.bindingType (var "b"))]))
+    (list ([] :: [TTerm Binding]))
+    (var "bindings")
+
+-- | Find a unique name by appending "_" suffixes until not in the used list
+findUniqueName :: TBinding (String -> [String] -> String)
+findUniqueName = define "findUniqueName" $
+  doc "Find a unique name by appending underscores" $
+  "candidate" ~> "usedNames" ~>
+  Logic.ifElse (Lists.null (Lists.filter (unaryFunction (Equality.equal (var "candidate"))) (var "usedNames")))
+    (var "candidate")
+    (findUniqueName @@ (Strings.cat $ list [var "candidate", string "_"]) @@ var "usedNames")
+
+-- | Filter bindings to only DSL-eligible type definitions
+filterTypeBindings :: TBinding (Context -> Graph -> [Binding] -> Either (InContext Error) [Binding])
+filterTypeBindings = define "filterTypeBindings" $
+  doc "Filter bindings to only DSL-eligible type definitions" $
+  "cx" ~> "graph" ~> "bindings" ~>
+    Eithers.map (primitive _maybes_cat) $
+      Eithers.mapList (isDslEligibleBinding @@ var "cx" @@ var "graph") $
+        primitive _lists_filter @@ Annotations.isNativeType @@ var "bindings"
+
+-- | Check if a binding is eligible for DSL generation.
+-- Excludes phantom types (TTerm, TBinding) since they are meta-infrastructure.
+isDslEligibleBinding :: TBinding (Context -> Graph -> Binding -> Either (InContext Error) (Maybe Binding))
+isDslEligibleBinding = define "isDslEligibleBinding" $
+  doc "Check if a binding is eligible for DSL generation" $
+  "cx" ~> "graph" ~> "b" ~>
+  "ns" <~ (Names.namespaceOf @@ Core.bindingName (var "b")) $
+  Logic.ifElse (Equality.equal (Maybes.maybe (string "") (unaryFunction Module.unNamespace) (var "ns")) (string "hydra.phantoms"))
+    (right nothing)
+    (right (just (var "b")))
+
+-- | Transform a type module into a DSL module.
+-- Returns Nothing if the module has no eligible type definitions.
+dslModule :: TBinding (Context -> Graph -> Module -> Either (InContext Error) (Maybe Module))
+dslModule = define "dslModule" $
+  doc "Transform a type module into a DSL module" $
+  "cx" ~> "graph" ~> "mod" ~>
+    "typeBindings" <<~ (filterTypeBindings @@ var "cx" @@ var "graph" @@
+      (Maybes.cat $ Lists.map
+        ("d" ~> cases _Definition (var "d") (Just nothing) [
+          _Definition_type>>: "td" ~>
+            just (Annotations.typeElement @@ (Module.typeDefinitionName $ var "td") @@ (Module.typeDefinitionType $ var "td"))])
+        (Module.moduleDefinitions (var "mod")))) $
+    Logic.ifElse (Lists.null (var "typeBindings"))
+      (right nothing)
+      ("dslBindings" <<~ Eithers.mapList ("b" ~>
+        Eithers.bimap
+          ("ic" ~> Ctx.inContext (Error.errorOther $ Error.otherError (unwrap _DecodingError @@ Ctx.inContextObject (var "ic"))) (Ctx.inContextContext (var "ic")))
+          ("x" ~> var "x")
+          (generateBindingsForType @@ var "cx" @@ var "graph" @@ var "b")) (var "typeBindings") $
+        right (just (Module.module_
+          (dslNamespace @@ (Module.moduleNamespace (var "mod")))
+          (Lists.map ("b" ~> Module.definitionTerm (Module.termDefinition
+            (Core.bindingName $ var "b") (Core.bindingTerm $ var "b")
+            (Core.bindingType $ var "b")))
+            (deduplicateBindings @@ Lists.concat (var "dslBindings")))
+          -- DSL modules depend on DSL modules for type dependencies (to reference other types' DSL functions)
+          (Lists.nub (primitive _lists_map @@ dslNamespace @@ (Module.moduleTypeDependencies (var "mod"))))
+          -- Type dependencies: the original module + its type deps + hydra.phantoms (for TTerm)
+          (Lists.nub (Lists.concat2
+            (list [Module.moduleNamespace (var "mod"), Module.namespace (string "hydra.phantoms")])
+            (Module.moduleTypeDependencies (var "mod"))))
+          (just (Strings.cat $ list [
+            string "DSL functions for ",
+            Module.unNamespace (Module.moduleNamespace (var "mod"))])))))
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Encoding.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Encoding.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Encoding.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Encoding.hs
@@ -5,21 +5,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (literalType)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -34,28 +31,30 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import qualified Hydra.Dsl.Meta.Phantoms     as Phantoms
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (
   elimination, field, fieldType, floatType, floatValue, function, injection, integerType, integerValue, lambda, literal,
   literalType, record, term, type_, typeScheme, wrap)
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import qualified Hydra.Sources.Kernel.Terms.Annotations as Annotations
 import qualified Hydra.Sources.Decode.Core as DecodeCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
+
 import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
 import qualified Hydra.Sources.Kernel.Terms.Names as Names
+import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas as Schemas
 import qualified Hydra.Dsl.Meta.DeepCore as DC
 import           Hydra.Dsl.Meta.DeepCore ((@@@))
@@ -72,52 +71,71 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Annotations.ns, moduleNamespace DecodeCore.module_, Formatting.ns, Monads.ns, Names.ns, Schemas.ns]
+    [Annotations.ns, moduleNamespace DecodeCore.module_, Formatting.ns, Names.ns, Rewriting.ns, Schemas.ns]
     kernelTypesNamespaces $
     Just "Functions for generating term encoders from type modules"
   where
     elements = [
-      toBinding encodeBinding,
-      toBinding encodeBindingName,
-      toBinding encodeFieldValue,
-      toBinding encodeFloatValue,
-      toBinding encodeInjection,
-      toBinding encodeIntegerValue,
-      toBinding encodeListType,
-      toBinding encodeLiteralType,
-      toBinding encodeEitherType,
-      toBinding encodeForallType,
-      toBinding encodeMapType,
-      toBinding encodeOptionalType,
-      toBinding encodePairType,
-      toBinding encodeModule,
-      toBinding encodeName,
-      toBinding encodeNamespace,
-      toBinding encodeRecordType,
-      toBinding encodeSetType,
-      toBinding encodeType,
-      toBinding encodeUnionType,
-      toBinding encodeWrappedType,
-      toBinding filterTypeBindings,
-      toBinding isEncodableBinding,
-      toBinding isUnitType_]
+      toTermDefinition encodeBinding,
+      toTermDefinition encodeBindingName,
+      toTermDefinition encodeEitherType,
+      toTermDefinition encodeFieldValue,
+      toTermDefinition encodeFloatValue,
+      toTermDefinition encodeForallType,
+      toTermDefinition encodeInjection,
+      toTermDefinition encodeIntegerValue,
+      toTermDefinition encodeListType,
+      toTermDefinition encodeLiteralType,
+      toTermDefinition encodeMapType,
+      toTermDefinition encodeModule,
+      toTermDefinition encodeName,
+      toTermDefinition encodeNamespace,
+      toTermDefinition encodeOptionalType,
+      toTermDefinition encodePairType,
+      toTermDefinition encodeRecordType,
+      toTermDefinition encodeRecordTypeNamed,
+      toTermDefinition encodeSetType,
+      toTermDefinition encodeType,
+      toTermDefinition encodeTypeNamed,
+      toTermDefinition encodeUnionType,
+      toTermDefinition encodeUnionTypeNamed,
+      toTermDefinition encodeWrappedType,
+      toTermDefinition encodeWrappedTypeNamed,
+      toTermDefinition encoderCollectForallVariables,
+      toTermDefinition encoderCollectOrdVars,
+      toTermDefinition encoderCollectTypeVarsFromType,
+      toTermDefinition encoderFullResultType,
+      toTermDefinition encoderFullResultTypeNamed,
+      toTermDefinition encoderType,
+      toTermDefinition encoderTypeNamed,
+      toTermDefinition encoderTypeScheme,
+      toTermDefinition encoderTypeSchemeNamed,
+      toTermDefinition filterTypeBindings,
+      toTermDefinition isEncodableBinding,
+      toTermDefinition isUnitType_,
+      toTermDefinition prependForallEncoders]
 
 define :: String -> TTerm x -> TBinding x
 define = definitionInModule module_
 
+-- | Bridge helper: format InContext DecodingError as a string
+formatDecodingError :: TTerm (InContext DecodingError -> String)
+formatDecodingError = "ic" ~> unwrap _DecodingError @@ Ctx.inContextObject (var "ic")
+
 -- | Encode a single type binding into an encoder binding
--- This decodes the term to a Type, then generates an encoder function
-encodeBinding :: TBinding (Binding -> Flow Graph Binding)
+-- This decodes the term to a Type, then generates an encoder function.
+-- Type variables that appear as Map keys or Set elements get Ord constraints
+-- via the encoder type scheme.
+encodeBinding :: TBinding (Context -> Graph -> Binding -> Either (InContext DecodingError) Binding)
 encodeBinding = define "encodeBinding" $
   doc "Transform a type binding into an encoder binding" $
-  "b" ~>
-    "cx" <<~ Monads.getState $
-    Flows.bind (Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ (Core.bindingTerm (var "b")))) (
+  "cx" ~> "graph" ~> "b" ~>
+    Eithers.bind (Ctx.withContext (var "cx") (decoderFor _Type @@ var "graph" @@ (Core.bindingTerm (var "b")))) (
       "typ" ~>
-      Flows.pure (Core.binding
+      right (Core.binding
         (encodeBindingName @@ (Core.bindingName (var "b")))
-        (encodeType @@ (var "typ"))
-        nothing))
+        (encodeTypeNamed @@ (Core.bindingName (var "b")) @@ (var "typ"))
+        (just (encoderTypeSchemeNamed @@ (Core.bindingName (var "b")) @@ var "typ"))))
 
 -- | Generate a fully qualified binding name for an encoder function from a type name
 -- For example, "hydra.core.Name" -> "hydra.encode.core.name"
@@ -140,6 +158,19 @@
       -- Local type: just decapitalize
       (Core.name (Formatting.decapitalize @@ (Names.localNameOf @@ (var "n"))))
 
+-- | Generate an encoder for an Either type
+-- Generates a case match over Left/Right variants
+encodeEitherType :: TBinding (EitherType -> Term)
+encodeEitherType = define "encodeEitherType" $
+  doc "Generate an encoder for an Either type" $
+  "et" ~>
+    DC.lambda "e" $
+      DC.injection _Term (DC.field _Term_either
+        (DC.primitiveEncoded _eithers_bimap
+          @@@ (encodeType @@ Core.eitherTypeLeft (var "et"))
+          @@@ (encodeType @@ Core.eitherTypeRight (var "et"))
+          @@@ DC.var "e"))
+
 -- | Generate the encoder term for a field value
 -- Creates a lambda that encodes the field value and wraps in an encoded union/injection
 encodeFieldValue :: TBinding (Name -> Name -> Type -> Term)
@@ -154,6 +185,36 @@
         (encodeInjection @@ var "typeName" @@ var "fieldName"
           @@ ((encodeType @@ var "fieldType") @@@ DC.var "y")))
 
+-- | Encode a float value based on its float type
+-- Wraps the value in the appropriate FloatValue variant as an injection
+encodeFloatValue :: TBinding (FloatType -> Term -> Term)
+encodeFloatValue = define "encodeFloatValue" $
+  doc "Encode a float value based on its float type" $
+  "floatType" ~> "valTerm" ~>
+    Core.termUnion $ Core.injection
+      (Core.nameLift _FloatValue)
+      (Core.field (floatTypeToFieldName @@ var "floatType") (var "valTerm"))
+  where
+    floatTypeToFieldName :: TTerm (FloatType -> Name)
+    floatTypeToFieldName = match _FloatType Nothing [
+      _FloatType_bigfloat>>: constant $ Core.nameLift _FloatValue_bigfloat,
+      _FloatType_float32>>:  constant $ Core.nameLift _FloatValue_float32,
+      _FloatType_float64>>:  constant $ Core.nameLift _FloatValue_float64]
+
+-- | Generate an encoder for a polymorphic (forall) type
+-- For a type like `forall a. T[a]`, generates a lambda that takes an encoder for `a`
+-- and returns an encoder for the body type `T[a]`
+encodeForallType :: TBinding (ForallType -> Term)
+encodeForallType = define "encodeForallType" $
+  doc "Generate an encoder for a polymorphic (forall) type" $
+  "ft" ~>
+    -- Generate a lambda that takes an encoder for the type parameter
+    Core.termFunction $ Core.functionLambda $
+      Core.lambda
+        (encodeBindingName @@ Core.forallTypeParameter (var "ft"))
+        nothing
+        (encodeType @@ Core.forallTypeBody (var "ft"))
+
 -- | Encode an Injection as a Term (produces a Record of type hydra.core.Injection)
 encodeInjection :: TBinding (Name -> Name -> Term -> Term)
 encodeInjection = define "encodeInjection" $
@@ -168,6 +229,38 @@
       DC.field _Field_name (encodeName @@ var "fname"),
       DC.field _Field_term (var "fterm")]
 
+-- | Encode an integer value based on its integer type
+-- Wraps the value in the appropriate IntegerValue variant as an injection
+encodeIntegerValue :: TBinding (IntegerType -> Term -> Term)
+encodeIntegerValue = define "encodeIntegerValue" $
+  doc "Encode an integer value based on its integer type" $
+  "intType" ~> "valTerm" ~>
+    Core.termUnion $ Core.injection
+      (Core.nameLift _IntegerValue)
+      (Core.field (intTypeToFieldName @@ var "intType") (var "valTerm"))
+  where
+    intTypeToFieldName :: TTerm (IntegerType -> Name)
+    intTypeToFieldName = match _IntegerType Nothing [
+      _IntegerType_bigint>>: constant $ Core.nameLift _IntegerValue_bigint,
+      _IntegerType_int8>>:   constant $ Core.nameLift _IntegerValue_int8,
+      _IntegerType_int16>>:  constant $ Core.nameLift _IntegerValue_int16,
+      _IntegerType_int32>>:  constant $ Core.nameLift _IntegerValue_int32,
+      _IntegerType_int64>>:  constant $ Core.nameLift _IntegerValue_int64,
+      _IntegerType_uint8>>:  constant $ Core.nameLift _IntegerValue_uint8,
+      _IntegerType_uint16>>: constant $ Core.nameLift _IntegerValue_uint16,
+      _IntegerType_uint32>>: constant $ Core.nameLift _IntegerValue_uint32,
+      _IntegerType_uint64>>: constant $ Core.nameLift _IntegerValue_uint64]
+
+-- | Generate an encoder for a list type
+-- Maps the element encoder over the list and wraps in Term.list
+encodeListType :: TBinding (Type -> Term)
+encodeListType = define "encodeListType" $
+  doc "Generate an encoder for a list type" $
+  "elemType" ~>
+    DC.lambda "xs" $
+      DC.injection _Term (DC.field _Term_list
+        (DC.primitiveEncoded _lists_map @@@ (encodeType @@ var "elemType") @@@ DC.var "xs"))
+
 -- | Generate an encoder for a literal type
 -- For literals, the input is a native Haskell value (e.g., String, Int32).
 -- We need to wrap it in encoded TermLiteral with the appropriate Literal constructor.
@@ -195,29 +288,55 @@
     -- Default: identity (should not be reached for well-formed types)
     identityEncoder = DC.lambda "x" $ DC.var "x"
 
+-- | Generate an encoder for a map type
+-- Encodes each key/value pair and wraps in Term.map
+encodeMapType :: TBinding (MapType -> Term)
+encodeMapType = define "encodeMapType" $
+  doc "Generate an encoder for a map type" $
+  "mt" ~>
+    DC.lambda "m" $
+      DC.injection _Term (DC.field _Term_map
+        (DC.primitiveEncoded _maps_bimap
+          @@@ (encodeType @@ Core.mapTypeKeys (var "mt"))
+          @@@ (encodeType @@ Core.mapTypeValues (var "mt"))
+          @@@ DC.var "m"))
+
 -- | Transform a type module into an encoder module
 -- Returns Nothing if the module has no encodable type definitions
-encodeModule :: TBinding (Module -> Flow Graph (Maybe Module))
+encodeModule :: TBinding (Context -> Graph -> Module -> Prelude.Either (InContext Error) (Maybe Module))
 encodeModule = define "encodeModule" $
   doc "Transform a type module into an encoder module" $
-  "mod" ~>
-    "typeBindings" <<~ (filterTypeBindings @@ (Module.moduleElements (var "mod"))) $
+  "cx" ~> "graph" ~> "mod" ~>
+    "typeBindings" <<~ (filterTypeBindings @@ var "cx" @@ var "graph" @@
+      (Maybes.cat $ Lists.map
+        ("d" ~> cases _Definition (var "d") (Just nothing) [
+          _Definition_type>>: "td" ~>
+            just (Annotations.typeElement @@ (Module.typeDefinitionName $ var "td") @@ (Module.typeDefinitionType $ var "td"))])
+        (Module.moduleDefinitions (var "mod")))) $
     Logic.ifElse (Lists.null (var "typeBindings"))
-      (Flows.pure nothing)
-      (Flows.bind (Flows.mapList encodeBinding (var "typeBindings")) (
-        "encodedBindings" ~>
-        -- The encoder module depends on encoder modules for the type dependencies
-        -- E.g., hydra.encode.module depends on hydra.encode.core
-        Flows.pure (just (Module.module_
+      (right nothing)
+      ("encodedBindings" <<~ Eithers.mapList ("b" ~>
+        Eithers.bimap
+          ("ic" ~> Ctx.inContext (Error.errorOther $ Error.otherError (unwrap _DecodingError @@ Ctx.inContextObject (var "ic"))) (Ctx.inContextContext (var "ic")))
+          ("x" ~> var "x")
+          (encodeBinding @@ var "cx" @@ var "graph" @@ var "b")) (var "typeBindings") $
+        -- The encoder module depends on encoder modules for both the type and term dependencies
+        -- E.g., hydra.encode.constraints depends on hydra.encode.core (type dep) and hydra.encode.query (term dep)
+        right (just (Module.module_
           (encodeNamespace @@ (Module.moduleNamespace (var "mod")))
-          (var "encodedBindings")
-          -- Transform each type dependency namespace to its encoder namespace
-          (primitive _lists_map @@ encodeNamespace @@ (Module.moduleTypeDependencies (var "mod")))
+          (Lists.map ("b" ~> Module.definitionTerm (Module.termDefinition
+            (Core.bindingName $ var "b") (Core.bindingTerm $ var "b")
+            (Core.bindingType $ var "b")))
+            (var "encodedBindings"))
+          -- Transform both type and term dependency namespaces to their encoder namespaces
+          (Lists.nub (Lists.concat2
+            (primitive _lists_map @@ encodeNamespace @@ (Module.moduleTypeDependencies (var "mod")))
+            (primitive _lists_map @@ encodeNamespace @@ (Module.moduleTermDependencies (var "mod")))))
           -- The encoder module depends on the original type module
           (list [Module.moduleNamespace (var "mod")])
           (just (Strings.cat $ list [
             string "Term encoders for ",
-            Module.unNamespace (Module.moduleNamespace (var "mod"))]))))))
+            Module.unNamespace (Module.moduleNamespace (var "mod"))])))))
 
 -- | Encode a Name as a Term (produces a wrapped term of type hydra.core.Name)
 encodeName :: TBinding (Name -> Term)
@@ -237,56 +356,82 @@
         Strings.intercalate (string ".")
           (Lists.tail (Strings.splitOn (string ".") (Module.unNamespace (var "ns"))))]))
 
+-- | Generate an encoder for an optional type
+-- Encodes the inner value if present and wraps in Term.optional
+encodeOptionalType :: TBinding (Type -> Term)
+encodeOptionalType = define "encodeOptionalType" $
+  doc "Generate an encoder for an optional type" $
+  "elemType" ~> DC.lambda "opt" $
+    DC.injection _Term (DC.field _Term_maybe
+      (DC.primitiveEncoded _maybes_map @@@ (encodeType @@ var "elemType") @@@ DC.var "opt"))
+
+-- | Generate an encoder for a pair type
+-- Encodes both elements and wraps in Term.pair
+encodePairType :: TBinding (PairType -> Term)
+encodePairType = define "encodePairType" $
+  doc "Generate an encoder for a pair type" $
+  "pt" ~> DC.lambda "p" $ DC.injection _Term $ DC.field _Term_pair $ DC.primitiveEncoded _pairs_bimap
+    @@@ (encodeType @@ Core.pairTypeFirst (var "pt"))
+    @@@ (encodeType @@ Core.pairTypeSecond (var "pt"))
+    @@@ DC.var "p"
+
+encodeRecordType :: TBinding ([FieldType] -> Term)
+encodeRecordType = define "encodeRecordType" $
+  doc "Generate an encoder for a record type (unnamed — should not be called directly)" $
+  "rt" ~> encodeRecordTypeNamed @@ Core.name (string "unknown") @@ var "rt"
+
 -- | Generate an encoder for a record type
 -- For records, project each field, encode it, and build an encoded record
-encodeRecordType :: TBinding (RowType -> Term)
-encodeRecordType = define "encodeRecordType" $
-  doc "Generate an encoder for a record type" $
-  "rt" ~>
+encodeRecordTypeNamed :: TBinding (Name -> [FieldType] -> Term)
+encodeRecordTypeNamed = define "encodeRecordTypeNamed" $
+  doc "Generate an encoder for a record type with the given element name" $
+  "ename" ~> "rt" ~>
     DC.lambda "x" $
       DC.injection _Term (DC.field _Term_record
         (DC.record _Record [
-          DC.field _Record_typeName (encodeName @@ Core.rowTypeTypeName (var "rt")),
+          DC.field _Record_typeName (encodeName @@ var "ename"),
           DC.field _Record_fields
-            (DC.list (primitive _lists_map @@ (encodeRecordField @@ var "rt") @@ Core.rowTypeFields (var "rt")))]))
+            (DC.list (primitive _lists_map @@ (encodeRecordFieldNamed @@ var "ename" @@ var "rt") @@ var "rt"))]))
   where
-    -- Helper to encode a single record field
-    -- Takes the record type name and a field type, produces an encoded Field term
-    encodeRecordField :: TTerm (RowType -> FieldType -> Term)
-    encodeRecordField =
-      "recType" ~> "ft" ~>
+    encodeRecordFieldNamed :: TTerm (Name -> [FieldType] -> FieldType -> Term)
+    encodeRecordFieldNamed =
+      "tname" ~> "recType" ~> "ft" ~>
         DC.record _Field [
           DC.field _Field_name (encodeName @@ Core.fieldTypeName (var "ft")),
           DC.field _Field_term
             ((encodeType @@ Core.fieldTypeType (var "ft"))
-              @@@ (projectField (Core.rowTypeTypeName (var "recType")) (Core.fieldTypeName (var "ft"))
+              @@@ (projectField (var "tname") (Core.fieldTypeName (var "ft"))
                     @@@ DC.var "x"))]
 
-    -- Helper to create a field projection term
     projectField typeName fieldName =
       Core.termFunction $ Core.functionElimination $ Core.eliminationRecord $
         Core.projection typeName fieldName
 
--- | Generate an encoder term for a given Type
--- This generates a function that encodes values of the type to Terms
+-- | Generate an encoder for a set type
+-- Encodes each element and wraps in Term.set
+encodeSetType :: TBinding (Type -> Term)
+encodeSetType = define "encodeSetType" $
+  doc "Generate an encoder for a set type" $
+  "elemType" ~> DC.lambda "s" $
+    DC.injection _Term (DC.field _Term_set
+      (DC.primitiveEncoded _sets_map @@@ (encodeType @@ var "elemType") @@@ DC.var "s"))
+
+
+-- | Generate an encoder term for a given Type (without element name context)
 encodeType :: TBinding (Type -> Term)
 encodeType = define "encodeType" $
   doc "Generate an encoder term for a Type" $
   match _Type (Just identityEncoder) [
     _Type_annotated>>: "at" ~>
-      -- Strip annotation and recurse
       encodeType @@ Core.annotatedTypeBody (var "at"),
     _Type_application>>: "appType" ~>
-      -- For type applications like (DataRow v), apply the function encoder to the argument encoder
       (encodeType @@ Core.applicationTypeFunction (var "appType"))
         @@@ (encodeType @@ Core.applicationTypeArgument (var "appType")),
     _Type_either>>: "et" ~>
       encodeEitherType @@ var "et",
     _Type_forall>>: "ft" ~>
       encodeForallType @@ var "ft",
-    _Type_function>>: constant $
-      -- For function types, use identity encoder since functions can't be serialized as data
-      identityEncoder,
+    _Type_function>>: constant identityEncoder,
     _Type_list>>: "elemType" ~>
       encodeListType @@ var "elemType",
     _Type_literal>>: "lt" ~>
@@ -306,67 +451,384 @@
     _Type_wrap>>: "wt" ~>
       encodeWrappedType @@ var "wt",
     _Type_unit>>: constant $
-      -- For unit type, return a lambda that ignores input and produces encoded unit term
       DC.lambda "_" $ DC.injection _Term (DC.field _Term_unit DC.unit),
+    _Type_void>>: constant $
+      DC.lambda "_" $ DC.injection _Term (DC.field _Term_unit DC.unit),
     _Type_variable>>: "typeName" ~>
-      -- For type variables (references to other types), generate a reference to that
-      -- type's encoder. Uses encodeBindingName which produces fully qualified names.
       Core.termVariable (encodeBindingName @@ var "typeName")]
   where
     identityEncoder = DC.lambda "x" $ DC.var "x"
 
--- | Generate an encoder for a union type (including enums)
--- Generates a case match over all variants
-encodeUnionType :: TBinding (RowType -> Term)
+-- | Generate an encoder term for a given Type, using the element name for record/union/wrap
+encodeTypeNamed :: TBinding (Name -> Type -> Term)
+encodeTypeNamed = define "encodeTypeNamed" $
+  doc "Generate an encoder term for a Type, with the element name for nominal types" $
+  "ename" ~> "typ" ~>
+  cases _Type (var "typ") (Just identityEncoder) [
+    _Type_annotated>>: "at" ~>
+      encodeTypeNamed @@ var "ename" @@ Core.annotatedTypeBody (var "at"),
+    _Type_application>>: "appType" ~>
+      (encodeType @@ Core.applicationTypeFunction (var "appType"))
+        @@@ (encodeType @@ Core.applicationTypeArgument (var "appType")),
+    _Type_either>>: "et" ~>
+      encodeEitherType @@ var "et",
+    _Type_forall>>: "ft" ~>
+      Core.termFunction $ Core.functionLambda $
+        Core.lambda (encodeBindingName @@ Core.forallTypeParameter (var "ft")) nothing
+          (encodeTypeNamed @@ var "ename" @@ Core.forallTypeBody (var "ft")),
+    _Type_function>>: constant identityEncoder,
+    _Type_list>>: "elemType" ~>
+      encodeListType @@ var "elemType",
+    _Type_literal>>: "lt" ~>
+      encodeLiteralType @@ var "lt",
+    _Type_map>>: "mt" ~>
+      encodeMapType @@ var "mt",
+    _Type_maybe>>: "elemType" ~>
+      encodeOptionalType @@ var "elemType",
+    _Type_pair>>: "pt" ~>
+      encodePairType @@ var "pt",
+    _Type_record>>: "rt" ~>
+      encodeRecordTypeNamed @@ var "ename" @@ var "rt",
+    _Type_set>>: "elemType" ~>
+      encodeSetType @@ var "elemType",
+    _Type_union>>: "rt" ~>
+      encodeUnionTypeNamed @@ var "ename" @@ var "rt",
+    _Type_wrap>>: "wt" ~>
+      encodeWrappedTypeNamed @@ var "ename" @@ var "wt",
+    _Type_unit>>: constant $
+      DC.lambda "_" $ DC.injection _Term (DC.field _Term_unit DC.unit),
+    _Type_void>>: constant $
+      DC.lambda "_" $ DC.injection _Term (DC.field _Term_unit DC.unit),
+    _Type_variable>>: "typeName" ~>
+      Core.termVariable (encodeBindingName @@ var "typeName")]
+  where
+    identityEncoder = DC.lambda "x" $ DC.var "x"
+
+-- | Generate an encoder for a union type (placeholder name)
+encodeUnionType :: TBinding ([FieldType] -> Term)
 encodeUnionType = define "encodeUnionType" $
-  doc "Generate an encoder for a union type" $
-  "rt" ~>
+  doc "Generate an encoder for a union type (placeholder name)" $
+  "rt" ~> encodeUnionTypeNamed @@ Core.name (string "unknown") @@ var "rt"
+
+-- | Generate an encoder for a union type with a given element name
+encodeUnionTypeNamed :: TBinding (Name -> [FieldType] -> Term)
+encodeUnionTypeNamed = define "encodeUnionTypeNamed" $
+  doc "Generate an encoder for a union type with the given element name" $
+  "ename" ~> "rt" ~>
     Core.termFunction $ Core.functionElimination $ Core.eliminationUnion $
       Core.caseStatement
-        (Core.rowTypeTypeName (var "rt"))
+        (var "ename")
         nothing
         (primitive _lists_map @@
           ("ft" ~> Core.field
             (Core.fieldTypeName (var "ft"))
             (encodeFieldValue
-              @@ Core.rowTypeTypeName (var "rt")
+              @@ var "ename"
               @@ Core.fieldTypeName (var "ft")
               @@ Core.fieldTypeType (var "ft")))
-          @@ Core.rowTypeFields (var "rt"))
+          @@ var "rt")
 
--- | Generate an encoder for a wrapped type
--- Unwraps the value, encodes it, and wraps in encoded TermWrap
-encodeWrappedType :: TBinding (WrappedType -> Term)
+-- | Generate an encoder for a wrapped type (placeholder name)
+encodeWrappedType :: TBinding (Type -> Term)
 encodeWrappedType = define "encodeWrappedType" $
-  doc "Generate an encoder for a wrapped type" $
-  "wt" ~>
+  doc "Generate an encoder for a wrapped type (placeholder name)" $
+  "wt" ~> encodeWrappedTypeNamed @@ Core.name (string "unknown") @@ var "wt"
+
+-- | Generate an encoder for a wrapped type with a given element name
+encodeWrappedTypeNamed :: TBinding (Name -> Type -> Term)
+encodeWrappedTypeNamed = define "encodeWrappedTypeNamed" $
+  doc "Generate an encoder for a wrapped type with the given element name" $
+  "ename" ~> "wt" ~>
     DC.lambda "x" $
       DC.injection _Term (DC.field _Term_wrap
         (DC.record _WrappedTerm [
-          DC.field _WrappedTerm_typeName (encodeName @@ Core.wrappedTypeTypeName (var "wt")),
+          DC.field _WrappedTerm_typeName (encodeName @@ var "ename"),
           DC.field _WrappedTerm_body
-            ((encodeType @@ Core.wrappedTypeBody (var "wt"))
-              @@@ (DC.unwrapDynamic (Core.wrappedTypeTypeName (var "wt")) @@@ DC.var "x"))]))
+            ((encodeType @@ var "wt")
+              @@@ (DC.unwrapDynamic (var "ename") @@@ DC.var "x"))]))
 
+-- | Collect forall type variables from a type
+encoderCollectForallVariables :: TBinding (Type -> [Name])
+encoderCollectForallVariables = define "encoderCollectForallVariables" $
+  doc "Collect forall type variable names from a type" $
+  "typ" ~>
+  cases _Type (var "typ") (Just $ list ([] :: [TTerm Name])) [
+    _Type_annotated>>: "at" ~>
+      encoderCollectForallVariables @@ (Core.annotatedTypeBody (var "at")),
+    _Type_forall>>: "ft" ~>
+      Lists.cons (Core.forallTypeParameter (var "ft"))
+        (encoderCollectForallVariables @@ Core.forallTypeBody (var "ft"))]
+
+-- | Collect type variables that need Ord constraints (from Map key and Set element positions)
+encoderCollectOrdVars :: TBinding (Type -> [Name])
+encoderCollectOrdVars = define "encoderCollectOrdVars" $
+  doc "Collect type variables needing Ord constraints" $
+  "typ" ~>
+  cases _Type (var "typ") (Just $ list ([] :: [TTerm Name])) [
+    _Type_annotated>>: "at" ~>
+      encoderCollectOrdVars @@ (Core.annotatedTypeBody (var "at")),
+    _Type_application>>: "appType" ~>
+      Lists.concat2
+        (encoderCollectOrdVars @@ Core.applicationTypeFunction (var "appType"))
+        (encoderCollectOrdVars @@ Core.applicationTypeArgument (var "appType")),
+    _Type_either>>: "et" ~>
+      Lists.concat2
+        (encoderCollectOrdVars @@ Core.eitherTypeLeft (var "et"))
+        (encoderCollectOrdVars @@ Core.eitherTypeRight (var "et")),
+    _Type_forall>>: "ft" ~>
+      encoderCollectOrdVars @@ Core.forallTypeBody (var "ft"),
+    _Type_list>>: "elemType" ~>
+      encoderCollectOrdVars @@ var "elemType",
+    -- For Map<K, V>, collect all type variables from K (they need Ord)
+    _Type_map>>: "mt" ~>
+      Lists.concat (list [
+        encoderCollectTypeVarsFromType @@ Core.mapTypeKeys (var "mt"),
+        encoderCollectOrdVars @@ Core.mapTypeKeys (var "mt"),
+        encoderCollectOrdVars @@ Core.mapTypeValues (var "mt")]),
+    _Type_maybe>>: "elemType" ~>
+      encoderCollectOrdVars @@ var "elemType",
+    _Type_pair>>: "pt" ~>
+      Lists.concat2
+        (encoderCollectOrdVars @@ Core.pairTypeFirst (var "pt"))
+        (encoderCollectOrdVars @@ Core.pairTypeSecond (var "pt")),
+    _Type_record>>: "rt" ~>
+      Lists.concat $ Lists.map
+        ("ft" ~> encoderCollectOrdVars @@ Core.fieldTypeType (var "ft"))
+        (var "rt"),
+    -- For Set<T>, collect all type variables from T (they all need Ord)
+    _Type_set>>: "elemType" ~>
+      Lists.concat2
+        (encoderCollectTypeVarsFromType @@ var "elemType")
+        (encoderCollectOrdVars @@ var "elemType"),
+    _Type_union>>: "rt" ~>
+      Lists.concat $ Lists.map
+        ("ft" ~> encoderCollectOrdVars @@ Core.fieldTypeType (var "ft"))
+        (var "rt"),
+    _Type_wrap>>: "wt" ~>
+      encoderCollectOrdVars @@ var "wt"]
+
+-- | Collect all type variables from a type expression
+encoderCollectTypeVarsFromType :: TBinding (Type -> [Name])
+encoderCollectTypeVarsFromType = define "encoderCollectTypeVarsFromType" $
+  doc "Collect all type variable names from a type expression" $
+  "typ" ~>
+  cases _Type (var "typ") (Just $ list ([] :: [TTerm Name])) [
+    _Type_annotated>>: "at" ~>
+      encoderCollectTypeVarsFromType @@ Core.annotatedTypeBody (var "at"),
+    _Type_application>>: "appType" ~>
+      Lists.concat2
+        (encoderCollectTypeVarsFromType @@ Core.applicationTypeFunction (var "appType"))
+        (encoderCollectTypeVarsFromType @@ Core.applicationTypeArgument (var "appType")),
+    _Type_forall>>: "ft" ~>
+      encoderCollectTypeVarsFromType @@ Core.forallTypeBody (var "ft"),
+    _Type_list>>: "elemType" ~>
+      encoderCollectTypeVarsFromType @@ var "elemType",
+    _Type_map>>: "mt" ~>
+      Lists.concat2
+        (encoderCollectTypeVarsFromType @@ Core.mapTypeKeys (var "mt"))
+        (encoderCollectTypeVarsFromType @@ Core.mapTypeValues (var "mt")),
+    _Type_maybe>>: "elemType" ~>
+      encoderCollectTypeVarsFromType @@ var "elemType",
+    _Type_pair>>: "pt" ~>
+      Lists.concat2
+        (encoderCollectTypeVarsFromType @@ Core.pairTypeFirst (var "pt"))
+        (encoderCollectTypeVarsFromType @@ Core.pairTypeSecond (var "pt")),
+    _Type_record>>: "rt" ~>
+      Lists.concat $ Lists.map
+        ("ft" ~> encoderCollectTypeVarsFromType @@ Core.fieldTypeType (var "ft"))
+        (var "rt"),
+    _Type_set>>: "elemType" ~>
+      encoderCollectTypeVarsFromType @@ var "elemType",
+    _Type_union>>: "rt" ~>
+      Lists.concat $ Lists.map
+        ("ft" ~> encoderCollectTypeVarsFromType @@ Core.fieldTypeType (var "ft"))
+        (var "rt"),
+    _Type_variable>>: "name" ~>
+      list [var "name"],
+    _Type_wrap>>: "wt" ~>
+      encoderCollectTypeVarsFromType @@ var "wt"]
+
+-- | Get the full result type for an encoder (the input type of the encoder function)
+-- Maps structural types to their nominal names, preserving type applications.
+encoderFullResultType :: TBinding (Type -> Type)
+encoderFullResultType = define "encoderFullResultType" $
+  doc "Get full result type for encoder input" $
+  "typ" ~>
+  cases _Type (var "typ") (Just $ Core.typeVariable (Core.nameLift _Term)) [
+    _Type_annotated>>: "at" ~>
+      encoderFullResultType @@ (Core.annotatedTypeBody (var "at")),
+    _Type_application>>: "appType" ~>
+      Core.typeApplication $ Core.applicationType
+        (encoderFullResultType @@ Core.applicationTypeFunction (var "appType"))
+        (Core.applicationTypeArgument (var "appType")),
+    _Type_either>>: "et" ~>
+      Core.typeEither $ Core.eitherType
+        (encoderFullResultType @@ Core.eitherTypeLeft (var "et"))
+        (encoderFullResultType @@ Core.eitherTypeRight (var "et")),
+    _Type_forall>>: "ft" ~>
+      Core.typeApplication $ Core.applicationType
+        (encoderFullResultType @@ Core.forallTypeBody (var "ft"))
+        (Core.typeVariable (Core.forallTypeParameter (var "ft"))),
+    _Type_list>>: "elemType" ~>
+      Core.typeList (encoderFullResultType @@ var "elemType"),
+    _Type_literal>>: "_" ~>
+      Core.typeVariable (Core.nameLift _Literal),
+    _Type_map>>: "mt" ~>
+      Core.typeMap $ Core.mapType
+        (encoderFullResultType @@ Core.mapTypeKeys (var "mt"))
+        (encoderFullResultType @@ Core.mapTypeValues (var "mt")),
+    _Type_maybe>>: "elemType" ~>
+      Core.typeMaybe (encoderFullResultType @@ var "elemType"),
+    _Type_pair>>: "pt" ~>
+      Core.typePair $ Core.pairType
+        (encoderFullResultType @@ Core.pairTypeFirst (var "pt"))
+        (encoderFullResultType @@ Core.pairTypeSecond (var "pt")),
+    _Type_record>>: constant (Core.typeVariable (Core.nameLift _Term)),
+    _Type_set>>: "elemType" ~>
+      Core.typeSet (encoderFullResultType @@ var "elemType"),
+    _Type_union>>: constant (Core.typeVariable (Core.nameLift _Term)),
+    _Type_unit>>: constant Core.typeUnit,
+    _Type_variable>>: "name" ~>
+      Core.typeVariable (var "name"),
+    _Type_void>>: constant Core.typeVoid,
+    _Type_wrap>>: constant (Core.typeVariable (Core.nameLift _Term))]
+
+-- | Get full result type for encoder input, with element name for nominal types
+encoderFullResultTypeNamed :: TBinding (Name -> Type -> Type)
+encoderFullResultTypeNamed = define "encoderFullResultTypeNamed" $
+  doc "Get full result type for encoder input, using element name for nominal types" $
+  "ename" ~> "typ" ~>
+  cases _Type (var "typ") (Just $ Core.typeVariable (Core.nameLift _Term)) [
+    _Type_annotated>>: "at" ~>
+      encoderFullResultTypeNamed @@ var "ename" @@ (Core.annotatedTypeBody (var "at")),
+    _Type_application>>: "appType" ~>
+      Core.typeApplication $ Core.applicationType
+        (encoderFullResultType @@ Core.applicationTypeFunction (var "appType"))
+        (Core.applicationTypeArgument (var "appType")),
+    _Type_either>>: "et" ~>
+      Core.typeEither $ Core.eitherType
+        (encoderFullResultType @@ Core.eitherTypeLeft (var "et"))
+        (encoderFullResultType @@ Core.eitherTypeRight (var "et")),
+    _Type_forall>>: "ft" ~>
+      Core.typeApplication $ Core.applicationType
+        (encoderFullResultTypeNamed @@ var "ename" @@ Core.forallTypeBody (var "ft"))
+        (Core.typeVariable (Core.forallTypeParameter (var "ft"))),
+    _Type_list>>: "elemType" ~>
+      Core.typeList (encoderFullResultType @@ var "elemType"),
+    _Type_literal>>: "_" ~>
+      Core.typeVariable (Core.nameLift _Literal),
+    _Type_map>>: "mt" ~>
+      Core.typeMap $ Core.mapType
+        (encoderFullResultType @@ Core.mapTypeKeys (var "mt"))
+        (encoderFullResultType @@ Core.mapTypeValues (var "mt")),
+    _Type_maybe>>: "elemType" ~>
+      Core.typeMaybe (encoderFullResultType @@ var "elemType"),
+    _Type_pair>>: "pt" ~>
+      Core.typePair $ Core.pairType
+        (encoderFullResultType @@ Core.pairTypeFirst (var "pt"))
+        (encoderFullResultType @@ Core.pairTypeSecond (var "pt")),
+    _Type_record>>: constant (Core.typeVariable (var "ename")),
+    _Type_set>>: "elemType" ~>
+      Core.typeSet (encoderFullResultType @@ var "elemType"),
+    _Type_union>>: constant (Core.typeVariable (var "ename")),
+    _Type_unit>>: constant Core.typeUnit,
+    _Type_variable>>: "name" ~>
+      Core.typeVariable (var "name"),
+    _Type_void>>: constant Core.typeVoid,
+    _Type_wrap>>: constant (Core.typeVariable (var "ename"))]
+
+encoderType :: TBinding (Type -> Type)
+encoderType = define "encoderType" $
+  doc "Build encoder function type" $
+  "typ" ~>
+  "resultType" <~ (encoderFullResultType @@ var "typ") $
+  "baseType" <~ (Core.typeFunction $ Core.functionType
+    (var "resultType")
+    (Core.typeVariable (Core.nameLift _Term))) $
+  prependForallEncoders @@ var "baseType" @@ var "typ"
+
+-- | Build the encoder function type for a given type
+-- For monomorphic types: InputType -> Term
+-- For polymorphic types: (a -> Term) -> ... -> InputType<a,...> -> Term
+encoderTypeNamed :: TBinding (Name -> Type -> Type)
+encoderTypeNamed = define "encoderTypeNamed" $
+  doc "Build encoder function type with element name for nominal types" $
+  "ename" ~> "typ" ~>
+  "resultType" <~ (encoderFullResultTypeNamed @@ var "ename" @@ var "typ") $
+  "baseType" <~ (Core.typeFunction $ Core.functionType
+    (var "resultType")
+    (Core.typeVariable (Core.nameLift _Term))) $
+  prependForallEncoders @@ var "baseType" @@ var "typ"
+
+encoderTypeScheme :: TBinding (Type -> TypeScheme)
+encoderTypeScheme = define "encoderTypeScheme" $
+  doc "Construct a TypeScheme for an encoder function from a source type" $
+  "typ" ~> lets [
+    -- Collect forall variables
+    "typeVars">: encoderCollectForallVariables @@ var "typ",
+
+    -- Build the encoder function type
+    "encoderFunType">: encoderType @@ var "typ",
+
+    -- Find Ord-constrained variables (those used as Map keys or Set elements)
+    "allOrdVars">: encoderCollectOrdVars @@ var "typ",
+    -- Filter to only actual forall-bound variables
+    "ordVars">: Lists.filter
+      ("v" ~> Lists.elem (var "v" :: TTerm Name) (var "typeVars" :: TTerm [Name]))
+      (var "allOrdVars"),
+
+    -- Build constraints map: {varName -> TypeVariableMetadata {classes = {ordering}}}
+    "constraints">:
+      Logic.ifElse (Lists.null (var "ordVars"))
+        nothing
+        (just $ Maps.fromList $ Lists.map
+          ("v" ~> pair (var "v") (Core.typeVariableMetadata $ Sets.singleton $ Core.nameLift _TypeClass_ordering))
+          (var "ordVars"))] $
+  Core.typeScheme (var "typeVars") (var "encoderFunType") (var "constraints")
+
+-- | Construct a TypeScheme for an encoder function from a source type definition.
+-- For a type like @forall v. Graph v@ (where Graph has Map v (Vertex v)),
+-- produces the scheme @forall v. (v -> Term) -> Graph v -> Term@ with Ord constraint on v.
+--
+-- The type scheme uses the same variable names as the original type definition.
+-- Variable normalization (to t0, t1, etc.) happens later in the pipeline and
+-- handles renaming both variables and constraint keys consistently.
+encoderTypeSchemeNamed :: TBinding (Name -> Type -> TypeScheme)
+encoderTypeSchemeNamed = define "encoderTypeSchemeNamed" $
+  doc "Construct a TypeScheme for an encoder function, with element name for nominal types" $
+  "ename" ~> "typ" ~> lets [
+    "typeVars">: encoderCollectForallVariables @@ var "typ",
+    "encoderFunType">: encoderTypeNamed @@ var "ename" @@ var "typ",
+    "allOrdVars">: encoderCollectOrdVars @@ var "typ",
+    "ordVars">: Lists.filter
+      ("v" ~> Lists.elem (var "v" :: TTerm Name) (var "typeVars" :: TTerm [Name]))
+      (var "allOrdVars"),
+    "constraints">:
+      Logic.ifElse (Lists.null (var "ordVars"))
+        nothing
+        (just $ Maps.fromList $ Lists.map
+          ("v" ~> pair (var "v") (Core.typeVariableMetadata $ Sets.singleton $ Core.nameLift _TypeClass_ordering))
+          (var "ordVars"))] $
+  Core.typeScheme (var "typeVars") (var "encoderFunType") (var "constraints")
+
 -- | Filter bindings to only encodable type definitions
 -- A binding is encodable if it is a native type AND is serializable (no function types in dependencies)
-filterTypeBindings :: TBinding ([Binding] -> Flow Graph [Binding])
+filterTypeBindings :: TBinding (Context -> Graph -> [Binding] -> Prelude.Either (InContext Error) [Binding])
 filterTypeBindings = define "filterTypeBindings" $
   doc "Filter bindings to only encodable type definitions" $
-  "bindings" ~>
+  "cx" ~> "graph" ~> "bindings" ~>
     -- First filter to native types, then check serializability for each
-    Flows.map (primitive _maybes_cat) $
-      Flows.mapList isEncodableBinding $
+    Eithers.map (primitive _maybes_cat) $
+      Eithers.mapList (isEncodableBinding @@ var "cx" @@ var "graph") $
         primitive _lists_filter @@ Annotations.isNativeType @@ var "bindings"
 
 -- | Check if a binding is encodable and return Just binding if so, Nothing otherwise
-isEncodableBinding :: TBinding (Binding -> Flow Graph (Maybe Binding))
+isEncodableBinding :: TBinding (Context -> Graph -> Binding -> Prelude.Either (InContext Error) (Maybe Binding))
 isEncodableBinding = define "isEncodableBinding" $
   doc "Check if a binding is encodable (serializable type)" $
-  "b" ~>
-    Flows.map
-      ("serializable" ~> Logic.ifElse (var "serializable") (just (var "b")) nothing)
-      (Schemas.isSerializableByName @@ (Core.bindingName (var "b")))
+  "cx" ~> "graph" ~> "b" ~>
+    "serializable" <<~ Schemas.isSerializableByName @@ var "cx" @@ var "graph" @@ (Core.bindingName (var "b")) $
+    right (Logic.ifElse (var "serializable") (just (var "b")) nothing)
 
 -- | Check whether a type is the unit type
 isUnitType_ :: TBinding (Type -> Bool)
@@ -375,118 +837,17 @@
   match _Type (Just $ false) [
     _Type_unit>>: constant true]
 
--- | Encode an integer value based on its integer type
--- Wraps the value in the appropriate IntegerValue variant as an injection
-encodeIntegerValue :: TBinding (IntegerType -> Term -> Term)
-encodeIntegerValue = define "encodeIntegerValue" $
-  doc "Encode an integer value based on its integer type" $
-  "intType" ~> "valTerm" ~>
-    Core.termUnion $ Core.injection
-      (Core.nameLift _IntegerValue)
-      (Core.field (intTypeToFieldName @@ var "intType") (var "valTerm"))
-  where
-    intTypeToFieldName :: TTerm (IntegerType -> Name)
-    intTypeToFieldName = match _IntegerType Nothing [
-      _IntegerType_bigint>>: constant $ Core.nameLift _IntegerValue_bigint,
-      _IntegerType_int8>>:   constant $ Core.nameLift _IntegerValue_int8,
-      _IntegerType_int16>>:  constant $ Core.nameLift _IntegerValue_int16,
-      _IntegerType_int32>>:  constant $ Core.nameLift _IntegerValue_int32,
-      _IntegerType_int64>>:  constant $ Core.nameLift _IntegerValue_int64,
-      _IntegerType_uint8>>:  constant $ Core.nameLift _IntegerValue_uint8,
-      _IntegerType_uint16>>: constant $ Core.nameLift _IntegerValue_uint16,
-      _IntegerType_uint32>>: constant $ Core.nameLift _IntegerValue_uint32,
-      _IntegerType_uint64>>: constant $ Core.nameLift _IntegerValue_uint64]
-
--- | Encode a float value based on its float type
--- Wraps the value in the appropriate FloatValue variant as an injection
-encodeFloatValue :: TBinding (FloatType -> Term -> Term)
-encodeFloatValue = define "encodeFloatValue" $
-  doc "Encode a float value based on its float type" $
-  "floatType" ~> "valTerm" ~>
-    Core.termUnion $ Core.injection
-      (Core.nameLift _FloatValue)
-      (Core.field (floatTypeToFieldName @@ var "floatType") (var "valTerm"))
-  where
-    floatTypeToFieldName :: TTerm (FloatType -> Name)
-    floatTypeToFieldName = match _FloatType Nothing [
-      _FloatType_bigfloat>>: constant $ Core.nameLift _FloatValue_bigfloat,
-      _FloatType_float32>>:  constant $ Core.nameLift _FloatValue_float32,
-      _FloatType_float64>>:  constant $ Core.nameLift _FloatValue_float64]
-
--- | Generate an encoder for a list type
--- Maps the element encoder over the list and wraps in Term.list
-encodeListType :: TBinding (Type -> Term)
-encodeListType = define "encodeListType" $
-  doc "Generate an encoder for a list type" $
-  "elemType" ~>
-    DC.lambda "xs" $
-      DC.injection _Term (DC.field _Term_list
-        (DC.primitiveEncoded _lists_map @@@ (encodeType @@ var "elemType") @@@ DC.var "xs"))
-
--- | Generate an encoder for a map type
--- Encodes each key/value pair and wraps in Term.map
-encodeMapType :: TBinding (MapType -> Term)
-encodeMapType = define "encodeMapType" $
-  doc "Generate an encoder for a map type" $
-  "mt" ~>
-    DC.lambda "m" $
-      DC.injection _Term (DC.field _Term_map
-        (DC.primitiveEncoded _maps_bimap
-          @@@ (encodeType @@ Core.mapTypeKeys (var "mt"))
-          @@@ (encodeType @@ Core.mapTypeValues (var "mt"))
-          @@@ DC.var "m"))
-
--- | Generate an encoder for an Either type
--- Generates a case match over Left/Right variants
-encodeEitherType :: TBinding (EitherType -> Term)
-encodeEitherType = define "encodeEitherType" $
-  doc "Generate an encoder for an Either type" $
-  "et" ~>
-    DC.lambda "e" $
-      DC.injection _Term (DC.field _Term_either
-        (DC.primitiveEncoded _eithers_bimap
-          @@@ (encodeType @@ Core.eitherTypeLeft (var "et"))
-          @@@ (encodeType @@ Core.eitherTypeRight (var "et"))
-          @@@ DC.var "e"))
-
--- | Generate an encoder for a polymorphic (forall) type
--- For a type like `forall a. T[a]`, generates a lambda that takes an encoder for `a`
--- and returns an encoder for the body type `T[a]`
-encodeForallType :: TBinding (ForallType -> Term)
-encodeForallType = define "encodeForallType" $
-  doc "Generate an encoder for a polymorphic (forall) type" $
-  "ft" ~>
-    -- Generate a lambda that takes an encoder for the type parameter
-    Core.termFunction $ Core.functionLambda $
-      Core.lambda
-        (encodeBindingName @@ Core.forallTypeParameter (var "ft"))
-        nothing
-        (encodeType @@ Core.forallTypeBody (var "ft"))
-
--- | Generate an encoder for an optional type
--- Encodes the inner value if present and wraps in Term.optional
-encodeOptionalType :: TBinding (Type -> Term)
-encodeOptionalType = define "encodeOptionalType" $
-  doc "Generate an encoder for an optional type" $
-  "elemType" ~> DC.lambda "opt" $
-    DC.injection _Term (DC.field _Term_maybe
-      (DC.primitiveEncoded _maybes_map @@@ (encodeType @@ var "elemType") @@@ DC.var "opt"))
-
--- | Generate an encoder for a pair type
--- Encodes both elements and wraps in Term.pair
-encodePairType :: TBinding (PairType -> Term)
-encodePairType = define "encodePairType" $
-  doc "Generate an encoder for a pair type" $
-  "pt" ~> DC.lambda "p" $ DC.injection _Term $ DC.field _Term_pair $ DC.primitiveEncoded _pairs_bimap
-    @@@ (encodeType @@ Core.pairTypeFirst (var "pt"))
-    @@@ (encodeType @@ Core.pairTypeSecond (var "pt"))
-    @@@ DC.var "p"
-
--- | Generate an encoder for a set type
--- Encodes each element and wraps in Term.set
-encodeSetType :: TBinding (Type -> Term)
-encodeSetType = define "encodeSetType" $
-  doc "Generate an encoder for a set type" $
-  "elemType" ~> DC.lambda "s" $
-    DC.injection _Term (DC.field _Term_set
-      (DC.primitiveEncoded _sets_map @@@ (encodeType @@ var "elemType") @@@ DC.var "s"))
+-- | Prepend encoder types for forall parameters
+-- For forall a. T: prepends (a -> Term) -> to the base type
+prependForallEncoders :: TBinding (Type -> Type -> Type)
+prependForallEncoders = define "prependForallEncoders" $
+  doc "Prepend encoder types for forall parameters to base type" $
+  "baseType" ~> "typ" ~> cases _Type (var "typ") (Just $ var "baseType") [
+    _Type_annotated>>: "at" ~>
+      prependForallEncoders @@ var "baseType" @@ Core.annotatedTypeBody (var "at"),
+    _Type_forall>>: "ft" ~>
+      Core.typeFunction $ Core.functionType
+        (Core.typeFunction $ Core.functionType
+          (Core.typeVariable (Core.forallTypeParameter (var "ft")))
+          (Core.typeVariable (Core.nameLift _Term)))
+        (prependForallEncoders @@ var "baseType" @@ Core.forallTypeBody (var "ft"))]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Core.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Core.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Core.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Core.hs
@@ -3,858 +3,761 @@
 -- Standard imports for kernel terms modules (slightly modified for conflict avoidance)
 import Hydra.Kernel hiding (lambdaBody, map, setType)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms hiding (
-  bigfloat, bigint, binary, boolean, cases, field, float32, float64, floatValue, injection, int8, int16, int32, int64,
-  integerValue, lambda, list, literal, map, pair, set, record, string, unit, wrap, uint8, uint16, uint32, uint64)
-import qualified Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++), map)
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
-import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
-
-
-ns :: Namespace
-ns = Namespace "hydra.extract.core"
-
-module_ :: Module
-module_ = Module ns elements
-    [Monads.ns, Lexical.ns, Rewriting.ns, ShowCore.ns]
-    kernelTypesNamespaces $
-    Just ("Extraction and validation for hydra.core types")
-  where
-   elements = [
-     toBinding bigfloat,
-     toBinding bigfloatValue,
-     toBinding bigint,
-     toBinding bigintValue,
-     toBinding binary,
-     toBinding binaryLiteral,
-     toBinding boolean,
-     toBinding booleanLiteral,
-     toBinding caseField,
-     toBinding cases,
-     toBinding field,
-     toBinding float32,
-     toBinding float32Value,
-     toBinding float64,
-     toBinding float64Value,
-     toBinding floatLiteral,
-     toBinding floatValue,
-     toBinding eitherTerm,
-     toBinding eitherType,
-     toBinding functionType,
-     toBinding injection,
-     toBinding int16,
-     toBinding int16Value,
-     toBinding int32,
-     toBinding int32Value,
-     toBinding int64,
-     toBinding int64Value,
-     toBinding int8,
-     toBinding int8Value,
-     toBinding integerLiteral,
-     toBinding integerValue,
-     toBinding lambdaBody,
-     toBinding lambda,
-     toBinding letBinding,
-     toBinding let_,
-     toBinding list,
-     toBinding listHead,
-     toBinding listOf,
-     toBinding listType,
-     toBinding literal,
-     toBinding map,
-     toBinding mapType,
-     toBinding nArgs,
-     toBinding maybeTerm,
-     toBinding maybeType,
-     toBinding pair,
-     toBinding record,
-     toBinding recordType,
-     toBinding set,
-     toBinding setOf,
-     toBinding setType,
-     toBinding string,
-     toBinding stringLiteral,
-     toBinding termRecord,
-     toBinding uint16,
-     toBinding uint16Value,
-     toBinding uint32,
-     toBinding uint32Value,
-     toBinding uint64,
-     toBinding uint64Value,
-     toBinding uint8,
-     toBinding uint8Value,
-     toBinding unionType,
-     toBinding unit,
-     toBinding unitVariant,
-     toBinding wrap,
-     toBinding wrappedType]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-bigfloat :: TBinding (Term -> Flow Graph Double)
-bigfloat = define "bigfloat" $
-  doc "Extract an arbitrary-precision floating-point value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "f" <<~ floatLiteral @@ var "l" $
-  bigfloatValue @@ var "f"
-
-bigfloatValue :: TBinding (FloatValue -> Flow Graph Double)
-bigfloatValue = define "bigfloatValue" $
-  doc "Extract a bigfloat value from a FloatValue" $
-  "v" ~> Phantoms.cases _FloatValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("bigfloat")
-      @@ (ShowCore.floatValue @@ var "v"))) [
-    _FloatValue_bigfloat>>: "f" ~> Flows.pure (var "f")]
-
-bigint :: TBinding (Term -> Flow Graph Integer)
-bigint = define "bigint" $
-  doc "Extract an arbitrary-precision integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  bigintValue @@ var "i"
-
-bigintValue :: TBinding (IntegerValue -> Flow Graph Integer)
-bigintValue = define "bigintValue" $
-  doc "Extract a bigint value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("bigint")
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_bigint>>: "i" ~> Flows.pure (var "i")]
-
-binary :: TBinding (Term -> Flow Graph String)
-binary = define "binary" $
-  doc "Extract a binary data value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  binaryLiteral @@ var "l"
-
-binaryLiteral :: TBinding (Literal -> Flow Graph String)
-binaryLiteral = define "binaryLiteral" $
-  doc "Extract a binary literal from a Literal value" $
-  "v" ~> Phantoms.cases _Literal (var "v")
-    (Just (Monads.unexpected
-      @@ ("binary")
-      @@ (ShowCore.literal @@ var "v"))) [
-    _Literal_binary>>: "b" ~> Flows.pure (var "b")]
-
-boolean :: TBinding (Term -> Flow Graph Bool)
-boolean = define "boolean" $
-  doc "Extract a boolean value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  booleanLiteral @@ var "l"
-
-booleanLiteral :: TBinding (Literal -> Flow Graph Bool)
-booleanLiteral = define "booleanLiteral" $
-  doc "Extract a boolean literal from a Literal value" $
-  "v" ~> Phantoms.cases _Literal (var "v")
-    (Just (Monads.unexpected
-      @@ ("boolean")
-      @@ (ShowCore.literal @@ var "v"))) [
-    _Literal_boolean>>: "b" ~> Flows.pure (var "b")]
-
--- TODO: nonstandard; move me
-caseField :: TBinding (Name -> String -> Term -> Flow Graph Field)
-caseField = define "caseField" $
-  doc "Extract a specific case handler from a case statement term" $
-  "name" ~> "n" ~> "term" ~>
-  "fieldName" <~ Core.name (var "n") $
-  "cs" <<~ cases @@ var "name" @@ var "term" $
-  "matching" <~ Lists.filter
-    ("f" ~> Core.equalName_ (Core.fieldName (var "f")) (var "fieldName"))
-    (Core.caseStatementCases (var "cs")) $
-  Logic.ifElse (Lists.null (var "matching"))
-    (Flows.fail ("not enough cases"))
-    (Flows.pure (Lists.head (var "matching")))
-
--- TODO: nonstandard; move me
-cases :: TBinding (Name -> Term -> Flow Graph CaseStatement)
-cases = define "cases" $
-  doc "Extract case statement from a term" $
-  "name" ~> "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ ("case statement")
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_function>>: "function" ~> Phantoms.cases _Function (var "function")
-      (Just (Monads.unexpected
-        @@ ("case statement")
-        @@ (ShowCore.term @@ var "term"))) [
-      _Function_elimination>>: "elimination" ~> Phantoms.cases _Elimination (var "elimination")
-        (Just (Monads.unexpected
-          @@ ("case statement")
-          @@ (ShowCore.term @@ var "term"))) [
-        _Elimination_union>>: "cs" ~>
-          Logic.ifElse (Core.equalName_ (Core.caseStatementTypeName (var "cs")) (var "name"))
-            (Flows.pure (var "cs"))
-            (Monads.unexpected
-              @@ (("case statement for type ") ++ (Core.unName (var "name")))
-              @@ (ShowCore.term @@ var "term"))]]]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
--- TODO: nonstandard; move me
-field :: TBinding (Name -> (Term -> Flow Graph x) -> [Field] -> Flow Graph x)
-field = define "field" $
-  doc "Extract a field value from a list of fields" $
-  "fname" ~> "mapping" ~> "fields" ~>
-  "matchingFields" <~ Lists.filter
-    ("f" ~> Core.equalName_ (Core.fieldName (var "f")) (var "fname"))
-    (var "fields") $
-  Logic.ifElse (Lists.null (var "matchingFields"))
-    (Flows.fail (("field ") ++ (Core.unName (var "fname")) ++ (" not found")))
-    (Logic.ifElse (Equality.equal (Lists.length (var "matchingFields")) $ Phantoms.int32 1)
-      ("stripped" <<~ Lexical.stripAndDereferenceTerm @@ (Core.fieldTerm (Lists.head (var "matchingFields"))) $
-       var "mapping" @@ var "stripped")
-      (Flows.fail (("multiple fields named ") ++ (Core.unName (var "fname")))))
-
-float32 :: TBinding (Term -> Flow Graph Float)
-float32 = define "float32" $
-  doc "Extract a 32-bit floating-point value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "f" <<~ floatLiteral @@ var "l" $
-  float32Value @@ var "f"
-
-float32Value :: TBinding (FloatValue -> Flow Graph Float)
-float32Value = define "float32Value" $
-  doc "Extract a float32 value from a FloatValue" $
-  "v" ~> Phantoms.cases _FloatValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("float32")
-      @@ (ShowCore.floatValue @@ var "v"))) [
-    _FloatValue_float32>>: "f" ~> Flows.pure (var "f")]
-
-float64 :: TBinding (Term -> Flow Graph Double)
-float64 = define "float64" $
-  doc "Extract a 64-bit floating-point value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "f" <<~ floatLiteral @@ var "l" $
-  float64Value @@ var "f"
-
-float64Value :: TBinding (FloatValue -> Flow Graph Double)
-float64Value = define "float64Value" $
-  doc "Extract a float64 value from a FloatValue" $
-  "v" ~> Phantoms.cases _FloatValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("float64")
-      @@ (ShowCore.floatValue @@ var "v"))) [
-    _FloatValue_float64>>: "f" ~> Flows.pure (var "f")]
-
-floatLiteral :: TBinding (Literal -> Flow Graph FloatValue)
-floatLiteral = define "floatLiteral" $
-  doc "Extract a floating-point literal from a Literal value" $
-  "lit" ~> Phantoms.cases _Literal (var "lit")
-    (Just (Monads.unexpected
-      @@ ("floating-point value")
-      @@ (ShowCore.literal @@ var "lit"))) [
-    _Literal_float>>: "v" ~> Flows.pure (var "v")]
-
-floatValue :: TBinding (Term -> Flow Graph FloatValue)
-floatValue = define "floatValue" $
-  doc "Extract a float value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  floatLiteral @@ var "l"
-
-eitherTerm :: TBinding ((Term -> Flow Graph x) -> (Term -> Flow Graph y) -> Term -> Flow Graph (Either x y))
-eitherTerm = define "eitherTerm" $
-  doc "Extract an either value from a term, applying functions to the left and right values" $
-  "leftFun" ~> "rightFun" ~> "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ ("either value")
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_either>>: "et" ~> Eithers.either_
-      ("l" ~> Flows.map (unaryFunction left) (var "leftFun" @@ var "l"))
-      ("r" ~> Flows.map (unaryFunction right) (var "rightFun" @@ var "r"))
-      (var "et")]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
-eitherType :: TBinding (Type -> Flow s EitherType)
-eitherType = define "eitherType" $
-  doc "Extract the left and right types from an either type" $
-  "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ ("either type")
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_either>>: "et" ~> Flows.pure (var "et")]
-
-functionType :: TBinding (Type -> Flow s FunctionType)
-functionType = define "functionType" $
-  doc "Extract a function type from a type" $
-  "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ ("function type")
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_function>>: "ft" ~> Flows.pure (var "ft")]
-
--- TODO: nonstandard; move me
-injection :: TBinding (Name -> Term -> Flow Graph Field)
-injection = define "injection" $
-  doc "Extract a field from a union term" $
-  "expected" ~> "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ ("injection")
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_union>>: "injection" ~>
-      Logic.ifElse (Core.equalName_ (Core.injectionTypeName (var "injection")) (var "expected"))
-        (Flows.pure (Core.injectionField (var "injection")))
-        (Monads.unexpected
-          @@ (("injection of type ") ++ (Core.unName (var "expected")))
-          @@ (Core.unName (Core.injectionTypeName (var "injection"))))]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
-int16 :: TBinding (Term -> Flow Graph I.Int16)
-int16 = define "int16" $
-  doc "Extract a 16-bit signed integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  int16Value @@ var "i"
-
-int16Value :: TBinding (IntegerValue -> Flow Graph I.Int16)
-int16Value = define "int16Value" $
-  doc "Extract an int16 value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("int16")
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_int16>>: "i" ~> Flows.pure (var "i")]
-
-int32 :: TBinding (Term -> Flow Graph Int)
-int32 = define "int32" $
-  doc "Extract a 32-bit signed integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  int32Value @@ var "i"
-
-int32Value :: TBinding (IntegerValue -> Flow Graph Int)
-int32Value = define "int32Value" $
-  doc "Extract an int32 value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ "int32"
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_int32>>: "i" ~> Flows.pure (var "i")]
-
-int64 :: TBinding (Term -> Flow Graph I.Int64)
-int64 = define "int64" $
-  doc "Extract a 64-bit signed integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  int64Value @@ var "i"
-
-int64Value :: TBinding (IntegerValue -> Flow Graph I.Int64)
-int64Value = define "int64Value" $
-  doc "Extract an int64 value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("int64")
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_int64>>: "i" ~> Flows.pure (var "i")]
-
-int8 :: TBinding (Term -> Flow Graph I.Int8)
-int8 = define "int8" $
-  doc "Extract an 8-bit signed integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  int8Value @@ var "i"
-
-int8Value :: TBinding (IntegerValue -> Flow Graph I.Int8)
-int8Value = define "int8Value" $
-  doc "Extract an int8 value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("int8")
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_int8>>: "i" ~> Flows.pure (var "i")]
-
-integerLiteral :: TBinding (Literal -> Flow Graph IntegerValue)
-integerLiteral = define "integerLiteral" $
-  doc "Extract an integer literal from a Literal value" $
-  "lit" ~> Phantoms.cases _Literal (var "lit")
-    (Just (Monads.unexpected
-      @@ ("integer value")
-      @@ (ShowCore.literal @@ var "lit"))) [
-    _Literal_integer>>: "v" ~> Flows.pure (var "v")]
-
-integerValue :: TBinding (Term -> Flow Graph IntegerValue)
-integerValue = define "integerValue" $
-  doc "Extract an integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  integerLiteral @@ var "l"
-
-lambdaBody :: TBinding (Term -> Flow Graph Term)
-lambdaBody = define "lambdaBody" $
-  doc "Extract the body of a lambda term" $
-  "term" ~> Flows.map (unaryFunction Core.lambdaBody) (lambda @@ var "term")
-
-lambda :: TBinding (Term -> Flow Graph Lambda)
-lambda = define "lambda" $
-  doc "Extract a lambda from a term" $
-  "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ "lambda"
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_function>>: "function" ~> Phantoms.cases _Function (var "function")
-      (Just (Monads.unexpected
-        @@ ("lambda")
-        @@ (ShowCore.term @@ var "term"))) [
-      _Function_lambda>>: "l" ~> Flows.pure (var "l")]]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
--- TODO: nonstandard; move me
-letBinding :: TBinding (String -> Term -> Flow Graph Term)
-letBinding = define "letBinding" $
-  doc "Extract a binding with the given name from a let term" $
-  "n" ~> "term" ~>
-  "name" <~ Core.name (var "n") $
-  "letExpr" <<~ let_ @@ var "term" $
-  "matchingBindings" <~ Lists.filter
-    ("b" ~> Core.equalName_ (Core.bindingName (var "b")) (var "name"))
-    (Core.letBindings (var "letExpr")) $
-  Logic.ifElse (Lists.null (var "matchingBindings"))
-    (Flows.fail (("no such binding: ") ++ var "n"))
-    (Logic.ifElse (Equality.equal (Lists.length (var "matchingBindings")) $ Phantoms.int32 1)
-      (Flows.pure (Core.bindingTerm (Lists.head (var "matchingBindings"))))
-      (Flows.fail (("multiple bindings named ") ++ var "n")))
-
-let_ :: TBinding (Term -> Flow Graph Let)
-let_ = define "let" $
-  doc "Extract a let expression from a term" $
-  "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ ("let term")
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_let>>: "lt" ~> Flows.pure (var "lt")]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
-list :: TBinding (Term -> Flow Graph [Term])
-list = define "list" $
-  doc "Extract a list of terms from a term" $
-  "term" ~>
-  "extract" <~ ("stripped" ~> Phantoms.cases _Term (var "stripped")
-    (Just (Monads.unexpected
-      @@ "list"
-      @@ (ShowCore.term @@ var "stripped"))) [
-    _Term_list>>: "l" ~> produce (var "l")]) $
-  "stripped" <<~ Lexical.stripAndDereferenceTerm @@ var "term" $
-  var "extract" @@ var "stripped"
-
-listHead :: TBinding (Term -> Flow Graph Term)
-listHead = define "listHead" $
-  doc "Extract the first element of a list term" $
-  "term" ~>
-  "l" <<~ list @@ var "term" $
-  Logic.ifElse (Lists.null (var "l"))
-    (Flows.fail "empty list")
-    (Flows.pure (Lists.head (var "l")))
-
-listOf :: TBinding ((Term -> Flow Graph x) -> Term -> Flow Graph [x])
-listOf = define "listOf" $
-  doc "Extract a list of values from a term, mapping a function over each element" $
-  "f" ~> "term" ~>
-  "els" <<~ list @@ var "term" $
-  Flows.mapList (var "f") (var "els")
-
-listType :: TBinding (Type -> Flow s Type)
-listType = define "listType" $
-  doc "Extract the element type from a list type" $
-  "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ ("list type")
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_list>>: "t" ~> Flows.pure (var "t")]
-
-literal :: TBinding (Term -> Flow Graph Literal)
-literal = define "literal" $
-  doc "Extract a literal value from a term" $
-  "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ ("literal")
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_literal>>: "lit" ~> Flows.pure (var "lit")]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
-map :: TBinding ((Term -> Flow Graph k) -> (Term -> Flow Graph v) -> Term -> Flow Graph (M.Map k v))
-map = define "map" $
-  doc "Extract a map of key-value pairs from a term, mapping functions over each key and value" $
-  "fk" ~> "fv" ~> "term0" ~>
-  "pair" <~ ("kvPair" ~>
-    "kterm" <~ Pairs.first (var "kvPair") $
-    "vterm" <~ Pairs.second (var "kvPair") $
-    "kval" <<~ var "fk" @@ var "kterm" $
-    "vval" <<~ var "fv" @@ var "vterm" $
-    produce (Phantoms.pair (var "kval") (var "vval"))) $
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ "map"
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_map>>: "m" ~> Flows.map (unaryFunction Maps.fromList) (Flows.mapList (var "pair") (Maps.toList (var "m")))]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
-mapType :: TBinding (Type -> Flow s MapType)
-mapType = define "mapType" $
-  doc "Extract the key and value types from a map type" $
-  "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ ("map type")
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_map>>: "mt" ~> Flows.pure (var "mt")]
-
--- TODO: nonstandard; move me
-nArgs :: TBinding (Name -> Int -> [a] -> Flow s ())
-nArgs = define "nArgs" $
-  doc "Ensure a function has the expected number of arguments" $
-  "name" ~> "n" ~> "args" ~>
-  Logic.ifElse (Equality.equal (Lists.length (var "args")) (var "n"))
-    (produce Phantoms.unit)
-    (Monads.unexpected @@ (Strings.concat [
-      Literals.showInt32 (var "n"),
-      Phantoms.string " arguments to primitive ",
-      Literals.showString (Core.unName (var "name"))]) @@ (Literals.showInt32 (Lists.length (var "args"))))
-
-maybeTerm :: TBinding ((Term -> Flow Graph x) -> Term -> Flow Graph (Maybe x))
-maybeTerm = define "maybeTerm" $
-  doc "Extract an optional value from a term, applying a function to the value if present" $
-  "f" ~> "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ ("maybe value")
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_maybe>>: "mt" ~> Maybes.maybe
-      (produce nothing)
-      ("t" ~> Flows.map (unaryFunction just) (var "f" @@ var "t"))
-      (var "mt")]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
-maybeType :: TBinding (Type -> Flow s Type)
-maybeType = define "maybeType" $
-  doc "Extract the base type from an optional type" $
-  "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ ("maybe type")
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_maybe>>: "t" ~> Flows.pure (var "t")]
-
-pair :: TBinding ((Term -> Flow Graph k) -> (Term -> Flow Graph v) -> Term -> Flow Graph (k, v))
-pair = define "pair" $
-  doc "Extract a pair of values from a term, applying functions to each component" $
-  "kf" ~> "vf" ~> "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ "pair"
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_pair>>: "p" ~>
-      "kVal" <<~ var "kf" @@ (Pairs.first $ var "p") $
-      "vVal" <<~ var "vf" @@ (Pairs.second $ var "p") $
-      produce (Phantoms.pair (var "kVal") (var "vVal"))]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
--- TODO: nonstandard; move me
-record :: TBinding (Name -> Term -> Flow Graph [Field])
-record = define "record" $
-  doc "Extract a record's fields from a term" $
-  "expected" ~> "term0" ~>
-  "record" <<~ termRecord @@ var "term0" $
-  Logic.ifElse (Equality.equal (Core.recordTypeName (var "record")) (var "expected"))
-    (Flows.pure (Core.recordFields (var "record")))
-    (Monads.unexpected
-      @@ (("record of type ") ++ (Core.unName (var "expected")))
-      @@ (Core.unName (Core.recordTypeName (var "record"))))
-
--- TODO: nonstandard; move me
-recordType :: TBinding (Name -> Type -> Flow s [FieldType])
-recordType = define "recordType" $
-  doc "Extract the field types from a record type" $
-  "ename" ~> "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ ("record type")
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_record>>: "rowType" ~>
-      Logic.ifElse (Core.equalName_ (Core.rowTypeTypeName (var "rowType")) (var "ename"))
-        (Flows.pure (Core.rowTypeFields (var "rowType")))
-        (Monads.unexpected
-          @@ (("record of type ") ++ (Core.unName (var "ename")))
-          @@ (("record of type ") ++ (Core.unName (Core.rowTypeTypeName (var "rowType")))))]
-
-set :: TBinding (Term -> Flow Graph (S.Set Term))
-set = define "set" $
-  doc "Extract a set of terms from a term" $
-  "term" ~>
-  "extract" <~ ("stripped" ~> Phantoms.cases _Term (var "stripped")
-    (Just $ Monads.unexpected
-      @@ "set"
-      @@ (ShowCore.term @@ var "stripped")) [
-    _Term_set>>: "s" ~> produce $ var "s"]) $
-  "stripped" <<~ Lexical.stripAndDereferenceTerm @@ var "term" $
-  var "extract" @@ var "stripped"
-
-setOf :: TBinding ((Term -> Flow Graph x) -> Term -> Flow Graph (S.Set x))
-setOf = define "setOf" $
-  doc "Extract a set of values from a term, mapping a function over each element" $
-  "f" ~> "term" ~>
-  "els" <<~ set @@ var "term" $
-  Flows.mapSet (var "f") (var "els")
-
-setType :: TBinding (Type -> Flow s Type)
-setType = define "setType" $
-  doc "Extract the element type from a set type" $
-  "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ "set type"
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_set>>: "t" ~> Flows.pure (var "t")]
-
-string :: TBinding (Term -> Flow Graph String)
-string = define "string" $
-  doc "Extract a string value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  stringLiteral @@ var "l"
-
-stringLiteral :: TBinding (Literal -> Flow Graph String)
-stringLiteral = define "stringLiteral" $
-  doc "Extract a string literal from a Literal value" $
-  "v" ~> Phantoms.cases _Literal (var "v")
-    (Just (Monads.unexpected
-      @@ ("string")
-      @@ (ShowCore.literal @@ var "v"))) [
-    _Literal_string>>: "s" ~> Flows.pure (var "s")]
-
-termRecord :: TBinding (Term -> Flow Graph Record)
-termRecord = define "termRecord" $
-  doc "Extract a record from a term" $
-  "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ ("record")
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_record>>: "record" ~> produce (var "record")]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
-uint16 :: TBinding (Term -> Flow Graph Int)
-uint16 = define "uint16" $
-  doc "Extract a 16-bit unsigned integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  uint16Value @@ var "i"
-
-uint16Value :: TBinding (IntegerValue -> Flow Graph Int)
-uint16Value = define "uint16Value" $
-  doc "Extract a uint16 value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("uint16")
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_uint16>>: "i" ~> Flows.pure (var "i")]
-
-uint32 :: TBinding (Term -> Flow Graph I.Int64)
-uint32 = define "uint32" $
-  doc "Extract a 32-bit unsigned integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  uint32Value @@ var "i"
-
-uint32Value :: TBinding (IntegerValue -> Flow Graph I.Int64)
-uint32Value = define "uint32Value" $
-  doc "Extract a uint32 value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("uint32")
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_uint32>>: "i" ~> Flows.pure (var "i")]
-
-uint64 :: TBinding (Term -> Flow Graph Integer)
-uint64 = define "uint64" $
-  doc "Extract a 64-bit unsigned integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  uint64Value @@ var "i"
-
-uint64Value :: TBinding (IntegerValue -> Flow Graph Integer)
-uint64Value = define "uint64Value" $
-  doc "Extract a uint64 value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("uint64")
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_uint64>>: "i" ~> Flows.pure (var "i")]
-
-uint8 :: TBinding (Term -> Flow Graph I.Int16)
-uint8 = define "uint8" $
-  doc "Extract an 8-bit unsigned integer value from a term" $
-  "t" ~>
-  "l" <<~ literal @@ var "t" $
-  "i" <<~ integerLiteral @@ var "l" $
-  uint8Value @@ var "i"
-
-uint8Value :: TBinding (IntegerValue -> Flow Graph I.Int16)
-uint8Value = define "uint8Value" $
-  doc "Extract a uint8 value from an IntegerValue" $
-  "v" ~> Phantoms.cases _IntegerValue (var "v")
-    (Just (Monads.unexpected
-      @@ ("uint8")
-      @@ (ShowCore.integerValue @@ var "v"))) [
-    _IntegerValue_uint8>>: "i" ~> Flows.pure (var "i")]
-
--- TODO: nonstandard; move me
-unionType :: TBinding (Name -> Type -> Flow s [FieldType])
-unionType = define "unionType" $
-  doc "Extract the field types from a union type" $
-  "ename" ~> "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ ("union type")
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_union>>: "rowType" ~>
-      Logic.ifElse (Equality.equal (Core.rowTypeTypeName (var "rowType")) (var "ename"))
-        (Flows.pure (Core.rowTypeFields (var "rowType")))
-        (Monads.unexpected
-          @@ (("union of type ") ++ (Core.unName (var "ename")))
-          @@ (("union of type ") ++ (Core.unName (Core.rowTypeTypeName (var "rowType")))))]
-
-unit :: TBinding (Term -> Flow Graph ())
-unit = define "unit" $
-  doc "Extract a unit value from a term" $
-  "term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ "unit"
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_unit>>: constant (Flows.pure Phantoms.unit)]
-
-unitVariant :: TBinding (Name -> Term -> Flow Graph Name)
-unitVariant = define "unitVariant" $
-  doc "Extract a unit variant (a variant with an empty record value) from a union term" $
-  "tname" ~> "term" ~>
-  "field" <<~ injection @@ var "tname" @@ var "term" $
-  "ignored" <<~ unit @@ (Core.fieldTerm (var "field")) $
-  produce (Core.fieldName (var "field"))
-
--- TODO: nonstandard; move me
-wrap :: TBinding (Name -> Term -> Flow Graph Term)
-wrap = define "wrap" $
-  doc "Extract the wrapped value from a wrapped term" $
-  "expected" ~> "term0" ~>
-  "extract" <~ ("term" ~> Phantoms.cases _Term (var "term")
-    (Just (Monads.unexpected
-      @@ (("wrap(") ++ (Core.unName (var "expected")) ++ (")"))
-      @@ (ShowCore.term @@ var "term"))) [
-    _Term_wrap>>: "wrappedTerm" ~>
-      Logic.ifElse (Core.equalName_ (Core.wrappedTermTypeName (var "wrappedTerm")) (var "expected"))
-        (Flows.pure (Core.wrappedTermBody (var "wrappedTerm")))
-        (Monads.unexpected
-          @@ (("wrapper of type ") ++ (Core.unName (var "expected")))
-          @@ (Core.unName (Core.wrappedTermTypeName (var "wrappedTerm"))))]) $
-  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "term0" $
-  var "extract" @@ var "term"
-
--- TODO: nonstandard; move me
-wrappedType :: TBinding (Name -> Type -> Flow s Type)
-wrappedType = define "wrappedType" $
-  doc "Extract the wrapped type from a wrapper type" $
-  "ename" ~> "typ" ~>
-  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
-  Phantoms.cases _Type (var "stripped")
-    (Just (Monads.unexpected
-      @@ ("wrapped type")
-      @@ (ShowCore.type_ @@ var "typ"))) [
-    _Type_wrap>>: "wrappedType" ~>
-      Logic.ifElse (Core.equalName_ (Core.wrappedTypeTypeName (var "wrappedType")) (var "ename"))
-        (Flows.pure (Core.wrappedTypeBody (var "wrappedType")))
-        (Monads.unexpected
-          @@ (("wrapped type ") ++ (Core.unName (var "ename")))
-          @@ (("wrapped type ") ++ (Core.unName (Core.wrappedTypeTypeName (var "wrappedType")))))]
+import qualified Hydra.Dsl.Paths    as Paths
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Ast          as Ast
+import qualified Hydra.Dsl.Bootstrap         as Bootstrap
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Meta.Graph        as Graph
+import qualified Hydra.Dsl.Json.Model         as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Literals          as Literals
+import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base         as MetaBase
+import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
+import qualified Hydra.Dsl.Meta.Types        as MetaTypes
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
+import           Hydra.Dsl.Meta.Phantoms hiding (
+  bigfloat, bigint, binary, boolean, cases, field, float32, float64, floatValue, injection, int8, int16, int32, int64,
+  integerValue, lambda, list, literal, map, pair, set, record, string, unit, wrap, uint8, uint16, uint32, uint64)
+import qualified Hydra.Dsl.Meta.Phantoms     as Phantoms
+import qualified Hydra.Dsl.Prims             as Prims
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Testing      as Testing
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Tests             as Tests
+import qualified Hydra.Dsl.Topology     as Topology
+import qualified Hydra.Dsl.Types             as Types
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
+import qualified Hydra.Dsl.Meta.Variants     as Variants
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++), map)
+import qualified Data.Int                    as I
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+import qualified Data.Maybe                  as Y
+
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
+import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
+
+import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors as ShowError
+
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
+
+-- Helper for Either-based unexpected errors (replaces Monads.unexpected for migrated functions)
+unexpected :: TTerm Context -> TTerm String -> TTerm String -> TTerm (Prelude.Either (InContext Error) a)
+unexpected cx expected actual = Ctx.failInContext (Error.errorOther $ Error.otherError (Phantoms.string "expected " ++ expected ++ Phantoms.string " but found " ++ actual)) cx
+
+ns :: Namespace
+ns = Namespace "hydra.extract.core"
+
+module_ :: Module
+module_ = Module ns elements
+    [Lexical.ns, Rewriting.ns, ShowCore.ns, ShowError.ns]
+    kernelTypesNamespaces $
+    Just ("Extraction and validation for hydra.core types")
+  where
+   elements = [
+     toTermDefinition bigfloat,
+     toTermDefinition bigfloatValue,
+     toTermDefinition bigint,
+     toTermDefinition bigintValue,
+     toTermDefinition binary,
+     toTermDefinition binaryLiteral,
+     toTermDefinition boolean,
+     toTermDefinition booleanLiteral,
+     toTermDefinition caseField,
+     toTermDefinition cases,
+     toTermDefinition eitherTerm,
+     toTermDefinition eitherType,
+     toTermDefinition field,
+     toTermDefinition float32,
+     toTermDefinition float32Value,
+     toTermDefinition float64,
+     toTermDefinition float64Value,
+     toTermDefinition floatLiteral,
+     toTermDefinition floatValue,
+     toTermDefinition functionType,
+     toTermDefinition injection,
+     toTermDefinition int16,
+     toTermDefinition int16Value,
+     toTermDefinition int32,
+     toTermDefinition int32Value,
+     toTermDefinition int64,
+     toTermDefinition int64Value,
+     toTermDefinition int8,
+     toTermDefinition int8Value,
+     toTermDefinition integerLiteral,
+     toTermDefinition integerValue,
+     toTermDefinition lambda,
+     toTermDefinition lambdaBody,
+     toTermDefinition let_,
+     toTermDefinition letBinding,
+     toTermDefinition list,
+     toTermDefinition listHead,
+     toTermDefinition listOf,
+     toTermDefinition listType,
+     toTermDefinition literal,
+     toTermDefinition map,
+     toTermDefinition mapType,
+     toTermDefinition maybeTerm,
+     toTermDefinition maybeType,
+     toTermDefinition nArgs,
+     toTermDefinition pair,
+     toTermDefinition record,
+     toTermDefinition recordType,
+     toTermDefinition set,
+     toTermDefinition setOf,
+     toTermDefinition setType,
+     toTermDefinition string,
+     toTermDefinition stringLiteral,
+     toTermDefinition termRecord,
+     toTermDefinition uint16,
+     toTermDefinition uint16Value,
+     toTermDefinition uint32,
+     toTermDefinition uint32Value,
+     toTermDefinition uint64,
+     toTermDefinition uint64Value,
+     toTermDefinition uint8,
+     toTermDefinition uint8Value,
+     toTermDefinition unionType,
+     toTermDefinition unit,
+     toTermDefinition unitVariant,
+     toTermDefinition wrap,
+     toTermDefinition wrappedType]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+bigfloat :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Double)
+bigfloat = define "bigfloat" $
+  doc "Extract an arbitrary-precision floating-point value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "f" <<~ floatLiteral @@ var "cx" @@ var "l" $
+  bigfloatValue @@ var "cx" @@ var "f"
+
+bigfloatValue :: TBinding (Context -> FloatValue -> Prelude.Either (InContext Error) Double)
+bigfloatValue = define "bigfloatValue" $
+  doc "Extract a bigfloat value from a FloatValue" $
+  "cx" ~> "v" ~> Phantoms.cases _FloatValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "bigfloat") (ShowCore.floatValue @@ var "v"))) [
+    _FloatValue_bigfloat>>: "f" ~> right (var "f")]
+
+bigint :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Integer)
+bigint = define "bigint" $
+  doc "Extract an arbitrary-precision integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  bigintValue @@ var "cx" @@ var "i"
+
+bigintValue :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) Integer)
+bigintValue = define "bigintValue" $
+  doc "Extract a bigint value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "bigint") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_bigint>>: "i" ~> right (var "i")]
+
+binary :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) String)
+binary = define "binary" $
+  doc "Extract a binary data value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  binaryLiteral @@ var "cx" @@ var "l"
+
+binaryLiteral :: TBinding (Context -> Literal -> Prelude.Either (InContext Error) String)
+binaryLiteral = define "binaryLiteral" $
+  doc "Extract a binary literal from a Literal value" $
+  "cx" ~> "v" ~> Phantoms.cases _Literal (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "binary") (ShowCore.literal @@ var "v"))) [
+    _Literal_binary>>: "b" ~> right (var "b")]
+
+boolean :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Bool)
+boolean = define "boolean" $
+  doc "Extract a boolean value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  booleanLiteral @@ var "cx" @@ var "l"
+
+booleanLiteral :: TBinding (Context -> Literal -> Prelude.Either (InContext Error) Bool)
+booleanLiteral = define "booleanLiteral" $
+  doc "Extract a boolean literal from a Literal value" $
+  "cx" ~> "v" ~> Phantoms.cases _Literal (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "boolean") (ShowCore.literal @@ var "v"))) [
+    _Literal_boolean>>: "b" ~> right (var "b")]
+
+-- TODO: nonstandard; move me
+caseField :: TBinding (Context -> Name -> String -> Graph -> Term -> Prelude.Either (InContext Error) Field)
+caseField = define "caseField" $
+  doc "Extract a specific case handler from a case statement term" $
+  "cx" ~> "name" ~> "n" ~> "graph" ~> "term" ~>
+  "fieldName" <~ Core.name (var "n") $
+  "cs" <<~ cases @@ var "cx" @@ var "name" @@ var "graph" @@ var "term" $
+  "matching" <~ Lists.filter
+    ("f" ~> Core.equalName_ (Core.fieldName (var "f")) (var "fieldName"))
+    (Core.caseStatementCases (var "cs")) $
+  Logic.ifElse (Lists.null (var "matching"))
+    (Ctx.failInContext (Error.errorOther $ Error.otherError (Phantoms.string "not enough cases")) (var "cx"))
+    (right (Lists.head (var "matching")))
+
+-- TODO: nonstandard; move me
+cases :: TBinding (Context -> Name -> Graph -> Term -> Prelude.Either (InContext Error) CaseStatement)
+cases = define "cases" $
+  doc "Extract case statement from a term" $
+  "cx" ~> "name" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx") (Phantoms.string "case statement") (ShowCore.term @@ var "term"))) [
+    _Term_function>>: "function" ~> Phantoms.cases _Function (var "function")
+      (Just (unexpected (var "cx") (Phantoms.string "case statement") (ShowCore.term @@ var "term"))) [
+      _Function_elimination>>: "elimination" ~> Phantoms.cases _Elimination (var "elimination")
+        (Just (unexpected (var "cx") (Phantoms.string "case statement") (ShowCore.term @@ var "term"))) [
+        _Elimination_union>>: "cs" ~>
+          Logic.ifElse (Core.equalName_ (Core.caseStatementTypeName (var "cs")) (var "name"))
+            (right (var "cs"))
+            (unexpected (var "cx")
+              (Phantoms.string "case statement for type " ++ (Core.unName (var "name")))
+              (ShowCore.term @@ var "term"))]]]
+
+eitherTerm :: TBinding (Context -> (Term -> Prelude.Either (InContext Error) x) -> (Term -> Prelude.Either (InContext Error) y) -> Graph -> Term -> Prelude.Either (InContext Error) (Either x y))
+eitherTerm = define "eitherTerm" $
+  doc "Extract an either value from a term, applying functions to the left and right values" $
+  "cx" ~> "leftFun" ~> "rightFun" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx")
+      (Phantoms.string "either value")
+      (ShowCore.term @@ var "term"))) [
+    _Term_either>>: "et" ~> Eithers.either_
+      ("l" ~> Eithers.map (unaryFunction left) (var "leftFun" @@ var "l"))
+      ("r" ~> Eithers.map (unaryFunction right) (var "rightFun" @@ var "r"))
+      (var "et")]
+
+eitherType :: TBinding (Context -> Type -> Prelude.Either (InContext Error) EitherType)
+eitherType = define "eitherType" $
+  doc "Extract the left and right types from an either type" $
+  "cx" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "either type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_either>>: "et" ~> right (var "et")]
+
+-- TODO: nonstandard; move me
+field :: TBinding (Context -> Name -> (Term -> Prelude.Either (InContext Error) x) -> Graph -> [Field] -> Prelude.Either (InContext Error) x)
+field = define "field" $
+  doc "Extract a field value from a list of fields" $
+  "cx" ~> "fname" ~> "mapping" ~> "graph" ~> "fields" ~>
+  "matchingFields" <~ Lists.filter
+    ("f" ~> Core.equalName_ (Core.fieldName (var "f")) (var "fname"))
+    (var "fields") $
+  Logic.ifElse (Lists.null (var "matchingFields"))
+    (unexpected (var "cx") (Phantoms.string "field " ++ (Core.unName (var "fname"))) (Phantoms.string "no matching field"))
+    (Logic.ifElse (Equality.equal (Lists.length (var "matchingFields")) $ Phantoms.int32 1)
+      ("stripped" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ (Core.fieldTerm (Lists.head (var "matchingFields"))) $
+       var "mapping" @@ var "stripped")
+      (unexpected (var "cx") (Phantoms.string "single field") (Phantoms.string "multiple fields named " ++ (Core.unName (var "fname")))))
+
+float32 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Float)
+float32 = define "float32" $
+  doc "Extract a 32-bit floating-point value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "f" <<~ floatLiteral @@ var "cx" @@ var "l" $
+  float32Value @@ var "cx" @@ var "f"
+
+float32Value :: TBinding (Context -> FloatValue -> Prelude.Either (InContext Error) Float)
+float32Value = define "float32Value" $
+  doc "Extract a float32 value from a FloatValue" $
+  "cx" ~> "v" ~> Phantoms.cases _FloatValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "float32") (ShowCore.floatValue @@ var "v"))) [
+    _FloatValue_float32>>: "f" ~> right (var "f")]
+
+float64 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Double)
+float64 = define "float64" $
+  doc "Extract a 64-bit floating-point value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "f" <<~ floatLiteral @@ var "cx" @@ var "l" $
+  float64Value @@ var "cx" @@ var "f"
+
+float64Value :: TBinding (Context -> FloatValue -> Prelude.Either (InContext Error) Double)
+float64Value = define "float64Value" $
+  doc "Extract a float64 value from a FloatValue" $
+  "cx" ~> "v" ~> Phantoms.cases _FloatValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "float64") (ShowCore.floatValue @@ var "v"))) [
+    _FloatValue_float64>>: "f" ~> right (var "f")]
+
+floatLiteral :: TBinding (Context -> Literal -> Prelude.Either (InContext Error) FloatValue)
+floatLiteral = define "floatLiteral" $
+  doc "Extract a floating-point literal from a Literal value" $
+  "cx" ~> "lit" ~> Phantoms.cases _Literal (var "lit")
+    (Just (unexpected (var "cx") (Phantoms.string "floating-point value") (ShowCore.literal @@ var "lit"))) [
+    _Literal_float>>: "v" ~> right (var "v")]
+
+floatValue :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) FloatValue)
+floatValue = define "floatValue" $
+  doc "Extract a float value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  floatLiteral @@ var "cx" @@ var "l"
+
+functionType :: TBinding (Context -> Type -> Prelude.Either (InContext Error) FunctionType)
+functionType = define "functionType" $
+  doc "Extract a function type from a type" $
+  "cx" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "function type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_function>>: "ft" ~> right (var "ft")]
+
+-- TODO: nonstandard; move me
+injection :: TBinding (Context -> Name -> Graph -> Term -> Prelude.Either (InContext Error) Field)
+injection = define "injection" $
+  doc "Extract a field from a union term" $
+  "cx" ~> "expected" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx") (Phantoms.string "injection") (ShowCore.term @@ var "term"))) [
+    _Term_union>>: "injection" ~>
+      Logic.ifElse (Core.equalName_ (Core.injectionTypeName (var "injection")) (var "expected"))
+        (right (Core.injectionField (var "injection")))
+        (unexpected (var "cx")
+          (Phantoms.string "injection of type " ++ (Core.unName (var "expected")))
+          (Core.unName (Core.injectionTypeName (var "injection"))))]
+
+int16 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) I.Int16)
+int16 = define "int16" $
+  doc "Extract a 16-bit signed integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  int16Value @@ var "cx" @@ var "i"
+
+int16Value :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) I.Int16)
+int16Value = define "int16Value" $
+  doc "Extract an int16 value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "int16") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_int16>>: "i" ~> right (var "i")]
+
+int32 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Int)
+int32 = define "int32" $
+  doc "Extract a 32-bit signed integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  int32Value @@ var "cx" @@ var "i"
+
+int32Value :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) Int)
+int32Value = define "int32Value" $
+  doc "Extract an int32 value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "int32") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_int32>>: "i" ~> right (var "i")]
+
+int64 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) I.Int64)
+int64 = define "int64" $
+  doc "Extract a 64-bit signed integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  int64Value @@ var "cx" @@ var "i"
+
+int64Value :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) I.Int64)
+int64Value = define "int64Value" $
+  doc "Extract an int64 value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "int64") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_int64>>: "i" ~> right (var "i")]
+
+int8 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) I.Int8)
+int8 = define "int8" $
+  doc "Extract an 8-bit signed integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  int8Value @@ var "cx" @@ var "i"
+
+int8Value :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) I.Int8)
+int8Value = define "int8Value" $
+  doc "Extract an int8 value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "int8") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_int8>>: "i" ~> right (var "i")]
+
+integerLiteral :: TBinding (Context -> Literal -> Prelude.Either (InContext Error) IntegerValue)
+integerLiteral = define "integerLiteral" $
+  doc "Extract an integer literal from a Literal value" $
+  "cx" ~> "lit" ~> Phantoms.cases _Literal (var "lit")
+    (Just (unexpected (var "cx") (Phantoms.string "integer value") (ShowCore.literal @@ var "lit"))) [
+    _Literal_integer>>: "v" ~> right (var "v")]
+
+integerValue :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) IntegerValue)
+integerValue = define "integerValue" $
+  doc "Extract an integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  integerLiteral @@ var "cx" @@ var "l"
+
+lambda :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Lambda)
+lambda = define "lambda" $
+  doc "Extract a lambda from a term" $
+  "cx" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx") (Phantoms.string "lambda") (ShowCore.term @@ var "term"))) [
+    _Term_function>>: "function" ~> Phantoms.cases _Function (var "function")
+      (Just (unexpected (var "cx") (Phantoms.string "lambda") (ShowCore.term @@ var "term"))) [
+      _Function_lambda>>: "l" ~> right (var "l")]]
+
+lambdaBody :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Term)
+lambdaBody = define "lambdaBody" $
+  doc "Extract the body of a lambda term" $
+  "cx" ~> "graph" ~> "term" ~> Eithers.map (unaryFunction Core.lambdaBody) (lambda @@ var "cx" @@ var "graph" @@ var "term")
+
+let_ :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Let)
+let_ = define "let" $
+  doc "Extract a let expression from a term" $
+  "cx" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx") (Phantoms.string "let term") (ShowCore.term @@ var "term"))) [
+    _Term_let>>: "lt" ~> right (var "lt")]
+
+-- TODO: nonstandard; move me
+letBinding :: TBinding (Context -> String -> Graph -> Term -> Prelude.Either (InContext Error) Term)
+letBinding = define "letBinding" $
+  doc "Extract a binding with the given name from a let term" $
+  "cx" ~> "n" ~> "graph" ~> "term" ~>
+  "name" <~ Core.name (var "n") $
+  "letExpr" <<~ let_ @@ var "cx" @@ var "graph" @@ var "term" $
+  "matchingBindings" <~ Lists.filter
+    ("b" ~> Core.equalName_ (Core.bindingName (var "b")) (var "name"))
+    (Core.letBindings (var "letExpr")) $
+  Logic.ifElse (Lists.null (var "matchingBindings"))
+    (Ctx.failInContext (Error.errorOther $ Error.otherError (Phantoms.string "no such binding: " ++ var "n")) (var "cx"))
+    (Logic.ifElse (Equality.equal (Lists.length (var "matchingBindings")) $ Phantoms.int32 1)
+      (right (Core.bindingTerm (Lists.head (var "matchingBindings"))))
+      (Ctx.failInContext (Error.errorOther $ Error.otherError (Phantoms.string "multiple bindings named " ++ var "n")) (var "cx")))
+
+list :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) [Term])
+list = define "list" $
+  doc "Extract a list of terms from a term" $
+  "cx" ~> "graph" ~> "term" ~>
+  "stripped" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term" $
+  Phantoms.cases _Term (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "list") (ShowCore.term @@ var "stripped"))) [
+    _Term_list>>: "l" ~> right (var "l")]
+
+listHead :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Term)
+listHead = define "listHead" $
+  doc "Extract the first element of a list term" $
+  "cx" ~> "graph" ~> "term" ~>
+  "l" <<~ list @@ var "cx" @@ var "graph" @@ var "term" $
+  Logic.ifElse (Lists.null (var "l"))
+    (Ctx.failInContext (Error.errorOther $ Error.otherError (Phantoms.string "empty list")) (var "cx"))
+    (right (Lists.head (var "l")))
+
+listOf :: TBinding (Context -> (Term -> Prelude.Either (InContext Error) x) -> Graph -> Term -> Prelude.Either (InContext Error) [x])
+listOf = define "listOf" $
+  doc "Extract a list of values from a term, mapping a function over each element" $
+  "cx" ~> "f" ~> "graph" ~> "term" ~>
+  "els" <<~ list @@ var "cx" @@ var "graph" @@ var "term" $
+  Eithers.mapList (var "f") (var "els")
+
+listType :: TBinding (Context -> Type -> Prelude.Either (InContext Error) Type)
+listType = define "listType" $
+  doc "Extract the element type from a list type" $
+  "cx" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "list type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_list>>: "t" ~> right (var "t")]
+
+literal :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Literal)
+literal = define "literal" $
+  doc "Extract a literal value from a term" $
+  "cx" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx") (Phantoms.string "literal") (ShowCore.term @@ var "term"))) [
+    _Term_literal>>: "lit" ~> right (var "lit")]
+
+map :: TBinding (Context -> (Term -> Prelude.Either (InContext Error) k) -> (Term -> Prelude.Either (InContext Error) v) -> Graph -> Term -> Prelude.Either (InContext Error) (M.Map k v))
+map = define "map" $
+  doc "Extract a map of key-value pairs from a term, mapping functions over each key and value" $
+  "cx" ~> "fk" ~> "fv" ~> "graph" ~> "term0" ~>
+  "pair" <~ ("kvPair" ~>
+    "kterm" <~ Pairs.first (var "kvPair") $
+    "vterm" <~ Pairs.second (var "kvPair") $
+    "kval" <<~ var "fk" @@ var "kterm" $
+    "vval" <<~ var "fv" @@ var "vterm" $
+    right (Phantoms.pair (var "kval") (var "vval"))) $
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx")
+      (Phantoms.string "map")
+      (ShowCore.term @@ var "term"))) [
+    _Term_map>>: "m" ~> Eithers.map (unaryFunction Maps.fromList) (Eithers.mapList (var "pair") (Maps.toList (var "m")))]
+
+mapType :: TBinding (Context -> Type -> Prelude.Either (InContext Error) MapType)
+mapType = define "mapType" $
+  doc "Extract the key and value types from a map type" $
+  "cx" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "map type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_map>>: "mt" ~> right (var "mt")]
+
+maybeTerm :: TBinding (Context -> (Term -> Prelude.Either (InContext Error) x) -> Graph -> Term -> Prelude.Either (InContext Error) (Maybe x))
+maybeTerm = define "maybeTerm" $
+  doc "Extract an optional value from a term, applying a function to the value if present" $
+  "cx" ~> "f" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx")
+      (Phantoms.string "maybe value")
+      (ShowCore.term @@ var "term"))) [
+    _Term_maybe>>: "mt" ~> Maybes.maybe
+      (right nothing)
+      ("t" ~> Eithers.map (unaryFunction just) (var "f" @@ var "t"))
+      (var "mt")]
+
+maybeType :: TBinding (Context -> Type -> Prelude.Either (InContext Error) Type)
+maybeType = define "maybeType" $
+  doc "Extract the base type from an optional type" $
+  "cx" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "maybe type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_maybe>>: "t" ~> right (var "t")]
+
+-- TODO: nonstandard; move me
+nArgs :: TBinding (Context -> Name -> Int -> [a] -> Prelude.Either (InContext Error) ())
+nArgs = define "nArgs" $
+  doc "Ensure a function has the expected number of arguments" $
+  "cx" ~> "name" ~> "n" ~> "args" ~>
+  Logic.ifElse (Equality.equal (Lists.length (var "args")) (var "n"))
+    (right Phantoms.unit)
+    (unexpected (var "cx") (Strings.concat [
+      Literals.showInt32 (var "n"),
+      Phantoms.string " arguments to primitive ",
+      Literals.showString (Core.unName (var "name"))]) (Literals.showInt32 (Lists.length (var "args"))))
+
+pair :: TBinding (Context -> (Term -> Prelude.Either (InContext Error) k) -> (Term -> Prelude.Either (InContext Error) v) -> Graph -> Term -> Prelude.Either (InContext Error) (k, v))
+pair = define "pair" $
+  doc "Extract a pair of values from a term, applying functions to each component" $
+  "cx" ~> "kf" ~> "vf" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx")
+      (Phantoms.string "pair")
+      (ShowCore.term @@ var "term"))) [
+    _Term_pair>>: "p" ~>
+      "kVal" <<~ var "kf" @@ (Pairs.first $ var "p") $
+      "vVal" <<~ var "vf" @@ (Pairs.second $ var "p") $
+      right (Phantoms.pair (var "kVal") (var "vVal"))]
+
+-- TODO: nonstandard; move me
+record :: TBinding (Context -> Name -> Graph -> Term -> Prelude.Either (InContext Error) [Field])
+record = define "record" $
+  doc "Extract a record's fields from a term" $
+  "cx" ~> "expected" ~> "graph" ~> "term0" ~>
+  "record" <<~ termRecord @@ var "cx" @@ var "graph" @@ var "term0" $
+  Logic.ifElse (Equality.equal (Core.recordTypeName (var "record")) (var "expected"))
+    (right (Core.recordFields (var "record")))
+    (unexpected (var "cx")
+      (Phantoms.string "record of type " ++ (Core.unName (var "expected")))
+      (Core.unName (Core.recordTypeName (var "record"))))
+
+-- TODO: nonstandard; move me
+recordType :: TBinding (Context -> Name -> Type -> Prelude.Either (InContext Error) [FieldType])
+recordType = define "recordType" $
+  doc "Extract the field types from a record type" $
+  "cx" ~> "ename" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "record type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_record>>: "fields" ~> right (var "fields")]
+
+set :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) (S.Set Term))
+set = define "set" $
+  doc "Extract a set of terms from a term" $
+  "cx" ~> "graph" ~> "term" ~>
+  "stripped" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term" $
+  Phantoms.cases _Term (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "set") (ShowCore.term @@ var "stripped"))) [
+    _Term_set>>: "s" ~> right (var "s")]
+
+setOf :: TBinding (Context -> (Term -> Prelude.Either (InContext Error) x) -> Graph -> Term -> Prelude.Either (InContext Error) (S.Set x))
+setOf = define "setOf" $
+  doc "Extract a set of values from a term, mapping a function over each element" $
+  "cx" ~> "f" ~> "graph" ~> "term" ~>
+  "els" <<~ set @@ var "cx" @@ var "graph" @@ var "term" $
+  Eithers.mapSet (var "f") (var "els")
+
+setType :: TBinding (Context -> Type -> Prelude.Either (InContext Error) Type)
+setType = define "setType" $
+  doc "Extract the element type from a set type" $
+  "cx" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "set type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_set>>: "t" ~> right (var "t")]
+
+string :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) String)
+string = define "string" $
+  doc "Extract a string value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  stringLiteral @@ var "cx" @@ var "l"
+
+stringLiteral :: TBinding (Context -> Literal -> Prelude.Either (InContext Error) String)
+stringLiteral = define "stringLiteral" $
+  doc "Extract a string literal from a Literal value" $
+  "cx" ~> "v" ~> Phantoms.cases _Literal (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "string") (ShowCore.literal @@ var "v"))) [
+    _Literal_string>>: "s" ~> right (var "s")]
+
+termRecord :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Record)
+termRecord = define "termRecord" $
+  doc "Extract a record from a term" $
+  "cx" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx") (Phantoms.string "record") (ShowCore.term @@ var "term"))) [
+    _Term_record>>: "record" ~> right (var "record")]
+
+uint16 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Int)
+uint16 = define "uint16" $
+  doc "Extract a 16-bit unsigned integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  uint16Value @@ var "cx" @@ var "i"
+
+uint16Value :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) Int)
+uint16Value = define "uint16Value" $
+  doc "Extract a uint16 value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "uint16") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_uint16>>: "i" ~> right (var "i")]
+
+uint32 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) I.Int64)
+uint32 = define "uint32" $
+  doc "Extract a 32-bit unsigned integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  uint32Value @@ var "cx" @@ var "i"
+
+uint32Value :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) I.Int64)
+uint32Value = define "uint32Value" $
+  doc "Extract a uint32 value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "uint32") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_uint32>>: "i" ~> right (var "i")]
+
+uint64 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Integer)
+uint64 = define "uint64" $
+  doc "Extract a 64-bit unsigned integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  uint64Value @@ var "cx" @@ var "i"
+
+uint64Value :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) Integer)
+uint64Value = define "uint64Value" $
+  doc "Extract a uint64 value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "uint64") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_uint64>>: "i" ~> right (var "i")]
+
+uint8 :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) I.Int16)
+uint8 = define "uint8" $
+  doc "Extract an 8-bit unsigned integer value from a term" $
+  "cx" ~> "graph" ~> "t" ~>
+  "l" <<~ literal @@ var "cx" @@ var "graph" @@ var "t" $
+  "i" <<~ integerLiteral @@ var "cx" @@ var "l" $
+  uint8Value @@ var "cx" @@ var "i"
+
+uint8Value :: TBinding (Context -> IntegerValue -> Prelude.Either (InContext Error) I.Int16)
+uint8Value = define "uint8Value" $
+  doc "Extract a uint8 value from an IntegerValue" $
+  "cx" ~> "v" ~> Phantoms.cases _IntegerValue (var "v")
+    (Just (unexpected (var "cx") (Phantoms.string "uint8") (ShowCore.integerValue @@ var "v"))) [
+    _IntegerValue_uint8>>: "i" ~> right (var "i")]
+
+-- TODO: nonstandard; move me
+unionType :: TBinding (Context -> Name -> Type -> Prelude.Either (InContext Error) [FieldType])
+unionType = define "unionType" $
+  doc "Extract the field types from a union type" $
+  "cx" ~> "ename" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "union type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_union>>: "fields" ~> right (var "fields")]
+
+unit :: TBinding (Context -> Term -> Prelude.Either (InContext Error) ())
+unit = define "unit" $
+  doc "Extract a unit value from a term" $
+  "cx" ~> "term" ~> Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx") (Phantoms.string "unit") (ShowCore.term @@ var "term"))) [
+    _Term_unit>>: constant (right Phantoms.unit)]
+
+unitVariant :: TBinding (Context -> Name -> Graph -> Term -> Prelude.Either (InContext Error) Name)
+unitVariant = define "unitVariant" $
+  doc "Extract a unit variant (a variant with an empty record value) from a union term" $
+  "cx" ~> "tname" ~> "graph" ~> "term" ~>
+  "field" <<~ injection @@ var "cx" @@ var "tname" @@ var "graph" @@ var "term" $
+  "ignored" <<~ unit @@ var "cx" @@ (Core.fieldTerm (var "field")) $
+  right (Core.fieldName (var "field"))
+
+-- TODO: nonstandard; move me
+wrap :: TBinding (Context -> Name -> Graph -> Term -> Prelude.Either (InContext Error) Term)
+wrap = define "wrap" $
+  doc "Extract the wrapped value from a wrapped term" $
+  "cx" ~> "expected" ~> "graph" ~> "term0" ~>
+  "term" <<~ Lexical.stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "term0" $
+  Phantoms.cases _Term (var "term")
+    (Just (unexpected (var "cx")
+      (Phantoms.string "wrap(" ++ (Core.unName (var "expected")) ++ Phantoms.string ")")
+      (ShowCore.term @@ var "term"))) [
+    _Term_wrap>>: "wrappedTerm" ~>
+      Logic.ifElse (Core.equalName_ (Core.wrappedTermTypeName (var "wrappedTerm")) (var "expected"))
+        (right (Core.wrappedTermBody (var "wrappedTerm")))
+        (unexpected (var "cx")
+          (Phantoms.string "wrapper of type " ++ (Core.unName (var "expected")))
+          (Core.unName (Core.wrappedTermTypeName (var "wrappedTerm"))))]
+
+-- TODO: nonstandard; move me
+wrappedType :: TBinding (Context -> Name -> Type -> Prelude.Either (InContext Error) Type)
+wrappedType = define "wrappedType" $
+  doc "Extract the wrapped type from a wrapper type" $
+  "cx" ~> "ename" ~> "typ" ~>
+  "stripped" <~ Rewriting.deannotateType @@ var "typ" $
+  Phantoms.cases _Type (var "stripped")
+    (Just (unexpected (var "cx") (Phantoms.string "wrapped type") (ShowCore.type_ @@ var "typ"))) [
+    _Type_wrap>>: "innerType" ~> right (var "innerType")]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Helpers.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Helpers.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Helpers.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Helpers.hs
@@ -5,21 +5,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (literalType, matchRecord, matchUnion)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -34,19 +31,19 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 --import qualified Hydra.Dsl.Meta.Phantoms as Phantoms
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
@@ -71,16 +68,16 @@
     Just "Helper functions for decoding terms to domain types"
   where
     elements = [
-      toBinding decodeEither,
-      toBinding decodeList,
-      toBinding decodeMap,
-      toBinding decodeMaybe,
-      toBinding decodePair,
-      toBinding decodeSet,
-      toBinding decodeUnit,
-      toBinding decodeWrapped,
-      toBinding requireField,
-      toBinding toFieldMap]
+      toTermDefinition decodeEither,
+      toTermDefinition decodeList,
+      toTermDefinition decodeMap,
+      toTermDefinition decodeMaybe,
+      toTermDefinition decodePair,
+      toTermDefinition decodeSet,
+      toTermDefinition decodeUnit,
+      toTermDefinition decodeWrapped,
+      toTermDefinition requireField,
+      toTermDefinition toFieldMap]
 
 define :: String -> TTerm x -> TBinding x
 define = definitionInModule module_
@@ -92,7 +89,7 @@
 -- | Helper to convert Either String Term to Either DecodingError Term
 stripWithDecodingError :: TTerm Graph -> TTerm Term -> TTerm (Either DecodingError Term)
 stripWithDecodingError g term = Eithers.bimap
-  (unaryFunction Util.decodingError)
+  (unaryFunction Error.decodingError)
   ("x" ~> var "x")
   (Lexical.stripAndDereferenceTermEither @@ g @@ term)
 
@@ -108,7 +105,7 @@
   Eithers.bind
     (stripWithDecodingError (var "g") (var "term"))
     ("stripped" ~> cases _Term (var "stripped")
-      (Just $ left $ Util.decodingError $ string "expected either value") [
+      (Just $ left $ Error.decodingError $ string "expected either value") [
       _Term_either>>: "e" ~>
         Eithers.either_
           -- Left case: decode the left value, then wrap result in Left
@@ -125,7 +122,7 @@
   Eithers.bind
     (stripWithDecodingError (var "g") (var "term"))
     ("stripped" ~> cases _Term (var "stripped")
-      (Just $ left $ Util.decodingError $ string "expected list") [
+      (Just $ left $ Error.decodingError $ string "expected list") [
       _Term_list>>: "els" ~> Eithers.mapList (var "elemDecoder" @@ var "g") $ var "els"])
 
 -- | Decode a Map using the provided key and value decoders
@@ -136,7 +133,7 @@
   Eithers.bind
     (stripWithDecodingError (var "g") (var "term"))
     ("stripped" ~> cases _Term (var "stripped")
-      (Just $ left $ Util.decodingError $ string "expected map") [
+      (Just $ left $ Error.decodingError $ string "expected map") [
       _Term_map>>: "m" ~>
         Eithers.map (unaryFunction Maps.fromList)
           (Eithers.mapList
@@ -154,7 +151,7 @@
   Eithers.bind
     (stripWithDecodingError (var "g") (var "term"))
     ("stripped" ~> cases _Term (var "stripped")
-      (Just $ left $ Util.decodingError $ string "expected optional value") [
+      (Just $ left $ Error.decodingError $ string "expected optional value") [
       _Term_maybe>>: "opt" ~> Eithers.mapMaybe (var "elemDecoder" @@ var "g") $ var "opt"])
 
 -- | Decode a Pair using the provided first and second decoders
@@ -165,7 +162,7 @@
   Eithers.bind
     (stripWithDecodingError (var "g") (var "term"))
     ("stripped" ~> cases _Term (var "stripped")
-      (Just $ left $ Util.decodingError $ string "expected pair") [
+      (Just $ left $ Error.decodingError $ string "expected pair") [
       _Term_pair>>: "p" ~>
         Eithers.bind (var "firstDecoder" @@ var "g" @@ (Pairs.first $ var "p"))
           ("f" ~> Eithers.map ("s" ~> pair (var "f") (var "s"))
@@ -179,7 +176,7 @@
   Eithers.bind
     (stripWithDecodingError (var "g") (var "term"))
     ("stripped" ~> cases _Term (var "stripped")
-      (Just $ left $ Util.decodingError $ string "expected set") [
+      (Just $ left $ Error.decodingError $ string "expected set") [
       _Term_set>>: "s" ~>
         Eithers.map (unaryFunction Sets.fromList)
           (Eithers.mapList (var "elemDecoder" @@ var "g") (Sets.toList $ var "s"))])
@@ -192,7 +189,7 @@
   Eithers.bind
     (stripWithDecodingError (var "g") (var "term"))
     ("stripped" ~> cases _Term (var "stripped")
-      (Just $ left $ Util.decodingError $ string "expected a unit value") [
+      (Just $ left $ Error.decodingError $ string "expected a unit value") [
       _Term_unit>>: constant $ right unit])
 
 -- | Decode a wrapped value using the provided body decoder
@@ -203,7 +200,7 @@
   Eithers.bind
     (stripWithDecodingError (var "g") (var "term"))
     ("stripped" ~> cases _Term (var "stripped")
-      (Just $ left $ Util.decodingError $ string "expected wrapped value") [
+      (Just $ left $ Error.decodingError $ string "expected wrapped value") [
       _Term_wrap>>: "wt" ~>
         var "bodyDecoder" @@ var "g" @@ (Core.wrappedTermBody (var "wt"))])
 
@@ -214,7 +211,7 @@
   doc "Require a field from a record's field map and decode it" $
   "fieldName" ~> "decoder" ~> "fieldMap" ~> "g" ~>
   Maybes.maybe
-    (left $ Util.decodingError $ Strings.cat $ list [string "missing field ", var "fieldName", string " in record"])
+    (left $ Error.decodingError $ Strings.cat $ list [string "missing field ", var "fieldName", string " in record"])
     ("fieldTerm" ~> var "decoder" @@ var "g" @@ var "fieldTerm")
     (Maps.lookup (Phantoms.wrap _Name $ var "fieldName") $ var "fieldMap")
 
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Util.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Util.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Util.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Extract/Util.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +30,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -54,8 +51,10 @@
 import qualified Data.Set                    as S
 import qualified Data.Maybe                  as Y
 
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors as ShowError
 
 
 ns :: Namespace
@@ -63,26 +62,28 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [ExtractCore.ns, Monads.ns]
+    [ExtractCore.ns, ShowError.ns]
     kernelTypesNamespaces $
     Just ("Extraction and validation for hydra.util types")
   where
    elements = [
-     toBinding comparison]
+     toTermDefinition comparison]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
-comparison :: TBinding (Term -> Flow Graph Comparison)
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
+comparison :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Comparison)
 comparison = define "comparison" $
   doc "Extract a comparison from a term" $
-  lambda "term" $
-    Flows.bind (ExtractCore.unitVariant @@ Core.nameLift _Comparison @@ var "term") $
-      lambda "fname" $
+  "cx" ~> "graph" ~> "term" ~>
+    "fname" <<~ ExtractCore.unitVariant @@ var "cx" @@ Core.nameLift _Comparison @@ var "graph" @@ var "term" $
         Logic.ifElse (Equality.equal (Core.unName $ var "fname") (string $ unName _Comparison_equalTo))
-          (Flows.pure Graph.comparisonEqualTo)
+          (right Graph.comparisonEqualTo)
           (Logic.ifElse (Equality.equal (Core.unName $ var "fname") (string $ unName _Comparison_lessThan))
-            (Flows.pure Graph.comparisonLessThan)
+            (right Graph.comparisonLessThan)
             (Logic.ifElse (Equality.equal (Core.unName $ var "fname") (string $ unName _Comparison_greaterThan))
-              (Flows.pure Graph.comparisonGreaterThan)
-              (Monads.unexpected @@ string "comparison" @@ Core.unName (var "fname"))))
+              (right Graph.comparisonGreaterThan)
+              (Ctx.failInContext (Error.errorOther $ Error.otherError (string "expected comparison but found " ++ Core.unName (var "fname"))) (var "cx"))))
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Formatting.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Formatting.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Formatting.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Formatting.hs
@@ -2,26 +2,23 @@
 
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (
-  capitalize, convertCase, convertCaseCamelToLowerSnake, convertCaseCamelToUpperSnake,
+  capitalize, convertCase, convertCaseCamelOrUnderscoreToLowerSnake, convertCaseCamelToLowerSnake, convertCaseCamelToUpperSnake,
   convertCasePascalToUpperSnake, decapitalize, escapeWithUnderscore, indentLines,
   javaStyleComment, mapFirstLetter, nonAlnumToUnderscores, sanitizeWithUnderscores,
   showList, stripLeadingAndTrailingWhitespace, withCharacterAliases, wrapLine)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -36,18 +33,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++), showList)
@@ -68,22 +65,23 @@
     Just "String formatting types and functions."
   where
     elements = [
-      toBinding capitalize,
-      toBinding convertCase,
-      toBinding convertCaseCamelToLowerSnake,
-      toBinding convertCaseCamelToUpperSnake,
-      toBinding convertCasePascalToUpperSnake,
-      toBinding decapitalize,
-      toBinding escapeWithUnderscore,
-      toBinding indentLines,
-      toBinding javaStyleComment,
-      toBinding mapFirstLetter,
-      toBinding nonAlnumToUnderscores,
-      toBinding sanitizeWithUnderscores,
-      toBinding showList,
-      toBinding stripLeadingAndTrailingWhitespace,
-      toBinding withCharacterAliases,
-      toBinding wrapLine]
+      toTermDefinition capitalize,
+      toTermDefinition convertCase,
+      toTermDefinition convertCaseCamelOrUnderscoreToLowerSnake,
+      toTermDefinition convertCaseCamelToLowerSnake,
+      toTermDefinition convertCaseCamelToUpperSnake,
+      toTermDefinition convertCasePascalToUpperSnake,
+      toTermDefinition decapitalize,
+      toTermDefinition escapeWithUnderscore,
+      toTermDefinition indentLines,
+      toTermDefinition javaStyleComment,
+      toTermDefinition mapFirstLetter,
+      toTermDefinition nonAlnumToUnderscores,
+      toTermDefinition sanitizeWithUnderscores,
+      toTermDefinition showList,
+      toTermDefinition stripLeadingAndTrailingWhitespace,
+      toTermDefinition withCharacterAliases,
+      toTermDefinition wrapLine]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -124,6 +122,14 @@
   doc "Convert a string from camel case to lower snake case" $
   convertCase @@ Util.caseConventionCamel @@ Util.caseConventionLowerSnake
 
+convertCaseCamelOrUnderscoreToLowerSnake :: TBinding (String -> String)
+convertCaseCamelOrUnderscoreToLowerSnake = define "convertCaseCamelOrUnderscoreToLowerSnake" $
+  doc "Convert a string from camel case (possibly with underscores) to lower snake case. Splits on underscores first, then converts each part from camel case." $
+  lambda "s" $
+    "parts" <~ Strings.splitOn (string "_") (var "s") $
+    "snakeParts" <~ Lists.map (lambda "p" $ convertCaseCamelToLowerSnake @@ var "p") (var "parts") $
+    Strings.intercalate (string "_") (var "snakeParts")
+
 convertCaseCamelToUpperSnake :: TBinding (String -> String)
 convertCaseCamelToUpperSnake = define "convertCaseCamelToUpperSnake" $
   doc "Convert a string from camel case to upper snake case" $
@@ -164,12 +170,12 @@
 mapFirstLetter = define "mapFirstLetter" $
   doc "A helper which maps the first letter of a string to another string" $
   "mapping" ~> "s" ~>
-  "list" <~ Strings.toList (var "s") $
-  "firstLetter" <~ var "mapping" @@ (Strings.fromList (Lists.pure (Lists.head $ var "list"))) $
   Logic.ifElse
     (Strings.null $ var "s")
     (var "s")
-    (Strings.cat2 (var "firstLetter") (Strings.fromList (Lists.tail $ var "list")))
+    ("list" <~ Strings.toList (var "s") $
+     "firstLetter" <~ var "mapping" @@ (Strings.fromList (Lists.pure (Lists.head $ var "list"))) $
+     Strings.cat2 (var "firstLetter") (Strings.fromList (Lists.tail $ var "list")))
 
 nonAlnumToUnderscores :: TBinding (String -> String)
 nonAlnumToUnderscores = define "nonAlnumToUnderscores" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Grammars.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Grammars.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Grammars.hs
+++ /dev/null
@@ -1,249 +0,0 @@
-
-module Hydra.Sources.Kernel.Terms.Grammars where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Annotations as Annotations
-import qualified Hydra.Sources.Kernel.Terms.Constants as Constants
-import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Names as Names
-
-import Hydra.Grammar as G
-
-
-ns :: Namespace
-ns = Namespace "hydra.grammars"
-
-module_ :: Module
-module_ = Module ns elements
-    [Annotations.ns, Formatting.ns, Names.ns]
-    kernelTypesNamespaces $
-    Just ("A utility for converting a BNF grammar to a Hydra module.")
-  where
-   elements = [
-     toBinding childName,
-     toBinding findNames,
-     toBinding grammarToModule,
-     toBinding isComplex,
-     toBinding isNontrivial,
-     toBinding makeElements,
-     toBinding rawName,
-     toBinding simplify,
-     toBinding toName,
-     toBinding wrapType]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-childName :: TBinding (String -> String -> String)
-childName = define "childName" $
-  doc "Generate child name" $
-  "lname" ~> "n" ~>
-  Strings.cat (list [var "lname", string "_", Formatting.capitalize @@ var "n"])
-
-findNames :: TBinding ([G.Pattern] -> [String])
-findNames = define "findNames" $
-  doc "Find unique names for patterns" $
-  "pats" ~>
-  "nextName" <~ ("acc" ~> "pat" ~>
-    "names" <~ Pairs.first (var "acc") $
-    "nameMap" <~ Pairs.second (var "acc") $
-    "rn" <~ rawName @@ var "pat" $
-    "nameAndIndex" <~ Maybes.maybe
-      (pair (var "rn") (int32 1))
-      ("i" ~> pair (Strings.cat2 (var "rn") (Literals.showInt32 (Math.add (var "i") (int32 1)))) (Math.add (var "i") (int32 1)))
-      (Maps.lookup (var "rn") (var "nameMap")) $
-    "nn" <~ Pairs.first (var "nameAndIndex") $
-    "ni" <~ Pairs.second (var "nameAndIndex") $
-    pair
-      (Lists.cons (var "nn") (var "names"))
-      (Maps.insert (var "rn") (var "ni") (var "nameMap"))) $
-  Lists.reverse (Pairs.first (Lists.foldl (var "nextName") (pair (list ([] :: [TTerm Name])) Maps.empty) (var "pats")))
-
-grammarToModule :: TBinding (Namespace -> G.Grammar -> Maybe String -> Module)
-grammarToModule = define "grammarToModule" $
-  doc "Convert a BNF grammar to a Hydra module" $
-  "ns" ~> "grammar" ~> "desc" ~>
-  "prodPairs" <~ Lists.map
-    ("prod" ~> pair
-      (Grammar.unSymbol (Grammar.productionSymbol (var "prod")))
-      (Grammar.productionPattern (var "prod")))
-    (Grammar.unGrammar (var "grammar")) $
-  "capitalizedNames" <~ Lists.map ("pair" ~> Formatting.capitalize @@ (Pairs.first (var "pair"))) (var "prodPairs") $
-  "patterns" <~ Lists.map ("pair" ~> Pairs.second (var "pair")) (var "prodPairs") $
-  "elementPairs" <~ Lists.concat (Lists.zipWith
-    (makeElements @@ false @@ var "ns")
-    (var "capitalizedNames")
-    (var "patterns")) $
-  "elements" <~ Lists.map
-    ("pair" ~>
-      "lname" <~ Pairs.first (var "pair") $
-      "typ" <~ wrapType @@ (Pairs.second (var "pair")) $
-      Annotations.typeElement @@ (toName @@ var "ns" @@ var "lname") @@ var "typ")
-    (var "elementPairs") $
-  Module.module_ (var "ns") (var "elements") (list ([] :: [TTerm Namespace])) (list ([] :: [TTerm Namespace])) (var "desc")
-
-isComplex :: TBinding (G.Pattern -> Bool)
-isComplex = define "isComplex" $
-  doc "Check if pattern is complex" $
-  "pat" ~> match G._Pattern (Just false) [
-    _Pattern_labeled>>: "lp" ~> isComplex @@ (Grammar.labeledPatternPattern (var "lp")),
-    _Pattern_sequence>>: "pats" ~> isNontrivial @@ true @@ var "pats",
-    _Pattern_alternatives>>: "pats" ~> isNontrivial @@ false @@ var "pats"]
-  @@ var "pat"
-
-isNontrivial :: TBinding (Bool -> [G.Pattern] -> Bool)
-isNontrivial = define "isNontrivial" $
-  doc "Check if patterns are nontrivial" $
-  "isRecord" ~> "pats" ~>
-  "minPats" <~ simplify @@ var "isRecord" @@ var "pats" $
-  "isLabeled" <~ ("p" ~> cases G._Pattern (var "p")
-    (Just false) [
-    _Pattern_labeled>>: constant true]) $
-  Logic.ifElse (Equality.equal (Lists.length (var "minPats")) (int32 1))
-    (var "isLabeled" @@ (Lists.head $ var "minPats"))
-    true
-
-makeElements :: TBinding (Bool -> Namespace -> String -> G.Pattern -> [(String, Type)])
-makeElements = define "makeElements" $
-  doc "Create elements from pattern" $
-  "omitTrivial" ~> "ns" ~> "lname" ~> "pat" ~>
-  "trivial" <~ Logic.ifElse (var "omitTrivial") (list ([] :: [TTerm (String, Type)])) (list [pair (var "lname") MetaTypes.unit]) $
-
-  "descend" <~ ("n" ~> "f" ~> "p" ~>
-    "cpairs" <~ makeElements @@ false @@ var "ns" @@ (childName @@ var "lname" @@ var "n") @@ var "p" $
-    var "f" @@ Logic.ifElse (isComplex @@ var "p")
-      (Lists.cons (pair (var "lname") (Core.typeVariable (toName @@ var "ns" @@ (Pairs.first (Lists.head (var "cpairs")))))) (var "cpairs"))
-      (Logic.ifElse (Lists.null (var "cpairs"))
-        (list [pair (var "lname") MetaTypes.unit])
-        (Lists.cons (pair (var "lname") (Pairs.second (Lists.head (var "cpairs")))) (Lists.tail (var "cpairs"))))) $
-
-  "mod" <~ ("n" ~> "f" ~> "p" ~> var "descend" @@ var "n" @@
-    ("pairs" ~> Lists.cons (pair (var "lname") (var "f" @@ (Pairs.second (Lists.head (var "pairs"))))) (Lists.tail (var "pairs"))) @@
-    var "p") $
-
-  lets [
-    "forPat">: ("pat" ~> match G._Pattern Nothing [
-      _Pattern_alternatives>>: "pats" ~> var "forRecordOrUnion" @@ false @@
-        ("fields" ~> Core.typeUnion (Core.rowType (Constants.placeholderName) (var "fields"))) @@ var "pats",
-      _Pattern_constant>>: constant (var "trivial"),
-      _Pattern_ignored>>: constant (list ([] :: [TTerm (String, Type)])),
-      _Pattern_labeled>>: "lp" ~> var "forPat" @@ Grammar.labeledPatternPattern (var "lp"),
-      _Pattern_nil>>: constant (var "trivial"),
-      _Pattern_nonterminal>>: "s" ~> list [pair (var "lname") (Core.typeVariable (
-        toName @@ var "ns" @@ Grammar.unSymbol (var "s")))],
-      _Pattern_option>>: "p" ~> var "mod" @@ string "Option" @@ (unaryFunction MetaTypes.optional) @@ var "p",
-      _Pattern_plus>>: "p" ~> var "mod" @@ string "Elmt" @@ (unaryFunction MetaTypes.list) @@ var "p",
-      _Pattern_regex>>: constant (list [pair (var "lname") MetaTypes.string]),
-      _Pattern_sequence>>: "pats" ~> var "forRecordOrUnion" @@ true @@
-        ("fields" ~> Core.typeRecord (Core.rowType (Constants.placeholderName) (var "fields"))) @@ var "pats",
-      _Pattern_star>>: "p" ~> var "mod" @@ string "Elmt" @@ (unaryFunction MetaTypes.list) @@ var "p"]
-    @@ var "pat"),
-
-    "forRecordOrUnion">: ("isRecord" ~> "construct" ~> "pats" ~>
-      "minPats" <~ simplify @@ var "isRecord" @@ var "pats" $
-      "fieldNames" <~ findNames @@ var "minPats" $
-      "toField" <~ ("n" ~> "p" ~> var "descend" @@ var "n" @@
-        ("pairs" ~> pair (Core.fieldType (Core.name (var "n")) (Pairs.second (Lists.head (var "pairs")))) (Lists.tail (var "pairs"))) @@
-        var "p") $
-      "fieldPairs" <~ Lists.zipWith (var "toField") (var "fieldNames") (var "minPats") $
-      "fields" <~ Lists.map (unaryFunction Pairs.first) (var "fieldPairs") $
-      "els" <~ Lists.concat (Lists.map (unaryFunction Pairs.second) (var "fieldPairs")) $
-      Logic.ifElse (isNontrivial @@ var "isRecord" @@ var "pats")
-        (Lists.cons (pair (var "lname") (var "construct" @@ var "fields")) (var "els"))
-        (var "forPat" @@ (Lists.head (var "minPats"))))] $
-
-  var "forPat" @@ var "pat"
-
-rawName :: TBinding (G.Pattern -> String)
-rawName = define "rawName" $
-  doc "Get raw name from pattern" $
-  "pat" ~> match G._Pattern Nothing [
-    _Pattern_alternatives>>: constant (string "alts"),
-    _Pattern_constant>>: "c" ~> Formatting.capitalize @@ (Formatting.withCharacterAliases @@ (Grammar.unConstant (var "c"))),
-    _Pattern_ignored>>: constant (string "ignored"),
-    _Pattern_labeled>>: "lp" ~> Grammar.unLabel (Grammar.labeledPatternLabel (var "lp")),
-    _Pattern_nil>>: constant (string "none"),
-    _Pattern_nonterminal>>: "s" ~> Formatting.capitalize @@ (Grammar.unSymbol (var "s")),
-    _Pattern_option>>: "p" ~> Formatting.capitalize @@ (rawName @@ var "p"),
-    _Pattern_plus>>: "p" ~> Strings.cat2 (string "listOf") (Formatting.capitalize @@ (rawName @@ var "p")),
-    _Pattern_regex>>: constant (string "regex"),
-    _Pattern_sequence>>: constant (string "sequence"),
-    _Pattern_star>>: "p" ~> Strings.cat2 (string "listOf") (Formatting.capitalize @@ (rawName @@ var "p"))]
-  @@ var "pat"
-
-simplify :: TBinding (Bool -> [G.Pattern] -> [G.Pattern])
-simplify = define "simplify" $
-  doc "Remove trivial patterns from records" $
-  "isRecord" ~> "pats" ~>
-  "isConstant" <~ ("p" ~> match G._Pattern (Just false) [
-    G._Pattern_constant>>: constant true] @@ var "p") $
-  Logic.ifElse (var "isRecord")
-    (Lists.filter ("p" ~> Logic.not (var "isConstant" @@ var "p")) (var "pats"))
-    (var "pats")
-
-toName :: TBinding (Namespace -> String -> Name)
-toName = define "toName" $
-  doc "Convert local name to qualified name" $
-  "ns" ~> "local" ~>
-  Names.unqualifyName @@ (Module.qualifiedName (just (var "ns")) (var "local"))
-
-wrapType :: TBinding (Type -> Type)
-wrapType = define "wrapType" $
-  doc "Wrap a type in a placeholder name, unless it is already a wrapper, record, or union type" $
-  "t" ~> cases _Type (var "t")
-    (Just (Core.typeWrap (Core.wrappedType (Core.nameLift placeholderName) (var "t")))) [
-    _Type_record>>: constant (var "t"),
-    _Type_union>>: constant (var "t"),
-    _Type_wrap>>: constant (var "t")]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Hoisting.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Hoisting.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Hoisting.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Hoisting.hs
@@ -8,24 +8,20 @@
   hoistAllLetBindings, hoistCaseStatements, hoistCaseStatementsInGraph, hoistLetBindingsWithContext, hoistLetBindingsWithPredicate, hoistPolymorphicLetBindings, hoistSubterms,
   isApplicationFunction, isEliminationUnion, isLambdaBody, isUnionElimination, isUnionEliminationApplication,
   normalizePathForHoisting,
-  rewriteAndFoldTermWithTypeContext, rewriteAndFoldTermWithTypeContextAndPath, rewriteTermWithTypeContext,
   shouldHoistAll, shouldHoistCaseStatement, shouldHoistPolymorphic, updateHoistState)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -40,18 +36,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -81,30 +77,27 @@
     Just "Functions for deep term rewriting operations involving hoisting subterms or bindings into enclosing let terms."
   where
    elements = [
-     toBinding augmentBindingsWithNewFreeVars,
-     toBinding bindingIsPolymorphic,
-     toBinding bindingUsesContextTypeVars,
-     toBinding countVarOccurrences,
-     toBinding hoistAllLetBindings,
-     toBinding hoistCaseStatements,
-     toBinding hoistCaseStatementsInGraph,
-     toBinding hoistLetBindingsWithContext,
-     toBinding hoistLetBindingsWithPredicate,
-     toBinding hoistPolymorphicLetBindings,
-     toBinding hoistSubterms,
-     toBinding isApplicationFunction,
-     toBinding isEliminationUnion,
-     toBinding isLambdaBody,
-     toBinding isUnionElimination,
-     toBinding isUnionEliminationApplication,
-     toBinding normalizePathForHoisting,
-     toBinding rewriteAndFoldTermWithTypeContext,
-     toBinding rewriteAndFoldTermWithTypeContextAndPath,
-     toBinding rewriteTermWithTypeContext,
-     toBinding shouldHoistAll,
-     toBinding shouldHoistCaseStatement,
-     toBinding shouldHoistPolymorphic,
-     toBinding updateHoistState]
+     toTermDefinition augmentBindingsWithNewFreeVars,
+     toTermDefinition bindingIsPolymorphic,
+     toTermDefinition bindingUsesContextTypeVars,
+     toTermDefinition countVarOccurrences,
+     toTermDefinition hoistAllLetBindings,
+     toTermDefinition hoistCaseStatements,
+     toTermDefinition hoistCaseStatementsInGraph,
+     toTermDefinition hoistLetBindingsWithContext,
+     toTermDefinition hoistLetBindingsWithPredicate,
+     toTermDefinition hoistPolymorphicLetBindings,
+     toTermDefinition hoistSubterms,
+     toTermDefinition isApplicationFunction,
+     toTermDefinition isEliminationUnion,
+     toTermDefinition isLambdaBody,
+     toTermDefinition isUnionElimination,
+     toTermDefinition isUnionEliminationApplication,
+     toTermDefinition normalizePathForHoisting,
+     toTermDefinition shouldHoistAll,
+     toTermDefinition shouldHoistCaseStatement,
+     toTermDefinition shouldHoistPolymorphic,
+     toTermDefinition updateHoistState]
 
 -- | Check if a binding has a polymorphic type (non-empty list of type scheme variables)
 bindingIsPolymorphic :: TBinding (Binding -> Bool)
@@ -115,20 +108,20 @@
     false  -- No type scheme means monomorphic (or untyped)
     ("ts" ~> Logic.not $ Lists.null $ Core.typeSchemeVariables $ var "ts")
 
--- | Check if a binding's type uses any type variables from the given TypeContext.
+-- | Check if a binding's type uses any type variables from the given Graph.
 -- This checks if the free type variables in the binding's type intersect with
--- the type variables in scope (typeContextTypeVariables).
-bindingUsesContextTypeVars :: TBinding (TypeContext -> Binding -> Bool)
+-- the type variables in scope (graphTypeVariables).
+bindingUsesContextTypeVars :: TBinding (Graph -> Binding -> Bool)
 bindingUsesContextTypeVars = define "bindingUsesContextTypeVars" $
-  doc ("Check if a binding's type uses any type variables from the given TypeContext."
+  doc ("Check if a binding's type uses any type variables from the given Graph."
     <> " Returns True if the free type variables in the binding's type intersect with"
-    <> " the type variables in scope (typeContextTypeVariables).") $
+    <> " the type variables in scope (graphTypeVariables).") $
   "cx" ~> "binding" ~>
   optCases (Core.bindingType $ var "binding")
     false  -- No type scheme means no type variables used
     ("ts" ~>
       "freeInType" <~ Rewriting.freeVariablesInType @@ Core.typeSchemeType (var "ts") $
-      "contextTypeVars" <~ Typing.typeContextTypeVariables (var "cx") $
+      "contextTypeVars" <~ Graph.graphTypeVariables (var "cx") $
       Logic.not $ Sets.null $ Sets.intersection (var "freeInType") (var "contextTypeVars"))
 
 -- | Count the number of occurrences of a variable name in a term. Assumes no variable shadowing.
@@ -148,11 +141,11 @@
         (var "childCount")]
 
 -- | Augment bindings with new free variables introduced by substitution, wrapping with lambdas after any type lambdas.
-augmentBindingsWithNewFreeVars :: TBinding (TypeContext -> S.Set Name -> [Binding] -> ([Binding], TermSubst))
+augmentBindingsWithNewFreeVars :: TBinding (Graph -> S.Set Name -> [Binding] -> ([Binding], TermSubst))
 augmentBindingsWithNewFreeVars = define "augmentBindingsWithNewFreeVars" $
   doc "Augment bindings with new free variables introduced by substitution, wrapping with lambdas after any type lambdas." $
   "cx" ~> "boundVars" ~> "bindings" ~>
-  "types" <~ Typing.typeContextTypes (var "cx") $
+  "types" <~ Maps.map (Rewriting.typeSchemeToFType) (Graph.graphBoundTypes (var "cx")) $
   "wrapAfterTypeLambdas" <~ ("vars" ~> "term" ~>
     cases _Term (var "term")
       -- Default: wrap with lambdas (for any non-type-lambda term)
@@ -196,29 +189,29 @@
 
 -- | Predicate for hoisting polymorphic bindings.
 -- A binding should be hoisted if it is polymorphic or uses outer type variables.
-shouldHoistPolymorphic :: TBinding (TypeContext -> Binding -> Bool)
+shouldHoistPolymorphic :: TBinding (Graph -> Binding -> Bool)
 shouldHoistPolymorphic = define "shouldHoistPolymorphic" $
   doc ("Predicate for hoisting polymorphic bindings."
     <> " Returns True if the binding is polymorphic (has type scheme variables)"
-    <> " or if its type uses any type variables from the TypeContext.") $
+    <> " or if its type uses any type variables from the Graph.") $
   "cx" ~> "binding" ~>
   Logic.or (bindingIsPolymorphic @@ var "binding") (bindingUsesContextTypeVars @@ var "cx" @@ var "binding")
 
 -- | Predicate for hoisting all bindings unconditionally.
-shouldHoistAll :: TBinding (TypeContext -> Binding -> Bool)
+shouldHoistAll :: TBinding (Graph -> Binding -> Bool)
 shouldHoistAll = define "shouldHoistAll" $
   doc "Predicate that always returns True, for hoisting all bindings unconditionally." $
   constant (constant true)
 
-hoistLetBindingsWithPredicate :: TBinding ((Binding -> Bool) -> (TypeContext -> Binding -> Bool) -> TypeContext -> Let -> Let)
+hoistLetBindingsWithPredicate :: TBinding ((Binding -> Bool) -> (Graph -> Binding -> Bool) -> Graph -> Let -> Let)
 hoistLetBindingsWithPredicate = define "hoistLetBindingsWithPredicate" $
   doc ("Transform a let-term by pulling let bindings to the top level."
     <> " The isParentBinding predicate applies to top-level bindings and determines whether their subterm bindings are"
     <> " eligible for hoisting."
-    <> " The shouldHoistBinding predicate takes the TypeContext and a subterm binding,"
+    <> " The shouldHoistBinding predicate takes the Graph and a subterm binding,"
     <> " and returns True if the binding should be hoisted."
     <> " This is useful for targets like Java that cannot have polymorphic definitions in arbitrary positions."
-    <> " The TypeContext provides information about type variables and lambda variables in scope."
+    <> " The Graph provides information about type variables and lambda variables in scope."
     <> " If a hoisted binding captures let-bound or lambda-bound variables from an enclosing scope,"
     <> " the binding is wrapped in lambdas for those variables, and references are replaced"
     <> " with applications."
@@ -232,7 +225,7 @@
     "alreadyUsedNames" <~ Pairs.second (var "pair") $
     "b" <~ Pairs.first (var "bindingWithCapturedVars") $
     "capturedTermVars" <~ Pairs.second (var "bindingWithCapturedVars") $
-    "types" <~ Typing.typeContextTypes (var "cx") $
+    "types" <~ Maps.map (Rewriting.typeSchemeToFType) (Graph.graphBoundTypes (var "cx")) $
     "capturedTermVarTypePairs" <~ Lists.map
       ("v" ~> pair (var "v") (Maps.lookup (var "v") (var "types")))
       (var "capturedTermVars") $
@@ -247,7 +240,7 @@
       ("ts" ~> Rewriting.freeVariablesInType @@ (Core.typeSchemeType $ var "ts")) $
     "freeInCapturedVarTypes" <~ Sets.unions (Lists.map ("t" ~> Rewriting.freeVariablesInType @@ var "t") (var "capturedTermVarTypes")) $
     "capturedTypeVars" <~ Sets.toList (Sets.intersection
-      (Typing.typeContextTypeVariables $ var "cx")
+      (Graph.graphTypeVariables $ var "cx")
       (Sets.union (var "freeInBindingType") (var "freeInCapturedVarTypes"))) $
     "globalBindingName" <~ Lexical.chooseUniqueName
       @@ var "alreadyUsedNames"
@@ -337,14 +330,14 @@
         -- We need to include them for argument propagation, but exclude them from the final list of arguments
         -- for each hoisted binding.
         "polyLetVariables" <~ (Sets.fromList $ Lists.filter
-          ("v" ~> optCases (Maps.lookup (var "v") (Typing.typeContextTypes $ var "cx"))
+          ("v" ~> optCases (Maybes.map (Rewriting.typeSchemeToFType) $ Maps.lookup (var "v") (Graph.graphBoundTypes $ var "cx"))
             false -- This function should not be applied to untyped terms, but we make a hopeful guess if it is
             Schemas.fTypeIsPolymorphic)
-          (Sets.toList $ Typing.typeContextLetVariables $ var "cx")) $
+          (Sets.toList $ Sets.difference (Sets.fromList $ Maps.keys $ Graph.graphBoundTerms $ var "cx") (Graph.graphLambdaVariables $ var "cx"))) $
 
         "boundTermVariables" <~ Sets.union
-          (Typing.typeContextLambdaVariables $ var "cx")
-          (Typing.typeContextLetVariables $ var "cx") $
+          (Graph.graphLambdaVariables $ var "cx")
+          (Sets.difference (Sets.fromList $ Maps.keys $ Graph.graphBoundTerms $ var "cx") (Graph.graphLambdaVariables $ var "cx")) $
         "freeVariablesInEachBinding" <~ Lists.map
           ("b" ~> Sets.toList $ Sets.intersection
             (var "boundTermVariables")
@@ -456,7 +449,7 @@
             (Lists.concat $ list [var "previouslyFinishedBindings", var "hoistedBindingsFinal", var "bindingsSoFarFinal"])
             (var "finalUsedNames"))
           (var "finalTerm")]) $
-  "cx1" <~ Schemas.extendTypeContextForLet @@ ("c" ~> "b" ~> nothing) @@ var "cx0" @@ var "let0" $
+  "cx1" <~ Rewriting.extendGraphForLet @@ ("c" ~> "b" ~> nothing) @@ var "cx0" @@ var "let0" $
   -- Each binding becomes a list of bindings: the original one with substitutions in its body,
   -- as well as hoisted bindings from any level. The hoisted bindings share the original binding's namespace.
   -- Since each top-level binding has exclusive access to its hoisted bindings, it can be processed individually.
@@ -465,7 +458,7 @@
     -- bindings are unique.
     "prefix" <~ (Strings.cat2 (Core.unName (Core.bindingName $ var "b")) (string "_")) $
     "init" <~ pair (list ([] :: [TTerm Binding])) (Sets.singleton $ Core.bindingName $ var "b") $
-    "resultPair" <~ rewriteAndFoldTermWithTypeContext
+    "resultPair" <~ Rewriting.rewriteAndFoldTermWithGraph
       @@ (var "rewrite" @@ var "prefix") @@ var "cx1" @@ var "init" @@ (Core.bindingTerm $ var "b") $
     "resultBindings" <~ Pairs.first (Pairs.first (var "resultPair")) $
     "resultTerm" <~ Pairs.second (var "resultPair") $
@@ -493,17 +486,15 @@
     <> " with applications."
     <> " Note: Assumes no variable shadowing; use hydra.rewriting.unshadowVariables first.") $
   "isParentBinding" ~> "let0" ~>
-  -- Create an empty TypeContext
-  "emptyIx" <~ Typing.inferenceContext (Maps.empty) (Maps.empty) (Maps.empty) (Maps.empty) false $
-  "emptyCx" <~ Typing.typeContext Maps.empty Maps.empty Sets.empty Sets.empty Sets.empty (var "emptyIx") $
+  "emptyCx" <~ Graph.emptyGraph $
   hoistLetBindingsWithPredicate @@ var "isParentBinding" @@ shouldHoistPolymorphic @@ var "emptyCx" @@ var "let0"
 
-hoistLetBindingsWithContext :: TBinding ((Binding -> Bool) -> TypeContext -> Let -> Let)
+hoistLetBindingsWithContext :: TBinding ((Binding -> Bool) -> Graph -> Let -> Let)
 hoistLetBindingsWithContext = define "hoistLetBindingsWithContext" $
-  doc ("Transform a let-term by pulling polymorphic let bindings to the top level, using TypeContext."
+  doc ("Transform a let-term by pulling polymorphic let bindings to the top level, using Graph."
     <> " A binding is hoisted if:"
     <> " (1) It is polymorphic (has non-empty typeSchemeVariables), OR"
-    <> " (2) Its type uses type variables from the TypeContext (i.e., from enclosing type lambdas)."
+    <> " (2) Its type uses type variables from the Graph (i.e., from enclosing type lambdas)."
     <> " Bindings which are already at the top level are not hoisted."
     <> " If a hoisted binding captures lambda-bound or let-bound variables from an enclosing scope,"
     <> " the binding is wrapped in lambdas for those variables, and references are replaced"
@@ -523,12 +514,10 @@
     <> " with applications."
     <> " Note: Assumes no variable shadowing; use hydra.rewriting.unshadowVariables first.") $
   "let0" ~>
-  -- Create an empty TypeContext
-  "emptyIx" <~ Typing.inferenceContext (Maps.empty) (Maps.empty) (Maps.empty) (Maps.empty) false $
-  "emptyCx" <~ Typing.typeContext Maps.empty Maps.empty Sets.empty Sets.empty Sets.empty (var "emptyIx") $
+  "emptyCx" <~ Graph.emptyGraph $
   hoistLetBindingsWithPredicate @@ constant true @@ shouldHoistAll @@ var "emptyCx" @@ var "let0"
 
-hoistCaseStatements :: TBinding (TypeContext -> Term -> Term)
+hoistCaseStatements :: TBinding (Graph -> Term -> Term)
 hoistCaseStatements = define "hoistCaseStatements" $
   doc ("Hoist case statements into local let bindings."
     <> " This is useful for targets such as Python which only support case statements (match) at the top level."
@@ -537,20 +526,18 @@
     <> " Once through an application LHS, lambda bodies no longer count as pass-through.") $
   hoistSubterms @@ shouldHoistCaseStatement
 
-hoistCaseStatementsInGraph :: TBinding (Graph -> Flow Graph Graph)
+hoistCaseStatementsInGraph :: TBinding ([Binding] -> [Binding])
 hoistCaseStatementsInGraph = define "hoistCaseStatementsInGraph" $
-  doc ("Hoist case statements into local let bindings for all elements in a graph."
+  doc ("Hoist case statements into local let bindings for a list of bindings."
     <> " This version operates prior to inference and uses an empty type context."
     <> " It hoists case statements and their applied arguments into let bindings.") $
-  "graph" ~>
-  -- Create an empty type context (no lambda variables to track since we're pre-inference)
-  "emptyIx" <~ Typing.inferenceContext (Maps.empty) (Maps.empty) (Maps.empty) (Maps.empty) false $
-  "emptyTx" <~ Typing.typeContext Maps.empty Maps.empty Sets.empty Sets.empty Sets.empty (var "emptyIx") $
-  -- Convert graph to a term, apply hoisting, convert back
-  "gterm0" <~ Schemas.graphAsTerm @@ var "graph" $
-  "gterm1" <~ hoistCaseStatements @@ var "emptyTx" @@ var "gterm0" $
-  "newElements" <~ Schemas.termAsGraph @@ var "gterm1" $
-  produce $ Graph.graphWithElements (var "graph") (var "newElements")
+  "bindings" ~>
+  -- Create an empty graph (no lambda variables to track since we're pre-inference)
+  "emptyTx" <~ Graph.emptyGraph $
+  -- Convert bindings to a let term, apply hoisting, extract bindings back
+  "term0" <~ Core.termLet (Core.let_ (var "bindings") Core.termUnit) $
+  "term1" <~ hoistCaseStatements @@ var "emptyTx" @@ var "term0" $
+  Schemas.termAsBindings @@ var "term1"
 
 -- | Check if a term is a union elimination (case statement)
 isUnionElimination :: TBinding (Term -> Bool)
@@ -604,7 +591,7 @@
 -- | Update state when traversing an accessor in the path for hoisting logic.
 -- State is (stillAtTopLevel, haveUsedAppLHS).
 -- Returns updated state after processing one accessor.
-updateHoistState :: TBinding (TermAccessor -> (Bool, Bool) -> (Bool, Bool))
+updateHoistState :: TBinding (SubtermStep -> (Bool, Bool) -> (Bool, Bool))
 updateHoistState = define "updateHoistState" $
   doc ("Update hoisting state when traversing an accessor."
     <> " State is (atTopLevel, usedAppLHS). Returns updated state.") $
@@ -615,42 +602,42 @@
   Logic.ifElse (Logic.not $ var "atTop")
     (pair false (var "usedApp"))
     -- Check this accessor
-    (cases _TermAccessor (var "accessor")
+    (cases _SubtermStep (var "accessor")
       -- Default: any other accessor takes us out of top level
       (Just $ pair false (var "usedApp")) [
       -- Annotations are transparent
-      _TermAccessor_annotatedBody>>: constant $ pair true (var "usedApp"),
+      _SubtermStep_annotatedBody>>: constant $ pair true (var "usedApp"),
       -- Let body and binding are pass-through
-      _TermAccessor_letBody>>: constant $ pair true (var "usedApp"),
-      _TermAccessor_letBinding>>: constant $ pair true (var "usedApp"),
+      _SubtermStep_letBody>>: constant $ pair true (var "usedApp"),
+      _SubtermStep_letBinding>>: constant $ pair true (var "usedApp"),
       -- Lambda body: pass-through if we haven't used app LHS yet
-      _TermAccessor_lambdaBody>>: constant $
+      _SubtermStep_lambdaBody>>: constant $
         Logic.ifElse (var "usedApp")
           (pair false true)   -- After app LHS, lambda body is not pass-through
           (pair true false),  -- Before app LHS, lambda body is pass-through
       -- Case branches: same rules as lambda body
-      _TermAccessor_unionCasesBranch>>: constant $
+      _SubtermStep_unionCasesBranch>>: constant $
         Logic.ifElse (var "usedApp")
           (pair false true)
           (pair true false),
-      _TermAccessor_unionCasesDefault>>: constant $
+      _SubtermStep_unionCasesDefault>>: constant $
         Logic.ifElse (var "usedApp")
           (pair false true)
           (pair true false),
       -- Application function (LHS): mark usedApp=true
-      _TermAccessor_applicationFunction>>: constant $
+      _SubtermStep_applicationFunction>>: constant $
         Logic.ifElse (var "usedApp")
           (pair false true)  -- Already used app, not at top level
           (pair true true),  -- First app, still at top level but mark usedApp
       -- Application argument: takes us out of top level
-      _TermAccessor_applicationArgument>>: constant $ pair false (var "usedApp")])
+      _SubtermStep_applicationArgument>>: constant $ pair false (var "usedApp")])
 
 -- | Normalize a path by handling immediately-applied lambdas.
 -- The pattern [applicationFunction, lambdaBody, ...] represents (\x -> ...) arg
 -- which is semantically equivalent to let x = arg in ...
 -- We replace applicationFunction followed by lambdaBody with just letBody,
 -- which allows the case inside to remain at "top level".
-normalizePathForHoisting :: TBinding ([TermAccessor] -> [TermAccessor])
+normalizePathForHoisting :: TBinding ([SubtermStep] -> [SubtermStep])
 normalizePathForHoisting = define "normalizePathForHoisting" $
   doc ("Normalize a path for hoisting by treating immediately-applied lambdas as let bindings."
     <> " Replaces [applicationFunction, lambdaBody, ...] with [letBody, ...].") $
@@ -668,25 +655,25 @@
        Logic.ifElse (Logic.and (isApplicationFunction @@ var "first")
                                (isLambdaBody @@ var "second"))
          -- Replace with letBody and continue
-         (Lists.cons (inject _TermAccessor _TermAccessor_letBody unit)
+         (Lists.cons (inject _SubtermStep _SubtermStep_letBody unit)
                      (var "go" @@ var "rest"))
          -- Keep first element and continue
          (Lists.cons (var "first") (var "go" @@ Lists.tail (var "remaining"))))) $
   var "go" @@ var "path"
 
 -- | Check if an accessor is applicationFunction
-isApplicationFunction :: TBinding (TermAccessor -> Bool)
+isApplicationFunction :: TBinding (SubtermStep -> Bool)
 isApplicationFunction = define "isApplicationFunction" $
-  "acc" ~> cases _TermAccessor (var "acc")
+  "acc" ~> cases _SubtermStep (var "acc")
     (Just false) [
-    _TermAccessor_applicationFunction>>: constant true]
+    _SubtermStep_applicationFunction>>: constant true]
 
 -- | Check if an accessor is lambdaBody
-isLambdaBody :: TBinding (TermAccessor -> Bool)
+isLambdaBody :: TBinding (SubtermStep -> Bool)
 isLambdaBody = define "isLambdaBody" $
-  "acc" ~> cases _TermAccessor (var "acc")
+  "acc" ~> cases _SubtermStep (var "acc")
     (Just false) [
-    _TermAccessor_lambdaBody>>: constant true]
+    _SubtermStep_lambdaBody>>: constant true]
 
 -- | Predicate for hoisting case statement applications (union elimination applied to an argument).
 -- Returns True if the term is a case statement application AND it is NOT at "top level".
@@ -705,7 +692,7 @@
 --   - "atRoot": can pass through annotations, let body/binding, lambda body, or ONE app LHS
 --   - "afterAppLHS": have used the one app LHS, can only pass through annotations
 --   - Any other accessor: not at top level, should hoist if it's a case
-shouldHoistCaseStatement :: TBinding (([TermAccessor], Term) -> Bool)
+shouldHoistCaseStatement :: TBinding (([SubtermStep], Term) -> Bool)
 shouldHoistCaseStatement = define "shouldHoistCaseStatement" $
   doc ("Predicate for case statement hoisting."
     <> " Returns True if term is a union elimination (bare case function) or a case statement application"
@@ -728,10 +715,10 @@
     -- If still at top level, don't hoist. If not at top level, hoist.
     Logic.not $ Pairs.first $ var "finalState")
 
-hoistSubterms :: TBinding ((([TermAccessor], Term) -> Bool) -> TypeContext -> Term -> Term)
+hoistSubterms :: TBinding ((([SubtermStep], Term) -> Bool) -> Graph -> Term -> Term)
 hoistSubterms = define "hoistSubterms" $
   doc ("Hoist subterms into local let bindings based on a path-aware predicate."
-    <> " The predicate receives a pair of (path, term) where path is the list of TermAccessors"
+    <> " The predicate receives a pair of (path, term) where path is the list of SubtermSteps"
     <> " from the root to the current term, and returns True if the term should be hoisted."
     <> " For each let term found, the immediate subterms (binding values and body) are processed:"
     <> " matching subterms within each immediate subterm are collected and hoisted into a local let"
@@ -743,7 +730,7 @@
 
   -- Process a single immediate subterm: find all hoistable subterms, extract them, wrap in local let
   -- Returns (newCounter, transformedSubterm)
-  -- Uses rewriteAndFoldTermWithTypeContextAndPath to track paths and type context
+  -- Uses Rewriting.rewriteAndFoldTermWithGraphAndPath to track paths and graph context
   -- The accumulator is (counter, [Binding])
   -- The namePrefix parameter is used to create stable hoisted binding names (e.g., the parent binding's name)
   -- The pathPrefix parameter provides the path context from enclosing scopes, allowing
@@ -753,7 +740,7 @@
   "processImmediateSubterm" <~ ("cx" ~> "counter" ~> "namePrefix" ~> "pathPrefix" ~> "subterm" ~>
     -- Lambda variables that exist at the level of the let (before processing this subterm)
     -- These don't need to be captured since they're in scope at the hoisting site
-    "baselineLambdaVars" <~ Typing.typeContextLambdaVariables (var "cx") $
+    "baselineLambdaVars" <~ Graph.graphLambdaVariables (var "cx") $
     -- Collect all hoistable subterms and their replacements using a fold
     -- The accumulator is (counter, [Binding])
     -- Important: We stop at let and type lambda boundaries - nested lets are handled by the outer rewrite loop,
@@ -761,8 +748,8 @@
     --
     -- The user function receives:
     --   recurse :: a -> Term -> (a, Term) - framework handles subterm iteration
-    --   path :: [TermAccessor]
-    --   cx :: TypeContext
+    --   path :: [SubtermStep]
+    --   cx :: Graph
     --   acc :: (counter, [Binding])
     --   term :: Term
     "collectAndReplace" <~ ("recurse" ~> "path" ~> "cxInner" ~> "acc" ~> "term" ~>
@@ -782,16 +769,21 @@
           Logic.ifElse (var "shouldHoist" @@ pair (var "fullPath") (var "processedTerm"))
             -- Hoist: add to collected bindings, return reference
             -- Use the namePrefix to create stable names: _hoist_<prefix>_<counter>
-            ("bindingName" <~ Core.name (Strings.cat (list [string "_hoist_", var "namePrefix", string "_", Literals.showInt32 (var "newCounter")])) $
+            -- Use chooseUniqueName to avoid collisions with names in the enclosing scope
+            ("proposedName" <~ Core.name (Strings.cat (list [string "_hoist_", var "namePrefix", string "_", Literals.showInt32 (var "newCounter")])) $
+             "existingNames" <~ Sets.fromList (Lists.map (lambda "b" $ Core.bindingName (var "b")) (var "newBindings")) $
+             "freeVarsInSubterm" <~ Rewriting.freeVariablesInTerm @@ var "subterm" $
+             "allReserved" <~ Sets.union (var "existingNames") (var "freeVarsInSubterm") $
+             "bindingName" <~ Lexical.chooseUniqueName @@ var "allReserved" @@ var "proposedName" $
              -- Find lambda-bound variables that need to be captured
              -- Only capture variables that were added INSIDE this subterm (not at the let level)
-             "allLambdaVars" <~ Typing.typeContextLambdaVariables (var "cxInner") $
+             "allLambdaVars" <~ Graph.graphLambdaVariables (var "cxInner") $
              -- Get names that are new lambda vars (in current scope but not baseline)
              "newLambdaVars" <~ Sets.difference (var "allLambdaVars") (var "baselineLambdaVars") $
              "freeVars" <~ Rewriting.freeVariablesInTerm @@ var "processedTerm" $
              "capturedVars" <~ Sets.toList (Sets.intersection (var "newLambdaVars") (var "freeVars")) $
              -- Wrap the term in lambdas for each captured variable, looking up their types from the context
-             "typeMap" <~ Typing.typeContextTypes (var "cxInner") $
+             "typeMap" <~ Maps.map (Rewriting.typeSchemeToFType) (Graph.graphBoundTypes (var "cxInner")) $
              "wrappedTerm" <~ Lists.foldl
                ("body" ~> "varName" ~>
                  Core.termFunction $ Core.functionLambda $ Core.lambda (var "varName")
@@ -819,7 +811,7 @@
          _Term_typeLambda>>: constant $ pair (var "acc") (var "term")]) $
     -- Run the collection/replacement pass using the path-aware rewriter
     -- Initial acc is (counter, []) - counter and empty list of bindings
-    "result" <~ rewriteAndFoldTermWithTypeContextAndPath
+    "result" <~ Rewriting.rewriteAndFoldTermWithGraphAndPath
       @@ var "collectAndReplace"
       @@ var "cx"
       @@ pair (var "counter") (list ([] :: [TTerm Binding]))
@@ -853,7 +845,7 @@
       -- Replace dots with underscores to avoid creating module-like names
       "namePrefix" <~ Strings.intercalate (string "_") (Strings.splitOn (string ".") (Core.unName (Core.bindingName (var "binding")))) $
       -- Build the pathPrefix for this binding: outer path + letBinding accessor
-      "bindingPathPrefix" <~ Lists.concat2 (var "path") (list [inject _TermAccessor _TermAccessor_letBinding (Core.bindingName $ var "binding")]) $
+      "bindingPathPrefix" <~ Lists.concat2 (var "path") (list [inject _SubtermStep _SubtermStep_letBinding (Core.bindingName $ var "binding")]) $
       -- Each sibling starts fresh with counter 1 - prefix makes names unique
       "result" <~ var "processImmediateSubterm" @@ var "cx" @@ int32 1 @@ var "namePrefix" @@ var "bindingPathPrefix" @@ (Core.bindingTerm (var "binding")) $
       "newValue" <~ Pairs.second (var "result") $
@@ -862,16 +854,19 @@
     -- Fold over bindings, starting with empty list
     "newBindingsReversed" <~ Lists.foldl (var "processBinding") (list ([] :: [TTerm Binding])) (var "bindings") $
     "newBindings" <~ Lists.reverse (var "newBindingsReversed") $
-    -- Process the body with "_body" as the prefix, also starting with counter 1
+    -- Process the body with a unique prefix, also starting with counter 1
     -- Build the pathPrefix for the body: outer path + letBody accessor
-    "bodyPathPrefix" <~ Lists.concat2 (var "path") (list [inject _TermAccessor _TermAccessor_letBody unit]) $
-    "bodyResult" <~ var "processImmediateSubterm" @@ var "cx" @@ int32 1 @@ string "_body" @@ var "bodyPathPrefix" @@ var "body" $
+    "bodyPathPrefix" <~ Lists.concat2 (var "path") (list [inject _SubtermStep _SubtermStep_letBody unit]) $
+    -- Use the first binding's name to disambiguate the body prefix across nesting levels
+    "firstBindingName" <~ Maybes.maybe (string "body") (lambda "b" $ Strings.intercalate (string "_") (Strings.splitOn (string ".") (Core.unName (Core.bindingName (var "b"))))) (Lists.safeHead (var "bindings")) $
+    "bodyPrefix" <~ Strings.cat2 (var "firstBindingName") (string "_body") $
+    "bodyResult" <~ var "processImmediateSubterm" @@ var "cx" @@ int32 1 @@ var "bodyPrefix" @@ var "bodyPathPrefix" @@ var "body" $
     "newBody" <~ Pairs.second (var "bodyResult") $
     -- Return the original counter (siblings are independent, so counter doesn't propagate)
     pair (var "counter") (Core.termLet (Core.let_ (var "newBindings") (var "newBody")))) $
 
   -- Main rewrite: find let terms and process them
-  -- Uses rewriteAndFoldTermWithTypeContextAndPath so we have the path context.
+  -- Uses Rewriting.rewriteAndFoldTermWithGraphAndPath so we have the path context.
   -- The path is passed to processLetTerm, which forwards it as pathPrefix to
   -- processImmediateSubterm, so inner collectAndReplace knows the full context
   -- (e.g., that it's inside a case branch of an applied case).
@@ -887,123 +882,5 @@
           (Just $ pair (var "newCounter") (var "recursedTerm")) [
           _Term_let>>: "lt2" ~> var "processLetTerm" @@ var "cx" @@ var "newCounter" @@ var "path" @@ var "lt2"]]) $
 
-  Pairs.second $ rewriteAndFoldTermWithTypeContextAndPath @@ var "rewrite" @@ var "cx0" @@ int32 1 @@ var "term0"
-
-rewriteAndFoldTermWithTypeContext :: TBinding (((a -> Term -> (a, Term)) -> TypeContext -> a -> Term -> (a, Term)) -> TypeContext -> a -> Term -> (a, Term))
-rewriteAndFoldTermWithTypeContext = define "rewriteAndFoldTermWithTypeContext" $
-  doc ("Rewrite a term while folding to produce a value, with TypeContext updated as we descend into subterms."
-    <> " Combines the features of rewriteAndFoldTerm and rewriteTermWithTypeContext."
-    <> " The user function f receives a recurse function that handles subterm traversal and TypeContext management.") $
-  "f" ~> "cx0" ~> "val0" ~> "term0" ~>
-  -- wrapper is the function we pass to rewriteAndFoldTerm
-  -- Combined state is (val, cx). The low-level recurse handles term structure traversal.
-  "wrapper" <~ ("lowLevelRecurse" ~> "valAndCx" ~> "term" ~>
-    "val" <~ Pairs.first (var "valAndCx") $
-    "cx" <~ Pairs.second (var "valAndCx") $
-    -- Determine updated context based on the current term
-    "cx1" <~ (cases _Term (var "term")
-      (Just $ var "cx") [
-      _Term_function>>: "fun" ~> cases _Function (var "fun")
-        (Just $ var "cx") [
-        _Function_lambda>>: "l" ~> Schemas.extendTypeContextForLambda @@ var "cx" @@ var "l"],
-      _Term_let>>: "l" ~> Schemas.extendTypeContextForLet @@ constant (constant nothing) @@ var "cx" @@ var "l",
-      _Term_typeLambda>>: "tl" ~> Schemas.extendTypeContextForTypeLambda @@ var "cx" @@ var "tl"]) $
-    -- Create a recurse function for the user that unwraps/wraps the combined state
-    "recurseForUser" <~ ("newVal" ~> "subterm" ~>
-      -- Call low-level recurse with combined state (newVal, cx1)
-      -- Note: cx1 is the context for subterms of the current term
-      "result" <~ var "lowLevelRecurse" @@ pair (var "newVal") (var "cx1") @@ var "subterm" $
-      -- Return just (val', term') to the user
-      pair (Pairs.first $ Pairs.first $ var "result") (Pairs.second $ var "result")) $
-    -- Call the user's function with the context-aware recurse
-    "fResult" <~ var "f" @@ var "recurseForUser" @@ var "cx1" @@ var "val" @@ var "term" $
-    -- Combine the result with cx (original context, not cx1) so sibling terms don't inherit each other's extensions
-    pair (pair (Pairs.first $ var "fResult") (var "cx")) (Pairs.second $ var "fResult")) $
-  -- Use rewriteAndFoldTerm to handle the actual traversal, with (val, cx) as combined state
-  "result" <~ Rewriting.rewriteAndFoldTerm @@ var "wrapper" @@ pair (var "val0") (var "cx0") @@ var "term0" $
-  -- Extract just the val part of the result
-  pair (Pairs.first $ Pairs.first $ var "result") (Pairs.second $ var "result")
-
--- | The most general-purpose term rewriting function, combining:
---   - Folding to produce a value (like rewriteAndFoldTerm)
---   - TypeContext tracking (like rewriteTermWithTypeContext)
---   - Path tracking via TermAccessors (like rewriteAndFoldTermWithPath)
---
--- This function wraps rewriteAndFoldTermWithPath, automatically managing
--- TypeContext updates as the traversal descends into lambdas, lets, and type lambdas.
---
--- The user function receives:
---   - A recurse function: a -> Term -> (a, Term) - called by framework during traversal
---   - The current path (list of TermAccessors from root to current position)
---   - The current TypeContext (updated for the current position)
---   - The current accumulated value
---   - The current term
--- And returns (newVal, newTerm)
-rewriteAndFoldTermWithTypeContextAndPath :: TBinding (
-  ((a -> Term -> (a, Term)) -> [TermAccessor] -> TypeContext -> a -> Term -> (a, Term))
-  -> TypeContext -> a -> Term -> (a, Term))
-rewriteAndFoldTermWithTypeContextAndPath = define "rewriteAndFoldTermWithTypeContextAndPath" $
-  doc ("Rewrite a term while folding to produce a value, with both TypeContext and accessor path tracked."
-    <> " The path is a list of TermAccessors representing the position from the root to the current term."
-    <> " Combines the features of rewriteAndFoldTermWithPath and TypeContext tracking."
-    <> " The TypeContext is automatically updated when descending into lambdas, lets, and type lambdas.") $
-  "f" ~> "cx0" ~> "val0" ~> "term0" ~>
-  -- Combined state is (TypeContext, a). We wrap rewriteAndFoldTermWithPath.
-  -- The wrapper function receives recurse, path, (cx, val), term and returns ((cx, val), term)
-  "wrapper" <~ ("recurse" ~> "path" ~> "cxAndVal" ~> "term" ~>
-    "cx" <~ Pairs.first (var "cxAndVal") $
-    "val" <~ Pairs.second (var "cxAndVal") $
-    -- Determine updated context based on the current term
-    "cx1" <~ (cases _Term (var "term")
-      (Just $ var "cx") [
-      _Term_function>>: "fun" ~> cases _Function (var "fun")
-        (Just $ var "cx") [
-        _Function_lambda>>: "l" ~> Schemas.extendTypeContextForLambda @@ var "cx" @@ var "l"],
-      _Term_let>>: "l" ~> Schemas.extendTypeContextForLet @@ constant (constant nothing) @@ var "cx" @@ var "l",
-      _Term_typeLambda>>: "tl" ~> Schemas.extendTypeContextForTypeLambda @@ var "cx" @@ var "tl"]) $
-    -- Create a recurse function for the user that uses the combined state
-    -- Note: the user's recurse takes just (val, term) but the framework's recurse
-    -- takes (path, val, term). We pass the current path through.
-    "recurseForUser" <~ ("valIn" ~> "termIn" ~>
-      -- Call the framework recurse with path and combined state (cx1, valIn)
-      -- Note: cx1 is the context for subterms of the current term
-      "result" <~ var "recurse" @@ var "path" @@ pair (var "cx1") (var "valIn") @@ var "termIn" $
-      -- Return just (val', term') to the user - discard the context from result
-      pair (Pairs.second $ Pairs.first $ var "result") (Pairs.second $ var "result")) $
-    -- Call the user's function with the updated context and user-facing recurse
-    "fResult" <~ var "f" @@ var "recurseForUser" @@ var "path" @@ var "cx1" @@ var "val" @@ var "term" $
-    -- Return with combined state: ((cx, val'), term')
-    -- Note: we return the original cx, not cx1, because cx1 is for subterms
-    pair (pair (var "cx") (Pairs.first $ var "fResult")) (Pairs.second $ var "fResult")) $
-  -- Use rewriteAndFoldTermWithPath with combined state (cx0, val0)
-  "result" <~ Rewriting.rewriteAndFoldTermWithPath @@ var "wrapper" @@ pair (var "cx0") (var "val0") @@ var "term0" $
-  -- Extract just the val part of the result
-  pair (Pairs.second $ Pairs.first $ var "result") (Pairs.second $ var "result")
+  Pairs.second $ Rewriting.rewriteAndFoldTermWithGraphAndPath @@ var "rewrite" @@ var "cx0" @@ int32 1 @@ var "term0"
 
-rewriteTermWithTypeContext :: TBinding (((Term -> Term) -> TypeContext -> Term -> Term) -> TypeContext -> Term -> Term)
-rewriteTermWithTypeContext = define "rewriteTermWithTypeContext" $
-  doc "Rewrite a term with the help of a type context which is updated as we descend into subterms" $
-  "f" ~> "cx0" ~> "term0" ~>
-  -- f2 wraps f to handle TypeContext updates for lambda/let/typeLambda
-  "f2" <~ ("recurse" ~> "cx" ~> "term" ~>
-    -- recurse1 is what the user sees: it takes just term and handles cx internally
-    "recurse1" <~ ("term" ~> var "recurse" @@ var "cx" @@ var "term") $
-    -- Determine updated context based on term type, then call user's f
-    cases _Term (var "term") (Just $ var "f" @@ var "recurse1" @@ var "cx" @@ var "term") [
-      _Term_function>>: "fun" ~> cases _Function (var "fun")
-        (Just $ var "f" @@ var "recurse1" @@ var "cx" @@ var "term") [
-        _Function_lambda>>: "l" ~>
-          "cx1" <~ Schemas.extendTypeContextForLambda @@ var "cx" @@ var "l" $
-          "recurse2" <~ ("term" ~> var "recurse" @@ var "cx1" @@ var "term") $
-          var "f" @@ var "recurse2" @@ var "cx1" @@ var "term"],
-      _Term_let>>: "l" ~>
-        "cx1" <~ Schemas.extendTypeContextForLet @@ constant (constant nothing) @@ var "cx" @@ var "l" $
-        "recurse2" <~ ("term" ~> var "recurse" @@ var "cx1" @@ var "term") $
-        var "f" @@ var "recurse2" @@ var "cx1" @@ var "term",
-      _Term_typeLambda>>: "tl" ~>
-        "cx1" <~ Schemas.extendTypeContextForTypeLambda @@ var "cx" @@ var "tl" $
-        "recurse2" <~ ("term" ~> var "recurse" @@ var "cx1" @@ var "term") $
-        var "f" @@ var "recurse2" @@ var "cx1" @@ var "term"]) $
-  -- Local fixpoint that threads context through
-  "rewrite" <~ ("cx" ~> "term" ~> var "f2" @@ (var "rewrite") @@ var "cx" @@ var "term") $
-  var "rewrite" @@ var "cx0" @@ var "term0"
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Inference.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Inference.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Inference.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Inference.hs
@@ -3,1308 +3,1340 @@
 
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (
-  bindConstraints, bindUnboundTypeVariables, buildTypeApplicationTerm, emptyInferenceContext,
-  extendContext, finalizeInferredTerm, forInferredTerm, freeVariablesInContext, freshVariableType,
-  generalize, inferGraphTypes, inferInGraphContext, inferMany, inferTypeOf, inferTypeOfAnnotatedTerm,
-  inferTypeOfApplication, inferTypeOfCaseStatement, inferTypeOfCollection, inferTypeOfEither,
-  inferTypeOfElimination, inferTypeOfFunction, inferTypeOfInjection, inferTypeOfLambda, inferTypeOfLet,
-  inferTypeOfLetNormalized, inferTypeOfList, inferTypeOfLiteral, inferTypeOfMap, inferTypeOfOptional,
-  inferTypeOfPair, inferTypeOfPrimitive, inferTypeOfProjection, inferTypeOfRecord, inferTypeOfSet,
-  inferTypeOfTerm, inferTypeOfTypeLambda, inferTypeOfTypeApplication, inferTypeOfUnit, inferTypeOfUnwrap,
-  inferTypeOfVariable, inferTypeOfWrappedTerm, inferTypesOfTemporaryBindings, initialTypeContext,
-  isUnbound, mapConstraints, mergeClassConstraints, showInferenceResult, yield, yieldChecked,
-  yieldCheckedWithConstraints, yieldDebug, yieldWithConstraints)
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Annotations  as Annotations
-import qualified Hydra.Sources.Kernel.Terms.Checking     as Checking
-import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
-import qualified Hydra.Sources.Kernel.Terms.Lexical      as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads       as Monads
-import qualified Hydra.Sources.Kernel.Terms.Reflect      as Reflect
-import qualified Hydra.Sources.Kernel.Terms.Rewriting    as Rewriting
-import qualified Hydra.Sources.Kernel.Terms.Schemas      as Schemas
-import qualified Hydra.Sources.Kernel.Terms.Show.Core    as ShowCore
-import qualified Hydra.Sources.Kernel.Terms.Show.Typing  as ShowTyping
-import qualified Hydra.Sources.Kernel.Terms.Sorting      as Sorting
-import qualified Hydra.Sources.Kernel.Terms.Substitution as Substitution
-import qualified Hydra.Sources.Kernel.Terms.Unification  as Unification
-
-
-ns :: Namespace
-ns = Namespace "hydra.inference"
-
-module_ :: Module
-module_ = Module ns elements
-    [Annotations.ns, Checking.ns, ExtractCore.ns, Lexical.ns, Monads.ns, Reflect.ns,
-      Rewriting.ns, Schemas.ns, ShowCore.ns, ShowTyping.ns, Sorting.ns, Substitution.ns,
-      Unification.ns]
-    kernelTypesNamespaces $
-    Just "Type inference following Algorithm W, extended for nominal terms and types"
-  where
-    elements = [
-      toBinding bindConstraints,
-      toBinding bindUnboundTypeVariables,
-      toBinding buildTypeApplicationTerm,
-      toBinding emptyInferenceContext,
-      toBinding extendContext,
-      toBinding finalizeInferredTerm,
-      toBinding forInferredTerm,
-      toBinding freeVariablesInContext,
-      toBinding freshVariableType,
-      toBinding generalize,
-      toBinding inferGraphTypes,
-      toBinding inferInGraphContext,
-      toBinding inferMany,
-      toBinding inferTypeOfAnnotatedTerm,
-      toBinding inferTypeOfApplication,
-      toBinding inferTypeOfCaseStatement,
-      toBinding inferTypeOfCollection,
-      toBinding inferTypeOf,
-      toBinding inferTypeOfEither,
-      toBinding inferTypeOfElimination,
-      toBinding inferTypeOfFunction,
-      toBinding inferTypeOfInjection,
-      toBinding inferTypeOfLambda,
-      toBinding inferTypeOfLetNormalized,
-      toBinding inferTypeOfLet,
-      toBinding inferTypeOfList,
-      toBinding inferTypeOfLiteral,
-      toBinding inferTypeOfMap,
-      toBinding inferTypeOfOptional,
-      toBinding inferTypeOfPair,
-      toBinding inferTypeOfPrimitive,
-      toBinding inferTypeOfProjection,
-      toBinding inferTypeOfRecord,
-      toBinding inferTypeOfSet,
-      toBinding inferTypeOfTerm,
-      toBinding inferTypeOfTypeLambda,
-      toBinding inferTypeOfTypeApplication,
-      toBinding inferTypeOfUnit,
-      toBinding inferTypeOfUnwrap,
-      toBinding inferTypeOfVariable,
-      toBinding inferTypeOfWrappedTerm,
-      toBinding inferTypesOfTemporaryBindings,
-      toBinding initialTypeContext,
-      toBinding isUnbound,
-      toBinding mapConstraints,
-      toBinding mergeClassConstraints,
-      toBinding showInferenceResult,
-      toBinding yield,
-      toBinding yieldChecked,
-      toBinding yieldCheckedWithConstraints,
-      toBinding yieldDebug,
-      toBinding yieldWithConstraints]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
---
-
-bindConstraints :: TBinding (InferenceContext -> (TypeSubst -> Flow s a) -> [TypeConstraint] -> Flow s a)
-bindConstraints = define "bindConstraints" $
-  doc "Bind type constraints and continue with substitution" $
-  "cx" ~> "f" ~> "constraints" ~>
-  "s" <<~ Unification.unifyTypeConstraints @@ Typing.inferenceContextSchemaTypes (var "cx") @@ var "constraints" $
-  exec (Checking.checkTypeSubst @@ var "cx" @@ var "s") $
-  var "f" @@ var "s"
-
-bindUnboundTypeVariables :: TBinding (InferenceContext -> Term -> Term)
-bindUnboundTypeVariables = define "bindUnboundTypeVariables" $
-  doc ("Place unbound type variables appearing anywhere under a typed let binding in the type scheme of that binding."
-    <> " These variables may appear in the binding type scheme itself or in that of a subterm,"
-    <> " in domain types attached to functions, and in type abstraction and type application terms."
-    <> " This process attempts to capture type variables which have escaped unification, e.g. due to unused code."
-    <> " However, unbound type variables not appearing beneath any typed let binding remain unbound.") $
-  "cx" ~> "term0" ~>
-  "svars" <~ Sets.fromList (Maps.keys $ Typing.inferenceContextSchemaTypes $ var "cx") $
-  "rewrite" <~ ("recurse" ~> "term" ~> cases _Term (var "term")
-    (Just $ var "recurse" @@ var "term") [
-    _Term_let>>: "l" ~>
-      "forBinding" <~ ("b" ~>
-        "bname" <~ (Core.bindingName $ var "b") $
-        "bterm" <~ (Core.bindingTerm $ var "b") $
-        optCases (Core.bindingType $ var "b")
-          (Core.binding (var "bname") (bindUnboundTypeVariables @@ var "cx" @@ var "bterm") nothing)
-          ("ts" ~>
-            "bvars" <~ Sets.fromList (Core.typeSchemeVariables $ var "ts") $
-            "unboundInType" <~ Rewriting.freeVariablesInType @@ (Core.typeSchemeType $ var "ts") $
-            "unboundInTerm" <~ Rewriting.freeTypeVariablesInTerm @@ var "bterm" $
-            "unbound" <~ Sets.toList (Sets.difference
-              (Sets.union (var "unboundInType") (var "unboundInTerm"))
-              (Sets.union (var "svars") (var "bvars"))) $
-            "ts2" <~ Core.typeScheme
-              (Lists.concat2
-                (Core.typeSchemeVariables $ var "ts")
-                (var "unbound"))
-              (Core.typeSchemeType $ var "ts")
-              (Core.typeSchemeConstraints $ var "ts") $
-            "bterm2" <~ Lists.foldl
-              ("t" ~> "v" ~> Core.termTypeLambda
-                (Core.typeLambda (var "v") (var "t")))
-              (var "bterm")
-              (var "unbound") $
-            Core.binding (var "bname") (var "bterm2") (just $ var "ts2"))) $
-      Core.termLet $ Core.let_
-        (Lists.map (var "forBinding") (Core.letBindings $ var "l"))
-        (bindUnboundTypeVariables @@ var "cx" @@ (Core.letBody $ var "l"))]) $
-  Rewriting.rewriteTerm @@ var "rewrite" @@ var "term0"
-
-buildTypeApplicationTerm :: TBinding ([Name] -> Term -> Term)
-buildTypeApplicationTerm = define "buildTypeApplicationTerm" $
-  doc "Fold a list of type variables over a term to build a type application term" $
-  "tvars" ~> "body" ~> Lists.foldl
-    ("t" ~> "v" ~> Core.termTypeApplication $ Core.typeApplicationTerm (var "t") (Core.typeVariable (var "v")))
-    (var "body")
-    (var "tvars")
-
-emptyInferenceContext :: TBinding InferenceContext
-emptyInferenceContext = define "emptyInferenceContext" $
-  doc "An empty inference context" $
-  Typing.inferenceContext
-    (Maps.empty)
-    (Maps.empty)
-    (Maps.empty)
-    (Maps.empty)
-    false
-
-extendContext :: TBinding ([(Name, TypeScheme)] -> InferenceContext -> InferenceContext)
-extendContext = define "extendContext" $
-  doc "Add (term variable, type scheme) pairs to the typing environment" $
-  "pairs" ~> "cx" ~>
-  Typing.inferenceContextWithDataTypes (var "cx") $ Maps.union
-    (Maps.fromList $ var "pairs")
-    (Typing.inferenceContextDataTypes $ var "cx")
-
-finalizeInferredTerm :: TBinding (InferenceContext -> Term -> Flow s Term)
-finalizeInferredTerm = define "finalizeInferredTerm" $
-  doc "Finalize an inferred term by checking for unbound type variables, then normalizing type variables" $
-  "cx" ~> "term" ~>
-  -- TODO: restore these (but make sure type checking tests pass)
-  "term2" <~ bindUnboundTypeVariables @@ var "cx" @@ var "term" $
-  exec (Checking.checkForUnboundTypeVariables @@ var "cx" @@ var "term2") $
---  "term2" <~ var "term" $
-  produce $ Rewriting.normalizeTypeVariablesInTerm @@ var "term2"
-
-forInferredTerm :: TBinding (InferenceContext -> Term -> String -> (InferenceResult -> a) -> Flow s a)
-forInferredTerm = define "forInferredTerm" $
-  doc "Infer a term's type and map over the result" $
-  "cx" ~> "term" ~> "desc" ~> "f" ~>
-  Flows.map (var "f") $ inferTypeOfTerm @@ var "cx" @@ var "term" @@ var "desc"
-
-freeVariablesInContext :: TBinding (InferenceContext -> S.Set Name)
-freeVariablesInContext = define "freeVariablesInContext" $
-  doc "Get all free variables in an inference context" $
-  "cx" ~>
-    Lists.foldl (binaryFunction Sets.union) Sets.empty $
-      Lists.map (Rewriting.freeVariablesInTypeSchemeSimple) $
-        Maps.elems $ Typing.inferenceContextDataTypes $ var "cx"
-
-freshVariableType :: TBinding (Flow s Type)
-freshVariableType = define "freshVariableType" $
-  doc "Generate a fresh type variable" $
-  Flows.map (unaryFunction Core.typeVariable) (Schemas.freshName)
-
-mergeClassConstraints :: TBinding (M.Map Name TypeVariableMetadata -> M.Map Name TypeVariableMetadata -> M.Map Name TypeVariableMetadata)
-mergeClassConstraints = define "mergeClassConstraints" $
-  doc "Merge two maps of class constraints. When both maps have constraints for the same variable, union the class sets." $
-  "m1" ~> "m2" ~>
-  Lists.foldl
-    ("acc" ~> "pair" ~>
-      "k" <~ Pairs.first (var "pair") $
-      "v" <~ Pairs.second (var "pair") $
-      Maybes.maybe
-        (Maps.insert (var "k") (var "v") (var "acc"))
-        ("existing" ~>
-          "merged" <~ Core.typeVariableMetadata (Sets.union (Core.typeVariableMetadataClasses $ var "existing") (Core.typeVariableMetadataClasses $ var "v")) $
-          Maps.insert (var "k") (var "merged") (var "acc"))
-        (Maps.lookup (var "k") (var "acc")))
-    (var "m1")
-    (Maps.toList $ var "m2")
-
-generalize :: TBinding (InferenceContext -> Type -> TypeScheme)
-generalize = define "generalize" $
-  doc "Generalize a type to a type scheme" $
-  "cx" ~> "typ" ~>
-  -- IMPORTANT: freeVariablesInTypeOrdered returns ALL names from Type_variable positions,
-  -- including qualified type names (like hydra.compute.Flow) which are NOT actual type variables.
-  -- We must filter these out to avoid quantifying over type names.
-  "isTypeVarName" <~ ("name" ~>
-    "parts" <~ Strings.splitOn (string ".") (Core.unName $ var "name") $
-    Equality.lte (Lists.length $ var "parts") (int32 1)) $
-  "vars" <~ Lists.nub (Lists.filter ("v" ~> Logic.and (isUnbound @@ var "cx" @@ var "v") (var "isTypeVarName" @@ var "v")) $
-     Rewriting.freeVariablesInTypeOrdered @@ var "typ") $
-  -- Extract constraints for the generalized variables from the context
-  "allConstraints" <~ Typing.inferenceContextClassConstraints (var "cx") $
-  "relevantConstraints" <~ Maps.fromList (Maybes.cat $ Lists.map
-    ("v" ~> Maybes.map ("meta" ~> pair (var "v") (var "meta")) $ Maps.lookup (var "v") (var "allConstraints"))
-    (var "vars")) $
-  -- Only include constraints if there are any
-  "constraintsMaybe" <~ Logic.ifElse (Maps.null $ var "relevantConstraints") Phantoms.nothing (just $ var "relevantConstraints") $
-  Core.typeScheme (var "vars") (var "typ") (var "constraintsMaybe")
-
-inferGraphTypes :: TBinding (Graph -> Flow s Graph)
-inferGraphTypes = define "inferGraphTypes" $
-  doc "Infer types for all elements in a graph" $
-  "g0" ~>
-  "fromLetTerm" <~ ("l" ~>
-    "bindings" <~ Core.letBindings (var "l") $
-    "body" <~ Core.letBody (var "l") $
-    Graph.graph
-      (var "bindings")
-      (Maps.empty)
-      (Maps.empty)
-      (var "body")
-      (Graph.graphPrimitives $ var "g0")
-      (Graph.graphSchema $ var "g0")) $
-  "toLetTerm" <~ ("g" ~>
-    "toBinding" <~ ("el" ~> Core.binding
-      (Core.bindingName $ var "el")
-      (Core.bindingTerm $ var "el")
-      (Core.bindingType $ var "el")) $  -- Preserve original TypeScheme with its constraints
-    Core.termLet $ Core.let_
-      (Lists.map (var "toBinding") $ Graph.graphElements $ var "g")
-      (Graph.graphBody $ var "g")) $
-  "forFinal" <~ ("finalized" ~> cases _Term (var "finalized")
-    Nothing [
-    _Term_let>>: "l" ~> Flows.pure $ var "fromLetTerm" @@ var "l",
-    _Term_variable>>: constant $ Flows.fail $ (string "Expected inferred graph as let term")]) $
-  trace (string "graph inference") $
-  "cx" <<~ Schemas.graphToInferenceContext @@ var "g0" $
-  "result" <<~ inferTypeOfTerm @@ var "cx" @@ (var "toLetTerm" @@ var "g0") @@ (string "graph term") $
-  "term" <~ Typing.inferenceResultTerm (var "result") $
-  "ts" <~ Typing.inferenceResultType (var "result") $
-  "finalized" <<~ finalizeInferredTerm @@ var "cx" @@ var "term" $
-  var "forFinal" @@ var "finalized"
-
--- Note: this operation is expensive, as it creates a new typing environment for each individual term
-inferInGraphContext :: TBinding (Term -> Flow Graph InferenceResult)
-inferInGraphContext = define "inferInGraphContext" $
-  doc "Infer the type of a term in graph context" $
-  "term" ~>
-  "g" <<~ Monads.getState $
-  "cx" <<~ Schemas.graphToInferenceContext @@ var "g" $
-  inferTypeOfTerm @@ var "cx" @@ var "term" @@ (string "single term")
-
-inferMany :: TBinding (InferenceContext -> [(Term, String)] -> Flow s ([Term], [Type], TypeSubst))
-inferMany = define "inferMany" $
-  doc "Infer types for multiple terms" $
-  "cx" ~> "pairs" ~>
-  "dflt" <~ (
-    "e" <~ Pairs.first (Lists.head $ var "pairs") $
-    "desc" <~ Pairs.second (Lists.head $ var "pairs") $
-    "tl" <~ Lists.tail (var "pairs") $
-    "result1" <<~ inferTypeOfTerm @@ var "cx" @@ var "e" @@ var "desc" $
-    "e1" <~ Typing.inferenceResultTerm (var "result1") $
-    "t1" <~ Typing.inferenceResultType (var "result1") $
-    "s1" <~ Typing.inferenceResultSubst (var "result1") $
-    "result2" <<~ inferMany @@ (Substitution.substInContext @@ var "s1" @@ var "cx") @@ var "tl" $
-    "e2" <~ Pairs.first (var "result2") $
-    "t2" <~ Pairs.first (Pairs.second $ var "result2") $
-    "s2" <~ Pairs.second (Pairs.second $ var "result2") $
-    produce $ pair
-      (Lists.cons (Substitution.substTypesInTerm @@ var "s2" @@ var "e1") (var "e2"))
-      (pair
-        (Lists.cons (Substitution.substInType @@ var "s2" @@ var "t1") (var "t2"))
-        (Substitution.composeTypeSubst @@ var "s1" @@ var "s2"))) $
-  Logic.ifElse (Lists.null $ var "pairs")
-    (Flows.pure $ pair (list ([] :: [TTerm Term])) $ pair (list ([] :: [TTerm Type])) (Substitution.idTypeSubst))
-    (var "dflt")
-
-inferTypeOf :: TBinding (InferenceContext -> Term -> Flow s (Term, TypeScheme))
-inferTypeOf = define "inferTypeOf" $
-  doc "Infer the type of a term and return a type scheme" $
-  "cx" ~> "term" ~>
-  -- Top-level let term which allows us to easily extract an inferred type scheme
-  "letTerm" <~ Core.termLet (Core.let_
-    (list [Core.binding (Core.name $ (string "ignoredVariableName")) (var "term") nothing])
-    (MetaTerms.string "ignoredBody")) $
-  "forBindings" <~ ("bindings" ~>
-    "binding" <~ Lists.head (var "bindings") $
-    "term1" <~ Core.bindingTerm (var "binding") $
-    "mts" <~ Core.bindingType (var "binding") $
-    Maybes.maybe
-      (Flows.fail $ (string "Expected a type scheme"))
-      ("ts" ~> Flows.pure $ pair (var "term1") (var "ts"))
-      (var "mts")) $
-  "unifyAndSubst" <~ ("result" ~>
-    "subst" <~ Typing.inferenceResultSubst (var "result") $
-    "finalized" <<~ finalizeInferredTerm @@ var "cx" @@ Typing.inferenceResultTerm (var "result") $
-    "letResult" <<~ Lexical.withEmptyGraph @@ (ExtractCore.let_ @@ var "finalized") $
-    "bindings" <~ Core.letBindings (var "letResult") $
-    Logic.ifElse (Equality.equal (int32 1) (Lists.length $ var "bindings"))
-      (var "forBindings" @@ var "bindings")
-      (Flows.fail $ Strings.cat $ list [
-        (string "Expected a single binding with a type scheme, but got: "),
-        Literals.showInt32 $ Lists.length $ var "bindings",
-        (string " bindings")])) $
-  "result" <<~ inferTypeOfTerm @@ var "cx" @@ var "letTerm" @@ (string "infer type of term") $
-  var "unifyAndSubst" @@ var "result"
-
-inferTypeOfAnnotatedTerm :: TBinding (InferenceContext -> AnnotatedTerm -> Flow s InferenceResult)
-inferTypeOfAnnotatedTerm = define "inferTypeOfAnnotatedTerm" $
-  doc "Infer the type of an annotated term" $
-  "cx" ~> "at" ~>
-  "term" <~ Core.annotatedTermBody (var "at") $
-  "ann" <~ Core.annotatedTermAnnotation (var "at") $
-  "result" <<~ inferTypeOfTerm @@ var "cx" @@ var "term" @@ (string "annotated term") $
-  "iterm" <~ Typing.inferenceResultTerm (var "result") $
-  "itype" <~ Typing.inferenceResultType (var "result") $
-  "isubst" <~ Typing.inferenceResultSubst (var "result") $
-  "iconstraints" <~ Typing.inferenceResultClassConstraints (var "result") $
-  produce $ Typing.inferenceResult
-    (Core.termAnnotated $ Core.annotatedTerm (var "iterm") (var "ann"))
-    (var "itype")
-    (var "isubst")
-    (var "iconstraints")
-
-inferTypeOfApplication :: TBinding (InferenceContext -> Application -> Flow s InferenceResult)
-inferTypeOfApplication = define "inferTypeOfApplication" $
-  doc "Infer the type of a function application" $
-  "cx" ~> "app" ~>
-  "e0" <~ Core.applicationFunction (var "app") $
-  "e1" <~ Core.applicationArgument (var "app") $
-  "lhsResult" <<~ inferTypeOfTerm @@ var "cx" @@ var "e0" @@ (string "lhs") $
-  "a" <~ Typing.inferenceResultTerm (var "lhsResult") $
-  "t0" <~ Typing.inferenceResultType (var "lhsResult") $
-  "s0" <~ Typing.inferenceResultSubst (var "lhsResult") $
-  "c0" <~ Typing.inferenceResultClassConstraints (var "lhsResult") $
-  "rhsResult" <<~ inferTypeOfTerm
-    @@ (Substitution.substInContext @@ var "s0" @@ var "cx")
-    @@ var "e1"
-    @@ (string "rhs") $
-  "b" <~ Typing.inferenceResultTerm (var "rhsResult") $
-  "t1" <~ Typing.inferenceResultType (var "rhsResult") $
-  "s1" <~ Typing.inferenceResultSubst (var "rhsResult") $
-  "c1" <~ Typing.inferenceResultClassConstraints (var "rhsResult") $
-  "v" <<~ Schemas.freshName $
-  "s2" <<~ Unification.unifyTypes
-    @@ (Typing.inferenceContextSchemaTypes $ var "cx")
-    @@ (Substitution.substInType @@ var "s1" @@ var "t0")
-    @@ (Core.typeFunction $ Core.functionType (var "t1") (Core.typeVariable $ var "v"))
-    @@ (string "application lhs") $
-  exec (Checking.checkTypeSubst @@ var "cx" @@ var "s2") $
-  "rExpr" <~ Core.termApplication (Core.application
-    (Substitution.substTypesInTerm @@ (Substitution.composeTypeSubst @@ var "s1" @@ var "s2") @@ var "a")
-    (Substitution.substTypesInTerm @@ var "s2" @@ var "b")) $
-  "rType" <~ Substitution.substInType @@ var "s2" @@ Core.typeVariable (var "v") $
-  "rSubst" <~ Substitution.composeTypeSubstList @@ list [var "s0", var "s1", var "s2"] $
-  -- Apply substitutions to constraints, then merge
-  -- c0 needs both s1 and s2 applied (from rhs inference and unification)
-  -- c1 needs just s2 applied (from unification)
-  "c0Subst" <~ Substitution.substInClassConstraints @@ var "s2" @@ (Substitution.substInClassConstraints @@ var "s1" @@ var "c0") $
-  "c1Subst" <~ Substitution.substInClassConstraints @@ var "s2" @@ var "c1" $
-  "rConstraints" <~ mergeClassConstraints @@ var "c0Subst" @@ var "c1Subst" $
-  produce $ Typing.inferenceResult (var "rExpr") (var "rType") (var "rSubst") (var "rConstraints")
-
-inferTypeOfCaseStatement :: TBinding (InferenceContext -> CaseStatement -> Flow s InferenceResult)
-inferTypeOfCaseStatement = define "inferTypeOfCaseStatement" $
-  doc "Infer the type of a case statement" $
-  "cx" ~> "caseStmt" ~>
-  "tname" <~ Core.caseStatementTypeName (var "caseStmt") $
-  "dflt" <~ Core.caseStatementDefault (var "caseStmt") $
-  "cases" <~ Core.caseStatementCases (var "caseStmt") $
-  "fnames" <~ Lists.map (unaryFunction Core.fieldName) (var "cases") $
-  "schemaType" <<~ Schemas.requireSchemaType @@ var "cx" @@ var "tname" $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "stype" <~ Core.typeSchemeType (var "schemaType") $
-  "sfields" <<~ ExtractCore.unionType @@ var "tname" @@ var "stype" $
-  "dfltResult" <<~ Flows.mapMaybe ("t" ~> inferTypeOfTerm @@ var "cx" @@ var "t" @@
-    (Strings.cat $ list [(string "case "), Core.unName $ var "tname", (string ".<default>")])) (var "dflt") $
-  "caseResults" <<~ inferMany @@ var "cx" @@ Lists.map
-    ("f" ~> pair (Core.fieldTerm $ var "f")
-      (Strings.cat $ list [(string "case "), Core.unName $ var "tname", (string "."), Core.unName $ Core.fieldName $ var "f"]))
-    (var "cases") $
-  "iterms" <~ Pairs.first (var "caseResults") $
-  "itypes" <~ Pairs.first (Pairs.second $ var "caseResults") $
-  "isubst" <~ Pairs.second (Pairs.second $ var "caseResults") $
-  "codv" <<~ Schemas.freshName $
-  "cod" <~ Core.typeVariable (var "codv") $
-  "caseMap" <~ Maps.fromList (Lists.map
-    ("ft" ~> pair (Core.fieldTypeName $ var "ft") (Core.fieldTypeType $ var "ft"))
-    (var "sfields")) $
-  "dfltConstraints" <~ Monads.maybeToList @@ (Maybes.map
-    ("r" ~> Typing.typeConstraint (var "cod")
-      (Substitution.substInType @@ var "isubst" @@ (Typing.inferenceResultType $ var "r"))
-      (string "match default"))
-    (var "dfltResult")) $
-  "caseConstraints" <~ Maybes.cat (Lists.zipWith
-    ("fname" ~> "itype" ~> Maybes.map
-      ("ftype" ~> Typing.typeConstraint
-        (var "itype")
-        (Core.typeFunction $ Core.functionType (var "ftype") (var "cod"))
-        (string "case type"))
-      (Maps.lookup (var "fname") (var "caseMap")))
-    (var "fnames") (var "itypes")) $
-  mapConstraints
-    @@ var "cx"
-    @@ ("subst" ~> yield
-      @@ (buildTypeApplicationTerm @@ var "svars"
-          @@ (Core.termFunction $ Core.functionElimination $ Core.eliminationUnion $
-            Core.caseStatement (var "tname") (Maybes.map (unaryFunction Typing.inferenceResultTerm) $ var "dfltResult") $
-            Lists.zipWith ("n" ~> "t" ~> Core.field (var "n") (var "t")) (var "fnames") (var "iterms")))
-      @@ (Core.typeFunction $ Core.functionType
-          (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
-          (var "cod"))
-      @@ (Substitution.composeTypeSubstList
-        @@ (Lists.concat $ list [
-          Monads.maybeToList @@ (Maybes.map (unaryFunction Typing.inferenceResultSubst) (var "dfltResult")),
-          list [var "isubst", var "subst"]])))
-    @@ (Lists.concat $ list [var "dfltConstraints", var "caseConstraints"])
-
-inferTypeOfCollection :: TBinding (InferenceContext -> (Type -> Type) -> ([Term] -> Term) -> String -> [Term] -> Flow s InferenceResult)
-inferTypeOfCollection = define "inferTypeOfCollection" $
-  doc "Infer the type of a collection" $
-  "cx" ~> "typCons" ~> "trmCons" ~> "desc" ~> "els" ~>
-  "var" <<~ Schemas.freshName $
-  Logic.ifElse (Lists.null $ var "els")
-    -- Empty collection: add type application for the fresh element type variable
-    (Flows.pure $ yield
-      @@ (buildTypeApplicationTerm
-        @@ list [var "var"]
-        @@ (var "trmCons" @@ list ([] :: [TTerm Term])))
-      @@ (var "typCons" @@ (Core.typeVariable $ var "var"))
-      @@ (Substitution.idTypeSubst))
-    -- General case: non-empty collection
-    ("results" <<~ inferMany @@ var "cx" @@
-      (Lists.zip (var "els") $ Lists.map ("i" ~> Strings.cat $ list [(string "#"), Literals.showInt32 $ var "i"]) $
-        Math.range (int32 1) (Math.add (Lists.length $ var "els") (int32 1))) $
-    "terms" <~ Pairs.first (var "results") $
-    "types" <~ Pairs.first (Pairs.second $ var "results") $
-    "subst1" <~ Pairs.second (Pairs.second $ var "results") $
-    "constraints" <~ Lists.map ("t" ~> Typing.typeConstraint (Core.typeVariable $ var "var") (var "t") (var "desc")) (var "types") $
-    mapConstraints @@ var "cx" @@
-      ("subst2" ~>
-        "iterm" <~ var "trmCons" @@ var "terms" $
-        "itype" <~ var "typCons" @@ (Core.typeVariable $ var "var") $
-        "isubst" <~ Substitution.composeTypeSubst @@ var "subst1" @@ var "subst2" $
-        yield @@ var "iterm" @@ var "itype" @@ var "isubst") @@
-      var "constraints")
-
-inferTypeOfEither :: TBinding (InferenceContext -> Prelude.Either Term Term -> Flow s InferenceResult)
-inferTypeOfEither = define "inferTypeOfEither" $
-  doc "Infer the type of an either value" $
-  "cx" ~> "e" ~>
-  Eithers.either_
-    ("l" ~>
-      "r1" <<~ (inferTypeOfTerm @@ var "cx" @@ var "l" @@ (string "either left value")) $
-      "iterm" <~ Typing.inferenceResultTerm (var "r1") $
-      "leftType" <~ Typing.inferenceResultType (var "r1") $
-      "subst" <~ Typing.inferenceResultSubst (var "r1") $
-      "rightType" <<~ freshVariableType $
-      "eitherTerm" <~ (Core.termEither $ left $ var "iterm") $
-      "termWithLeftType" <~ (Core.termTypeApplication $ Core.typeApplicationTerm (var "eitherTerm") (var "leftType")) $
-      "termWithBothTypes" <~ (Core.termTypeApplication $ Core.typeApplicationTerm (var "termWithLeftType") (var "rightType")) $
-      "eitherType" <~ (Core.typeEither $ Core.eitherType (var "leftType") (var "rightType")) $
-      yieldChecked @@ var "termWithBothTypes" @@ var "eitherType" @@ var "subst")
-    ("r" ~>
-      "r1" <<~ (inferTypeOfTerm @@ var "cx" @@ var "r" @@ (string "either right value")) $
-      "iterm" <~ Typing.inferenceResultTerm (var "r1") $
-      "rightType" <~ Typing.inferenceResultType (var "r1") $
-      "subst" <~ Typing.inferenceResultSubst (var "r1") $
-      "leftType" <<~ freshVariableType $
-      "eitherTerm" <~ (Core.termEither $ right $ var "iterm") $
-      "termWithLeftType" <~ (Core.termTypeApplication $ Core.typeApplicationTerm (var "eitherTerm") (var "leftType")) $
-      "termWithBothTypes" <~ (Core.termTypeApplication $ Core.typeApplicationTerm (var "termWithLeftType") (var "rightType")) $
-      "eitherType" <~ (Core.typeEither $ Core.eitherType (var "leftType") (var "rightType")) $
-      yieldChecked @@ var "termWithBothTypes" @@ var "eitherType" @@ var "subst")
-    (var "e")
-
-inferTypeOfElimination :: TBinding (InferenceContext -> Elimination -> Flow s InferenceResult)
-inferTypeOfElimination = define "inferTypeOfElimination" $
-  doc "Infer the type of an elimination" $
-  "cx" ~> "elm" ~>
-  cases _Elimination (var "elm") Nothing [
-    _Elimination_record>>: "p" ~> inferTypeOfProjection @@ var "cx" @@ var "p",
-    _Elimination_union>>: "c" ~> inferTypeOfCaseStatement @@ var "cx" @@ var "c",
-    _Elimination_wrap>>: "tname" ~> inferTypeOfUnwrap @@ var "cx" @@ var "tname"]
-
-inferTypeOfFunction :: TBinding (InferenceContext -> Function -> Flow s InferenceResult)
-inferTypeOfFunction = define "inferTypeOfFunction" $
-  doc "Infer the type of a function" $
-  "cx" ~> "f" ~>
-  cases _Function (var "f") Nothing [
-    _Function_elimination>>: "elm" ~> inferTypeOfElimination @@ var "cx" @@ var "elm",
-    _Function_lambda>>: "l" ~> inferTypeOfLambda @@ var "cx" @@ var "l",
-    _Function_primitive>>: "name" ~> inferTypeOfPrimitive @@ var "cx" @@ var "name"]
-
-inferTypeOfInjection :: TBinding (InferenceContext -> Injection -> Flow s InferenceResult)
-inferTypeOfInjection = define "inferTypeOfInjection" $
-  doc "Infer the type of a union injection" $
-  "cx" ~> "injection" ~>
-  "tname" <~ Core.injectionTypeName (var "injection") $
-  "field" <~ Core.injectionField (var "injection") $
-  "fname" <~ Core.fieldName (var "field") $
-  "term" <~ Core.fieldTerm (var "field") $
-  "result" <<~ inferTypeOfTerm @@ var "cx" @@ var "term" @@ (string "injected term") $
-  "schemaType" <<~ Schemas.requireSchemaType @@ var "cx" @@ var "tname" $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "stype" <~ Core.typeSchemeType (var "schemaType") $
-  "iterm" <~ Typing.inferenceResultTerm (var "result") $
-  "ityp" <~ Typing.inferenceResultType (var "result") $
-  "isubst" <~ Typing.inferenceResultSubst (var "result") $
-  "sfields" <<~ ExtractCore.unionType @@ var "tname" @@ var "stype" $
-  "ftyp" <<~ Schemas.findFieldType @@ var "fname" @@ var "sfields" $
-  mapConstraints @@ var "cx" @@
-    ("subst" ~> yield
-      @@ (buildTypeApplicationTerm @@ var "svars"
-        @@ (Core.termUnion $ Core.injection (var "tname") $ Core.field (var "fname") (var "iterm")))
-      @@ (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
-      @@ (Substitution.composeTypeSubst @@ var "isubst" @@ var "subst")) @@
-    list [Typing.typeConstraint (var "ftyp") (var "ityp") (string "schema type of injected field")]
-
-inferTypeOfLambda :: TBinding (InferenceContext -> Lambda -> Flow s InferenceResult)
-inferTypeOfLambda = define "inferTypeOfLambda" $
-  doc "Infer the type of a lambda function" $
-  "cx" ~> "lambda" ~>
-  "var" <~ Core.lambdaParameter (var "lambda") $
-  "body" <~ Core.lambdaBody (var "lambda") $
-  "vdom" <<~ Schemas.freshName $
-  "dom" <~ Core.typeVariable (var "vdom") $
-  "cx2" <~ (extendContext @@ list [pair (var "var") (Core.typeScheme (list ([] :: [TTerm Name])) (var "dom") Phantoms.nothing)] @@ var "cx") $
-  "result" <<~ inferTypeOfTerm @@ var "cx2" @@ var "body" @@ (string "lambda body") $
-  "iterm" <~ Typing.inferenceResultTerm (var "result") $
-  "icod" <~ Typing.inferenceResultType (var "result") $
-  "isubst" <~ Typing.inferenceResultSubst (var "result") $
-  "rdom" <~ Substitution.substInType @@ var "isubst" @@ var "dom" $
-  "rterm" <~ Core.termFunction (Core.functionLambda $ Core.lambda (var "var") (just $ var "rdom") (var "iterm")) $
-  "rtype" <~ Core.typeFunction (Core.functionType (var "rdom") (var "icod")) $
-  "vars" <~ (Sets.unions $ list [
-    Rewriting.freeVariablesInType @@ var "rdom",
-    Rewriting.freeVariablesInType @@ var "icod",
-    freeVariablesInContext @@ (Substitution.substInContext @@ var "isubst" @@ var "cx2")]) $
-  "cx3" <~ Substitution.substInContext @@ var "isubst" @@ var "cx" $
-  -- Apply substitution to constraints so variable names track through unification
-  "iconstraints" <~ Substitution.substInClassConstraints @@ var "isubst" @@ (Typing.inferenceResultClassConstraints $ var "result") $
-  produce $ Typing.inferenceResult (var "rterm") (var "rtype") (var "isubst") (var "iconstraints")
-
--- | Normalize a let term before inferring its type.
-inferTypeOfLet :: TBinding (InferenceContext -> Let -> Flow s InferenceResult)
-inferTypeOfLet = define "inferTypeOfLet" $
-  doc "Normalize a let term before inferring its type" $
-  "cx" ~> "let0" ~>
-  "bindings0" <~ Core.letBindings (var "let0") $
-  "body0" <~ Core.letBody (var "let0") $
-  "names" <~ Lists.map (unaryFunction Core.bindingName) (var "bindings0") $
-  "nameSet" <~ Sets.fromList (var "names") $
-  "toPair" <~ ("binding" ~>
-    "name" <~ Core.bindingName (var "binding") $
-    "term" <~ Core.bindingTerm (var "binding") $
-    pair (var "name") $ Lists.filter ("n" ~> Sets.member (var "n") (var "nameSet")) $
-      Sets.toList $ Rewriting.freeVariablesInTerm @@ var "term") $
-  "adjList" <~ Lists.map (var "toPair") (var "bindings0") $
-  "groups" <~ Sorting.topologicalSortComponents @@ var "adjList" $
-  "bindingMap" <~ Maps.fromList (Lists.zip (var "names") (var "bindings0")) $
-  "createLet" <~ ("e" ~> "group" ~> Core.termLet $ Core.let_
-    (Maybes.cat $ Lists.map ("n" ~> Maps.lookup (var "n") (var "bindingMap")) (var "group"))
-    (var "e")) $
-  -- Note: this rewritten let term will yield success in all cases of dependencies among letrec bindings *except*
-  --       in cases of polymorphic recursion. In those cases, type hints will be needed (#162).
-  "rewrittenLet" <~ Lists.foldl (var "createLet") (var "body0") (Lists.reverse $ var "groups") $
-  "restoreLet" <~ ("iterm" ~>
-    "helper" <~ ("level" ~> "bins" ~> "term" ~>
-      "nonzero" <~ ("term" ~> cases _Term (var "term") Nothing [
-        _Term_let>>: "l" ~>
-          "bs" <~ Core.letBindings (var "l") $
-          "letBody" <~ Core.letBody (var "l") $
-          var "helper" @@
-            (Math.sub (var "level") (int32 1)) @@
-            (Lists.concat $ list [var "bs", var "bins"]) @@
-            (var "letBody")]) $
-      Logic.ifElse (Equality.equal (var "level") (int32 0))
-        (pair (var "bins") (var "term"))
-        (var "nonzero" @@ var "term")) $
-    "result" <~ var "helper" @@ (Lists.length $ var "groups") @@ list ([] :: [TTerm Binding]) @@ var "iterm" $
-    "bindingList" <~ Pairs.first (var "result") $
-    "e" <~ Pairs.second (var "result") $
-    "bindingMap2" <~ Maps.fromList (Lists.map ("b" ~> pair (Core.bindingName $ var "b") (var "b")) (var "bindingList")) $
-    Core.termLet $ Core.let_
-      (Maybes.cat $ Lists.map ("n" ~> Maps.lookup (var "n") (var "bindingMap2")) (var "names"))
-      (var "e")) $
-  "rewriteResult" <~ ("result" ~>
-    "iterm" <~ Typing.inferenceResultTerm (var "result") $
-    "itype" <~ Typing.inferenceResultType (var "result") $
-    "isubst" <~ Typing.inferenceResultSubst (var "result") $
-    "iconstraints" <~ Typing.inferenceResultClassConstraints (var "result") $
-    Typing.inferenceResult (var "restoreLet" @@ var "iterm") (var "itype") (var "isubst") (var "iconstraints")) $
-  "res" <~ (cases _Term (var "rewrittenLet")
-     (Just $ inferTypeOfTerm @@ var "cx" @@ var "rewrittenLet" @@ (string "empty let term")) [
-     _Term_let>>: "l" ~> inferTypeOfLetNormalized @@ var "cx" @@ var "l"]) $
-  Flows.map (var "rewriteResult") (var "res")
-
-inferTypeOfLetNormalized :: TBinding (InferenceContext -> Let -> Flow s InferenceResult)
-inferTypeOfLetNormalized = define "inferTypeOfLetNormalized" $
-  doc "Infer the type of a let (letrec) term which is already in a normal form" $
-  "cx0" ~> "letTerm" ~>
-
-  -- Extract the bindings and body from the let term
-  "bins0" <~ Core.letBindings (var "letTerm") $
-  "body0" <~ Core.letBody (var "letTerm") $
-  "bnames" <~ Lists.map (unaryFunction Core.bindingName) (var "bins0") $
-
-  -- Phase 1: Create fresh temporary type variables for each binding
-  -- These act as placeholders during the initial inference pass
-  "bvars" <<~ Schemas.freshNames @@ (Lists.length $ var "bins0") $
-  "tbins0" <~ Lists.map (unaryFunction Core.typeVariable) (var "bvars") $
-  
-  -- Extend the context with temporary monomorphic type schemes
-  -- This allows recursive references during inference
-  "cx1" <~ (extendContext
-    @@ (Lists.zip (var "bnames") $ Lists.map ("t" ~> Core.typeScheme (list ([] :: [TTerm Name])) (var "t") Phantoms.nothing) (var "tbins0"))
-    @@ (var "cx0")) $
-  
-  -- Phase 2: Infer the actual types of all binding terms
-  -- This returns: (inferred terms, (inferred types, (substitution s1, constraints)))
-  "inferredResult" <<~ inferTypesOfTemporaryBindings @@ var "cx1" @@ var "bins0" $
-  "bterms1" <~ Pairs.first (var "inferredResult") $  -- Terms with type applications embedded
-  "tbins1" <~ Pairs.first (Pairs.second $ var "inferredResult") $  -- Actual inferred types
-  "substAndConstraints" <~ Pairs.second (Pairs.second $ var "inferredResult") $
-  "s1" <~ Pairs.first (var "substAndConstraints") $  -- Substitution from inference
-  "inferredConstraints" <~ Pairs.second (var "substAndConstraints") $  -- Constraints from bindings
-
-  -- Phase 3: Unify temporary types with actual inferred types
-  -- This ensures the temporary placeholders match what we actually inferred
-  -- Returns substitution s2 that maps temporary variables to their actual types
-  "s2" <<~ Unification.unifyTypeLists @@
-    (Typing.inferenceContextSchemaTypes $ var "cx0") @@
-    (Lists.map (Substitution.substInType @@ var "s1") (var "tbins0")) @@
-    (var "tbins1") @@
-    (string "temporary type bindings") $
-  exec (Checking.checkTypeSubst @@ var "cx0" @@ var "s2") $
-
-  -- Apply the composed substitution to the original context
-  -- Also merge the inferred constraints into the context's classConstraints
-  -- This context will be used for generalization
-  "g2base" <~ (Substitution.substInContext @@
-    (Substitution.composeTypeSubst @@ var "s1" @@ var "s2") @@
-    (var "cx0")) $
-  -- Apply s2 to the inferred constraints to rename variables according to unification
-  "constraintsWithS2" <~ Substitution.substInClassConstraints @@ var "s2" @@ var "inferredConstraints" $
-
-  -- Extract constraints from the ORIGINAL bindings' TypeSchemes
-  -- These are constraints that were specified by the user/generator (e.g., Ord constraints from decoderTypeScheme)
-  -- We need to apply the composed substitution to rename variables to match the inferred types
-  "composedSubst" <~ Substitution.composeTypeSubst @@ var "s1" @@ var "s2" $
-  "originalBindingConstraints" <~ Lists.foldl
-    ("acc" ~> "b" ~>
-      Maybes.maybe
-        (var "acc")
-        ("ts" ~> Maybes.maybe
-          (var "acc")
-          ("c" ~> mergeClassConstraints @@ var "acc" @@ var "c")
-          (Core.typeSchemeConstraints $ var "ts"))
-        (Core.bindingType $ var "b"))
-    Maps.empty
-    (var "bins0") $
-  -- Apply the composed substitution to the original constraints to rename variables
-  "originalConstraintsSubst" <~ Substitution.substInClassConstraints @@ var "composedSubst" @@ var "originalBindingConstraints" $
-
-  -- Merge all constraints: inferred + original binding constraints
-  "allInferredConstraints" <~ mergeClassConstraints @@ var "constraintsWithS2" @@ var "originalConstraintsSubst" $
-  -- Merge the combined constraints into the context so generalize can see them
-  "mergedConstraints" <~ mergeClassConstraints @@ (Typing.inferenceContextClassConstraints $ var "g2base") @@ var "allInferredConstraints" $
-  "g2" <~ Typing.inferenceContextWithClassConstraints (var "g2base") (var "mergedConstraints") $
-
-  -- Apply s2 to the terms as well as the types
-  -- This ensures type applications in the terms use the same variables as the types
-  "bterms1Subst" <~ Lists.map (Substitution.substTypesInTerm @@ var "s2") (var "bterms1") $
-
-  -- Phase 4: Generalize the inferred types into type schemes
-  "tsbins1" <~ (Lists.zip (var "bnames") $
-    Lists.map ("t" ~> generalize @@ var "g2" @@
-      (Substitution.substInType @@ var "s2" @@ var "t")) (var "tbins1")) $
-
-  -- Phase 5: Infer the type of the let body
-  -- The body can now reference the bindings with their generalized type schemes
-  "bodyResult" <<~ inferTypeOfTerm @@
-    (extendContext @@ var "tsbins1" @@ var "g2") @@
-    (var "body0") @@
-    (string "let body") $
-  "body1" <~ Typing.inferenceResultTerm (var "bodyResult") $
-  "tbody" <~ Typing.inferenceResultType (var "bodyResult") $
-  "sbody" <~ Typing.inferenceResultSubst (var "bodyResult") $
-  
-  -- Phase 6: Create term substitution for polymorphic instantiation
-  -- For each binding, create a mapping from its name to a term that applies
-  -- all the type variables from its type scheme
-  -- e.g., foo becomes foo!<t0><t1> if its scheme is ∀t0,t1. ...
-  "st1" <~ (Typing.termSubst (Maps.fromList $
-    Lists.map
-      ("pair" ~>
-        "name" <~ Pairs.first (var "pair") $
-        "ts" <~ Pairs.second (var "pair") $
-        pair
-          (var "name") $
-          (buildTypeApplicationTerm
-            @@ (Core.typeSchemeVariables $ var "ts")
-            @@ (Core.termVariable $ var "name")))
-      (var "tsbins1"))) $
-
-  -- Phase 7: Create the final bindings with type lambdas
-  "createBinding" <~ ("bindingPair" ~>
-    "nameTsPair" <~ Pairs.first (var "bindingPair") $
-    "term" <~ Pairs.second (var "bindingPair") $
-    "name" <~ Pairs.first (var "nameTsPair") $
-    "ts" <~ Pairs.second (var "nameTsPair") $
-
-    -- Apply body substitution to the type scheme FIRST to get final variable names and constraints.
-    -- This must happen before creating the type lambdas so the parameter names match the final type scheme.
-    "finalTs" <~ Substitution.substInTypeScheme @@ var "sbody" @@ var "ts" $
-
-    -- First, substitute polymorphic references in the term
-    -- Then wrap in type lambdas for each variable in the FINAL type scheme.
-    -- IMPORTANT: We use finalTs.variables (not ts.variables) so the TypeLambda parameters match the type scheme.
-    -- Note: this is the only place -- at the top level of bound terms -- where inference creates type lambda terms.
-    "typeLambdaTerm" <~ Lists.foldl
-      ("b" ~> "v" ~> Core.termTypeLambda $ Core.typeLambda (var "v") (var "b"))
-      (Substitution.substituteInTerm @@ var "st1" @@ var "term")
-      (Lists.reverse $ Core.typeSchemeVariables $ var "finalTs") $
-
-    -- Apply remaining substitutions (senv and s2) to the wrapped term
-    Core.binding (var "name")
-      (Substitution.substTypesInTerm @@
-        (Substitution.composeTypeSubst @@ var "sbody" @@ var "s2") @@
-        (var "typeLambdaTerm"))
-      (just $ var "finalTs")) $
-  
-  "bins1" <~ (Lists.map (var "createBinding") $
-    Lists.zip (var "tsbins1") (var "bterms1Subst")) $
-
-  -- Collect constraints from body result, applying the final substitution
-  "bodyConstraints" <~ Substitution.substInClassConstraints @@ var "sbody" @@ (Typing.inferenceResultClassConstraints $ var "bodyResult") $
-
-  -- Apply the body substitution to the binding constraints as well
-  -- This ensures the constraint variable names are consistent with the final types
-  "bindingConstraintsSubst" <~ Substitution.substInClassConstraints @@ var "sbody" @@ var "constraintsWithS2" $
-
-  -- Merge binding constraints with body constraints
-  -- This ensures that constraints from Maps.lookup (etc.) inside let bindings propagate up
-  "allConstraints" <~ mergeClassConstraints @@ var "bindingConstraintsSubst" @@ var "bodyConstraints" $
-
-  -- Return the final let term with properly typed bindings
-  "ret" <~ (Typing.inferenceResult
-    (Core.termLet $ Core.let_ (var "bins1") (var "body1"))
-    (var "tbody")
-    (Substitution.composeTypeSubstList @@ list [var "s1", var "s2", var "sbody"])
-    (var "allConstraints")) $
-  produce $ var "ret"
-
-inferTypeOfList :: TBinding (InferenceContext -> [Term] -> Flow s InferenceResult)
-inferTypeOfList = define "inferTypeOfList" $
-  doc "Infer the type of a list" $
-  "cx" ~> inferTypeOfCollection
-    @@ var "cx"
-    @@ (unaryFunction Core.typeList)
-    @@ (unaryFunction Core.termList)
-    @@ (string "list element")
-
-inferTypeOfLiteral :: TBinding (InferenceContext -> Literal -> Flow s InferenceResult)
-inferTypeOfLiteral = define "inferTypeOfLiteral" $
-  doc "Infer the type of a literal" $
-  "_" ~> "lit" ~>
-  produce $ Typing.inferenceResult
-    (Core.termLiteral $ var "lit")
-    (Core.typeLiteral $ Reflect.literalType @@ var "lit")
-    (Substitution.idTypeSubst)
-    Maps.empty
-
-inferTypeOfMap :: TBinding (InferenceContext -> M.Map Term Term -> Flow s InferenceResult)
-inferTypeOfMap = define "inferTypeOfMap" $
-  doc "Infer the type of a map" $
-  "cx" ~> "m" ~>
-  "kvar" <<~ Schemas.freshName $
-  "vvar" <<~ Schemas.freshName $
-  Logic.ifElse (Maps.null $ var "m")
-    -- Empty map: add type applications for both key and value type variables
-    (Flows.pure $ yield
-      @@ (buildTypeApplicationTerm
-        @@ list [var "kvar", var "vvar"]
-        @@ (Core.termMap Maps.empty))
-      @@ (Core.typeMap $ Core.mapType (Core.typeVariable $ var "kvar") (Core.typeVariable $ var "vvar"))
-      @@ Substitution.idTypeSubst)
-    -- Non-empty map: infer and unify key and value types
-    ("kresults" <<~ inferMany @@ var "cx" @@
-      (Lists.map ("k" ~> pair (var "k") (string "map key")) $ Maps.keys $ var "m") $
-    "kterms" <~ Pairs.first (var "kresults") $
-    "ktypes" <~ Pairs.first (Pairs.second $ var "kresults") $
-    "ksubst" <~ Pairs.second (Pairs.second $ var "kresults") $
-    "vresults" <<~ inferMany
-      @@ var "cx"
-      @@ (Lists.map ("v" ~> pair (var "v") (string "map value")) $ Maps.elems $ var "m") $
-    "vterms" <~ Pairs.first (var "vresults") $
-    "vtypes" <~ Pairs.first (Pairs.second $ var "vresults") $
-    "vsubst" <~ Pairs.second (Pairs.second $ var "vresults") $
-    "kcons" <~ Lists.map ("t" ~> Typing.typeConstraint (Core.typeVariable $ var "kvar") (var "t") (string "map key")) (var "ktypes") $
-    "vcons" <~ Lists.map ("t" ~> Typing.typeConstraint (Core.typeVariable $ var "vvar") (var "t") (string "map value")) (var "vtypes") $
-    mapConstraints @@ var "cx" @@
-      ("subst" ~> yield
-        @@ (Core.termMap $ Maps.fromList $ Lists.zip (var "kterms") (var "vterms"))
-        @@ (Core.typeMap $ Core.mapType (Core.typeVariable $ var "kvar") (Core.typeVariable $ var "vvar"))
-        @@ (Substitution.composeTypeSubstList @@ list [var "ksubst", var "vsubst", var "subst"])) @@
-      (Lists.concat $ list [var "kcons", var "vcons"]))
-
-inferTypeOfOptional :: TBinding (InferenceContext -> Maybe Term -> Flow s InferenceResult)
-inferTypeOfOptional = define "inferTypeOfOptional" $
-  doc "Infer the type of an optional" $
-  "cx" ~> "m" ~>
-  "trmCons" <~ ("terms" ~> Logic.ifElse (Lists.null $ var "terms")
-    (Core.termMaybe nothing)
-    (Core.termMaybe $ just $ Lists.head $ var "terms")) $
-  inferTypeOfCollection
-    @@ var "cx"
-    @@ (unaryFunction Core.typeMaybe)
-    @@ var "trmCons"
-    @@ (string "optional element")
-    @@ (Maybes.maybe (list ([] :: [TTerm Term])) (unaryFunction Lists.singleton) $ var "m")
-
-inferTypeOfPair :: TBinding (InferenceContext -> (Term, Term) -> Flow s InferenceResult)
-inferTypeOfPair = define "inferTypeOfPair" $
-  doc "Infer the type of a pair" $
-  "cx" ~> "p" ~>
-  Flows.map
-    ( "results" ~>
-      "iterms" <~ Pairs.first (var "results") $
-      "itypes" <~ Pairs.first (Pairs.second $ var "results") $
-      "isubst" <~ Pairs.second (Pairs.second $ var "results") $
-      "ifst" <~ Lists.head (var "iterms") $
-      "isnd" <~ Lists.head (Lists.tail $ var "iterms") $
-      "tyFst" <~ Lists.head (var "itypes") $
-      "tySnd" <~ Lists.head (Lists.tail $ var "itypes") $
-      "pairTerm" <~ (Core.termPair $ pair (var "ifst") (var "isnd")) $
-      "termWithTypes" <~ (Core.termTypeApplication $ Core.typeApplicationTerm
-        (Core.termTypeApplication $ Core.typeApplicationTerm (var "pairTerm") (var "tyFst"))
-        (var "tySnd")) $
-      yield
-        @@ var "termWithTypes"
-        @@ (Core.typePair $ Core.pairType (var "tyFst") (var "tySnd"))
-        @@ var "isubst")
-    (inferMany @@ var "cx" @@ list [
-      pair (Pairs.first $ var "p") (string "pair first element"),
-      pair (Pairs.second $ var "p") (string "pair second element")])
-
-
-
-
-
-
---inferTypeOfProduct :: TBinding (InferenceContext -> [Term] -> Flow s InferenceResult)
---inferTypeOfProduct = define "inferTypeOfProduct" $
---  doc "Infer the type of a product (tuple)" $
---  "cx" ~> "els" ~>
---  Flows.map
---    ( "results" ~>
---      "iterms" <~ Pairs.first (var "results") $
---      "itypes" <~ Pairs.first (Pairs.second $ var "results") $
---      "isubst" <~ Pairs.second (Pairs.second $ var "results") $
---      yield @@ (Core.termProduct $ var "iterms") @@ (Core.typeProduct $ var "itypes") @@ var "isubst")
---    (inferMany @@ var "cx" @@ (Lists.map ("e" ~> pair (var "e") (string "tuple element")) $ var "els"))
-
-
-
-
-
-
-
-
-
-
-inferTypeOfPrimitive :: TBinding (InferenceContext -> Name -> Flow s InferenceResult)
-inferTypeOfPrimitive = define "inferTypeOfPrimitive" $
-  doc "Infer the type of a primitive function. Class constraints from the primitive's type scheme are propagated to the inference result." $
-  "cx" ~> "name" ~>
-  Maybes.maybe
-    (Flows.fail $ Strings.cat2 (string "No such primitive: ") (Core.unName $ var "name"))
-    ("scheme" ~>
-      "ts" <<~ Schemas.instantiateTypeScheme @@ var "scheme" $
-      -- Extract constraints from the instantiated type scheme and pass them to the result
-      "constraints" <~ Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints $ var "ts") $
-      yieldCheckedWithConstraints
-        @@ (buildTypeApplicationTerm
-          @@ Core.typeSchemeVariables (var "ts")
-          @@ (Core.termFunction $ Core.functionPrimitive $ var "name"))
-        @@ Core.typeSchemeType (var "ts")
-        @@ Substitution.idTypeSubst
-        @@ var "constraints")
-    (Maps.lookup (var "name") (Typing.inferenceContextPrimitiveTypes $ var "cx"))
-
-inferTypeOfProjection :: TBinding (InferenceContext -> Projection -> Flow s InferenceResult)
-inferTypeOfProjection = define "inferTypeOfProjection" $
-  doc "Infer the type of a record projection" $
-  "cx" ~> "proj" ~>
-  "tname" <~ Core.projectionTypeName (var "proj") $
-  "fname" <~ Core.projectionField (var "proj") $
-  "schemaType" <<~ Schemas.requireSchemaType @@ var "cx" @@ var "tname" $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "stype" <~ Core.typeSchemeType (var "schemaType") $
-  "sfields" <<~ ExtractCore.recordType @@ var "tname" @@ var "stype" $
-  "ftyp" <<~ Schemas.findFieldType @@ var "fname" @@ var "sfields" $
-  Flows.pure $ yield
-    @@ (buildTypeApplicationTerm @@ var "svars"
-      @@ (Core.termFunction $ Core.functionElimination $ Core.eliminationRecord $ Core.projection (var "tname") (var "fname")))
-    @@ (Core.typeFunction $ Core.functionType
-      (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
-      (var "ftyp"))
-    @@ Substitution.idTypeSubst
-
-inferTypeOfRecord :: TBinding (InferenceContext -> Record -> Flow s InferenceResult)
-inferTypeOfRecord = define "inferTypeOfRecord" $
-  doc "Infer the type of a record" $
-  "cx" ~> "record" ~>
-  "tname" <~ Core.recordTypeName (var "record") $
-  "fields" <~ Core.recordFields (var "record") $
-  "fnames" <~ Lists.map (unaryFunction Core.fieldName) (var "fields") $
-  "schemaType" <<~ Schemas.requireSchemaType @@ var "cx" @@ var "tname" $
-  "results" <<~ inferMany @@ var "cx" @@ Lists.map
-    ("f" ~> pair
-      (Core.fieldTerm $ var "f")
-      (Strings.cat2 (string "field ") (Core.unName $ Core.fieldName $ var "f")))
-    (var "fields") $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "stype" <~ Core.typeSchemeType (var "schemaType") $
-  "iterms" <~ Pairs.first (var "results") $
-  "itypes" <~ Pairs.first (Pairs.second $ var "results") $
-  "isubst" <~ Pairs.second (Pairs.second $ var "results") $
-  "ityp" <~ Core.typeRecord (Core.rowType (var "tname") $
-      Lists.zipWith ("n" ~> "t" ~> Core.fieldType (var "n") (var "t")) (var "fnames") (var "itypes")) $
-  mapConstraints @@ var "cx" @@
-    ("subst" ~> yield
-      @@ (buildTypeApplicationTerm @@ var "svars" @@
-        (Core.termRecord $ Core.record (var "tname") $ Lists.zipWith
-          ("n" ~> "t" ~> Core.field (var "n") (var "t"))
-          (var "fnames")
-          (var "iterms")))
-      @@ (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
-      @@ (Substitution.composeTypeSubst @@ var "isubst" @@ var "subst")) @@
-    list [Typing.typeConstraint (var "stype") (var "ityp") (string "schema type of record")]
-
-inferTypeOfSet :: TBinding (InferenceContext -> S.Set Term -> Flow s InferenceResult)
-inferTypeOfSet = define "inferTypeOfSet" $
-  doc "Infer the type of a set" $
-  "cx" ~>
-  "s" ~>
-  inferTypeOfCollection
-    @@ var "cx"
-    @@ (unaryFunction Core.typeSet)
-    @@ ("terms" ~> Core.termSet $ Sets.fromList $ var "terms")
-    @@ (string "set element")
-    @@ (Sets.toList $ var "s")
-
-inferTypeOfTerm :: TBinding (InferenceContext -> Term -> String -> Flow s InferenceResult)
-inferTypeOfTerm = define "inferTypeOfTerm" $
-  doc "Infer the type of a given term" $
-  "cx" ~> "term" ~> "desc" ~>
-  "matchTerm" <~ (cases _Term (var "term") Nothing [
-    _Term_annotated>>: "a" ~> inferTypeOfAnnotatedTerm @@ var "cx" @@ var "a",
-    _Term_application>>: "a" ~> inferTypeOfApplication @@ var "cx" @@ var "a",
-    _Term_either>>: "e" ~> inferTypeOfEither @@ var "cx" @@ var "e",
-    _Term_function>>: "f" ~> inferTypeOfFunction @@ var "cx" @@ var "f",
-    _Term_let>>: "l" ~> inferTypeOfLet @@ var "cx" @@ var "l",
-    _Term_list>>: "els" ~> inferTypeOfList @@ var "cx" @@ var "els",
-    _Term_literal>>: "l" ~> inferTypeOfLiteral @@ var "cx" @@ var "l",
-    _Term_map>>: "m" ~> inferTypeOfMap @@ var "cx" @@ var "m",
-    _Term_maybe>>: "m" ~> inferTypeOfOptional @@ var "cx" @@ var "m",
-    _Term_pair>>: "p" ~> inferTypeOfPair @@ var "cx" @@ var "p",
-    _Term_record>>: "r" ~> inferTypeOfRecord @@ var "cx" @@ var "r",
-    _Term_set>>: "s" ~> inferTypeOfSet @@ var "cx" @@ var "s",
-    _Term_typeApplication>>: "tt" ~> inferTypeOfTypeApplication @@ var "cx" @@ var "tt",
-    _Term_typeLambda>>: "ta" ~> inferTypeOfTypeLambda @@ var "cx" @@ var "ta",
-    _Term_union>>: "i" ~> inferTypeOfInjection @@ var "cx" @@ var "i",
-    _Term_unit>>: constant $ produce $ inferTypeOfUnit,
-    _Term_variable>>: "name" ~> inferTypeOfVariable @@ var "cx" @@ var "name",
-    _Term_wrap>>: "w" ~> inferTypeOfWrappedTerm @@ var "cx" @@ var "w"]) $
-  trace (var "desc") (var "matchTerm")
-
-inferTypeOfTypeLambda :: TBinding (InferenceContext -> TypeLambda -> Flow s InferenceResult)
-inferTypeOfTypeLambda = define "inferTypeOfTypeLambda" $
-  doc "Infer the type of a type abstraction; just pass through to the lambda body." $
-  "cx" ~> "ta" ~>
-  inferTypeOfTerm @@ var "cx" @@ (Core.typeLambdaBody $ var "ta") @@ (string "type abstraction")
-
-inferTypeOfTypeApplication :: TBinding (InferenceContext -> TypeApplicationTerm -> Flow s InferenceResult)
-inferTypeOfTypeApplication = define "inferTypeOfTypeApplication" $
-  doc "Infer the type of a type application; just pass through to the inner term." $
-  "cx" ~> "tt" ~>
-  inferTypeOfTerm @@ var "cx" @@ (Core.typeApplicationTermBody $ var "tt") @@ (string "type application term")
-
-inferTypeOfUnit :: TBinding InferenceResult
-inferTypeOfUnit = define "inferTypeOfUnit" $
-  doc "The trivial inference rule for the unit term" $
-  Typing.inferenceResult
-    (Core.termUnit)
-    (Core.typeUnit)
-    (Substitution.idTypeSubst)
-    Maps.empty
-
-inferTypeOfUnwrap :: TBinding (InferenceContext -> Name -> Flow s InferenceResult)
-inferTypeOfUnwrap = define "inferTypeOfUnwrap" $
-  doc "Infer the type of an unwrap operation" $
-  "cx" ~> "tname" ~>
-  "schemaType" <<~ Schemas.requireSchemaType @@ var "cx" @@ var "tname" $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "stype" <~ Core.typeSchemeType (var "schemaType") $
-  "wtyp" <<~ ExtractCore.wrappedType @@ var "tname" @@ var "stype" $
-  Flows.pure $ yield
-    @@ (buildTypeApplicationTerm @@ var "svars"
-      @@ (Core.termFunction $ Core.functionElimination $ Core.eliminationWrap $ var "tname"))
-    @@ (Core.typeFunction $ Core.functionType
-      (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
-      (var "wtyp"))
-    @@ Substitution.idTypeSubst
-
-inferTypeOfVariable :: TBinding (InferenceContext -> Name -> Flow s InferenceResult)
-inferTypeOfVariable = define "inferTypeOfVariable" $
-  doc "Infer the type of a variable" $
-  "cx" ~> "name" ~>
-  Maybes.maybe
-    (Flows.fail $ Strings.cat2 (string "Variable not bound to type: ") (Core.unName $ var "name"))
-    ("scheme" ~>
-      "ts" <<~ Schemas.instantiateTypeScheme @@ var "scheme" $
-      -- Collect constraints from the variable's type scheme (may have constraints if it's a let-bound polymorphic variable)
-      "constraints" <~ Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints $ var "ts") $
-      produce $ Typing.inferenceResult
-        (buildTypeApplicationTerm
-          @@ Core.typeSchemeVariables (var "ts")
-          @@ Core.termVariable (var "name"))
-        (Core.typeSchemeType $ var "ts")
-        (Substitution.idTypeSubst)
-        (var "constraints"))
-    (Maps.lookup (var "name") (Typing.inferenceContextDataTypes $ var "cx"))
-
-inferTypeOfWrappedTerm :: TBinding (InferenceContext -> WrappedTerm -> Flow s InferenceResult)
-inferTypeOfWrappedTerm = define "inferTypeOfWrappedTerm" $
-  doc "Infer the type of a wrapped term" $
-  "cx" ~> "wt" ~>
-  "tname" <~ Core.wrappedTermTypeName (var "wt") $
-  "term" <~ Core.wrappedTermBody (var "wt") $
-  "schemaType" <<~ Schemas.requireSchemaType @@ var "cx" @@ var "tname" $
-  "result" <<~ inferTypeOfTerm @@ var "cx" @@ var "term" @@ (string "wrapped term") $
-  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
-  "stype" <~ Core.typeSchemeType (var "schemaType") $
-  "iterm" <~ Typing.inferenceResultTerm (var "result") $
-  "itype" <~ Typing.inferenceResultType (var "result") $
-  "isubst" <~ Typing.inferenceResultSubst (var "result") $
-  "ityp" <~ Core.typeWrap (Core.wrappedType (var "tname") (var "itype")) $
-  mapConstraints @@ var "cx"
-    @@ ("subst" ~> yield
-      @@ (buildTypeApplicationTerm @@ var "svars" @@ (Core.termWrap $ Core.wrappedTerm (var "tname") (var "iterm")))
-      @@ (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
-      @@ (Substitution.composeTypeSubst @@ var "isubst" @@ var "subst"))
-    @@ list [Typing.typeConstraint (var "stype") (var "ityp") (string "schema type of wrapper")]
-
-inferTypesOfTemporaryBindings :: TBinding (InferenceContext -> [Binding] -> Flow s ([Term], ([Type], (TypeSubst, M.Map Name TypeVariableMetadata))))
--- | Returns: (terms, (types, (subst, constraints)))
-inferTypesOfTemporaryBindings = define "inferTypesOfTemporaryBindings" $
-  doc "Infer types for temporary let bindings. Returns a 4-tuple of (terms, types, substitution, accumulated constraints)" $
-  "cx" ~> "bins" ~>
-  "dflt" <~ (
-    "binding" <~ Lists.head (var "bins") $
-    "k" <~ Core.bindingName (var "binding") $
-    "v" <~ Core.bindingTerm (var "binding") $
-    "tl" <~ Lists.tail (var "bins") $
-    "result1" <<~ inferTypeOfTerm @@ var "cx" @@ var "v" @@
-      (Strings.cat $ list [
-        (string "temporary let binding '"),
-        Core.unName $ var "k",
-        (string "'")]) $
-    "j" <~ Typing.inferenceResultTerm (var "result1") $
-    "u_prime" <~ Typing.inferenceResultType (var "result1") $
-    "u" <~ Typing.inferenceResultSubst (var "result1") $
-    "c1Inferred" <~ Typing.inferenceResultClassConstraints (var "result1") $
-
-    -- Extract constraints from the original binding's TypeScheme (if present)
-    -- These need to be instantiated with fresh variable names and unified with the inferred type
-    "originalBindingConstraints" <<~ Maybes.maybe
-      (Flows.pure Maps.empty)
-      ("ts" ~>
-        -- Instantiate the type scheme to get fresh variable names
-        -- The constraints in the instantiated scheme will have fresh names that correspond
-        -- to the type variables in the instantiated type
-        Flows.bind (Schemas.instantiateTypeScheme @@ var "ts") ("instantiatedTs" ~>
-          -- Get the constraints from the instantiated type scheme
-          "freshConstraints" <~ Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints $ var "instantiatedTs") $
-          -- We also need to unify the instantiated type with the inferred type
-          -- so that the fresh constraint variables get mapped to the actual inferred variables
-          Flows.bind (Unification.unifyTypes
-            @@ (Typing.inferenceContextSchemaTypes $ var "cx")
-            @@ (Core.typeSchemeType $ var "instantiatedTs")
-            @@ var "u_prime"
-            @@ string "original binding type") ("unifySubst" ~>
-              -- Apply the unification substitution to the fresh constraints
-              -- This maps the fresh constraint variables to the actual inferred type variables
-              Flows.pure (Substitution.substInClassConstraints @@ var "unifySubst" @@ var "freshConstraints"))))
-      (Core.bindingType $ var "binding") $
-
-    -- Merge the original binding constraints with the inferred constraints
-    "c1" <~ mergeClassConstraints @@ var "c1Inferred" @@ var "originalBindingConstraints" $
-
-    "result2" <<~ inferTypesOfTemporaryBindings @@
-      (Substitution.substInContext @@ var "u" @@ var "cx") @@
-      var "tl" $
-    "h" <~ Pairs.first (var "result2") $
-    "r_prime" <~ Pairs.first (Pairs.second $ var "result2") $
-    "restPair" <~ Pairs.second (Pairs.second $ var "result2") $
-    "r" <~ Pairs.first (var "restPair") $
-    "c2" <~ Pairs.second (var "restPair") $
-    -- Apply the substitution r to c1's variable names before merging
-    -- This ensures constraints are tracked under the correct (substituted) variable names
-    "c1Subst" <~ Substitution.substInClassConstraints @@ var "r" @@ var "c1" $
-    -- Merge the substituted constraints from this binding with constraints from the rest
-    "mergedConstraints" <~ mergeClassConstraints @@ var "c1Subst" @@ var "c2" $
-    Flows.pure $ pair
-      (Lists.cons (Substitution.substTypesInTerm @@ var "r" @@ var "j") (var "h"))
-      (pair
-        (Lists.cons (Substitution.substInType @@ var "r" @@ var "u_prime") (var "r_prime"))
-        (pair (Substitution.composeTypeSubst @@ var "u" @@ var "r") (var "mergedConstraints")))) $
-  Logic.ifElse (Lists.null $ var "bins")
-    (Flows.pure $ pair (list ([] :: [TTerm Term])) (pair (list ([] :: [TTerm Type])) (pair (Substitution.idTypeSubst) Maps.empty)))
-    (var "dflt")
-
-initialTypeContext :: TBinding (Graph -> Flow s TypeContext)
-initialTypeContext = define "initialTypeContext" $
-  doc "Create an initial type context from a graph" $
-  "g" ~>
-  "toPair" <~ ("el" ~>
-    "name" <~ Core.bindingName (var "el") $
-    optCases (Core.bindingType $ var "el")
-      (Flows.fail $ (string "untyped element: ") ++ Core.unName (var "name"))
-      ("ts" ~> produce $ pair (var "name") (Schemas.typeSchemeToFType @@ var "ts"))) $
-  "ix" <<~ Schemas.graphToInferenceContext @@ var "g" $
-  "types" <<~ Flows.map
-    (unaryFunction Maps.fromList)
-    (Flows.mapList (var "toPair") (Graph.graphElements $ var "g")) $
-  produce $ Typing.typeContext (var "types") Maps.empty Sets.empty Sets.empty Sets.empty (var "ix")
-
-isUnbound :: TBinding (InferenceContext -> Name -> Bool)
-isUnbound = define "isUnbound" $
-  doc "Check if a variable is unbound in context" $
-  "cx" ~> "v" ~>
-  Logic.and
-    (Logic.not $ Sets.member (var "v") $ freeVariablesInContext @@ var "cx")
-    (Logic.not $ Maps.member (var "v") $ Typing.inferenceContextSchemaTypes $ var "cx")
-
-mapConstraints :: TBinding (InferenceContext -> (TypeSubst -> a) -> [TypeConstraint] -> Flow s a)
-mapConstraints = define "mapConstraints" $
-  doc "Map over type constraints after unification" $
-  "cx" ~> "f" ~> "constraints" ~>
-  "s" <<~ Unification.unifyTypeConstraints @@ (Typing.inferenceContextSchemaTypes $ var "cx") @@ var "constraints" $
-  exec (Checking.checkTypeSubst @@ var "cx" @@ var "s") $
-  produce (var "f" @@ var "s")
-
-showInferenceResult :: TBinding (InferenceResult -> String)
-showInferenceResult = define "showInferenceResult" $
-  doc "Show an inference result for debugging" $
-  "result" ~>
-  "term" <~ Typing.inferenceResultTerm (var "result") $
-  "typ" <~ Typing.inferenceResultType (var "result") $
-  "subst" <~ Typing.inferenceResultSubst (var "result") $
-  Strings.cat $ list [
-    (string "{term="),
-    ShowCore.term @@ var "term",
-    (string ", type="),
-    ShowCore.type_ @@ var "typ",
-    (string ", subst="),
-    ShowTyping.typeSubst @@ var "subst",
-    (string "}")]
-
-yield :: TBinding (Term -> Type -> TypeSubst -> InferenceResult)
-yield = define "yield" $
-  doc "Create an inference result with no class constraints" $
-  "term" ~> "typ" ~> "subst" ~>
-  Typing.inferenceResult
-    (Substitution.substTypesInTerm @@ var "subst" @@ var "term")
-    (Substitution.substInType @@ var "subst" @@ var "typ")
-    (var "subst")
-    Maps.empty
-
-yieldWithConstraints :: TBinding (Term -> Type -> TypeSubst -> M.Map Name TypeVariableMetadata -> InferenceResult)
-yieldWithConstraints = define "yieldWithConstraints" $
-  doc "Create an inference result with class constraints" $
-  "term" ~> "typ" ~> "subst" ~> "constraints" ~>
-  Typing.inferenceResult
-    (Substitution.substTypesInTerm @@ var "subst" @@ var "term")
-    (Substitution.substInType @@ var "subst" @@ var "typ")
-    (var "subst")
-    (var "constraints")
-
--- TODO: pass context and variables, and actually check types
-yieldChecked :: TBinding (Term -> Type -> TypeSubst -> Flow s InferenceResult)
-yieldChecked = define "yieldChecked" $
-  doc "Create a checked inference result" $
-  "term" ~> "typ" ~> "subst" ~>
-  "iterm" <~ Substitution.substTypesInTerm @@ var "subst" @@ var "term" $
-  "itype" <~ Substitution.substInType @@ var "subst" @@ var "typ" $
-  produce $ Typing.inferenceResult (var "iterm") (var "itype") (var "subst") Maps.empty
-
-yieldCheckedWithConstraints :: TBinding (Term -> Type -> TypeSubst -> M.Map Name TypeVariableMetadata -> Flow s InferenceResult)
-yieldCheckedWithConstraints = define "yieldCheckedWithConstraints" $
-  doc "Create a checked inference result with class constraints" $
-  "term" ~> "typ" ~> "subst" ~> "constraints" ~>
-  "iterm" <~ Substitution.substTypesInTerm @@ var "subst" @@ var "term" $
-  "itype" <~ Substitution.substInType @@ var "subst" @@ var "typ" $
-  -- Apply the substitution to constraint keys as well, so they track the final variable names
-  "iconstraints" <~ Substitution.substInClassConstraints @@ var "subst" @@ var "constraints" $
-  produce $ Typing.inferenceResult (var "iterm") (var "itype") (var "subst") (var "iconstraints")
-
-yieldDebug :: TBinding (InferenceContext -> String -> Term -> Type -> TypeSubst -> Flow s InferenceResult)
-yieldDebug = define "yieldDebug" $
-  doc "Create an inference result with debug output" $
-  "cx" ~> "debugId" ~> "term" ~> "typ" ~> "subst" ~>
-  "rterm" <~ Substitution.substTypesInTerm @@ var "subst" @@ var "term" $
-  "rtyp" <~ Substitution.substInType @@ var "subst" @@ var "typ" $
-  "result" <<~ Annotations.debugIf @@ var "debugId" @@
-    (Strings.cat $ list [
-      (string "\n\tterm: "),  ShowCore.term @@ var "term",
-      (string "\n\ttyp: "),   ShowCore.type_ @@ var "typ",
-      (string "\n\tsubst: "), ShowTyping.typeSubst @@ var "subst",
-      (string "\n\trterm: "), ShowCore.term @@ var "rterm",
-      (string "\n\trtyp: "),  ShowCore.type_ @@ var "rtyp"]) $
-  produce $ Typing.inferenceResult (var "rterm") (var "rtyp") (var "subst") Maps.empty
+  bindConstraints, bindUnboundTypeVariables, buildTypeApplicationTerm,
+  extendContext, finalizeInferredTerm,
+  forInferredTerm, freeVariablesInContext, freshVariableType,
+  generalize, inferGraphTypes, inferInGraphContext, inferMany,
+  inferTypeOf, inferTypeOfAnnotatedTerm, inferTypeOfApplication,
+  inferTypeOfCaseStatement, inferTypeOfCollection,
+  inferTypeOfEither, inferTypeOfElimination,
+  inferTypeOfFunction, inferTypeOfInjection,
+  inferTypeOfLambda, inferTypeOfLet, inferTypeOfLetNormalized,
+  inferTypeOfList, inferTypeOfLiteral,
+  inferTypeOfMap, inferTypeOfOptional,
+  inferTypeOfPair, inferTypeOfPrimitive,
+  inferTypeOfProjection, inferTypeOfRecord,
+  inferTypeOfSet, inferTypeOfTerm,
+  inferTypeOfTypeLambda, inferTypeOfTypeApplication,
+  inferTypeOfUnit, inferTypeOfUnwrap, inferTypeOfVariable,
+  inferTypeOfWrappedTerm, inferTypesOfTemporaryBindings,
+  isUnbound, mapConstraints, mergeClassConstraints, showInferenceResult, yield, yieldChecked,
+  yieldCheckedWithConstraints, yieldDebug, yieldWithConstraints)
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths    as Paths
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Ast          as Ast
+import qualified Hydra.Dsl.Bootstrap         as Bootstrap
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Meta.Graph        as Graph
+import qualified Hydra.Dsl.Json.Model         as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Literals          as Literals
+import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base         as MetaBase
+import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
+import qualified Hydra.Dsl.Meta.Types        as MetaTypes
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms
+import qualified Hydra.Dsl.Prims             as Prims
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Testing      as Testing
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Tests             as Tests
+import qualified Hydra.Dsl.Topology     as Topology
+import qualified Hydra.Dsl.Types             as Types
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
+import qualified Hydra.Dsl.Util         as Util
+import qualified Hydra.Dsl.Meta.Variants     as Variants
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                    as I
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+import qualified Data.Maybe                  as Y
+
+import qualified Hydra.Sources.Kernel.Terms.Annotations  as Annotations
+import qualified Hydra.Sources.Kernel.Terms.Checking     as Checking
+import qualified Hydra.Sources.Kernel.Terms.Extract.Core as ExtractCore
+import qualified Hydra.Sources.Kernel.Terms.Lexical      as Lexical
+import qualified Hydra.Sources.Kernel.Terms.Reflect      as Reflect
+import qualified Hydra.Sources.Kernel.Terms.Rewriting    as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Schemas      as Schemas
+import qualified Hydra.Sources.Kernel.Terms.Show.Core    as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors  as ShowError
+import qualified Hydra.Sources.Kernel.Terms.Show.Typing  as ShowTyping
+import qualified Hydra.Sources.Kernel.Terms.Sorting      as Sorting
+import qualified Hydra.Sources.Kernel.Terms.Substitution as Substitution
+import qualified Hydra.Sources.Kernel.Terms.Unification  as Unification
+
+
+ns :: Namespace
+ns = Namespace "hydra.inference"
+
+module_ :: Module
+module_ = Module ns elements
+    [Annotations.ns, Checking.ns, ExtractCore.ns, Lexical.ns, Reflect.ns,
+      Rewriting.ns, Schemas.ns, ShowCore.ns, ShowError.ns, ShowTyping.ns, Sorting.ns, Substitution.ns,
+      Unification.ns]
+    kernelTypesNamespaces $
+    Just "Type inference following Algorithm W, extended for nominal terms and types"
+  where
+    elements = [
+      toTermDefinition bindConstraints,
+      toTermDefinition bindUnboundTypeVariables,
+      toTermDefinition buildTypeApplicationTerm,
+      toTermDefinition extendContext,
+      toTermDefinition finalizeInferredTerm,
+      toTermDefinition forInferredTerm,
+      toTermDefinition freeVariablesInContext,
+      toTermDefinition freshVariableType,
+      toTermDefinition generalize,
+      toTermDefinition inferGraphTypes,
+      toTermDefinition inferInGraphContext,
+      toTermDefinition inferMany,
+      toTermDefinition inferTypeOf,
+      toTermDefinition inferTypeOfAnnotatedTerm,
+      toTermDefinition inferTypeOfApplication,
+      toTermDefinition inferTypeOfCaseStatement,
+      toTermDefinition inferTypeOfCollection,
+      toTermDefinition inferTypeOfEither,
+      toTermDefinition inferTypeOfElimination,
+      toTermDefinition inferTypeOfFunction,
+      toTermDefinition inferTypeOfInjection,
+      toTermDefinition inferTypeOfLambda,
+      toTermDefinition inferTypeOfLet,
+      toTermDefinition inferTypeOfLetNormalized,
+      toTermDefinition inferTypeOfList,
+      toTermDefinition inferTypeOfLiteral,
+      toTermDefinition inferTypeOfMap,
+      toTermDefinition inferTypeOfOptional,
+      toTermDefinition inferTypeOfPair,
+      toTermDefinition inferTypeOfPrimitive,
+      toTermDefinition inferTypeOfProjection,
+      toTermDefinition inferTypeOfRecord,
+      toTermDefinition inferTypeOfSet,
+      toTermDefinition inferTypeOfTerm,
+      toTermDefinition inferTypeOfTypeLambda,
+      toTermDefinition inferTypeOfTypeApplication,
+      toTermDefinition inferTypeOfUnit,
+      toTermDefinition inferTypeOfUnwrap,
+      toTermDefinition inferTypeOfVariable,
+      toTermDefinition inferTypeOfWrappedTerm,
+      toTermDefinition inferTypesOfTemporaryBindings,
+      toTermDefinition isUnbound,
+      toTermDefinition mapConstraints,
+      toTermDefinition mergeClassConstraints,
+      toTermDefinition showInferenceResult,
+      toTermDefinition yield,
+      toTermDefinition yieldChecked,
+      toTermDefinition yieldCheckedWithConstraints,
+      toTermDefinition yieldDebug,
+      toTermDefinition yieldWithConstraints]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+-- | Bridge helper: format InContext UnificationError as a string
+formatUnifError :: TTerm (InContext UnificationError -> String)
+formatUnifError = "ic" ~> Error.unificationErrorMessage (Ctx.inContextObject (var "ic"))
+
+-- | Bridge helper: format InContext Error as a string
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
+--
+
+bindConstraints :: TBinding (Context -> Graph -> [TypeConstraint] -> Either (InContext Error) TypeSubst)
+bindConstraints = define "bindConstraints" $
+  doc "Unify type constraints and check the substitution" $
+  "flowCx" ~> "cx" ~> "constraints" ~>
+  "s" <<~ Eithers.bimap
+    ("_ic" ~> Ctx.inContext (Error.errorOther $ Error.otherError (Error.unificationErrorMessage (Ctx.inContextObject (var "_ic")))) (Ctx.inContextContext (var "_ic")))
+    ("_a" ~> var "_a")
+    (Unification.unifyTypeConstraints @@ var "flowCx" @@ (Graph.graphSchemaTypes $ var "cx") @@ var "constraints") $
+  Eithers.bind (Checking.checkTypeSubst @@ var "flowCx" @@ var "cx" @@ var "s") (
+    "_" ~> right (var "s"))
+
+bindUnboundTypeVariables :: TBinding (Graph -> Term -> Term)
+bindUnboundTypeVariables = define "bindUnboundTypeVariables" $
+  doc ("Place unbound type variables appearing anywhere under a typed let binding in the type scheme of that binding."
+    <> " These variables may appear in the binding type scheme itself or in that of a subterm,"
+    <> " in domain types attached to functions, and in type abstraction and type application terms."
+    <> " This process attempts to capture type variables which have escaped unification, e.g. due to unused code."
+    <> " However, unbound type variables not appearing beneath any typed let binding remain unbound.") $
+  "cx" ~> "term0" ~>
+  "svars" <~ Sets.fromList (Maps.keys $ Graph.graphSchemaTypes $ var "cx") $
+  "rewrite" <~ ("recurse" ~> "term" ~> cases _Term (var "term")
+    (Just $ var "recurse" @@ var "term") [
+    _Term_let>>: "l" ~>
+      "forBinding" <~ ("b" ~>
+        "bname" <~ (Core.bindingName $ var "b") $
+        "bterm" <~ (Core.bindingTerm $ var "b") $
+        optCases (Core.bindingType $ var "b")
+          (Core.binding (var "bname") (bindUnboundTypeVariables @@ var "cx" @@ var "bterm") nothing)
+          ("ts" ~>
+            "bvars" <~ Sets.fromList (Core.typeSchemeVariables $ var "ts") $
+            "unboundInType" <~ Rewriting.freeVariablesInType @@ (Core.typeSchemeType $ var "ts") $
+            "unboundInTerm" <~ Rewriting.freeTypeVariablesInTerm @@ var "bterm" $
+            "unbound" <~ Sets.toList (Sets.difference
+              (Sets.union (var "unboundInType") (var "unboundInTerm"))
+              (Sets.union (var "svars") (var "bvars"))) $
+            "ts2" <~ Core.typeScheme
+              (Lists.concat2
+                (Core.typeSchemeVariables $ var "ts")
+                (var "unbound"))
+              (Core.typeSchemeType $ var "ts")
+              (Core.typeSchemeConstraints $ var "ts") $
+            "bterm2" <~ Lists.foldl
+              ("t" ~> "v" ~> Core.termTypeLambda
+                (Core.typeLambda (var "v") (var "t")))
+              (var "bterm")
+              (var "unbound") $
+            Core.binding (var "bname") (var "bterm2") (just $ var "ts2"))) $
+      Core.termLet $ Core.let_
+        (Lists.map (var "forBinding") (Core.letBindings $ var "l"))
+        (bindUnboundTypeVariables @@ var "cx" @@ (Core.letBody $ var "l"))]) $
+  Rewriting.rewriteTerm @@ var "rewrite" @@ var "term0"
+
+buildTypeApplicationTerm :: TBinding ([Name] -> Term -> Term)
+buildTypeApplicationTerm = define "buildTypeApplicationTerm" $
+  doc "Fold a list of type variables over a term to build a type application term" $
+  "tvars" ~> "body" ~> Lists.foldl
+    ("t" ~> "v" ~> Core.termTypeApplication $ Core.typeApplicationTerm (var "t") (Core.typeVariable (var "v")))
+    (var "body")
+    (var "tvars")
+
+extendContext :: TBinding ([(Name, TypeScheme)] -> Graph -> Graph)
+extendContext = define "extendContext" $
+  doc "Add (term variable, type scheme) pairs to the graph's bound types" $
+  "pairs" ~> "cx" ~>
+  Graph.graphWithBoundTypes (var "cx") $ Maps.union
+    (Maps.fromList $ var "pairs")
+    (Graph.graphBoundTypes $ var "cx")
+
+finalizeInferredTerm :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Term)
+finalizeInferredTerm = define "finalizeInferredTerm" $
+  doc "Finalize an inferred term by checking for unbound type variables, then normalizing type variables" $
+  "flowCx" ~> "cx" ~> "term" ~>
+  "term2" <~ bindUnboundTypeVariables @@ var "cx" @@ var "term" $
+  "_" <<~ Checking.checkForUnboundTypeVariables @@ var "flowCx" @@ var "cx" @@ var "term2" $
+  right (Rewriting.normalizeTypeVariablesInTerm @@ var "term2")
+
+forInferredTerm :: TBinding (Context -> Graph -> Term -> String -> (InferenceResult -> a) -> Prelude.Either (InContext Error) (a, Context))
+forInferredTerm = define "forInferredTerm" $
+  doc "Infer a term's type and map over the result" $
+  "fcx" ~> "cx" ~> "term" ~> "desc" ~> "f" ~>
+  "rp" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "term" @@ var "desc" $
+  right $ pair (var "f" @@ var "rp") (Typing.inferenceResultContext (var "rp"))
+
+freeVariablesInContext :: TBinding (Graph -> S.Set Name)
+freeVariablesInContext = define "freeVariablesInContext" $
+  doc "Get all free variables in a graph's bound types" $
+  "cx" ~>
+    Lists.foldl (binaryFunction Sets.union) Sets.empty $
+      Lists.map (Rewriting.freeVariablesInTypeSchemeSimple) $
+        Maps.elems $ Graph.graphBoundTypes $ var "cx"
+
+freshVariableType :: TBinding (Context -> (Type, Context))
+freshVariableType = define "freshVariableType" $
+  doc "Generate a fresh type variable" $
+  "cx" ~>
+  "result" <~ Schemas.freshName @@ var "cx" $
+  "name" <~ Pairs.first (var "result") $
+  "cx2" <~ Pairs.second (var "result") $
+  pair (Core.typeVariable (var "name")) (var "cx2")
+
+mergeClassConstraints :: TBinding (M.Map Name TypeVariableMetadata -> M.Map Name TypeVariableMetadata -> M.Map Name TypeVariableMetadata)
+mergeClassConstraints = define "mergeClassConstraints" $
+  doc "Merge two maps of class constraints. When both maps have constraints for the same variable, union the class sets." $
+  "m1" ~> "m2" ~>
+  Lists.foldl
+    ("acc" ~> "pair" ~>
+      "k" <~ Pairs.first (var "pair") $
+      "v" <~ Pairs.second (var "pair") $
+      Maybes.maybe
+        (Maps.insert (var "k") (var "v") (var "acc"))
+        ("existing" ~>
+          "merged" <~ Core.typeVariableMetadata (Sets.union (Core.typeVariableMetadataClasses $ var "existing") (Core.typeVariableMetadataClasses $ var "v")) $
+          Maps.insert (var "k") (var "merged") (var "acc"))
+        (Maps.lookup (var "k") (var "acc")))
+    (var "m1")
+    (Maps.toList $ var "m2")
+
+generalize :: TBinding (Graph -> Type -> TypeScheme)
+generalize = define "generalize" $
+  doc "Generalize a type to a type scheme" $
+  "cx" ~> "typ" ~>
+  -- IMPORTANT: freeVariablesInTypeOrdered returns ALL names from Type_variable positions,
+  -- including qualified type names (like hydra.core.Lambda) which are NOT actual type variables.
+  -- We must filter these out to avoid quantifying over type names.
+  "isTypeVarName" <~ ("name" ~>
+    "parts" <~ Strings.splitOn (string ".") (Core.unName $ var "name") $
+    Equality.lte (Lists.length $ var "parts") (int32 1)) $
+  "vars" <~ Lists.nub (Lists.filter ("v" ~> Logic.and (isUnbound @@ var "cx" @@ var "v") (var "isTypeVarName" @@ var "v")) $
+     Rewriting.freeVariablesInTypeOrdered @@ var "typ") $
+  -- Extract constraints for the generalized variables from the context
+  "allConstraints" <~ Graph.graphClassConstraints (var "cx") $
+  "relevantConstraints" <~ Maps.fromList (Maybes.cat $ Lists.map
+    ("v" ~> Maybes.map ("meta" ~> pair (var "v") (var "meta")) $ Maps.lookup (var "v") (var "allConstraints"))
+    (var "vars")) $
+  -- Only include constraints if there are any
+  "constraintsMaybe" <~ Logic.ifElse (Maps.null $ var "relevantConstraints") Phantoms.nothing (just $ var "relevantConstraints") $
+  Core.typeScheme (var "vars") (var "typ") (var "constraintsMaybe")
+
+inferGraphTypes :: TBinding (Context -> [Binding] -> Graph -> Prelude.Either (InContext Error) ((Graph, [Binding]), Context))
+inferGraphTypes = define "inferGraphTypes" $
+  doc ("Infer types for all elements in a graph, using the provided ordered bindings."
+    <> " Returns both the inferred graph and the ordered inferred bindings.") $
+  "fcx0" ~> "bindings0" ~> "g0" ~>
+  "fcx" <~ Ctx.pushTrace (string "graph inference") (var "fcx0") $
+  "let0" <~ Core.let_ (var "bindings0") Core.termUnit $
+  -- Reconstruct a (Graph, [Binding]) from an inferred Let term, preserving binding order
+  "fromLetTerm" <~ ("l" ~>
+    "bindings" <~ Core.letBindings (var "l") $
+    "prims" <~ Graph.graphPrimitives (var "g0") $
+    "schemaTypes" <~ Graph.graphSchemaTypes (var "g0") $
+    "rawG" <~ (Lexical.buildGraph @@ var "bindings" @@ Maps.empty @@ var "prims") $
+    "g" <~ Graph.graphWithSchemaTypes (var "rawG") (var "schemaTypes") $
+    pair (var "g") (var "bindings")) $
+  "result" <<~ inferTypeOfTerm @@ var "fcx" @@ var "g0" @@ (Core.termLet $ var "let0") @@ (string "graph term") $
+  "fcx2" <~ Typing.inferenceResultContext (var "result") $
+  "term" <~ Typing.inferenceResultTerm (var "result") $
+  "finalized" <<~ finalizeInferredTerm @@ var "fcx2" @@ var "g0" @@ var "term" $
+  cases _Term (var "finalized")
+    Nothing [
+    _Term_let>>: "l" ~> right $ pair (var "fromLetTerm" @@ var "l") (var "fcx2"),
+    _Term_variable>>: constant $ Ctx.failInContext (Error.errorOther $ Error.otherError (string "Expected inferred graph as let term")) (var "fcx2")]
+
+inferInGraphContext :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) InferenceResult)
+inferInGraphContext = define "inferInGraphContext" $
+  doc "Infer the type of a term in a given inference context" $
+  "fcx" ~> "cx" ~> "term" ~>
+  inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "term" @@ (string "single term")
+
+
+inferTypeOf :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) ((Term, TypeScheme), Context))
+inferTypeOf = define "inferTypeOf" $
+  doc "Map a possibly untyped term to a fully typed term and its type" $
+  "fcx" ~> "cx" ~> "term" ~>
+  -- Top-level let term which allows us to easily extract an inferred type scheme
+  "letTerm" <~ Core.termLet (Core.let_
+    (list [Core.binding (Core.name $ (string "ignoredVariableName")) (var "term") nothing])
+    (MetaTerms.string "ignoredBody")) $
+  "result" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "letTerm" @@ (string "infer type of term") $
+  "fcx2" <~ Typing.inferenceResultContext (var "result") $
+  "finalized" <<~ finalizeInferredTerm @@ var "fcx2" @@ var "cx" @@ Typing.inferenceResultTerm (var "result") $
+  "letResult" <<~ ExtractCore.let_ @@ var "fcx2" @@ var "cx" @@ var "finalized" $
+  "bindings" <~ Core.letBindings (var "letResult") $
+  Logic.ifElse (Equality.equal (int32 1) (Lists.length $ var "bindings"))
+    ("binding" <~ Lists.head (var "bindings") $
+     "term1" <~ Core.bindingTerm (var "binding") $
+     "mts" <~ Core.bindingType (var "binding") $
+     Maybes.maybe
+       (Ctx.failInContext (Error.errorOther $ Error.otherError (string "Expected a type scheme")) (var "fcx2"))
+       ("ts" ~> right $ pair (pair (var "term1") (var "ts")) (var "fcx2"))
+       (var "mts"))
+    (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat $ list [
+        (string "Expected a single binding with a type scheme, but got: "),
+        Literals.showInt32 $ Lists.length $ var "bindings",
+        (string " bindings")])) (var "fcx2"))
+
+
+inferTypeOfLiteral :: TBinding (Context -> Literal -> InferenceResult)
+inferTypeOfLiteral = define "inferTypeOfLiteral" $
+  doc "Infer the type of a literal" $
+  "fcx" ~> "lit" ~>
+  Typing.inferenceResult
+    (Core.termLiteral $ var "lit")
+    (Core.typeLiteral $ Reflect.literalType @@ var "lit")
+    (asTerm Substitution.idTypeSubst)
+    Maps.empty
+    (var "fcx")
+
+
+inferTypeOfUnit :: TBinding (Context -> InferenceResult)
+inferTypeOfUnit = define "inferTypeOfUnit" $
+  doc "The trivial inference rule for the unit term" $
+  "fcx" ~>
+  Typing.inferenceResult
+    (Core.termUnit)
+    (Core.typeUnit)
+    (asTerm Substitution.idTypeSubst)
+    Maps.empty
+    (var "fcx")
+
+isUnbound :: TBinding (Graph -> Name -> Bool)
+isUnbound = define "isUnbound" $
+  doc "Check if a variable is unbound in context" $
+  "cx" ~> "v" ~>
+  Logic.and
+    (Logic.not $ Sets.member (var "v") $ freeVariablesInContext @@ var "cx")
+    (Logic.not $ Maps.member (var "v") $ Graph.graphSchemaTypes $ var "cx")
+
+mapConstraints :: TBinding (Context -> Graph -> (TypeSubst -> a) -> [TypeConstraint] -> Either (InContext Error) a)
+mapConstraints = define "mapConstraints" $
+  doc "Map over type constraints after unification" $
+  "flowCx" ~> "cx" ~> "f" ~> "constraints" ~>
+  "s" <<~ Eithers.bimap
+    ("_ic" ~> Ctx.inContext (Error.errorOther $ Error.otherError (Error.unificationErrorMessage (Ctx.inContextObject (var "_ic")))) (Ctx.inContextContext (var "_ic")))
+    ("_a" ~> var "_a")
+    (Unification.unifyTypeConstraints @@ var "flowCx" @@ (Graph.graphSchemaTypes $ var "cx") @@ var "constraints") $
+  Eithers.bind (Checking.checkTypeSubst @@ var "flowCx" @@ var "cx" @@ var "s") (
+    "_" ~> right (var "f" @@ var "s"))
+
+showInferenceResult :: TBinding (InferenceResult -> String)
+showInferenceResult = define "showInferenceResult" $
+  doc "Show an inference result for debugging" $
+  "result" ~>
+  "term" <~ Typing.inferenceResultTerm (var "result") $
+  "typ" <~ Typing.inferenceResultType (var "result") $
+  "subst" <~ Typing.inferenceResultSubst (var "result") $
+  Strings.cat $ list [
+    (string "{term="),
+    ShowCore.term @@ var "term",
+    (string ", type="),
+    ShowCore.type_ @@ var "typ",
+    (string ", subst="),
+    ShowTyping.typeSubst @@ var "subst",
+    (string "}")]
+
+yield :: TBinding (Context -> Term -> Type -> TypeSubst -> InferenceResult)
+yield = define "yield" $
+  doc "Create an inference result with no class constraints" $
+  "fcx" ~> "term" ~> "typ" ~> "subst" ~>
+  Typing.inferenceResult
+    (Substitution.substTypesInTerm @@ var "subst" @@ var "term")
+    (Substitution.substInType @@ var "subst" @@ var "typ")
+    (var "subst")
+    Maps.empty
+    (var "fcx")
+
+yieldWithConstraints :: TBinding (Context -> Term -> Type -> TypeSubst -> M.Map Name TypeVariableMetadata -> InferenceResult)
+yieldWithConstraints = define "yieldWithConstraints" $
+  doc "Create an inference result with class constraints" $
+  "fcx" ~> "term" ~> "typ" ~> "subst" ~> "constraints" ~>
+  Typing.inferenceResult
+    (Substitution.substTypesInTerm @@ var "subst" @@ var "term")
+    (Substitution.substInType @@ var "subst" @@ var "typ")
+    (var "subst")
+    (var "constraints")
+    (var "fcx")
+
+-- TODO: pass context and variables, and actually check types
+yieldChecked :: TBinding (Context -> Term -> Type -> TypeSubst -> InferenceResult)
+yieldChecked = define "yieldChecked" $
+  doc "Create a checked inference result" $
+  "fcx" ~> "term" ~> "typ" ~> "subst" ~>
+  "iterm" <~ Substitution.substTypesInTerm @@ var "subst" @@ var "term" $
+  "itype" <~ Substitution.substInType @@ var "subst" @@ var "typ" $
+  Typing.inferenceResult (var "iterm") (var "itype") (var "subst") Maps.empty (var "fcx")
+
+yieldCheckedWithConstraints :: TBinding (Context -> Term -> Type -> TypeSubst -> M.Map Name TypeVariableMetadata -> InferenceResult)
+yieldCheckedWithConstraints = define "yieldCheckedWithConstraints" $
+  doc "Create a checked inference result with class constraints" $
+  "fcx" ~> "term" ~> "typ" ~> "subst" ~> "constraints" ~>
+  "iterm" <~ Substitution.substTypesInTerm @@ var "subst" @@ var "term" $
+  "itype" <~ Substitution.substInType @@ var "subst" @@ var "typ" $
+  -- Apply the substitution to constraint keys as well, so they track the final variable names
+  "iconstraints" <~ Substitution.substInClassConstraints @@ var "subst" @@ var "constraints" $
+  Typing.inferenceResult (var "iterm") (var "itype") (var "subst") (var "iconstraints") (var "fcx")
+
+-- ============================================================================
+-- Inference functions: Either (InContext Error) InferenceResult
+-- All take "fcx" (Context for errors/tracing) and "cx" (Graph for type context)
+-- and return InferenceResult (which now contains the updated Context).
+-- ============================================================================
+
+inferTypeOfAnnotatedTerm :: TBinding (Context -> Graph -> AnnotatedTerm -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfAnnotatedTerm = define "inferTypeOfAnnotatedTerm" $
+  doc "Infer the type of an annotated term (Either version)" $
+  "fcx" ~> "cx" ~> "at" ~>
+  "term" <~ Core.annotatedTermBody (var "at") $
+  "ann" <~ Core.annotatedTermAnnotation (var "at") $
+  "result" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "term" @@ (string "annotated term") $
+  "fcx2" <~ Typing.inferenceResultContext (var "result") $
+  "iterm" <~ Typing.inferenceResultTerm (var "result") $
+  "itype" <~ Typing.inferenceResultType (var "result") $
+  "isubst" <~ Typing.inferenceResultSubst (var "result") $
+  "iconstraints" <~ Typing.inferenceResultClassConstraints (var "result") $
+  right $ Typing.inferenceResult
+    (Core.termAnnotated $ Core.annotatedTerm (var "iterm") (var "ann"))
+    (var "itype")
+    (var "isubst")
+    (var "iconstraints")
+    (var "fcx2")
+
+inferTypeOfApplication :: TBinding (Context -> Graph -> Application -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfApplication = define "inferTypeOfApplication" $
+  doc "Infer the type of a function application (Either version)" $
+  "fcx0" ~> "cx" ~> "app" ~>
+  "fcx" <~ Ctx.pushTrace (string "application") (var "fcx0") $
+  "e0" <~ Core.applicationFunction (var "app") $
+  "e1" <~ Core.applicationArgument (var "app") $
+  "lhsResult" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "e0" @@ (string "lhs") $
+  "fcx2" <~ Typing.inferenceResultContext (var "lhsResult") $
+  "a" <~ Typing.inferenceResultTerm (var "lhsResult") $
+  "t0" <~ Typing.inferenceResultType (var "lhsResult") $
+  "s0" <~ Typing.inferenceResultSubst (var "lhsResult") $
+  "c0" <~ Typing.inferenceResultClassConstraints (var "lhsResult") $
+  "rhsResult" <<~ inferTypeOfTerm @@ var "fcx2"
+    @@ (Substitution.substInContext @@ var "s0" @@ var "cx")
+    @@ var "e1"
+    @@ (string "rhs") $
+  "fcx3" <~ Typing.inferenceResultContext (var "rhsResult") $
+  "b" <~ Typing.inferenceResultTerm (var "rhsResult") $
+  "t1" <~ Typing.inferenceResultType (var "rhsResult") $
+  "s1" <~ Typing.inferenceResultSubst (var "rhsResult") $
+  "c1" <~ Typing.inferenceResultClassConstraints (var "rhsResult") $
+  "vResult" <~ Schemas.freshName @@ var "fcx3" $
+  "v" <~ Pairs.first (var "vResult") $
+  "fcx4" <~ Pairs.second (var "vResult") $
+  "s2" <<~ Eithers.bimap
+    ("_ic" ~> Ctx.inContext (Error.errorOther $ Error.otherError (Error.unificationErrorMessage (Ctx.inContextObject (var "_ic")))) (Ctx.inContextContext (var "_ic")))
+    ("_a" ~> var "_a")
+    (Unification.unifyTypes
+    @@ var "fcx4"
+    @@ (Graph.graphSchemaTypes $ var "cx")
+    @@ (Substitution.substInType @@ var "s1" @@ var "t0")
+    @@ (Core.typeFunction $ Core.functionType (var "t1") (Core.typeVariable $ var "v"))
+    @@ (string "application lhs")) $
+  "_" <<~ Checking.checkTypeSubst @@ var "fcx4" @@ var "cx" @@ var "s2" $
+  "rExpr" <~ Core.termApplication (Core.application
+    (Substitution.substTypesInTerm @@ (Substitution.composeTypeSubst @@ var "s1" @@ var "s2") @@ var "a")
+    (Substitution.substTypesInTerm @@ var "s2" @@ var "b")) $
+  "rType" <~ Substitution.substInType @@ var "s2" @@ Core.typeVariable (var "v") $
+  "rSubst" <~ Substitution.composeTypeSubstList @@ list [var "s0", var "s1", var "s2"] $
+  "c0Subst" <~ Substitution.substInClassConstraints @@ var "s2" @@ (Substitution.substInClassConstraints @@ var "s1" @@ var "c0") $
+  "c1Subst" <~ Substitution.substInClassConstraints @@ var "s2" @@ var "c1" $
+  "rConstraints" <~ mergeClassConstraints @@ var "c0Subst" @@ var "c1Subst" $
+  right $ Typing.inferenceResult (var "rExpr") (var "rType") (var "rSubst") (var "rConstraints") (var "fcx4")
+
+inferTypeOfCaseStatement :: TBinding (Context -> Graph -> CaseStatement -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfCaseStatement = define "inferTypeOfCaseStatement" $
+  doc "Infer the type of a case statement (Either version)" $
+  "fcx" ~> "cx" ~> "caseStmt" ~>
+  "tname" <~ Core.caseStatementTypeName (var "caseStmt") $
+  "dflt" <~ Core.caseStatementDefault (var "caseStmt") $
+  "cases" <~ Core.caseStatementCases (var "caseStmt") $
+  "fnames" <~ Lists.map (unaryFunction Core.fieldName) (var "cases") $
+  "stRp" <<~ Schemas.requireSchemaType @@ var "fcx" @@ (Graph.graphSchemaTypes $ var "cx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "stRp") $
+  "fcx2" <~ Pairs.second (var "stRp") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "stype" <~ Core.typeSchemeType (var "schemaType") $
+  "sfields" <<~ ExtractCore.unionType @@ var "fcx2" @@ var "tname" @@ var "stype" $
+  "dfltRp" <<~ Eithers.mapMaybe ("t" ~> inferTypeOfTerm @@ var "fcx2" @@ var "cx" @@ var "t" @@
+    (Strings.cat $ list [(string "case "), Core.unName $ var "tname", (string ".<default>")])) (var "dflt") $
+  -- dfltRp :: Maybe InferenceResult (context is inside the result)
+  "dfltResult" <~ var "dfltRp" $
+  "fcx3" <~ Maybes.fromMaybe (var "fcx2") (Maybes.map (unaryFunction Typing.inferenceResultContext) (var "dfltRp")) $
+  "caseRp" <<~ inferMany @@ var "fcx3" @@ var "cx" @@ Lists.map
+    ("f" ~> pair (Core.fieldTerm $ var "f")
+      (Strings.cat $ list [(string "case "), Core.unName $ var "tname", (string "."), Core.unName $ Core.fieldName $ var "f"]))
+    (var "cases") $
+  "caseResults" <~ Pairs.first (var "caseRp") $
+  "fcx4" <~ Pairs.second (var "caseRp") $
+  "iterms" <~ Pairs.first (var "caseResults") $
+  "itypes" <~ Pairs.first (Pairs.second $ var "caseResults") $
+  "isubst" <~ Pairs.first (Pairs.second $ Pairs.second $ var "caseResults") $
+  "caseElemConstraints" <~ Pairs.second (Pairs.second $ Pairs.second $ var "caseResults") $
+  "codvResult" <~ Schemas.freshName @@ var "fcx4" $
+  "codv" <~ Pairs.first (var "codvResult") $
+  "fcx5" <~ Pairs.second (var "codvResult") $
+  "cod" <~ Core.typeVariable (var "codv") $
+  "caseMap" <~ Maps.fromList (Lists.map
+    ("ft" ~> pair (Core.fieldTypeName $ var "ft") (Core.fieldTypeType $ var "ft"))
+    (var "sfields")) $
+  "dfltConstraints" <~ Maybes.toList (Maybes.map
+    ("r" ~> Typing.typeConstraint (var "cod")
+      (Substitution.substInType @@ var "isubst" @@ (Typing.inferenceResultType $ var "r"))
+      (string "match default"))
+    (var "dfltResult")) $
+  "caseConstraints" <~ Maybes.cat (Lists.zipWith
+    ("fname" ~> "itype" ~> Maybes.map
+      ("ftype" ~> Typing.typeConstraint
+        (var "itype")
+        (Core.typeFunction $ Core.functionType (var "ftype") (var "cod"))
+        (string "case type"))
+      (Maps.lookup (var "fname") (var "caseMap")))
+    (var "fnames") (var "itypes")) $
+  "dfltClassConstraints" <~ Maybes.fromMaybe Maps.empty (Maybes.map (unaryFunction Typing.inferenceResultClassConstraints) (var "dfltResult")) $
+  "allElemConstraints" <~ mergeClassConstraints @@ var "caseElemConstraints" @@ var "dfltClassConstraints" $
+  "mcResult" <<~ mapConstraints @@ var "fcx5" @@ var "cx"
+    @@ ("subst" ~> yieldWithConstraints
+      @@ var "fcx5"
+      @@ (buildTypeApplicationTerm @@ var "svars"
+          @@ (Core.termFunction $ Core.functionElimination $ Core.eliminationUnion $
+            Core.caseStatement (var "tname") (Maybes.map (unaryFunction Typing.inferenceResultTerm) $ var "dfltResult") $
+            Lists.zipWith ("n" ~> "t" ~> Core.field (var "n") (var "t")) (var "fnames") (var "iterms")))
+      @@ (Core.typeFunction $ Core.functionType
+          (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
+          (var "cod"))
+      @@ (Substitution.composeTypeSubstList
+        @@ (Lists.concat $ list [
+          Maybes.toList (Maybes.map (unaryFunction Typing.inferenceResultSubst) (var "dfltResult")),
+          list [var "isubst", var "subst"]]))
+      @@ (Substitution.substInClassConstraints @@ var "subst" @@ var "allElemConstraints"))
+    @@ (Lists.concat $ list [var "dfltConstraints", var "caseConstraints"]) $
+  right (var "mcResult")
+
+inferTypeOfCollection :: TBinding (Context -> Graph -> (Type -> Type) -> ([Term] -> Term) -> String -> S.Set Name -> [Term] -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfCollection = define "inferTypeOfCollection" $
+  doc "Infer the type of a collection. The classNames parameter specifies type classes (e.g. ordering) that the element type variable must satisfy." $
+  "fcx" ~> "cx" ~> "typCons" ~> "trmCons" ~> "desc" ~> "classNames" ~> "els" ~>
+  "varResult" <~ Schemas.freshName @@ var "fcx" $
+  "var" <~ Pairs.first (var "varResult") $
+  "fcx2" <~ Pairs.second (var "varResult") $
+  "classConstraints" <~ Logic.ifElse (Sets.null $ var "classNames")
+    Maps.empty
+    (Maps.singleton (var "var") (Core.typeVariableMetadata $ var "classNames")) $
+  Logic.ifElse (Lists.null $ var "els")
+    (right (yieldWithConstraints
+      @@ var "fcx2"
+      @@ (buildTypeApplicationTerm
+        @@ list [var "var"]
+        @@ (var "trmCons" @@ list ([] :: [TTerm Term])))
+      @@ (var "typCons" @@ (Core.typeVariable $ var "var"))
+      @@ (Substitution.idTypeSubst)
+      @@ var "classConstraints"))
+    ("resultsRp" <<~ inferMany @@ var "fcx2" @@ var "cx" @@
+      (Lists.zip (var "els") $ Lists.map ("i" ~> Strings.cat $ list [(string "#"), Literals.showInt32 $ var "i"]) $
+        Math.range (int32 1) (Math.add (Lists.length $ var "els") (int32 1))) $
+    "results" <~ Pairs.first (var "resultsRp") $
+    "fcx3" <~ Pairs.second (var "resultsRp") $
+    "terms" <~ Pairs.first (var "results") $
+    "types" <~ Pairs.first (Pairs.second $ var "results") $
+    "subst1" <~ Pairs.first (Pairs.second $ Pairs.second $ var "results") $
+    "elemConstraints" <~ Pairs.second (Pairs.second $ Pairs.second $ var "results") $
+    "constraints" <~ Lists.map ("t" ~> Typing.typeConstraint (Core.typeVariable $ var "var") (var "t") (var "desc")) (var "types") $
+    "allConstraints" <~ mergeClassConstraints @@ var "classConstraints" @@ var "elemConstraints" $
+    "mcResult" <<~ mapConstraints @@ var "fcx3" @@ var "cx" @@
+      ("subst2" ~>
+        "iterm" <~ var "trmCons" @@ var "terms" $
+        "itype" <~ var "typCons" @@ (Core.typeVariable $ var "var") $
+        "isubst" <~ Substitution.composeTypeSubst @@ var "subst1" @@ var "subst2" $
+        yieldWithConstraints @@ var "fcx3" @@ var "iterm" @@ var "itype" @@ var "isubst" @@ (Substitution.substInClassConstraints @@ var "subst2" @@ var "allConstraints")) @@
+      var "constraints" $
+    right (var "mcResult"))
+
+inferTypeOfEither :: TBinding (Context -> Graph -> Prelude.Either Term Term -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfEither = define "inferTypeOfEither" $
+  doc "Infer the type of an either value (Either version)" $
+  "fcx" ~> "cx" ~> "e" ~>
+  Eithers.either_
+    ("l" ~>
+      "r1" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "l" @@ (string "either left value") $
+      "fcx2" <~ Typing.inferenceResultContext (var "r1") $
+      "iterm" <~ Typing.inferenceResultTerm (var "r1") $
+      "leftType" <~ Typing.inferenceResultType (var "r1") $
+      "subst" <~ Typing.inferenceResultSubst (var "r1") $
+      "fvResult" <~ freshVariableType @@ var "fcx2" $
+      "rightType" <~ Pairs.first (var "fvResult") $
+      "fcx3" <~ Pairs.second (var "fvResult") $
+      "eitherTerm" <~ (Core.termEither $ left $ var "iterm") $
+      "termWithLeftType" <~ (Core.termTypeApplication $ Core.typeApplicationTerm (var "eitherTerm") (var "leftType")) $
+      "termWithBothTypes" <~ (Core.termTypeApplication $ Core.typeApplicationTerm (var "termWithLeftType") (var "rightType")) $
+      "eitherType" <~ (Core.typeEither $ Core.eitherType (var "leftType") (var "rightType")) $
+      right (yieldChecked @@ var "fcx3" @@ var "termWithBothTypes" @@ var "eitherType" @@ var "subst"))
+    ("r" ~>
+      "r1" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "r" @@ (string "either right value") $
+      "fcx2" <~ Typing.inferenceResultContext (var "r1") $
+      "iterm" <~ Typing.inferenceResultTerm (var "r1") $
+      "rightType" <~ Typing.inferenceResultType (var "r1") $
+      "subst" <~ Typing.inferenceResultSubst (var "r1") $
+      "fvResult" <~ freshVariableType @@ var "fcx2" $
+      "leftType" <~ Pairs.first (var "fvResult") $
+      "fcx3" <~ Pairs.second (var "fvResult") $
+      "eitherTerm" <~ (Core.termEither $ right $ var "iterm") $
+      "termWithLeftType" <~ (Core.termTypeApplication $ Core.typeApplicationTerm (var "eitherTerm") (var "leftType")) $
+      "termWithBothTypes" <~ (Core.termTypeApplication $ Core.typeApplicationTerm (var "termWithLeftType") (var "rightType")) $
+      "eitherType" <~ (Core.typeEither $ Core.eitherType (var "leftType") (var "rightType")) $
+      right (yieldChecked @@ var "fcx3" @@ var "termWithBothTypes" @@ var "eitherType" @@ var "subst"))
+    (var "e")
+
+inferTypeOfElimination :: TBinding (Context -> Graph -> Elimination -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfElimination = define "inferTypeOfElimination" $
+  doc "Infer the type of an elimination (Either version)" $
+  "fcx" ~> "cx" ~> "elm" ~>
+  cases _Elimination (var "elm") Nothing [
+    _Elimination_record>>: "p" ~> inferTypeOfProjection @@ var "fcx" @@ var "cx" @@ var "p",
+    _Elimination_union>>: "c" ~> inferTypeOfCaseStatement @@ var "fcx" @@ var "cx" @@ var "c",
+    _Elimination_wrap>>: "tname" ~> inferTypeOfUnwrap @@ var "fcx" @@ var "cx" @@ var "tname"]
+
+inferTypeOfFunction :: TBinding (Context -> Graph -> Function -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfFunction = define "inferTypeOfFunction" $
+  doc "Infer the type of a function (Either version)" $
+  "fcx" ~> "cx" ~> "f" ~>
+  cases _Function (var "f") Nothing [
+    _Function_elimination>>: "elm" ~> inferTypeOfElimination @@ var "fcx" @@ var "cx" @@ var "elm",
+    _Function_lambda>>: "l" ~> inferTypeOfLambda @@ var "fcx" @@ var "cx" @@ var "l",
+    _Function_primitive>>: "name" ~> inferTypeOfPrimitive @@ var "fcx" @@ var "cx" @@ var "name"]
+
+inferTypeOfInjection :: TBinding (Context -> Graph -> Injection -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfInjection = define "inferTypeOfInjection" $
+  doc "Infer the type of a union injection (Either version)" $
+  "fcx" ~> "cx" ~> "injection" ~>
+  "tname" <~ Core.injectionTypeName (var "injection") $
+  "field" <~ Core.injectionField (var "injection") $
+  "fname" <~ Core.fieldName (var "field") $
+  "term" <~ Core.fieldTerm (var "field") $
+  "result" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "term" @@ (string "injected term") $
+  "fcx2" <~ Typing.inferenceResultContext (var "result") $
+  "stRp" <<~ Schemas.requireSchemaType @@ var "fcx2" @@ (Graph.graphSchemaTypes $ var "cx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "stRp") $
+  "fcx3" <~ Pairs.second (var "stRp") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "stype" <~ Core.typeSchemeType (var "schemaType") $
+  "iterm" <~ Typing.inferenceResultTerm (var "result") $
+  "ityp" <~ Typing.inferenceResultType (var "result") $
+  "isubst" <~ Typing.inferenceResultSubst (var "result") $
+  "sfields" <<~ ExtractCore.unionType @@ var "fcx3" @@ var "tname" @@ var "stype" $
+  "ftyp" <<~ Schemas.findFieldType @@ var "fcx3" @@ var "fname" @@ var "sfields" $
+  "mcResult" <<~ mapConstraints @@ var "fcx3" @@ var "cx" @@
+    ("subst" ~> yield
+      @@ var "fcx3"
+      @@ (buildTypeApplicationTerm @@ var "svars"
+        @@ (Core.termUnion $ Core.injection (var "tname") $ Core.field (var "fname") (var "iterm")))
+      @@ (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
+      @@ (Substitution.composeTypeSubst @@ var "isubst" @@ var "subst")) @@
+    list [Typing.typeConstraint (var "ftyp") (var "ityp") (string "schema type of injected field")] $
+  right (var "mcResult")
+
+inferTypeOfLambda :: TBinding (Context -> Graph -> Lambda -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfLambda = define "inferTypeOfLambda" $
+  doc "Infer the type of a lambda function (Either version)" $
+  "fcx" ~> "cx" ~> "lambda" ~>
+  "var" <~ Core.lambdaParameter (var "lambda") $
+  "body" <~ Core.lambdaBody (var "lambda") $
+  "vdomResult" <~ Schemas.freshName @@ var "fcx" $
+  "vdom" <~ Pairs.first (var "vdomResult") $
+  "fcx2" <~ Pairs.second (var "vdomResult") $
+  "dom" <~ Core.typeVariable (var "vdom") $
+  "cx2" <~ (extendContext @@ list [pair (var "var") (Core.typeScheme (list ([] :: [TTerm Name])) (var "dom") Phantoms.nothing)] @@ var "cx") $
+  "result" <<~ inferTypeOfTerm @@ var "fcx2" @@ var "cx2" @@ var "body" @@ (string "lambda body") $
+  "fcx3" <~ Typing.inferenceResultContext (var "result") $
+  "iterm" <~ Typing.inferenceResultTerm (var "result") $
+  "icod" <~ Typing.inferenceResultType (var "result") $
+  "isubst" <~ Typing.inferenceResultSubst (var "result") $
+  "rdom" <~ Substitution.substInType @@ var "isubst" @@ var "dom" $
+  "rterm" <~ Core.termFunction (Core.functionLambda $ Core.lambda (var "var") (just $ var "rdom") (var "iterm")) $
+  "rtype" <~ Core.typeFunction (Core.functionType (var "rdom") (var "icod")) $
+  "vars" <~ (Sets.unions $ list [
+    Rewriting.freeVariablesInType @@ var "rdom",
+    Rewriting.freeVariablesInType @@ var "icod",
+    freeVariablesInContext @@ (Substitution.substInContext @@ var "isubst" @@ var "cx2")]) $
+  "cx3" <~ Substitution.substInContext @@ var "isubst" @@ var "cx" $
+  "iconstraints" <~ Substitution.substInClassConstraints @@ var "isubst" @@ (Typing.inferenceResultClassConstraints $ var "result") $
+  right (Typing.inferenceResult (var "rterm") (var "rtype") (var "isubst") (var "iconstraints") (var "fcx3"))
+
+inferTypeOfList :: TBinding (Context -> Graph -> [Term] -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfList = define "inferTypeOfList" $
+  doc "Infer the type of a list (Either version)" $
+  "fcx" ~> "cx" ~> inferTypeOfCollection
+    @@ var "fcx"
+    @@ var "cx"
+    @@ (unaryFunction Core.typeList)
+    @@ (unaryFunction Core.termList)
+    @@ (string "list element")
+    @@ (Sets.empty :: TTerm (S.Set Name))
+
+inferTypeOfMap :: TBinding (Context -> Graph -> M.Map Term Term -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfMap = define "inferTypeOfMap" $
+  doc "Infer the type of a map (Either version)" $
+  "fcx" ~> "cx" ~> "m" ~>
+  "kvarResult" <~ Schemas.freshName @@ var "fcx" $
+  "kvar" <~ Pairs.first (var "kvarResult") $
+  "fcx2" <~ Pairs.second (var "kvarResult") $
+  "vvarResult" <~ Schemas.freshName @@ var "fcx2" $
+  "vvar" <~ Pairs.first (var "vvarResult") $
+  "fcx3" <~ Pairs.second (var "vvarResult") $
+  "keyConstraints" <~ Maps.singleton (var "kvar") (Core.typeVariableMetadata $ Sets.singleton $ Core.nameLift _TypeClass_ordering) $
+  Logic.ifElse (Maps.null $ var "m")
+    (right (yieldWithConstraints
+      @@ var "fcx3"
+      @@ (buildTypeApplicationTerm
+        @@ list [var "kvar", var "vvar"]
+        @@ (Core.termMap Maps.empty))
+      @@ (Core.typeMap $ Core.mapType (Core.typeVariable $ var "kvar") (Core.typeVariable $ var "vvar"))
+      @@ Substitution.idTypeSubst
+      @@ var "keyConstraints"))
+    ("kRp" <<~ inferMany @@ var "fcx3" @@ var "cx" @@
+      (Lists.map ("k" ~> pair (var "k") (string "map key")) $ Maps.keys $ var "m") $
+    "kResults" <~ Pairs.first (var "kRp") $
+    "fcx4" <~ Pairs.second (var "kRp") $
+    "kterms" <~ Pairs.first (var "kResults") $
+    "ktypes" <~ Pairs.first (Pairs.second $ var "kResults") $
+    "ksubst" <~ Pairs.first (Pairs.second $ Pairs.second $ var "kResults") $
+    "kElemConstraints" <~ Pairs.second (Pairs.second $ Pairs.second $ var "kResults") $
+    "vRp" <<~ inferMany @@ var "fcx4" @@ (Substitution.substInContext @@ var "ksubst" @@ var "cx") @@
+      (Lists.map ("v" ~> pair (var "v") (string "map value")) $ Maps.elems $ var "m") $
+    "vResults" <~ Pairs.first (var "vRp") $
+    "fcx5" <~ Pairs.second (var "vRp") $
+    "vterms" <~ Pairs.first (var "vResults") $
+    "vtypes" <~ Pairs.first (Pairs.second $ var "vResults") $
+    "vsubst" <~ Pairs.first (Pairs.second $ Pairs.second $ var "vResults") $
+    "vElemConstraints" <~ Pairs.second (Pairs.second $ Pairs.second $ var "vResults") $
+    "kcons" <~ Lists.map ("t" ~> Typing.typeConstraint (Core.typeVariable $ var "kvar") (var "t") (string "map key")) (var "ktypes") $
+    "vcons" <~ Lists.map ("t" ~> Typing.typeConstraint (Core.typeVariable $ var "vvar") (var "t") (string "map value")) (var "vtypes") $
+    "allMapConstraints" <~ mergeClassConstraints @@ var "keyConstraints" @@ (mergeClassConstraints @@ var "kElemConstraints" @@ var "vElemConstraints") $
+    "mcResult" <<~ mapConstraints @@ var "fcx5" @@ var "cx" @@
+      ("subst" ~> yieldWithConstraints
+        @@ var "fcx5"
+        @@ (Core.termMap $ Maps.fromList $ Lists.zip (var "kterms") (var "vterms"))
+        @@ (Core.typeMap $ Core.mapType (Core.typeVariable $ var "kvar") (Core.typeVariable $ var "vvar"))
+        @@ (Substitution.composeTypeSubstList @@ list [var "ksubst", var "vsubst", var "subst"])
+        @@ (Substitution.substInClassConstraints @@ var "subst" @@ var "allMapConstraints")) @@
+      (Lists.concat $ list [var "kcons", var "vcons"]) $
+    right (var "mcResult"))
+
+inferTypeOfOptional :: TBinding (Context -> Graph -> Maybe Term -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfOptional = define "inferTypeOfOptional" $
+  doc "Infer the type of an optional (Either version)" $
+  "fcx" ~> "cx" ~> "m" ~>
+  "trmCons" <~ ("terms" ~> Logic.ifElse (Lists.null $ var "terms")
+    (Core.termMaybe nothing)
+    (Core.termMaybe $ just $ Lists.head $ var "terms")) $
+  inferTypeOfCollection
+    @@ var "fcx"
+    @@ var "cx"
+    @@ (unaryFunction Core.typeMaybe)
+    @@ var "trmCons"
+    @@ (string "optional element")
+    @@ (Sets.empty :: TTerm (S.Set Name))
+    @@ (Maybes.maybe (list ([] :: [TTerm Term])) (unaryFunction Lists.singleton) $ var "m")
+
+inferTypeOfPair :: TBinding (Context -> Graph -> (Term, Term) -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfPair = define "inferTypeOfPair" $
+  doc "Infer the type of a pair (Either version)" $
+  "fcx" ~> "cx" ~> "p" ~>
+  "rp" <<~ inferMany @@ var "fcx" @@ var "cx" @@ list [
+    pair (Pairs.first $ var "p") (string "pair first element"),
+    pair (Pairs.second $ var "p") (string "pair second element")] $
+  "results" <~ Pairs.first (var "rp") $
+  "fcx2" <~ Pairs.second (var "rp") $
+  "iterms" <~ Pairs.first (var "results") $
+  "itypes" <~ Pairs.first (Pairs.second $ var "results") $
+  "isubst" <~ Pairs.first (Pairs.second $ Pairs.second $ var "results") $
+  "pairElemConstraints" <~ Pairs.second (Pairs.second $ Pairs.second $ var "results") $
+  "ifst" <~ Lists.head (var "iterms") $
+  "isnd" <~ Lists.head (Lists.tail $ var "iterms") $
+  "tyFst" <~ Lists.head (var "itypes") $
+  "tySnd" <~ Lists.head (Lists.tail $ var "itypes") $
+  "pairTerm" <~ (Core.termPair $ pair (var "ifst") (var "isnd")) $
+  "termWithTypes" <~ (Core.termTypeApplication $ Core.typeApplicationTerm
+    (Core.termTypeApplication $ Core.typeApplicationTerm (var "pairTerm") (var "tyFst"))
+    (var "tySnd")) $
+  right (yieldWithConstraints
+    @@ var "fcx2"
+    @@ var "termWithTypes"
+    @@ (Core.typePair $ Core.pairType (var "tyFst") (var "tySnd"))
+    @@ var "isubst"
+    @@ var "pairElemConstraints")
+
+inferTypeOfPrimitive :: TBinding (Context -> Graph -> Name -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfPrimitive = define "inferTypeOfPrimitive" $
+  doc "Infer the type of a primitive function (Either version)" $
+  "fcx" ~> "cx" ~> "name" ~>
+  Maybes.maybe
+    (Ctx.failInContext
+      (Error.errorOther $ Error.otherError $ Strings.cat2 (string "No such primitive: ") (Core.unName $ var "name"))
+      (var "fcx"))
+    ("scheme" ~>
+      "tsResult" <~ Schemas.instantiateTypeScheme @@ var "fcx" @@ var "scheme" $
+      "ts" <~ Pairs.first (var "tsResult") $
+      "fcx2" <~ Pairs.second (var "tsResult") $
+      "constraints" <~ Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints $ var "ts") $
+      right (yieldCheckedWithConstraints
+        @@ var "fcx2"
+        @@ (buildTypeApplicationTerm
+          @@ Core.typeSchemeVariables (var "ts")
+          @@ (Core.termFunction $ Core.functionPrimitive $ var "name"))
+        @@ Core.typeSchemeType (var "ts")
+        @@ Substitution.idTypeSubst
+        @@ var "constraints"))
+    (Maybes.map (unaryFunction Graph.primitiveType) $ Maps.lookup (var "name") (Graph.graphPrimitives $ var "cx"))
+
+inferTypeOfProjection :: TBinding (Context -> Graph -> Projection -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfProjection = define "inferTypeOfProjection" $
+  doc "Infer the type of a record projection (Either version)" $
+  "fcx" ~> "cx" ~> "proj" ~>
+  "tname" <~ Core.projectionTypeName (var "proj") $
+  "fname" <~ Core.projectionField (var "proj") $
+  "stRp" <<~ Schemas.requireSchemaType @@ var "fcx" @@ (Graph.graphSchemaTypes $ var "cx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "stRp") $
+  "fcx2" <~ Pairs.second (var "stRp") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "stype" <~ Core.typeSchemeType (var "schemaType") $
+  "sfields" <<~ ExtractCore.recordType @@ var "fcx2" @@ var "tname" @@ var "stype" $
+  "ftyp" <<~ Schemas.findFieldType @@ var "fcx2" @@ var "fname" @@ var "sfields" $
+  right (yield
+    @@ var "fcx2"
+    @@ (buildTypeApplicationTerm @@ var "svars"
+      @@ (Core.termFunction $ Core.functionElimination $ Core.eliminationRecord $ Core.projection (var "tname") (var "fname")))
+    @@ (Core.typeFunction $ Core.functionType
+      (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
+      (var "ftyp"))
+    @@ Substitution.idTypeSubst)
+
+inferTypeOfRecord :: TBinding (Context -> Graph -> Record -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfRecord = define "inferTypeOfRecord" $
+  doc "Infer the type of a record (Either version)" $
+  "fcx" ~> "cx" ~> "record" ~>
+  "tname" <~ Core.recordTypeName (var "record") $
+  "fields" <~ Core.recordFields (var "record") $
+  "fnames" <~ Lists.map (unaryFunction Core.fieldName) (var "fields") $
+  "stRp" <<~ Schemas.requireSchemaType @@ var "fcx" @@ (Graph.graphSchemaTypes $ var "cx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "stRp") $
+  "fcx2" <~ Pairs.second (var "stRp") $
+  "rp" <<~ inferMany @@ var "fcx2" @@ var "cx" @@ Lists.map
+    ("f" ~> pair
+      (Core.fieldTerm $ var "f")
+      (Strings.cat2 (string "field ") (Core.unName $ Core.fieldName $ var "f")))
+    (var "fields") $
+  "results" <~ Pairs.first (var "rp") $
+  "fcx3" <~ Pairs.second (var "rp") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "stype" <~ Core.typeSchemeType (var "schemaType") $
+  "iterms" <~ Pairs.first (var "results") $
+  "itypes" <~ Pairs.first (Pairs.second $ var "results") $
+  "isubst" <~ Pairs.first (Pairs.second $ Pairs.second $ var "results") $
+  "recElemConstraints" <~ Pairs.second (Pairs.second $ Pairs.second $ var "results") $
+  "ityp" <~ Core.typeRecord (
+      Lists.zipWith ("n" ~> "t" ~> Core.fieldType (var "n") (var "t")) (var "fnames") (var "itypes")) $
+  "mcResult" <<~ mapConstraints @@ var "fcx3" @@ var "cx" @@
+    ("subst" ~> yieldWithConstraints
+      @@ var "fcx3"
+      @@ (buildTypeApplicationTerm @@ var "svars" @@
+        (Core.termRecord $ Core.record (var "tname") $ Lists.zipWith
+          ("n" ~> "t" ~> Core.field (var "n") (var "t"))
+          (var "fnames")
+          (var "iterms")))
+      @@ (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
+      @@ (Substitution.composeTypeSubst @@ var "isubst" @@ var "subst")
+      @@ (Substitution.substInClassConstraints @@ var "subst" @@ var "recElemConstraints")) @@
+    list [Typing.typeConstraint (var "stype") (var "ityp") (string "schema type of record")] $
+  right (var "mcResult")
+
+inferTypeOfSet :: TBinding (Context -> Graph -> S.Set Term -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfSet = define "inferTypeOfSet" $
+  doc "Infer the type of a set (Either version)" $
+  "fcx" ~> "cx" ~>
+  "s" ~>
+  inferTypeOfCollection
+    @@ var "fcx"
+    @@ var "cx"
+    @@ (unaryFunction Core.typeSet)
+    @@ ("terms" ~> Core.termSet $ Sets.fromList $ var "terms")
+    @@ (string "set element")
+    @@ (Sets.singleton $ Core.nameLift _TypeClass_ordering)
+    @@ (Sets.toList $ var "s")
+
+inferTypeOfTerm :: TBinding (Context -> Graph -> Term -> String -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfTerm = define "inferTypeOfTerm" $
+  doc "Infer the type of a given term (Either version)" $
+  "fcx" ~> "cx" ~> "term" ~> "desc" ~>
+  "fcx2" <~ Ctx.pushTrace (var "desc") (var "fcx") $
+  cases _Term (var "term") Nothing [
+    _Term_annotated>>: "a" ~> inferTypeOfAnnotatedTerm @@ var "fcx2" @@ var "cx" @@ var "a",
+    _Term_application>>: "a" ~> inferTypeOfApplication @@ var "fcx2" @@ var "cx" @@ var "a",
+    _Term_either>>: "e" ~> inferTypeOfEither @@ var "fcx2" @@ var "cx" @@ var "e",
+    _Term_function>>: "f" ~> inferTypeOfFunction @@ var "fcx2" @@ var "cx" @@ var "f",
+    _Term_let>>: "l" ~> inferTypeOfLet @@ var "fcx2" @@ var "cx" @@ var "l",
+    _Term_list>>: "els" ~> inferTypeOfList @@ var "fcx2" @@ var "cx" @@ var "els",
+    _Term_literal>>: "l" ~> right (inferTypeOfLiteral @@ var "fcx2" @@ var "l"),
+    _Term_map>>: "m" ~> inferTypeOfMap @@ var "fcx2" @@ var "cx" @@ var "m",
+    _Term_maybe>>: "m" ~> inferTypeOfOptional @@ var "fcx2" @@ var "cx" @@ var "m",
+    _Term_pair>>: "p" ~> inferTypeOfPair @@ var "fcx2" @@ var "cx" @@ var "p",
+    _Term_record>>: "r" ~> inferTypeOfRecord @@ var "fcx2" @@ var "cx" @@ var "r",
+    _Term_set>>: "s" ~> inferTypeOfSet @@ var "fcx2" @@ var "cx" @@ var "s",
+    _Term_typeApplication>>: "tt" ~> inferTypeOfTypeApplication @@ var "fcx2" @@ var "cx" @@ var "tt",
+    _Term_typeLambda>>: "ta" ~> inferTypeOfTypeLambda @@ var "fcx2" @@ var "cx" @@ var "ta",
+    _Term_union>>: "i" ~> inferTypeOfInjection @@ var "fcx2" @@ var "cx" @@ var "i",
+    _Term_unit>>: constant $ right (inferTypeOfUnit @@ var "fcx2"),
+    _Term_variable>>: "name" ~> inferTypeOfVariable @@ var "fcx2" @@ var "cx" @@ var "name",
+    _Term_wrap>>: "w" ~> inferTypeOfWrappedTerm @@ var "fcx2" @@ var "cx" @@ var "w"]
+
+inferTypeOfTypeLambda :: TBinding (Context -> Graph -> TypeLambda -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfTypeLambda = define "inferTypeOfTypeLambda" $
+  doc "Infer the type of a type abstraction (Either version)" $
+  "fcx" ~> "cx" ~> "ta" ~>
+  inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ (Core.typeLambdaBody $ var "ta") @@ (string "type abstraction")
+
+inferTypeOfTypeApplication :: TBinding (Context -> Graph -> TypeApplicationTerm -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfTypeApplication = define "inferTypeOfTypeApplication" $
+  doc "Infer the type of a type application (Either version)" $
+  "fcx" ~> "cx" ~> "tt" ~>
+  inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ (Core.typeApplicationTermBody $ var "tt") @@ (string "type application term")
+
+inferTypeOfUnwrap :: TBinding (Context -> Graph -> Name -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfUnwrap = define "inferTypeOfUnwrap" $
+  doc "Infer the type of an unwrap operation (Either version)" $
+  "fcx" ~> "cx" ~> "tname" ~>
+  "stRp" <<~ Schemas.requireSchemaType @@ var "fcx" @@ (Graph.graphSchemaTypes $ var "cx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "stRp") $
+  "fcx2" <~ Pairs.second (var "stRp") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "stype" <~ Core.typeSchemeType (var "schemaType") $
+  "wtyp" <<~ ExtractCore.wrappedType @@ var "fcx2" @@ var "tname" @@ var "stype" $
+  right (yield
+    @@ var "fcx2"
+    @@ (buildTypeApplicationTerm @@ var "svars"
+      @@ (Core.termFunction $ Core.functionElimination $ Core.eliminationWrap $ var "tname"))
+    @@ (Core.typeFunction $ Core.functionType
+      (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
+      (var "wtyp"))
+    @@ Substitution.idTypeSubst)
+
+inferTypeOfVariable :: TBinding (Context -> Graph -> Name -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfVariable = define "inferTypeOfVariable" $
+  doc "Infer the type of a variable (Either version)" $
+  "fcx" ~> "cx" ~> "name" ~>
+  Maybes.maybe
+    (Ctx.failInContext
+      (Error.errorOther $ Error.otherError $ Strings.cat2 (string "Variable not bound to type: ") (Core.unName $ var "name"))
+      (var "fcx"))
+    ("scheme" ~>
+      "tsResult" <~ Schemas.instantiateTypeScheme @@ var "fcx" @@ var "scheme" $
+      "ts" <~ Pairs.first (var "tsResult") $
+      "fcx2" <~ Pairs.second (var "tsResult") $
+      "constraints" <~ Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints $ var "ts") $
+      right (Typing.inferenceResult
+        (buildTypeApplicationTerm
+          @@ Core.typeSchemeVariables (var "ts")
+          @@ Core.termVariable (var "name"))
+        (Core.typeSchemeType $ var "ts")
+        (asTerm Substitution.idTypeSubst)
+        (var "constraints")
+        (var "fcx2")))
+    (Maps.lookup (var "name") (Graph.graphBoundTypes $ var "cx"))
+
+inferTypeOfWrappedTerm :: TBinding (Context -> Graph -> WrappedTerm -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfWrappedTerm = define "inferTypeOfWrappedTerm" $
+  doc "Infer the type of a wrapped term (Either version)" $
+  "fcx" ~> "cx" ~> "wt" ~>
+  "tname" <~ Core.wrappedTermTypeName (var "wt") $
+  "term" <~ Core.wrappedTermBody (var "wt") $
+  "stRp" <<~ Schemas.requireSchemaType @@ var "fcx" @@ (Graph.graphSchemaTypes $ var "cx") @@ var "tname" $
+  "schemaType" <~ Pairs.first (var "stRp") $
+  "fcx2" <~ Pairs.second (var "stRp") $
+  "result" <<~ inferTypeOfTerm @@ var "fcx2" @@ var "cx" @@ var "term" @@ (string "wrapped term") $
+  "fcx3" <~ Typing.inferenceResultContext (var "result") $
+  "svars" <~ Core.typeSchemeVariables (var "schemaType") $
+  "stype" <~ Core.typeSchemeType (var "schemaType") $
+  "iterm" <~ Typing.inferenceResultTerm (var "result") $
+  "itype" <~ Typing.inferenceResultType (var "result") $
+  "isubst" <~ Typing.inferenceResultSubst (var "result") $
+  "ityp" <~ Core.typeWrap (var "itype") $
+  "mcResult" <<~ mapConstraints @@ var "fcx3" @@ var "cx"
+    @@ ("subst" ~> yield
+      @@ var "fcx3"
+      @@ (buildTypeApplicationTerm @@ var "svars" @@ (Core.termWrap $ Core.wrappedTerm (var "tname") (var "iterm")))
+      @@ (Schemas.nominalApplication @@ var "tname" @@ Lists.map (unaryFunction Core.typeVariable) (var "svars"))
+      @@ (Substitution.composeTypeSubst @@ var "isubst" @@ var "subst"))
+    @@ list [Typing.typeConstraint (var "stype") (var "ityp") (string "schema type of wrapper")] $
+  right (var "mcResult")
+
+inferTypeOfLet :: TBinding (Context -> Graph -> Let -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfLet = define "inferTypeOfLet" $
+  doc "Normalize a let term before inferring its type (Either version)" $
+  "fcx0" ~> "cx" ~> "let0" ~>
+  "fcx" <~ Ctx.pushTrace (string "let") (var "fcx0") $
+  "bindings0" <~ Core.letBindings (var "let0") $
+  "body0" <~ Core.letBody (var "let0") $
+  "names" <~ Lists.map (unaryFunction Core.bindingName) (var "bindings0") $
+  "nameSet" <~ Sets.fromList (var "names") $
+  "toPair" <~ ("binding" ~>
+    "name" <~ Core.bindingName (var "binding") $
+    "term" <~ Core.bindingTerm (var "binding") $
+    pair (var "name") $ Lists.filter ("n" ~> Sets.member (var "n") (var "nameSet")) $
+      Sets.toList $ Rewriting.freeVariablesInTerm @@ var "term") $
+  "adjList" <~ Lists.map (var "toPair") (var "bindings0") $
+  "groups" <~ Sorting.topologicalSortComponents @@ var "adjList" $
+  "bindingMap" <~ Maps.fromList (Lists.zip (var "names") (var "bindings0")) $
+  "createLet" <~ ("e" ~> "group" ~> Core.termLet $ Core.let_
+    (Maybes.cat $ Lists.map ("n" ~> Maps.lookup (var "n") (var "bindingMap")) (var "group"))
+    (var "e")) $
+  "rewrittenLet" <~ Lists.foldl (var "createLet") (var "body0") (Lists.reverse $ var "groups") $
+  "restoreLet" <~ ("iterm" ~>
+    "helper" <~ ("level" ~> "bins" ~> "term" ~>
+      "nonzero" <~ ("term" ~> cases _Term (var "term") Nothing [
+        _Term_let>>: "l" ~>
+          "bs" <~ Core.letBindings (var "l") $
+          "letBody" <~ Core.letBody (var "l") $
+          var "helper" @@
+            (Math.sub (var "level") (int32 1)) @@
+            (Lists.concat $ list [var "bs", var "bins"]) @@
+            (var "letBody")]) $
+      Logic.ifElse (Equality.equal (var "level") (int32 0))
+        (pair (var "bins") (var "term"))
+        (var "nonzero" @@ var "term")) $
+    "result" <~ var "helper" @@ (Lists.length $ var "groups") @@ list ([] :: [TTerm Binding]) @@ var "iterm" $
+    "bindingList" <~ Pairs.first (var "result") $
+    "e" <~ Pairs.second (var "result") $
+    "bindingMap2" <~ Maps.fromList (Lists.map ("b" ~> pair (Core.bindingName $ var "b") (var "b")) (var "bindingList")) $
+    Core.termLet $ Core.let_
+      (Maybes.cat $ Lists.map ("n" ~> Maps.lookup (var "n") (var "bindingMap2")) (var "names"))
+      (var "e")) $
+  "rewriteResult" <~ ("iresult" ~>
+    "fcxR" <~ Typing.inferenceResultContext (var "iresult") $
+    "iterm" <~ Typing.inferenceResultTerm (var "iresult") $
+    "itype" <~ Typing.inferenceResultType (var "iresult") $
+    "isubst" <~ Typing.inferenceResultSubst (var "iresult") $
+    "iconstraints" <~ Typing.inferenceResultClassConstraints (var "iresult") $
+    Typing.inferenceResult (var "restoreLet" @@ var "iterm") (var "itype") (var "isubst") (var "iconstraints") (var "fcxR")) $
+  "res" <~ (cases _Term (var "rewrittenLet")
+     (Just $ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "rewrittenLet" @@ (string "empty let term")) [
+     _Term_let>>: "l" ~> inferTypeOfLetNormalized @@ var "fcx" @@ var "cx" @@ var "l"]) $
+  Eithers.map (var "rewriteResult") (var "res")
+
+inferTypeOfLetNormalized :: TBinding (Context -> Graph -> Let -> Prelude.Either (InContext Error) InferenceResult)
+inferTypeOfLetNormalized = define "inferTypeOfLetNormalized" $
+  doc "Infer the type of a let (letrec) term which is already in a normal form (Either version)" $
+  "fcx0" ~> "cx0" ~> "letTerm" ~>
+  "fcx" <~ Ctx.pushTrace (string "let-normalized") (var "fcx0") $
+  "bins0" <~ Core.letBindings (var "letTerm") $
+  "body0" <~ Core.letBody (var "letTerm") $
+  "bnames" <~ Lists.map (unaryFunction Core.bindingName) (var "bins0") $
+
+  -- Phase 1: Create fresh temporary type variables
+  "bvarsResult" <~ Schemas.freshNames @@ (Lists.length $ var "bins0") @@ var "fcx" $
+  "bvars" <~ Pairs.first (var "bvarsResult") $
+  "fcx2" <~ Pairs.second (var "bvarsResult") $
+  "tbins0" <~ Lists.map (unaryFunction Core.typeVariable) (var "bvars") $
+
+  "cx1" <~ (extendContext
+    @@ (Lists.zip (var "bnames") $ Lists.map ("t" ~> Core.typeScheme (list ([] :: [TTerm Name])) (var "t") Phantoms.nothing) (var "tbins0"))
+    @@ (var "cx0")) $
+
+  -- Phase 2: Infer actual types
+  "irRp" <<~ inferTypesOfTemporaryBindings @@ var "fcx2" @@ var "cx1" @@ var "bins0" $
+  "inferredResult" <~ Pairs.first (var "irRp") $
+  "fcx3" <~ Pairs.second (var "irRp") $
+  "bterms1" <~ Pairs.first (var "inferredResult") $
+  "tbins1" <~ Pairs.first (Pairs.second $ var "inferredResult") $
+  "substAndConstraints" <~ Pairs.second (Pairs.second $ var "inferredResult") $
+  "s1" <~ Pairs.first (var "substAndConstraints") $
+  "inferredConstraints" <~ Pairs.second (var "substAndConstraints") $
+
+  -- Phase 3: Unify temporary types with actual inferred types
+  "s2" <<~ Eithers.bimap
+    ("_ic" ~> Ctx.inContext (Error.errorOther $ Error.otherError (Error.unificationErrorMessage (Ctx.inContextObject (var "_ic")))) (Ctx.inContextContext (var "_ic")))
+    ("_a" ~> var "_a")
+    (Unification.unifyTypeLists
+    @@ var "fcx3"
+    @@ (Graph.graphSchemaTypes $ var "cx0")
+    @@ (Lists.map (Substitution.substInType @@ var "s1") (var "tbins0"))
+    @@ (var "tbins1")
+    @@ (string "temporary type bindings")) $
+  "_" <<~ Checking.checkTypeSubst @@ var "fcx3" @@ var "cx0" @@ var "s2" $
+
+  "g2base" <~ (Substitution.substInContext @@
+    (Substitution.composeTypeSubst @@ var "s1" @@ var "s2") @@
+    (var "cx0")) $
+  "constraintsWithS2" <~ Substitution.substInClassConstraints @@ var "s2" @@ var "inferredConstraints" $
+
+  "composedSubst" <~ Substitution.composeTypeSubst @@ var "s1" @@ var "s2" $
+  "originalBindingConstraints" <~ Lists.foldl
+    ("acc" ~> "b" ~>
+      Maybes.maybe
+        (var "acc")
+        ("ts" ~> Maybes.maybe
+          (var "acc")
+          ("c" ~> mergeClassConstraints @@ var "acc" @@ var "c")
+          (Core.typeSchemeConstraints $ var "ts"))
+        (Core.bindingType $ var "b"))
+    Maps.empty
+    (var "bins0") $
+  "originalConstraintsSubst" <~ Substitution.substInClassConstraints @@ var "composedSubst" @@ var "originalBindingConstraints" $
+
+  "allInferredConstraints" <~ mergeClassConstraints @@ var "constraintsWithS2" @@ var "originalConstraintsSubst" $
+  "mergedConstraints" <~ mergeClassConstraints @@ (Graph.graphClassConstraints $ var "g2base") @@ var "allInferredConstraints" $
+  "g2" <~ Graph.graphWithClassConstraints (var "g2base") (var "mergedConstraints") $
+
+  "bterms1Subst" <~ Lists.map (Substitution.substTypesInTerm @@ var "s2") (var "bterms1") $
+
+  -- Phase 4: Generalize
+  "tsbins1" <~ (Lists.zip (var "bnames") $
+    Lists.map ("t" ~> generalize @@ var "g2" @@
+      (Substitution.substInType @@ var "s2" @@ var "t")) (var "tbins1")) $
+
+  -- Phase 5: Infer body type
+  "bodyResult" <<~ inferTypeOfTerm @@ var "fcx3" @@
+    (extendContext @@ var "tsbins1" @@ var "g2") @@
+    (var "body0") @@
+    (string "let body") $
+  "fcx4" <~ Typing.inferenceResultContext (var "bodyResult") $
+  "body1" <~ Typing.inferenceResultTerm (var "bodyResult") $
+  "tbody" <~ Typing.inferenceResultType (var "bodyResult") $
+  "sbody" <~ Typing.inferenceResultSubst (var "bodyResult") $
+
+  -- Phase 6: Create term substitution for polymorphic instantiation
+  "st1" <~ (Typing.termSubst (Maps.fromList $
+    Lists.map
+      ("pair" ~>
+        "name" <~ Pairs.first (var "pair") $
+        "ts" <~ Pairs.second (var "pair") $
+        pair
+          (var "name") $
+          (buildTypeApplicationTerm
+            @@ (Core.typeSchemeVariables $ var "ts")
+            @@ (Core.termVariable $ var "name")))
+      (var "tsbins1"))) $
+
+  -- Phase 7: Create final bindings with type lambdas
+  "createBinding" <~ ("bindingPair" ~>
+    "nameTsPair" <~ Pairs.first (var "bindingPair") $
+    "term" <~ Pairs.second (var "bindingPair") $
+    "name" <~ Pairs.first (var "nameTsPair") $
+    "ts" <~ Pairs.second (var "nameTsPair") $
+    "finalTs" <~ Substitution.substInTypeScheme @@ var "sbody" @@ var "ts" $
+    "typeLambdaTerm" <~ Lists.foldl
+      ("b" ~> "v" ~> Core.termTypeLambda $ Core.typeLambda (var "v") (var "b"))
+      (Substitution.substituteInTerm @@ var "st1" @@ var "term")
+      (Lists.reverse $ Core.typeSchemeVariables $ var "finalTs") $
+    Core.binding (var "name")
+      (Substitution.substTypesInTerm @@
+        (Substitution.composeTypeSubst @@ var "sbody" @@ var "s2") @@
+        (var "typeLambdaTerm"))
+      (just $ var "finalTs")) $
+
+  "bins1" <~ (Lists.map (var "createBinding") $
+    Lists.zip (var "tsbins1") (var "bterms1Subst")) $
+
+  "bodyConstraints" <~ Substitution.substInClassConstraints @@ var "sbody" @@ (Typing.inferenceResultClassConstraints $ var "bodyResult") $
+  "bindingConstraintsSubst" <~ Substitution.substInClassConstraints @@ var "sbody" @@ var "constraintsWithS2" $
+  "allConstraints" <~ mergeClassConstraints @@ var "bindingConstraintsSubst" @@ var "bodyConstraints" $
+
+  right (Typing.inferenceResult
+    (Core.termLet $ Core.let_ (var "bins1") (var "body1"))
+    (var "tbody")
+    (Substitution.composeTypeSubstList @@ list [var "s1", var "s2", var "sbody"])
+    (var "allConstraints")
+    (var "fcx4"))
+
+inferTypesOfTemporaryBindings :: TBinding (Context -> Graph -> [Binding] -> Prelude.Either (InContext Error) (([Term], ([Type], (TypeSubst, M.Map Name TypeVariableMetadata))), Context))
+inferTypesOfTemporaryBindings = define "inferTypesOfTemporaryBindings" $
+  doc "Infer types for temporary let bindings (Either version)" $
+  "fcx" ~> "cx" ~> "bins" ~>
+  Logic.ifElse (Lists.null $ var "bins")
+    (right $ pair (pair (list ([] :: [TTerm Term])) (pair (list ([] :: [TTerm Type])) (pair (Substitution.idTypeSubst) Maps.empty))) (var "fcx"))
+    ("dflt" <~ (
+    "binding" <~ Lists.head (var "bins") $
+    "k" <~ Core.bindingName (var "binding") $
+    "v" <~ Core.bindingTerm (var "binding") $
+    "tl" <~ Lists.tail (var "bins") $
+    "result1" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "v" @@
+      (Strings.cat $ list [
+        (string "temporary let binding '"),
+        Core.unName $ var "k",
+        (string "'")]) $
+    "fcx2" <~ Typing.inferenceResultContext (var "result1") $
+    "j" <~ Typing.inferenceResultTerm (var "result1") $
+    "u_prime" <~ Typing.inferenceResultType (var "result1") $
+    "u" <~ Typing.inferenceResultSubst (var "result1") $
+    "c1Inferred" <~ Typing.inferenceResultClassConstraints (var "result1") $
+
+    -- Extract constraints from the original binding's TypeScheme
+    "originalBindingConstraints" <<~ Maybes.maybe
+      (right Maps.empty)
+      ("ts" ~>
+        "tsResult" <~ Schemas.instantiateTypeScheme @@ var "fcx2" @@ var "ts" $
+        "instantiatedTs" <~ Pairs.first (var "tsResult") $
+        "freshConstraints" <~ Maybes.fromMaybe Maps.empty (Core.typeSchemeConstraints $ var "instantiatedTs") $
+        -- Unify the instantiated type with the inferred type to map fresh variables
+        "unifySubst" <<~ Eithers.bimap
+          ("_ic" ~> Ctx.inContext (Error.errorOther $ Error.otherError (Error.unificationErrorMessage (Ctx.inContextObject (var "_ic")))) (Ctx.inContextContext (var "_ic")))
+          ("_a" ~> var "_a")
+          (Unification.unifyTypes
+            @@ var "fcx2"
+            @@ (Graph.graphSchemaTypes $ var "cx")
+            @@ (Core.typeSchemeType $ var "instantiatedTs")
+            @@ var "u_prime"
+            @@ string "original binding type") $
+        right (Substitution.substInClassConstraints @@ var "unifySubst" @@ var "freshConstraints"))
+      (Core.bindingType $ var "binding") $
+
+    "c1" <~ mergeClassConstraints @@ var "c1Inferred" @@ var "originalBindingConstraints" $
+
+    "rp2" <<~ inferTypesOfTemporaryBindings @@ var "fcx2" @@
+      (Substitution.substInContext @@ var "u" @@ var "cx") @@
+      var "tl" $
+    "result2" <~ Pairs.first (var "rp2") $
+    "fcx3" <~ Pairs.second (var "rp2") $
+    "h" <~ Pairs.first (var "result2") $
+    "r_prime" <~ Pairs.first (Pairs.second $ var "result2") $
+    "restPair" <~ Pairs.second (Pairs.second $ var "result2") $
+    "r" <~ Pairs.first (var "restPair") $
+    "c2" <~ Pairs.second (var "restPair") $
+    "c1Subst" <~ Substitution.substInClassConstraints @@ var "r" @@ var "c1" $
+    "mergedConstraints" <~ mergeClassConstraints @@ var "c1Subst" @@ var "c2" $
+    right $ pair (pair
+      (Lists.cons (Substitution.substTypesInTerm @@ var "r" @@ var "j") (var "h"))
+      (pair
+        (Lists.cons (Substitution.substInType @@ var "r" @@ var "u_prime") (var "r_prime"))
+        (pair (Substitution.composeTypeSubst @@ var "u" @@ var "r") (var "mergedConstraints")))) (var "fcx3")) $
+  var "dflt")
+
+inferMany :: TBinding (Context -> Graph -> [(Term, String)] -> Prelude.Either (InContext Error) (([Term], ([Type], (TypeSubst, M.Map Name TypeVariableMetadata))), Context))
+inferMany = define "inferMany" $
+  doc "Infer types for multiple terms, propagating class constraints from sub-expressions" $
+  "fcx" ~> "cx" ~> "pairs" ~>
+  Logic.ifElse (Lists.null $ var "pairs")
+    (right $ pair (pair (list ([] :: [TTerm Term])) $ pair (list ([] :: [TTerm Type])) (pair Substitution.idTypeSubst Maps.empty)) (var "fcx"))
+    ("dflt" <~ (
+    "e" <~ Pairs.first (Lists.head $ var "pairs") $
+    "desc" <~ Pairs.second (Lists.head $ var "pairs") $
+    "tl" <~ Lists.tail (var "pairs") $
+    "result1" <<~ inferTypeOfTerm @@ var "fcx" @@ var "cx" @@ var "e" @@ var "desc" $
+    "fcx2" <~ Typing.inferenceResultContext (var "result1") $
+    "e1" <~ Typing.inferenceResultTerm (var "result1") $
+    "t1" <~ Typing.inferenceResultType (var "result1") $
+    "s1" <~ Typing.inferenceResultSubst (var "result1") $
+    "c1" <~ Typing.inferenceResultClassConstraints (var "result1") $
+    "rp2" <<~ inferMany @@ var "fcx2" @@ (Substitution.substInContext @@ var "s1" @@ var "cx") @@ var "tl" $
+    "result2" <~ Pairs.first (var "rp2") $
+    "fcx3" <~ Pairs.second (var "rp2") $
+    "e2" <~ Pairs.first (var "result2") $
+    "t2" <~ Pairs.first (Pairs.second $ var "result2") $
+    "s2" <~ Pairs.first (Pairs.second $ Pairs.second $ var "result2") $
+    "c2" <~ Pairs.second (Pairs.second $ Pairs.second $ var "result2") $
+    "c1Subst" <~ Substitution.substInClassConstraints @@ var "s2" @@ var "c1" $
+    "mergedConstraints" <~ mergeClassConstraints @@ var "c1Subst" @@ var "c2" $
+    right $ pair (pair
+      (Lists.cons (Substitution.substTypesInTerm @@ var "s2" @@ var "e1") (var "e2"))
+      (pair
+        (Lists.cons (Substitution.substInType @@ var "s2" @@ var "t1") (var "t2"))
+        (pair (Substitution.composeTypeSubst @@ var "s1" @@ var "s2") (var "mergedConstraints")))) (var "fcx3")) $
+  var "dflt")
+
+yieldDebug :: TBinding (Context -> Graph -> String -> Term -> Type -> TypeSubst -> Prelude.Either (InContext Error) InferenceResult)
+yieldDebug = define "yieldDebug" $
+  doc "Create an inference result with debug output" $
+  "fcx" ~> "cx" ~> "debugId" ~> "term" ~> "typ" ~> "subst" ~>
+  "rterm" <~ Substitution.substTypesInTerm @@ var "subst" @@ var "term" $
+  "rtyp" <~ Substitution.substInType @@ var "subst" @@ var "typ" $
+  "result" <<~ Annotations.debugIf @@ var "fcx" @@ var "debugId" @@
+    (Strings.cat $ list [
+      (string "\n\tterm: "),  ShowCore.term @@ var "term",
+      (string "\n\ttyp: "),   ShowCore.type_ @@ var "typ",
+      (string "\n\tsubst: "), ShowTyping.typeSubst @@ var "subst",
+      (string "\n\trterm: "), ShowCore.term @@ var "rterm",
+      (string "\n\trtyp: "),  ShowCore.type_ @@ var "rtyp"]) $
+  right (Typing.inferenceResult (var "rterm") (var "rtyp") (var "subst") Maps.empty (var "fcx"))
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Languages.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Languages.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Languages.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Languages.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (hydraLanguage)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +30,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -62,7 +59,7 @@
 
 module_ :: Module
 module_ = Module ns
-  [toBinding hydraLanguage]
+  [toTermDefinition hydraLanguage]
   [Reflect.ns]
   kernelTypesNamespaces $
   Just "Language constraints for Hydra Core"
@@ -79,8 +76,8 @@
   "typeVariants">: Sets.fromList Reflect.typeVariants,
   "types">: "t" ~> cases _Type (var "t") (Just true) []] $
   Coders.language
-    (Coders.languageName (string "hydra.core"))
-    (Coders.languageConstraints
+    (Coders.languageName_ (string "hydra.core"))
+    (Coders.languageConstraints_
       (var "eliminationVariants")
       (var "literalVariants")
       (var "floatTypes")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Lexical.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Lexical.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Lexical.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Lexical.hs
@@ -2,23 +2,20 @@
 module Hydra.Sources.Kernel.Terms.Lexical where
 
 -- Standard imports for kernel terms modules
-import Hydra.Kernel hiding (chooseUniqueName, dereferenceElement, dereferenceSchemaType, dereferenceVariable, elementsToGraph, emptyGraph, extendGraphWithBindings, fieldsOf, getField, lookupElement, lookupPrimitive, matchEnum, matchRecord, matchUnion, matchUnitField, requireElement, requirePrimitive, requirePrimitiveType, requireTerm, resolveTerm, schemaContext, stripAndDereferenceTerm, stripAndDereferenceTermEither, withEmptyGraph, withSchemaContext)
+import Hydra.Kernel hiding (buildGraph, chooseUniqueName, dereferenceElement, dereferenceSchemaType, dereferenceVariable, elementsToGraph, emptyContext, emptyGraph, fieldsOf, getField, graphToBindings, lookupElement, lookupPrimitive, lookupTerm, matchEnum, matchRecord, matchUnion, matchUnitField, requireElement, requirePrimitive, requirePrimitiveType, requireTerm, resolveTerm, stripAndDereferenceTerm, stripAndDereferenceTermEither)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,19 +30,21 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
 import qualified Data.Int                    as I
@@ -54,9 +53,10 @@
 import qualified Data.Set                    as S
 import qualified Data.Maybe                  as Y
 
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
+
 import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors as ShowError
 
 
 ns :: Namespace
@@ -67,37 +67,64 @@
 
 module_ :: Module
 module_ = Module ns elements
-   [Monads.ns, Rewriting.ns, ShowCore.ns]
+   [Rewriting.ns, ShowCore.ns, ShowError.ns]
     kernelTypesNamespaces $
     Just ("A module for lexical operations over graphs.")
   where
     elements = [
-      toBinding chooseUniqueName,
-      toBinding dereferenceElement,
-      toBinding dereferenceSchemaType,
-      toBinding dereferenceVariable,
-      toBinding elementsToGraph,
-      toBinding emptyGraph,
-      toBinding extendGraphWithBindings,
-      toBinding fieldsOf,
-      toBinding getField,
-      toBinding lookupElement,
-      toBinding lookupPrimitive,
-      toBinding matchEnum,
-      toBinding matchRecord,
-      toBinding matchUnion,
-      toBinding matchUnitField,
-      toBinding requireElement,
-      toBinding requirePrimitive,
-      toBinding requirePrimitiveType,
-      toBinding requireTerm,
-      toBinding resolveTerm,
-      toBinding schemaContext,
-      toBinding stripAndDereferenceTerm,
-      toBinding stripAndDereferenceTermEither,
-      toBinding withEmptyGraph,
-      toBinding withSchemaContext]
+      toTermDefinition buildGraph,
+      toTermDefinition chooseUniqueName,
+      toTermDefinition dereferenceElement,
+      toTermDefinition dereferenceSchemaType,
+      toTermDefinition dereferenceVariable,
+      toTermDefinition elementsToGraph,
+      toTermDefinition emptyContext,
+      toTermDefinition emptyGraph,
+      toTermDefinition graphToBindings,
+      toTermDefinition fieldsOf,
+      toTermDefinition getField,
+      toTermDefinition lookupElement,
+      toTermDefinition lookupPrimitive,
+      toTermDefinition lookupTerm,
+      toTermDefinition matchEnum,
+      toTermDefinition matchRecord,
+      toTermDefinition matchUnion,
+      toTermDefinition matchUnitField,
+      toTermDefinition requireElement,
+      toTermDefinition requirePrimitive,
+      toTermDefinition requirePrimitiveType,
+      toTermDefinition requireTerm,
+      toTermDefinition resolveTerm,
+      toTermDefinition stripAndDereferenceTerm,
+      toTermDefinition stripAndDereferenceTermEither]
 
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
+-- | Build a Graph from element bindings, environment, and primitives.
+buildGraph :: TBinding ([Binding] -> M.Map Name (Maybe Term) -> M.Map Name Primitive -> Graph)
+buildGraph = define "buildGraph" $
+  doc "Build a Graph from element bindings, environment, and primitives" $
+  "elements" ~> "environment" ~> "primitives" ~>
+  -- boundTerms: element bindings (name -> term) merged with let-bound vars from environment (Just term)
+  "elementTerms" <~ Maps.fromList (Lists.map ("b" ~>
+    pair (Core.bindingName (var "b")) (Core.bindingTerm (var "b"))) (var "elements")) $
+  "letTerms" <~ Maps.map ("mt" ~> Maybes.fromJust (var "mt"))
+    (Maps.filter ("mt" ~> Maybes.isJust (var "mt")) (var "environment")) $
+  -- boundTypes: extract bindingType from each element (preserving TypeScheme with constraints)
+  "elementTypes" <~ Maps.fromList (Maybes.cat (Lists.map ("b" ~>
+    Maybes.map ("ts" ~> pair (Core.bindingName (var "b")) (var "ts"))
+      (Core.bindingType (var "b"))) (var "elements"))) $
+  Graph.graph
+    (Maps.union (var "elementTerms") (var "letTerms"))
+    (var "elementTypes")
+    Maps.empty
+    (Sets.fromList (Maps.keys (Maps.filter ("mt" ~> Maybes.isNothing (var "mt")) (var "environment"))))
+    Maps.empty
+    (var "primitives")
+    Maps.empty
+    Sets.empty
+
 chooseUniqueName :: TBinding (S.Set Name -> Name -> Name)
 chooseUniqueName = define "chooseUniqueName" $
   "reserved" ~> "name" ~>
@@ -110,12 +137,10 @@
       (var "candidate")) $
   var "tryName" @@ (int32 1)
 
-dereferenceElement :: TBinding (Name -> Flow Graph (Maybe Binding))
+dereferenceElement :: TBinding (Graph -> Name -> Maybe Binding)
 dereferenceElement = define "dereferenceElement" $
-  doc "Look up an element in the current graph context" $
-  "name" ~> Flows.map
-    ("g" ~> lookupElement @@ var "g" @@ var "name")
-    (Monads.getState)
+  doc "Look up an element in a graph" $
+  "graph" ~> "name" ~> lookupElement @@ var "graph" @@ var "name"
 
 dereferenceSchemaType :: TBinding (Name -> M.Map Name TypeScheme -> Maybe TypeScheme)
 dereferenceSchemaType = define "dereferenceSchemaType" $
@@ -142,44 +167,46 @@
         (Core.typeSchemeConstraints (var "ts2")))
       (var "forType" @@ (Core.typeSchemeType (var "ts"))))
 
--- | Dereference a variable name in a graph, returning Either an error message or the binding
 dereferenceVariable :: TBinding (Graph -> Name -> Either String Binding)
 dereferenceVariable = define "dereferenceVariable" $
-  doc "Look up an element by name in a graph, returning Either an error or the binding" $
-  "g" ~> "name" ~>
+  doc "Look up a binding by name in a graph, returning Either an error or the binding" $
+  "graph" ~> "name" ~>
   Maybes.maybe
     (left ((string "no such element: ") ++ (Core.unName (var "name"))))
     right_
-    (lookupElement @@ var "g" @@ var "name")
+    (lookupElement @@ var "graph" @@ var "name")
 
-elementsToGraph :: TBinding (Graph -> Maybe Graph -> [Binding] -> Graph)
+elementsToGraph :: TBinding (Graph -> M.Map Name TypeScheme -> [Binding] -> Graph)
 elementsToGraph = define "elementsToGraph" $
-  doc "Create a graph from a parent graph, optional schema, and list of element bindings" $
-  "parent" ~> "schema" ~> "elements" ~>
-  Graph.graph
-    (var "elements")
-    (Graph.graphEnvironment (var "parent"))
-    (Graph.graphTypes (var "parent"))
-    (Graph.graphBody (var "parent"))
-    (Graph.graphPrimitives (var "parent"))
-    (var "schema")
+  doc "Create a graph from a parent graph, schema types, and list of element bindings" $
+  "parent" ~> "schemaTypes" ~> "elements" ~>
+  "prims" <~ Graph.graphPrimitives (var "parent") $
+  "g" <~ (buildGraph @@ var "elements" @@ Maps.empty @@ var "prims") $
+  Graph.graphWithSchemaTypes (var "g") (var "schemaTypes")
 
+emptyContext :: TBinding Context
+emptyContext = define "emptyContext" $
+  doc "An empty context; no trace, no messages, no other data." $
+  record _Context [
+    _Context_trace>>: list ([] :: [TTerm String]),
+    _Context_messages>>: list ([] :: [TTerm String]),
+    _Context_other>>: Maps.empty]
+
 emptyGraph :: TBinding Graph
 emptyGraph = define "emptyGraph" $
-  doc "An empty graph; no elements, no primitives, no schema, and an arbitrary body." $
-  Graph.graph
-    (list ([] :: [TTerm Binding]))
-    Maps.empty
-    Maps.empty
-    (Core.termLiteral (Core.literalString (string "empty graph")))
-    Maps.empty
-    nothing
+  doc "An empty graph; no elements, no primitives, no schema." $
+  Graph.emptyGraph
 
-extendGraphWithBindings :: TBinding ([Binding] -> Graph -> Graph)
-extendGraphWithBindings = define "extendGraphWithBindings" $
-  doc "Add bindings to an existing graph" $
-  "bindings" ~> "g" ~>
-  Graph.graphWithElements (var "g") (Lists.concat2 (var "bindings") (Graph.graphElements (var "g")))
+graphToBindings :: TBinding (Graph -> [Binding])
+graphToBindings = define "graphToBindings" $
+  doc "Reconstruct a list of Bindings from a Graph's boundTerms and boundTypes" $
+  "g" ~>
+  Lists.map ("p" ~>
+    "name" <~ Pairs.first (var "p") $
+    "term" <~ Pairs.second (var "p") $
+    Core.binding (var "name") (var "term")
+      (Maps.lookup (var "name") (Graph.graphBoundTypes (var "g"))))
+    (Maps.toList (Graph.graphBoundTerms (var "g")))
 
 fieldsOf :: TBinding (Type -> [FieldType])
 fieldsOf = define "fieldsOf" $
@@ -189,177 +216,167 @@
   cases _Type (var "stripped")
     (Just (list ([] :: [TTerm FieldType]))) [
     _Type_forall>>: "forallType" ~> fieldsOf @@ (Core.forallTypeBody (var "forallType")),
-    _Type_record>>: "rt" ~> Core.rowTypeFields (var "rt"),
-    _Type_union>>: "rt" ~> Core.rowTypeFields (var "rt")]
+    _Type_record>>: "rt" ~> var "rt",
+    _Type_union>>: "rt" ~> var "rt"]
 
-getField :: TBinding (M.Map Name Term -> Name -> (Term -> Flow Graph b) -> Flow Graph b)
+getField :: TBinding (Context -> M.Map Name Term -> Name -> (Term -> Either (InContext Error) b) -> Either (InContext Error) b)
 getField = define "getField" $
-  "m" ~> "fname" ~> "decode" ~>
+  "cx" ~> "m" ~> "fname" ~> "decode" ~>
   Maybes.maybe
-    (Flows.fail ((string "expected field ") ++ (Core.unName (var "fname")) ++ (string " not found")))
+    (Ctx.failInContext (Error.errorOther $ Error.otherError ((string "expected field ") ++ (Core.unName (var "fname")) ++ (string " not found"))) (var "cx"))
     (var "decode")
     (Maps.lookup (var "fname") (var "m"))
 
 lookupElement :: TBinding (Graph -> Name -> Maybe Binding)
 lookupElement = define "lookupElement" $
-  "g" ~> "name" ~> Lists.find ("b" ~> Equality.equal (Core.bindingName (var "b")) (var "name")) (Graph.graphElements (var "g"))
+  doc "Look up a binding in a graph by name" $
+  "graph" ~> "name" ~>
+  Maybes.map
+    ("term" ~> Core.binding (var "name") (var "term")
+      (Maps.lookup (var "name") (Graph.graphBoundTypes (var "graph"))))
+    (Maps.lookup (var "name") (Graph.graphBoundTerms (var "graph")))
 
 lookupPrimitive :: TBinding (Graph -> Name -> Maybe Primitive)
 lookupPrimitive = define "lookupPrimitive" $
-  "g" ~> "name" ~>
-  Maps.lookup (var "name") (Graph.graphPrimitives (var "g"))
+  doc "Look up a primitive function in a graph by name" $
+  "graph" ~> "name" ~>
+  Maps.lookup (var "name") (Graph.graphPrimitives (var "graph"))
 
-matchEnum :: TBinding (Name -> [(Name, b)] -> Term -> Flow Graph b)
+lookupTerm :: TBinding (Graph -> Name -> Maybe Term)
+lookupTerm = define "lookupTerm" $
+  doc "Look up a term by name in a graph" $
+  "graph" ~> "name" ~>
+  Maps.lookup (var "name") (Graph.graphBoundTerms (var "graph"))
+
+matchEnum :: TBinding (Context -> Graph -> Name -> [(Name, b)] -> Term -> Either (InContext Error) b)
 matchEnum = define "matchEnum" $
-  "tname" ~> "pairs" ~>
-  matchUnion @@ var "tname" @@ (Lists.map ("pair" ~>
+  "cx" ~> "graph" ~> "tname" ~> "pairs" ~>
+  matchUnion @@ var "cx" @@ var "graph" @@ var "tname" @@ (Lists.map ("pair" ~>
     matchUnitField @@ (Pairs.first (var "pair")) @@ (Pairs.second (var "pair"))) (var "pairs"))
 
-matchRecord :: TBinding ((M.Map Name Term -> Flow Graph b) -> Term -> Flow Graph b)
+matchRecord :: TBinding (Context -> Graph -> (M.Map Name Term -> Either (InContext Error) b) -> Term -> Either (InContext Error) b)
 matchRecord = define "matchRecord" $
-  "decode" ~> "term" ~>
+  "cx" ~> "graph" ~> "decode" ~> "term" ~>
   "stripped" <~ Rewriting.deannotateAndDetypeTerm @@ var "term" $
   cases _Term (var "stripped")
-    (Just (Monads.unexpected @@ (string "record") @@ (ShowCore.term @@ var "term"))) [
+    (Just (Ctx.failInContext (Error.errorOther $ Error.otherError ((string "expected a record, got ") ++ (ShowCore.term @@ var "term"))) (var "cx"))) [
     _Term_record>>: "record" ~> var "decode" @@
       (Maps.fromList (Lists.map
         ("field" ~> pair (Core.fieldName (var "field")) (Core.fieldTerm (var "field")))
         (Core.recordFields (var "record"))))]
 
-matchUnion :: TBinding (Name -> [(Name, Term -> Flow Graph b)] -> Term -> Flow Graph b)
+matchUnion :: TBinding (Context -> Graph -> Name -> [(Name, Term -> Either (InContext Error) b)] -> Term -> Either (InContext Error) b)
 matchUnion = define "matchUnion" $
-  "tname" ~> "pairs" ~> "term" ~>
+  "cx" ~> "graph" ~> "tname" ~> "pairs" ~> "term" ~>
   "stripped" <~ Rewriting.deannotateAndDetypeTerm @@ var "term" $
   "mapping" <~ Maps.fromList (var "pairs") $
---  trace "match union" $
   cases _Term (var "stripped")
-    (Just (Monads.unexpected @@
-      (Strings.cat $ list [
-        string "inject(", Core.unName (var "tname"),
+    (Just (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat $ list [
+        string "expected inject(", Core.unName (var "tname"),
         string ") with one of {",
         (Strings.intercalate (string ", ") (Lists.map ("pair" ~> Core.unName (Pairs.first (var "pair"))) (var "pairs"))),
-        string "}"]) @@
-      (ShowCore.term @@ var "stripped"))) [
+        string "}, got ",
+        (ShowCore.term @@ var "stripped")])) (var "cx"))) [
     _Term_variable>>: "name" ~>
-      "el" <<~ requireElement @@ var "name" $
-      matchUnion @@ var "tname" @@ var "pairs" @@ (Core.bindingTerm (var "el")),
+      "el" <<~ requireElement @@ var "cx" @@ var "graph" @@ var "name" $
+      matchUnion @@ var "cx" @@ var "graph" @@ var "tname" @@ var "pairs" @@ (Core.bindingTerm (var "el")),
     _Term_union>>: "injection" ~>
       "exp" <~ (
         "fname" <~ Core.fieldName (Core.injectionField (var "injection")) $
         "val" <~ Core.fieldTerm (Core.injectionField (var "injection")) $
         Maybes.maybe
-          (Flows.fail ((string "no matching case for field \"") ++ (Core.unName (var "fname"))
-            ++ (string "\" in union type ") ++ (Core.unName (var "tname"))))
+          (Ctx.failInContext (Error.errorOther $ Error.otherError ((string "no matching case for field \"") ++ (Core.unName (var "fname"))
+            ++ (string "\" in union type ") ++ (Core.unName (var "tname")))) (var "cx"))
           ("f" ~> var "f" @@ var "val")
           (Maps.lookup (var "fname") (var "mapping"))) $
       Logic.ifElse (Core.equalName_ (Core.injectionTypeName (var "injection")) (var "tname"))
         (var "exp")
-        (Monads.unexpected @@ ((string "injection for type ") ++ (Core.unName (var "tname"))) @@ (ShowCore.term @@ var "term"))]
+        (Ctx.failInContext (Error.errorOther $ Error.otherError ((string "expected injection for type ") ++ (Core.unName (var "tname"))
+          ++ (string ", got ") ++ (ShowCore.term @@ var "term"))) (var "cx"))]
 
-matchUnitField :: TBinding (Name -> y -> (Name, x -> Flow Graph y))
+matchUnitField :: TBinding (Name -> y -> (Name, x -> Either (InContext Error) y))
 matchUnitField = define "matchUnitField" $
-  "fname" ~> "x" ~> pair (var "fname") ("ignored" ~> produce (var "x"))
+  "fname" ~> "x" ~> pair (var "fname") ("ignored" ~> right (var "x"))
 
-requireElement :: TBinding (Name -> Flow Graph Binding)
+requireElement :: TBinding (Context -> Graph -> Name -> Either (InContext Error) Binding)
 requireElement = define "requireElement" $
-  "name" ~>
+  "cx" ~> "graph" ~> "name" ~>
   "showAll" <~ false $
   "ellipsis" <~ ("strings" ~>
     Logic.ifElse (Logic.and (Equality.gt (Lists.length (var "strings")) (int32 3)) (Logic.not (var "showAll")))
       (Lists.concat2 (Lists.take (int32 3) (var "strings")) (list [string "..."]))
       (var "strings")) $
-  "err" <~ ("g" ~> Flows.fail (
+  "errMsg" <~ (
     (string "no such element: ") ++ (Core.unName (var "name")) ++
     (string ". Available elements: {") ++
-    (Strings.intercalate (string ", ") (var "ellipsis" @@ (Lists.map ("el" ~> Core.unName (Core.bindingName (var "el"))) (Graph.graphElements (var "g"))))) ++
-    (string "}"))) $
-  "mel" <<~ dereferenceElement @@ var "name" $
+    (Strings.intercalate (string ", ") (var "ellipsis" @@ (Lists.map (unaryFunction Core.unName) (Maps.keys (Graph.graphBoundTerms (var "graph")))))) ++
+    (string "}")) $
   Maybes.maybe
-    ("g" <<~ Monads.getState $ var "err" @@ var "g")
-    (unaryFunction Flows.pure)
-    (var "mel")
+    (Ctx.failInContext (Error.errorOther $ Error.otherError (var "errMsg")) (var "cx"))
+    (unaryFunction right)
+    (dereferenceElement @@ var "graph" @@ var "name")
 
-requirePrimitive :: TBinding (Name -> Flow Graph Primitive)
+requirePrimitive :: TBinding (Context -> Graph -> Name -> Either (InContext Error) Primitive)
 requirePrimitive = define "requirePrimitive" $
-  "name" ~>
-  "g" <<~ Monads.getState $
+  "cx" ~> "graph" ~> "name" ~>
   Maybes.maybe
-    (Flows.fail ((string "no such primitive function: ") ++ (Core.unName (var "name"))))
-    (unaryFunction Flows.pure)
-    (lookupPrimitive @@ var "g" @@ var "name")
+    (Ctx.failInContext (Error.errorOther $ Error.otherError ((string "no such primitive function: ") ++ (Core.unName (var "name")))) (var "cx"))
+    (unaryFunction right)
+    (lookupPrimitive @@ var "graph" @@ var "name")
 
-requirePrimitiveType :: TBinding (TypeContext -> Name -> Flow s TypeScheme)
+requirePrimitiveType :: TBinding (Context -> Graph -> Name -> Either (InContext Error) TypeScheme)
 requirePrimitiveType = define "requirePrimitiveType" $
-  "tx" ~> "name" ~>
-  "mts" <~ Maps.lookup
-    (var "name" )
-    (Typing.inferenceContextPrimitiveTypes $ Typing.typeContextInferenceContext $ var "tx") $
+  "cx" ~> "tx" ~> "name" ~>
+  -- Look up the primitive directly and extract its type, avoiding O(p) map reconstruction.
+  "mts" <~ Maybes.map ("_p" ~> Graph.primitiveType (var "_p"))
+    (Maps.lookup (var "name") (Graph.graphPrimitives $ var "tx")) $
   optCases (var "mts")
-    (Flows.fail ((string "no such primitive function: ") ++ (Core.unName (var "name"))))
-    ("ts" ~> produce $ var "ts")
+    (Ctx.failInContext (Error.errorOther $ Error.otherError ((string "no such primitive function: ") ++ (Core.unName (var "name")))) (var "cx"))
+    ("ts" ~> right $ var "ts")
 
-requireTerm :: TBinding (Name -> Flow Graph Term)
+requireTerm :: TBinding (Context -> Graph -> Name -> Either (InContext Error) Term)
 requireTerm = define "requireTerm" $
-  "name" ~>
-  "mt" <<~ resolveTerm @@ var "name" $
+  "cx" ~> "graph" ~> "name" ~>
   Maybes.maybe
-    (Flows.fail ((string "no such element: ") ++ (Core.unName (var "name"))))
-    (unaryFunction Flows.pure)
-    (var "mt")
+    (Ctx.failInContext (Error.errorOther $ Error.otherError ((string "no such element: ") ++ (Core.unName (var "name")))) (var "cx"))
+    (unaryFunction right)
+    (resolveTerm @@ var "graph" @@ var "name")
 
-resolveTerm :: TBinding (Name -> Flow Graph (Maybe Term))
+resolveTerm :: TBinding (Graph -> Name -> Maybe Term)
 resolveTerm = define "resolveTerm" $
   doc "TODO: distinguish between lambda-bound and let-bound variables" $
-  "name" ~>
-  "recurse" <~ ("el" ~>
-    "stripped" <~ Rewriting.deannotateTerm @@ (Core.bindingTerm (var "el")) $
+  "graph" ~> "name" ~>
+  "recurse" <~ ("term" ~>
+    "stripped" <~ Rewriting.deannotateTerm @@ var "term" $
     cases _Term (var "stripped")
-      (Just (produce (just (Core.bindingTerm (var "el"))))) [
-      _Term_variable>>: "name'" ~> resolveTerm @@ var "name'"]) $
-  "g" <<~ Monads.getState $
+      (Just (just (var "term"))) [
+      _Term_variable>>: "name'" ~> resolveTerm @@ var "graph" @@ var "name'"]) $
   Maybes.maybe
-    (produce nothing)
+    nothing
     (var "recurse")
-    (Lists.find ("b" ~> Equality.equal (Core.bindingName (var "b")) (var "name")) (Graph.graphElements (var "g")))
-
-schemaContext :: TBinding (Graph -> Graph)
-schemaContext = define "schemaContext" $
-  doc "Note: assuming for now that primitive functions are the same in the schema graph" $
-  "g" ~> Maybes.fromMaybe (var "g") (Graph.graphSchema (var "g"))
+    (lookupTerm @@ var "graph" @@ var "name")
 
-stripAndDereferenceTerm :: TBinding (Term -> Flow Graph Term)
+stripAndDereferenceTerm :: TBinding (Context -> Graph -> Term -> Either (InContext Error) Term)
 stripAndDereferenceTerm = define "stripAndDereferenceTerm" $
-  "term" ~>
+  "cx" ~> "graph" ~> "term" ~>
   "stripped" <~ Rewriting.deannotateAndDetypeTerm @@ var "term" $
   cases _Term (var "stripped")
-    (Just (produce (var "stripped"))) [
+    (Just (right (var "stripped"))) [
     _Term_variable>>: "v" ~>
-      "t" <<~ requireTerm @@ var "v" $
-      stripAndDereferenceTerm @@ var "t"]
+      Eithers.bind (requireTerm @@ var "cx" @@ var "graph" @@ var "v") (
+        "t" ~> stripAndDereferenceTerm @@ var "cx" @@ var "graph" @@ var "t")]
 
--- | Strip annotations and dereference variables, returning Either String Term
--- This is the pure (non-Flow) version for use in generated decoders
 stripAndDereferenceTermEither :: TBinding (Graph -> Term -> Either String Term)
 stripAndDereferenceTermEither = define "stripAndDereferenceTermEither" $
   doc "Strip annotations and dereference variables, returning Either an error or the resolved term" $
-  "g" ~> "term" ~>
+  "graph" ~> "term" ~>
   "stripped" <~ Rewriting.deannotateAndDetypeTerm @@ var "term" $
   cases _Term (var "stripped")
     (Just (right (var "stripped"))) [
     _Term_variable>>: "v" ~>
       Eithers.either_
         left_  -- propagate error
-        ("binding" ~> stripAndDereferenceTermEither @@ var "g" @@ (Core.bindingTerm (var "binding")))
-        (dereferenceVariable @@ var "g" @@ var "v")]
+        ("binding" ~> stripAndDereferenceTermEither @@ var "graph" @@ (Core.bindingTerm (var "binding")))
+        (dereferenceVariable @@ var "graph" @@ var "v")]
 
--- TODO: move into hydra.lexical
-withEmptyGraph :: TBinding (Flow Graph a -> Flow s a)
-withEmptyGraph = define "withEmptyGraph" $
-  doc "Execute flow with empty graph" $
-  Monads.withState @@ emptyGraph
 
-withSchemaContext :: TBinding (Flow Graph x -> Flow Graph x)
-withSchemaContext = define "withSchemaContext" $
-  "f" ~>
-  "g" <<~ Monads.getState $
-  Monads.withState @@ (schemaContext @@ var "g") @@ var "f"
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Literals.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Literals.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Literals.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Literals.hs
@@ -4,21 +4,18 @@
 import Hydra.Kernel hiding (
   bigfloatToFloatValue, bigintToIntegerValue, floatValueToBigfloat, integerValueToBigint)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +30,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -65,10 +62,10 @@
     Just "Conversion functions for literal values."
   where
    elements = [
-     toBinding bigfloatToFloatValue,
-     toBinding bigintToIntegerValue,
-     toBinding floatValueToBigfloat,
-     toBinding integerValueToBigint]
+     toTermDefinition bigfloatToFloatValue,
+     toTermDefinition bigintToIntegerValue,
+     toTermDefinition floatValueToBigfloat,
+     toTermDefinition integerValueToBigint]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Monads.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Monads.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Monads.hs
+++ /dev/null
@@ -1,333 +0,0 @@
-
-module Hydra.Sources.Kernel.Terms.Monads where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel hiding (
-  emptyTrace, flowSucceeds, fromFlow, getState, map, maybeToList, modify, mutateTrace,
-  pushError, putState, traceSummary, unexpected, warn, withFlag, withState, withTrace)
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (bind, exec, map)
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++), fail, map, pure)
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Constants as Constants
-import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
-
-
-ns :: Namespace
-ns = Namespace "hydra.monads"
-
-module_ :: Module
-module_ = Module ns elements
-    [Constants.ns, ShowCore.ns]
-    kernelTypesNamespaces $
-    Just ("Functions for working with Hydra's 'flow' and other monads.")
-  where
-    elements = [
-      toBinding bind,
-      toBinding eitherToFlow_,
-      toBinding emptyTrace,
-      toBinding exec,
-      toBinding fail,
-      toBinding flowSucceeds,
-      toBinding fromFlow,
-      toBinding getState,
-      toBinding map,
-      toBinding modify,
-      toBinding mutateTrace,
-      toBinding maybeToList,
-      toBinding pure,
-      toBinding pushError,
-      toBinding putState,
-      toBinding traceSummary,
-      toBinding unexpected,
-      toBinding warn,
-      toBinding withFlag,
-      toBinding withState,
-      toBinding withTrace]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-bind :: TBinding (Flow s a -> (a -> Flow s b) -> Flow s b)
-bind = define "bind" $
-  doc "Monadic bind for flows" $
-  "l" ~> "r" ~>
-  "q" <~ ("s0" ~> "t0" ~>
-    "fs1" <~ Compute.unFlow (var "l") (var "s0") (var "t0") $
-    Maybes.maybe
-      (Compute.flowState
-        nothing
-        (Compute.flowStateState $ var "fs1")
-        (Compute.flowStateTrace $ var "fs1"))
-      ("v" ~> Compute.unFlow
-        (var "r" @@ var "v")
-        (Compute.flowStateState $ var "fs1")
-        (Compute.flowStateTrace $ var "fs1"))
-      (Compute.flowStateValue $ var "fs1")) $
-  Compute.flow $ var "q"
-
-eitherToFlow_ :: TBinding ((a -> String) -> Prelude.Either a b -> Flow s b)
-eitherToFlow_ = define "eitherToFlow" $
-  doc "Adapt an either to a flow; a left value is mapped to a failure using the provided function" $
-  "formatError" ~> "e" ~>
-  Eithers.either_
-    ("l" ~> fail @@ (var "formatError" @@ var "l"))
-    ("r" ~> pure @@ var "r")
-    (var "e")
-
-emptyTrace :: TBinding Trace
-emptyTrace = define "emptyTrace" $
-  doc "An empty trace with no stack, messages, or other attributes" $
-  Compute.trace (list ([] :: [TTerm String])) (list ([] :: [TTerm String])) Maps.empty
-
-exec :: TBinding (Flow s a -> s -> s)
-exec = define "exec" $
-  doc "Execute a flow and return the final state" $
-  "f" ~> "s0" ~>
-  Compute.flowStateState (Compute.unFlow (var "f") (var "s0") emptyTrace)
-
-fail :: TBinding (String -> Flow s a)
-fail = define "fail" $
-  doc "Fail a flow with an error message" $
-  "msg" ~>
-  Compute.flow (
-    "s" ~> "t" ~>
-    Compute.flowState nothing (var "s") (pushError @@ var "msg" @@ var "t"))
-
-flowSucceeds :: TBinding (Flow s a -> Bool)
-flowSucceeds = define "flowSucceeds" $
-  doc "Check whether a flow succeeds" $
-  "s" ~> "f" ~>
-  Maybes.isJust (Compute.flowStateValue (Compute.unFlow (var "f") (var "s") emptyTrace))
-
-fromFlow :: TBinding (a -> s -> Flow s a -> a)
-fromFlow = define "fromFlow" $
-  doc "Get the value of a flow, or a default value if the flow fails" $
-  "def" ~> "cx" ~> "f" ~> Maybes.maybe
-    (var "def")
-    ("xmo" ~> var "xmo")
-    (Compute.flowStateValue (Compute.unFlow (var "f") (var "cx") emptyTrace))
-
-getState :: TBinding (Flow s s)
-getState = define "getState" $
-  doc "Get the state of the current flow" $
-  Compute.flow (
-    "s0" ~> "t0" ~>
-    "fs1" <~ Compute.unFlow (pure @@ unit) (var "s0") (var "t0") $
-    "v" <~ Compute.flowStateValue (var "fs1") $
-    "s" <~ Compute.flowStateState (var "fs1") $
-    "t" <~ Compute.flowStateTrace (var "fs1") $
-    Maybes.maybe
-      (Compute.flowState nothing (var "s") (var "t"))
-      (constant (Compute.flowState (just (var "s")) (var "s") (var "t")))
-      (var "v"))
-
-map :: TBinding ((a -> b) -> Flow s a -> Flow s b)
-map = define "map" $
-  doc "Map a function over a flow" $
-  "f" ~> "f1" ~>
-  Compute.flow (
-    "s0" ~> "t0" ~>
-    "f2" <~ Compute.unFlow (var "f1") (var "s0") (var "t0") $
-    Compute.flowState
-      (Maybes.map (var "f") (Compute.flowStateValue (var "f2")))
-      (Compute.flowStateState (var "f2"))
-      (Compute.flowStateTrace (var "f2")))
-
-modify :: TBinding ((s -> s) -> Flow s ())
-modify = define "modify" $
-  doc "Modify the state of a flow using a given function" $
-  lambda "f" $
-  bind
-    @@ (getState)
-    @@ (lambda "s" $ putState @@ (var "f" @@ var "s"))
-
-mutateTrace :: TBinding ((Trace -> Prelude.Either String Trace) -> (Trace -> Trace -> Trace) -> Flow s a -> Flow s a)
-mutateTrace = define "mutateTrace" $
-  doc "Temporarily mutate the trace for the duration of a flow" $
-  "mutate" ~> "restore" ~> "f" ~>
-  "choose" <~ ("forLeft" ~> "forRight" ~> "e" ~> Eithers.either_
-    ("l" ~> var "forLeft" @@ var "l")
-    ("r" ~> var "forRight" @@ var "r")
-    (var "e")) $
-  "flowFun" <~ ("s0" ~> "t0" ~>
-    "forLeft" <~ ("msg" ~>
-      Compute.flowState nothing (var "s0") (pushError @@ var "msg" @@ var "t0")) $
-    "forRight" <~ ("t1" ~>
-      "f2" <~ Compute.unFlow (var "f") (var "s0") (var "t1") $
-      Compute.flowState
-        (Compute.flowStateValue (var "f2"))
-        (Compute.flowStateState (var "f2"))
-        (var "restore" @@ var "t0" @@ (Compute.flowStateTrace (var "f2")))) $
-    var "choose" @@ var "forLeft" @@ var "forRight" @@ (var "mutate" @@ var "t0")) $
-  Compute.flow $ var "flowFun"
-
-maybeToList :: TBinding (Maybe a -> [a])
-maybeToList = define "maybeToList" $
-  doc "Converts an optional value either to an empty list (if nothing) or a singleton list (if just)." $
-  "mx" ~> Maybes.maybe (list ([] :: [TTerm a])) (unaryFunction Lists.pure) (var "mx")
-
-pure :: TBinding (a -> Flow s a)
-pure = define "pure" $
-  doc "Lift a value into a flow" $
-  "xp" ~>
-  Compute.flow (
-    "s" ~> "t" ~> Compute.flowState (just (var "xp")) (var "s") (var "t"))
-
-pushError :: TBinding (String -> Trace -> Trace)
-pushError = define "pushError" $
-  doc "Push an error message" $
-  "msg" ~> "t" ~>
-  "condenseRepeats" <~ (
-    "ys" ~>
-    "condenseGroup" <~ ("xs" ~>
-      "x" <~ Lists.head (var "xs") $
-      "n" <~ Lists.length (var "xs") $
-      Logic.ifElse (Equality.equal (var "n") (int32 1))
-        (var "x")
-        (Strings.cat (list [var "x", string " (x", Literals.showInt32 (var "n"), string ")"]))) $
-    Lists.map (var "condenseGroup") (Lists.group (var "ys" :: TTerm [String]))) $
-  "errorMsg" <~ Strings.concat [
-    string "Error: ", var "msg", string " (",
-    (Strings.intercalate (string " > ") (var "condenseRepeats" @@ (Lists.reverse (Compute.traceStack (var "t"))))),
-    string ")"] $
-  Compute.trace
-    (Compute.traceStack (var "t"))
-    (Lists.cons (var "errorMsg") (Compute.traceMessages (var "t")))
-    (Compute.traceOther (var "t"))
-
-putState :: TBinding (s -> Flow s ())
-putState = define "putState" $
-  doc "Set the state of a flow" $
-  "cx" ~> Compute.flow (
-    "s0" ~> "t0" ~>
-    "f1" <~ Compute.unFlow (pure @@ unit) (var "s0") (var "t0") $
-    Compute.flowState
-      (Compute.flowStateValue (var "f1"))
-      (var "cx")
-      (Compute.flowStateTrace (var "f1")))
-
-traceSummary :: TBinding (Trace -> String)
-traceSummary = define "traceSummary" $
-  doc "Summarize a trace as a string" $
-  "t" ~>
-  "messageLines" <~ (Lists.nub (Compute.traceMessages $ var "t")) $
-  "toLine" <~ ("pair" ~>
-    string "\t" ++ (Core.unName $ (Pairs.first $ var "pair")) ++ string ": " ++ (ShowCore.term @@ (Pairs.second $ var "pair"))) $
-  "keyvalLines" <~ Logic.ifElse (Maps.null (Compute.traceOther $ var "t"))
-    (list ([] :: [TTerm String]))
-    (Lists.cons (string "key/value pairs: ")
-      (Lists.map (var "toLine") (Maps.toList (Compute.traceOther $ var "t")))) $
-  Strings.intercalate (string "\n") (Lists.concat2 (var "messageLines") (var "keyvalLines"))
-
-unexpected :: TBinding (String -> String -> Flow s x)
-unexpected = define "unexpected" $
-  doc "Fail if an actual value does not match an expected value" $
-  "expected" ~> "actual" ~>
-    fail @@ (string "expected " ++ var "expected" ++ string " but found " ++ var "actual")
-
-warn :: TBinding (String -> Flow s a -> Flow s a)
-warn = define "warn" $
-  doc "Continue the current flow after adding a warning message" $
-  "msg" ~> "b" ~> Compute.flow (
-    "s0" ~> "t0" ~>
-    "f1" <~ Compute.unFlow (var "b") (var "s0") (var "t0") $
-    "addMessage" <~ ("t" ~> Compute.trace
-      (Compute.traceStack (var "t"))
-      (Lists.cons (string "Warning: " ++ var "msg") (Compute.traceMessages (var "t")))
-      (Compute.traceOther (var "t"))) $
-    Compute.flowState
-      (Compute.flowStateValue (var "f1"))
-      (Compute.flowStateState (var "f1"))
-      (var "addMessage" @@ (Compute.flowStateTrace (var "f1"))))
-
-withFlag = define "withFlag" $
-  doc "Continue the current flow after setting a flag" $
-  "flag" ~> "f" ~>
-  "mutate" <~ ("t" ~> Logic.ifElse
-    (boolean False)
-    (left (string "never happens"))  -- Forces the left type to String
-    (right (Compute.trace
-      (Compute.traceStack (var "t"))
-      (Compute.traceMessages (var "t"))
-      (Maps.insert (var "flag") (Core.termLiteral (Core.literalBoolean (boolean True))) (Compute.traceOther (var "t")))))) $
-  "restore" <~ ("ignored" ~> "t1" ~> Compute.trace
-    (Compute.traceStack (var "t1"))
-    (Compute.traceMessages (var "t1"))
-    (Maps.delete (var "flag") (Compute.traceOther (var "t1")))) $
-  mutateTrace @@ var "mutate" @@ var "restore" @@ var "f"
-
-withState :: TBinding (s1 -> Flow s1 a -> Flow s2 a)
-withState = define "withState" $
-  doc "Continue a flow using a given state" $
-  "cx0" ~> "f" ~>
-  Compute.flow (
-    "cx1" ~> "t1" ~>
-    "f1" <~ Compute.unFlow (var "f") (var "cx0") (var "t1") $
-    Compute.flowState
-      (Compute.flowStateValue (var "f1"))
-      (var "cx1")
-      (Compute.flowStateTrace (var "f1")))
-
-withTrace :: TBinding (String -> Flow s a -> Flow s a)
-withTrace = define "withTrace" $
-  doc "Continue the current flow after augmenting the trace" $
-  "msg" ~> "f" ~>
-  "mutate" <~ ("t" ~> Logic.ifElse (Equality.gte (Lists.length (Compute.traceStack (var "t"))) Constants.maxTraceDepth)
-    (left (string "maximum trace depth exceeded. This may indicate an infinite loop"))
-    (right (Compute.trace
-      (Lists.cons (var "msg") (Compute.traceStack (var "t")))
-      (Compute.traceMessages (var "t"))
-      (Compute.traceOther (var "t"))))) $
-  "restore" <~ ("t0" ~> "t1" ~> Compute.trace
-    (Compute.traceStack (var "t0"))
-    (Compute.traceMessages (var "t1"))
-    (Compute.traceOther (var "t1"))) $
-  mutateTrace @@ var "mutate" @@ var "restore" @@ var "f"
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Names.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Names.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Names.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Names.hs
@@ -6,21 +6,18 @@
   compactName, localNameOf, namespaceOf, namespaceToFilePath, qname, qualifyName,
   uniqueLabel, unqualifyName)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -35,18 +32,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -69,14 +66,14 @@
     Just ("Functions for working with qualified names.")
   where
    elements = [
-     toBinding compactName,
-     toBinding localNameOf,
-     toBinding namespaceOf,
-     toBinding namespaceToFilePath,
-     toBinding qname,
-     toBinding qualifyName,
-     toBinding uniqueLabel,
-     toBinding unqualifyName]
+     toTermDefinition compactName,
+     toTermDefinition localNameOf,
+     toTermDefinition namespaceOf,
+     toTermDefinition namespaceToFilePath,
+     toTermDefinition qname,
+     toTermDefinition qualifyName,
+     toTermDefinition uniqueLabel,
+     toTermDefinition unqualifyName]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -112,7 +109,7 @@
   lambda "caseConv" $ lambda "ext" $ lambda "ns" $ lets [
     "parts">: Lists.map
       (Formatting.convertCase @@ Util.caseConventionCamel @@ var "caseConv")
-      (Strings.splitOn (string ".") (Core.unNamespace $ var "ns"))]
+      (Strings.splitOn (string ".") (Module.unNamespace $ var "ns"))]
     $ (Strings.intercalate (string "/") $ var "parts") ++ string "." ++ (Module.unFileExtension $ var "ext")
 
 qname :: TBinding (Namespace -> String -> Name)
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Parsers.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Parsers.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Parsers.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Parsers.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (map)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +30,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (apply, bind, char, map)
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++), pure, fail, map)
@@ -65,26 +62,26 @@
     Just "General-purpose parser combinators"
   where
    elements = [
-     toBinding alt,
-     toBinding anyChar,
-     toBinding apply,
-     toBinding between,
-     toBinding bind,
-     toBinding char,
-     toBinding choice,
-     toBinding eof,
-     toBinding fail,
-     toBinding lazy,
-     toBinding many,
-     toBinding map,
-     toBinding optional,
-     toBinding pure,
-     toBinding runParser,
-     toBinding satisfy,
-     toBinding sepBy,
-     toBinding sepBy1,
-     toBinding some,
-     toBinding string_]
+     toTermDefinition alt,
+     toTermDefinition anyChar,
+     toTermDefinition apply,
+     toTermDefinition between,
+     toTermDefinition bind,
+     toTermDefinition char,
+     toTermDefinition choice,
+     toTermDefinition eof,
+     toTermDefinition fail,
+     toTermDefinition lazy,
+     toTermDefinition many,
+     toTermDefinition map,
+     toTermDefinition optional,
+     toTermDefinition pure,
+     toTermDefinition runParser,
+     toTermDefinition satisfy,
+     toTermDefinition sepBy,
+     toTermDefinition sepBy1,
+     toTermDefinition some,
+     toTermDefinition string_]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -94,13 +91,13 @@
 alt = define "alt" $
   doc "Try the first parser; if it fails without consuming input, try the second" $
   "p1" ~> "p2" ~>
-  "parse" <~ ("input" ~> cases _ParseResult (Parsing.runParser (var "p1") (var "input")) Nothing [
+  "parse" <~ ("input" ~> cases _ParseResult (unwrap _Parser @@ (var "p1") @@ (var "input")) Nothing [
     _ParseResult_success>>: "s" ~>
       Parsing.parseResultSuccess (var "s"),
     _ParseResult_failure>>: "e" ~>
       -- Only try alternative if no input was consumed
       Logic.ifElse (Equality.equal (Parsing.parseErrorRemainder $ var "e") (var "input"))
-        (Parsing.runParser (var "p2") (var "input"))
+        (unwrap _Parser @@ (var "p2") @@ (var "input"))
         (Parsing.parseResultFailure (var "e"))]) $
   Parsing.parser (var "parse")
 
@@ -115,9 +112,9 @@
 apply = define "apply" $
   doc "Apply a parser containing a function to a parser containing a value" $
   "pf" ~> "pa" ~>
-  "parse" <~ ("input" ~> cases _ParseResult (Parsing.runParser (var "pf") (var "input")) Nothing [
+  "parse" <~ ("input" ~> cases _ParseResult (unwrap _Parser @@ (var "pf") @@ (var "input")) Nothing [
     _ParseResult_success>>: "sf" ~>
-      cases _ParseResult (Parsing.runParser (var "pa") (Parsing.parseSuccessRemainder $ var "sf")) Nothing [
+      cases _ParseResult (unwrap _Parser @@ (var "pa") @@ (Parsing.parseSuccessRemainder $ var "sf")) Nothing [
         _ParseResult_success>>: "sa" ~>
           Parsing.parseResultSuccess (Parsing.parseSuccess
             ((Parsing.parseSuccessValue $ var "sf") @@ (Parsing.parseSuccessValue $ var "sa"))
@@ -143,10 +140,10 @@
 bind = define "bind" $
   doc "Sequence two parsers, passing the result of the first to a function that produces the second" $
   "pa" ~> "f" ~>
-  "parse" <~ ("input" ~> cases _ParseResult (Parsing.runParser (var "pa") (var "input")) Nothing [
+  "parse" <~ ("input" ~> cases _ParseResult (unwrap _Parser @@ (var "pa") @@ (var "input")) Nothing [
     _ParseResult_success>>: "s" ~>
-      Parsing.runParser
-        (var "f" @@ (Parsing.parseSuccessValue $ var "s"))
+      unwrap _Parser @@
+        (var "f" @@ (Parsing.parseSuccessValue $ var "s")) @@
         (Parsing.parseSuccessRemainder $ var "s"),
     _ParseResult_failure>>: "e" ~>
       Parsing.parseResultFailure (var "e")]) $
@@ -191,7 +188,7 @@
     <> " This is essential for breaking recursive parser definitions.") $
   "f" ~>
   Parsing.parser ("input" ~>
-    Parsing.runParser (var "f" @@ unit) (var "input"))
+    unwrap _Parser @@ (var "f" @@ unit) @@ (var "input"))
 
 -- | Parse zero or more occurrences
 many :: TBinding (Parser a -> Parser [a])
@@ -205,7 +202,7 @@
 map = define "map" $
   doc "Apply a function to the result of a parser" $
   "f" ~> "pa" ~>
-  "parse" <~ ("input" ~> cases _ParseResult (Parsing.runParser (var "pa") (var "input")) Nothing [
+  "parse" <~ ("input" ~> cases _ParseResult (unwrap _Parser @@ (var "pa") @@ (var "input")) Nothing [
     _ParseResult_success>>: "s" ~>
       Parsing.parseResultSuccess (Parsing.parseSuccess
         (var "f" @@ (Parsing.parseSuccessValue $ var "s"))
@@ -236,7 +233,7 @@
 runParser = define "runParser" $
   doc "Run a parser on the given input string" $
   "p" ~> "input" ~>
-    Parsing.runParser (var "p") (var "input")
+    unwrap _Parser @@ (var "p") @@ (var "input")
 
 -- | Parse a character that satisfies a predicate (characters represented as codepoints)
 satisfy :: TBinding ((Int -> Bool) -> Parser Int)
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Reduction.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Reduction.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Reduction.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Reduction.hs
@@ -5,21 +5,18 @@
   alphaConvert, betaReduceType, contractTerm, countPrimitiveInvocations, etaReduceTerm, etaExpandTerm, etaExpandTermNew, etaExpansionArity, etaExpandTypedTerm,
   reduceTerm, termIsClosed, termIsValue)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -34,19 +31,21 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
 import qualified Data.Int                    as I
@@ -61,9 +60,11 @@
 import qualified Hydra.Sources.Kernel.Terms.Hoisting as Hoisting
 import qualified Hydra.Sources.Kernel.Terms.Inference as Inference
 import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
+
 import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Schemas as Schemas
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors as ShowError
 import qualified Hydra.Sources.Kernel.Terms.Annotations as Annotations
 
 
@@ -77,24 +78,27 @@
 module_ = Module ns elements
     [Arity.ns, Checking.ns, ExtractCore.ns, Hoisting.ns, Inference.ns, Lexical.ns,
       Rewriting.ns,
-      Schemas.ns, ShowCore.ns]
+      Schemas.ns, ShowCore.ns, ShowError.ns]
     kernelTypesNamespaces $
     Just "Functions for reducing terms and types, i.e. performing computations."
   where
    elements = [
-     toBinding alphaConvert,
-     toBinding betaReduceType,
-     toBinding contractTerm,
-     toBinding countPrimitiveInvocations,
-     toBinding etaReduceTerm,
-     toBinding etaExpandTerm,
-     toBinding etaExpandTermNew,
-     toBinding etaExpansionArity,
-     toBinding etaExpandTypedTerm,
-     toBinding reduceTerm,
-     toBinding termIsClosed,
-     toBinding termIsValue]
+     toTermDefinition alphaConvert,
+     toTermDefinition betaReduceType,
+     toTermDefinition contractTerm,
+     toTermDefinition countPrimitiveInvocations,
+     toTermDefinition etaReduceTerm,
+     toTermDefinition etaExpandTerm,
+     toTermDefinition etaExpandTermNew,
+     toTermDefinition etaExpansionArity,
+     toTermDefinition etaExpandTypedTerm,
+     toTermDefinition reduceTerm,
+     toTermDefinition termIsClosed,
+     toTermDefinition termIsValue]
 
+formatError :: TTerm (InContext Error -> String)
+formatError = "_fic" ~> ShowError.error_ @@ Ctx.inContextObject (var "_fic")
+
 alphaConvert :: TBinding (Name -> Name -> Term -> Term)
 alphaConvert = define "alphaConvert" $
   doc "Alpha convert a variable in a term" $
@@ -103,10 +107,10 @@
 
 -- Note: this is eager beta reduction, in that we always descend into subtypes,
 --       and always reduce the right-hand side of an application prior to substitution
-betaReduceType :: TBinding (Type -> Flow Graph Type)
+betaReduceType :: TBinding (Context -> Graph -> Type -> Prelude.Either (InContext Error) Type)
 betaReduceType = define "betaReduceType" $
   doc "Eagerly beta-reduce a type by substituting type arguments into type lambdas" $
-  "typ" ~>
+  "cx" ~> "graph" ~> "typ" ~>
   "reduceApp" <~ ("app" ~>
     "lhs" <~ Core.applicationTypeFunction (var "app") $
     "rhs" <~ Core.applicationTypeArgument (var "app") $
@@ -115,18 +119,18 @@
         "a" <<~ var "reduceApp" @@ (Core.applicationType
           (Core.annotatedTypeBody $ var "at")
           (var "rhs")) $
-        Flows.pure $ Core.typeAnnotated $ Core.annotatedType (var "a") (Core.annotatedTypeAnnotation $ var "at"),
+        right $ Core.typeAnnotated $ Core.annotatedType (var "a") (Core.annotatedTypeAnnotation $ var "at"),
       _Type_forall>>: "ft" ~>
-        betaReduceType @@ (Rewriting.replaceFreeTypeVariable
+        betaReduceType @@ var "cx" @@ var "graph" @@ (Rewriting.replaceFreeTypeVariable
           @@ (Core.forallTypeParameter $ var "ft")
           @@ var "rhs"
           @@ (Core.forallTypeBody $ var "ft")),
       _Type_variable>>: "name" ~>
-        "t'" <<~ Schemas.requireType @@ var "name" $
-        betaReduceType @@ (Core.typeApplication $ Core.applicationType (var "t'") (var "rhs"))]) $
+        "t'" <<~ Schemas.requireType @@ var "cx" @@ var "graph" @@ var "name" $
+        betaReduceType @@ var "cx" @@ var "graph" @@ (Core.typeApplication $ Core.applicationType (var "t'") (var "rhs"))]) $
   "mapExpr" <~ ("recurse" ~> "t" ~>
     "findApp" <~ ("r" ~> cases _Type (var "r")
-      (Just $ Flows.pure $ var "r") [
+      (Just $ right $ var "r") [
       _Type_application>>: "a" ~> var "reduceApp" @@ var "a"]) $
     "r" <<~ var "recurse" @@ var "t" $
     var "findApp" @@ var "r") $
@@ -202,23 +206,26 @@
         var "rewrite" @@ (Lists.cons (var "erhs") (var "args")) @@ var "recurse" @@ var "lhs"]) $
   contractTerm @@ (Rewriting.rewriteTerm @@ (var "rewrite" @@ list ([] :: [TTerm Term])) @@ var "term")
 
--- | Eta-expand a term using TypeContext for type lookups. This is a pure function that does not
--- require type inference, instead relying on the TypeContext being properly populated with types
+-- | Eta-expand a term using Graph for type lookups. This is a pure function that does not
+-- require type inference, instead relying on the Graph being properly populated with types
 -- for all in-scope variables.
 --
 -- The key differences from etaExpandTypedTerm:
--- 1. Pure (no Flow monad needed) because we look up types directly from the context
--- 2. Manually tracks TypeContext when entering lambdas, lets, and type lambdas
+-- 1. Pure because we look up types directly from the context
+-- 2. Manually tracks Graph when entering lambdas, lets, and type lambdas
 -- 3. Preserves existing type annotations where possible
-etaExpandTermNew :: TBinding (TypeContext -> Term -> Term)
+etaExpandTermNew :: TBinding (Graph -> Term -> Term)
 etaExpandTermNew = define "etaExpandTermNew" $
   doc ("Recursively transform terms to eliminate partial application, e.g. 'add 42' becomes '\\x.add 42 x'."
-    <> " Uses the TypeContext to look up types for arity calculation."
+    <> " Uses the Graph to look up types for arity calculation."
     <> " Bare primitives and variables are NOT expanded; eliminations and partial applications are."
-    <> " This version properly tracks the TypeContext through nested scopes.") $
+    <> " This version properly tracks the Graph through nested scopes.") $
   "tx0" ~> "term0" ~>
 
-  -- termArityWithContext: compute arity of a term using TypeContext for lookups
+  -- Pre-compute primitive types map once (primitives don't change during recursion)
+  "primTypes" <~ (Graph.graphPrimitiveTypes $ var "tx0") $
+
+  -- termArityWithContext: compute arity of a term using Graph for lookups
   "termArityWithContext" <~ ("tx" ~> "term" ~>
     cases _Term (var "term")
       (Just $ int32 0) [
@@ -230,20 +237,20 @@
         _Function_elimination>>: constant $ int32 1,
         _Function_lambda>>: constant $ int32 0,
         _Function_primitive>>: "name" ~>
-          optCases (Maps.lookup (var "name") (Typing.inferenceContextPrimitiveTypes $ Typing.typeContextInferenceContext $ var "tx"))
+          optCases (Maps.lookup (var "name") (var "primTypes"))
             (int32 0) Arity.typeSchemeArity],
       _Term_let>>: "l" ~>
         var "termArityWithContext"
-          @@ (Schemas.extendTypeContextForLet @@ constant (constant nothing) @@ var "tx" @@ var "l")
+          @@ (Rewriting.extendGraphForLet @@ constant (constant nothing) @@ var "tx" @@ var "l")
           @@ Core.letBody (var "l"),
       _Term_typeLambda>>: "tl" ~>
         var "termArityWithContext"
-          @@ (Schemas.extendTypeContextForTypeLambda @@ var "tx" @@ var "tl")
+          @@ (Rewriting.extendGraphForTypeLambda @@ var "tx" @@ var "tl")
           @@ Core.typeLambdaBody (var "tl"),
       _Term_typeApplication>>: "tat" ~>
         var "termArityWithContext" @@ var "tx" @@ Core.typeApplicationTermBody (var "tat"),
       _Term_variable>>: "name" ~>
-        optCases (Maps.lookup (var "name") (Typing.typeContextTypes $ var "tx"))
+        optCases (Maybes.map (Rewriting.typeSchemeToFType) $ Maps.lookup (var "name") (Graph.graphBoundTypes $ var "tx"))
           (int32 0) Arity.typeArity]) $
 
   -- domainTypes: extract domain types from a function type, returning a list of Maybe Type
@@ -264,8 +271,11 @@
               var "domainTypes" @@ var "n" @@ just (Core.annotatedTypeBody $ var "at"),
             _Type_application>>: "atyp" ~>
               var "domainTypes" @@ var "n" @@ just (Core.applicationTypeFunction $ var "atyp"),
-            _Type_forall>>: "ft" ~>
-              var "domainTypes" @@ var "n" @@ just (Core.forallTypeBody $ var "ft")]))) $
+            -- For forall types, we cannot use the body's domain types directly because the
+            -- forall-bound variable would become free in the lambda domain. Return Nothing
+            -- for all remaining positions, letting downstream code infer the types.
+            _Type_forall>>: constant $
+              Lists.map (constant nothing) (Math.range (int32 1) (var "n"))]))) $
 
   -- peelFunctionDomains: given a Maybe Type and a count, peel n function type domains.
   -- Returns the remaining type after stripping n arrow domains.
@@ -284,8 +294,9 @@
               var "peelFunctionDomains" @@ just (Core.annotatedTypeBody $ var "at") @@ var "n",
             _Type_application>>: "atyp" ~>
               var "peelFunctionDomains" @@ just (Core.applicationTypeFunction $ var "atyp") @@ var "n",
-            _Type_forall>>: "ft" ~>
-              var "peelFunctionDomains" @@ just (Core.forallTypeBody $ var "ft") @@ var "n"]))) $
+            -- For forall types, we cannot safely peel through the body because forall-bound
+            -- variables would become free in the result. Return Nothing.
+            _Type_forall>>: constant nothing]))) $
 
   -- expand: apply args to head and pad with lambdas if needed
   -- alwaysPad: if true, pad even when args is empty (for eliminations)
@@ -346,15 +357,15 @@
           var "termHeadType" @@ var "tx2" @@ Core.annotatedTermBody (var "at2"),
         _Term_function>>: "f2" ~> cases _Function (var "f2") (Just nothing) [
           _Function_primitive>>: "pn2" ~>
-            Maybes.map ("ts2" ~> Core.typeSchemeType $ var "ts2")
-              (Maps.lookup (var "pn2") (Typing.inferenceContextPrimitiveTypes $ Typing.typeContextInferenceContext $ var "tx2"))],
+            Maybes.map Rewriting.typeSchemeToFType
+              (Maps.lookup (var "pn2") (var "primTypes"))],
         _Term_let>>: "l2" ~>
           var "termHeadType"
-            @@ (Schemas.extendTypeContextForLet @@ constant (constant nothing) @@ var "tx2" @@ var "l2")
+            @@ (Rewriting.extendGraphForLet @@ constant (constant nothing) @@ var "tx2" @@ var "l2")
             @@ Core.letBody (var "l2"),
         _Term_typeLambda>>: "tl2" ~>
           var "termHeadType"
-            @@ (Schemas.extendTypeContextForTypeLambda @@ var "tx2" @@ var "tl2")
+            @@ (Rewriting.extendGraphForTypeLambda @@ var "tx2" @@ var "tl2")
             @@ Core.typeLambdaBody (var "tl2"),
         _Term_typeApplication>>: "tat2" ~>
           -- Get the head type of the body, then substitute forall parameter with the type argument
@@ -366,7 +377,7 @@
                   @@ Core.typeApplicationTermType (var "tat2")
                   @@ Core.forallTypeBody (var "ft2")]),
         _Term_variable>>: "vn2" ~>
-          Maps.lookup (var "vn2") (Typing.typeContextTypes $ var "tx2")]) $
+          Maybes.map (Rewriting.typeSchemeToFType) $ Maps.lookup (var "vn2") (Graph.graphBoundTypes $ var "tx2")]) $
 
     -- afterRecursion: apply expansion logic after subterms have been processed
     "afterRecursion" <~ ("trm" ~>
@@ -375,7 +386,7 @@
       var "expand" @@ false @@ var "args" @@ var "arity" @@ var "hType" @@ var "trm") $
 
     -- Helper for processing fields (used in records, unions, but NOT case statement branches)
-    "forField" <~ ("f" ~> Core.fieldWithTerm (var "recurse" @@ var "tx" @@ Core.fieldTerm (var "f")) (var "f")) $
+    "forField" <~ ("f" ~> Core.fieldWithTerm (var "f") (var "recurse" @@ var "tx" @@ Core.fieldTerm (var "f"))) $
 
     -- Helper for case statement branches - forces expansion of the branch body
     -- This is needed because case branches represent partial function values that need full expansion
@@ -383,7 +394,7 @@
       "branchBody" <~ var "recurse" @@ var "tx" @@ Core.fieldTerm (var "f") $
       "arty" <~ var "termArityWithContext" @@ var "tx" @@ var "branchBody" $
       "branchHType" <~ var "termHeadType" @@ var "tx" @@ var "branchBody" $
-      Core.fieldWithTerm (var "expand" @@ true @@ list ([] :: [TTerm Term]) @@ var "arty" @@ var "branchHType" @@ var "branchBody") (var "f")) $
+      Core.fieldWithTerm (var "f") (var "expand" @@ true @@ list ([] :: [TTerm Term]) @@ var "arty" @@ var "branchHType" @@ var "branchBody")) $
 
     -- Helper for eliminations
     "forElimination" <~ ("elm" ~> cases _Elimination (var "elm") Nothing [
@@ -437,7 +448,7 @@
                 Core.typeUnit] $
           var "expand" @@ var "padElim" @@ var "args" @@ (int32 1) @@ var "elimHeadType" @@ var "elimTerm",
         _Function_lambda>>: "lm" ~>
-          "tx1" <~ Schemas.extendTypeContextForLambda @@ var "tx" @@ var "lm" $
+          "tx1" <~ Rewriting.extendGraphForLambda @@ var "tx" @@ var "lm" $
           "body" <~ var "rewriteWithArgs" @@ list ([] :: [TTerm Term]) @@ var "tx1" @@ Core.lambdaBody (var "lm") $
           "result" <~ Core.termFunction (Core.functionLambda $
             Core.lambda (Core.lambdaParameter $ var "lm") (Core.lambdaDomain $ var "lm") (var "body")) $
@@ -448,12 +459,12 @@
           -- Don't expand if bare; look up primitive type for lambda domain annotations
           "arty" <~ var "termArityWithContext" @@ var "tx" @@ var "term" $
           "primType" <~ Maybes.map ("ts" ~> Core.typeSchemeType $ var "ts")
-            (Maps.lookup (var "pn") (Typing.inferenceContextPrimitiveTypes $ Typing.typeContextInferenceContext $ var "tx")) $
+            (Maps.lookup (var "pn") (var "primTypes")) $
           var "expand" @@ false @@ var "args" @@ var "arty" @@ var "primType" @@ var "term"],
 
       -- Let: extend context for bindings and body
       _Term_let>>: "lt" ~>
-        "tx1" <~ Schemas.extendTypeContextForLet @@ constant (constant nothing) @@ var "tx" @@ var "lt" $
+        "tx1" <~ Rewriting.extendGraphForLet @@ constant (constant nothing) @@ var "tx" @@ var "lt" $
         "mapBinding" <~ ("b" ~> Core.binding
           (Core.bindingName $ var "b")
           (var "rewriteWithArgs" @@ list ([] :: [TTerm Term]) @@ var "tx1" @@ Core.bindingTerm (var "b"))
@@ -498,7 +509,7 @@
 
       -- TypeLambda: extend context for body
       _Term_typeLambda>>: "tl" ~>
-        "tx1" <~ Schemas.extendTypeContextForTypeLambda @@ var "tx" @@ var "tl" $
+        "tx1" <~ Rewriting.extendGraphForTypeLambda @@ var "tx" @@ var "tl" $
         "result" <~ Core.termTypeLambda (Core.typeLambda
           (Core.typeLambdaParameter $ var "tl")
           (var "rewriteWithArgs" @@ list ([] :: [TTerm Term]) @@ var "tx1" @@ Core.typeLambdaBody (var "tl"))) $
@@ -515,7 +526,7 @@
       -- Variable: don't expand if bare; look up type for lambda domain annotations
       _Term_variable>>: "vn" ~>
         "arty" <~ var "termArityWithContext" @@ var "tx" @@ var "term" $
-        "varType" <~ Maps.lookup (var "vn") (Typing.typeContextTypes $ var "tx") $
+        "varType" <~ Maybes.map (Rewriting.typeSchemeToFType) (Maps.lookup (var "vn") (Graph.graphBoundTypes $ var "tx")) $
         var "expand" @@ false @@ var "args" @@ var "arty" @@ var "varType" @@ var "term",
 
       -- Wrap: recurse into body
@@ -525,7 +536,7 @@
 
   contractTerm @@ (var "rewriteWithArgs" @@ list ([] :: [TTerm Term]) @@ var "tx0" @@ var "term0")
 
--- TODO: this function probably needs to be replaced with a function which takes not only a Graph, but a TypeContext.
+-- TODO: this function probably needs to be replaced with a function which takes not only a Graph, but an extended Graph.
 --       etaExpansionArity won't give the correct answer unless it has access to the full lexical environment
 --       of each subterm in which it is applied, including lambda-bound variables as well as nested let-bound variables.
 --       The new function need not be monadic, because we don't need to call typeOf; it just needs accurate type lookups.
@@ -557,7 +568,7 @@
           ("b" ~> Core.bindingType $ var "b"))]
 
 -- TODO: add lambda domains as part of the rewriting process, so inference does not need to be performed again.
-etaExpandTypedTerm :: TBinding (TypeContext -> Term -> Flow s Term)
+etaExpandTypedTerm :: TBinding (Context -> Graph -> Term -> Prelude.Either (InContext Error) Term)
 etaExpandTypedTerm = define "etaExpandTypedTerm" $
   doc ("Recursively transform arbitrary terms like 'add 42' into terms like '\\x.add 42 x',"
     <> " eliminating partial application. Variable references are not expanded."
@@ -566,40 +577,41 @@
     <> " It also assumes that type inference has already been performed."
     <> " After eta expansion, type inference needs to be performed again, as new, untyped lambdas may have been added."
     ) $
-  "tx0" ~> "term0" ~>
+  "cx" ~> "tx0" ~> "term0" ~>
   "rewrite" <~ ("topLevel" ~> "forced" ~> "typeArgs" ~> "recurse" ~> "tx" ~> "term" ~>
     "rewriteSpine" <~ ("term" ~> cases _Term (var "term")
       (Just $ var "rewrite" @@ false @@ false @@ list ([] :: [TTerm Type]) @@ var "recurse" @@ var "tx" @@ var "term") [
       _Term_annotated>>: "at" ~>
         "body" <<~ var "rewriteSpine" @@ Core.annotatedTermBody (var "at") $
         "ann" <~ Core.annotatedTermAnnotation (var "at") $
-        produce (Core.termAnnotated $ Core.annotatedTerm (var "body") (var "ann")),
+        right (Core.termAnnotated $ Core.annotatedTerm (var "body") (var "ann")),
       _Term_application>>: "a" ~>
         "l" <~ Logic.ifElse false (list [Core.typeLiteral Core.literalTypeString]) (list ([] :: [TTerm Type])) $ -- TODO: hack for type checking
         "lhs" <<~ var "rewriteSpine" @@ Core.applicationFunction (var "a") $
         "rhs" <<~ var "rewrite" @@ true @@ false @@ var "l" @@ var "recurse" @@ var "tx" @@ Core.applicationArgument (var "a") $
-        produce (Core.termApplication $ Core.application (var "lhs") (var "rhs")),
+        right (Core.termApplication $ Core.application (var "lhs") (var "rhs")),
       _Term_typeApplication>>: "tat" ~>
         "body" <<~ var "rewriteSpine" @@ Core.typeApplicationTermBody (var "tat") $
         "typ" <~ Core.typeApplicationTermType (var "tat") $
-        produce (Core.termTypeApplication $ Core.typeApplicationTerm (var "body") (var "typ"))]) $
+        right (Core.termTypeApplication $ Core.typeApplicationTerm (var "body") (var "typ"))]) $
 
     -- Arity as provided by type checking, but with exceptions which give us the desired behavior for
     -- targets including Python. Remove the special cases and see which regression tests fail.
     -- TODO: this function is moving toward "syntactic" arity which does not require type checking; only
     --       type lookups.
     "arityOf" <~ ("tx" ~> "term" ~>
-      "dflt" <~ Flows.map Arity.typeArity (Checking.typeOf @@ var "tx" @@ list ([] :: [TTerm Type]) @@ var "term") $
+      "dflt" <~ (Eithers.map ("_tc" ~> Arity.typeArity @@ Pairs.first (var "_tc"))
+          (Checking.typeOf @@ var "cx" @@ var "tx" @@ list ([] :: [TTerm Type]) @@ var "term")) $
       "forFunction" <~ ("tx" ~> "f" ~> cases _Function (var "f")
         Nothing [
-        _Function_elimination>>: constant $ produce $ int32 1,
+        _Function_elimination>>: constant $ right $ int32 1,
         _Function_lambda>>: "l" ~>
-          "txl" <~ Schemas.extendTypeContextForLambda @@ var "tx" @@ var "l" $
+          "txl" <~ Rewriting.extendGraphForLambda @@ var "tx" @@ var "l" $
           var "arityOf" @@ var "txl" @@ Core.lambdaBody (var "l"),
-        _Function_primitive>>: "name" ~> Flows.map
-          (Arity.typeSchemeArity)
-          (Lexical.requirePrimitiveType @@ var "tx" @@ var "name")]) $
---      trace ("arityOf(" ++ (ShowCore.term @@ var "term") ++ ")") $
+        _Function_primitive>>: "name" ~>
+          Eithers.map
+          ("_ts" ~> Arity.typeSchemeArity @@ var "_ts")
+          (Lexical.requirePrimitiveType @@ var "cx" @@ var "tx" @@ var "name")]) $
       cases _Term (var "term")
         (Just $ var "dflt") [
         _Term_annotated>>: "at" ~> var "arityOf" @@ var "tx" @@ Core.annotatedTermBody (var "at"),
@@ -608,21 +620,19 @@
         -- like identity where (id x) has the same arity as x.
         _Term_function>>: "f" ~> var "forFunction" @@ var "tx" @@ var "f",
         _Term_let>>: "l" ~>
-          "txl" <~ Schemas.extendTypeContextForLet @@ constant (constant nothing) @@ var "tx" @@ var "l" $
+          "txl" <~ Rewriting.extendGraphForLet @@ constant (constant nothing) @@ var "tx" @@ var "l" $
           var "arityOf" @@ var "txl" @@ Core.letBody (var "l"),
         _Term_typeApplication>>: "tat" ~> var "arityOf" @@ var "tx" @@ Core.typeApplicationTermBody (var "tat"),
         _Term_typeLambda>>: "tl" ~>
-          "txt" <~ Schemas.extendTypeContextForTypeLambda @@ var "tx" @@ var "tl" $
+          "txt" <~ Rewriting.extendGraphForTypeLambda @@ var "tx" @@ var "tl" $
           var "arityOf" @@ var "txt" @@ Core.typeLambdaBody (var "tl"),
-        _Term_variable>>: "name" ~> optCases (Maps.lookup (var "name") (Typing.typeContextTypes $ var "tx"))
-          -- Variable not in typeContextTypes; use typeOf with CURRENT context and variable term as fallback
+        _Term_variable>>: "name" ~> optCases (Maybes.map (Rewriting.typeSchemeToFType) $ Maps.lookup (var "name") (Graph.graphBoundTypes $ var "tx"))
+          -- Variable not in graphBoundTypes; use typeOf with CURRENT context and variable term as fallback
           -- This can happen with local let bindings that aren't yet in scope during eta expansion
-          (Flows.map Arity.typeArity (Checking.typeOf @@ var "tx" @@ list ([] :: [TTerm Type]) @@ Core.termVariable (var "name")))
-          ("t" ~> produce $ Arity.typeArity @@ var "t")]) $
+          (Eithers.map ("_tc" ~> Arity.typeArity @@ Pairs.first (var "_tc"))
+            (Checking.typeOf @@ var "cx" @@ var "tx" @@ list ([] :: [TTerm Type]) @@ Core.termVariable (var "name")))
+          ("t" ~> right $ Arity.typeArity @@ var "t")]) $
 
---    "arityOf" <~ ("term" ~> Flows.map
---      (Arity.typeArity)
---      (Checking.typeOf @@ var "tx" @@ list ([] :: [TTerm Type]) @@ var "term")) $
 
     "extraVariables" <~ ("n" ~> Lists.map ("i" ~> Core.name $ Strings.cat2 (string "v") (Literals.showInt32 $ var "i")) $
       Math.range (int32 1) (var "n")) $
@@ -639,9 +649,9 @@
       (var "term") (var "typeArgs")) $
 
     "forceExpansion" <~ ("t" ~>
-      "typ" <<~ Checking.typeOf @@ var "tx" @@ list ([] :: [TTerm Type]) @@ var "t" $
-      "arity" <~ Arity.typeArity @@ var "typ" $
-      produce $ var "padn" @@ var "arity" @@ (var "unwind" @@ var "t")) $
+      "typCx" <<~ Checking.typeOf @@ var "cx" @@ var "tx" @@ list ([] :: [TTerm Type]) @@ var "t" $
+      "arity" <~ Arity.typeArity @@ Pairs.first (var "typCx") $
+      right $ var "padn" @@ var "arity" @@ (var "unwind" @@ var "t")) $
 
     "recurseOrForce" <~ ("term" ~> Logic.ifElse (var "forced")
       (var "forceExpansion" @@ var "term")
@@ -649,7 +659,7 @@
 
     "forCase" <~ ("f" ~>
       "r" <<~ var "rewrite" @@ false @@ true @@ list ([] :: [TTerm Type]) @@ var "recurse" @@ var "tx" @@ Core.fieldTerm (var "f") $
-      produce $ Core.fieldWithTerm (var "r") (var "f")) $
+      right $ Core.fieldWithTerm (var "f") (var "r")) $
 
     -- Forcing case statement branches is intended for Python, where we cannot accept a branch which is simply
     -- a variable or a primitive reference; we need to expand these to lambdas.
@@ -658,17 +668,17 @@
       "tname" <~ Core.caseStatementTypeName (var "cs") $
       "dflt" <~ Core.caseStatementDefault (var "cs") $
       "cases" <~ Core.caseStatementCases (var "cs") $
-      "rdflt" <<~ Flows.mapMaybe (var "rewrite" @@ false @@ false @@ list ([] :: [TTerm Type]) @@ var "recurse" @@ var "tx") (var "dflt") $
-      "rcases" <<~ Flows.mapList (var "forCase") (var "cases") $
-      produce $ Core.termFunction $ Core.functionElimination $ Core.eliminationUnion $
+      "rdflt" <<~ Eithers.mapMaybe (var "rewrite" @@ false @@ false @@ list ([] :: [TTerm Type]) @@ var "recurse" @@ var "tx") (var "dflt") $
+      "rcases" <<~ Eithers.mapList (var "forCase") (var "cases") $
+      right $ Core.termFunction $ Core.functionElimination $ Core.eliminationUnion $
         Core.caseStatement (var "tname") (var "rdflt") (var "rcases")) $
 
     "forElimination" <~ ("elm" ~>
       "checkBase" <~ ("elm" ~> cases _Elimination (var "elm")
         (Just $ var "recurse" @@ var "tx" @@ var "term") [
         _Elimination_union>>: "cs" ~> var "forCaseStatement" @@ var "cs"]) $
-      "base" <<~ Flows.map (var "unwind") (var "checkBase" @@ var "elm") $
-      produce $ Logic.ifElse (Logic.or (var "topLevel") (var "forced"))
+      "base" <<~ Eithers.map (var "unwind") (var "checkBase" @@ var "elm") $
+      right $ Logic.ifElse (Logic.or (var "topLevel") (var "forced"))
         (var "padn" @@ int32 1 @@ var "base")
         (var "base")) $
 
@@ -681,26 +691,25 @@
         "lhsarity" <<~ var "arityOf" @@ var "tx" @@ var "lhs" $
         "lhs2" <<~ var "rewriteSpine" @@ var "lhs" $
         "a2" <~ Core.termApplication (Core.application (var "lhs2") (var "rhs2")) $
-        produce $ Logic.ifElse (Equality.gt (var "lhsarity") (int32 1))
+        right $ Logic.ifElse (Equality.gt (var "lhsarity") (int32 1))
           (var "padn" @@ (Math.sub (var "lhsarity") (int32 1)) @@ var "a2")
           (var "a2"),
       _Term_function>>: "f" ~> cases _Function (var "f")
         (Just $ var "recurseOrForce" @@ var "term") [
         _Function_elimination>>: "elm" ~> var "forElimination" @@ var "elm",
         _Function_lambda>>: "l" ~>
-          "txl" <~ Schemas.extendTypeContextForLambda @@ var "tx" @@ var "l" $
-           Flows.map (var "unwind") (var "recurse" @@ var "txl" @@ var "term")],
+          "txl" <~ Rewriting.extendGraphForLambda @@ var "tx" @@ var "l" $
+           Eithers.map (var "unwind") (var "recurse" @@ var "txl" @@ var "term")],
       _Term_let>>: "l" ~>
-        "txlt" <~ Schemas.extendTypeContextForLet @@ constant (constant nothing) @@ var "tx" @@ var "l" $
+        "txlt" <~ Rewriting.extendGraphForLet @@ constant (constant nothing) @@ var "tx" @@ var "l" $
         var "recurse" @@ var "txlt" @@ var "term",
       _Term_typeApplication>>: "tat" ~> var "rewrite" @@ var "topLevel" @@ var "forced"
         @@ (Lists.cons (Core.typeApplicationTermType $ var "tat") (var "typeArgs"))
         @@ var "recurse" @@ var "tx"
         @@ Core.typeApplicationTermBody (var "tat"),
       _Term_typeLambda>>: "tl" ~>
-        "txt" <~ Schemas.extendTypeContextForTypeLambda @@ var "tx" @@ var "tl" $
+        "txt" <~ Rewriting.extendGraphForTypeLambda @@ var "tx" @@ var "tl" $
         var "recurse" @@ var "txt" @@ var "term"]) $
---  trace ("term0: " ++ (ShowCore.term @@ var "term0")) $
   Rewriting.rewriteTermWithContextM @@ (var "rewrite" @@ true @@ false @@ list ([] :: [TTerm Type])) @@ var "tx0" @@ var "term0"
 
 etaReduceTerm :: TBinding (Term -> Term)
@@ -742,11 +751,11 @@
         (Just $ var "noChange") [
         _Function_lambda>>: "l" ~> var "reduceLambda" @@ var "l"]]
 
-reduceTerm :: TBinding (Bool -> Term -> Flow Graph Term)
+reduceTerm :: TBinding (Context -> Graph -> Bool -> Term -> Prelude.Either (InContext Error) Term)
 reduceTerm = define "reduceTerm" $
   doc "A term evaluation function which is alternatively lazy or eager" $
-  "eager" ~> "term" ~>
-  "reduce" <~ ("eager" ~> reduceTerm @@ var "eager") $
+  "cx" ~> "graph" ~> "eager" ~> "term" ~>
+  "reduce" <~ ("eager" ~> reduceTerm @@ var "cx" @@ var "graph" @@ var "eager") $
   "doRecurse" <~ ("eager" ~> "term" ~>
     "isNonLambda" <~ ("f" ~> cases _Function (var "f")
       (Just true) [
@@ -759,7 +768,7 @@
     Logic.and (var "eager") (var "isNonLambdaTerm")) $
   "reduceArg" <~ ("eager" ~> "arg" ~>
     Logic.ifElse (var "eager")
-      (Flows.pure $ var "arg")
+      (right $ var "arg")
       (var "reduce" @@ false @@ var "arg")) $
   "applyToArguments" <~ ("fun" ~> "args" ~>
     Logic.ifElse (Lists.null $ var "args")
@@ -767,48 +776,52 @@
       (var "applyToArguments" @@
         (Core.termApplication $ Core.application (var "fun") (Lists.head $ var "args")) @@
         (Lists.tail $ var "args"))) $
+  "mapErrorToString" <~ ("ic" ~>
+    Ctx.inContext
+      (Error.errorOther $ Error.otherError (ShowError.error_ @@ Ctx.inContextObject (var "ic")))
+      (Ctx.inContextContext $ var "ic")) $
   "applyElimination" <~ ("elm" ~> "reducedArg" ~>
     cases _Elimination (var "elm") Nothing [
       _Elimination_record>>: "proj" ~>
-        "fields" <<~ ExtractCore.record @@ (Core.projectionTypeName $ var "proj") @@ (Rewriting.deannotateTerm @@ var "reducedArg") $
+        "fields" <<~ ExtractCore.record @@ var "cx" @@ (Core.projectionTypeName $ var "proj") @@ var "graph" @@ (Rewriting.deannotateTerm @@ var "reducedArg") $
         "matchingFields" <~ Lists.filter
           ("f" ~> Equality.equal (Core.fieldName $ var "f") (Core.projectionField $ var "proj"))
           (var "fields") $
         Logic.ifElse
           (Lists.null $ var "matchingFields")
-          (Flows.fail $ Strings.cat $ list [
+          (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat $ list [
             string "no such field: ",
             unwrap _Name @@ (Core.projectionField $ var "proj"),
             string " in ",
             unwrap _Name @@ (Core.projectionTypeName $ var "proj"),
-            string " record"])
-          (Flows.pure $ Core.fieldTerm $ Lists.head $ var "matchingFields"),
+            string " record"])) (var "cx"))
+          (right $ Core.fieldTerm $ Lists.head $ var "matchingFields"),
       _Elimination_union>>: "cs" ~>
-        "field" <<~ ExtractCore.injection @@ (Core.caseStatementTypeName $ var "cs") @@ var "reducedArg" $
+        "field" <<~ ExtractCore.injection @@ var "cx" @@ (Core.caseStatementTypeName $ var "cs") @@ var "graph" @@ var "reducedArg" $
         "matchingFields" <~ Lists.filter
           ("f" ~> Equality.equal (Core.fieldName $ var "f") (Core.fieldName $ var "field"))
           (Core.caseStatementCases $ var "cs") $
         Logic.ifElse (Lists.null $ var "matchingFields")
           (Maybes.maybe
-            (Flows.fail $ Strings.cat $ list [
+            (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat $ list [
               string "no such field ",
               unwrap _Name @@ (Core.fieldName $ var "field"),
               string " in ",
               unwrap _Name @@ (Core.caseStatementTypeName $ var "cs"),
-              string " case statement"])
-            (unaryFunction Flows.pure)
+              string " case statement"])) (var "cx"))
+            (unaryFunction right)
             (Core.caseStatementDefault $ var "cs"))
-          (Flows.pure $ Core.termApplication $ Core.application
+          (right $ Core.termApplication $ Core.application
             (Core.fieldTerm $ Lists.head $ var "matchingFields")
             (Core.fieldTerm $ var "field")),
-      _Elimination_wrap>>: "name" ~> ExtractCore.wrap @@ var "name" @@ var "reducedArg"]) $
+      _Elimination_wrap>>: "name" ~> ExtractCore.wrap @@ var "cx" @@ var "name" @@ var "graph" @@ var "reducedArg"]) $
   "applyIfNullary" <~ ("eager" ~> "original" ~> "args" ~>
     "stripped" <~ Rewriting.deannotateTerm @@ var "original" $
     "forElimination" <~ ("elm" ~> "args" ~>
       "arg" <~ Lists.head (var "args") $
       "remainingArgs" <~ Lists.tail (var "args") $
       "reducedArg" <<~ var "reduceArg" @@ var "eager" @@ (Rewriting.deannotateTerm @@ var "arg") $
-      "reducedResult" <<~ Flows.bind (var "applyElimination" @@ var "elm" @@ var "reducedArg") (var "reduce" @@ var "eager") $
+      "reducedResult" <<~ Eithers.bind (var "applyElimination" @@ var "elm" @@ var "reducedArg") (var "reduce" @@ var "eager") $
       var "applyIfNullary" @@ var "eager" @@ var "reducedResult" @@ var "remainingArgs") $
     "forLambda" <~ ("l" ~> "args" ~>
       "param" <~ Core.lambdaParameter (var "l") $
@@ -822,39 +835,38 @@
     "forPrimitive" <~ ("prim" ~> "arity" ~> "args" ~>
       "argList" <~ Lists.take (var "arity") (var "args") $
       "remainingArgs" <~ Lists.drop (var "arity") (var "args") $
-      "reducedArgs" <<~ Flows.mapList (var "reduceArg" @@ var "eager") (var "argList") $
+      "reducedArgs" <<~ Eithers.mapList (var "reduceArg" @@ var "eager") (var "argList") $
       -- Strip annotations from reduced args so primitives can extract values properly
       "strippedArgs" <~ Lists.map Rewriting.deannotateTerm (var "reducedArgs") $
-      "reducedResult" <<~ Flows.bind
-        (Graph.primitiveImplementation (var "prim") @@ var "strippedArgs")
-        (var "reduce" @@ var "eager") $
+      "primResult" <<~ Eithers.bimap (var "mapErrorToString") ("x" ~> var "x") (Graph.primitiveImplementation (var "prim") @@ var "cx" @@ var "graph" @@ var "strippedArgs") $
+      "reducedResult" <<~ var "reduce" @@ var "eager" @@ var "primResult" $
       var "applyIfNullary" @@ var "eager" @@ var "reducedResult" @@ var "remainingArgs") $
     cases _Term (var "stripped")
-      (Just $ Flows.pure $ var "applyToArguments" @@ var "original" @@ var "args") [
+      (Just $ right $ var "applyToArguments" @@ var "original" @@ var "args") [
       _Term_application>>: "app" ~> var "applyIfNullary" @@ var "eager" @@
         (Core.applicationFunction $ var "app") @@
         (Lists.cons (Core.applicationArgument $ var "app") (var "args")),
       _Term_function>>: match _Function Nothing [
           _Function_elimination>>: "elm" ~>
             Logic.ifElse (Lists.null $ var "args")
-              (Flows.pure $ var "original")
+              (right $ var "original")
               (var "forElimination" @@ var "elm" @@ var "args"),
           _Function_lambda>>: "l" ~>
             Logic.ifElse (Lists.null $ var "args")
-              (Flows.pure $ var "original")
+              (right $ var "original")
               (var "forLambda" @@ var "l" @@ var "args"),
           _Function_primitive>>: "name" ~>
-            "prim" <<~ Lexical.requirePrimitive @@ var "name" $
+            "prim" <<~ Lexical.requirePrimitive @@ var "cx" @@ var "graph" @@ var "name" $
             "arity" <~ Arity.primitiveArity @@ var "prim" $
             Logic.ifElse (Equality.gt (var "arity") (Lists.length $ var "args"))
-              (Flows.pure $ var "applyToArguments" @@ var "original" @@ var "args")
+              (right $ var "applyToArguments" @@ var "original" @@ var "args")
               (var "forPrimitive" @@ var "prim" @@ var "arity" @@ var "args")],
       _Term_variable>>: "v" ~>
         -- Look up the variable in the graph; if found, reduce its definition
-        "mBinding" <<~ Lexical.dereferenceElement @@ var "v" $
+        "mBinding" <~ Lexical.dereferenceElement @@ var "graph" @@ var "v" $
         Maybes.maybe
           -- Not found: lambda-bound variable, return with args applied
-          (Flows.pure $ var "applyToArguments" @@ var "original" @@ var "args")
+          (right $ var "applyToArguments" @@ var "original" @@ var "args")
           -- Found: reduce the element's term with the accumulated args
           ("binding" ~> var "applyIfNullary" @@ var "eager" @@ (Core.bindingTerm $ var "binding") @@ var "args")
           (var "mBinding"),
@@ -892,7 +904,7 @@
   "mapping" <~ ("recurse" ~> "mid" ~>
     "inner" <<~ Logic.ifElse (var "doRecurse" @@ var "eager" @@ var "mid")
       (var "recurse" @@ var "mid")
-      (Flows.pure $ var "mid") $
+      (right $ var "mid") $
     var "applyIfNullary" @@ var "eager" @@ var "inner" @@ (list ([] :: [TTerm Term]))) $
   Rewriting.rewriteTermM @@ var "mapping" @@ var "term"
 
@@ -901,12 +913,12 @@
   doc "Whether a term is closed, i.e. represents a complete program" $
   "term" ~> Sets.null $ Rewriting.freeVariablesInTerm @@ var "term"
 
-termIsValue :: TBinding (Graph -> Term -> Bool)
+termIsValue :: TBinding (Term -> Bool)
 termIsValue = define "termIsValue" $
   doc "Whether a term has been fully reduced to a value" $
-  "g" ~> "term" ~>
-  "forList" <~ ("els" ~> Lists.foldl ("b" ~> "t" ~> Logic.and (var "b") (termIsValue @@ var "g" @@ var "t")) true (var "els")) $
-  "checkField" <~ ("f" ~> termIsValue @@ var "g" @@ Core.fieldTerm (var "f")) $
+  "term" ~>
+  "forList" <~ ("els" ~> Lists.foldl ("b" ~> "t" ~> Logic.and (var "b") (termIsValue @@ var "t")) true (var "els")) $
+  "checkField" <~ ("f" ~> termIsValue @@ Core.fieldTerm (var "f")) $
   "checkFields" <~ ("fields" ~> Lists.foldl ("b" ~> "f" ~> Logic.and (var "b") (var "checkField" @@ var "f")) true (var "fields")) $
   "functionIsValue" <~ ("f" ~> cases _Function (var "f") Nothing [
     _Function_elimination>>: "e" ~>
@@ -915,16 +927,16 @@
         _Elimination_record>>: constant true,
         _Elimination_union>>: "cs" ~>
           Logic.and (var "checkFields" @@ Core.caseStatementCases (var "cs"))
-            (Maybes.maybe true (termIsValue @@ var "g") (Core.caseStatementDefault $ var "cs"))],
-    _Function_lambda>>: "l" ~> termIsValue @@ var "g" @@ Core.lambdaBody (var "l"),
+            (Maybes.maybe true termIsValue (Core.caseStatementDefault $ var "cs"))],
+    _Function_lambda>>: "l" ~> termIsValue @@ Core.lambdaBody (var "l"),
     _Function_primitive>>: constant true]) $
   cases _Term (Rewriting.deannotateTerm @@ var "term")
     (Just false) [
     _Term_application>>: constant false,
     _Term_either>>: "e" ~>
       Eithers.either_
-        ("l" ~> termIsValue @@ var "g" @@ var "l")
-        ("r" ~> termIsValue @@ var "g" @@ var "r")
+        ("l" ~> termIsValue @@ var "l")
+        ("r" ~> termIsValue @@ var "r")
         (var "e"),
     _Term_literal>>: constant true,
     _Term_function>>: "f" ~> var "functionIsValue" @@ var "f",
@@ -932,11 +944,11 @@
     _Term_map>>: "m" ~>
       Lists.foldl ("b" ~> "kv" ~>
         Logic.and (var "b") $ Logic.and
-          (termIsValue @@ var "g" @@ Pairs.first (var "kv"))
-          (termIsValue @@ var "g" @@ Pairs.second (var "kv")))
+          (termIsValue @@ Pairs.first (var "kv"))
+          (termIsValue @@ Pairs.second (var "kv")))
         true $ Maps.toList (var "m"),
     _Term_maybe>>: "m" ~>
-      Maybes.maybe true (termIsValue @@ var "g") (var "m"),
+      Maybes.maybe true termIsValue (var "m"),
     _Term_record>>: "r" ~> var "checkFields" @@ Core.recordFields (var "r"),
     _Term_set>>: "s" ~> var "forList" @@ Sets.toList (var "s"),
     _Term_union>>: "i" ~> var "checkField" @@ Core.injectionField (var "i"),
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Reflect.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Reflect.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Reflect.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Reflect.hs
@@ -8,21 +8,18 @@
   integerValueType, literalType, literalTypeVariant, literalTypes, literalVariant, literalVariants,
   termVariant, termVariants, typeVariant, typeVariants)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -37,18 +34,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -69,26 +66,26 @@
     Just ("Reflection functions for working with term, type, and literal type variants, as well as numeric precision.")
   where
     elements = [
-      toBinding eliminationVariant,
-      toBinding eliminationVariants,
-      toBinding floatTypePrecision,
-      toBinding floatTypes,
-      toBinding floatValueType,
-      toBinding functionVariant,
-      toBinding functionVariants,
-      toBinding integerTypeIsSigned,
-      toBinding integerTypePrecision,
-      toBinding integerTypes,
-      toBinding integerValueType,
-      toBinding literalType,
-      toBinding literalTypeVariant,
-      toBinding literalTypes,
-      toBinding literalVariant,
-      toBinding literalVariants,
-      toBinding termVariant,
-      toBinding termVariants,
-      toBinding typeVariant,
-      toBinding typeVariants]
+      toTermDefinition eliminationVariant,
+      toTermDefinition eliminationVariants,
+      toTermDefinition floatTypePrecision,
+      toTermDefinition floatTypes,
+      toTermDefinition floatValueType,
+      toTermDefinition functionVariant,
+      toTermDefinition functionVariants,
+      toTermDefinition integerTypeIsSigned,
+      toTermDefinition integerTypePrecision,
+      toTermDefinition integerTypes,
+      toTermDefinition integerValueType,
+      toTermDefinition literalType,
+      toTermDefinition literalTypeVariant,
+      toTermDefinition literalTypes,
+      toTermDefinition literalVariant,
+      toTermDefinition literalVariants,
+      toTermDefinition termVariant,
+      toTermDefinition termVariants,
+      toTermDefinition typeVariant,
+      toTermDefinition typeVariants]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -316,6 +313,7 @@
     _Type_union>>: constant Variants.typeVariantUnion,
     _Type_unit>>: constant Variants.typeVariantUnit,
     _Type_variable>>: constant Variants.typeVariantVariable,
+    _Type_void>>: constant Variants.typeVariantVoid,
     _Type_wrap>>: constant Variants.typeVariantWrap]
 
 typeVariants :: TBinding [TypeVariant]
@@ -337,4 +335,5 @@
     _TypeVariant_set,
     _TypeVariant_union,
     _TypeVariant_unit,
-    _TypeVariant_variable]
+    _TypeVariant_variable,
+    _TypeVariant_void]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Rewriting.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Rewriting.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Rewriting.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Rewriting.hs
@@ -37,7 +37,6 @@
   replaceFreeTypeVariable,
   replaceTypedefs,
   rewriteAndFoldTerm,
-  rewriteAndFoldTermM,
   rewriteAndFoldTermWithPath,
   rewriteTerm,
   rewriteTermM,
@@ -47,34 +46,42 @@
   rewriteTypeM,
   simplifyTerm,
   substituteTypeVariables,
+  substituteTypeVariablesInTerm,
   substituteVariable,
   substituteVariables,
   subterms,
-  subtermsWithAccessors,
+  subtermsWithSteps,
   subtypes,
   termDependencyNames,
   toShortNames,
   topologicalSortBindingMap,
   topologicalSortBindings,
+  fTypeToTypeScheme,
   typeDependencyNames,
   typeNamesInType,
+  typeSchemeToFType,
+  extendGraphForLambda,
+  extendGraphForLet,
+  extendGraphForTypeLambda,
+  extendGraphWithBindings,
+  foldTermWithGraphAndPath,
+  rewriteAndFoldTermWithGraph,
+  rewriteAndFoldTermWithGraphAndPath,
+  rewriteTermWithGraph,
   unshadowVariables)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths        as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -89,18 +96,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -127,64 +134,72 @@
     Just ("Utilities for type and term rewriting and analysis.")
   where
    elements = [
-     toBinding applyInsideTypeLambdasAndAnnotations,
-     toBinding deannotateAndDetypeTerm,
-     toBinding deannotateTerm,
-     toBinding deannotateType,
-     toBinding deannotateTypeParameters,
-     toBinding deannotateTypeRecursive,
-     toBinding deannotateTypeSchemeRecursive,
-     toBinding detypeTerm,
-     toBinding flattenLetTerms,
-     toBinding foldOverTerm,
-     toBinding foldOverType,
-     toBinding freeTypeVariablesInTerm,
-     toBinding freeVariablesInTerm,
---     toBinding freeVariablesInTermOpt,
-     toBinding freeVariablesInType,
-     toBinding freeVariablesInTypeOrdered,
-     toBinding freeVariablesInTypeSchemeSimple,
-     toBinding freeVariablesInTypeScheme,
-     toBinding freeVariablesInTypeSimple,
-     toBinding inlineType,
-     toBinding isFreeVariableInTerm,
-     toBinding isLambda,
-     toBinding liftLambdaAboveLet,
-     toBinding mapBeneathTypeAnnotations,
-     toBinding normalizeTypeVariablesInTerm,
-     toBinding pruneLet,
-     toBinding removeTermAnnotations,
-     toBinding removeTypeAnnotations,
-     toBinding removeTypeAnnotationsFromTerm,
-     toBinding removeTypesFromTerm,
-     toBinding replaceFreeTermVariable,
-     toBinding replaceFreeTypeVariable,
-     toBinding replaceTypedefs,
---     toBinding rewrite,
-     toBinding rewriteAndFoldTerm,
-     toBinding rewriteAndFoldTermM,
-     toBinding rewriteAndFoldTermWithPath,
-     toBinding rewriteTerm,
-     toBinding rewriteTermM,
-     toBinding rewriteTermWithContext,
-     toBinding rewriteTermWithContextM,
-     toBinding rewriteType,
-     toBinding rewriteTypeM,
-     toBinding simplifyTerm,
-     toBinding substituteTypeVariables,
-     toBinding substituteVariable,
-     toBinding substituteVariables,
-     toBinding stripTypeLambdas,
-     toBinding subterms,
-     toBinding subtermsWithAccessors,
-     toBinding subtypes,
-     toBinding termDependencyNames,
-     toBinding toShortNames,
-     toBinding topologicalSortBindingMap,
-     toBinding topologicalSortBindings,
-     toBinding typeDependencyNames,
-     toBinding typeNamesInType,
-     toBinding unshadowVariables]
+     toTermDefinition applyInsideTypeLambdasAndAnnotations,
+     toTermDefinition extendGraphForLambda,
+     toTermDefinition extendGraphForLet,
+     toTermDefinition extendGraphForTypeLambda,
+     toTermDefinition extendGraphWithBindings,
+     toTermDefinition deannotateAndDetypeTerm,
+     toTermDefinition deannotateTerm,
+     toTermDefinition deannotateType,
+     toTermDefinition deannotateTypeParameters,
+     toTermDefinition deannotateTypeRecursive,
+     toTermDefinition deannotateTypeSchemeRecursive,
+     toTermDefinition detypeTerm,
+     toTermDefinition flattenLetTerms,
+     toTermDefinition foldOverTerm,
+     toTermDefinition foldOverType,
+     toTermDefinition foldTermWithGraphAndPath,
+     toTermDefinition fTypeToTypeScheme,
+     toTermDefinition freeTypeVariablesInTerm,
+     toTermDefinition freeVariablesInTerm,
+     toTermDefinition freeVariablesInType,
+     toTermDefinition freeVariablesInTypeOrdered,
+     toTermDefinition freeVariablesInTypeSchemeSimple,
+     toTermDefinition freeVariablesInTypeScheme,
+     toTermDefinition freeVariablesInTypeSimple,
+     toTermDefinition inlineType,
+     toTermDefinition isFreeVariableInTerm,
+     toTermDefinition isLambda,
+     toTermDefinition liftLambdaAboveLet,
+     toTermDefinition mapBeneathTypeAnnotations,
+     toTermDefinition normalizeTypeVariablesInTerm,
+     toTermDefinition pruneLet,
+     toTermDefinition removeTermAnnotations,
+     toTermDefinition removeTypeAnnotations,
+     toTermDefinition removeTypeAnnotationsFromTerm,
+     toTermDefinition removeTypesFromTerm,
+     toTermDefinition replaceFreeTermVariable,
+     toTermDefinition replaceFreeTypeVariable,
+     toTermDefinition replaceTypedefs,
+     toTermDefinition rewriteAndFoldTerm,
+     toTermDefinition rewriteAndFoldTermWithGraph,
+     toTermDefinition rewriteAndFoldTermWithGraphAndPath,
+     toTermDefinition rewriteAndFoldTermWithPath,
+     toTermDefinition rewriteTerm,
+     toTermDefinition rewriteTermM,
+     toTermDefinition rewriteTermWithContext,
+     toTermDefinition rewriteTermWithGraph,
+     toTermDefinition rewriteTermWithContextM,
+     toTermDefinition rewriteType,
+     toTermDefinition rewriteTypeM,
+     toTermDefinition simplifyTerm,
+     toTermDefinition substituteTypeVariables,
+     toTermDefinition substituteTypeVariablesInTerm,
+     toTermDefinition substituteVariable,
+     toTermDefinition substituteVariables,
+     toTermDefinition stripTypeLambdas,
+     toTermDefinition subterms,
+     toTermDefinition subtermsWithSteps,
+     toTermDefinition subtypes,
+     toTermDefinition termDependencyNames,
+     toTermDefinition toShortNames,
+     toTermDefinition topologicalSortBindingMap,
+     toTermDefinition topologicalSortBindings,
+     toTermDefinition typeDependencyNames,
+     toTermDefinition typeNamesInType,
+     toTermDefinition typeSchemeToFType,
+     toTermDefinition unshadowVariables]
 
 applyInsideTypeLambdasAndAnnotations :: TBinding ((Term -> Term) -> Term -> Term)
 applyInsideTypeLambdasAndAnnotations = define "applyInsideTypeLambdasAndAnnotations" $
@@ -419,18 +434,21 @@
 freeVariablesInTerm = define "freeVariablesInTerm" $
   doc "Find the free variables (i.e. variables not bound by a lambda or let) in a term" $
   "term" ~>
-  "dfltVars" <~ Lists.foldl ("s" ~> "t" ~> Sets.union (var "s") (freeVariablesInTerm @@ var "t"))
+  -- Note: the subterm fold is wrapped in a lambda (dfltVars) rather than precomputed in a let binding,
+  -- because in eager languages a let-bound default would be evaluated unconditionally, even for
+  -- Variable/Lambda/Let cases where it is not needed. This avoids redundant traversal.
+  "dfltVars" <~ ("_" ~> Lists.foldl ("s" ~> "t" ~> Sets.union (var "s") (freeVariablesInTerm @@ var "t"))
     Sets.empty
-    (subterms @@ var "term") $
+    (subterms @@ var "term")) $
   cases _Term (var "term")
-    (Just $ var "dfltVars") [
-    _Term_function>>: match _Function (Just $ var "dfltVars") [
+    (Just $ var "dfltVars" @@ unit) [
+    _Term_function>>: match _Function (Just $ var "dfltVars" @@ unit) [
       _Function_lambda>>: "l" ~> Sets.delete
         (Core.lambdaParameter $ var "l")
         (freeVariablesInTerm @@ (Core.lambdaBody $ var "l"))],
-    _Term_let>>: "l" ~> (Sets.difference
-      (var "dfltVars")
-      (Sets.fromList (Lists.map (unaryFunction Core.bindingName) (Core.letBindings $ var "l")))),
+    _Term_let>>: "l" ~> Sets.difference
+      (var "dfltVars" @@ unit)
+      (Sets.fromList (Lists.map (unaryFunction Core.bindingName) (Core.letBindings $ var "l"))),
     _Term_variable>>: "v" ~> Sets.singleton $ var "v"]
 
 --freeVariablesInTermOpt :: TBinding (Term -> S.Set Name)
@@ -524,16 +542,16 @@
   "t" <~ Core.typeSchemeType (var "ts") $
   Sets.difference (freeVariablesInTypeSimple @@ var "t") (Sets.fromList $ var "vars")
 
-inlineType :: TBinding (M.Map Name Type -> Type -> Flow s Type)
+inlineType :: TBinding (M.Map Name Type -> Type -> Prelude.Either String Type)
 inlineType = define "inlineType" $
-  doc "Inline all type variables in a type using the provided schema. Note: this function is only appropriate for nonrecursive type definitions" $
+  doc "Inline all type variables in a type using the provided schema (Either version). Note: this function is only appropriate for nonrecursive type definitions" $
   "schema" ~> "typ" ~>
   "f" <~ ("recurse" ~> "typ" ~>
     "afterRecurse" <~ ("tr" ~> cases _Type (var "tr")
-      (Just $ produce $ var "tr") [
+      (Just $ right $ var "tr") [
       _Type_variable>>: "v" ~>
         Maybes.maybe
-          (Flows.fail $ Strings.cat2 (string "No such type in schema: ") (unwrap _Name @@ var "v"))
+          (left $ Strings.cat2 (string "No such type in schema: ") (unwrap _Name @@ var "v"))
           (inlineType @@ var "schema")
           (Maps.lookup (var "v") (var "schema"))]) $
     "tr" <<~ var "recurse" @@ var "typ" $
@@ -634,7 +652,9 @@
         "body0"     <~ Core.letBody (var "lt") $
         -- Sequentially rewrite bindings without advancing 'next' across siblings
         "step" <~ ("acc" ~> "bs" ~>
-          "b"  <~ Lists.head (var "bs") $
+          Logic.ifElse (Lists.null (var "bs"))
+            (Lists.reverse (var "acc"))
+            ("b"  <~ Lists.head (var "bs") $
           "tl" <~ Lists.tail (var "bs") $
           "noType" <~ (
             "newVal" <~ var "rewriteWithSubst" @@ (pair (pair (var "subst") (var "boundVars")) (var "next")) @@ (Core.bindingTerm $ var "b") $
@@ -675,9 +695,7 @@
               (just $ Core.typeScheme (var "newVars") (var "substType" @@ var "newSubst" @@ var "typ") (var "newConstraints")) $
             -- Note: do not advance 'next' for the next sibling; keep current 'next'
             var "step" @@ (Lists.cons (var "b1") (var "acc")) @@ var "tl") $
-          Logic.ifElse (Lists.null (var "bs"))
-            (Lists.reverse (var "acc"))
-            (optCases (Core.bindingType $ var "b")
+          optCases (Core.bindingType $ var "b")
                -- Untyped binding: rewrite its term with current state; 'next' unchanged for siblings
                (var "noType")
                -- Typed binding: allocate |vars| fresh t{next+i}; bump 'next' only for the binding's TERM
@@ -1017,9 +1035,9 @@
 -- | Rewrite a term with path tracking, and fold a function over it.
 -- The path is the list of accessors from the root to the current term.
 -- The function f receives: (recurse path acc term -> (acc', term')) -> path -> acc -> term -> (acc', term')
-rewriteAndFoldTermWithPath :: TBinding ((([TermAccessor] -> a -> Term -> (a, Term)) -> [TermAccessor] -> a -> Term -> (a, Term)) -> a -> Term -> (a, Term))
+rewriteAndFoldTermWithPath :: TBinding ((([SubtermStep] -> a -> Term -> (a, Term)) -> [SubtermStep] -> a -> Term -> (a, Term)) -> a -> Term -> (a, Term))
 rewriteAndFoldTermWithPath = define "rewriteAndFoldTermWithPath" $
-  doc "Rewrite a term with path tracking, and fold a function over it, accumulating a value. The path is a list of TermAccessors from root to current position." $
+  doc "Rewrite a term with path tracking, and fold a function over it, accumulating a value. The path is a list of SubtermSteps from root to current position." $
   "f" ~> "term0" ~>
   "fsub" <~ ("recurse" ~> "path" ~> "val0" ~> "term0" ~>
     -- Helper to recurse into a single subterm with a given accessor
@@ -1064,7 +1082,7 @@
     -- Helper for let bindings
     "forBindingWithAccessor" <~ ("val" ~> "binding" ~>
       "r" <~ var "recurse"
-        @@ Lists.concat2 (var "path") (list [Accessors.termAccessorLetBinding $ Core.bindingName $ var "binding"])
+        @@ Lists.concat2 (var "path") (list [Paths.subtermStepLetBinding $ Core.bindingName $ var "binding"])
         @@ var "val"
         @@ Core.bindingTerm (var "binding") $
       pair
@@ -1080,7 +1098,7 @@
         _Elimination_union>>: "cs" ~>
           "rmd" <~ Maybes.map
             ("def" ~> var "recurse"
-              @@ Lists.concat2 (var "path") (list [Accessors.termAccessorUnionCasesDefault])
+              @@ Lists.concat2 (var "path") (list [Paths.subtermStepUnionCasesDefault])
               @@ var "val"
               @@ var "def")
             (Core.caseStatementDefault $ var "cs") $
@@ -1093,7 +1111,7 @@
             @@ var "val1"
             @@ Lists.map
               ("f" ~> pair
-                (Accessors.termAccessorUnionCasesBranch $ Core.fieldName $ var "f")
+                (Paths.subtermStepUnionCasesBranch $ Core.fieldName $ var "f")
                 (Core.fieldTerm $ var "f"))
               (Core.caseStatementCases $ var "cs") $
           pair
@@ -1117,7 +1135,7 @@
          pair (Pairs.first $ var "re") (Core.functionElimination (Pairs.second $ var "re")),
       _Function_lambda>>: "l" ~>
         "rl" <~ var "recurse"
-          @@ Lists.concat2 (var "path") (list [Accessors.termAccessorLambdaBody])
+          @@ Lists.concat2 (var "path") (list [Paths.subtermStepLambdaBody])
           @@ var "val"
           @@ (Core.lambdaBody $ var "l") $
         pair
@@ -1132,16 +1150,16 @@
       _Term_annotated>>: "at" ~> var "forSingleWithAccessor"
         @@ var "recurse"
         @@ ("t" ~> Core.termAnnotated $ Core.annotatedTerm (var "t") (Core.annotatedTermAnnotation $ var "at"))
-        @@ Accessors.termAccessorAnnotatedBody
+        @@ Paths.subtermStepAnnotatedBody
         @@ var "val0"
         @@ (Core.annotatedTermBody $ var "at"),
       _Term_application>>: "a" ~>
         "rlhs" <~ var "recurse"
-          @@ Lists.concat2 (var "path") (list [Accessors.termAccessorApplicationFunction])
+          @@ Lists.concat2 (var "path") (list [Paths.subtermStepApplicationFunction])
           @@ var "val0"
           @@ (Core.applicationFunction $ var "a") $
         "rrhs" <~ var "recurse"
-          @@ Lists.concat2 (var "path") (list [Accessors.termAccessorApplicationArgument])
+          @@ Lists.concat2 (var "path") (list [Paths.subtermStepApplicationArgument])
           @@ (Pairs.first $ var "rlhs")
           @@ (Core.applicationArgument $ var "a") $
         pair
@@ -1152,13 +1170,13 @@
       _Term_either>>: "e" ~> Eithers.either_
         ("l" ~>
           "rl" <~ var "recurse"
-            @@ Lists.concat2 (var "path") (list [Accessors.termAccessorSumTerm])
+            @@ Lists.concat2 (var "path") (list [Paths.subtermStepSumTerm])
             @@ var "val0"
             @@ var "l" $
           pair (Pairs.first $ var "rl") (Core.termEither $ left $ Pairs.second $ var "rl"))
         ("r" ~>
           "rr" <~ var "recurse"
-            @@ Lists.concat2 (var "path") (list [Accessors.termAccessorSumTerm])
+            @@ Lists.concat2 (var "path") (list [Paths.subtermStepSumTerm])
             @@ var "val0"
             @@ var "r" $
           pair (Pairs.first $ var "rr") (Core.termEither $ right $ Pairs.second $ var "rr"))
@@ -1168,7 +1186,7 @@
         pair (Pairs.first $ var "rf") (Core.termFunction $ Pairs.second $ var "rf"),
       _Term_let>>: "l" ~>
         "renv" <~ var "recurse"
-          @@ Lists.concat2 (var "path") (list [Accessors.termAccessorLetEnvironment])
+          @@ Lists.concat2 (var "path") (list [Paths.subtermStepLetBody])
           @@ var "val0"
           @@ (Core.letBody $ var "l") $
         "rbindings" <~ Lists.foldl
@@ -1185,7 +1203,7 @@
         "rr" <~ Lists.foldl
           ("r" ~> "el" ~>
             "r2" <~ var "recurse"
-              @@ Lists.concat2 (var "path") (list [Accessors.termAccessorListElement $ Pairs.first $ var "r"])
+              @@ Lists.concat2 (var "path") (list [Paths.subtermStepListElement $ Pairs.first $ var "r"])
               @@ (Pairs.first $ Pairs.second $ var "r")
               @@ var "el" $
             pair
@@ -1199,11 +1217,11 @@
         "rr" <~ Lists.foldl
           ("r" ~> "kv" ~>
             "rk" <~ var "recurse"
-              @@ Lists.concat2 (var "path") (list [Accessors.termAccessorMapKey $ Pairs.first $ var "r"])
+              @@ Lists.concat2 (var "path") (list [Paths.subtermStepMapKey $ Pairs.first $ var "r"])
               @@ (Pairs.first $ Pairs.second $ var "r")
               @@ (Pairs.first $ var "kv") $
             "rv" <~ var "recurse"
-              @@ Lists.concat2 (var "path") (list [Accessors.termAccessorMapValue $ Pairs.first $ var "r"])
+              @@ Lists.concat2 (var "path") (list [Paths.subtermStepMapValue $ Pairs.first $ var "r"])
               @@ (Pairs.first $ var "rk")
               @@ (Pairs.second $ var "kv") $
             pair
@@ -1219,16 +1237,16 @@
         ("t" ~> var "forSingleWithAccessor"
           @@ var "recurse"
           @@ ("t1" ~> Core.termMaybe $ just $ var "t1")
-          @@ Accessors.termAccessorOptionalTerm
+          @@ Paths.subtermStepMaybeTerm
           @@ var "val0"
           @@ var "t"),
       _Term_pair>>: "p" ~>
         "rf" <~ var "recurse"
-          @@ Lists.concat2 (var "path") (list [Accessors.termAccessorProductTerm $ int32 0])
+          @@ Lists.concat2 (var "path") (list [Paths.subtermStepProductTerm $ int32 0])
           @@ var "val0"
           @@ (Pairs.first $ var "p") $
         "rs" <~ var "recurse"
-          @@ Lists.concat2 (var "path") (list [Accessors.termAccessorProductTerm $ int32 1])
+          @@ Lists.concat2 (var "path") (list [Paths.subtermStepProductTerm $ int32 1])
           @@ (Pairs.first $ var "rf")
           @@ (Pairs.second $ var "p") $
         pair (Pairs.first $ var "rs") (Core.termPair $ pair (Pairs.second $ var "rf") (Pairs.second $ var "rs")),
@@ -1239,7 +1257,7 @@
           @@ var "val0"
           @@ Lists.map
             ("f" ~> pair
-              (Accessors.termAccessorRecordField $ Core.fieldName $ var "f")
+              (Paths.subtermStepRecordField $ Core.fieldName $ var "f")
               (Core.fieldTerm $ var "f"))
             (Core.recordFields $ var "r") $
         pair
@@ -1256,7 +1274,7 @@
         "rr" <~ Lists.foldl
           ("r" ~> "el" ~>
             "r2" <~ var "recurse"
-              @@ Lists.concat2 (var "path") (list [Accessors.termAccessorSetElement $ Pairs.first $ var "r"])
+              @@ Lists.concat2 (var "path") (list [Paths.subtermStepSetElement $ Pairs.first $ var "r"])
               @@ (Pairs.first $ Pairs.second $ var "r")
               @@ var "el" $
             pair
@@ -1268,13 +1286,13 @@
       _Term_typeApplication>>: "ta" ~> var "forSingleWithAccessor"
         @@ var "recurse"
         @@ ("t" ~> Core.termTypeApplication $ Core.typeApplicationTerm (var "t") (Core.typeApplicationTermType $ var "ta"))
-        @@ Accessors.termAccessorTypeApplicationTerm
+        @@ Paths.subtermStepTypeApplicationTerm
         @@ var "val0"
         @@ (Core.typeApplicationTermBody $ var "ta"),
       _Term_typeLambda>>: "tl" ~> var "forSingleWithAccessor"
         @@ var "recurse"
         @@ ("t" ~> Core.termTypeLambda $ Core.typeLambda (Core.typeLambdaParameter $ var "tl") (var "t"))
-        @@ Accessors.termAccessorTypeLambdaBody
+        @@ Paths.subtermStepTypeLambdaBody
         @@ var "val0"
         @@ (Core.typeLambdaBody $ var "tl"),
       _Term_union>>: "inj" ~> var "forSingleWithAccessor"
@@ -1282,171 +1300,22 @@
         @@ ("t" ~> Core.termUnion $ Core.injection
           (Core.injectionTypeName $ var "inj")
           (Core.field (Core.fieldName $ Core.injectionField $ var "inj") (var "t")))
-        @@ Accessors.termAccessorInjectionTerm
+        @@ Paths.subtermStepInjectionTerm
         @@ var "val0"
         @@ (Core.fieldTerm $ Core.injectionField $ var "inj"),
       _Term_wrap>>: "wt" ~> var "forSingleWithAccessor"
         @@ var "recurse"
         @@ ("t" ~> Core.termWrap $ Core.wrappedTerm (Core.wrappedTermTypeName $ var "wt") (var "t"))
-        @@ Accessors.termAccessorWrappedTerm
+        @@ Paths.subtermStepWrappedTerm
         @@ var "val0"
         @@ (Core.wrappedTermBody $ var "wt")]) $
   "recurse" <~ var "f" @@ (var "fsub" @@ var "recurse") $
-  var "recurse" @@ list ([] :: [TTerm TermAccessor]) @@ var "term0"
-
-rewriteAndFoldTermM :: TBinding (((a -> Term -> Flow s (a, Term)) -> a -> Term -> Flow s (a, Term)) -> a -> Term -> Flow s (a, Term))
-rewriteAndFoldTermM = define "rewriteAndFoldTermM" $
-  doc "Monadic version: rewrite a term and fold a function over it, accumulating a value" $
-  "f" ~> "term0" ~>
-  "fsub" <~ ("recurse" ~> "val0" ~> "term0" ~>
-    "forSingle" <~ ("rec" ~> "cons" ~> "val" ~> "term" ~>
-      "r" <<~ var "rec" @@ var "val" @@ var "term" $
-      produce $ pair (Pairs.first $ var "r") (var "cons" @@ (Pairs.second $ var "r"))) $
-    "forMany" <~ ("rec" ~> "cons" ~> "val" ~> "els" ~>
-      "rr" <<~ Flows.foldl
-        ("r" ~> "el" ~>
-          "r2" <<~ var "rec" @@ (Pairs.first $ var "r") @@ var "el" $
-          produce $ pair (Pairs.first $ var "r2") (Lists.cons (Pairs.second $ var "r2") (Pairs.second $ var "r")))
-        (pair (var "val") (list ([] :: [TTerm Term])))
-        (var "els") $
-      produce $ pair (Pairs.first $ var "rr") (var "cons" @@ (Lists.reverse $ Pairs.second $ var "rr"))) $
-    "forField" <~ ("val" ~> "field" ~>
-      "r" <<~ var "recurse" @@ var "val" @@ Core.fieldTerm (var "field") $
-      produce $ pair (Pairs.first $ var "r") (Core.field (Core.fieldName $ var "field") (Pairs.second $ var "r"))) $
-    "forFields" <~ var "forMany" @@ var "forField" @@ ("x" ~> var "x") $
-    "forPair" <~ ("val" ~> "kv" ~>
-      "rk" <<~ var "recurse" @@ var "val" @@ (Pairs.first $ var "kv") $
-      "rv" <<~ var "recurse" @@ (Pairs.first $ var "rk") @@ (Pairs.second $ var "kv") $
-      produce $ pair
-        (Pairs.first $ var "rv")
-        (pair (Pairs.second $ var "rk") (Pairs.second $ var "rv"))) $
-    "forBinding" <~ ("val" ~> "binding" ~>
-      "r" <<~ var "recurse" @@ var "val" @@ Core.bindingTerm (var "binding") $
-      produce $ pair
-        (Pairs.first $ var "r")
-        (Core.binding
-          (Core.bindingName $ var "binding")
-          (Pairs.second $ var "r")
-          (Core.bindingType $ var "binding"))) $
-    "forElimination" <~ ("val" ~> "elm" ~>
-      "rw" <~ ("elm" ~> cases _Elimination (var "elm")
-        (Just $ produce $ pair (var "val") (var "elm")) [
-        _Elimination_union>>: "cs" ~>
-          "rmd" <<~ Maybes.maybe (produce nothing)
-            ("def" ~> Flows.map (unaryFunction just) (var "recurse" @@ var "val" @@ var "def"))
-            (Core.caseStatementDefault $ var "cs") $
-          "val1" <~ Maybes.maybe (var "val") (unaryFunction Pairs.first) (var "rmd") $
-          "rcases" <<~ var "forFields" @@ var "val1" @@ (Core.caseStatementCases $ var "cs") $
-          produce $ pair
-            (Pairs.first $ var "rcases")
-            (Core.eliminationUnion $ Core.caseStatement
-              (Core.caseStatementTypeName $ var "cs")
-              (Maybes.map (unaryFunction Pairs.second) (var "rmd"))
-              (Pairs.second $ var "rcases"))]) $
-      "r" <<~ var "rw" @@ var "elm" $
-      produce $ pair (Pairs.first $ var "r") (Pairs.second $ var "r")) $
-    "forFunction" <~ ("val" ~> "fun" ~> cases _Function (var "fun")
-      (Just $ produce $ pair (var "val") (var "fun")) [
-      _Function_elimination>>: "elm" ~>
-         "r" <<~ var "forElimination" @@ var "val" @@ var "elm" $
-         produce $ pair (Pairs.first $ var "r") (Core.functionElimination (Pairs.second $ var "r")),
-      _Function_lambda>>: "l" ~>
-        "r" <<~ var "recurse" @@ var "val" @@ (Core.lambdaBody $ var "l") $
-        produce $ pair
-          (Pairs.first $ var "r")
-          (Core.functionLambda $ Core.lambda
-            (Core.lambdaParameter $ var "l")
-            (Core.lambdaDomain $ var "l")
-            (Pairs.second $ var "r"))]) $
-    "dflt" <~ produce (pair (var "val0") (var "term0")) $
-    cases _Term (var "term0")
-      (Just $ var "dflt") [
-      _Term_annotated>>: "at" ~> var "forSingle"
-        @@ var "recurse"
-        @@ ("t" ~> Core.termAnnotated $ Core.annotatedTerm (var "t") (Core.annotatedTermAnnotation $ var "at"))
-        @@ var "val0"
-        @@ (Core.annotatedTermBody $ var "at"),
-      _Term_application>>: "a" ~>
-        "rlhs" <<~ var "recurse" @@ var "val0" @@ (Core.applicationFunction $ var "a") $
-        "rrhs" <<~ var "recurse" @@ (Pairs.first $ var "rlhs") @@ (Core.applicationArgument $ var "a") $
-        produce $ pair
-          (Pairs.first $ var "rrhs")
-          (Core.termApplication $ Core.application
-            (Pairs.second $ var "rlhs")
-            (Pairs.second $ var "rrhs")),
-      _Term_either>>: "e" ~> Eithers.either_
-        ("l" ~>
-          "rl" <<~ var "recurse" @@ var "val0" @@ var "l" $
-          produce $ pair (Pairs.first $ var "rl") (Core.termEither $ left $ Pairs.second $ var "rl"))
-        ("r" ~>
-          "rr" <<~ var "recurse" @@ var "val0" @@ var "r" $
-          produce $ pair (Pairs.first $ var "rr") (Core.termEither $ right $ Pairs.second $ var "rr"))
-        (var "e"),
-      _Term_function>>: "f" ~> var "forSingle"
-        @@ var "forFunction"
-        @@ ("f" ~> Core.termFunction $ var "f")
-        @@ var "val0"
-        @@ var "f",
-      _Term_let>>: "l" ~>
-        "renv" <<~ var "recurse" @@ var "val0" @@ (Core.letBody $ var "l") $
-        var "forMany" @@ var "forBinding"
-          @@ ("bins" ~> Core.termLet $ Core.let_ (var "bins") (Pairs.second $ var "renv"))
-          @@ Pairs.first (var "renv") @@ (Core.letBindings $ var "l"),
-      _Term_list>>: "els" ~> var "forMany" @@ var "recurse" @@ (unaryFunction Core.termList) @@ var "val0" @@ var "els",
-      _Term_map>>: "m" ~> var "forMany" @@ var "forPair"
-        @@ ("pairs" ~> Core.termMap $ Maps.fromList $ var "pairs") @@ var "val0" @@ Maps.toList (var "m"),
-      _Term_maybe>>: "mt" ~> Maybes.maybe
-        (var "dflt")
-        ("t" ~> var "forSingle"
-          @@ var "recurse"
-          @@ ("t1" ~> Core.termMaybe $ just $ var "t1")
-          @@ var "val0"
-          @@ var "t")
-        (var "mt"),
-      _Term_pair>>: "p" ~>
-        "rf" <<~ var "recurse" @@ var "val0" @@ (Pairs.first $ var "p") $
-        "rs" <<~ var "recurse" @@ (Pairs.first $ var "rf") @@ (Pairs.second $ var "p") $
-        produce $ pair (Pairs.first $ var "rs") (Core.termPair $ pair (Pairs.second $ var "rf") (Pairs.second $ var "rs")),
-      _Term_record>>: "r" ~> var "forMany"
-        @@ var "forField"
-        @@ ("fields" ~> Core.termRecord $ Core.record (Core.recordTypeName $ var "r") (var "fields"))
-        @@ var "val0"
-        @@ Core.recordFields (var "r"),
-      _Term_set>>: "els" ~> var "forMany"
-        @@ var "recurse"
-        @@ ("e" ~> Core.termSet $ Sets.fromList $ var "e")
-        @@ var "val0"
-        @@ (Sets.toList $ var "els"),
-      _Term_typeApplication>>: "ta" ~> var "forSingle"
-        @@ var "recurse"
-        @@ ("t" ~> Core.termTypeApplication $ Core.typeApplicationTerm (var "t") (Core.typeApplicationTermType $ var "ta"))
-        @@ var "val0"
-        @@ (Core.typeApplicationTermBody $ var "ta"),
-      _Term_typeLambda>>: "tl" ~> var "forSingle"
-        @@ var "recurse"
-        @@ ("t" ~> Core.termTypeLambda $ Core.typeLambda (Core.typeLambdaParameter $ var "tl") (var "t"))
-        @@ var "val0"
-        @@ (Core.typeLambdaBody $ var "tl"),
-      _Term_union>>: "inj" ~> var "forSingle"
-        @@ var "recurse"
-        @@ ("t" ~> Core.termUnion $ Core.injection
-          (Core.injectionTypeName $ var "inj")
-          (Core.field (Core.fieldName $ Core.injectionField $ var "inj") (var "t")))
-        @@ var "val0"
-        @@ (Core.fieldTerm $ Core.injectionField $ var "inj"),
-      _Term_wrap>>: "wt" ~> var "forSingle"
-        @@ var "recurse"
-        @@ ("t" ~> Core.termWrap $ Core.wrappedTerm (Core.wrappedTermTypeName $ var "wt") (var "t"))
-        @@ var "val0"
-        @@ (Core.wrappedTermBody $ var "wt")]) $
---  rewrite @@ var "fsub" @@ var "f" -- TODO: restore global rewrite/fix instead of the local definition
-  "recurse" <~ var "f" @@ (var "fsub" @@ var "recurse") $
-  var "recurse" @@ var "term0"
+  var "recurse" @@ list ([] :: [TTerm SubtermStep]) @@ var "term0"
 
 rewriteTerm :: TBinding (((Term -> Term) -> Term -> Term) -> Term -> Term)
 rewriteTerm = define "rewriteTerm" $ "f" ~> "term0" ~>
   "fsub" <~ ("recurse" ~> "term" ~>
-    "forField" <~ ("f" ~> Core.fieldWithTerm (var "recurse" @@ (Core.fieldTerm $ var "f")) (var "f")) $
+    "forField" <~ ("f" ~> Core.fieldWithTerm (var "f") (var "recurse" @@ (Core.fieldTerm $ var "f"))) $
     "forElimination" <~ ("elm" ~> cases _Elimination (var "elm") Nothing [
       _Elimination_record>>: "p" ~> Core.eliminationRecord (var "p"),
       _Elimination_union>>: "cs" ~> Core.eliminationUnion $ Core.caseStatement
@@ -1514,50 +1383,50 @@
   "recurse" <~ var "f" @@ (var "fsub" @@ var "recurse") $
   var "recurse" @@ var "term0"
 
-rewriteTermM :: TBinding (((Term -> Flow s Term) -> Term -> Flow s Term) -> Term -> Flow s Term)
+rewriteTermM :: TBinding (((Term -> Prelude.Either e Term) -> Term -> Prelude.Either e Term) -> Term -> Prelude.Either e Term)
 rewriteTermM = define "rewriteTermM" $
-  doc "Monadic term rewriting with custom transformation function" $
+  doc "Either-based term rewriting with custom transformation function" $
   "f" ~> "term0" ~>
   "fsub" <~ ("recurse" ~> "term" ~>
     "forField" <~ ("field" ~>
       "t" <<~ var "recurse" @@ Core.fieldTerm (var "field") $
-      produce $ Core.fieldWithTerm (var "t") (var "field")) $
+      right $ Core.fieldWithTerm (var "field") (var "t")) $
     "forPair" <~ ("kv" ~>
       "k" <<~ var "recurse" @@ (Pairs.first $ var "kv") $
       "v" <<~ var "recurse" @@ (Pairs.second $ var "kv") $
-      produce $ pair (var "k") (var "v")) $
+      right $ pair (var "k") (var "v")) $
     "mapBinding" <~ ("b" ~>
       "v" <<~ var "recurse" @@ (Core.bindingTerm $ var "b") $
-      produce $ Core.binding (Core.bindingName $ var "b") (var "v") (Core.bindingType $ var "b")) $
+      right $ Core.binding (Core.bindingName $ var "b") (var "v") (Core.bindingType $ var "b")) $
     cases _Term (var "term") Nothing [
       _Term_annotated>>: "at" ~>
         "ex" <<~ var "recurse" @@ Core.annotatedTermBody (var "at") $
-        produce $ Core.termAnnotated $ Core.annotatedTerm (var "ex") (Core.annotatedTermAnnotation $ var "at"),
+        right $ Core.termAnnotated $ Core.annotatedTerm (var "ex") (Core.annotatedTermAnnotation $ var "at"),
       _Term_application>>: "app" ~>
         "lhs" <<~ var "recurse" @@ Core.applicationFunction (var "app") $
         "rhs" <<~ var "recurse" @@ Core.applicationArgument (var "app") $
-        produce $ Core.termApplication $ Core.application (var "lhs") (var "rhs"),
+        right $ Core.termApplication $ Core.application (var "lhs") (var "rhs"),
       _Term_either>>: "e" ~>
         "re" <<~ Eithers.either_
-          ("l" ~> Flows.map (unaryFunction left) $ var "recurse" @@ var "l")
-          ("r" ~> Flows.map (unaryFunction right) $ var "recurse" @@ var "r")
+          ("l" ~> Eithers.map (unaryFunction left) $ var "recurse" @@ var "l")
+          ("r" ~> Eithers.map (unaryFunction right) $ var "recurse" @@ var "r")
           (var "e") $
-        produce $ Core.termEither $ var "re",
+        right $ Core.termEither $ var "re",
       _Term_function>>: "fun" ~>
         "forElm" <~ ("e" ~> cases _Elimination (var "e") Nothing [
-          _Elimination_record>>: "p" ~> produce $ Core.functionElimination $ Core.eliminationRecord $ var "p",
+          _Elimination_record>>: "p" ~> right $ Core.functionElimination $ Core.eliminationRecord $ var "p",
           _Elimination_union>>: "cs" ~>
             "n" <~ Core.caseStatementTypeName (var "cs") $
             "def" <~ Core.caseStatementDefault (var "cs") $
             "cases" <~ Core.caseStatementCases (var "cs") $
-            "rdef" <<~ Maybes.maybe (produce nothing)
-              ("t" ~> Flows.map (unaryFunction just) $ var "recurse" @@ var "t")
+            "rdef" <<~ Maybes.maybe (right nothing)
+              ("t" ~> Eithers.map (unaryFunction just) $ var "recurse" @@ var "t")
               (var "def") $
-            Flows.map
+            Eithers.map
               ("rcases" ~> Core.functionElimination $ Core.eliminationUnion $
                 Core.caseStatement (var "n") (var "rdef") (var "rcases"))
-              (Flows.mapList (var "forField") (var "cases")),
-          _Elimination_wrap>>: "name" ~> produce $ Core.functionElimination $ Core.eliminationWrap $ var "name"]) $
+              (Eithers.mapList (var "forField") (var "cases")),
+          _Elimination_wrap>>: "name" ~> right $ Core.functionElimination $ Core.eliminationWrap $ var "name"]) $
         "forFun" <~ ("fun" ~> cases _Function (var "fun") Nothing [
           _Function_elimination>>: "e" ~> var "forElm" @@ var "e",
           _Function_lambda>>: "l" ~>
@@ -1565,61 +1434,60 @@
             "d" <~ Core.lambdaDomain (var "l") $
             "body" <~ Core.lambdaBody (var "l") $
             "rbody" <<~ var "recurse" @@ var "body" $
-            produce $ Core.functionLambda $ Core.lambda (var "v") (var "d") (var "rbody"),
-          _Function_primitive>>: "name" ~> produce $ Core.functionPrimitive $ var "name"]) $
+            right $ Core.functionLambda $ Core.lambda (var "v") (var "d") (var "rbody"),
+          _Function_primitive>>: "name" ~> right $ Core.functionPrimitive $ var "name"]) $
         "rfun" <<~ var "forFun" @@ var "fun" $
-        produce $ Core.termFunction $ var "rfun",
+        right $ Core.termFunction $ var "rfun",
       _Term_let>>: "lt" ~>
         "bindings" <~ Core.letBindings (var "lt") $
         "env" <~ Core.letBody (var "lt") $
-        "rbindings" <<~ Flows.mapList (var "mapBinding") (var "bindings") $
+        "rbindings" <<~ Eithers.mapList (var "mapBinding") (var "bindings") $
         "renv" <<~ var "recurse" @@ var "env" $
-        produce $ Core.termLet $ Core.let_ (var "rbindings") (var "renv"),
+        right $ Core.termLet $ Core.let_ (var "rbindings") (var "renv"),
       _Term_list>>: "els" ~>
-        "rels" <<~ Flows.mapList (var "recurse") (var "els") $
-        produce $ Core.termList $ var "rels",
-      _Term_literal>>: "v" ~> produce $ Core.termLiteral $ var "v",
+        "rels" <<~ Eithers.mapList (var "recurse") (var "els") $
+        right $ Core.termList $ var "rels",
+      _Term_literal>>: "v" ~> right $ Core.termLiteral $ var "v",
       _Term_map>>: "m" ~>
-        "pairs" <<~ Flows.mapList (var "forPair") (Maps.toList $ var "m") $
-        produce $ Core.termMap $ Maps.fromList $ var "pairs",
+        "pairs" <<~ Eithers.mapList (var "forPair") (Maps.toList $ var "m") $
+        right $ Core.termMap $ Maps.fromList $ var "pairs",
       _Term_maybe>>: "m" ~>
-        "rm" <<~ Flows.mapMaybe (var "recurse") (var "m") $
-        produce $ Core.termMaybe $ var "rm",
+        "rm" <<~ Eithers.mapMaybe (var "recurse") (var "m") $
+        right $ Core.termMaybe $ var "rm",
       _Term_pair>>: "p" ~>
         "rf" <<~ var "recurse" @@ (Pairs.first $ var "p") $
         "rs" <<~ var "recurse" @@ (Pairs.second $ var "p") $
-        produce $ Core.termPair $ pair (var "rf") (var "rs"),
+        right $ Core.termPair $ pair (var "rf") (var "rs"),
       _Term_record>>: "r" ~>
         "n" <~ Core.recordTypeName (var "r") $
         "fields" <~ Core.recordFields (var "r") $
-        Flows.map
+        Eithers.map
           ("rfields" ~> Core.termRecord $ Core.record (var "n") (var "rfields"))
-          (Flows.mapList (var "forField") (var "fields")),
+          (Eithers.mapList (var "forField") (var "fields")),
       _Term_set>>: "s" ~>
-        "rlist" <<~ Flows.mapList (var "recurse") (Sets.toList $ var "s") $
-        produce $ Core.termSet $ Sets.fromList $ var "rlist",
+        "rlist" <<~ Eithers.mapList (var "recurse") (Sets.toList $ var "s") $
+        right $ Core.termSet $ Sets.fromList $ var "rlist",
       _Term_typeApplication>>: "tt" ~>
         "t" <<~ var "recurse" @@ Core.typeApplicationTermBody (var "tt") $
-        produce $ Core.termTypeApplication $ Core.typeApplicationTerm (var "t") (Core.typeApplicationTermType (var "tt")),
+        right $ Core.termTypeApplication $ Core.typeApplicationTerm (var "t") (Core.typeApplicationTermType (var "tt")),
       _Term_typeLambda>>: "tl" ~>
         "v" <~ Core.typeLambdaParameter (var "tl") $
         "body" <~ Core.typeLambdaBody (var "tl") $
         "rbody" <<~ var "recurse" @@ var "body" $
-        produce $ Core.termTypeLambda $ Core.typeLambda (var "v") (var "rbody"),
+        right $ Core.termTypeLambda $ Core.typeLambda (var "v") (var "rbody"),
       _Term_union>>: "i" ~>
         "n" <~ Core.injectionTypeName (var "i") $
         "field" <~ Core.injectionField (var "i") $
-        Flows.map
+        Eithers.map
           ("rfield" ~> Core.termUnion $ Core.injection (var "n") (var "rfield"))
           (var "forField" @@ var "field"),
-      _Term_unit>>: constant $ produce Core.termUnit,
-      _Term_variable>>: "v" ~> produce $ Core.termVariable $ var "v",
+      _Term_unit>>: constant $ right $ Core.termUnit,
+      _Term_variable>>: "v" ~> right $ Core.termVariable $ var "v",
       _Term_wrap>>: "wt" ~>
         "name" <~ Core.wrappedTermTypeName (var "wt") $
         "t" <~ Core.wrappedTermBody (var "wt") $
         "rt" <<~ var "recurse" @@ var "t" $
-        produce $ Core.termWrap $ Core.wrappedTerm (var "name") (var "rt")]) $
---  rewrite @@ var "fsub" @@ var "f" -- TODO: restore global rewrite/fix instead of the local definition
+        right $ Core.termWrap $ Core.wrappedTerm (var "name") (var "rt")]) $
   "recurse" <~ var "f" @@ (var "fsub" @@ var "recurse") $
   var "recurse" @@ var "term0"
 
@@ -1630,7 +1498,7 @@
   "f" ~> "cx0" ~> "term0" ~>
   "forSubterms" <~ ("recurse0" ~> "cx" ~> "term" ~>
     "recurse" <~ var "recurse0" @@ var "cx" $
-    "forField" <~ ("field" ~> Core.fieldWithTerm (var "recurse" @@ (Core.fieldTerm $ var "field")) (var "field")) $
+    "forField" <~ ("field" ~> Core.fieldWithTerm (var "field") (var "recurse" @@ (Core.fieldTerm $ var "field"))) $
     "forElimination" <~ ("elm" ~> cases _Elimination (var "elm") Nothing [
       _Elimination_record>>: "p" ~> Core.eliminationRecord (var "p"),
       _Elimination_union>>: "cs" ~> Core.eliminationUnion $ Core.caseStatement
@@ -1697,34 +1565,34 @@
   "rewrite" <~ ("cx" ~> "term" ~> var "f" @@ (var "forSubterms" @@ var "rewrite") @@ var "cx" @@ var "term") $
   var "rewrite" @@ var "cx0" @@ var "term0"
 
-rewriteTermWithContextM :: TBinding (((a -> Term -> Flow s Term) -> a -> Term -> Flow s Term) -> a -> Term -> Flow s Term)
+rewriteTermWithContextM :: TBinding (((a -> Term -> Prelude.Either e Term) -> a -> Term -> Prelude.Either e Term) -> a -> Term -> Prelude.Either e Term)
 rewriteTermWithContextM = define "rewriteTermWithContextM" $
-  doc ("A variant of rewriteTermM which allows a context (e.g. a TypeContext)"
+  doc ("Either-based variant of rewriteTermWithContextM which allows a context (e.g. a TypeContext)"
     <> " to be passed down to all subterms during rewriting") $
   "f" ~> "cx0" ~> "term0" ~>
   "forSubterms" <~ ("recurse0" ~> "cx" ~> "term" ~>
     "recurse" <~ var "recurse0" @@ var "cx" $
     "forField" <~ ("field" ~>
       "t" <<~ var "recurse" @@ Core.fieldTerm (var "field") $
-      produce $ Core.fieldWithTerm (var "t") (var "field")) $
+      right $ Core.fieldWithTerm (var "field") (var "t")) $
     "forPair" <~ ("kv" ~>
       "k" <<~ var "recurse" @@ (Pairs.first $ var "kv") $
       "v" <<~ var "recurse" @@ (Pairs.second $ var "kv") $
-      produce $ pair (var "k") (var "v")) $
+      right $ pair (var "k") (var "v")) $
     "forElimination" <~ ("e" ~> cases _Elimination (var "e") Nothing [
-      _Elimination_record>>: "p" ~> produce $ Core.functionElimination $ Core.eliminationRecord $ var "p",
+      _Elimination_record>>: "p" ~> right $ Core.functionElimination $ Core.eliminationRecord $ var "p",
       _Elimination_union>>: "cs" ~>
         "n" <~ Core.caseStatementTypeName (var "cs") $
         "def" <~ Core.caseStatementDefault (var "cs") $
         "cases" <~ Core.caseStatementCases (var "cs") $
-        "rdef" <<~ Maybes.maybe (produce nothing)
-          ("t" ~> Flows.map (unaryFunction just) $ var "recurse" @@ var "t")
+        "rdef" <<~ Maybes.maybe (right nothing)
+          ("t" ~> Eithers.map (unaryFunction just) $ var "recurse" @@ var "t")
           (var "def") $
-        Flows.map
+        Eithers.map
           ("rcases" ~> Core.functionElimination $ Core.eliminationUnion $
             Core.caseStatement (var "n") (var "rdef") (var "rcases"))
-          (Flows.mapList (var "forField") (var "cases")),
-      _Elimination_wrap>>: "name" ~> produce $ Core.functionElimination $ Core.eliminationWrap $ var "name"]) $
+          (Eithers.mapList (var "forField") (var "cases")),
+      _Elimination_wrap>>: "name" ~> right $ Core.functionElimination $ Core.eliminationWrap $ var "name"]) $
     "forFunction" <~ ("fun" ~> cases _Function (var "fun") Nothing [
       _Function_elimination>>: "e" ~> var "forElimination" @@ var "e",
       _Function_lambda>>: "l" ~>
@@ -1732,78 +1600,78 @@
         "d" <~ Core.lambdaDomain (var "l") $
         "body" <~ Core.lambdaBody (var "l") $
         "rbody" <<~ var "recurse" @@ var "body" $
-        produce $ Core.functionLambda $ Core.lambda (var "v") (var "d") (var "rbody"),
-      _Function_primitive>>: "name" ~> produce $ Core.functionPrimitive $ var "name"]) $
+        right $ Core.functionLambda $ Core.lambda (var "v") (var "d") (var "rbody"),
+      _Function_primitive>>: "name" ~> right $ Core.functionPrimitive $ var "name"]) $
     "mapBinding" <~ ("b" ~>
       "v" <<~ var "recurse" @@ (Core.bindingTerm $ var "b") $
-      produce $ Core.binding (Core.bindingName $ var "b") (var "v") (Core.bindingType $ var "b")) $
+      right $ Core.binding (Core.bindingName $ var "b") (var "v") (Core.bindingType $ var "b")) $
     cases _Term (var "term") Nothing [
       _Term_annotated>>: "at" ~>
         "ex" <<~ var "recurse" @@ Core.annotatedTermBody (var "at") $
-        produce $ Core.termAnnotated $ Core.annotatedTerm (var "ex") (Core.annotatedTermAnnotation $ var "at"),
+        right $ Core.termAnnotated $ Core.annotatedTerm (var "ex") (Core.annotatedTermAnnotation $ var "at"),
       _Term_application>>: "app" ~>
         "lhs" <<~ var "recurse" @@ Core.applicationFunction (var "app") $
         "rhs" <<~ var "recurse" @@ Core.applicationArgument (var "app") $
-        produce $ Core.termApplication $ Core.application (var "lhs") (var "rhs"),
+        right $ Core.termApplication $ Core.application (var "lhs") (var "rhs"),
       _Term_either>>: "e" ~>
         "re" <<~ Eithers.either_
-          ("l" ~> Flows.map (unaryFunction left) $ var "recurse" @@ var "l")
-          ("r" ~> Flows.map (unaryFunction right) $ var "recurse" @@ var "r")
+          ("l" ~> Eithers.map (unaryFunction left) $ var "recurse" @@ var "l")
+          ("r" ~> Eithers.map (unaryFunction right) $ var "recurse" @@ var "r")
           (var "e") $
-        produce $ Core.termEither $ var "re",
+        right $ Core.termEither $ var "re",
       _Term_function>>: "fun" ~>
         "rfun" <<~ var "forFunction" @@ var "fun" $
-        produce $ Core.termFunction $ var "rfun",
+        right $ Core.termFunction $ var "rfun",
       _Term_let>>: "lt" ~>
         "bindings" <~ Core.letBindings (var "lt") $
         "body" <~ Core.letBody (var "lt") $
-        "rbindings" <<~ Flows.mapList (var "mapBinding") (var "bindings") $
+        "rbindings" <<~ Eithers.mapList (var "mapBinding") (var "bindings") $
         "rbody" <<~ var "recurse" @@ var "body" $
-        produce $ Core.termLet $ Core.let_ (var "rbindings") (var "rbody"),
+        right $ Core.termLet $ Core.let_ (var "rbindings") (var "rbody"),
       _Term_list>>: "els" ~>
-        "rels" <<~ Flows.mapList (var "recurse") (var "els") $
-        produce $ Core.termList $ var "rels",
-      _Term_literal>>: "v" ~> produce $ Core.termLiteral $ var "v",
+        "rels" <<~ Eithers.mapList (var "recurse") (var "els") $
+        right $ Core.termList $ var "rels",
+      _Term_literal>>: "v" ~> right $ Core.termLiteral $ var "v",
       _Term_map>>: "m" ~>
-        "pairs" <<~ Flows.mapList (var "forPair") (Maps.toList $ var "m") $
-        produce $ Core.termMap $ Maps.fromList $ var "pairs",
+        "pairs" <<~ Eithers.mapList (var "forPair") (Maps.toList $ var "m") $
+        right $ Core.termMap $ Maps.fromList $ var "pairs",
       _Term_maybe>>: "m" ~>
-        "rm" <<~ Flows.mapMaybe (var "recurse") (var "m") $
-        produce $ Core.termMaybe $ var "rm",
+        "rm" <<~ Eithers.mapMaybe (var "recurse") (var "m") $
+        right $ Core.termMaybe $ var "rm",
       _Term_pair>>: "p" ~>
         "rfirst" <<~ var "recurse" @@ Pairs.first (var "p") $
         "rsecond" <<~ var "recurse" @@ Pairs.second (var "p") $
-        produce $ Core.termPair $ pair (var "rfirst") (var "rsecond"),
+        right $ Core.termPair $ pair (var "rfirst") (var "rsecond"),
       _Term_record>>: "r" ~>
         "n" <~ Core.recordTypeName (var "r") $
         "fields" <~ Core.recordFields (var "r") $
-        Flows.map
+        Eithers.map
           ("rfields" ~> Core.termRecord $ Core.record (var "n") (var "rfields"))
-          (Flows.mapList (var "forField") (var "fields")),
+          (Eithers.mapList (var "forField") (var "fields")),
       _Term_set>>: "s" ~>
-        "rlist" <<~ Flows.mapList (var "recurse") (Sets.toList $ var "s") $
-        produce $ Core.termSet $ Sets.fromList $ var "rlist",
+        "rlist" <<~ Eithers.mapList (var "recurse") (Sets.toList $ var "s") $
+        right $ Core.termSet $ Sets.fromList $ var "rlist",
       _Term_typeApplication>>: "tt" ~>
         "t" <<~ var "recurse" @@ Core.typeApplicationTermBody (var "tt") $
-        produce $ Core.termTypeApplication $ Core.typeApplicationTerm (var "t") (Core.typeApplicationTermType (var "tt")),
+        right $ Core.termTypeApplication $ Core.typeApplicationTerm (var "t") (Core.typeApplicationTermType (var "tt")),
       _Term_typeLambda>>: "tl" ~>
         "v" <~ Core.typeLambdaParameter (var "tl") $
         "body" <~ Core.typeLambdaBody (var "tl") $
         "rbody" <<~ var "recurse" @@ var "body" $
-        produce $ Core.termTypeLambda $ Core.typeLambda (var "v") (var "rbody"),
+        right $ Core.termTypeLambda $ Core.typeLambda (var "v") (var "rbody"),
       _Term_union>>: "i" ~>
         "n" <~ Core.injectionTypeName (var "i") $
         "field" <~ Core.injectionField (var "i") $
-        Flows.map
+        Eithers.map
           ("rfield" ~> Core.termUnion $ Core.injection (var "n") (var "rfield"))
           (var "forField" @@ var "field"),
-      _Term_unit>>: constant $ produce Core.termUnit,
-      _Term_variable>>: "v" ~> produce $ Core.termVariable $ var "v",
+      _Term_unit>>: constant $ right Core.termUnit,
+      _Term_variable>>: "v" ~> right $ Core.termVariable $ var "v",
       _Term_wrap>>: "wt" ~>
         "name" <~ Core.wrappedTermTypeName (var "wt") $
         "t" <~ Core.wrappedTermBody (var "wt") $
         "rt" <<~ var "recurse" @@ var "t" $
-        produce $ Core.termWrap $ Core.wrappedTerm (var "name") (var "rt")]) $
+        right $ Core.termWrap $ Core.wrappedTerm (var "name") (var "rt")]) $
 
   "rewrite" <~ ("cx" ~> "term" ~> var "f" @@ (var "forSubterms" @@ var "rewrite") @@ var "cx" @@ var "term") $
   var "rewrite" @@ var "cx0" @@ var "term0"
@@ -1837,85 +1705,79 @@
         (var "recurse" @@ (Core.mapTypeKeys $ var "mt"))
         (var "recurse" @@ (Core.mapTypeValues $ var "mt")),
       _Type_maybe>>: "t" ~> Core.typeMaybe $ var "recurse" @@ var "t",
-      _Type_record>>: "rt" ~> Core.typeRecord $ Core.rowType
-        (Core.rowTypeTypeName $ var "rt")
-        (Lists.map (var "forField") (Core.rowTypeFields $ var "rt")),
+      _Type_record>>: "rt" ~> Core.typeRecord $
+        Lists.map (var "forField") (var "rt"),
       _Type_set>>: "t" ~> Core.typeSet $ var "recurse" @@ var "t",
-      _Type_union>>: "rt" ~> Core.typeUnion $ Core.rowType
-        (Core.rowTypeTypeName $ var "rt")
-        (Lists.map (var "forField") (Core.rowTypeFields $ var "rt")),
+      _Type_union>>: "rt" ~> Core.typeUnion $
+        Lists.map (var "forField") (var "rt"),
       _Type_unit>>: constant Core.typeUnit,
       _Type_variable>>: "v" ~> Core.typeVariable $ var "v",
-      _Type_wrap>>: "wt" ~> Core.typeWrap $ Core.wrappedType
-        (Core.wrappedTypeTypeName $ var "wt")
-        (var "recurse" @@ (Core.wrappedTypeBody $ var "wt"))]) $
+      _Type_void>>: constant Core.typeVoid,
+      _Type_wrap>>: "wt" ~> Core.typeWrap $
+        var "recurse" @@ var "wt"]) $
 --  rewrite @@ var "fsub" @@ var "f" -- TODO: restore global rewrite/fix instead of the local definition
   "recurse" <~ var "f" @@ (var "fsub" @@ var "recurse") $
   var "recurse" @@ var "typ0"
 
-rewriteTypeM :: TBinding (((Type -> Flow s Type) -> Type -> Flow s Type) -> Type -> Flow s Type)
+rewriteTypeM :: TBinding (((Type -> Prelude.Either e Type) -> Type -> Prelude.Either e Type) -> Type -> Prelude.Either e Type)
 rewriteTypeM = define "rewriteTypeM" $
-  doc "Monadic type rewriting" $
+  doc "Either-based type rewriting" $
   "f" ~> "typ0" ~>
   "fsub" <~ ("recurse" ~> "typ" ~> cases _Type (var "typ") Nothing [
     _Type_annotated>>: "at" ~>
       "t" <<~ var "recurse" @@ (Core.annotatedTypeBody $ var "at") $
-      produce $ Core.typeAnnotated $ Core.annotatedType (var "t") (Core.annotatedTypeAnnotation $ var "at"),
+      right $ Core.typeAnnotated $ Core.annotatedType (var "t") (Core.annotatedTypeAnnotation $ var "at"),
     _Type_application>>: "at" ~>
       "lhs" <<~ var "recurse" @@ (Core.applicationTypeFunction $ var "at") $
       "rhs" <<~ var "recurse" @@ (Core.applicationTypeArgument $ var "at") $
-      produce $ Core.typeApplication $ Core.applicationType (var "lhs") (var "rhs"),
+      right $ Core.typeApplication $ Core.applicationType (var "lhs") (var "rhs"),
     _Type_either>>: "et" ~>
       "left" <<~ var "recurse" @@ (Core.eitherTypeLeft $ var "et") $
       "right" <<~ var "recurse" @@ (Core.eitherTypeRight $ var "et") $
-      produce $ Core.typeEither $ Core.eitherType (var "left") (var "right"),
+      right $ Core.typeEither $ Core.eitherType (var "left") (var "right"),
     _Type_pair>>: "pt" ~>
       "pairFirst" <<~ var "recurse" @@ (Core.pairTypeFirst $ var "pt") $
       "pairSecond" <<~ var "recurse" @@ (Core.pairTypeSecond $ var "pt") $
-      produce $ Core.typePair $ Core.pairType (var "pairFirst") (var "pairSecond"),
+      right $ Core.typePair $ Core.pairType (var "pairFirst") (var "pairSecond"),
     _Type_function>>: "ft" ~>
       "dom" <<~ var "recurse" @@ (Core.functionTypeDomain $ var "ft") $
       "cod" <<~ var "recurse" @@ (Core.functionTypeCodomain $ var "ft") $
-      produce $ Core.typeFunction $ Core.functionType (var "dom") (var "cod"),
+      right $ Core.typeFunction $ Core.functionType (var "dom") (var "cod"),
     _Type_forall>>: "ft" ~>
       "b" <<~ var "recurse" @@ (Core.forallTypeBody $ var "ft") $
-      produce $ Core.typeForall $ Core.forallType (Core.forallTypeParameter $ var "ft") (var "b"),
+      right $ Core.typeForall $ Core.forallType (Core.forallTypeParameter $ var "ft") (var "b"),
     _Type_list>>: "t" ~>
       "rt" <<~ var "recurse" @@ var "t" $
-      produce $ Core.typeList $ var "rt",
-    _Type_literal>>: "lt" ~> produce $ Core.typeLiteral $ var "lt",
+      right $ Core.typeList $ var "rt",
+    _Type_literal>>: "lt" ~> right $ Core.typeLiteral $ var "lt",
     _Type_map>>: "mt" ~>
       "kt" <<~ var "recurse" @@ (Core.mapTypeKeys $ var "mt") $
       "vt" <<~ var "recurse" @@ (Core.mapTypeValues $ var "mt") $
-      produce $ Core.typeMap $ Core.mapType (var "kt") (var "vt"),
+      right $ Core.typeMap $ Core.mapType (var "kt") (var "vt"),
     _Type_maybe>>: "t" ~>
       "rt" <<~ var "recurse" @@ var "t" $
-      produce $ Core.typeMaybe $ var "rt",
+      right $ Core.typeMaybe $ var "rt",
     _Type_record>>: "rt" ~>
-      "name" <~ Core.rowTypeTypeName (var "rt") $
-      "fields" <~ Core.rowTypeFields (var "rt") $
       "forField" <~ ("f" ~>
         "t" <<~ var "recurse" @@ (Core.fieldTypeType $ var "f") $
-        produce $ Core.fieldTypeWithType (var "f") (var "t")) $
-      "rfields" <<~ Flows.mapList (var "forField") (var "fields") $
-      produce $ Core.typeRecord $ Core.rowType (var "name") (var "rfields"),
+        right $ Core.fieldTypeWithType (var "f") (var "t")) $
+      "rfields" <<~ Eithers.mapList (var "forField") (var "rt") $
+      right $ Core.typeRecord $ var "rfields",
     _Type_set>>: "t" ~>
       "rt" <<~ var "recurse" @@ var "t" $
-      produce $ Core.typeSet $ var "rt",
+      right $ Core.typeSet $ var "rt",
     _Type_union>>: "rt" ~>
-      "name" <~ Core.rowTypeTypeName (var "rt") $
-      "fields" <~ Core.rowTypeFields (var "rt") $
       "forField" <~ ("f" ~>
         "t" <<~ var "recurse" @@ (Core.fieldTypeType $ var "f") $
-        produce $ Core.fieldTypeWithType (var "f") (var "t")) $
-      "rfields" <<~ Flows.mapList (var "forField") (var "fields") $
-      produce $ Core.typeUnion $ Core.rowType (var "name") (var "rfields"),
-    _Type_unit>>: constant $ produce Core.typeUnit,
-    _Type_variable>>: "v" ~> produce $ Core.typeVariable $ var "v",
+        right $ Core.fieldTypeWithType (var "f") (var "t")) $
+      "rfields" <<~ Eithers.mapList (var "forField") (var "rt") $
+      right $ Core.typeUnion $ var "rfields",
+    _Type_unit>>: constant $ right $ Core.typeUnit,
+    _Type_variable>>: "v" ~> right $ Core.typeVariable $ var "v",
+    _Type_void>>: constant $ right $ Core.typeVoid,
     _Type_wrap>>: "wt" ~>
-      "t" <<~ var "recurse" @@ (Core.wrappedTypeBody $ var "wt") $
-      produce $ Core.typeWrap $ Core.wrappedType (Core.wrappedTypeTypeName $ var "wt") (var "t")]) $
---  rewrite @@ var "fsub" @@ var "f" -- TODO: restore global rewrite/fix instead of the local definition
+      "t" <<~ var "recurse" @@ var "wt" $
+      right $ Core.typeWrap $ var "t"]) $
   "recurse" <~ var "f" @@ (var "fsub" @@ var "recurse") $
   var "recurse" @@ var "typ0"
 
@@ -1960,6 +1822,42 @@
       Core.typeVariable $ Maybes.fromMaybe (var "n") $ Maps.lookup (var "n") (var "subst")]) $
   rewriteType @@ var "replace" @@ var "typ"
 
+substituteTypeVariablesInTerm :: TBinding (M.Map Name Name -> Term -> Term)
+substituteTypeVariablesInTerm = define "substituteTypeVariablesInTerm" $
+  doc "Substitute type variables throughout a term, including in type annotations, type applications, lambda domains, and type schemes" $
+  "subst" ~> "term" ~>
+  "st" <~ substituteTypeVariables @@ var "subst" $
+  "stOpt" <~ ("mt" ~> Maybes.map (var "st") (var "mt")) $
+  "stScheme" <~ ("ts" ~> Core.typeScheme (Core.typeSchemeVariables $ var "ts") (var "st" @@ (Core.typeSchemeType $ var "ts")) (Core.typeSchemeConstraints $ var "ts")) $
+  "stSchemeOpt" <~ ("mts" ~> Maybes.map (var "stScheme") (var "mts")) $
+  "replace" <~ ("recurse" ~> "t" ~>
+    cases _Term (var "t")
+      (Just $ var "recurse" @@ var "t") [
+      _Term_function>>: match _Function
+        (Just $ var "recurse" @@ var "t") [
+        _Function_lambda>>: "l" ~> Core.termFunction $ Core.functionLambda $ Core.lambda
+          (Core.lambdaParameter $ var "l")
+          (var "stOpt" @@ (Core.lambdaDomain $ var "l"))
+          (var "recurse" @@ (Core.lambdaBody $ var "l"))],
+      _Term_let>>: "lt" ~>
+        "mapBinding" <~ ("b" ~> Core.binding
+          (Core.bindingName $ var "b")
+          (var "recurse" @@ (Core.bindingTerm $ var "b"))
+          (var "stSchemeOpt" @@ (Core.bindingType $ var "b"))) $
+        Core.termLet $ Core.let_
+          (Lists.map (var "mapBinding") (Core.letBindings $ var "lt"))
+          (var "recurse" @@ (Core.letBody $ var "lt")),
+      _Term_typeApplication>>: "tt" ~> Core.termTypeApplication $ Core.typeApplicationTerm
+        (var "recurse" @@ (Core.typeApplicationTermBody $ var "tt"))
+        (var "st" @@ (Core.typeApplicationTermType $ var "tt")),
+      _Term_typeLambda>>: "tl" ~> Core.termTypeLambda $ Core.typeLambda
+        (Maybes.fromMaybe (Core.typeLambdaParameter $ var "tl") (Maps.lookup (Core.typeLambdaParameter $ var "tl") (var "subst")))
+        (var "recurse" @@ (Core.typeLambdaBody $ var "tl")),
+      _Term_annotated>>: "at" ~> Core.termAnnotated $ Core.annotatedTerm
+        (var "recurse" @@ (Core.annotatedTermBody $ var "at"))
+        (Core.annotatedTermAnnotation $ var "at")]) $
+  rewriteTerm @@ var "replace" @@ var "term"
+
 substituteVariable :: TBinding (Name -> Name -> Term -> Term)
 substituteVariable = define "substituteVariable" $
   doc "Substitute one variable for another in a term" $
@@ -2034,72 +1932,71 @@
     _Term_variable>>: constant $ list ([] :: [TTerm Term]),
     _Term_wrap>>: "n" ~> list [Core.wrappedTermBody $ var "n"]]
 
-subtermsWithAccessors :: TBinding (Term -> [(TermAccessor, Term)])
-subtermsWithAccessors = define "subtermsWithAccessors" $
+subtermsWithSteps :: TBinding (Term -> [(SubtermStep, Term)])
+subtermsWithSteps = define "subtermsWithSteps" $
   doc "Find the children of a given term" $
   match _Term Nothing [
-    _Term_annotated>>: "at" ~> single Accessors.termAccessorAnnotatedBody $ Core.annotatedTermBody $ var "at",
+    _Term_annotated>>: "at" ~> single Paths.subtermStepAnnotatedBody $ Core.annotatedTermBody $ var "at",
     _Term_application>>: "p" ~> list [
-      result Accessors.termAccessorApplicationFunction $ Core.applicationFunction $ var "p",
-      result Accessors.termAccessorApplicationArgument $ Core.applicationArgument $ var "p"],
-    _Term_either>>: "e" ~> none, -- TODO: add accessors when TermAccessor type is updated
+      result Paths.subtermStepApplicationFunction $ Core.applicationFunction $ var "p",
+      result Paths.subtermStepApplicationArgument $ Core.applicationArgument $ var "p"],
+    _Term_either>>: "e" ~> none, -- TODO: add steps when SubtermStep type is updated
     _Term_function>>: match _Function
       (Just none) [
       _Function_elimination>>: match _Elimination
         (Just none) [
         _Elimination_union>>: "cs" ~> Lists.concat2
           (Maybes.maybe none
-            ("t" ~> single Accessors.termAccessorUnionCasesDefault $ var "t")
+            ("t" ~> single Paths.subtermStepUnionCasesDefault $ var "t")
             (Core.caseStatementDefault $ var "cs"))
           (Lists.map
-            ("f" ~> result (Accessors.termAccessorUnionCasesBranch $ Core.fieldName $ var "f") $ Core.fieldTerm $ var "f")
+            ("f" ~> result (Paths.subtermStepUnionCasesBranch $ Core.fieldName $ var "f") $ Core.fieldTerm $ var "f")
             (Core.caseStatementCases $ var "cs"))],
-      _Function_lambda>>: "l" ~> single Accessors.termAccessorLambdaBody $ Core.lambdaBody $ var "l"],
+      _Function_lambda>>: "l" ~> single Paths.subtermStepLambdaBody $ Core.lambdaBody $ var "l"],
     _Term_let>>: "lt" ~> Lists.cons
-      (result Accessors.termAccessorLetEnvironment $ Core.letBody $ var "lt")
+      (result Paths.subtermStepLetBody $ Core.letBody $ var "lt")
       (Lists.map
-        ("b" ~> result (Accessors.termAccessorLetBinding $ Core.bindingName $ var "b") $ Core.bindingTerm $ var "b")
+        ("b" ~> result (Paths.subtermStepLetBinding $ Core.bindingName $ var "b") $ Core.bindingTerm $ var "b")
         (Core.letBindings $ var "lt")),
     _Term_list>>: "l" ~> Lists.map
       -- TODO: use a range of indexes from 0 to len(l)-1, rather than just 0
-      ("e" ~> result (Accessors.termAccessorListElement $ int32 0) $ var "e")
+      ("e" ~> result (Paths.subtermStepListElement $ int32 0) $ var "e")
       (var "l"),
     _Term_literal>>: constant none,
     _Term_map>>: "m" ~> Lists.concat
       (Lists.map
         ("p" ~> list [
           -- TODO: use a range of indexes from 0 to len(l)-1, rather than just 0
-          result (Accessors.termAccessorMapKey $ int32 0) $ Pairs.first $ var "p",
-          result (Accessors.termAccessorMapValue $ int32 0) $ Pairs.second $ var "p"])
+          result (Paths.subtermStepMapKey $ int32 0) $ Pairs.first $ var "p",
+          result (Paths.subtermStepMapValue $ int32 0) $ Pairs.second $ var "p"])
         (Maps.toList $ var "m")),
     _Term_maybe>>: "m" ~> Maybes.maybe none
-      ("t" ~> single Accessors.termAccessorOptionalTerm $ var "t")
+      ("t" ~> single Paths.subtermStepMaybeTerm $ var "t")
       (var "m"),
-    _Term_pair>>: "p" ~> none, -- TODO: add accessors when TermAccessor type is updated
+    _Term_pair>>: "p" ~> none, -- TODO: add steps when SubtermStep type is updated
     _Term_record>>: "rt" ~> Lists.map
-      ("f" ~> result (Accessors.termAccessorRecordField $ Core.fieldName $ var "f") $ Core.fieldTerm $ var "f")
+      ("f" ~> result (Paths.subtermStepRecordField $ Core.fieldName $ var "f") $ Core.fieldTerm $ var "f")
       (Core.recordFields $ var "rt"),
     _Term_set>>: "s" ~> Lists.map
       -- TODO: use a range of indexes from 0 to len(l)-1, rather than just 0
-      ("e" ~> result (Accessors.termAccessorListElement $ int32 0) $ var "e")
+      ("e" ~> result (Paths.subtermStepListElement $ int32 0) $ var "e")
       (Sets.toList $ var "s"),
     _Term_typeApplication>>: "ta" ~>
-      single Accessors.termAccessorTypeApplicationTerm $
+      single Paths.subtermStepTypeApplicationTerm $
       Core.typeApplicationTermBody $ var "ta",
     _Term_typeLambda>>: "ta" ~>
-      single Accessors.termAccessorTypeLambdaBody $
+      single Paths.subtermStepTypeLambdaBody $
       Core.typeLambdaBody $ var "ta",
     _Term_union>>: "ut" ~>
-      single Accessors.termAccessorInjectionTerm $
+      single Paths.subtermStepInjectionTerm $
       Core.fieldTerm $ (Core.injectionField $ var "ut"),
     _Term_unit>>: constant none,
     _Term_variable>>: constant none,
-    _Term_wrap>>: "n" ~> single Accessors.termAccessorWrappedTerm $ Core.wrappedTermBody $ var "n"]
+    _Term_wrap>>: "n" ~> single Paths.subtermStepWrappedTerm $ Core.wrappedTermBody $ var "n"]
   where
-    none = list ([] :: [TTerm (TermAccessor, Term)])
-    single accessor term = list [result accessor term]
-    result accessor term = pair accessor term
-    simple term = result Accessors.termAccessorAnnotatedBody term
+    none = list ([] :: [TTerm (SubtermStep, Term)])
+    single step term = list [result step term]
+    result step term = pair step term
 
 subtypes :: TBinding (Type -> [Type])
 subtypes = define "subtypes" $
@@ -2125,12 +2022,13 @@
       Core.mapTypeKeys $ var "mt",
       Core.mapTypeValues $ var "mt"],
     _Type_maybe>>: "ot" ~> list [var "ot"],
-    _Type_record>>: "rt" ~> Lists.map (unaryFunction Core.fieldTypeType) (Core.rowTypeFields $ var "rt"),
+    _Type_record>>: "rt" ~> Lists.map (unaryFunction Core.fieldTypeType) (var "rt"),
     _Type_set>>: "st" ~> list [var "st"],
-    _Type_union>>: "rt" ~> Lists.map (unaryFunction Core.fieldTypeType) (Core.rowTypeFields $ var "rt"),
+    _Type_union>>: "rt" ~> Lists.map (unaryFunction Core.fieldTypeType) (var "rt"),
     _Type_unit>>: constant $ list ([] :: [TTerm Type]),
     _Type_variable>>: constant $ list ([] :: [TTerm Type]),
-    _Type_wrap>>: "nt" ~> list [Core.wrappedTypeBody $ var "nt"]]
+    _Type_void>>: constant $ list ([] :: [TTerm Type]),
+    _Type_wrap>>: "nt" ~> list [var "nt"]]
 
 termDependencyNames :: TBinding (Bool -> Bool -> Bool -> Term -> S.Set Name)
 termDependencyNames = define "termDependencyNames" $
@@ -2225,17 +2123,7 @@
 typeNamesInType :: TBinding (Type -> S.Set Name)
 typeNamesInType = define "typeNamesInType" $
   "typ0" ~>
-  "addNames" <~ ("names" ~> "typ" ~> cases _Type (var "typ")
-    (Just $ var "names") [
-    _Type_record>>: "rowType" ~>
-      "tname" <~ Core.rowTypeTypeName (var "rowType") $
-      Sets.insert (var "tname") (var "names"),
-    _Type_union>>: "rowType" ~>
-      "tname" <~ Core.rowTypeTypeName (var "rowType") $
-      Sets.insert (var "tname") (var "names"),
-    _Type_wrap>>: "wrappedType" ~>
-      "tname" <~ Core.wrappedTypeTypeName (var "wrappedType") $
-      Sets.insert (var "tname") (var "names")]) $
+  "addNames" <~ ("names" ~> "typ" ~> var "names") $
   foldOverType @@ Coders.traversalOrderPre @@ var "addNames" @@ Sets.empty @@ var "typ0"
 
 unshadowVariables :: TBinding (Term -> Term)
@@ -2279,3 +2167,215 @@
       (var "v")
       ("renamed" ~> var "renamed")]) $
   rewriteTermWithContext @@ var "f" @@ Maps.empty @@ var "term0"
+
+fTypeToTypeScheme :: TBinding (Type -> TypeScheme)
+fTypeToTypeScheme = define "fTypeToTypeScheme" $
+  doc "Convert a forall type to a type scheme" $
+  "typ" ~>
+  "gatherForall" <~ ("vars" ~> "typ" ~> cases _Type (deannotateType @@ var "typ")
+     (Just $ Core.typeScheme (Lists.reverse $ var "vars") (var "typ") Phantoms.nothing) [
+     _Type_forall>>: "ft" ~> var "gatherForall" @@
+       (Lists.cons (Core.forallTypeParameter $ var "ft") (var "vars")) @@
+       (Core.forallTypeBody $ var "ft")]) $
+  var "gatherForall" @@ list ([] :: [TTerm Name]) @@ var "typ"
+
+typeSchemeToFType :: TBinding (TypeScheme -> Type)
+typeSchemeToFType = define "typeSchemeToFType" $
+  doc "Convert a type scheme to a forall type" $
+  "ts" ~>
+  "vars" <~ Core.typeSchemeVariables (var "ts") $
+  "body" <~ Core.typeSchemeType (var "ts") $
+  Lists.foldl
+    ("t" ~> "v" ~> Core.typeForall $ Core.forallType (var "v") (var "t"))
+    (var "body")
+    (Lists.reverse $ var "vars")
+
+extendGraphForLambda :: TBinding (Graph -> Lambda -> Graph)
+extendGraphForLambda = define "extendGraphForLambda" $
+  doc "Extend a graph by descending into a lambda body" $
+  "g" ~> "lam" ~>
+  "var" <~ Core.lambdaParameter (var "lam") $
+  Graph.graph
+    (Graph.graphBoundTerms $ var "g")
+    (optCases (Core.lambdaDomain $ var "lam")
+      (Graph.graphBoundTypes $ var "g")
+      ("dom" ~> Maps.insert (var "var") (fTypeToTypeScheme @@ var "dom") $ Graph.graphBoundTypes $ var "g"))
+    (Graph.graphClassConstraints $ var "g")
+    (Sets.insert (var "var") $ Graph.graphLambdaVariables $ var "g")
+    (Maps.delete (var "var") $ Graph.graphMetadata $ var "g")
+    (Graph.graphPrimitives $ var "g")
+    (Graph.graphSchemaTypes $ var "g")
+    (Graph.graphTypeVariables $ var "g")
+
+extendGraphForLet :: TBinding ((Graph -> Binding -> Maybe Term) -> Graph -> Let -> Graph)
+extendGraphForLet = define "extendGraphForLet" $
+  doc "Extend a graph by descending into a let body" $
+  "forBinding" ~> "g" ~> "letrec" ~>
+  "bindings" <~ Core.letBindings (var "letrec") $
+  -- Pre-extend graph with sibling bindings so forBinding can resolve them
+  "g2" <~ (extendGraphWithBindings @@ var "bindings" @@ var "g") $
+  Graph.graph
+    -- Add all binding terms
+    (Maps.union
+      (Maps.fromList $ Lists.map ("b" ~> pair (Core.bindingName $ var "b") (Core.bindingTerm $ var "b")) (var "bindings"))
+      (Graph.graphBoundTerms $ var "g"))
+    -- Add typed binding type schemes; untyped bindings are not added, so outer types are shadowed by union precedence
+    (Maps.union
+      (Maps.fromList $ Maybes.cat $ Lists.map
+        ("b" ~> Maybes.map ("ts" ~> pair (Core.bindingName $ var "b") (var "ts"))
+          (Core.bindingType $ var "b"))
+        (var "bindings"))
+      (Graph.graphBoundTypes $ var "g"))
+    (Graph.graphClassConstraints $ var "g")
+    -- Remove all binding names from lambda variables; they are shadowed
+    (Lists.foldl ("s" ~> "b" ~> Sets.delete (Core.bindingName $ var "b") (var "s"))
+      (Graph.graphLambdaVariables $ var "g")
+      (var "bindings"))
+    -- Update metadata per binding, accumulating a full graph so each binding sees earlier siblings' metadata
+    (Graph.graphMetadata $ Lists.foldl
+      ("gAcc" ~> "b" ~>
+        "m" <~ (Graph.graphMetadata $ var "gAcc") $
+        "newMeta" <~ (optCases (var "forBinding" @@ var "gAcc" @@ var "b")
+          (Maps.delete (Core.bindingName $ var "b") (var "m"))
+          ("t" ~> Maps.insert (Core.bindingName $ var "b") (var "t") (var "m"))) $
+        Graph.graph
+          (Graph.graphBoundTerms $ var "gAcc")
+          (Graph.graphBoundTypes $ var "gAcc")
+          (Graph.graphClassConstraints $ var "gAcc")
+          (Graph.graphLambdaVariables $ var "gAcc")
+          (var "newMeta")
+          (Graph.graphPrimitives $ var "gAcc")
+          (Graph.graphSchemaTypes $ var "gAcc")
+          (Graph.graphTypeVariables $ var "gAcc"))
+      (var "g2")
+      (var "bindings"))
+    (Graph.graphPrimitives $ var "g")
+    (Graph.graphSchemaTypes $ var "g")
+    (Graph.graphTypeVariables $ var "g")
+
+extendGraphForTypeLambda :: TBinding (Graph -> TypeLambda -> Graph)
+extendGraphForTypeLambda = define "extendGraphForTypeLambda" $
+  doc "Extend a graph by descending into a type lambda body" $
+  "g" ~> "tlam" ~>
+  "name" <~ Core.typeLambdaParameter (var "tlam") $
+  Graph.graph
+    (Graph.graphBoundTerms $ var "g")
+    (Graph.graphBoundTypes $ var "g")
+    (Graph.graphClassConstraints $ var "g")
+    (Graph.graphLambdaVariables $ var "g")
+    (Graph.graphMetadata $ var "g")
+    (Graph.graphPrimitives $ var "g")
+    (Graph.graphSchemaTypes $ var "g")
+    (Sets.insert (var "name") $ Graph.graphTypeVariables $ var "g")
+
+extendGraphWithBindings :: TBinding ([Binding] -> Graph -> Graph)
+extendGraphWithBindings = define "extendGraphWithBindings" $
+  doc "Add bindings to an existing graph" $
+  "bindings" ~> "g" ~>
+  -- Merge new binding terms/types into existing graph
+  "newTerms" <~ Maps.fromList (Lists.map ("b" ~>
+    pair (Core.bindingName (var "b")) (Core.bindingTerm (var "b"))) (var "bindings")) $
+  "newTypes" <~ Maps.fromList (Maybes.cat (Lists.map ("b" ~>
+    Maybes.map ("ts" ~> pair (Core.bindingName (var "b")) (var "ts"))
+      (Core.bindingType (var "b"))) (var "bindings"))) $
+  Graph.graph
+    (Maps.union (var "newTerms") (Graph.graphBoundTerms (var "g")))
+    (Maps.union (var "newTypes") (Graph.graphBoundTypes (var "g")))
+    (Graph.graphClassConstraints (var "g"))
+    (Graph.graphLambdaVariables (var "g"))
+    (Graph.graphMetadata (var "g"))
+    (Graph.graphPrimitives (var "g"))
+    (Graph.graphSchemaTypes (var "g"))
+    (Graph.graphTypeVariables (var "g"))
+
+rewriteAndFoldTermWithGraph :: TBinding (((a -> Term -> (a, Term)) -> Graph -> a -> Term -> (a, Term)) -> Graph -> a -> Term -> (a, Term))
+rewriteAndFoldTermWithGraph = define "rewriteAndFoldTermWithGraph" $
+  doc ("Rewrite a term while folding to produce a value, with Graph updated as we descend into subterms."
+    <> " Combines the features of rewriteAndFoldTerm and rewriteTermWithGraph."
+    <> " The user function f receives a recurse function that handles subterm traversal and Graph management.") $
+  "f" ~> "cx0" ~> "val0" ~> "term0" ~>
+  "wrapper" <~ ("lowLevelRecurse" ~> "valAndCx" ~> "term" ~>
+    "val" <~ Pairs.first (var "valAndCx") $
+    "cx" <~ Pairs.second (var "valAndCx") $
+    "cx1" <~ (cases _Term (var "term")
+      (Just $ var "cx") [
+      _Term_function>>: "fun" ~> cases _Function (var "fun")
+        (Just $ var "cx") [
+        _Function_lambda>>: "l" ~> extendGraphForLambda @@ var "cx" @@ var "l"],
+      _Term_let>>: "l" ~> extendGraphForLet @@ constant (constant nothing) @@ var "cx" @@ var "l",
+      _Term_typeLambda>>: "tl" ~> extendGraphForTypeLambda @@ var "cx" @@ var "tl"]) $
+    "recurseForUser" <~ ("newVal" ~> "subterm" ~>
+      "result" <~ var "lowLevelRecurse" @@ pair (var "newVal") (var "cx1") @@ var "subterm" $
+      pair (Pairs.first $ Pairs.first $ var "result") (Pairs.second $ var "result")) $
+    "fResult" <~ var "f" @@ var "recurseForUser" @@ var "cx1" @@ var "val" @@ var "term" $
+    pair (pair (Pairs.first $ var "fResult") (var "cx")) (Pairs.second $ var "fResult")) $
+  "result" <~ rewriteAndFoldTerm @@ var "wrapper" @@ pair (var "val0") (var "cx0") @@ var "term0" $
+  pair (Pairs.first $ Pairs.first $ var "result") (Pairs.second $ var "result")
+
+rewriteAndFoldTermWithGraphAndPath :: TBinding (
+  ((a -> Term -> (a, Term)) -> [SubtermStep] -> Graph -> a -> Term -> (a, Term))
+  -> Graph -> a -> Term -> (a, Term))
+rewriteAndFoldTermWithGraphAndPath = define "rewriteAndFoldTermWithGraphAndPath" $
+  doc ("Rewrite a term while folding to produce a value, with both Graph and accessor path tracked."
+    <> " The path is a list of SubtermSteps representing the position from the root to the current term."
+    <> " Combines the features of rewriteAndFoldTermWithPath and Graph tracking."
+    <> " The Graph is automatically updated when descending into lambdas, lets, and type lambdas.") $
+  "f" ~> "cx0" ~> "val0" ~> "term0" ~>
+  "wrapper" <~ ("recurse" ~> "path" ~> "cxAndVal" ~> "term" ~>
+    "cx" <~ Pairs.first (var "cxAndVal") $
+    "val" <~ Pairs.second (var "cxAndVal") $
+    "cx1" <~ (cases _Term (var "term")
+      (Just $ var "cx") [
+      _Term_function>>: "fun" ~> cases _Function (var "fun")
+        (Just $ var "cx") [
+        _Function_lambda>>: "l" ~> extendGraphForLambda @@ var "cx" @@ var "l"],
+      _Term_let>>: "l" ~> extendGraphForLet @@ constant (constant nothing) @@ var "cx" @@ var "l",
+      _Term_typeLambda>>: "tl" ~> extendGraphForTypeLambda @@ var "cx" @@ var "tl"]) $
+    "recurseForUser" <~ ("valIn" ~> "termIn" ~>
+      "result" <~ var "recurse" @@ var "path" @@ pair (var "cx1") (var "valIn") @@ var "termIn" $
+      pair (Pairs.second $ Pairs.first $ var "result") (Pairs.second $ var "result")) $
+    "fResult" <~ var "f" @@ var "recurseForUser" @@ var "path" @@ var "cx1" @@ var "val" @@ var "term" $
+    pair (pair (var "cx") (Pairs.first $ var "fResult")) (Pairs.second $ var "fResult")) $
+  "result" <~ rewriteAndFoldTermWithPath @@ var "wrapper" @@ pair (var "cx0") (var "val0") @@ var "term0" $
+  pair (Pairs.second $ Pairs.first $ var "result") (Pairs.second $ var "result")
+
+rewriteTermWithGraph :: TBinding (((Term -> Term) -> Graph -> Term -> Term) -> Graph -> Term -> Term)
+rewriteTermWithGraph = define "rewriteTermWithGraph" $
+  doc "Rewrite a term with the help of a Graph which is updated as we descend into subterms" $
+  "f" ~> "cx0" ~> "term0" ~>
+  "f2" <~ ("recurse" ~> "cx" ~> "term" ~>
+    "recurse1" <~ ("term" ~> var "recurse" @@ var "cx" @@ var "term") $
+    cases _Term (var "term") (Just $ var "f" @@ var "recurse1" @@ var "cx" @@ var "term") [
+      _Term_function>>: "fun" ~> cases _Function (var "fun")
+        (Just $ var "f" @@ var "recurse1" @@ var "cx" @@ var "term") [
+        _Function_lambda>>: "l" ~>
+          "cx1" <~ extendGraphForLambda @@ var "cx" @@ var "l" $
+          "recurse2" <~ ("term" ~> var "recurse" @@ var "cx1" @@ var "term") $
+          var "f" @@ var "recurse2" @@ var "cx1" @@ var "term"],
+      _Term_let>>: "l" ~>
+        "cx1" <~ extendGraphForLet @@ constant (constant nothing) @@ var "cx" @@ var "l" $
+        "recurse2" <~ ("term" ~> var "recurse" @@ var "cx1" @@ var "term") $
+        var "f" @@ var "recurse2" @@ var "cx1" @@ var "term",
+      _Term_typeLambda>>: "tl" ~>
+        "cx1" <~ extendGraphForTypeLambda @@ var "cx" @@ var "tl" $
+        "recurse2" <~ ("term" ~> var "recurse" @@ var "cx1" @@ var "term") $
+        var "f" @@ var "recurse2" @@ var "cx1" @@ var "term"]) $
+  "rewrite" <~ ("cx" ~> "term" ~> var "f2" @@ (var "rewrite") @@ var "cx" @@ var "term") $
+  var "rewrite" @@ var "cx0" @@ var "term0"
+
+foldTermWithGraphAndPath :: TBinding (
+  ((a -> Term -> a) -> [SubtermStep] -> Graph -> a -> Term -> a)
+  -> Graph -> a -> Term -> a)
+foldTermWithGraphAndPath = define "foldTermWithGraphAndPath" $
+  doc ("Fold over a term to produce a value, with both Graph and accessor path tracked."
+    <> " Like rewriteAndFoldTermWithGraphAndPath, but only folds without rewriting."
+    <> " The Graph is automatically updated when descending into lambdas, lets, and type lambdas.") $
+  "f" ~> "cx0" ~> "val0" ~> "term0" ~>
+  -- Wrap the user's fold function to also return the original term unchanged
+  "wrapper" <~ ("recurse" ~> "path" ~> "cx" ~> "val" ~> "term" ~>
+    "recurseForUser" <~ ("valIn" ~> "subterm" ~>
+      "r" <~ var "recurse" @@ var "valIn" @@ var "subterm" $
+      Pairs.first $ var "r") $
+    pair (var "f" @@ var "recurseForUser" @@ var "path" @@ var "cx" @@ var "val" @@ var "term") (var "term")) $
+  "result" <~ rewriteAndFoldTermWithGraphAndPath @@ var "wrapper" @@ var "cx0" @@ var "val0" @@ var "term0" $
+  Pairs.first $ var "result"
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Schemas.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Schemas.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Schemas.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Schemas.hs
@@ -9,11 +9,7 @@
   dereferenceType,
   elementAsTypeApplicationTerm,
   elementsWithDependencies,
-  extendTypeContextForLambda,
-  extendTypeContextForLet,
-  extendTypeContextForTypeLambda,
   fTypeIsPolymorphic,
-  fTypeToTypeScheme,
   fieldMap,
   fieldTypeMap,
   fieldTypes,
@@ -25,8 +21,6 @@
   graphAsLet,
   graphAsTerm,
   graphAsTypes,
-  graphToInferenceContext,
-  graphToTypeContext,
   instantiateType,
   instantiateTypeScheme,
   isEncodedTerm,
@@ -38,6 +32,7 @@
   isSerializableType,
   isUnitTerm,
   isUnitType,
+  isNominalType,
   isType,
   moduleContainsBinaryLiterals,
   moduleDependencyNamespaces,
@@ -52,31 +47,27 @@
   requireUnionType,
   resolveType,
   schemaGraphToTypingEnvironment,
-  termAsGraph,
+  termAsBindings,
   topologicalSortTypeDefinitions,
   typeDependencies,
-  typeSchemeToFType,
   typeToTypeScheme,
   typesToElements,
   withLambdaContext,
   withLetContext,
   withTypeLambdaContext)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -91,18 +82,19 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Meta.Context      as Ctx
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -116,11 +108,12 @@
 import qualified Hydra.Sources.Kernel.Terms.Constants    as Constants
 import qualified Hydra.Sources.Decode.Core  as DecodeCore
 import qualified Hydra.Sources.Kernel.Terms.Lexical      as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads       as Monads
+
 import qualified Hydra.Sources.Kernel.Terms.Names        as Names
 import qualified Hydra.Sources.Kernel.Terms.Reflect      as Reflect
 import qualified Hydra.Sources.Kernel.Terms.Rewriting    as Rewriting
 import qualified Hydra.Sources.Kernel.Terms.Show.Core    as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors  as ShowError
 import qualified Hydra.Sources.Kernel.Terms.Sorting      as Sorting
 import qualified Hydra.Sources.Kernel.Terms.Substitution as Substitution
 
@@ -133,73 +126,70 @@
 define :: String -> TTerm a -> TBinding a
 define = definitionInNamespace ns
 
+formatError :: TTerm (InContext Error -> String)
+formatError = "ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic")
+
 module_ :: Module
 module_ = Module ns elements
-    [Annotations.ns, Constants.ns, moduleNamespace DecodeCore.module_, moduleNamespace EncodeCore.module_, Lexical.ns, Monads.ns,
-      Names.ns, Reflect.ns, Rewriting.ns, ShowCore.ns, Sorting.ns, Substitution.ns]
+    [Annotations.ns, Constants.ns, moduleNamespace DecodeCore.module_, moduleNamespace EncodeCore.module_, Lexical.ns,
+      Names.ns, Reflect.ns, Rewriting.ns, ShowCore.ns, ShowError.ns, Sorting.ns, Substitution.ns]
     kernelTypesNamespaces $
     Just ("Various functions for dereferencing and decoding schema types.")
   where
     elements = [
-      toBinding addNamesToNamespaces,
-      toBinding definitionDependencyNamespaces,
-      toBinding dependencyNamespaces,
-      toBinding dereferenceType,
-      toBinding elementAsTypeApplicationTerm,
-      toBinding elementsWithDependencies,
-      toBinding extendTypeContextForLambda,
-      toBinding extendTypeContextForLet,
-      toBinding extendTypeContextForTypeLambda,
-      toBinding fieldMap,
-      toBinding fieldTypeMap,
-      toBinding fieldTypes,
-      toBinding findFieldType,
-      toBinding freshName,
-      toBinding freshNames,
-      toBinding fTypeIsPolymorphic,
-      toBinding fTypeToTypeScheme,
-      toBinding fullyStripAndNormalizeType,
-      toBinding fullyStripType,
-      toBinding graphAsLet,
-      toBinding graphAsTerm,
-      toBinding graphAsTypes,
-      toBinding graphToInferenceContext,
-      toBinding graphToTypeContext,
-      toBinding instantiateType,
-      toBinding instantiateTypeScheme,
-      toBinding isEncodedTerm,
-      toBinding isEncodedType,
-      toBinding isEnumRowType,
-      toBinding isEnumType,
-      toBinding isSerializable,
-      toBinding isSerializableType,
-      toBinding isSerializableByName,
-      toBinding isType,
-      toBinding isUnitTerm,
-      toBinding isUnitType,
-      toBinding moduleContainsBinaryLiterals,
-      toBinding moduleDependencyNamespaces,
-      toBinding namespacesForDefinitions,
-      toBinding nominalApplication,
-      toBinding normalTypeVariable,
-      toBinding partitionDefinitions,
-      toBinding requireRecordType,
-      toBinding requireRowType,
-      toBinding requireSchemaType,
-      toBinding requireType,
-      toBinding requireUnionField_,
-      toBinding requireUnionType,
-      toBinding resolveType,
-      toBinding schemaGraphToTypingEnvironment,
-      toBinding termAsGraph,
-      toBinding topologicalSortTypeDefinitions,
-      toBinding typeDependencies,
-      toBinding typeSchemeToFType,
-      toBinding typeToTypeScheme,
-      toBinding typesToElements,
-      toBinding withLambdaContext,
-      toBinding withLetContext,
-      toBinding withTypeLambdaContext]
+      toTermDefinition addNamesToNamespaces,
+      toTermDefinition definitionDependencyNamespaces,
+      toTermDefinition dependencyNamespaces,
+      toTermDefinition dereferenceType,
+      toTermDefinition elementAsTypeApplicationTerm,
+      toTermDefinition elementsWithDependencies,
+      toTermDefinition fieldMap,
+      toTermDefinition fieldTypeMap,
+      toTermDefinition fieldTypes,
+      toTermDefinition findFieldType,
+      toTermDefinition freshName,
+      toTermDefinition freshNames,
+      toTermDefinition fTypeIsPolymorphic,
+      toTermDefinition fullyStripAndNormalizeType,
+      toTermDefinition fullyStripType,
+      toTermDefinition graphAsLet,
+      toTermDefinition graphAsTerm,
+      toTermDefinition graphAsTypes,
+      toTermDefinition instantiateType,
+      toTermDefinition instantiateTypeScheme,
+      toTermDefinition isEncodedTerm,
+      toTermDefinition isEncodedType,
+      toTermDefinition isEnumRowType,
+      toTermDefinition isEnumType,
+      toTermDefinition isSerializable,
+      toTermDefinition isSerializableType,
+      toTermDefinition isSerializableByName,
+      toTermDefinition isNominalType,
+      toTermDefinition isType,
+      toTermDefinition isUnitTerm,
+      toTermDefinition isUnitType,
+      toTermDefinition moduleContainsBinaryLiterals,
+      toTermDefinition moduleDependencyNamespaces,
+      toTermDefinition namespacesForDefinitions,
+      toTermDefinition nominalApplication,
+      toTermDefinition normalTypeVariable,
+      toTermDefinition partitionDefinitions,
+      toTermDefinition requireRecordType,
+      toTermDefinition requireRowType,
+      toTermDefinition requireSchemaType,
+      toTermDefinition requireType,
+      toTermDefinition requireUnionField_,
+      toTermDefinition requireUnionType,
+      toTermDefinition resolveType,
+      toTermDefinition schemaGraphToTypingEnvironment,
+      toTermDefinition termAsBindings,
+      toTermDefinition topologicalSortTypeDefinitions,
+      toTermDefinition typeDependencies,
+      toTermDefinition typeToTypeScheme,
+      toTermDefinition typesToElements,
+      toTermDefinition withLambdaContext,
+      toTermDefinition withLetContext,
+      toTermDefinition withTypeLambdaContext]
 
 addNamesToNamespaces :: TBinding ((Namespace -> a) -> S.Set Name -> Namespaces a -> Namespaces a)
 addNamesToNamespaces = define "addNamesToNamespaces" $
@@ -225,11 +215,10 @@
   "allNames" <~ Sets.unions (Lists.map (var "defNames") (var "defs")) $
   Sets.fromList (Maybes.cat (Lists.map (Names.namespaceOf) (Sets.toList (var "allNames"))))
 
-dependencyNamespaces :: TBinding (Bool -> Bool -> Bool -> Bool -> [Binding] -> Flow Graph (S.Set Namespace))
+dependencyNamespaces :: TBinding (Context -> Graph -> Bool -> Bool -> Bool -> Bool -> [Binding] -> Either (InContext Error) (S.Set Namespace))
 dependencyNamespaces = define "dependencyNamespaces" $
-  doc "Find dependency namespaces in all of a set of terms" $
-  "binds" ~> "withPrims" ~> "withNoms" ~> "withSchema" ~> "els" ~>
-  "cx" <<~ Monads.getState $
+  doc "Find dependency namespaces in all of a set of terms (Either version)" $
+  "cx" ~> "graph" ~> "binds" ~> "withPrims" ~> "withNoms" ~> "withSchema" ~> "els" ~>
   "depNames" <~ ("el" ~>
     "term" <~ Core.bindingTerm (var "el") $
     "deannotatedTerm" <~ Rewriting.deannotateTerm @@ var "term" $
@@ -241,112 +230,54 @@
       Sets.empty $
     -- Handle encoded types: decode as Type and extract type dependency names
     Logic.ifElse (isEncodedType @@ var "deannotatedTerm")
-      (Flows.bind (trace (string "dependency namespace (type)") $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ var "term")) (
-        "typ" ~> Flows.pure (Sets.unions (list [
+      (Eithers.map ("typ" ~> Sets.unions (list [
           var "dataNames", var "schemaNames",
-          Rewriting.typeDependencyNames @@ true @@ var "typ"]))))
+          Rewriting.typeDependencyNames @@ true @@ var "typ"]))
+        (Ctx.withContext (Ctx.pushTrace (string "dependency namespace (type)") (var "cx"))
+          (Eithers.bimap ("_e" ~> Error.errorOther $ Error.otherError (unwrap _DecodingError @@ var "_e")) ("_a" ~> var "_a")
+            (decoderFor _Type @@ var "graph" @@ var "term"))))
       -- Handle encoded terms: decode as Term and extract term dependency names
       (Logic.ifElse (isEncodedTerm @@ var "deannotatedTerm")
-        (Flows.bind (trace (string "dependency namespace (term)") $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Term @@ var "cx" @@ var "term")) (
-          "decodedTerm" ~> Flows.pure (Sets.unions (list [
+        (Eithers.map ("decodedTerm" ~> Sets.unions (list [
             var "dataNames", var "schemaNames",
-            Rewriting.termDependencyNames @@ var "binds" @@ var "withPrims" @@ var "withNoms" @@ var "decodedTerm"]))))
-        (Flows.pure (Sets.unions (list [var "dataNames", var "schemaNames"]))))) $
-  Flows.bind (Flows.mapList (var "depNames") (var "els")) (
-    "namesList" ~> Flows.pure (Sets.fromList (Maybes.cat (Lists.map (Names.namespaceOf) (
-      Sets.toList (Sets.delete (Constants.placeholderName) (Sets.unions (var "namesList"))))))))
+            Rewriting.termDependencyNames @@ var "binds" @@ var "withPrims" @@ var "withNoms" @@ var "decodedTerm"]))
+          (Ctx.withContext (Ctx.pushTrace (string "dependency namespace (term)") (var "cx"))
+            (Eithers.bimap ("_e" ~> Error.errorOther $ Error.otherError (unwrap _DecodingError @@ var "_e")) ("_a" ~> var "_a")
+              (decoderFor _Term @@ var "graph" @@ var "term"))))
+        (right (Sets.unions (list [var "dataNames", var "schemaNames"]))))) $
+  Eithers.map ("namesList" ~> Sets.fromList (Maybes.cat (Lists.map (Names.namespaceOf) (
+      Sets.toList (Sets.unions (var "namesList"))))))
+    (Eithers.mapList (var "depNames") (var "els"))
 
-dereferenceType :: TBinding (Name -> Flow Graph (Maybe Type))
+dereferenceType :: TBinding (Context -> Graph -> Name -> Either (InContext Error) (Maybe Type))
 dereferenceType = define "dereferenceType" $
-  doc "Dereference a type name to get the actual type" $
-  "name" ~>
-  "cx" <<~ Monads.getState $
-  "mel" <<~ Lexical.dereferenceElement @@ var "name" $
+  doc "Dereference a type name to get the actual type (Either version)" $
+  "cx" ~> "graph" ~> "name" ~>
+  "mel" <~ Lexical.dereferenceElement @@ var "graph" @@ var "name" $
   optCases (var "mel")
-    (Flows.pure nothing)
-    ("el" ~> Flows.map (unaryFunction just) $ (trace (string "dereference type") $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ Core.bindingTerm (var "el"))))
+    (right nothing)
+    ("el" ~> Eithers.map (unaryFunction just)
+      (Ctx.withContext (var "cx")
+        (Eithers.bimap ("_e" ~> Error.errorOther $ Error.otherError (unwrap _DecodingError @@ var "_e")) ("_a" ~> var "_a")
+          (decoderFor _Type @@ var "graph" @@ Core.bindingTerm (var "el")))))
 
-elementAsTypeApplicationTerm :: TBinding (Binding -> Flow Graph TypeApplicationTerm)
+elementAsTypeApplicationTerm :: TBinding (Context -> Binding -> Either (InContext Error) TypeApplicationTerm)
 elementAsTypeApplicationTerm = define "elementAsTypeApplicationTerm" $
   doc "Convert an element to a typed term" $
-  "el" ~>
-  Maybes.maybe (Flows.fail (string "missing element type"))
-    ("ts" ~> Flows.pure (Core.typeApplicationTerm (Core.bindingTerm (var "el")) (Core.typeSchemeType (var "ts"))))
+  "cx" ~> "el" ~>
+  Maybes.maybe (Ctx.failInContext (Error.errorOther $ Error.otherError (string "missing element type")) (var "cx"))
+    ("ts" ~> right (Core.typeApplicationTerm (Core.bindingTerm (var "el")) (Core.typeSchemeType (var "ts"))))
     (Core.bindingType (var "el"))
 
-elementsWithDependencies :: TBinding ([Binding] -> Flow Graph [Binding])
+elementsWithDependencies :: TBinding (Context -> Graph -> [Binding] -> Either (InContext Error) [Binding])
 elementsWithDependencies = define "elementsWithDependencies" $
   doc "Get elements with their dependencies" $
-  "original" ~>
+  "cx" ~> "graph" ~> "original" ~>
   "depNames" <~ ("el" ~> Sets.toList (Rewriting.termDependencyNames @@ true @@ false @@ false @@ (Core.bindingTerm (var "el")))) $
   "allDepNames" <~ Lists.nub (Lists.concat2
     (Lists.map (unaryFunction Core.bindingName) (var "original"))
     (Lists.concat (Lists.map (var "depNames") (var "original")))) $
-  Flows.mapList (Lexical.requireElement) (var "allDepNames")
-
-extendTypeContextForLambda :: TBinding (TypeContext -> Lambda -> TypeContext)
-extendTypeContextForLambda = define "extendTypeContextForLambda" $
-  doc "Extend a type context by descending into a System F lambda body" $
-  "tcontext" ~> "lam" ~>
-  "var" <~ Core.lambdaParameter (var "lam") $
-  Typing.typeContext
-    (optCases (Core.lambdaDomain $ var "lam")
-      (Typing.typeContextTypes $ var "tcontext")
-      -- Note: if the domain is missing, we have nothing to add here
-      ("dom" ~> Maps.insert (var "var") (var "dom") $ Typing.typeContextTypes $ var "tcontext"))
-    (Maps.delete (var "var") (Typing.typeContextMetadata $ var "tcontext"))
-    (Typing.typeContextTypeVariables $ var "tcontext")
-    -- Add the variable to lambda variables
-    (Sets.insert (var "var") $ Typing.typeContextLambdaVariables $ var "tcontext")
-    -- Remove the variable from let variables if it exists there; it is shadowed if so
-    (Sets.delete (var "var") $ Typing.typeContextLetVariables $ var "tcontext")
-    (Typing.typeContextInferenceContext $ var "tcontext")
-
-extendTypeContextForLet :: TBinding ((TypeContext -> Binding -> Maybe Term) -> TypeContext -> Let -> TypeContext)
-extendTypeContextForLet = define "extendTypeContextForLet" $
-  doc "Extend a type context by descending into a let body" $
-  "forBinding" ~> "tcontext" ~> "letrec" ~>
-  "bindings" <~ Core.letBindings (var "letrec") $
-  Typing.typeContext
-    -- Note: Maps.union prefers the left argument when keys conflict, so we put the new bindings first
-    -- to allow inner bindings to shadow outer ones with the same name.
-    (Maps.union
-      -- Add all bindings to typeContextTypes. Use the type scheme if available, otherwise use a placeholder type.
-      -- This ensures that isComplexVariable can distinguish defined local bindings from undefined variables.
-      (Maps.fromList $ Maybes.cat $ Lists.map
-        ("b" ~>
-          (Maybes.map
-            ("ts" ~> pair (Core.bindingName $ var "b") (typeSchemeToFType @@ var "ts")))
-            (Core.bindingType $ var "b"))
-        (var "bindings"))
-      (Typing.typeContextTypes (var "tcontext")))
-    (Lists.foldl
-      ("m" ~> "b" ~> optCases (var "forBinding" @@ var "tcontext" @@ var "b")
-        (Maps.delete (Core.bindingName $ var "b") (var "m"))
-        ("t" ~> Maps.insert (Core.bindingName $ var "b") (var "t") (var "m")))
-      (Typing.typeContextMetadata $ var "tcontext")
-      (var "bindings"))
-    (Typing.typeContextTypeVariables $ var "tcontext")
-    -- Remove all binding names from lambda variables; they are shadowed if so
-    (Lists.foldl
-      ("s" ~> "b" ~> Sets.delete (Core.bindingName $ var "b") (var "s"))
-      (Typing.typeContextLambdaVariables $ var "tcontext")
-      (var "bindings"))
-    -- Add all binding names to let variables
-    (Lists.foldl
-      ("s" ~> "b" ~> Sets.insert (Core.bindingName $ var "b") (var "s"))
-      (Typing.typeContextLetVariables $ var "tcontext")
-      (var "bindings"))
-    (Typing.typeContextInferenceContext $ var "tcontext")
-
-extendTypeContextForTypeLambda :: TBinding (TypeContext -> TypeLambda -> TypeContext)
-extendTypeContextForTypeLambda = define "extendTypeContextForTypeLambda" $
-  doc "Extend a type context by descending into a System F type lambda body" $
-  "tcontext" ~> "tlam" ~>
-  "name" <~ Core.typeLambdaParameter (var "tlam") $
-  Typing.typeContextWithTypeVariables
-    (var "tcontext")
-    (Sets.insert (var "name") (Typing.typeContextTypeVariables (var "tcontext")))
+  Eithers.mapList ("name" ~> Lexical.requireElement @@ var "cx" @@ var "graph" @@ var "name") (var "allDepNames")
 
 fieldMap :: TBinding ([Field] -> M.Map Name Term)
 fieldMap = define "fieldMap" $
@@ -360,38 +291,43 @@
   "toPair" <~ ("f" ~> pair (Core.fieldTypeName $ var "f") (Core.fieldTypeType $ var "f")) $
   Maps.fromList $ Lists.map (var "toPair") (var "fields")
 
-fieldTypes :: TBinding (Type -> Flow Graph (M.Map Name Type))
+fieldTypes :: TBinding (Context -> Graph -> Type -> Either (InContext Error) (M.Map Name Type))
 fieldTypes = define "fieldTypes" $
-  doc "Get field types from a record or union type" $
-  "t" ~>
-  "cx" <<~ Monads.getState $
+  doc "Get field types from a record or union type (Either version)" $
+  "cx" ~> "graph" ~> "t" ~>
   "toMap" <~ ("fields" ~> Maps.fromList (Lists.map
     ("ft" ~> pair (Core.fieldTypeName (var "ft")) (Core.fieldTypeType (var "ft")))
     (var "fields"))) $
-  match _Type (Just (Monads.unexpected @@ string "record or union type" @@ (ShowCore.type_ @@ var "t"))) [
-    _Type_forall>>: "ft" ~> fieldTypes @@ Core.forallTypeBody (var "ft"),
-    _Type_record>>: "rt" ~> Flows.pure (var "toMap" @@ Core.rowTypeFields (var "rt")),
-    _Type_union>>: "rt" ~> Flows.pure (var "toMap" @@ Core.rowTypeFields (var "rt")),
+  match _Type (Just (Ctx.failInContext (Error.errorOther $ Error.otherError (
+    Strings.cat (list [string "expected record or union type but found ", ShowCore.type_ @@ var "t"]))) (var "cx"))) [
+    _Type_forall>>: "ft" ~> fieldTypes @@ var "cx" @@ var "graph" @@ Core.forallTypeBody (var "ft"),
+    _Type_record>>: "rt" ~> right (var "toMap" @@ var "rt"),
+    _Type_union>>: "rt" ~> right (var "toMap" @@ var "rt"),
     _Type_variable>>: "name" ~>
-      trace (Strings.cat2 (string "field types of ") (Core.unName (var "name"))) (
-      Flows.bind (Lexical.requireElement @@ var "name") (
-        "el" ~>
-        Flows.bind (trace (string "field types") $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ Core.bindingTerm (var "el"))) (
-          fieldTypes)))]
+      -- Try graphSchemaTypes first (type definitions), then fall back to graphBoundTerms (legacy)
+      Maybes.maybe
+        (Eithers.bind (Lexical.requireElement @@ var "cx" @@ var "graph" @@ var "name") (
+          "el" ~>
+          Eithers.bind (Ctx.withContext (var "cx")
+            (Eithers.bimap ("_e" ~> Error.errorOther $ Error.otherError (unwrap _DecodingError @@ var "_e")) ("_a" ~> var "_a")
+              (decoderFor _Type @@ var "graph" @@ Core.bindingTerm (var "el")))) (
+            "decodedType" ~> fieldTypes @@ var "cx" @@ var "graph" @@ var "decodedType")))
+        ("ts" ~> fieldTypes @@ var "cx" @@ var "graph" @@ Core.typeSchemeType (var "ts"))
+        (Maps.lookup (var "name") (Graph.graphSchemaTypes $ var "graph"))]
   @@ (Rewriting.deannotateType @@ var "t")
 
-findFieldType :: TBinding (Name -> [FieldType] -> Flow s Type)
+findFieldType :: TBinding (Context -> Name -> [FieldType] -> Either (InContext Error) Type)
 findFieldType = define "findFieldType" $
   doc "Find a field type by name in a list of field types" $
-  "fname" ~> "fields" ~>
+  "cx" ~> "fname" ~> "fields" ~>
   "matchingFields" <~ Lists.filter
     ("ft" ~> Equality.equal (Core.unName (Core.fieldTypeName (var "ft"))) (Core.unName (var "fname")))
     (var "fields") $
   Logic.ifElse (Lists.null (var "matchingFields"))
-    (Flows.fail (Strings.cat2 (string "No such field: ") (Core.unName (var "fname"))))
+    (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "No such field: ") (Core.unName (var "fname")))) (var "cx"))
     (Logic.ifElse (Equality.equal (Lists.length (var "matchingFields")) (int32 1))
-      (Flows.pure (Core.fieldTypeType (Lists.head (var "matchingFields"))))
-      (Flows.fail (Strings.cat2 (string "Multiple fields named ") (Core.unName (var "fname")))))
+      (right (Core.fieldTypeType (Lists.head (var "matchingFields"))))
+      (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "Multiple fields named ") (Core.unName (var "fname")))) (var "cx")))
 
 fTypeIsPolymorphic :: TBinding (Type -> Bool)
 fTypeIsPolymorphic = define "fTypeIsPolymorphic" $
@@ -401,26 +337,28 @@
     _Type_annotated>>: "at" ~> fTypeIsPolymorphic @@ Core.annotatedTypeBody (var "at"),
     _Type_forall>>: "ft" ~> true]
 
-fTypeToTypeScheme :: TBinding (Type -> TypeScheme)
-fTypeToTypeScheme = define "fTypeToTypeScheme" $
-  doc "Convert a forall type to a type scheme" $
-  "typ" ~>
-  "gatherForall" <~ ("vars" ~> "typ" ~> cases _Type (Rewriting.deannotateType @@ var "typ")
-     (Just $ Core.typeScheme (Lists.reverse $ var "vars") (var "typ") Phantoms.nothing) [
-     _Type_forall>>: "ft" ~> var "gatherForall" @@
-       (Lists.cons (Core.forallTypeParameter $ var "ft") (var "vars")) @@
-       (Core.forallTypeBody $ var "ft")]) $
-  var "gatherForall" @@ list ([] :: [TTerm Name]) @@ var "typ"
-
-freshName :: TBinding (Flow s Name)
+freshName :: TBinding (Context -> (Name, Context))
 freshName = define "freshName" $
-  doc "Generate a fresh type variable name" $
-  Flows.map (normalTypeVariable) (Annotations.nextCount @@ Constants.key_freshTypeVariableCount)
+  doc "Generate a fresh type variable name, threading Context" $
+  "cx" ~>
+  "count" <~ Annotations.getCount @@ Constants.key_freshTypeVariableCount @@ var "cx" $
+  pair
+    (normalTypeVariable @@ var "count")
+    (Annotations.putCount @@ Constants.key_freshTypeVariableCount @@ Math.add (var "count") (int32 1) @@ var "cx")
 
-freshNames :: TBinding (Int -> Flow s [Name])
+freshNames :: TBinding (Int -> Context -> ([Name], Context))
 freshNames = define "freshNames" $
-  doc "Generate multiple fresh type variable names" $
-  "n" ~> Flows.sequence $ Lists.replicate (var "n") (freshName)
+  doc "Generate multiple fresh type variable names, threading Context" $
+  "n" ~> "cx" ~>
+  -- Fold over n units, accumulating names and threading context
+  "go" <~ ("acc" ~> "_" ~>
+    "names" <~ Pairs.first (var "acc") $
+    "cx0" <~ Pairs.second (var "acc") $
+    "result" <~ freshName @@ var "cx0" $
+    "name" <~ Pairs.first (var "result") $
+    "cx1" <~ Pairs.second (var "result") $
+    pair (Lists.concat2 (var "names") (Lists.pure (var "name"))) (var "cx1")) $
+  Lists.foldl (var "go") (pair (list ([] :: [TTerm Name])) (var "cx")) (Lists.replicate (var "n") unit)
 
 fullyStripAndNormalizeType :: TBinding (Type -> Type)
 fullyStripAndNormalizeType = define "fullyStripAndNormalizeType" $
@@ -450,70 +388,44 @@
     _Type_forall>>: "ft" ~> fullyStripType @@ Core.forallTypeBody (var "ft")]
   @@ (Rewriting.deannotateType @@ var "typ")
 
-graphAsLet :: TBinding (Graph -> Let)
+graphAsLet :: TBinding ([Binding] -> Term -> Let)
 graphAsLet = define "graphAsLet" $
-  doc "Convert a graph to a let expression" $
-  "g" ~>
+  doc "Convert bindings and a body to a let expression" $
+  "bindings" ~> "body" ~>
   Core.let_
-    (Graph.graphElements $ var "g")
-    (Graph.graphBody $ var "g")
+    (var "bindings")
+    (var "body")
 
-graphAsTerm :: TBinding (Graph -> Term)
+graphAsTerm :: TBinding ([Binding] -> Term -> Term)
 graphAsTerm = define "graphAsTerm" $
-  doc "Convert a graph to a term, taking advantage of the built-in duality between graphs and terms" $
-  "g" ~> Core.termLet (graphAsLet @@ var "g")
+  doc "Convert bindings and a body to a term, using let-term duality" $
+  "bindings" ~> "body" ~> Core.termLet (graphAsLet @@ var "bindings" @@ var "body")
 
-graphAsTypes :: TBinding (Graph -> Flow s (M.Map Name Type))
+graphAsTypes :: TBinding (Context -> Graph -> [Binding] -> Either (InContext DecodingError) (M.Map Name Type))
 graphAsTypes = define "graphAsTypes" $
-  doc "Decode a schema graph which encodes a set of named types" $
-  "sg" ~>
-  "cx" <<~ Monads.getState $
-  "els" <~ Graph.graphElements (var "sg") $
+  doc "Decode a list of type-encoding bindings into a map of named types" $
+  "cx" ~> "graph" ~> "els" ~>
   "toPair" <~ ("el" ~>
-    "typ" <<~ (trace ((string "graph as types: ") ++ Core.unName (Core.bindingName $ var "el")) $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ (Core.bindingTerm $ var "el"))) $
-    produce $ pair (Core.bindingName $ var "el") (var "typ")) $
-  "pairs" <<~ Flows.mapList (var "toPair") (var "els") $
-  produce $ Maps.fromList $ var "pairs"
-
-graphToInferenceContext :: TBinding (Graph -> Flow s InferenceContext)
-graphToInferenceContext = define "graphToInferenceContext" $
-  doc "Convert a graph to an inference context" $
-  "graph" ~>
-  "schema" <~ Maybes.fromMaybe (var "graph") (Graph.graphSchema $ var "graph") $
-  "primTypes" <~ Maps.fromList (Lists.map
-    ("p" ~> pair (Graph.primitiveName $ var "p") (Graph.primitiveType $ var "p"))
-    (Maps.elems $ Graph.graphPrimitives $ var "graph")) $
-  "varTypes" <~ Maps.fromList (Maybes.cat $ Lists.map
-    ("b" ~> Maybes.map ("ts" ~> pair (Core.bindingName $ var "b") (var "ts")) $ Core.bindingType $ var "b")
-    (Graph.graphElements $ var "graph")) $
-  "schemaTypes" <<~ schemaGraphToTypingEnvironment @@ var "schema" $
-  produce $ Typing.inferenceContext (var "schemaTypes") (var "primTypes") (var "varTypes") Maps.empty false
-
-graphToTypeContext :: TBinding (Graph -> Flow s TypeContext)
-graphToTypeContext = define "graphToTypeContext" $
-  doc "Convert a graph to a type context including the graph's element types" $
-  "graph" ~>
-  "ix" <<~ graphToInferenceContext @@ var "graph" $
-  -- Populate typeContextTypes from graph elements' type schemes (converted to System F types)
-  -- This ensures variables are resolvable during eta expansion and other processing
-  "elementTypes" <~ Maps.fromList (Maybes.cat $ Lists.map
-    ("b" ~> Maybes.map ("ts" ~> pair (Core.bindingName $ var "b") (typeSchemeToFType @@ var "ts")) $ Core.bindingType $ var "b")
-    (Graph.graphElements $ var "graph")) $
-  produce $ Typing.typeContext (var "elementTypes") Maps.empty Sets.empty Sets.empty Sets.empty (var "ix")
+    Eithers.map
+      ("typ" ~> pair (Core.bindingName $ var "el") (var "typ"))
+      (Ctx.withContext (var "cx") (decoderFor _Type @@ var "graph" @@ (Core.bindingTerm $ var "el")))) $
+  Eithers.map (unaryFunction Maps.fromList) (Eithers.mapList (var "toPair") (var "els"))
 
-instantiateType :: TBinding (Type -> Flow s Type)
+instantiateType :: TBinding (Context -> Type -> (Type, Context))
 instantiateType = define "instantiateType" $
-  doc "Instantiate a type by replacing all forall-bound type variables with fresh variables" $
-  "typ" ~>
-  "ts" <<~ instantiateTypeScheme @@ (typeToTypeScheme @@ var "typ") $
-  produce $ typeSchemeToFType @@ var "ts"
+  doc "Instantiate a type by replacing all forall-bound type variables with fresh variables, threading Context" $
+  "cx" ~> "typ" ~>
+  "result" <~ instantiateTypeScheme @@ var "cx" @@ (typeToTypeScheme @@ var "typ") $
+  pair (Rewriting.typeSchemeToFType @@ Pairs.first (var "result")) (Pairs.second (var "result"))
 
-instantiateTypeScheme :: TBinding (TypeScheme -> Flow s TypeScheme)
+instantiateTypeScheme :: TBinding (Context -> TypeScheme -> (TypeScheme, Context))
 instantiateTypeScheme = define "instantiateTypeScheme" $
-  doc "Instantiate a type scheme with fresh variables" $
-  "scheme" ~>
+  doc "Instantiate a type scheme with fresh variables, threading Context" $
+  "cx" ~> "scheme" ~>
   "oldVars" <~ Core.typeSchemeVariables (var "scheme") $
-  "newVars" <<~ freshNames @@ Lists.length (var "oldVars") $
+  "result" <~ freshNames @@ Lists.length (var "oldVars") @@ var "cx" $
+  "newVars" <~ Pairs.first (var "result") $
+  "cx2" <~ Pairs.second (var "result") $
   "subst" <~ Typing.typeSubst (Maps.fromList $ Lists.zip (var "oldVars") (Lists.map (unaryFunction Core.typeVariable) $ var "newVars")) $
   -- Build a name-to-name substitution for renaming constraint keys
   "nameSubst" <~ Maps.fromList (Lists.zip (var "oldVars") (var "newVars")) $
@@ -525,16 +437,18 @@
         (Pairs.second $ var "kv"))
       (Maps.toList $ var "oldConstraints")))
     (Core.typeSchemeConstraints (var "scheme")) $
-  produce $ Core.typeScheme (var "newVars")
-    (Substitution.substInType @@ var "subst" @@ Core.typeSchemeType (var "scheme"))
-    (var "renamedConstraints")
+  pair
+    (Core.typeScheme (var "newVars")
+      (Substitution.substInType @@ var "subst" @@ Core.typeSchemeType (var "scheme"))
+      (var "renamedConstraints"))
+    (var "cx2")
 
-isEnumRowType :: TBinding (RowType -> Bool)
+isEnumRowType :: TBinding ([FieldType] -> Bool)
 isEnumRowType = define "isEnumRowType" $
   doc "Check if a row type represents an enum (all fields are unit-typed)" $
   "rt" ~> Lists.foldl (binaryFunction Logic.and) true $
     Lists.map ("f" ~> isUnitType @@ (Rewriting.deannotateType @@ (Core.fieldTypeType (var "f")))) $
-      Core.rowTypeFields $ var "rt"
+      var "rt"
 
 isEncodedType :: TBinding (Term -> Bool)
 isEncodedType = define "isEncodedType" $
@@ -562,18 +476,18 @@
     _Type_union>>: "rt" ~> isEnumRowType @@ var "rt"]
   @@ (Rewriting.deannotateType @@ var "typ")
 
-isSerializable :: TBinding (Binding -> Flow Graph Bool)
+isSerializable :: TBinding (Context -> Graph -> Binding -> Either (InContext Error) Bool)
 isSerializable = define "isSerializable" $
-  doc "Check if an element is serializable (no function types in dependencies)" $
-  "el" ~>
+  doc "Check if an element is serializable (no function types in dependencies) (Either version)" $
+  "cx" ~> "graph" ~> "el" ~>
   "variants" <~ ("typ" ~>
     Lists.map (Reflect.typeVariant) (Rewriting.foldOverType @@ Coders.traversalOrderPre @@
       ("m" ~> "t" ~> Lists.cons (var "t") (var "m")) @@ list ([] :: [TTerm Type]) @@ var "typ")) $
-  Flows.map
+  Eithers.map
     ("deps" ~>
       "allVariants" <~ Sets.fromList (Lists.concat (Lists.map (var "variants") (Maps.elems (var "deps")))) $
       Logic.not (Sets.member Variants.typeVariantFunction (var "allVariants")))
-    (typeDependencies @@ false @@ (unaryFunction Equality.identity) @@ Core.bindingName (var "el"))
+    (typeDependencies @@ var "cx" @@ var "graph" @@ false @@ (unaryFunction Equality.identity) @@ Core.bindingName (var "el"))
 
 isSerializableType :: TBinding (Type -> Bool)
 isSerializableType = define "isSerializableType" $
@@ -584,18 +498,18 @@
       ("m" ~> "t" ~> Lists.cons (var "t") (var "m")) @@ list ([] :: [TTerm Type]) @@ var "typ")) $
   Logic.not (Sets.member Variants.typeVariantFunction (var "allVariants"))
 
-isSerializableByName :: TBinding (Name -> Flow Graph Bool)
+isSerializableByName :: TBinding (Context -> Graph -> Name -> Either (InContext Error) Bool)
 isSerializableByName = define "isSerializableByName" $
-  doc "Check if a type (by name) is serializable, resolving all type dependencies" $
-  "name" ~>
+  doc "Check if a type (by name) is serializable, resolving all type dependencies (Either version)" $
+  "cx" ~> "graph" ~> "name" ~>
   "variants" <~ ("typ" ~>
     Lists.map (Reflect.typeVariant) (Rewriting.foldOverType @@ Coders.traversalOrderPre @@
       ("m" ~> "t" ~> Lists.cons (var "t") (var "m")) @@ list ([] :: [TTerm Type]) @@ var "typ")) $
-  Flows.map
+  Eithers.map
     ("deps" ~>
       "allVariants" <~ Sets.fromList (Lists.concat (Lists.map (var "variants") (Maps.elems (var "deps")))) $
       Logic.not (Sets.member Variants.typeVariantFunction (var "allVariants")))
-    (typeDependencies @@ false @@ (unaryFunction Equality.identity) @@ var "name")
+    (typeDependencies @@ var "cx" @@ var "graph" @@ false @@ (unaryFunction Equality.identity) @@ var "name")
 
 isType :: TBinding (Type -> Bool)
 isType = define "isType" $
@@ -605,10 +519,22 @@
       isType @@ (Core.applicationTypeFunction (var "a")),
     _Type_forall>>: "l" ~>
       isType @@ (Core.forallTypeBody (var "l")),
-    _Type_union>>: "rt" ~>
-      Equality.equal (string (unName _Type)) (Core.unName (Core.rowTypeTypeName (var "rt"))),
+    _Type_union>>: "rt" ~> false,
     _Type_variable>>: "v" ~> Equality.equal (var "v") (Core.nameLift _Type)]
 
+-- | Check whether a type is a nominal type definition (record, union, wrap, or forall wrapping one).
+--   Type aliases (applications, functions, literal types, etc.) return false.
+isNominalType :: TBinding (Type -> Bool)
+isNominalType = define "isNominalType" $
+  lambda "typ" $
+    cases _Type (Rewriting.deannotateType @@ var "typ")
+      (Just false) [
+      _Type_record>>: lambda "rt" $ true,
+      _Type_union>>: lambda "rt" $ true,
+      _Type_wrap>>: lambda "wt" $ true,
+      _Type_forall>>: lambda "fa" $
+        isNominalType @@ Core.forallTypeBody (var "fa")]
+
 isUnitTerm :: TBinding (Term -> Bool)
 isUnitTerm = define "isUnitTerm" $
   doc "Check whether a term is the unit term" $
@@ -630,18 +556,31 @@
           _Literal_binary>>: constant true]]) $
   "termContainsBinary" <~ ("term" ~>
     Rewriting.foldOverTerm @@ Coders.traversalOrderPre @@ var "checkTerm" @@ false @@ var "term") $
+  "defTerms" <~ Maybes.cat (Lists.map
+    ("d" ~> cases _Definition (var "d") (Just nothing) [
+      _Definition_term>>: "td" ~> just (Module.termDefinitionTerm $ var "td")])
+    (Module.moduleDefinitions (var "mod"))) $
   Lists.foldl
-    ("acc" ~> "el" ~> Logic.or (var "acc") (var "termContainsBinary" @@ Core.bindingTerm (var "el")))
+    ("acc" ~> "t" ~> Logic.or (var "acc") (var "termContainsBinary" @@ var "t"))
     false
-    (Module.moduleElements (var "mod"))
+    (var "defTerms")
 
-moduleDependencyNamespaces :: TBinding (Bool -> Bool -> Bool -> Bool -> Module -> Flow Graph (S.Set Namespace))
+moduleDependencyNamespaces :: TBinding (Context -> Graph -> Bool -> Bool -> Bool -> Bool -> Module -> Either (InContext Error) (S.Set Namespace))
 moduleDependencyNamespaces = define "moduleDependencyNamespaces" $
-  doc "Find dependency namespaces in all elements of a module, excluding the module's own namespace" $
-  "binds" ~> "withPrims" ~> "withNoms" ~> "withSchema" ~> "mod" ~>
-  Flows.bind (dependencyNamespaces @@ var "binds" @@ var "withPrims" @@ var "withNoms" @@ var "withSchema" @@
-    Module.moduleElements (var "mod")) (
-    "deps" ~> Flows.pure (Sets.delete (Module.moduleNamespace (var "mod")) (var "deps")))
+  doc "Find dependency namespaces in all elements of a module, excluding the module's own namespace (Either version)" $
+  "cx" ~> "graph" ~> "binds" ~> "withPrims" ~> "withNoms" ~> "withSchema" ~> "mod" ~>
+  "allBindings" <~ Maybes.cat (Lists.map
+    ("d" ~> cases _Definition (var "d") (Just nothing) [
+      _Definition_type>>: "td" ~>
+        just (Annotations.typeElement @@ (Module.typeDefinitionName $ var "td") @@ (Module.typeDefinitionType $ var "td")),
+      _Definition_term>>: "td" ~>
+        just (Core.binding (Module.termDefinitionName $ var "td") (Module.termDefinitionTerm $ var "td")
+          (Module.termDefinitionType $ var "td"))])
+    (Module.moduleDefinitions (var "mod"))) $
+  Eithers.map
+    ("deps" ~> Sets.delete (Module.moduleNamespace (var "mod")) (var "deps"))
+    (dependencyNamespaces @@ var "cx" @@ var "graph" @@ var "binds" @@ var "withPrims" @@ var "withNoms" @@ var "withSchema" @@
+      (var "allBindings"))
 
 namespacesForDefinitions :: TBinding ((Namespace -> a) -> Namespace -> [Definition] -> Namespaces a)
 namespacesForDefinitions = define "namespacesForDefinitions" $
@@ -679,143 +618,147 @@
     (Maybes.cat $ Lists.map (var "getType") (var "defs"))
     (Maybes.cat $ Lists.map (var "getTerm") (var "defs"))
 
-requireRecordType :: TBinding (Name -> Flow Graph RowType)
+requireRecordType :: TBinding (Context -> Graph -> Name -> Either (InContext Error) [FieldType])
 requireRecordType = define "requireRecordType" $
   doc "Require a name to resolve to a record type" $
-  "name" ~>
+  "cx" ~> "graph" ~> "name" ~>
   "toRecord" <~ ("t" ~> cases _Type (var "t") (Just nothing) [
     _Type_record>>: "rt" ~> just (var "rt")]) $
-  requireRowType @@ string "record type" @@ var "toRecord" @@ var "name"
+  requireRowType @@ var "cx" @@ string "record type" @@ var "toRecord" @@ var "graph" @@ var "name"
 
-requireRowType :: TBinding (String -> (Type -> Maybe RowType) -> Name -> Flow Graph RowType)
+requireRowType :: TBinding (Context -> String -> (Type -> Maybe [FieldType]) -> Graph -> Name -> Either (InContext Error) [FieldType])
 requireRowType = define "requireRowType" $
   doc "Require a name to resolve to a row type" $
-  "label" ~> "getter" ~> "name" ~>
+  "cx" ~> "label" ~> "getter" ~> "graph" ~> "name" ~>
   "rawType" <~ ("t" ~> cases _Type (var "t") (Just (var "t")) [
     _Type_annotated>>: "at" ~> var "rawType" @@ Core.annotatedTypeBody (var "at"),
     _Type_forall>>: "ft" ~> var "rawType" @@ Core.forallTypeBody (var "ft")]) $
-  Flows.bind (requireType @@ var "name") (
+  Eithers.bind (requireType @@ var "cx" @@ var "graph" @@ var "name") (
     "t" ~>
     Maybes.maybe
-      (Flows.fail (Strings.cat (list [
+      (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat (list [
         Core.unName (var "name"),
         (string " does not resolve to a "),
         var "label",
         (string " type: "),
-        ShowCore.type_ @@ var "t"])))
-      (unaryFunction Flows.pure)
+        ShowCore.type_ @@ var "t"]))) (var "cx"))
+      (unaryFunction right)
       (var "getter" @@ (var "rawType" @@ var "t")))
 
-requireSchemaType :: TBinding (InferenceContext -> Name -> Flow s TypeScheme)
+requireSchemaType :: TBinding (Context -> M.Map Name TypeScheme -> Name -> Either (InContext Error) (TypeScheme, Context))
 requireSchemaType = define "requireSchemaType" $
-  doc "Look up a schema type in the context and instantiate it" $
-  "cx" ~> "tname" ~>
-  "types" <~ (Typing.inferenceContextSchemaTypes $ var "cx") $
+  doc "Look up a schema type and instantiate it, threading Context" $
+  "cx" ~> "types" ~> "tname" ~>
   Maybes.maybe
-    (Flows.fail $ Strings.cat $ list [
-      (string "No such schema type: "),
-      Core.unName $ var "tname",
-      (string ". Available types are: "),
-      Strings.intercalate (string ", ") (Lists.map (unaryFunction Core.unName) $ Maps.keys $ var "types")])
-    -- TODO: the deannotation is probably superfluous
-    ("ts" ~> instantiateTypeScheme @@ (Rewriting.deannotateTypeSchemeRecursive @@ var "ts"))
+    (left $ Ctx.inContext
+      (Error.errorOther $ Error.otherError $ Strings.cat $ list [
+        (string "No such schema type: "),
+        Core.unName $ var "tname",
+        (string ". Available types are: "),
+        Strings.intercalate (string ", ") (Lists.map (unaryFunction Core.unName) $ Maps.keys $ var "types")])
+      (var "cx"))
+    ("ts" ~> right $ instantiateTypeScheme @@ var "cx" @@ (Rewriting.deannotateTypeSchemeRecursive @@ var "ts"))
     (Maps.lookup (var "tname") (var "types"))
 
-requireType :: TBinding (Name -> Flow Graph Type)
+requireType :: TBinding (Context -> Graph -> Name -> Either (InContext Error) Type)
 requireType = define "requireType" $
   doc "Require a type by name" $
-  "name" ~>
-  "cx" <<~ Monads.getState $
-  trace (Strings.cat2 (string "require type ") (Core.unName (var "name"))) $
-  Flows.bind (Lexical.withSchemaContext @@ (Lexical.requireElement @@ var "name")) (
-    "el" ~> Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ Core.bindingTerm (var "el")))
+  "cx" ~> "graph" ~> "name" ~>
+  -- Look up in schema types first, then fall back to bound types
+  Maybes.maybe
+    (Maybes.maybe
+      (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "no such type: ") (Core.unName (var "name")))) (var "cx"))
+      ("ts" ~> right (Rewriting.typeSchemeToFType @@ var "ts"))
+      (Maps.lookup (var "name") (Graph.graphBoundTypes (var "graph"))))
+    ("ts" ~> right (Rewriting.typeSchemeToFType @@ var "ts"))
+    (Maps.lookup (var "name") (Graph.graphSchemaTypes (var "graph")))
 
-requireUnionField_ :: TBinding (Name -> Name -> Flow Graph Type)
+requireUnionField_ :: TBinding (Context -> Graph -> Name -> Name -> Either (InContext Error) Type)
 requireUnionField_ = define "requireUnionField" $
   doc "Require a field type from a union type" $
-  "tname" ~> "fname" ~>
+  "cx" ~> "graph" ~> "tname" ~> "fname" ~>
   "withRowType" <~ ("rt" ~>
     "matches" <~ (Lists.filter
       ("ft" ~> Equality.equal (Core.fieldTypeName $ var "ft") (var "fname"))
-      (Core.rowTypeFields $ var "rt")) $
+      (var "rt")) $
     Logic.ifElse (Lists.null $ var "matches")
-      (Flows.fail $ Strings.cat $ list [
+      (Ctx.failInContext (Error.errorOther $ Error.otherError $ Strings.cat $ list [
         string "no field \"",
         Core.unName (var "fname"),
         string "\" in union type \"",
-        Core.unName (var "tname")])
-      (produce $ Core.fieldTypeType $ Lists.head $ var "matches")) $
-  Flows.bind (requireUnionType @@ var "tname") (var "withRowType")
+        Core.unName (var "tname")]) (var "cx"))
+      (right $ Core.fieldTypeType $ Lists.head $ var "matches")) $
+  Eithers.bind (requireUnionType @@ var "cx" @@ var "graph" @@ var "tname") (var "withRowType")
 
-requireUnionType :: TBinding (Name -> Flow Graph RowType)
+requireUnionType :: TBinding (Context -> Graph -> Name -> Either (InContext Error) [FieldType])
 requireUnionType = define "requireUnionType" $
   doc "Require a name to resolve to a union type" $
-  "name" ~>
+  "cx" ~> "graph" ~> "name" ~>
   "toUnion" <~ ("t" ~> cases _Type (var "t")
     (Just nothing) [
     _Type_union>>: "rt" ~> just (var "rt")]) $
-  requireRowType @@ string "union" @@ var "toUnion" @@ var "name"
+  requireRowType @@ var "cx" @@ string "union" @@ var "toUnion" @@ var "graph" @@ var "name"
 
-resolveType :: TBinding (Type -> Flow Graph (Maybe Type))
+resolveType :: TBinding (Graph -> Type -> Maybe Type)
 resolveType = define "resolveType" $
   doc "Resolve a type, dereferencing type variables" $
-  "typ" ~>
-  "cx" <<~ Monads.getState $
---  trace "resolve type" $
-  match _Type (Just (Flows.pure (just (var "typ")))) [
+  "graph" ~> "typ" ~>
+  match _Type (Just (just (var "typ"))) [
     _Type_variable>>: "name" ~>
-      Lexical.withSchemaContext @@
-        (Flows.bind (Lexical.resolveTerm @@ var "name") (
-          "mterm" ~>
-          Maybes.maybe (Flows.pure nothing)
-            ("t" ~> Flows.map (unaryFunction just) (Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ var "t")))
-            (var "mterm")))]
+      -- Look up in schema types first, then fall back to bound types
+      Maybes.maybe
+        (Maybes.map ("ts" ~> Rewriting.typeSchemeToFType @@ var "ts") (Maps.lookup (var "name") (Graph.graphBoundTypes (var "graph"))))
+        ("ts" ~> just (Rewriting.typeSchemeToFType @@ var "ts"))
+        (Maps.lookup (var "name") (Graph.graphSchemaTypes (var "graph")))]
   @@ (Rewriting.deannotateType @@ var "typ")
 
-schemaGraphToTypingEnvironment :: TBinding (Graph -> Flow s (M.Map Name TypeScheme))
+schemaGraphToTypingEnvironment :: TBinding (Context -> Graph -> Either (InContext Error) (M.Map Name TypeScheme))
 schemaGraphToTypingEnvironment = define "schemaGraphToTypingEnvironment" $
-  doc "Convert a schema graph to a typing environment" $
-  "g" ~>
+  doc "Convert a schema graph to a typing environment (Either version)" $
+  "cx" ~> "g" ~>
   "toTypeScheme" <~ ("vars" ~> "typ" ~> cases _Type (Rewriting.deannotateType @@ var "typ")
     (Just (Core.typeScheme (Lists.reverse (var "vars")) (var "typ") Phantoms.nothing)) [
     _Type_forall>>: "ft" ~> var "toTypeScheme"
       @@ Lists.cons (Core.forallTypeParameter (var "ft")) (var "vars")
       @@ Core.forallTypeBody (var "ft")]) $
+  "decodeType" <~ ("term" ~>
+    Ctx.withContext (var "cx")
+      (Eithers.bimap ("_e" ~> Error.errorOther $ Error.otherError (unwrap _DecodingError @@ var "_e")) ("_a" ~> var "_a")
+        (decoderFor _Type @@ var "g" @@ var "term"))) $
+  "decodeTypeScheme" <~ ("term" ~>
+    Ctx.withContext (var "cx")
+      (Eithers.bimap ("_e" ~> Error.errorOther $ Error.otherError (unwrap _DecodingError @@ var "_e")) ("_a" ~> var "_a")
+        (decoderFor _TypeScheme @@ var "g" @@ var "term"))) $
   "toPair" <~ ("el" ~>
-    "cx" <<~ Monads.getState $
-    "forTerm" <~ ("term" ~> cases _Term (var "term") (Just (Flows.pure nothing)) [
+    "forTerm" <~ ("term" ~> cases _Term (var "term") (Just (right nothing)) [
       _Term_record>>: "r" ~>
         Logic.ifElse
           (Equality.equal (Core.recordTypeName (var "r")) (Core.nameLift _TypeScheme))
-          (Flows.map
-            (unaryFunction just)
-            (Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _TypeScheme @@ var "cx" @@ Core.bindingTerm (var "el"))))
-          (Flows.pure nothing),
+          (Eithers.map (unaryFunction just) (var "decodeTypeScheme" @@ Core.bindingTerm (var "el")))
+          (right nothing),
       _Term_union>>: "i" ~>
         Logic.ifElse (Equality.equal (Core.injectionTypeName (var "i")) (Core.nameLift _Type))
-          (Flows.map
+          (Eithers.map
             ("decoded" ~> just (var "toTypeScheme" @@ list ([] :: [TTerm Name]) @@ var "decoded"))
-            (Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ Core.bindingTerm (var "el"))))
-          (Flows.pure nothing)]) $
-    "mts" <<~ optCases (Core.bindingType (var "el"))
-      (Flows.map ("typ" ~> just $ fTypeToTypeScheme @@ var "typ") $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ (Core.bindingTerm (var "el"))))
+            (var "decodeType" @@ Core.bindingTerm (var "el")))
+          (right nothing)]) $
+    "mts" <<~  optCases (Core.bindingType (var "el"))
+      (Eithers.map ("typ" ~> just $ Rewriting.fTypeToTypeScheme @@ var "typ") $ var "decodeType" @@ (Core.bindingTerm (var "el")))
       ("ts" ~> Logic.ifElse
         (Equality.equal (var "ts") (Core.typeScheme (list ([] :: [TTerm Name])) (Core.typeVariable (Core.nameLift _TypeScheme)) Phantoms.nothing))
-        (Flows.map (unaryFunction just) (Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _TypeScheme @@ var "cx" @@ Core.bindingTerm (var "el"))))
+        (Eithers.map (unaryFunction just) (var "decodeTypeScheme" @@ Core.bindingTerm (var "el")))
         (Logic.ifElse
           (Equality.equal (var "ts") (Core.typeScheme (list ([] :: [TTerm Name])) (Core.typeVariable (Core.nameLift _Type)) Phantoms.nothing))
-          (Flows.map ("decoded" ~> just (var "toTypeScheme" @@ list ([] :: [TTerm Name]) @@ var "decoded")) (Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ Core.bindingTerm (var "el"))))
+          (Eithers.map ("decoded" ~> just (var "toTypeScheme" @@ list ([] :: [TTerm Name]) @@ var "decoded")) (var "decodeType" @@ Core.bindingTerm (var "el")))
           (var "forTerm" @@ (Rewriting.deannotateTerm @@ (Core.bindingTerm (var "el")))))) $
-    produce $ Maybes.map ("ts" ~> pair (Core.bindingName (var "el")) (var "ts")) (var "mts")) $
-  trace (string "schema graph to typing environment") $
-  Monads.withState @@ var "g" @@
-    (Flows.bind (Flows.mapList (var "toPair") (Graph.graphElements (var "g"))) (
-      "mpairs" ~> Flows.pure (Maps.fromList (Maybes.cat (var "mpairs")))))
+    right $ Maybes.map ("ts" ~> pair (Core.bindingName (var "el")) (var "ts")) (var "mts")) $
+  Eithers.map ("mpairs" ~> Maps.fromList (Maybes.cat (var "mpairs")))
+    (Eithers.mapList (var "toPair") (Lexical.graphToBindings @@ var "g"))
 
 -- Note: this is lossy, as it throws away the term body
-termAsGraph :: TBinding (Term -> [Binding])
-termAsGraph = define "termAsGraph" $
-  doc "Find the equivalent graph representation of a term" $
+termAsBindings :: TBinding (Term -> [Binding])
+termAsBindings = define "termAsBindings" $
+  doc "Extract the bindings from a let term, or return an empty list for other terms" $
   "term" ~> cases _Term (Rewriting.deannotateTerm @@ var "term")
     (Just (list ([] :: [TTerm Binding]))) [
     _Term_let>>: "lt" ~> Core.letBindings (var "lt")]
@@ -834,22 +777,23 @@
   Lists.map ("names" ~> Maybes.cat (Lists.map ("n" ~> Maps.lookup (var "n") (var "nameToDef")) (var "names"))) (
     var "sorted")
 
-typeDependencies :: TBinding (Bool -> (Type -> Type) -> Name -> Flow Graph (M.Map Name Type))
+typeDependencies :: TBinding (Context -> Graph -> Bool -> (Type -> Type) -> Name -> Either (InContext Error) (M.Map Name Type))
 typeDependencies = define "typeDependencies" $
-  doc "Get all type dependencies for a given type name" $
-  "withSchema" ~> "transform" ~> "name" ~>
-  "cx" <<~ Monads.getState $
+  doc "Get all type dependencies for a given type name (Either version)" $
+  "cx" ~> "graph" ~> "withSchema" ~> "transform" ~> "name" ~>
   "requireType" <~ ("name" ~>
-    trace (Strings.cat2 (string "type dependencies of ") (Core.unName (var "name"))) (
-    Flows.bind (Lexical.requireElement @@ var "name") (
-      "el" ~> Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ Core.bindingTerm (var "el"))))) $
+    "cx1" <~ Ctx.pushTrace (Strings.cat2 (string "type dependencies of ") (Core.unName (var "name"))) (var "cx") $
+    Eithers.bind (Lexical.requireElement @@ var "cx1" @@ var "graph" @@ var "name") (
+      "el" ~> Ctx.withContext (var "cx1")
+        (Eithers.bimap ("_e" ~> Error.errorOther $ Error.otherError (unwrap _DecodingError @@ var "_e")) ("_a" ~> var "_a")
+          (decoderFor _Type @@ var "graph" @@ Core.bindingTerm (var "el"))))) $
   "toPair" <~ ("name" ~>
-    Flows.bind (var "requireType" @@ var "name") (
-      "typ" ~> Flows.pure (pair (var "name") (var "transform" @@ var "typ")))) $
+    Eithers.map ("typ" ~> pair (var "name") (var "transform" @@ var "typ"))
+      (var "requireType" @@ var "name")) $
   "deps" <~ ("seeds" ~> "names" ~>
     Logic.ifElse (Sets.null (var "seeds"))
-      (Flows.pure (var "names"))
-      (Flows.bind (Flows.mapList (var "toPair") (Sets.toList (var "seeds"))) (
+      (right (var "names"))
+      (Eithers.bind (Eithers.mapList (var "toPair") (Sets.toList (var "seeds"))) (
         "pairs" ~>
         "newNames" <~ Maps.union (var "names") (Maps.fromList (var "pairs")) $
         "refs" <~ Lists.foldl (binaryFunction Sets.union) Sets.empty (Lists.map
@@ -858,21 +802,8 @@
         "visited" <~ Sets.fromList (Maps.keys (var "names")) $
         "newSeeds" <~ Sets.difference (var "refs") (var "visited") $
         var "deps" @@ var "newSeeds" @@ var "newNames"))) $
-  trace (string "type dependencies") $
   var "deps" @@ Sets.singleton (var "name") @@ Maps.empty
 
-typeSchemeToFType :: TBinding (TypeScheme -> Type)
-typeSchemeToFType = define "typeSchemeToFType" $
-  doc "Convert a type scheme to a forall type" $
-  "ts" ~>
-  "vars" <~ Core.typeSchemeVariables (var "ts") $
-  "body" <~ Core.typeSchemeType (var "ts") $
-  Lists.foldl
-    ("t" ~> "v" ~> Core.typeForall $ Core.forallType (var "v") (var "t"))
-    (var "body")
-    -- Put the variables in the same order in which they are introduced by the type scheme.
-    (Lists.reverse $ var "vars")
-
 typeToTypeScheme :: TBinding (Type -> TypeScheme)
 typeToTypeScheme = define "typeToTypeScheme" $
   doc "Convert a (System F -style) type to a type scheme" $
@@ -896,23 +827,23 @@
       nothing) $
   Lists.map (var "toElement") $ Maps.toList $ var "typeMap"
 
-withLambdaContext :: TBinding ((e -> TypeContext) -> (TypeContext -> e -> e) -> e -> Lambda -> (e -> Flow s a) -> Flow s a)
+withLambdaContext :: TBinding ((e -> Graph) -> (Graph -> e -> f) -> e -> Lambda -> (f -> a) -> a)
 withLambdaContext = define "withLambdaContext" $
   doc "Execute a computation in the context of a lambda body, extending the type context with the lambda parameter" $
   "getContext" ~> "setContext" ~> "env" ~> "lam" ~> "body" ~>
-  "newContext" <~ extendTypeContextForLambda @@ (var "getContext" @@ var "env") @@ var "lam" $
+  "newContext" <~ Rewriting.extendGraphForLambda @@ (var "getContext" @@ var "env") @@ var "lam" $
   var "body" @@ (var "setContext" @@ var "newContext" @@ var "env")
 
-withLetContext :: TBinding ((e -> TypeContext) -> (TypeContext -> e -> e) -> (TypeContext -> Binding -> Maybe Term) -> e -> Let -> (e -> Flow s a) -> Flow s a)
+withLetContext :: TBinding ((e -> Graph) -> (Graph -> e -> f) -> (Graph -> Binding -> Maybe Term) -> e -> Let -> (f -> a) -> a)
 withLetContext = define "withLetContext" $
   doc "Execute a computation in the context of a let body, extending the type context with the let bindings" $
   "getContext" ~> "setContext" ~> "forBinding" ~> "env" ~> "letrec" ~> "body" ~>
-  "newContext" <~ extendTypeContextForLet @@ var "forBinding" @@ (var "getContext" @@ var "env") @@ var "letrec" $
+  "newContext" <~ Rewriting.extendGraphForLet @@ var "forBinding" @@ (var "getContext" @@ var "env") @@ var "letrec" $
   var "body" @@ (var "setContext" @@ var "newContext" @@ var "env")
 
-withTypeLambdaContext :: TBinding ((e -> TypeContext) -> (TypeContext -> e -> e) -> e -> TypeLambda -> (e -> Flow s a) -> Flow s a)
+withTypeLambdaContext :: TBinding ((e -> Graph) -> (Graph -> e -> f) -> e -> TypeLambda -> (f -> a) -> a)
 withTypeLambdaContext = define "withTypeLambdaContext" $
   doc "Execute a computation in the context of a type lambda body, extending the type context with the type parameter" $
   "getContext" ~> "setContext" ~> "env" ~> "tlam" ~> "body" ~>
-  "newContext" <~ extendTypeContextForTypeLambda @@ (var "getContext" @@ var "env") @@ var "tlam" $
+  "newContext" <~ Rewriting.extendGraphForTypeLambda @@ (var "getContext" @@ var "env") @@ var "tlam" $
   var "body" @@ (var "setContext" @@ var "newContext" @@ var "env")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Serialization.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Serialization.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Serialization.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Serialization.hs
@@ -10,24 +10,22 @@
   indentLines, indentSubsequentLines, infixWs, infixWsList, inlineStyle, newline, newlineSep, noSep,
   noPad, noPadding, num, op, orOp, orSep, parenList, parens, parensList, parentheses, parenthesize,
   prefix, printExpr, printGraph, semicolonSep, sep, singleQuoted, space, spaceSep, squareBrackets,
+  structuralSep, structuralSpaceSep,
   suffix, sym, symbolSep, tabIndent, tabIndentDoubleSpace, tabIndentSingleSpace, unsupportedType,
   unsupportedVariant, withComma, withSemi)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -42,18 +40,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -76,66 +74,68 @@
     Just ("Utilities for constructing generic program code ASTs, used for the serialization phase of source code generation.")
   where
    elements = [
-     toBinding angleBraces,
-     toBinding angleBracesList,
-     toBinding bracesListAdaptive,
-     toBinding bracketList,
-     toBinding bracketListAdaptive,
-     toBinding brackets,
-     toBinding commaSep,
-     toBinding curlyBlock,
-     toBinding curlyBraces,
-     toBinding curlyBracesList,
-     toBinding cst,
-     toBinding customIndent,
-     toBinding customIndentBlock,
-     toBinding dotSep,
-     toBinding doubleNewlineSep,
-     toBinding doubleSpace,
-     toBinding expressionLength,
-     toBinding fullBlockStyle,
-     toBinding halfBlockStyle,
-     toBinding ifx,
-     toBinding indent,
-     toBinding indentBlock,
-     toBinding indentSubsequentLines,
-     toBinding infixWs,
-     toBinding infixWsList,
-     toBinding inlineStyle,
-     toBinding newlineSep,
-     toBinding noPadding,
-     toBinding noSep,
-     toBinding num,
-     toBinding op,
-     toBinding orOp,
-     toBinding orSep,
-     toBinding parenList,
-     toBinding parens,
-     toBinding parentheses,
-     toBinding parenthesize,
-     toBinding prefix,
-     toBinding printExpr,
-     toBinding semicolonSep,
-     toBinding sep,
-     toBinding spaceSep,
-     toBinding squareBrackets,
-     toBinding suffix,
-     toBinding sym,
-     toBinding symbolSep,
-     toBinding tabIndent,
-     toBinding tabIndentDoubleSpace,
-     toBinding tabIndentSingleSpace,
-     toBinding unsupportedType,
-     toBinding unsupportedVariant,
-     toBinding withComma,
-     toBinding withSemi]
+     toTermDefinition angleBraces,
+     toTermDefinition angleBracesList,
+     toTermDefinition bracesListAdaptive,
+     toTermDefinition bracketList,
+     toTermDefinition bracketListAdaptive,
+     toTermDefinition brackets,
+     toTermDefinition commaSep,
+     toTermDefinition cst,
+     toTermDefinition curlyBlock,
+     toTermDefinition curlyBraces,
+     toTermDefinition curlyBracesList,
+     toTermDefinition customIndent,
+     toTermDefinition customIndentBlock,
+     toTermDefinition dotSep,
+     toTermDefinition doubleNewlineSep,
+     toTermDefinition doubleSpace,
+     toTermDefinition expressionLength,
+     toTermDefinition fullBlockStyle,
+     toTermDefinition halfBlockStyle,
+     toTermDefinition ifx,
+     toTermDefinition indent,
+     toTermDefinition indentBlock,
+     toTermDefinition indentSubsequentLines,
+     toTermDefinition infixWs,
+     toTermDefinition infixWsList,
+     toTermDefinition inlineStyle,
+     toTermDefinition newlineSep,
+     toTermDefinition noPadding,
+     toTermDefinition noSep,
+     toTermDefinition num,
+     toTermDefinition op,
+     toTermDefinition orOp,
+     toTermDefinition orSep,
+     toTermDefinition parenList,
+     toTermDefinition parens,
+     toTermDefinition parentheses,
+     toTermDefinition parenthesize,
+     toTermDefinition prefix,
+     toTermDefinition printExpr,
+     toTermDefinition semicolonSep,
+     toTermDefinition sep,
+     toTermDefinition spaceSep,
+     toTermDefinition squareBrackets,
+     toTermDefinition structuralSep,
+     toTermDefinition structuralSpaceSep,
+     toTermDefinition suffix,
+     toTermDefinition sym,
+     toTermDefinition symbolSep,
+     toTermDefinition tabIndent,
+     toTermDefinition tabIndentDoubleSpace,
+     toTermDefinition tabIndentSingleSpace,
+     toTermDefinition unsupportedType,
+     toTermDefinition unsupportedVariant,
+     toTermDefinition withComma,
+     toTermDefinition withSemi]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
 angleBraces :: TBinding Brackets
 angleBraces = define "angleBraces" $
-  Ast.brackets (sym @@ string "<") (sym @@ string ">")
+  Ast.brackets (Ast.symbol (string "<")) (Ast.symbol (string ">"))
 
 angleBracesList :: TBinding (BlockStyle -> [Expr] -> Expr)
 angleBracesList = define "angleBracesList" $
@@ -153,6 +153,13 @@
     (curlyBracesList @@ nothing @@ halfBlockStyle @@ var "els")
     (var "inlineList")
 
+bracketList :: TBinding (BlockStyle -> [Expr] -> Expr)
+bracketList = define "bracketList" $
+  "style" ~> "els" ~>
+    Logic.ifElse (Lists.null $ var "els")
+      (cst @@ string "[]")
+      (brackets @@ squareBrackets @@ var "style" @@ (commaSep @@ var "style" @@ var "els"))
+
 bracketListAdaptive :: TBinding ([Expr] -> Expr)
 bracketListAdaptive = define "bracketListAdaptive" $
   doc "Produce a bracketed list which separates elements by spaces or newlines depending on the estimated width of the expression." $
@@ -162,13 +169,6 @@
     (bracketList @@ halfBlockStyle @@ var "els")
     (var "inlineList")
 
-bracketList :: TBinding (BlockStyle -> [Expr] -> Expr)
-bracketList = define "bracketList" $
-  "style" ~> "els" ~>
-    Logic.ifElse (Lists.null $ var "els")
-      (cst @@ string "[]")
-      (brackets @@ squareBrackets @@ var "style" @@ (commaSep @@ var "style" @@ var "els"))
-
 brackets :: TBinding (Brackets -> BlockStyle -> Expr -> Expr)
 brackets = define "brackets" $
   "br" ~> "style" ~> "e" ~>
@@ -189,7 +189,7 @@
 
 curlyBraces :: TBinding Brackets
 curlyBraces = define "curlyBraces" $
-  Ast.brackets (sym @@ string "{") (sym @@ string "}")
+  Ast.brackets (Ast.symbol (string "{")) (Ast.symbol (string "}"))
 
 curlyBracesList :: TBinding (Maybe String -> BlockStyle -> [Expr] -> Expr)
 curlyBracesList = define "curlyBracesList" $
@@ -199,6 +199,11 @@
       (brackets @@ curlyBraces @@ var "style" @@
         (symbolSep @@ (Maybes.fromMaybe (string ",") (var "msymb")) @@ var "style" @@ var "els"))
 
+customIndent :: TBinding (String -> String -> String)
+customIndent = define "customIndent" $
+  "idt" ~> "s" ~> Strings.cat $
+    Lists.intersperse (string "\n") $ Lists.map ("line" ~> var "idt" ++ var "line") $ Strings.lines $ var "s"
+
 customIndentBlock :: TBinding (String -> [Expr] -> Expr)
 customIndentBlock = define "customIndentBlock" $
   "idt" ~> "els" ~>
@@ -213,11 +218,6 @@
         (ifx @@ var "idtOp" @@ var "head" @@ (newlineSep @@ Lists.drop (int32 1) (var "els"))))
       (Lists.safeHead $ var "els")
 
-customIndent :: TBinding (String -> String -> String)
-customIndent = define "customIndent" $
-  "idt" ~> "s" ~> Strings.cat $
-    Lists.intersperse (string "\n") $ Lists.map ("line" ~> var "idt" ++ var "line") $ Strings.lines $ var "s"
-
 dotSep :: TBinding ([Expr] -> Expr)
 dotSep = define "dotSep" $
   sep @@ (Ast.op
@@ -246,9 +246,9 @@
   "wsLength" <~ ("ws" ~> cases _Ws (var "ws") Nothing [
     _Ws_none>>: constant $ int32 0,
     _Ws_space>>: constant $ int32 1,
-    _Ws_break>>: constant $ int32 1,
-    _Ws_breakAndIndent>>: "s" ~> Math.add (int32 1) (Strings.length $ var "s"),
-    _Ws_doubleBreak>>: constant $ int32 2]) $
+    _Ws_break>>: constant $ int32 10000,
+    _Ws_breakAndIndent>>: "s" ~> int32 10000,
+    _Ws_doubleBreak>>: constant $ int32 10000]) $
   "blockStyleLength" <~ ("style" ~>
     "mindentLen" <~ Maybes.maybe (int32 0) (unaryFunction Strings.length) (Ast.blockStyleIndent $ var "style") $
     "nlBeforeLen" <~ Logic.ifElse (Ast.blockStyleNewlineBeforeContent $ var "style") (int32 1) (int32 0) $
@@ -281,11 +281,18 @@
     "leftLen" <~ expressionLength @@ (Ast.opExprLhs $ var "oe") $
     "rightLen" <~ expressionLength @@ (Ast.opExprRhs $ var "oe") $
     Math.add (var "opLen") $ Math.add (var "leftLen") (var "rightLen")) $
+  "seqExprLength" <~ ("se" ~>
+    "sopLen" <~ var "opLength" @@ (Ast.seqExprOp $ var "se") $
+    "elementLens" <~ Lists.map (expressionLength) (Ast.seqExprElements $ var "se") $
+    "totalElLen" <~ Lists.foldl (binaryFunction Math.add) (int32 0) (var "elementLens") $
+    "numSeps" <~ Math.sub (Lists.length $ Ast.seqExprElements $ var "se") (int32 1) $
+    Math.add (var "totalElLen") (Math.mul (var "sopLen") (Logic.ifElse (Equality.gt (var "numSeps") (int32 0)) (var "numSeps") (int32 0)))) $
   cases _Expr (var "e") Nothing [
     _Expr_const>>: "s" ~> var "symbolLength" @@ var "s",
     _Expr_indent>>: "ie" ~> var "indentedExpressionLength" @@ var "ie",
     _Expr_op>>: "oe" ~> var "opExprLength" @@ var "oe",
-    _Expr_brackets>>: "be" ~> var "bracketExprLength" @@ var "be"]
+    _Expr_brackets>>: "be" ~> var "bracketExprLength" @@ var "be",
+    _Expr_seq>>: "se" ~> var "seqExprLength" @@ var "se"]
 
 fullBlockStyle :: TBinding BlockStyle
 fullBlockStyle = define "fullBlockStyle" $
@@ -300,14 +307,14 @@
   "op" ~> "lhs" ~> "rhs" ~>
     Ast.exprOp $ Ast.opExpr (var "op") (var "lhs") (var "rhs")
 
-indentBlock :: TBinding ([Expr] -> Expr)
-indentBlock = define "indentBlock" $
-  customIndentBlock @@ doubleSpace
-
 indent :: TBinding (String -> String)
 indent = define "indent" $
   customIndent @@ doubleSpace
 
+indentBlock :: TBinding ([Expr] -> Expr)
+indentBlock = define "indentBlock" $
+  customIndentBlock @@ doubleSpace
+
 indentSubsequentLines :: TBinding (String -> Expr -> Expr)
 indentSubsequentLines = define "indentSubsequentLines" $
   "idt" ~> "e" ~>
@@ -397,7 +404,7 @@
 
 parentheses :: TBinding Brackets
 parentheses = define "parentheses" $
-  Ast.brackets (sym @@ string "(") (sym @@ string ")")
+  Ast.brackets (Ast.symbol (string "(")) (Ast.symbol (string ")"))
 
 parenthesize :: TBinding (Expr -> Expr)
 parenthesize = define "parenthesize" $
@@ -419,6 +426,10 @@
         Ast.exprIndent $ Ast.indentedExpression
           (Ast.indentedExpressionStyle $ var "indentExpr")
           (parenthesize @@ (Ast.indentedExpressionExpr $ var "indentExpr")),
+      _Expr_seq>>: "seqExpr" ~>
+        Ast.exprSeq $ Ast.seqExpr
+          (Ast.seqExprOp $ var "seqExpr")
+          (Lists.map (parenthesize) (Ast.seqExprElements $ var "seqExpr")),
       _Expr_op>>: "opExpr" ~>
         "op" <~ Ast.opExprOp (var "opExpr") $
         "prec" <~ Ast.unPrecedence (Ast.opPrecedence $ var "op") $
@@ -490,6 +501,16 @@
             (var "lns")
             (Lists.cons (Lists.head $ var "lns") $ Lists.map ("line" ~> var "idt" ++ var "line") $ Lists.tail $ var "lns")] $
       Strings.intercalate (string "\n") (var "ilns"),
+    _Expr_seq>>: "seqExpr" ~>
+      "sop" <~ Ast.seqExprOp (var "seqExpr") $
+      "ssym" <~ Ast.unSymbol (Ast.opSymbol $ var "sop") $
+      "spadding" <~ Ast.opPadding (var "sop") $
+      "spadl" <~ Ast.paddingLeft (var "spadding") $
+      "spadr" <~ Ast.paddingRight (var "spadding") $
+      "selements" <~ Ast.seqExprElements (var "seqExpr") $
+      "separator" <~ (var "pad" @@ var "spadl") ++ var "ssym" ++ (var "pad" @@ var "spadr") $
+      "printedElements" <~ Lists.map ("el" ~> var "idt" @@ var "spadr" @@ (printExpr @@ var "el")) (var "selements") $
+      Strings.intercalate (var "separator") (var "printedElements"),
     _Expr_op>>: "opExpr" ~>
       "op" <~ Ast.opExprOp (var "opExpr") $
       "sym" <~ Ast.unSymbol (Ast.opSymbol $ var "op") $
@@ -502,9 +523,9 @@
       "rhs" <~ var "idt" @@ var "padr" @@ (printExpr @@ var "r") $
       var "lhs" ++ (var "pad" @@ var "padl") ++ var "sym" ++ (var "pad" @@ var "padr") ++ var "rhs",
     _Expr_brackets>>: "bracketExpr" ~>
-      "brackets" <~ Ast.bracketExprBrackets (var "bracketExpr") $
-      "l" <~ Ast.unSymbol (Ast.bracketsOpen $ var "brackets") $
-      "r" <~ Ast.unSymbol (Ast.bracketsClose $ var "brackets") $
+      "brs" <~ Ast.bracketExprBrackets (var "bracketExpr") $
+      "l" <~ Ast.unSymbol (Ast.bracketsOpen $ var "brs") $
+      "r" <~ Ast.unSymbol (Ast.bracketsClose $ var "brs") $
       "e" <~ Ast.bracketExprEnclosed (var "bracketExpr") $
       "style" <~ Ast.bracketExprStyle (var "bracketExpr") $
       "body" <~ printExpr @@ var "e" $
@@ -537,7 +558,26 @@
 
 squareBrackets :: TBinding Brackets
 squareBrackets = define "squareBrackets" $
-  Ast.brackets (sym @@ string "[") (sym @@ string "]")
+  Ast.brackets (Ast.symbol (string "[")) (Ast.symbol (string "]"))
+
+structuralSep :: TBinding (Op -> [Expr] -> Expr)
+structuralSep = define "structuralSep" $
+  doc "Like sep, but produces a SeqExpr instead of an OpExpr chain. SeqExpr is treated as structural layout and is not subject to parenthesization." $
+  "op" ~> "els" ~>
+    Logic.ifElse (Lists.null $ var "els")
+      (cst @@ string "")
+      (Logic.ifElse (Equality.equal (Lists.length $ var "els") (int32 1))
+        (Lists.head $ var "els")
+        (Ast.exprSeq $ Ast.seqExpr (var "op") (var "els")))
+
+structuralSpaceSep :: TBinding ([Expr] -> Expr)
+structuralSpaceSep = define "structuralSpaceSep" $
+  doc "Like spaceSep, but produces a SeqExpr. Use for structural layout that should not trigger parenthesization of children." $
+  structuralSep @@ (Ast.op
+    (sym @@ string "")
+    (Ast.padding Ast.wsSpace Ast.wsNone)
+    (Ast.precedence $ int32 0)
+    Ast.associativityNone)
 
 suffix :: TBinding (String -> Expr -> Expr)
 suffix = define "suffix" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Accessors.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Accessors.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Accessors.hs
+++ /dev/null
@@ -1,181 +0,0 @@
-module Hydra.Sources.Kernel.Terms.Show.Accessors where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Names as Names
-import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
-
-
-ns :: Namespace
-ns = Namespace "hydra.show.accessors"
-
-module_ :: Module
-module_ = Module ns elements
-    [Names.ns, Rewriting.ns]
-    kernelTypesNamespaces $
-    Just ("Utilities for working with term accessors.")
-  where
-   elements = [
-     toBinding termAccessor,
-     toBinding termToAccessorGraph] -- TODO: move out of hydra.show.accessors
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-termAccessor :: TBinding (TermAccessor -> Maybe String)
-termAccessor = define "termAccessor" $
-  doc "Convert a term accessor to a string representation" $
-  "accessor" ~>
-  "idx" <~ ("i" ~> nothing) $  -- TODO: restore index functionality
-  "idxSuff" <~ ("suffix" ~> "i" ~>
-    Maybes.map ("s" ~> Strings.cat2 (var "s") (var "suffix")) (var "idx" @@ var "i")) $
-  cases _TermAccessor (var "accessor")
-    Nothing [
-    _TermAccessor_annotatedBody>>: constant nothing,
-    _TermAccessor_applicationFunction>>: constant (just (string "fun")),
-    _TermAccessor_applicationArgument>>: constant (just (string "arg")),
-    _TermAccessor_lambdaBody>>: constant (just (string "body")),
-    _TermAccessor_unionCasesDefault>>: constant (just (string "default")),
-    _TermAccessor_unionCasesBranch>>: "name" ~> just (Strings.cat2 (string ".") (Core.unName (var "name"))),
-    _TermAccessor_letBody>>: constant (just (string "in")),
-    _TermAccessor_letBinding>>: "name" ~> just (Strings.cat2 (Core.unName (var "name")) (string "=")),
-    _TermAccessor_listElement>>: "i" ~> var "idx" @@ var "i",
-    _TermAccessor_mapKey>>: "i" ~> var "idxSuff" @@ (string ".key") @@ var "i",
-    _TermAccessor_mapValue>>: "i" ~> var "idxSuff" @@ (string ".value") @@ var "i",
-    _TermAccessor_maybeTerm>>: constant (just (string "just")),
-    _TermAccessor_productTerm>>: "i" ~> var "idx" @@ var "i",
-    _TermAccessor_recordField>>: "name" ~> just (Strings.cat2 (string ".") (Core.unName (var "name"))),
-    _TermAccessor_setElement>>: "i" ~> var "idx" @@ var "i",
-    _TermAccessor_sumTerm>>: constant nothing,
-    _TermAccessor_typeLambdaBody>>: constant nothing,
-    _TermAccessor_typeApplicationTerm>>: constant nothing,
-    _TermAccessor_injectionTerm>>: constant nothing,
-    _TermAccessor_wrappedTerm>>: constant nothing]
-
--- TODO: move out of hydra.show.accessors; this is not strictly a "show" function
-termToAccessorGraph :: TBinding (M.Map Namespace String -> Term -> AccessorGraph)
-termToAccessorGraph = define "termToAccessorGraph" $
-  doc "Build an accessor graph from a term" $
-  lambda "namespaces" $ lambda "term" $ lets [
-    "dontCareAccessor">: Accessors.termAccessorAnnotatedBody,
-    "helper">: lambdas ["ids", "mroot", "path", "state", "accessorTerm"] $ lets [
-      "accessor">: Pairs.first $ var "accessorTerm",
-      "currentTerm">: Pairs.second $ var "accessorTerm",
-      "nodesEdges">: Pairs.first $ var "state",
-      "visited">: Pairs.second $ var "state",
-      "nodes">: Pairs.first $ var "nodesEdges",
-      "edges">: Pairs.second $ var "nodesEdges",
-      "nextPath">: Lists.cons (var "accessor") (var "path")]
-      $ match _Term (Just $
-          Lists.foldl
-            (var "helper" @@ var "ids" @@ var "mroot" @@ var "nextPath")
-            (var "state")
-            (Rewriting.subtermsWithAccessors @@ var "currentTerm")) [
-        _Term_let>>: lambda "letExpr" $ lets [
-          "bindings">: Core.letBindings $ var "letExpr",
-          "env">: Core.letBody $ var "letExpr",
-          "bindingNames">: Lists.map (unaryFunction Core.bindingName) (var "bindings"),
-          -- First fold: build nodes and update ids for each binding name
-          "addBindingName">: lambdas ["nodesVisitedIds", "name"] $ lets [
-            "currentNodesVisited">: Pairs.first $ var "nodesVisitedIds",
-            "currentIds">: Pairs.second $ var "nodesVisitedIds",
-            "currentNodes">: Pairs.first $ var "currentNodesVisited",
-            "currentVisited">: Pairs.second $ var "currentNodesVisited",
-            "rawLabel">: Names.compactName @@ var "namespaces" @@ var "name",
-            "uniqueLabel">: Names.uniqueLabel @@ var "currentVisited" @@ var "rawLabel",
-            "node">: Accessors.accessorNode (var "name") (var "rawLabel") (var "uniqueLabel"),
-            "newVisited">: Sets.insert (var "uniqueLabel") (var "currentVisited"),
-            "newNodes">: Lists.cons (var "node") (var "currentNodes"),
-            "newIds">: Maps.insert (var "name") (var "node") (var "currentIds")]
-            $ pair (pair (var "newNodes") (var "newVisited")) (var "newIds"),
-          "nodesVisitedIds1">: Lists.foldl
-            (var "addBindingName")
-            (pair (pair (list ([] :: [TTerm AccessorNode])) (var "visited")) (var "ids"))
-            (var "bindingNames"),
-          "nodes1">: Pairs.first $ Pairs.first $ var "nodesVisitedIds1",
-          "visited1">: Pairs.second $ Pairs.first $ var "nodesVisitedIds1",
-          "ids1">: Pairs.second $ var "nodesVisitedIds1",
-          -- Second fold: process each binding term
-          "addBindingTerm">: lambdas ["currentState", "nodeBinding"] $ lets [
-            "root">: Pairs.first $ var "nodeBinding",
-            "binding">: Pairs.second $ var "nodeBinding",
-            "term1">: Core.bindingTerm $ var "binding"]
-            $ var "helper" @@ var "ids1" @@ just (var "root") @@ list ([] :: [TTerm TermAccessor]) @@ var "currentState" @@
-              pair (var "dontCareAccessor") (var "term1"),
-          "nodeBindingPairs">: Lists.zip (var "nodes1") (var "bindings"),
-          "stateAfterBindings">: Lists.foldl
-            (var "addBindingTerm")
-            (pair (pair (Lists.concat2 (var "nodes1") (var "nodes")) (var "edges")) (var "visited1"))
-            (var "nodeBindingPairs")]
-          $ var "helper" @@ var "ids1" @@ var "mroot" @@ var "nextPath" @@ var "stateAfterBindings" @@
-            pair Accessors.termAccessorLetEnvironment (var "env"),
-        _Term_variable>>: lambda "name" $
-          Maybes.maybe (var "state")
-            (lambda "root" $
-              Maybes.maybe (var "state")
-                (lambda "node" $ lets [
-                  "edge">: Accessors.accessorEdge (var "root")
-                    (Accessors.accessorPath $ Lists.reverse $ var "nextPath") (var "node"),
-                  "newEdges">: Lists.cons (var "edge") (var "edges")]
-                  $ pair (pair (var "nodes") (var "newEdges")) (var "visited"))
-                (Maps.lookup (var "name") (var "ids")))
-            (var "mroot")]
-      @@ var "currentTerm",
-    "initialState">: pair (pair (list ([] :: [TTerm AccessorNode])) (list ([] :: [TTerm AccessorEdge]))) Sets.empty,
-    "result">: var "helper" @@ Maps.empty @@ nothing @@ list ([] :: [TTerm TermAccessor]) @@ var "initialState" @@
-      pair (var "dontCareAccessor") (var "term"),
-    "finalNodesEdges">: Pairs.first $ var "result",
-    "finalNodes">: Pairs.first $ var "finalNodesEdges",
-    "finalEdges">: Pairs.second $ var "finalNodesEdges"] $
-    Accessors.accessorGraph (var "finalNodes") (var "finalEdges")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Core.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Core.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Core.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Core.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules (slightly modified for conflict avoidance)
 import Hydra.Kernel hiding (literalType)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,20 +30,20 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (
   binding, elimination, field, fields, fieldType, floatType, floatValue, function, injection, integerType,
   integerValue, lambda, literal, literalType, term, type_, typeScheme)
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -67,26 +64,26 @@
     Just "String representations of hydra.core types"
   where
    elements = [
-     toBinding readTerm, -- TODO: move this to hydra.read.core
-     toBinding binding,
-     toBinding elimination,
-     toBinding field,
-     toBinding fieldType,
-     toBinding fields,
-     toBinding floatValue,
-     toBinding floatType,
-     toBinding function,
-     toBinding injection,
-     toBinding integerValue,
-     toBinding integerType,
-     toBinding lambda,
-     toBinding let_,
-     toBinding list_,
-     toBinding literal,
-     toBinding literalType,
-     toBinding term,
-     toBinding type_,
-     toBinding typeScheme]
+     toTermDefinition readTerm, -- TODO: move this to hydra.read.core
+     toTermDefinition binding,
+     toTermDefinition elimination,
+     toTermDefinition field,
+     toTermDefinition fieldType,
+     toTermDefinition fields,
+     toTermDefinition floatValue,
+     toTermDefinition floatType,
+     toTermDefinition function,
+     toTermDefinition injection,
+     toTermDefinition integerValue,
+     toTermDefinition integerType,
+     toTermDefinition lambda,
+     toTermDefinition let_,
+     toTermDefinition list_,
+     toTermDefinition literal,
+     toTermDefinition literalType,
+     toTermDefinition term,
+     toTermDefinition type_,
+     toTermDefinition typeScheme]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -403,8 +400,7 @@
 type_ = define "type" $
   doc "Show a type as a string" $
   "typ" ~>
-  "showRowType" <~ ("rt" ~>
-    "flds" <~ Core.rowTypeFields (var "rt") $
+  "showRowType" <~ ("flds" ~>
     "fieldStrs" <~ Lists.map fieldType (var "flds") $
     Strings.cat $ list [
       string "{",
@@ -492,10 +488,9 @@
     _Type_union>>: "rt" ~> Strings.cat2 (string "union") (var "showRowType" @@ var "rt"),
     _Type_unit>>: constant $ string "unit",
     _Type_variable>>: "name" ~> unwrap _Name @@ var "name",
+    _Type_void>>: constant $ string "void",
     _Type_wrap>>: "wt" ~>
-      "tname" <~ unwrap _Name @@ (Core.wrappedTypeTypeName $ var "wt") $
-      "typ1" <~ Core.wrappedTypeBody (var "wt") $
-      Strings.cat $ list [string "wrap[", var "tname", string "](", type_ @@ var "typ1", string ")"]]
+      Strings.cat $ list [string "wrap(", type_ @@ var "wt", string ")"]]
 
 typeScheme :: TBinding (TypeScheme -> String)
 typeScheme = define "typeScheme" $
@@ -507,11 +502,27 @@
   "fa" <~ Logic.ifElse (Lists.null $ var "vars")
     (string "")
     (Strings.cat $ list [
-      string "∀[",
+      string "forall ",
       Strings.intercalate (string ",") (var "varNames"),
-      string "]."]) $
+      string ". "]) $
+  "toConstraintPair" <~ ("v" ~> "c" ~> Strings.cat $ list [
+    Core.unName (var "c"),
+    string " ",
+    Core.unName (var "v")]) $
+  "toConstraintPairs" <~ ("p" ~> Lists.map
+    (var "toConstraintPair" @@ (Pairs.first $ var "p")) $
+    Sets.toList $ Core.typeVariableMetadataClasses $ Pairs.second $ var "p") $
+  "tc" <~ optCases (Core.typeSchemeConstraints (var "ts"))
+    (list ([] :: [TTerm String]))
+    ("m" ~> Lists.concat $ Lists.map (var "toConstraintPairs") $ Maps.toList $ var "m") $
   Strings.cat $ list [
     string "(",
     var "fa",
+    Logic.ifElse (Lists.null $ var "tc")
+      (string "")
+      (Strings.cat $ list [
+        string "(",
+        Strings.intercalate (string ", ") (var "tc"),
+        string ") => "]),
     type_ @@ var "body",
     string ")"]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Error/Core.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Error/Core.hs
@@ -0,0 +1,442 @@
+
+module Hydra.Sources.Kernel.Terms.Show.Error.Core where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths    as Paths
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Ast          as Ast
+import qualified Hydra.Dsl.Bootstrap         as Bootstrap
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Meta.Graph        as Graph
+import qualified Hydra.Dsl.Json.Model         as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Literals          as Literals
+import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base         as MetaBase
+import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
+import qualified Hydra.Dsl.Meta.Types        as MetaTypes
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (
+  binding, elimination, field, fields, fieldType, floatType, floatValue, function, injection, integerType,
+  integerValue, lambda, literal, literalType, term, type_, typeScheme)
+import qualified Hydra.Dsl.Prims             as Prims
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Testing      as Testing
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Tests             as Tests
+import qualified Hydra.Dsl.Topology     as Topology
+import qualified Hydra.Dsl.Types             as Types
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
+import qualified Hydra.Dsl.Meta.Variants     as Variants
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                    as I
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+import qualified Data.Maybe                  as Y
+
+import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Meta as ShowMeta
+
+
+ns :: Namespace
+ns = Namespace "hydra.show.error.core"
+
+module_ :: Module
+module_ = Module ns elements
+    [ShowCore.ns, ShowMeta.ns]
+    kernelTypesNamespaces $
+    Just "String representations of hydra.error.core types"
+  where
+   elements = [
+     toTermDefinition constantConditionError,
+     toTermDefinition duplicateBindingError,
+     toTermDefinition duplicateFieldError,
+     toTermDefinition duplicateRecordTypeFieldNamesError,
+     toTermDefinition duplicateUnionTypeFieldNamesError,
+     toTermDefinition emptyCaseStatementError,
+     toTermDefinition emptyLetBindingsError,
+     toTermDefinition emptyRecordTypeError,
+     toTermDefinition emptyTermAnnotationError,
+     toTermDefinition emptyTypeAnnotationError,
+     toTermDefinition emptyTypeNameInTermError,
+     toTermDefinition emptyUnionTypeError,
+     toTermDefinition invalidForallParameterNameError,
+     toTermDefinition invalidLambdaParameterNameError,
+     toTermDefinition invalidLetBindingNameError,
+     toTermDefinition invalidTermError,
+     toTermDefinition invalidTypeError,
+     toTermDefinition invalidTypeLambdaParameterNameError,
+     toTermDefinition invalidTypeSchemeVariableNameError,
+     toTermDefinition nestedTermAnnotationError,
+     toTermDefinition nestedTypeAnnotationError,
+     toTermDefinition nonComparableMapKeyTypeError,
+     toTermDefinition nonComparableSetElementTypeError,
+     toTermDefinition redundantWrapUnwrapError,
+     toTermDefinition selfApplicationError,
+     toTermDefinition singleVariantUnionError,
+     toTermDefinition termVariableShadowingError,
+     toTermDefinition typeVariableShadowingInForallError,
+     toTermDefinition typeVariableShadowingInTypeLambdaError,
+     toTermDefinition undefinedFieldError,
+     toTermDefinition undefinedTermVariableError,
+     toTermDefinition undefinedTypeVariableError,
+     toTermDefinition undefinedTypeVariableInBindingTypeError,
+     toTermDefinition undefinedTypeVariableInLambdaDomainError,
+     toTermDefinition undefinedTypeVariableInTypeApplicationError,
+     toTermDefinition unexpectedTermVariantError,
+     toTermDefinition unexpectedTypeVariantError,
+     toTermDefinition unknownPrimitiveNameError,
+     toTermDefinition unnecessaryIdentityApplicationError,
+     toTermDefinition untypedTermVariableError,
+     toTermDefinition voidInNonBottomPositionError]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+-- ============================================================================
+-- Existing error types
+-- ============================================================================
+
+duplicateBindingError :: TBinding (DuplicateBindingError -> String)
+duplicateBindingError = define "duplicateBindingError" $
+  doc "Show a duplicate binding error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "duplicate binding: ",
+    Core.unName $ project _DuplicateBindingError _DuplicateBindingError_name @@ var "e"]
+
+duplicateFieldError :: TBinding (DuplicateFieldError -> String)
+duplicateFieldError = define "duplicateFieldError" $
+  doc "Show a duplicate field error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "duplicate field: ",
+    Core.unName $ project _DuplicateFieldError _DuplicateFieldError_name @@ var "e"]
+
+undefinedFieldError :: TBinding (UndefinedFieldError -> String)
+undefinedFieldError = define "undefinedFieldError" $
+  doc "Show an undefined field error as a string" $
+  "e" ~>
+  "fname" <~ project _UndefinedFieldError _UndefinedFieldError_fieldName @@ var "e" $
+  "tname" <~ project _UndefinedFieldError _UndefinedFieldError_typeName @@ var "e" $
+  Strings.cat $ list [
+    string "no such field \"",
+    Core.unName $ var "fname",
+    string "\" in type \"",
+    Core.unName $ var "tname",
+    string "\""]
+
+unexpectedTermVariantError :: TBinding (UnexpectedTermVariantError -> String)
+unexpectedTermVariantError = define "unexpectedTermVariantError" $
+  doc "Show an unexpected term variant error as a string" $
+  "e" ~>
+  "expected" <~ project _UnexpectedTermVariantError _UnexpectedTermVariantError_expectedVariant @@ var "e" $
+  "actual" <~ project _UnexpectedTermVariantError _UnexpectedTermVariantError_actualTerm @@ var "e" $
+  Strings.cat $ list [
+    string "expected ",
+    ShowMeta.termVariant @@ var "expected",
+    string " term but found ",
+    ShowCore.term @@ var "actual"]
+
+unexpectedTypeVariantError :: TBinding (UnexpectedTypeVariantError -> String)
+unexpectedTypeVariantError = define "unexpectedTypeVariantError" $
+  doc "Show an unexpected type variant error as a string" $
+  "e" ~>
+  "expected" <~ project _UnexpectedTypeVariantError _UnexpectedTypeVariantError_expectedVariant @@ var "e" $
+  "actual" <~ project _UnexpectedTypeVariantError _UnexpectedTypeVariantError_actualType @@ var "e" $
+  Strings.cat $ list [
+    string "expected ",
+    ShowMeta.typeVariant @@ var "expected",
+    string " type but found ",
+    ShowCore.type_ @@ var "actual"]
+
+-- ============================================================================
+-- Term validation error show functions
+-- ============================================================================
+
+constantConditionError :: TBinding (ConstantConditionError -> String)
+constantConditionError = define "constantConditionError" $
+  doc "Show a constant condition error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "constant condition: ifElse with literal ",
+    Literals.showBoolean $ project _ConstantConditionError _ConstantConditionError_value @@ var "e"]
+
+emptyCaseStatementError :: TBinding (EmptyCaseStatementError -> String)
+emptyCaseStatementError = define "emptyCaseStatementError" $
+  doc "Show an empty case statement error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "empty case statement for type: ",
+    Core.unName $ project _EmptyCaseStatementError _EmptyCaseStatementError_typeName @@ var "e"]
+
+emptyLetBindingsError :: TBinding (EmptyLetBindingsError -> String)
+emptyLetBindingsError = define "emptyLetBindingsError" $
+  doc "Show an empty let bindings error as a string" $
+  "e" ~> string "let expression with no bindings"
+
+emptyTermAnnotationError :: TBinding (EmptyTermAnnotationError -> String)
+emptyTermAnnotationError = define "emptyTermAnnotationError" $
+  doc "Show an empty term annotation error as a string" $
+  "e" ~> string "term annotation with empty annotation map"
+
+emptyTypeNameInTermError :: TBinding (EmptyTypeNameInTermError -> String)
+emptyTypeNameInTermError = define "emptyTypeNameInTermError" $
+  doc "Show an empty type name in term error as a string" $
+  "e" ~> string "term with empty type name"
+
+invalidLambdaParameterNameError :: TBinding (InvalidLambdaParameterNameError -> String)
+invalidLambdaParameterNameError = define "invalidLambdaParameterNameError" $
+  doc "Show an invalid lambda parameter name error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "invalid lambda parameter name: ",
+    Core.unName $ project _InvalidLambdaParameterNameError _InvalidLambdaParameterNameError_name @@ var "e"]
+
+invalidLetBindingNameError :: TBinding (InvalidLetBindingNameError -> String)
+invalidLetBindingNameError = define "invalidLetBindingNameError" $
+  doc "Show an invalid let binding name error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "invalid let binding name: ",
+    Core.unName $ project _InvalidLetBindingNameError _InvalidLetBindingNameError_name @@ var "e"]
+
+invalidTypeLambdaParameterNameError :: TBinding (InvalidTypeLambdaParameterNameError -> String)
+invalidTypeLambdaParameterNameError = define "invalidTypeLambdaParameterNameError" $
+  doc "Show an invalid type lambda parameter name error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "invalid type lambda parameter name: ",
+    Core.unName $ project _InvalidTypeLambdaParameterNameError _InvalidTypeLambdaParameterNameError_name @@ var "e"]
+
+nestedTermAnnotationError :: TBinding (NestedTermAnnotationError -> String)
+nestedTermAnnotationError = define "nestedTermAnnotationError" $
+  doc "Show a nested term annotation error as a string" $
+  "e" ~> string "nested term annotations should be merged"
+
+redundantWrapUnwrapError :: TBinding (RedundantWrapUnwrapError -> String)
+redundantWrapUnwrapError = define "redundantWrapUnwrapError" $
+  doc "Show a redundant wrap/unwrap error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "redundant wrap/unwrap for type: ",
+    Core.unName $ project _RedundantWrapUnwrapError _RedundantWrapUnwrapError_typeName @@ var "e"]
+
+selfApplicationError :: TBinding (SelfApplicationError -> String)
+selfApplicationError = define "selfApplicationError" $
+  doc "Show a self-application error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "self-application of variable: ",
+    Core.unName $ project _SelfApplicationError _SelfApplicationError_name @@ var "e"]
+
+termVariableShadowingError :: TBinding (TermVariableShadowingError -> String)
+termVariableShadowingError = define "termVariableShadowingError" $
+  doc "Show a term variable shadowing error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "variable shadowing: ",
+    Core.unName $ project _TermVariableShadowingError _TermVariableShadowingError_name @@ var "e"]
+
+typeVariableShadowingInTypeLambdaError :: TBinding (TypeVariableShadowingInTypeLambdaError -> String)
+typeVariableShadowingInTypeLambdaError = define "typeVariableShadowingInTypeLambdaError" $
+  doc "Show a type variable shadowing in type lambda error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "type variable shadowing in type lambda: ",
+    Core.unName $ project _TypeVariableShadowingInTypeLambdaError _TypeVariableShadowingInTypeLambdaError_name @@ var "e"]
+
+undefinedTermVariableError :: TBinding (UndefinedTermVariableError -> String)
+undefinedTermVariableError = define "undefinedTermVariableError" $
+  doc "Show an undefined term variable error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "undefined term variable: ",
+    Core.unName $ project _UndefinedTermVariableError _UndefinedTermVariableError_name @@ var "e"]
+
+undefinedTypeVariableInLambdaDomainError :: TBinding (UndefinedTypeVariableInLambdaDomainError -> String)
+undefinedTypeVariableInLambdaDomainError = define "undefinedTypeVariableInLambdaDomainError" $
+  doc "Show an undefined type variable in lambda domain error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "undefined type variable in lambda domain: ",
+    Core.unName $ project _UndefinedTypeVariableInLambdaDomainError _UndefinedTypeVariableInLambdaDomainError_name @@ var "e"]
+
+undefinedTypeVariableInTypeApplicationError :: TBinding (UndefinedTypeVariableInTypeApplicationError -> String)
+undefinedTypeVariableInTypeApplicationError = define "undefinedTypeVariableInTypeApplicationError" $
+  doc "Show an undefined type variable in type application error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "undefined type variable in type application: ",
+    Core.unName $ project _UndefinedTypeVariableInTypeApplicationError _UndefinedTypeVariableInTypeApplicationError_name @@ var "e"]
+
+undefinedTypeVariableInBindingTypeError :: TBinding (UndefinedTypeVariableInBindingTypeError -> String)
+undefinedTypeVariableInBindingTypeError = define "undefinedTypeVariableInBindingTypeError" $
+  doc "Show an undefined type variable in binding type error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "undefined type variable in binding type: ",
+    Core.unName $ project _UndefinedTypeVariableInBindingTypeError _UndefinedTypeVariableInBindingTypeError_name @@ var "e"]
+
+unknownPrimitiveNameError :: TBinding (UnknownPrimitiveNameError -> String)
+unknownPrimitiveNameError = define "unknownPrimitiveNameError" $
+  doc "Show an unknown primitive name error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "unknown primitive: ",
+    Core.unName $ project _UnknownPrimitiveNameError _UnknownPrimitiveNameError_name @@ var "e"]
+
+unnecessaryIdentityApplicationError :: TBinding (UnnecessaryIdentityApplicationError -> String)
+unnecessaryIdentityApplicationError = define "unnecessaryIdentityApplicationError" $
+  doc "Show an unnecessary identity application error as a string" $
+  "e" ~> string "unnecessary application of identity lambda"
+
+untypedTermVariableError :: TBinding (UntypedTermVariableError -> String)
+untypedTermVariableError = define "untypedTermVariableError" $
+  doc "Show an untyped term variable error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "untyped term variable: ",
+    Core.unName $ project _UntypedTermVariableError _UntypedTermVariableError_name @@ var "e"]
+
+invalidTermError :: TBinding (InvalidTermError -> String)
+invalidTermError = define "invalidTermError" $
+  doc "Show an invalid term error as a string" $
+  "e" ~> Strings.cat2 (string "invalid term: ") $
+    cases _InvalidTermError (var "e") Nothing [
+      _InvalidTermError_constantCondition>>: constantConditionError,
+      _InvalidTermError_duplicateBinding>>: duplicateBindingError,
+      _InvalidTermError_duplicateField>>: duplicateFieldError,
+      _InvalidTermError_emptyCaseStatement>>: emptyCaseStatementError,
+      _InvalidTermError_emptyLetBindings>>: emptyLetBindingsError,
+      _InvalidTermError_emptyTermAnnotation>>: emptyTermAnnotationError,
+      _InvalidTermError_emptyTypeNameInTerm>>: emptyTypeNameInTermError,
+      _InvalidTermError_invalidLambdaParameterName>>: invalidLambdaParameterNameError,
+      _InvalidTermError_invalidLetBindingName>>: invalidLetBindingNameError,
+      _InvalidTermError_invalidTypeLambdaParameterName>>: invalidTypeLambdaParameterNameError,
+      _InvalidTermError_nestedTermAnnotation>>: nestedTermAnnotationError,
+      _InvalidTermError_redundantWrapUnwrap>>: redundantWrapUnwrapError,
+      _InvalidTermError_selfApplication>>: selfApplicationError,
+      _InvalidTermError_termVariableShadowing>>: termVariableShadowingError,
+      _InvalidTermError_typeVariableShadowingInTypeLambda>>: typeVariableShadowingInTypeLambdaError,
+      _InvalidTermError_undefinedTermVariable>>: undefinedTermVariableError,
+      _InvalidTermError_undefinedTypeVariableInBindingType>>: undefinedTypeVariableInBindingTypeError,
+      _InvalidTermError_undefinedTypeVariableInLambdaDomain>>: undefinedTypeVariableInLambdaDomainError,
+      _InvalidTermError_undefinedTypeVariableInTypeApplication>>: undefinedTypeVariableInTypeApplicationError,
+      _InvalidTermError_unknownPrimitiveName>>: unknownPrimitiveNameError,
+      _InvalidTermError_unnecessaryIdentityApplication>>: unnecessaryIdentityApplicationError,
+      _InvalidTermError_untypedTermVariable>>: untypedTermVariableError]
+
+-- ============================================================================
+-- Type validation error show functions
+-- ============================================================================
+
+duplicateRecordTypeFieldNamesError :: TBinding (DuplicateRecordTypeFieldNamesError -> String)
+duplicateRecordTypeFieldNamesError = define "duplicateRecordTypeFieldNamesError" $
+  doc "Show a duplicate record type field names error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "duplicate field in record type: ",
+    Core.unName $ project _DuplicateRecordTypeFieldNamesError _DuplicateRecordTypeFieldNamesError_name @@ var "e"]
+
+duplicateUnionTypeFieldNamesError :: TBinding (DuplicateUnionTypeFieldNamesError -> String)
+duplicateUnionTypeFieldNamesError = define "duplicateUnionTypeFieldNamesError" $
+  doc "Show a duplicate union type field names error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "duplicate field in union type: ",
+    Core.unName $ project _DuplicateUnionTypeFieldNamesError _DuplicateUnionTypeFieldNamesError_name @@ var "e"]
+
+emptyRecordTypeError :: TBinding (EmptyRecordTypeError -> String)
+emptyRecordTypeError = define "emptyRecordTypeError" $
+  doc "Show an empty record type error as a string" $
+  "e" ~> string "record type with no fields (use TypeUnit instead)"
+
+emptyTypeAnnotationError :: TBinding (EmptyTypeAnnotationError -> String)
+emptyTypeAnnotationError = define "emptyTypeAnnotationError" $
+  doc "Show an empty type annotation error as a string" $
+  "e" ~> string "type annotation with empty annotation map"
+
+emptyUnionTypeError :: TBinding (EmptyUnionTypeError -> String)
+emptyUnionTypeError = define "emptyUnionTypeError" $
+  doc "Show an empty union type error as a string" $
+  "e" ~> string "union type with no alternatives (use TypeVoid instead)"
+
+invalidForallParameterNameError :: TBinding (InvalidForallParameterNameError -> String)
+invalidForallParameterNameError = define "invalidForallParameterNameError" $
+  doc "Show an invalid forall parameter name error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "invalid forall parameter name: ",
+    Core.unName $ project _InvalidForallParameterNameError _InvalidForallParameterNameError_name @@ var "e"]
+
+invalidTypeSchemeVariableNameError :: TBinding (InvalidTypeSchemeVariableNameError -> String)
+invalidTypeSchemeVariableNameError = define "invalidTypeSchemeVariableNameError" $
+  doc "Show an invalid type scheme variable name error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "invalid type scheme variable name: ",
+    Core.unName $ project _InvalidTypeSchemeVariableNameError _InvalidTypeSchemeVariableNameError_name @@ var "e"]
+
+nestedTypeAnnotationError :: TBinding (NestedTypeAnnotationError -> String)
+nestedTypeAnnotationError = define "nestedTypeAnnotationError" $
+  doc "Show a nested type annotation error as a string" $
+  "e" ~> string "nested type annotations should be merged"
+
+nonComparableMapKeyTypeError :: TBinding (NonComparableMapKeyTypeError -> String)
+nonComparableMapKeyTypeError = define "nonComparableMapKeyTypeError" $
+  doc "Show a non-comparable map key type error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "map key type contains a function type: ",
+    ShowCore.type_ @@ (project _NonComparableMapKeyTypeError _NonComparableMapKeyTypeError_keyType @@ var "e")]
+
+nonComparableSetElementTypeError :: TBinding (NonComparableSetElementTypeError -> String)
+nonComparableSetElementTypeError = define "nonComparableSetElementTypeError" $
+  doc "Show a non-comparable set element type error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "set element type contains a function type: ",
+    ShowCore.type_ @@ (project _NonComparableSetElementTypeError _NonComparableSetElementTypeError_elementType @@ var "e")]
+
+singleVariantUnionError :: TBinding (SingleVariantUnionError -> String)
+singleVariantUnionError = define "singleVariantUnionError" $
+  doc "Show a single variant union error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "union type with single variant: ",
+    Core.unName $ project _SingleVariantUnionError _SingleVariantUnionError_fieldName @@ var "e"]
+
+typeVariableShadowingInForallError :: TBinding (TypeVariableShadowingInForallError -> String)
+typeVariableShadowingInForallError = define "typeVariableShadowingInForallError" $
+  doc "Show a type variable shadowing in forall error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "type variable shadowing in forall: ",
+    Core.unName $ project _TypeVariableShadowingInForallError _TypeVariableShadowingInForallError_name @@ var "e"]
+
+undefinedTypeVariableError :: TBinding (UndefinedTypeVariableError -> String)
+undefinedTypeVariableError = define "undefinedTypeVariableError" $
+  doc "Show an undefined type variable error as a string" $
+  "e" ~> Strings.cat $ list [
+    string "undefined type variable: ",
+    Core.unName $ project _UndefinedTypeVariableError _UndefinedTypeVariableError_name @@ var "e"]
+
+voidInNonBottomPositionError :: TBinding (VoidInNonBottomPositionError -> String)
+voidInNonBottomPositionError = define "voidInNonBottomPositionError" $
+  doc "Show a void in non-bottom position error as a string" $
+  "e" ~> string "TypeVoid in a position where no value can be constructed"
+
+invalidTypeError :: TBinding (InvalidTypeError -> String)
+invalidTypeError = define "invalidTypeError" $
+  doc "Show an invalid type error as a string" $
+  "e" ~> Strings.cat2 (string "invalid type: ") $
+    cases _InvalidTypeError (var "e") Nothing [
+      _InvalidTypeError_duplicateRecordTypeFieldNames>>: duplicateRecordTypeFieldNamesError,
+      _InvalidTypeError_duplicateUnionTypeFieldNames>>: duplicateUnionTypeFieldNamesError,
+      _InvalidTypeError_emptyRecordType>>: emptyRecordTypeError,
+      _InvalidTypeError_emptyTypeAnnotation>>: emptyTypeAnnotationError,
+      _InvalidTypeError_emptyUnionType>>: emptyUnionTypeError,
+      _InvalidTypeError_invalidForallParameterName>>: invalidForallParameterNameError,
+      _InvalidTypeError_invalidTypeSchemeVariableName>>: invalidTypeSchemeVariableNameError,
+      _InvalidTypeError_nestedTypeAnnotation>>: nestedTypeAnnotationError,
+      _InvalidTypeError_nonComparableMapKeyType>>: nonComparableMapKeyTypeError,
+      _InvalidTypeError_nonComparableSetElementType>>: nonComparableSetElementTypeError,
+      _InvalidTypeError_singleVariantUnion>>: singleVariantUnionError,
+      _InvalidTypeError_typeVariableShadowingInForall>>: typeVariableShadowingInForallError,
+      _InvalidTypeError_undefinedTypeVariable>>: undefinedTypeVariableError,
+      _InvalidTypeError_voidInNonBottomPosition>>: voidInNonBottomPositionError]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Errors.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Errors.hs
@@ -0,0 +1,248 @@
+
+module Hydra.Sources.Kernel.Terms.Show.Errors where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths    as Paths
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Ast          as Ast
+import qualified Hydra.Dsl.Bootstrap         as Bootstrap
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Meta.Graph        as Graph
+import qualified Hydra.Dsl.Json.Model         as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Literals          as Literals
+import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base         as MetaBase
+import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
+import qualified Hydra.Dsl.Meta.Types        as MetaTypes
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (
+  binding, elimination, field, fields, fieldType, floatType, floatValue, function, injection, integerType,
+  integerValue, lambda, literal, literalType, term, type_, typeScheme)
+import qualified Hydra.Dsl.Prims             as Prims
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Testing      as Testing
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Tests             as Tests
+import qualified Hydra.Dsl.Topology     as Topology
+import qualified Hydra.Dsl.Types             as Types
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
+import qualified Hydra.Dsl.Meta.Variants     as Variants
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                    as I
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+import qualified Data.Maybe                  as Y
+
+import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Error.Core as ShowErrorCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Meta as ShowMeta
+import qualified Hydra.Sources.Kernel.Terms.Show.Typing as ShowTyping
+import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
+
+
+ns :: Namespace
+ns = Namespace "hydra.show.errors"
+
+module_ :: Module
+module_ = Module ns elements
+    [ShowCore.ns, ShowErrorCore.ns, ShowMeta.ns, ShowTyping.ns, Formatting.ns]
+    kernelTypesNamespaces $
+    Just "String representations of hydra.error types"
+  where
+   elements = [
+     toTermDefinition checkingError,
+     toTermDefinition decodingError,
+     toTermDefinition error_,
+     toTermDefinition incorrectUnificationError,
+     toTermDefinition notAForallTypeError,
+     toTermDefinition notAFunctionTypeError,
+     toTermDefinition otherError,
+     toTermDefinition typeArityMismatchError,
+     toTermDefinition typeMismatchError,
+     toTermDefinition unboundTypeVariablesError,
+     toTermDefinition unequalTypesError,
+     toTermDefinition unificationError,
+     toTermDefinition unsupportedTermVariantError,
+     toTermDefinition untypedLambdaError,
+     toTermDefinition untypedLetBindingError]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+checkingError :: TBinding (CheckingError -> String)
+checkingError = define "checkingError" $
+  doc "Show a checking error as a string" $
+  "ce" ~> cases _CheckingError (var "ce") Nothing [
+    _CheckingError_incorrectUnification>>: incorrectUnificationError,
+    _CheckingError_notAForallType>>: notAForallTypeError,
+    _CheckingError_notAFunctionType>>: notAFunctionTypeError,
+    _CheckingError_typeArityMismatch>>: typeArityMismatchError,
+    _CheckingError_typeMismatch>>: typeMismatchError,
+    _CheckingError_unboundTypeVariables>>: unboundTypeVariablesError,
+    _CheckingError_unequalTypes>>: unequalTypesError,
+    _CheckingError_unsupportedTermVariant>>: unsupportedTermVariantError,
+    _CheckingError_untypedLambda>>: untypedLambdaError,
+    _CheckingError_untypedLetBinding>>: untypedLetBindingError]
+
+decodingError :: TBinding (DecodingError -> String)
+decodingError = define "decodingError" $
+  doc "Show a decoding error as a string" $
+  "de" ~> Strings.cat2 (string "decoding error: ") (unwrap _DecodingError @@ var "de")
+
+error_ :: TBinding (Error -> String)
+error_ = define "error" $
+  doc "Show an error as a string" $
+  "e" ~> cases _Error (var "e") Nothing [
+    _Error_checking>>: checkingError,
+    _Error_decoding>>: decodingError,
+    _Error_duplicateBinding>>: ShowErrorCore.duplicateBindingError,
+    _Error_duplicateField>>: ShowErrorCore.duplicateFieldError,
+    _Error_other>>: otherError,
+    _Error_undefinedField>>: ShowErrorCore.undefinedFieldError,
+    _Error_undefinedTermVariable>>: ShowErrorCore.undefinedTermVariableError,
+    _Error_untypedTermVariable>>: ShowErrorCore.untypedTermVariableError,
+    _Error_unexpectedTermVariant>>: ShowErrorCore.unexpectedTermVariantError,
+    _Error_unexpectedTypeVariant>>: ShowErrorCore.unexpectedTypeVariantError,
+    _Error_unification>>: unificationError]
+
+incorrectUnificationError :: TBinding (IncorrectUnificationError -> String)
+incorrectUnificationError = define "incorrectUnificationError" $
+  doc "Show an incorrect unification error as a string" $
+  "e" ~>
+  "subst" <~ project _IncorrectUnificationError _IncorrectUnificationError_substitution @@ var "e" $
+  Strings.cat2 (string "incorrect unification: ") (ShowTyping.typeSubst @@ var "subst")
+
+notAForallTypeError :: TBinding (NotAForallTypeError -> String)
+notAForallTypeError = define "notAForallTypeError" $
+  doc "Show a not-a-forall-type error as a string" $
+  "e" ~>
+  "typ" <~ project _NotAForallTypeError _NotAForallTypeError_type @@ var "e" $
+  "args" <~ project _NotAForallTypeError _NotAForallTypeError_typeArguments @@ var "e" $
+  Strings.cat $ list [
+    string "not a forall type: ",
+    ShowCore.type_ @@ var "typ",
+    string ". Trying to apply ",
+    Literals.showInt32 (Lists.length $ var "args"),
+    string " type argument(s): ",
+    Formatting.showList @@ ShowCore.type_ @@ var "args"]
+
+notAFunctionTypeError :: TBinding (NotAFunctionTypeError -> String)
+notAFunctionTypeError = define "notAFunctionTypeError" $
+  doc "Show a not-a-function-type error as a string" $
+  "e" ~>
+  "typ" <~ project _NotAFunctionTypeError _NotAFunctionTypeError_type @@ var "e" $
+  Strings.cat2 (string "not a function type: ") (ShowCore.type_ @@ var "typ")
+
+otherError :: TBinding (OtherError -> String)
+otherError = define "otherError" $
+  doc "Show an other error as a string" $
+  "oe" ~> unwrap _OtherError @@ var "oe"
+
+typeArityMismatchError :: TBinding (TypeArityMismatchError -> String)
+typeArityMismatchError = define "typeArityMismatchError" $
+  doc "Show a type arity mismatch error as a string" $
+  "e" ~>
+  "typ" <~ project _TypeArityMismatchError _TypeArityMismatchError_type @@ var "e" $
+  "expected" <~ project _TypeArityMismatchError _TypeArityMismatchError_expectedArity @@ var "e" $
+  "actual" <~ project _TypeArityMismatchError _TypeArityMismatchError_actualArity @@ var "e" $
+  "args" <~ project _TypeArityMismatchError _TypeArityMismatchError_typeArguments @@ var "e" $
+  Strings.cat $ list [
+    string "type ",
+    ShowCore.type_ @@ var "typ",
+    string " applied to the wrong number of type arguments (expected ",
+    Literals.showInt32 (var "expected"),
+    string ", got ",
+    Literals.showInt32 (var "actual"),
+    string "): ",
+    Formatting.showList @@ ShowCore.type_ @@ var "args"]
+
+typeMismatchError :: TBinding (TypeMismatchError -> String)
+typeMismatchError = define "typeMismatchError" $
+  doc "Show a type mismatch error as a string" $
+  "e" ~>
+  "expected" <~ project _TypeMismatchError _TypeMismatchError_expectedType @@ var "e" $
+  "actual" <~ project _TypeMismatchError _TypeMismatchError_actualType @@ var "e" $
+  Strings.cat $ list [
+    string "type mismatch: expected ",
+    ShowCore.type_ @@ var "expected",
+    string " but found ",
+    ShowCore.type_ @@ var "actual"]
+
+unboundTypeVariablesError :: TBinding (UnboundTypeVariablesError -> String)
+unboundTypeVariablesError = define "unboundTypeVariablesError" $
+  doc "Show an unbound type variables error as a string" $
+  "e" ~>
+  "vars" <~ project _UnboundTypeVariablesError _UnboundTypeVariablesError_variables @@ var "e" $
+  "typ" <~ project _UnboundTypeVariablesError _UnboundTypeVariablesError_type @@ var "e" $
+  Strings.cat $ list [
+    string "unbound type variables: {",
+    Strings.intercalate (string ", ") (Lists.map (unaryFunction Core.unName) $ Sets.toList $ var "vars"),
+    string "} in type ",
+    ShowCore.type_ @@ var "typ"]
+
+unequalTypesError :: TBinding (UnequalTypesError -> String)
+unequalTypesError = define "unequalTypesError" $
+  doc "Show an unequal types error as a string" $
+  "e" ~>
+  "types" <~ project _UnequalTypesError _UnequalTypesError_types @@ var "e" $
+  "desc" <~ project _UnequalTypesError _UnequalTypesError_description @@ var "e" $
+  Strings.cat $ list [
+    string "unequal types ",
+    Formatting.showList @@ ShowCore.type_ @@ var "types",
+    string " in ",
+    var "desc"]
+
+unificationError :: TBinding (UnificationError -> String)
+unificationError = define "unificationError" $
+  doc "Show a unification error as a string" $
+  "e" ~>
+  "lt" <~ project _UnificationError _UnificationError_leftType @@ var "e" $
+  "rt" <~ project _UnificationError _UnificationError_rightType @@ var "e" $
+  "msg" <~ project _UnificationError _UnificationError_message @@ var "e" $
+  Strings.cat $ list [
+    string "unification error: cannot unify ",
+    ShowCore.type_ @@ var "lt",
+    string " with ",
+    ShowCore.type_ @@ var "rt",
+    string ": ",
+    var "msg"]
+
+unsupportedTermVariantError :: TBinding (UnsupportedTermVariantError -> String)
+unsupportedTermVariantError = define "unsupportedTermVariantError" $
+  doc "Show an unsupported term variant error as a string" $
+  "e" ~>
+  Strings.cat2
+    (string "unsupported term variant: ")
+    (ShowMeta.termVariant @@ (project _UnsupportedTermVariantError _UnsupportedTermVariantError_termVariant @@ var "e"))
+
+untypedLambdaError :: TBinding (UntypedLambdaError -> String)
+untypedLambdaError = define "untypedLambdaError" $
+  doc "Show an untyped lambda error as a string" $
+  constant $ string "untyped lambda"
+
+untypedLetBindingError :: TBinding (UntypedLetBindingError -> String)
+untypedLetBindingError = define "untypedLetBindingError" $
+  doc "Show an untyped let binding error as a string" $
+  "e" ~>
+  "b" <~ project _UntypedLetBindingError _UntypedLetBindingError_binding @@ var "e" $
+  Strings.cat2 (string "untyped let binding: ") (ShowCore.binding @@ var "b")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Graph.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Graph.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Graph.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Graph.hs
@@ -3,21 +3,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -32,18 +29,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -66,16 +63,15 @@
     Just "String representations of hydra.graph types"
   where
    elements = [
-     toBinding graph]
+     toTermDefinition graph]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
-graph :: TBinding (Graph -> String)
+graph :: TBinding ([Binding] -> String)
 graph = define "graph" $
-  doc "Show a graph as a string" $
-  lambda "graph" $ lets [
-    "elements">: Graph.graphElements $ var "graph",
+  doc "Show a list of bindings as a string" $
+  lambda "elements" $ lets [
     "elementStrs">: Lists.map ShowCore.binding (var "elements")] $
     Strings.cat $ list [
       string "{",
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Meta.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Meta.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Meta.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Meta.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (termVariant, typeVariant)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +30,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -65,8 +62,8 @@
     Just "String representations of hydra.meta types"
   where
    elements = [
-     toBinding termVariant,
-     toBinding typeVariant]
+     toTermDefinition termVariant,
+     toTermDefinition typeVariant]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -113,4 +110,5 @@
     _TypeVariant_union>>: constant $ string "union",
     _TypeVariant_unit>>: constant $ string "unit",
     _TypeVariant_variable>>: constant $ string "variable",
+    _TypeVariant_void>>: constant $ string "void",
     _TypeVariant_wrap>>: constant $ string "wrap"]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Paths.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Paths.hs
@@ -0,0 +1,177 @@
+module Hydra.Sources.Kernel.Terms.Show.Paths where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths       as Paths
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Ast          as Ast
+import qualified Hydra.Dsl.Bootstrap         as Bootstrap
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Meta.Graph        as Graph
+import qualified Hydra.Dsl.Json.Model         as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Literals          as Literals
+import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base         as MetaBase
+import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
+import qualified Hydra.Dsl.Meta.Types        as MetaTypes
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms
+import qualified Hydra.Dsl.Prims             as Prims
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Testing      as Testing
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Tests             as Tests
+import qualified Hydra.Dsl.Topology     as Topology
+import qualified Hydra.Dsl.Types             as Types
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
+import qualified Hydra.Dsl.Meta.Variants     as Variants
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                    as I
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+import qualified Data.Maybe                  as Y
+
+import qualified Hydra.Sources.Kernel.Terms.Names as Names
+import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
+
+
+ns :: Namespace
+ns = Namespace "hydra.show.paths"
+
+module_ :: Module
+module_ = Module ns elements
+    [Names.ns, Rewriting.ns]
+    kernelTypesNamespaces $
+    Just ("Utilities for working with subterm steps and paths.")
+  where
+   elements = [
+     toTermDefinition subtermStep,
+     toTermDefinition termToSubtermGraph]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+subtermStep :: TBinding (SubtermStep -> Maybe String)
+subtermStep = define "subtermStep" $
+  doc "Convert a subterm step to a string representation" $
+  "step" ~>
+  "idx" <~ ("i" ~> nothing) $  -- TODO: restore index functionality
+  "idxSuff" <~ ("suffix" ~> "i" ~>
+    Maybes.map ("s" ~> Strings.cat2 (var "s") (var "suffix")) (var "idx" @@ var "i")) $
+  cases _SubtermStep (var "step")
+    Nothing [
+    _SubtermStep_annotatedBody>>: constant nothing,
+    _SubtermStep_applicationFunction>>: constant (just (string "fun")),
+    _SubtermStep_applicationArgument>>: constant (just (string "arg")),
+    _SubtermStep_lambdaBody>>: constant (just (string "body")),
+    _SubtermStep_unionCasesDefault>>: constant (just (string "default")),
+    _SubtermStep_unionCasesBranch>>: "name" ~> just (Strings.cat2 (string ".") (Core.unName (var "name"))),
+    _SubtermStep_letBody>>: constant (just (string "in")),
+    _SubtermStep_letBinding>>: "name" ~> just (Strings.cat2 (Core.unName (var "name")) (string "=")),
+    _SubtermStep_listElement>>: "i" ~> var "idx" @@ var "i",
+    _SubtermStep_mapKey>>: "i" ~> var "idxSuff" @@ (string ".key") @@ var "i",
+    _SubtermStep_mapValue>>: "i" ~> var "idxSuff" @@ (string ".value") @@ var "i",
+    _SubtermStep_maybeTerm>>: constant (just (string "just")),
+    _SubtermStep_productTerm>>: "i" ~> var "idx" @@ var "i",
+    _SubtermStep_recordField>>: "name" ~> just (Strings.cat2 (string ".") (Core.unName (var "name"))),
+    _SubtermStep_setElement>>: "i" ~> var "idx" @@ var "i",
+    _SubtermStep_sumTerm>>: constant nothing,
+    _SubtermStep_typeLambdaBody>>: constant nothing,
+    _SubtermStep_typeApplicationTerm>>: constant nothing,
+    _SubtermStep_injectionTerm>>: constant nothing,
+    _SubtermStep_wrappedTerm>>: constant nothing]
+
+termToSubtermGraph :: TBinding (M.Map Namespace String -> Term -> SubtermGraph)
+termToSubtermGraph = define "termToSubtermGraph" $
+  doc "Build a subterm graph from a term" $
+  lambda "namespaces" $ lambda "term" $ lets [
+    "dontCareStep">: Paths.subtermStepAnnotatedBody,
+    "helper">: lambdas ["ids", "mroot", "path", "state", "stepTerm"] $ lets [
+      "step">: Pairs.first $ var "stepTerm",
+      "currentTerm">: Pairs.second $ var "stepTerm",
+      "nodesEdges">: Pairs.first $ var "state",
+      "visited">: Pairs.second $ var "state",
+      "nodes">: Pairs.first $ var "nodesEdges",
+      "edges">: Pairs.second $ var "nodesEdges",
+      "nextPath">: Lists.cons (var "step") (var "path")]
+      $ match _Term (Just $
+          Lists.foldl
+            (var "helper" @@ var "ids" @@ var "mroot" @@ var "nextPath")
+            (var "state")
+            (Rewriting.subtermsWithSteps @@ var "currentTerm")) [
+        _Term_let>>: lambda "letExpr" $ lets [
+          "bindings">: Core.letBindings $ var "letExpr",
+          "env">: Core.letBody $ var "letExpr",
+          "bindingNames">: Lists.map (unaryFunction Core.bindingName) (var "bindings"),
+          -- First fold: build nodes and update ids for each binding name
+          "addBindingName">: lambdas ["nodesVisitedIds", "name"] $ lets [
+            "currentNodesVisited">: Pairs.first $ var "nodesVisitedIds",
+            "currentIds">: Pairs.second $ var "nodesVisitedIds",
+            "currentNodes">: Pairs.first $ var "currentNodesVisited",
+            "currentVisited">: Pairs.second $ var "currentNodesVisited",
+            "rawLabel">: Names.compactName @@ var "namespaces" @@ var "name",
+            "uniqueLabel">: Names.uniqueLabel @@ var "currentVisited" @@ var "rawLabel",
+            "node">: Paths.subtermNode (var "name") (var "rawLabel") (var "uniqueLabel"),
+            "newVisited">: Sets.insert (var "uniqueLabel") (var "currentVisited"),
+            "newNodes">: Lists.cons (var "node") (var "currentNodes"),
+            "newIds">: Maps.insert (var "name") (var "node") (var "currentIds")]
+            $ pair (pair (var "newNodes") (var "newVisited")) (var "newIds"),
+          "nodesVisitedIds1">: Lists.foldl
+            (var "addBindingName")
+            (pair (pair (list ([] :: [TTerm SubtermNode])) (var "visited")) (var "ids"))
+            (var "bindingNames"),
+          "nodes1">: Pairs.first $ Pairs.first $ var "nodesVisitedIds1",
+          "visited1">: Pairs.second $ Pairs.first $ var "nodesVisitedIds1",
+          "ids1">: Pairs.second $ var "nodesVisitedIds1",
+          -- Second fold: process each binding term
+          "addBindingTerm">: lambdas ["currentState", "nodeBinding"] $ lets [
+            "root">: Pairs.first $ var "nodeBinding",
+            "binding">: Pairs.second $ var "nodeBinding",
+            "term1">: Core.bindingTerm $ var "binding"]
+            $ var "helper" @@ var "ids1" @@ just (var "root") @@ list ([] :: [TTerm SubtermStep]) @@ var "currentState" @@
+              pair (var "dontCareStep") (var "term1"),
+          "nodeBindingPairs">: Lists.zip (var "nodes1") (var "bindings"),
+          "stateAfterBindings">: Lists.foldl
+            (var "addBindingTerm")
+            (pair (pair (Lists.concat2 (var "nodes1") (var "nodes")) (var "edges")) (var "visited1"))
+            (var "nodeBindingPairs")]
+          $ var "helper" @@ var "ids1" @@ var "mroot" @@ var "nextPath" @@ var "stateAfterBindings" @@
+            pair Paths.subtermStepLetBody (var "env"),
+        _Term_variable>>: lambda "name" $
+          Maybes.maybe (var "state")
+            (lambda "root" $
+              Maybes.maybe (var "state")
+                (lambda "node" $ lets [
+                  "edge">: Paths.subtermEdge (var "root")
+                    (Paths.subtermPath $ Lists.reverse $ var "nextPath") (var "node"),
+                  "newEdges">: Lists.cons (var "edge") (var "edges")]
+                  $ pair (pair (var "nodes") (var "newEdges")) (var "visited"))
+                (Maps.lookup (var "name") (var "ids")))
+            (var "mroot")]
+      @@ var "currentTerm",
+    "initialState">: pair (pair (list ([] :: [TTerm SubtermNode])) (list ([] :: [TTerm SubtermEdge]))) Sets.empty,
+    "result">: var "helper" @@ Maps.empty @@ nothing @@ list ([] :: [TTerm SubtermStep]) @@ var "initialState" @@
+      pair (var "dontCareStep") (var "term"),
+    "finalNodesEdges">: Pairs.first $ var "result",
+    "finalNodes">: Pairs.first $ var "finalNodesEdges",
+    "finalEdges">: Pairs.second $ var "finalNodesEdges"] $
+    Paths.subtermGraph (var "finalNodes") (var "finalEdges")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Typing.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Typing.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Typing.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Typing.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +30,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -67,8 +64,8 @@
     Just "String representations of hydra.typing types"
   where
    elements = [
-     toBinding typeConstraint,
-     toBinding typeSubst]
+     toTermDefinition typeConstraint,
+     toTermDefinition typeSubst]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Util.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Util.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Util.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Show/Util.hs
@@ -4,21 +4,18 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +30,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -65,7 +62,7 @@
     Just "String representations of hydra.util types"
   where
    elements = [
-     toBinding caseConvention]
+     toTermDefinition caseConvention]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Sorting.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Sorting.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Sorting.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Sorting.hs
@@ -3,24 +3,22 @@
 
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (
-  adjacencyListToMap, createOrderingIsomorphism, findReachableNodes, propagateTags, topologicalSort,
-  topologicalSortComponents, topologicalSortNodes)
+  adjacencyListToMap, adjacencyListsToGraph, createOrderingIsomorphism, findReachableNodes,
+  initialState, popStackUntil, propagateTags, strongConnect, stronglyConnectedComponents,
+  topologicalSort, topologicalSortComponents, topologicalSortNodes)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -35,18 +33,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -56,7 +54,7 @@
 import qualified Data.Set                    as S
 import qualified Data.Maybe                  as Y
 
-import qualified Hydra.Sources.Kernel.Terms.Tarjan as Tarjan
+import qualified Hydra.Sources.Kernel.Terms.Constants as Constants
 
 import qualified Hydra.Topology as Topo
 
@@ -66,22 +64,62 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Tarjan.ns]
+    [Constants.ns]
     kernelTypesNamespaces $
-    Just ("Utilities for sorting.")
+    Just ("Utilities for sorting."
+      <> " This module includes an implementation of Tarjan's algorithm,"
+      <> " originally based on GraphSCC by Iavor S. Diatchki:"
+      <> " https://hackage.haskell.org/package/GraphSCC.")
   where
    elements = [
-     toBinding adjacencyListToMap,
-     toBinding createOrderingIsomorphism,
-     toBinding findReachableNodes,
-     toBinding propagateTags,
-     toBinding topologicalSort,
-     toBinding topologicalSortComponents,
-     toBinding topologicalSortNodes]
+     toTermDefinition adjacencyListToMap,
+     toTermDefinition adjacencyListsToGraph,
+     toTermDefinition createOrderingIsomorphism,
+     toTermDefinition findReachableNodes,
+     toTermDefinition initialState,
+     toTermDefinition popStackUntil,
+     toTermDefinition propagateTags,
+     toTermDefinition strongConnect,
+     toTermDefinition stronglyConnectedComponents,
+     toTermDefinition topologicalSort,
+     toTermDefinition topologicalSortComponents,
+     toTermDefinition topologicalSortNodes]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
+adjacencyListsToGraph :: TBinding ([(key, [key])] -> (Topo.Graph, Topo.Vertex -> key))
+adjacencyListsToGraph = define "adjacencyListsToGraph" $
+  doc ("Given a list of adjacency lists represented as (key, [key]) pairs,"
+    <> " construct a graph along with a function mapping each vertex (an Int)"
+    <> " back to its original key.") $
+  "edges0" ~>
+  "sortedEdges" <~ Lists.sortOn (unaryFunction Pairs.first) (var "edges0") $
+  "indexedEdges" <~ Lists.zip (Math.range (int32 0) (Lists.length (var "sortedEdges"))) (var "sortedEdges") $
+  "keyToVertex" <~ Maps.fromList (Lists.map
+    ("vkNeighbors" ~>
+      "v" <~ Pairs.first (var "vkNeighbors") $
+      "kNeighbors" <~ Pairs.second (var "vkNeighbors") $
+      "k" <~ Pairs.first (var "kNeighbors") $
+      pair (var "k") (var "v"))
+    (var "indexedEdges")) $
+  "vertexMap" <~ Maps.fromList (Lists.map
+    ("vkNeighbors" ~>
+      "v" <~ Pairs.first (var "vkNeighbors") $
+      "kNeighbors" <~ Pairs.second (var "vkNeighbors") $
+      "k" <~ Pairs.first (var "kNeighbors") $
+      pair (var "v") (var "k"))
+    (var "indexedEdges")) $
+  "graph" <~ Maps.fromList (Lists.map
+    ("vkNeighbors" ~>
+      "v" <~ Pairs.first (var "vkNeighbors") $
+      "kNeighbors" <~ Pairs.second (var "vkNeighbors") $
+      "neighbors" <~ Pairs.second (var "kNeighbors") $
+      pair (var "v") (Maybes.mapMaybe ("k" ~> Maps.lookup (var "k") (var "keyToVertex")) (var "neighbors")))
+    (var "indexedEdges")) $
+  "vertexToKey" <~ ("v" ~> Maybes.fromJust (Maps.lookup (var "v") (var "vertexMap"))) $
+  pair (var "graph") (var "vertexToKey")
+
 adjacencyListToMap :: TBinding ([(a, [b])] -> M.Map a [b])
 adjacencyListToMap = define "adjacencyListToMap" $
   doc "Convert an adjacency list to a map, concatenating values for duplicate keys" $
@@ -106,7 +144,6 @@
     Maybes.cat $ Lists.map ("n" ~> Maps.lookup (var "n") (var "mp")) (var "sourceOrd")) $
   Topology.orderingIsomorphism (var "sourceToTargetMapping") (var "targetToSourceMapping")
 
--- Note: not a sorting function
 findReachableNodes :: TBinding ((a -> S.Set a) -> a -> S.Set a)
 findReachableNodes = define "findReachableNodes" $
   doc "Given an adjacency function and a distinguished root node, find all reachable nodes (including the root node)" $
@@ -121,6 +158,26 @@
         (Sets.toList $ var "toVisit"))) $
   var "visit" @@ Sets.singleton (var "root") @@ var "root"
 
+initialState :: TBinding Topo.TarjanState
+initialState = define "initialState" $
+  doc "Initial state for Tarjan's algorithm" $
+  Topology.tarjanState (int32 0) Maps.empty Maps.empty (list ([] :: [TTerm Topo.Vertex])) Sets.empty (list ([] :: [TTerm [Topo.Vertex]]))
+
+popStackUntil :: TBinding (Topo.Vertex -> Topo.TarjanState -> ([Topo.Vertex], Topo.TarjanState))
+popStackUntil = define "popStackUntil" $
+  doc "Pop vertices off the stack until the given vertex is reached, collecting the current strongly connected component" $
+  "v" ~> "st0" ~>
+  "go" <~ ("acc" ~> "st" ~>
+    "x" <~ Lists.head (Topology.tarjanStateStack (var "st")) $
+    "xs" <~ Lists.tail (Topology.tarjanStateStack (var "st")) $
+    "newSt" <~ Topology.tarjanStateWithStack (var "st") (var "xs") $
+    "newSt2" <~ Topology.tarjanStateWithOnStack (var "newSt") (Sets.delete (var "x") (Topology.tarjanStateOnStack (var "st"))) $
+    "acc'" <~ Lists.cons (var "x") (var "acc") $
+    Logic.ifElse (Equality.equal (var "x") (var "v"))
+      (pair (Lists.reverse (var "acc'")) (var "newSt2"))
+      (var "go" @@ var "acc'" @@ var "newSt2")) $
+  var "go" @@ list ([] :: [TTerm Topo.Vertex]) @@ var "st0"
+
 propagateTags :: TBinding ([(a, [a])] -> [(a, [t])] -> [(a, S.Set t)])
 propagateTags = define "propagateTags" $
   doc ("Given a graph as an adjacency list of edges and a list of explicit tags per node,"
@@ -146,6 +203,57 @@
       (Sets.toList $ var "reachable")) $
   Lists.map ("n" ~> pair (var "n") (var "getTagsForNode" @@ var "n")) (var "allNodes")
 
+strongConnect :: TBinding (Topo.Graph -> Topo.Vertex -> Topo.TarjanState -> Topo.TarjanState)
+strongConnect = define "strongConnect" $
+  doc "Visit a vertex and recursively explore its successors" $
+  "graph" ~> "v" ~> "st" ~>
+  "i" <~ Topology.tarjanStateCounter (var "st") $
+  "newSt" <~ Topology.tarjanState
+    (Math.add (var "i") (int32 1))
+    (Maps.insert (var "v") (var "i") (Topology.tarjanStateIndices (var "st")))
+    (Maps.insert (var "v") (var "i") (Topology.tarjanStateLowLinks (var "st")))
+    (Lists.cons (var "v") (Topology.tarjanStateStack (var "st")))
+    (Sets.insert (var "v") (Topology.tarjanStateOnStack (var "st")))
+    (Topology.tarjanStateSccs (var "st")) $
+  "neighbors" <~ Maps.findWithDefault (list ([] :: [TTerm Topo.Vertex])) (var "v") (var "graph") $
+  "processNeighbor" <~ ("st_" ~> "w" ~>
+    "lowLink" <~ ("s" ~>
+      "lowV1" <~ Maps.findWithDefault Constants.maxInt32 (var "v") (Topology.tarjanStateLowLinks (var "s")) $
+      "idx_w" <~ Maps.findWithDefault Constants.maxInt32 (var "w") (Topology.tarjanStateIndices (var "s")) $
+      Topology.tarjanStateWithLowLinks (var "s")
+        (Maps.insert (var "v") (Equality.min (var "lowV1") (var "idx_w")) (Topology.tarjanStateLowLinks (var "s")))) $
+    Logic.ifElse (Logic.not (Maps.member (var "w") (Topology.tarjanStateIndices (var "st_"))))
+      ("stAfter" <~ strongConnect @@ var "graph" @@ var "w" @@ var "st_" $
+       "lowV2" <~ Maps.findWithDefault Constants.maxInt32 (var "v") (Topology.tarjanStateLowLinks (var "stAfter")) $
+       "low_w" <~ Maps.findWithDefault Constants.maxInt32 (var "w") (Topology.tarjanStateLowLinks (var "stAfter")) $
+       Topology.tarjanStateWithLowLinks (var "stAfter")
+         (Maps.insert (var "v") (Equality.min (var "lowV2") (var "low_w")) (Topology.tarjanStateLowLinks (var "stAfter"))))
+      (Logic.ifElse (Sets.member (var "w") (Topology.tarjanStateOnStack (var "st_")))
+        (var "lowLink" @@ var "st_")
+        (var "st_"))) $
+  "stAfterNeighbors" <~ Lists.foldl (var "processNeighbor") (var "newSt") (var "neighbors") $
+  "low_v" <~ Maps.findWithDefault Constants.maxInt32 (var "v") (Topology.tarjanStateLowLinks (var "stAfterNeighbors")) $
+  "idx_v" <~ Maps.findWithDefault Constants.maxInt32 (var "v") (Topology.tarjanStateIndices (var "stAfterNeighbors")) $
+  Logic.ifElse (Equality.equal (var "low_v") (var "idx_v"))
+    ("compResult" <~ popStackUntil @@ var "v" @@ var "stAfterNeighbors" $
+     "comp" <~ Pairs.first (var "compResult") $
+     "stPopped" <~ Pairs.second (var "compResult") $
+     Topology.tarjanStateWithSccs (var "stPopped") (Lists.cons (var "comp") (Topology.tarjanStateSccs (var "stPopped"))))
+    (var "stAfterNeighbors")
+
+stronglyConnectedComponents :: TBinding (Topo.Graph -> [[Topo.Vertex]])
+stronglyConnectedComponents = define "stronglyConnectedComponents" $
+  doc "Compute the strongly connected components of the given graph. The components are returned in reverse topological order" $
+  "graph" ~>
+  "verts" <~ Maps.keys (var "graph") $
+  "finalState" <~ Lists.foldl
+    ("st" ~> "v" ~> Logic.ifElse (Maps.member (var "v") (Topology.tarjanStateIndices (var "st")))
+      (var "st")
+      (strongConnect @@ var "graph" @@ var "v" @@ var "st"))
+    (asTerm initialState)
+    (var "verts") $
+  Lists.reverse (Lists.map (unaryFunction Lists.sort) (Topology.tarjanStateSccs (var "finalState")))
+
 topologicalSort :: TBinding ([(a, [a])] -> Either [[a]] [a])
 topologicalSort = define "topologicalSort" $
   doc ("Sort a directed acyclic graph (DAG) based on an adjacency list."
@@ -163,10 +271,10 @@
   doc ("Find the strongly connected components (including cycles and isolated vertices) of a graph,"
     <> " in (reverse) topological order, i.e. dependencies before dependents") $
   "pairs" ~>
-  "graphResult" <~ Tarjan.adjacencyListsToGraph @@ var "pairs" $
+  "graphResult" <~ adjacencyListsToGraph @@ var "pairs" $
   "g" <~ Pairs.first (var "graphResult") $
   Lists.map ("comp" ~> Lists.map (Pairs.second $ var "graphResult") (var "comp")) $
-    Tarjan.stronglyConnectedComponents @@ var "g"
+    stronglyConnectedComponents @@ var "g"
 
 topologicalSortNodes :: TBinding ((x -> a) -> (x -> [a]) -> [x] -> [[x]])
 topologicalSortNodes = define "topologicalSortNodes" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Substitution.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Substitution.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Substitution.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Substitution.hs
@@ -7,21 +7,18 @@
   substituteInConstraint, substituteInConstraints, substInClassConstraints, substInContext, substituteInTerm,
   substInType, substInTypeNonEmpty, substInTypeScheme, substTypesInTerm)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -36,18 +33,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -70,21 +67,21 @@
     Just ("Variable substitution in type and term expressions.")
   where
    elements = [
-     toBinding composeTypeSubst,
-     toBinding composeTypeSubstNonEmpty,
-     toBinding composeTypeSubstList,
-     toBinding idTypeSubst,
-     toBinding singletonTypeSubst,
-     toBinding substituteInBinding,
-     toBinding substituteInConstraint,
-     toBinding substituteInConstraints,
-     toBinding substInClassConstraints,
-     toBinding substInContext,
-     toBinding substituteInTerm,
-     toBinding substInType,
-     toBinding substInTypeNonEmpty,
-     toBinding substInTypeScheme,
-     toBinding substTypesInTerm]
+     toTermDefinition composeTypeSubst,
+     toTermDefinition composeTypeSubstNonEmpty,
+     toTermDefinition composeTypeSubstList,
+     toTermDefinition idTypeSubst,
+     toTermDefinition singletonTypeSubst,
+     toTermDefinition substituteInBinding,
+     toTermDefinition substituteInConstraint,
+     toTermDefinition substituteInConstraints,
+     toTermDefinition substInClassConstraints,
+     toTermDefinition substInContext,
+     toTermDefinition substituteInTerm,
+     toTermDefinition substInType,
+     toTermDefinition substInTypeNonEmpty,
+     toTermDefinition substInTypeScheme,
+     toTermDefinition substTypesInTerm]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -182,18 +179,14 @@
     Maps.empty
     (Maps.toList $ var "constraints")
 
-substInContext :: TBinding (TypeSubst -> InferenceContext -> InferenceContext)
+substInContext :: TBinding (TypeSubst -> Graph -> Graph)
 substInContext = define "substInContext" $
-  doc "Apply a type substitution to an inference context" $
+  doc "Apply a type substitution to a graph's bound types and class constraints" $
   lambdas ["subst", "cx"] $
-    "newDataTypes" <~ Maps.map (substInTypeScheme @@ var "subst") (Typing.inferenceContextDataTypes $ var "cx") $
-    "newClassConstraints" <~ substInClassConstraints @@ var "subst" @@ (Typing.inferenceContextClassConstraints $ var "cx") $
-    Typing.inferenceContext
-      (Typing.inferenceContextSchemaTypes $ var "cx")
-      (Typing.inferenceContextPrimitiveTypes $ var "cx")
-      (var "newDataTypes")
-      (var "newClassConstraints")
-      (Typing.inferenceContextDebug $ var "cx")
+    "newBoundTypes" <~ Maps.map (substInTypeScheme @@ var "subst") (Graph.graphBoundTypes $ var "cx") $
+    "newClassConstraints" <~ substInClassConstraints @@ var "subst" @@ (Graph.graphClassConstraints $ var "cx") $
+    "cx2" <~ Graph.graphWithBoundTypes (var "cx") (var "newBoundTypes") $
+    Graph.graphWithClassConstraints (var "cx2") (var "newClassConstraints")
 
 substituteInTerm :: TBinding (TermSubst -> Term -> Term)
 substituteInTerm = define "substituteInTerm" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Tarjan.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Tarjan.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Tarjan.hs
+++ /dev/null
@@ -1,198 +0,0 @@
-
-module Hydra.Sources.Kernel.Terms.Tarjan where
-
--- Standard imports for kernel terms modules
-import Hydra.Kernel
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
-import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
-import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
-import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
-import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
-import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
-import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
-import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
-import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
-import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
-import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
-import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
-import qualified Hydra.Dsl.Meta.Lib.Math     as Math
-import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
-import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
-import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
-import           Hydra.Dsl.Meta.Lib.Strings  as Strings
-import qualified Hydra.Dsl.Literals          as Literals
-import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
-import qualified Hydra.Dsl.Meta.Base         as MetaBase
-import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
-import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
-import           Hydra.Dsl.Meta.Phantoms     as Phantoms
-import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
-import qualified Hydra.Dsl.Meta.Testing      as Testing
-import qualified Hydra.Dsl.Terms             as Terms
-import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
-import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
-import qualified Hydra.Dsl.Meta.Variants     as Variants
-import           Hydra.Sources.Kernel.Types.All
-import           Prelude hiding ((++))
-import qualified Data.Int                    as I
-import qualified Data.List                   as L
-import qualified Data.Map                    as M
-import qualified Data.Set                    as S
-import qualified Data.Maybe                  as Y
-
-import qualified Hydra.Sources.Kernel.Terms.Constants as Constants
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
-
-import qualified Hydra.Topology as Topo
-
-
-ns :: Namespace
-ns = Namespace "hydra.tarjan"
-
-module_ :: Module
-module_ = Module ns elements
-    [Constants.ns, Monads.ns]
-    kernelTypesNamespaces $
-    Just ("This implementation of Tarjan's algorithm was originally based on GraphSCC by Iavor S. Diatchki:"
-      <> " https://hackage.haskell.org/package/GraphSCC.")
-  where
-   elements = [
-     toBinding adjacencyListsToGraph,
-     toBinding stronglyConnectedComponents,
-     toBinding initialState,
-     toBinding popStackUntil,
-     toBinding strongConnect]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-adjacencyListsToGraph :: TBinding ([(key, [key])] -> (Topo.Graph, Topo.Vertex -> key))
-adjacencyListsToGraph = define "adjacencyListsToGraph" $
-  doc ("Given a list of adjacency lists represented as (key, [key]) pairs,"
-    <> " construct a graph along with a function mapping each vertex (an Int)"
-    <> " back to its original key.") $
-  "edges0" ~>
-  "sortedEdges" <~ Lists.sortOn (unaryFunction Pairs.first) (var "edges0") $
-  "indexedEdges" <~ Lists.zip (Math.range (int32 0) (Lists.length (var "sortedEdges"))) (var "sortedEdges") $
-  "keyToVertex" <~ Maps.fromList (Lists.map
-    ("vkNeighbors" ~>
-      "v" <~ Pairs.first (var "vkNeighbors") $
-      "kNeighbors" <~ Pairs.second (var "vkNeighbors") $
-      "k" <~ Pairs.first (var "kNeighbors") $
-      pair (var "k") (var "v"))
-    (var "indexedEdges")) $
-  "vertexMap" <~ Maps.fromList (Lists.map
-    ("vkNeighbors" ~>
-      "v" <~ Pairs.first (var "vkNeighbors") $
-      "kNeighbors" <~ Pairs.second (var "vkNeighbors") $
-      "k" <~ Pairs.first (var "kNeighbors") $
-      pair (var "v") (var "k"))
-    (var "indexedEdges")) $
-  "graph" <~ Maps.fromList (Lists.map
-    ("vkNeighbors" ~>
-      "v" <~ Pairs.first (var "vkNeighbors") $
-      "kNeighbors" <~ Pairs.second (var "vkNeighbors") $
-      "neighbors" <~ Pairs.second (var "kNeighbors") $
-      pair (var "v") (Maybes.mapMaybe ("k" ~> Maps.lookup (var "k") (var "keyToVertex")) (var "neighbors")))
-    (var "indexedEdges")) $
-  "vertexToKey" <~ ("v" ~> Maybes.fromJust (Maps.lookup (var "v") (var "vertexMap"))) $
-  pair (var "graph") (var "vertexToKey")
-
-initialState :: TBinding Topo.TarjanState
-initialState = define "initialState" $
-  doc "Initial state for Tarjan's algorithm" $
-  Topology.tarjanState (int32 0) Maps.empty Maps.empty (list ([] :: [TTerm Topo.Vertex])) Sets.empty (list ([] :: [TTerm [Topo.Vertex]]))
-
-popStackUntil :: TBinding (Topo.Vertex -> Flow Topo.TarjanState [Topo.Vertex])
-popStackUntil = define "popStackUntil" $
-  doc "Pop vertices off the stack until the given vertex is reached, collecting the current strongly connected component" $
-  "v" ~>
-  "go" <~ ("acc" ~>
-    "succeed" <~ ("st" ~>
-      "x" <~ Lists.head (Topology.tarjanStateStack (var "st")) $
-      "xs" <~ Lists.tail (Topology.tarjanStateStack (var "st")) $
-      "newSt" <~ Topology.tarjanStateWithStack (var "st") (var "xs") $
-      "newSt2" <~ Topology.tarjanStateWithOnStack (var "newSt") (Sets.delete (var "x") (Topology.tarjanStateOnStack (var "st"))) $
-      "acc'" <~ Lists.cons (var "x") (var "acc") $
-      exec (Monads.putState @@ var "newSt2") $
-      Logic.ifElse (Equality.equal (var "x") (var "v"))
-        (produce (Lists.reverse (var "acc'")))
-        (var "go" @@ var "acc'")) $
-    "st" <<~ Monads.getState $
-    Logic.ifElse (Lists.null (Topology.tarjanStateStack (var "st")))
-      (Flows.fail (string "popStackUntil: empty stack"))
-      (var "succeed" @@ var "st")) $
-  var "go" @@ list ([] :: [TTerm Topo.Vertex])
-
-strongConnect :: TBinding (Topo.Graph -> Topo.Vertex -> Flow Topo.TarjanState ())
-strongConnect = define "strongConnect" $
-  doc "Visit a vertex and recursively explore its successors" $
-  "graph" ~> "v" ~>
-  "st" <<~ Monads.getState $
-  "i" <~ Topology.tarjanStateCounter (var "st") $
-  "newSt" <~ Topology.tarjanState
-    (Math.add (var "i") (int32 1))
-    (Maps.insert (var "v") (var "i") (Topology.tarjanStateIndices (var "st")))
-    (Maps.insert (var "v") (var "i") (Topology.tarjanStateLowLinks (var "st")))
-    (Lists.cons (var "v") (Topology.tarjanStateStack (var "st")))
-    (Sets.insert (var "v") (Topology.tarjanStateOnStack (var "st")))
-    (Topology.tarjanStateSccs (var "st")) $
-  "neighbors" <~ Maps.findWithDefault (list ([] :: [TTerm Topo.Vertex])) (var "v") (var "graph") $
-  "processNeighbor" <~ ("w" ~>
-    "lowLink" <~ ("st'" ~>
-      "low_v" <~ Maps.findWithDefault Constants.maxInt32 (var "v") (Topology.tarjanStateLowLinks (var "st'")) $
-      "idx_w" <~ Maps.findWithDefault Constants.maxInt32 (var "w") (Topology.tarjanStateIndices (var "st'")) $
-      exec (Monads.modify @@ ("s" ~> Topology.tarjanStateWithLowLinks (var "s")
-        (Maps.insert (var "v") (Equality.min (var "low_v") (var "idx_w")) (Topology.tarjanStateLowLinks (var "s"))))) $
-      produce unit) $
-    "st'" <<~ Monads.getState $
-    Logic.ifElse (Logic.not (Maps.member (var "w") (Topology.tarjanStateIndices (var "st'"))))
-      (exec (strongConnect @@ var "graph" @@ var "w") $
-       "stAfter" <<~ Monads.getState $
-       "low_v" <~ Maps.findWithDefault Constants.maxInt32 (var "v") (Topology.tarjanStateLowLinks (var "stAfter")) $
-       "low_w" <~ Maps.findWithDefault Constants.maxInt32 (var "w") (Topology.tarjanStateLowLinks (var "stAfter")) $
-       exec (Monads.modify @@ ("s" ~>
-         Topology.tarjanStateWithLowLinks (var "s")
-           (Maps.insert (var "v") (Equality.min (var "low_v") (var "low_w")) (Topology.tarjanStateLowLinks (var "s"))))) $
-       produce unit)
-      (Logic.ifElse (Sets.member (var "w") (Topology.tarjanStateOnStack (var "st'")))
-        (var "lowLink" @@ var "st'")
-        (produce unit))) $
-  exec (Monads.putState @@ var "newSt") $
-  exec (Flows.mapList (var "processNeighbor") (var "neighbors")) $
-  "stFinal" <<~ Monads.getState $
-  "low_v" <~ Maps.findWithDefault Constants.maxInt32 (var "v") (Topology.tarjanStateLowLinks (var "stFinal")) $
-  "idx_v" <~ Maps.findWithDefault Constants.maxInt32 (var "v") (Topology.tarjanStateIndices (var "stFinal")) $
-  Logic.ifElse (Equality.equal (var "low_v") (var "idx_v"))
-    ("comp" <<~ popStackUntil @@ var "v" $
-     exec (Monads.modify @@ ("s" ~>
-       Topology.tarjanStateWithSccs (var "s") (Lists.cons (var "comp") (Topology.tarjanStateSccs (var "s"))))) $
-     produce unit)
-    (produce unit)
-
-stronglyConnectedComponents :: TBinding (Topo.Graph -> [[Topo.Vertex]])
-stronglyConnectedComponents = define "stronglyConnectedComponents" $
-  doc "Compute the strongly connected components of the given graph. The components are returned in reverse topological order" $
-  "graph" ~>
-  "verts" <~ Maps.keys (var "graph") $
-  "processVertex" <~ ("v" ~>
-    "visited" <<~ Flows.map ("st" ~> Maps.member (var "v") (Topology.tarjanStateIndices (var "st"))) Monads.getState $
-    Logic.ifElse (Logic.not (var "visited"))
-      (strongConnect @@ var "graph" @@ var "v")
-      (produce unit)) $
-  "finalState" <~ Monads.exec @@ (Flows.mapList (var "processVertex") (var "verts")) @@ initialState $
-  Lists.reverse (Lists.map (unaryFunction Lists.sort) (Topology.tarjanStateSccs (var "finalState")))
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Templates.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Templates.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Templates.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Templates.hs
@@ -4,21 +4,19 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (graphToSchema, instantiateTemplate)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Context      as Ctx
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +31,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -55,7 +53,7 @@
 import qualified Data.Maybe                  as Y
 
 import qualified Hydra.Sources.Decode.Core as DecodeCore
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
+import qualified Hydra.Sources.Kernel.Terms.Constants as Constants
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
 
 
@@ -64,37 +62,37 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [moduleNamespace DecodeCore.module_, Monads.ns, ShowCore.ns]
+    [Constants.ns, moduleNamespace DecodeCore.module_, ShowCore.ns]
     kernelTypesNamespaces $
     Just "A utility which instantiates a nonrecursive type with default values"
   where
    elements = [
-     toBinding graphToSchema,
-     toBinding instantiateTemplate]
+     toTermDefinition graphToSchema,
+     toTermDefinition instantiateTemplate]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
-graphToSchema :: TBinding (Graph -> Flow Graph (M.Map Name Type))
+graphToSchema :: TBinding (Context -> Graph -> [Binding] -> Either (InContext DecodingError) (M.Map Name Type))
 graphToSchema = define "graphToSchema" $
-  doc "Create a graph schema from a graph which contains nothing but encoded type definitions" $
-  "g" ~>
+  doc "Decode a list of type-encoding bindings into a map of named types" $
+  "cx" ~> "graph" ~> "els" ~>
   "toPair" <~ ("el" ~>
     "name" <~ Core.bindingName (var "el") $
-    "cx" <<~ Monads.getState $
-    Flows.bind (trace (string "graph to schema") $ Monads.eitherToFlow_ @@ Util.unDecodingError @@ (decoderFor _Type @@ var "cx" @@ (Core.bindingTerm (var "el")))) (
-      "t" ~> Flows.pure (pair (var "name") (var "t")))) $
-  Flows.bind (Flows.mapList (var "toPair") (Graph.graphElements (var "g"))) (
-    "pairs" ~> Flows.pure (Maps.fromList (var "pairs")))
+    Eithers.bind (Ctx.withContext (var "cx") (decoderFor _Type @@ var "graph" @@ (Core.bindingTerm (var "el")))) (
+      "t" ~> right (pair (var "name") (var "t")))) $
+  Eithers.bind (Eithers.mapList (var "toPair") (var "els")) (
+    "pairs" ~> right (Maps.fromList (var "pairs")))
 
-instantiateTemplate :: TBinding (Bool -> M.Map Name Type -> Type -> Flow s Term)
+instantiateTemplate :: TBinding (Context -> Bool -> M.Map Name Type -> Name -> Type -> Either (InContext Error) Term)
 instantiateTemplate = define "instantiateTemplate" $
   doc ("Given a graph schema and a nonrecursive type, instantiate it with default values."
     <> " If the minimal flag is set, the smallest possible term is produced; otherwise, exactly one subterm"
-    <> " is produced for constructors which do not otherwise require one, e.g. in lists and optionals") $
-  "minimal" ~> "schema" ~> "t" ~>
-  "inst" <~ instantiateTemplate @@ var "minimal" @@ var "schema" $
-  "noPoly" <~ Flows.fail (string "Polymorphic and function types are not currently supported") $
+    <> " is produced for constructors which do not otherwise require one, e.g. in lists and optionals."
+    <> " The name parameter provides the element name for nominal type construction.") $
+  "cx" ~> "minimal" ~> "schema" ~> "tname" ~> "t" ~>
+  "inst" <~ ("tn" ~> instantiateTemplate @@ var "cx" @@ var "minimal" @@ var "schema" @@ var "tn") $
+  "noPoly" <~ Ctx.failInContext (Error.errorOther $ Error.otherError (string "Polymorphic and function types are not currently supported")) (var "cx") $
   "forFloat" <~ ("ft" ~> cases _FloatType (var "ft")
     Nothing [
     _FloatType_bigfloat>>: constant (Core.floatValueBigfloat (bigfloat 0.0)),
@@ -120,69 +118,44 @@
     _LiteralType_string>>: constant (Core.literalString (string ""))]) $
   cases _Type (var "t")
     Nothing [
-    _Type_annotated>>: "at" ~> var "inst" @@ (Core.annotatedTypeBody (var "at")),
+    _Type_annotated>>: "at" ~> var "inst" @@ var "tname" @@ (Core.annotatedTypeBody (var "at")),
     _Type_application>>: constant (var "noPoly"),
     _Type_function>>: constant (var "noPoly"),
     _Type_forall>>: constant (var "noPoly"),
     _Type_list>>: "et" ~> Logic.ifElse (var "minimal")
-      (Flows.pure (Core.termList (list ([] :: [TTerm Term]))))
-      (Flows.bind (var "inst" @@ var "et") (
-        "e" ~> Flows.pure (Core.termList (list [var "e"])))),
-    _Type_literal>>: "lt" ~> Flows.pure (Core.termLiteral (var "forLiteral" @@ var "lt")),
+      (right (Core.termList (list ([] :: [TTerm Term]))))
+      (Eithers.bind (var "inst" @@ var "tname" @@ var "et") (
+        "e" ~> right (Core.termList (list [var "e"])))),
+    _Type_literal>>: "lt" ~> right (Core.termLiteral (var "forLiteral" @@ var "lt")),
     _Type_map>>: "mt" ~>
       "kt" <~ Core.mapTypeKeys (var "mt") $
       "vt" <~ Core.mapTypeValues (var "mt") $
       Logic.ifElse (var "minimal")
-        (Flows.pure (Core.termMap Maps.empty))
-        (Flows.bind (var "inst" @@ var "kt") (
+        (right (Core.termMap Maps.empty))
+        (Eithers.bind (var "inst" @@ var "tname" @@ var "kt") (
           "ke" ~>
-          Flows.bind (var "inst" @@ var "vt") (
-            "ve" ~> Flows.pure (Core.termMap (Maps.singleton (var "ke") (var "ve")))))),
+          Eithers.bind (var "inst" @@ var "tname" @@ var "vt") (
+            "ve" ~> right (Core.termMap (Maps.singleton (var "ke") (var "ve")))))),
     _Type_maybe>>: "ot" ~> Logic.ifElse (var "minimal")
-      (Flows.pure (Core.termMaybe nothing))
-      (Flows.bind (var "inst" @@ var "ot") (
-        "e" ~> Flows.pure (Core.termMaybe (just (var "e"))))),
+      (right (Core.termMaybe nothing))
+      (Eithers.bind (var "inst" @@ var "tname" @@ var "ot") (
+        "e" ~> right (Core.termMaybe (just (var "e"))))),
     _Type_record>>: "rt" ~>
-      "tname" <~ Core.rowTypeTypeName (var "rt") $
-      "fields" <~ Core.rowTypeFields (var "rt") $
       "toField" <~ ("ft" ~>
-        Flows.bind (var "inst" @@ (Core.fieldTypeType (var "ft"))) (
-          "e" ~> Flows.pure (Core.field (Core.fieldTypeName (var "ft")) (var "e")))) $
-      Flows.bind (Flows.mapList (var "toField") (var "fields")) (
-        "dfields" ~> Flows.pure (Core.termRecord (Core.record (var "tname") (var "dfields")))),
+        Eithers.bind (var "inst" @@ var "tname" @@ (Core.fieldTypeType (var "ft"))) (
+          "e" ~> right (Core.field (Core.fieldTypeName (var "ft")) (var "e")))) $
+      Eithers.bind (Eithers.mapList (var "toField") (var "rt")) (
+        "dfields" ~> right (Core.termRecord (Core.record (var "tname") (var "dfields")))),
     _Type_set>>: "et" ~> Logic.ifElse (var "minimal")
-      (Flows.pure (Core.termSet Sets.empty))
-      (Flows.bind (var "inst" @@ var "et") (
-        "e" ~> Flows.pure (Core.termSet (Sets.fromList (list [var "e"]))))),
-    _Type_variable>>: "tname" ~>
+      (right (Core.termSet Sets.empty))
+      (Eithers.bind (var "inst" @@ var "tname" @@ var "et") (
+        "e" ~> right (Core.termSet (Sets.fromList (list [var "e"]))))),
+    _Type_variable>>: "vname" ~>
       Maybes.maybe
-        (Flows.fail (Strings.cat2 (string "Type variable ") (Strings.cat2 (ShowCore.term @@ (Core.termVariable (var "tname"))) (string " not found in schema"))))
-        (var "inst")
-        (Maps.lookup (var "tname") (var "schema")),
+        (Ctx.failInContext (Error.errorOther $ Error.otherError (Strings.cat2 (string "Type variable ") (Strings.cat2 (ShowCore.term @@ (Core.termVariable (var "vname"))) (string " not found in schema")))) (var "cx"))
+        (var "inst" @@ var "vname")
+        (Maps.lookup (var "vname") (var "schema")),
     _Type_wrap>>: "wt" ~>
-      "tname" <~ Core.wrappedTypeTypeName (var "wt") $
-      "t'" <~ Core.wrappedTypeBody (var "wt") $
-      Flows.bind (var "inst" @@ var "t'") (
-        "e" ~> Flows.pure (Core.termWrap (Core.wrappedTerm (var "tname") (var "e"))))]
-
-{-
-
--- Example of type-to-term instantiation which creates a YAML-based template out of the OpenCypher feature model.
-
-import Hydra.Staging.Yaml.Model as Yaml
-import Hydra.Monads
-import Data.Map as M
-import Data.Maybe as Y
-
-ff = flowToIo bootstrapGraph
-
-schema <- ff $ graphToSchema $ modulesToGraph [openCypherFeaturesModule]
-
-typ <- ff $ inlineType schema $ Y.fromJust $ M.lookup _CypherFeatures schema
-term <- ff $ insantiateTemplate False schema typ
-
-encoder <- ff (coderEncode <$> yamlCoder typ)
-yaml <- ff $ encoder term
-putStrLn $ hydraYamlToString yaml
+      Eithers.bind (var "inst" @@ var "tname" @@ var "wt") (
+        "e" ~> right (Core.termWrap (Core.wrappedTerm (var "tname") (var "e"))))]
 
--}
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Unification.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Unification.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Terms/Unification.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Unification.hs
@@ -4,21 +4,19 @@
 -- Standard imports for kernel terms modules
 import Hydra.Kernel hiding (joinTypes, unifyTypeConstraints, unifyTypeLists, unifyTypes, variableOccursInType)
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Accessors    as Accessors
+import qualified Hydra.Dsl.Paths    as Paths
 import qualified Hydra.Dsl.Annotations       as Annotations
-import qualified Hydra.Dsl.Meta.Ast          as Ast
+import qualified Hydra.Dsl.Ast          as Ast
 import qualified Hydra.Dsl.Bootstrap         as Bootstrap
-import qualified Hydra.Dsl.Meta.Coders       as Coders
-import qualified Hydra.Dsl.Meta.Compute      as Compute
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Context      as Ctx
 import qualified Hydra.Dsl.Meta.Core         as Core
-import qualified Hydra.Dsl.Meta.Grammar      as Grammar
-import qualified Hydra.Dsl.Grammars          as Grammars
 import qualified Hydra.Dsl.Meta.Graph        as Graph
-import qualified Hydra.Dsl.Meta.Json         as Json
+import qualified Hydra.Dsl.Json.Model         as Json
 import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
 import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
 import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
-import qualified Hydra.Dsl.Meta.Lib.Flows    as Flows
 import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
 import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
 import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
@@ -33,18 +31,18 @@
 import qualified Hydra.Dsl.Meta.Base         as MetaBase
 import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
 import qualified Hydra.Dsl.Meta.Types        as MetaTypes
-import qualified Hydra.Dsl.Meta.Module       as Module
-import qualified Hydra.Dsl.Meta.Parsing      as Parsing
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
 import           Hydra.Dsl.Meta.Phantoms     as Phantoms
 import qualified Hydra.Dsl.Prims             as Prims
-import qualified Hydra.Dsl.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
 import qualified Hydra.Dsl.Meta.Testing      as Testing
 import qualified Hydra.Dsl.Terms             as Terms
 import qualified Hydra.Dsl.Tests             as Tests
-import qualified Hydra.Dsl.Meta.Topology     as Topology
+import qualified Hydra.Dsl.Topology     as Topology
 import qualified Hydra.Dsl.Types             as Types
-import qualified Hydra.Dsl.Meta.Typing       as Typing
-import qualified Hydra.Dsl.Meta.Util         as Util
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Errors       as Error
 import qualified Hydra.Dsl.Meta.Variants     as Variants
 import           Hydra.Sources.Kernel.Types.All
 import           Prelude hiding ((++))
@@ -69,87 +67,87 @@
     Just ("Utilities for type unification.")
   where
    elements = [
-     toBinding joinTypes,
-     toBinding unifyTypeConstraints,
-     toBinding unifyTypeLists,
-     toBinding unifyTypes,
-     toBinding variableOccursInType]
+     toTermDefinition joinTypes,
+     toTermDefinition unifyTypeConstraints,
+     toTermDefinition unifyTypeLists,
+     toTermDefinition unifyTypes,
+     toTermDefinition variableOccursInType]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
 
-joinTypes :: TBinding (Type -> Type -> String -> Flow s [TypeConstraint])
+joinTypes :: TBinding (Context -> Type -> Type -> String -> Either (InContext UnificationError) [TypeConstraint])
 joinTypes = define "joinTypes" $
   doc ("Join two types, producing a list of type constraints."
     <> "The comment is used to provide context for the constraints.") $
-  "left" ~> "right" ~> "comment" ~>
+  "cx" ~> "left" ~> "right" ~> "comment" ~>
   "sleft" <~ Rewriting.deannotateType @@ var "left" $
   "sright" <~ Rewriting.deannotateType @@ var "right" $
   "joinOne" <~ ("l" ~> "r" ~> Typing.typeConstraint (var "l") (var "r") ((string "join types; ") ++ var "comment")) $
-  "cannotUnify" <~ Flows.fail ((string "cannot unify ") ++ (ShowCore.type_ @@ var "sleft") ++ (string " with ") ++ (ShowCore.type_ @@ var "sright")) $
+  "cannotUnify" <~ Ctx.failInContext
+    (Error.unificationError (var "sleft") (var "sright")
+      ((string "cannot unify ") ++ (ShowCore.type_ @@ var "sleft") ++ (string " with ") ++ (ShowCore.type_ @@ var "sright")))
+    (var "cx") $
   "assertEqual" <~ Logic.ifElse
     (Equality.equal (var "sleft") (var "sright"))
-    (Flows.pure (list ([] :: [TTerm TypeConstraint])))
+    (right (list ([] :: [TTerm TypeConstraint])))
     (var "cannotUnify") $
   "joinList" <~ ("lefts" ~> "rights" ~> Logic.ifElse
     (Equality.equal (Lists.length (var "lefts")) (Lists.length (var "rights")))
-    (Flows.pure (Lists.zipWith (var "joinOne") (var "lefts") (var "rights")))
+    (right (Lists.zipWith (var "joinOne") (var "lefts") (var "rights")))
     (var "cannotUnify")) $
   "joinRowTypes" <~ ("left" ~> "right" ~> Logic.ifElse
-    (Logic.and
-      (Core.equalName_ (Core.rowTypeTypeName (var "left")) (Core.rowTypeTypeName (var "right")))
-      (Core.equalNameList_
-        (Lists.map (unaryFunction Core.fieldTypeName) (Core.rowTypeFields (var "left")))
-        (Lists.map (unaryFunction Core.fieldTypeName) (Core.rowTypeFields (var "right")))))
+    (Core.equalNameList_
+      (Lists.map (unaryFunction Core.fieldTypeName) (var "left"))
+      (Lists.map (unaryFunction Core.fieldTypeName) (var "right")))
     (var "joinList"
-      @@ (Lists.map (unaryFunction Core.fieldTypeType) (Core.rowTypeFields (var "left")))
-      @@ (Lists.map (unaryFunction Core.fieldTypeType) (Core.rowTypeFields (var "right"))))
+      @@ (Lists.map (unaryFunction Core.fieldTypeType) (var "left"))
+      @@ (Lists.map (unaryFunction Core.fieldTypeType) (var "right")))
     (var "cannotUnify")) $
   cases _Type (var "sleft") (Just (var "cannotUnify")) [
     _Type_application>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_application>>: "r" ~> Flows.pure (list [
+      _Type_application>>: "r" ~> right (list [
         var "joinOne" @@ (Core.applicationTypeFunction (var "l")) @@ (Core.applicationTypeFunction (var "r")),
         var "joinOne" @@ (Core.applicationTypeArgument (var "l")) @@ (Core.applicationTypeArgument (var "r"))])],
     _Type_either>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_either>>: "r" ~> Flows.pure (list [
+      _Type_either>>: "r" ~> right (list [
         var "joinOne" @@ (Core.eitherTypeLeft (var "l")) @@ (Core.eitherTypeLeft (var "r")),
         var "joinOne" @@ (Core.eitherTypeRight (var "l")) @@ (Core.eitherTypeRight (var "r"))])],
     _Type_function>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_function>>: "r" ~> Flows.pure (list [
+      _Type_function>>: "r" ~> right (list [
         var "joinOne" @@ (Core.functionTypeDomain (var "l")) @@ (Core.functionTypeDomain (var "r")),
         var "joinOne" @@ (Core.functionTypeCodomain (var "l")) @@ (Core.functionTypeCodomain (var "r"))])],
     _Type_list>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_list>>: "r" ~> Flows.pure (list [
+      _Type_list>>: "r" ~> right (list [
         var "joinOne" @@ (var "l") @@ (var "r")])],
     _Type_literal>>: constant (var "assertEqual"),
     _Type_map>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_map>>: "r" ~> Flows.pure (list [
+      _Type_map>>: "r" ~> right (list [
         var "joinOne" @@ (Core.mapTypeKeys (var "l")) @@ (Core.mapTypeKeys (var "r")),
         var "joinOne" @@ (Core.mapTypeValues (var "l")) @@ (Core.mapTypeValues (var "r"))])],
     _Type_maybe>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_maybe>>: "r" ~> Flows.pure (list [
+      _Type_maybe>>: "r" ~> right (list [
         var "joinOne" @@ (var "l") @@ (var "r")])],
     _Type_pair>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_pair>>: "r" ~> Flows.pure (list [
+      _Type_pair>>: "r" ~> right (list [
         var "joinOne" @@ (Core.pairTypeFirst (var "l")) @@ (Core.pairTypeFirst (var "r")),
         var "joinOne" @@ (Core.pairTypeSecond (var "l")) @@ (Core.pairTypeSecond (var "r"))])],
     _Type_record>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
       _Type_record>>: "r" ~> var "joinRowTypes" @@ (var "l") @@ (var "r")],
     _Type_set>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_set>>: "r" ~> Flows.pure (list [
+      _Type_set>>: "r" ~> right (list [
         var "joinOne" @@ (var "l") @@ (var "r")])],
     _Type_union>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
       _Type_union>>: "r" ~> var "joinRowTypes" @@ (var "l") @@ (var "r")],
     _Type_unit>>: constant (cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_unit>>: constant (Flows.pure (list ([] :: [TTerm TypeConstraint])))]),
+      _Type_unit>>: constant (right (list ([] :: [TTerm TypeConstraint])))]),
+    _Type_void>>: constant (cases _Type (var "sright") (Just (var "cannotUnify")) [
+      _Type_void>>: constant (right (list ([] :: [TTerm TypeConstraint])))]),
     _Type_wrap>>: "l" ~> cases _Type (var "sright") (Just (var "cannotUnify")) [
-      _Type_wrap>>: "r" ~> Logic.ifElse
-        (Core.equalName_ (Core.wrappedTypeTypeName (var "l")) (Core.wrappedTypeTypeName (var "r")))
-        (Flows.pure (list [
-          var "joinOne" @@ (Core.wrappedTypeBody (var "l")) @@ (Core.wrappedTypeBody (var "r"))]))
-        (var "cannotUnify")]]
+      _Type_wrap>>: "r" ~> right (list [
+        var "joinOne" @@ (var "l") @@ (var "r")])]]
 
-unifyTypeConstraints :: TBinding (M.Map Name TypeScheme -> [TypeConstraint] -> Flow s TypeSubst)
+unifyTypeConstraints :: TBinding (Context -> M.Map Name TypeScheme -> [TypeConstraint] -> Either (InContext UnificationError) TypeSubst)
 unifyTypeConstraints = define "unifyTypeConstraints" $
   doc (""
     <> "Robinson's algorithm, following https://www.cs.cornell.edu/courses/cs6110/2017sp/lectures/lec23.pdf\n"
@@ -158,7 +156,7 @@
     <> "  * Unify(∅) = I (the identity substitution x ↦ x)\n"
     <> "  * Unify({(x, x)} ∪ E) = Unify(E)\n"
     <> "  * Unify({(f(s1, ..., sn), f(t1, ..., tn))} ∪ E) = Unify({(s1, t1), ..., (sn, tn)} ∪ E))") $
-  "schemaTypes" ~> "constraints" ~>
+  "cx" ~> "schemaTypes" ~> "constraints" ~>
   "withConstraint" <~ ("c" ~> "rest" ~>
     "sleft" <~ Rewriting.deannotateType @@ (Typing.typeConstraintLeft (var "c")) $
     "sright" <~ Rewriting.deannotateType @@ (Typing.typeConstraintRight (var "c")) $
@@ -166,14 +164,17 @@
     "bind" <~ ("v" ~> "t" ~>
       "subst" <~ Substitution.singletonTypeSubst @@ var "v" @@ var "t" $
       "withResult" <~ ("s" ~> Substitution.composeTypeSubst @@ var "subst" @@ var "s") $
-      Flows.map (var "withResult") (unifyTypeConstraints @@ var "schemaTypes" @@ (Substitution.substituteInConstraints @@ var "subst" @@ var "rest"))) $
+      Eithers.map (var "withResult") (unifyTypeConstraints @@ var "cx" @@ var "schemaTypes" @@ (Substitution.substituteInConstraints @@ var "subst" @@ var "rest"))) $
     "tryBinding" <~ ("v" ~> "t" ~> Logic.ifElse (variableOccursInType @@ var "v" @@ var "t")
-      (Flows.fail ((string "Variable ") ++ (Core.unName (var "v")) ++ (string " appears free in type ") ++ (ShowCore.type_ @@ var "t")
-        ++ (string " (") ++ var "comment" ++ (string ")")))
+      (Ctx.failInContext
+        (Error.unificationError (var "sleft") (var "sright")
+          ((string "Variable ") ++ (Core.unName (var "v")) ++ (string " appears free in type ") ++ (ShowCore.type_ @@ var "t")
+            ++ (string " (") ++ var "comment" ++ (string ")")))
+        (var "cx"))
       (var "bind" @@ var "v" @@ var "t")) $
     "noVars" <~ (
-      "withConstraints" <~ ("constraints2" ~> unifyTypeConstraints @@ var "schemaTypes" @@ (Lists.concat2 (var "constraints2") (var "rest"))) $
-      Flows.bind (joinTypes @@ var "sleft" @@ var "sright" @@ var "comment") (var "withConstraints")) $
+      "withConstraints" <~ ("constraints2" ~> unifyTypeConstraints @@ var "cx" @@ var "schemaTypes" @@ (Lists.concat2 (var "constraints2") (var "rest"))) $
+      Eithers.bind (joinTypes @@ var "cx" @@ var "sleft" @@ var "sright" @@ var "comment") (var "withConstraints")) $
     "dflt" <~ cases _Type (var "sright")
       (Just (var "noVars")) [
       _Type_variable>>: "name" ~> var "tryBinding" @@ var "name" @@ var "sleft"] $
@@ -182,28 +183,31 @@
       _Type_variable>>: "name" ~> cases _Type (var "sright")
         (Just (var "tryBinding" @@ var "name" @@ var "sright")) [
         _Type_variable>>: "name2" ~> Logic.ifElse (Core.equalName_ (var "name") (var "name2"))
-          (unifyTypeConstraints @@ var "schemaTypes" @@ var "rest")
+          (unifyTypeConstraints @@ var "cx" @@ var "schemaTypes" @@ var "rest")
           (Logic.ifElse (Maybes.isJust (Maps.lookup (var "name") (var "schemaTypes")))
             (Logic.ifElse (Maybes.isJust (Maps.lookup (var "name2") (var "schemaTypes")))
-              (Flows.fail ((string "Attempted to unify schema names ") ++ (Core.unName (var "name")) ++ (string " and ") ++ (Core.unName (var "name2"))
-                ++ (string " (") ++ var "comment" ++ (string ")")))
+              (Ctx.failInContext
+                (Error.unificationError (var "sleft") (var "sright")
+                  ((string "Attempted to unify schema names ") ++ (Core.unName (var "name")) ++ (string " and ") ++ (Core.unName (var "name2"))
+                    ++ (string " (") ++ var "comment" ++ (string ")")))
+                (var "cx"))
               (var "bind" @@ var "name2" @@ var "sleft"))
             (var "bind" @@ var "name" @@ var "sright"))]]) $
   Logic.ifElse
     (Lists.null (var "constraints"))
-    (Flows.pure (Substitution.idTypeSubst))
+    (right (asTerm Substitution.idTypeSubst))
     (var "withConstraint" @@ (Lists.head (var "constraints")) @@ (Lists.tail (var "constraints")))
 
-unifyTypeLists :: TBinding (M.Map Name TypeScheme -> [Type] -> [Type] -> String -> Flow s TypeSubst)
+unifyTypeLists :: TBinding (Context -> M.Map Name TypeScheme -> [Type] -> [Type] -> String -> Either (InContext UnificationError) TypeSubst)
 unifyTypeLists = define "unifyTypeLists" $
-  "schemaTypes" ~> "l" ~> "r" ~> "comment" ~>
+  "cx" ~> "schemaTypes" ~> "l" ~> "r" ~> "comment" ~>
   "toConstraint" <~ ("l" ~> "r" ~> Typing.typeConstraint (var "l") (var "r") (var "comment")) $
-  unifyTypeConstraints @@ var "schemaTypes" @@ (Lists.zipWith (var "toConstraint") (var "l") (var "r"))
+  unifyTypeConstraints @@ var "cx" @@ var "schemaTypes" @@ (Lists.zipWith (var "toConstraint") (var "l") (var "r"))
 
-unifyTypes :: TBinding (M.Map Name TypeScheme -> Type -> Type -> String -> Flow s TypeSubst)
+unifyTypes :: TBinding (Context -> M.Map Name TypeScheme -> Type -> Type -> String -> Either (InContext UnificationError) TypeSubst)
 unifyTypes = define "unifyTypes" $
-  "schemaTypes" ~> "l" ~> "r" ~> "comment" ~>
-  unifyTypeConstraints @@ var "schemaTypes" @@ list [Typing.typeConstraint (var "l") (var "r") (var "comment")]
+  "cx" ~> "schemaTypes" ~> "l" ~> "r" ~> "comment" ~>
+  unifyTypeConstraints @@ var "cx" @@ var "schemaTypes" @@ list [Typing.typeConstraint (var "l") (var "r") (var "comment")]
 
 variableOccursInType :: TBinding (Name -> Type -> Bool)
 variableOccursInType = define "variableOccursInType" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Validate/Core.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Validate/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Validate/Core.hs
@@ -0,0 +1,797 @@
+
+module Hydra.Sources.Kernel.Terms.Validate.Core where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Paths    as Paths
+import qualified Hydra.Dsl.Annotations       as Annotations
+import qualified Hydra.Dsl.Ast          as Ast
+import qualified Hydra.Dsl.Bootstrap         as Bootstrap
+import qualified Hydra.Dsl.Coders       as Coders
+import qualified Hydra.Dsl.Util      as Util
+import qualified Hydra.Dsl.Meta.Core         as Core
+import qualified Hydra.Dsl.Meta.Graph        as Graph
+import qualified Hydra.Dsl.Json.Model         as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars    as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers  as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists    as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic    as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps     as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math     as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes   as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs    as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets     as Sets
+import           Hydra.Dsl.Meta.Lib.Strings  as Strings
+import qualified Hydra.Dsl.Literals          as Literals
+import qualified Hydra.Dsl.LiteralTypes      as LiteralTypes
+import qualified Hydra.Dsl.Meta.Base         as MetaBase
+import qualified Hydra.Dsl.Meta.Terms        as MetaTerms
+import qualified Hydra.Dsl.Meta.Types        as MetaTypes
+import qualified Hydra.Dsl.Module       as Module
+import qualified Hydra.Dsl.Parsing      as Parsing
+import           Hydra.Dsl.Meta.Phantoms     as Phantoms hiding (
+  binding, elimination, field, fields, fieldType, floatType, floatValue, function, injection, integerType,
+  integerValue, lambda, literal, literalType, term, type_, typeScheme)
+import qualified Hydra.Dsl.Prims             as Prims
+import qualified Hydra.Dsl.Meta.Tabular           as Tabular
+import qualified Hydra.Dsl.Meta.Testing      as Testing
+import qualified Hydra.Dsl.Terms             as Terms
+import qualified Hydra.Dsl.Tests             as Tests
+import qualified Hydra.Dsl.Topology     as Topology
+import qualified Hydra.Dsl.Types             as Types
+import qualified Hydra.Dsl.Typing       as Typing
+import qualified Hydra.Dsl.Util         as Util
+import qualified Hydra.Dsl.Meta.Variants     as Variants
+import qualified Hydra.Dsl.Errors            as Error
+import qualified Hydra.Dsl.Error.Core       as ErrorsCore
+import           Hydra.Sources.Kernel.Types.All
+import           Prelude hiding ((++))
+import qualified Data.Int                    as I
+import qualified Data.List                   as L
+import qualified Data.Map                    as M
+import qualified Data.Set                    as S
+import qualified Data.Maybe                  as Y
+
+import qualified Hydra.Sources.Kernel.Terms.Rewriting as Rewriting
+
+
+ns :: Namespace
+ns = Namespace "hydra.validate.core"
+
+module_ :: Module
+module_ = Module ns elements
+    [Rewriting.ns]
+    kernelTypesNamespaces $
+    Just "Validation functions for core terms and types"
+  where
+   elements = [
+     toTermDefinition checkDuplicateBindings,
+     toTermDefinition checkDuplicateFields,
+     toTermDefinition checkDuplicateFieldTypes,
+     toTermDefinition checkShadowing,
+     toTermDefinition checkTerm,
+     toTermDefinition validateTypeNode,
+     toTermDefinition checkUndefinedTypeVariablesInType,
+     toTermDefinition checkUndefinedTypeVariablesInTypeScheme,
+     toTermDefinition checkVoid,
+     toTermDefinition findDuplicate,
+     toTermDefinition findDuplicateFieldType,
+     toTermDefinition firstError,
+     toTermDefinition firstTypeError,
+     toTermDefinition isValidName,
+     toTermDefinition term,
+     toTermDefinition type_]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+-- | A Nothing of type Maybe InvalidTermError
+noError :: TTerm (Maybe InvalidTermError)
+noError = TTerm $ TermMaybe Nothing
+
+-- | A Just of type InvalidTermError -> Maybe InvalidTermError
+justError :: TTerm InvalidTermError -> TTerm (Maybe InvalidTermError)
+justError (TTerm t) = TTerm $ TermMaybe $ Just t
+
+-- | Helper to make a just from a TTerm
+mkJust :: TTerm InvalidTermError -> TTerm (Maybe InvalidTermError)
+mkJust = just
+
+-- | Return the first Just from a list of Maybe values, or Nothing
+firstError :: TBinding ([Maybe InvalidTermError] -> Maybe InvalidTermError)
+firstError = define "firstError" $
+  doc "Return the first error from a list of optional errors, or nothing if all are valid" $
+  "checks" ~>
+  Lists.foldl
+    ("acc" ~> "check" ~>
+      Maybes.cases (var "acc")
+        (var "check")
+        (constant $ var "acc"))
+    noError
+    (var "checks")
+
+term :: TBinding (Bool -> Graph -> Term -> Maybe InvalidTermError)
+term = define "term" $
+  doc "Validate a term, returning the first error found or nothing if valid. The 'typed' parameter indicates whether to expect System F (typed) terms; when true, type variable binding checks and UntypedTermVariableError are active." $
+  "typed" ~> "g" ~> "t" ~>
+  Rewriting.foldTermWithGraphAndPath
+    @@ ("recurse" ~> "path" ~> "cx" ~> "acc" ~> "trm" ~>
+      -- If we already found an error, short-circuit
+      Maybes.cases (var "acc")
+        -- No error yet: check the current term, then recurse into subterms
+        ("checkResult" <~ (checkTerm @@ var "typed" @@ (wrap _SubtermPath $ var "path") @@ var "cx" @@ var "trm") $
+          Maybes.cases (var "checkResult")
+            -- No error at this term: let the framework recurse into subterms
+            (var "recurse" @@ noError @@ var "trm")
+            -- Found an error: return it
+            ("err" ~> justError (var "err")))
+        -- Already have an error: propagate it
+        ("_" ~> var "acc"))
+    @@ var "g"
+    @@ noError
+    @@ var "t"
+
+-- | Check a single term node for validation errors (without recursing into subterms).
+-- The Graph provides bound variable information; the typed flag controls System F checks.
+checkTerm :: TBinding (Bool -> SubtermPath -> Graph -> Term -> Maybe InvalidTermError)
+checkTerm = define "checkTerm" $
+  doc "Check a single term node for validation errors" $
+  "typed" ~> "path" ~> "cx" ~> "term" ~>
+  cases _Term (var "term") (Just noError) [
+
+    -- T16/T20/T21: TermAnnotated — check for nested or empty annotations
+    _Term_annotated>>: "ann" ~>
+      "body" <~ Core.annotatedTermBody (var "ann") $
+      "annMap" <~ Core.annotatedTermAnnotation (var "ann") $
+      firstError @@ list [
+        -- T21. EmptyTermAnnotationError
+        Logic.ifElse (Maps.null $ var "annMap")
+          (mkJust $ inject _InvalidTermError _InvalidTermError_emptyTermAnnotation $
+            record _EmptyTermAnnotationError [
+              _EmptyTermAnnotationError_location>>: var "path"])
+          noError,
+        -- T20. NestedTermAnnotationError
+        cases _Term (var "body") (Just noError) [
+          _Term_annotated>>: constant $
+            mkJust $ inject _InvalidTermError _InvalidTermError_nestedTermAnnotation $
+              record _NestedTermAnnotationError [
+                _NestedTermAnnotationError_location>>: var "path"]]],
+
+    -- TermApplication — check for constant conditions, self-application,
+    -- identity application, redundant wrap/unwrap
+    _Term_application>>: "app" ~>
+      "fun" <~ Core.applicationFunction (var "app") $
+      "arg" <~ Core.applicationArgument (var "app") $
+      firstError @@ list [
+        -- T13. ConstantConditionError: ifElse applied to a literal boolean
+        cases _Term (var "fun") (Just noError) [
+          _Term_function>>: "f" ~>
+            cases _Function (var "f") (Just noError) [
+              _Function_primitive>>: "primName" ~>
+                Logic.ifElse (Equality.equal (Core.unName $ var "primName") (string "hydra.lib.logic.ifElse"))
+                  (cases _Term (var "arg") (Just noError) [
+                    _Term_literal>>: "lit" ~>
+                      cases _Literal (var "lit") (Just noError) [
+                        _Literal_boolean>>: "boolVal" ~>
+                          mkJust $ inject _InvalidTermError _InvalidTermError_constantCondition $
+                            record _ConstantConditionError [
+                              _ConstantConditionError_location>>: var "path",
+                              _ConstantConditionError_value>>: var "boolVal"]]])
+                  noError]],
+        -- T15. SelfApplicationError: (TermVariable x) applied to (TermVariable x)
+        cases _Term (var "fun") (Just noError) [
+          _Term_variable>>: "funName" ~>
+            cases _Term (var "arg") (Just noError) [
+              _Term_variable>>: "argName" ~>
+                Logic.ifElse (Equality.equal (var "funName") (var "argName"))
+                  (mkJust $ inject _InvalidTermError _InvalidTermError_selfApplication $
+                    record _SelfApplicationError [
+                      _SelfApplicationError_location>>: var "path",
+                      _SelfApplicationError_name>>: var "funName"])
+                  noError]],
+        -- T16. UnnecessaryIdentityApplicationError: (\x -> x) applied to arg
+        cases _Term (var "fun") (Just noError) [
+          _Term_function>>: "f" ~>
+            cases _Function (var "f") (Just noError) [
+              _Function_lambda>>: "lam" ~>
+                "param" <~ Core.lambdaParameter (var "lam") $
+                "body" <~ Core.lambdaBody (var "lam") $
+                cases _Term (var "body") (Just noError) [
+                  _Term_variable>>: "bodyVar" ~>
+                    Logic.ifElse (Equality.equal (var "param") (var "bodyVar"))
+                      (mkJust $ inject _InvalidTermError _InvalidTermError_unnecessaryIdentityApplication $
+                        record _UnnecessaryIdentityApplicationError [
+                          _UnnecessaryIdentityApplicationError_location>>: var "path"])
+                      noError]]],
+        -- T14. RedundantWrapUnwrapError: unwrap(n) applied to wrap(n, _)
+        cases _Term (var "fun") (Just noError) [
+          _Term_function>>: "f" ~>
+            cases _Function (var "f") (Just noError) [
+              _Function_elimination>>: "elim" ~>
+                cases _Elimination (var "elim") (Just noError) [
+                  _Elimination_wrap>>: "unwrapName" ~>
+                    cases _Term (var "arg") (Just noError) [
+                      _Term_wrap>>: "wt" ~>
+                        "wrapName" <~ Core.wrappedTermTypeName (var "wt") $
+                        Logic.ifElse (Equality.equal (var "unwrapName") (var "wrapName"))
+                          (mkJust $ inject _InvalidTermError _InvalidTermError_redundantWrapUnwrap $
+                            record _RedundantWrapUnwrapError [
+                              _RedundantWrapUnwrapError_location>>: var "path",
+                              _RedundantWrapUnwrapError_typeName>>: var "unwrapName"])
+                          noError]]]]],
+
+    -- T5: TermRecord — check for empty type name, duplicate fields
+    _Term_record>>: "rec" ~>
+      "tname" <~ Core.recordTypeName (var "rec") $
+      "flds" <~ Core.recordFields (var "rec") $
+      firstError @@ list [
+        -- T5. EmptyTypeNameInTermError
+        Logic.ifElse (Equality.equal (Core.unName $ var "tname") (string ""))
+          (mkJust $ inject _InvalidTermError _InvalidTermError_emptyTypeNameInTerm $
+            record _EmptyTypeNameInTermError [
+              _EmptyTypeNameInTermError_location>>: var "path"])
+          noError,
+        -- T3. DuplicateRecordFieldNamesError (via DuplicateFieldError)
+        checkDuplicateFields @@ var "path" @@ (Lists.map
+          (unaryFunction Core.fieldName)
+          (var "flds"))],
+
+    -- T1/T2/T10/T11/T18: TermLet — empty bindings, duplicates, shadowing, naming, type var checks
+    _Term_let>>: "lt" ~>
+      "bindings" <~ Core.letBindings (var "lt") $
+      "names" <~ Lists.map (unaryFunction Core.bindingName) (var "bindings") $
+      firstError @@ list [
+        -- T1. EmptyLetBindingsError
+        Logic.ifElse (Lists.null $ var "bindings")
+          (mkJust $ inject _InvalidTermError _InvalidTermError_emptyLetBindings $
+            record _EmptyLetBindingsError [
+              _EmptyLetBindingsError_location>>: var "path"])
+          noError,
+        -- T2. DuplicateLetBindingNamesError (via DuplicateBindingError)
+        checkDuplicateBindings @@ var "path" @@ var "bindings",
+        -- T11. TermVariableShadowingError — deferred for let bindings.
+        -- The fold framework extends the graph BEFORE calling checkTerm, so we cannot
+        -- reliably detect shadowing without a pre-extension graph. Needs a new rewriting
+        -- helper that passes both pre- and post-extension graphs.
+        noError,
+        -- T18. InvalidLetBindingNameError — check each binding name
+        firstError @@ (Lists.map
+          ("bname" ~> Logic.ifElse (isValidName @@ var "bname")
+            noError
+            (mkJust $ inject _InvalidTermError _InvalidTermError_invalidLetBindingName $
+              record _InvalidLetBindingNameError [
+                _InvalidLetBindingNameError_location>>: var "path",
+                _InvalidLetBindingNameError_name>>: var "bname"]))
+          (var "names")),
+        -- T10. UndefinedTypeVariableInBindingTypeError (typed mode only)
+        Logic.ifElse (var "typed")
+          (firstError @@ (Lists.map
+            ("b" ~> Maybes.cases (Core.bindingType $ var "b")
+              noError
+              ("ts" ~> checkUndefinedTypeVariablesInTypeScheme
+                @@ var "path" @@ var "cx" @@ var "ts"
+                @@ ("uvName" ~>
+                  mkJust $ inject _InvalidTermError _InvalidTermError_undefinedTypeVariableInBindingType $
+                    record _UndefinedTypeVariableInBindingTypeError [
+                      _UndefinedTypeVariableInBindingTypeError_location>>: var "path",
+                      _UndefinedTypeVariableInBindingTypeError_name>>: var "uvName"])))
+            (var "bindings")))
+          noError],
+
+    -- T5: TermUnion (injection) — check for empty type name
+    _Term_union>>: "inj" ~>
+      "tname" <~ Core.injectionTypeName (var "inj") $
+      Logic.ifElse (Equality.equal (Core.unName $ var "tname") (string ""))
+        (mkJust $ inject _InvalidTermError _InvalidTermError_emptyTypeNameInTerm $
+          record _EmptyTypeNameInTermError [
+            _EmptyTypeNameInTermError_location>>: var "path"])
+        noError,
+
+    -- T11/T22/T5: TermFunction — check for shadowing, unknown primitives, empty type names
+    _Term_function>>: "fun" ~>
+      cases _Function (var "fun") (Just noError) [
+        -- T11/T17/T8: Lambda — shadowing, naming, undefined type vars in domain
+        _Function_lambda>>: "lam" ~>
+          "paramName" <~ Core.lambdaParameter (var "lam") $
+          firstError @@ list [
+            -- T11. TermVariableShadowingError
+            -- Note: the graph has already been extended with this lambda's parameter.
+            -- We check graphBoundTerms (not modified by lambdas) to detect let-to-lambda shadowing.
+            -- Lambda-to-lambda shadowing is not detected here due to the pre-extension.
+            Logic.ifElse
+              (Maybes.isJust $ Maps.lookup (var "paramName") (Graph.graphBoundTerms $ var "cx"))
+              (mkJust $ inject _InvalidTermError _InvalidTermError_termVariableShadowing $
+                record _TermVariableShadowingError [
+                  _TermVariableShadowingError_location>>: var "path",
+                  _TermVariableShadowingError_name>>: var "paramName"])
+              noError,
+            -- T17. InvalidLambdaParameterNameError
+            Logic.ifElse (isValidName @@ var "paramName")
+              noError
+              (mkJust $ inject _InvalidTermError _InvalidTermError_invalidLambdaParameterName $
+                record _InvalidLambdaParameterNameError [
+                  _InvalidLambdaParameterNameError_location>>: var "path",
+                  _InvalidLambdaParameterNameError_name>>: var "paramName"]),
+            -- T8. UndefinedTypeVariableInLambdaDomainError (typed mode only)
+            Logic.ifElse (var "typed")
+              (Maybes.cases (Core.lambdaDomain $ var "lam")
+                noError
+                ("dom" ~> checkUndefinedTypeVariablesInType
+                  @@ var "path" @@ var "cx" @@ var "dom"
+                  @@ ("uvName" ~>
+                    mkJust $ inject _InvalidTermError _InvalidTermError_undefinedTypeVariableInLambdaDomain $
+                      record _UndefinedTypeVariableInLambdaDomainError [
+                        _UndefinedTypeVariableInLambdaDomainError_location>>: var "path",
+                        _UndefinedTypeVariableInLambdaDomainError_name>>: var "uvName"])))
+              noError],
+        -- T22. UnknownPrimitiveNameError
+        _Function_primitive>>: "primName" ~>
+          Logic.ifElse
+            (Maybes.isJust $ Maps.lookup (var "primName") (Graph.graphPrimitives $ var "cx"))
+            noError
+            (mkJust $ inject _InvalidTermError _InvalidTermError_unknownPrimitiveName $
+              record _UnknownPrimitiveNameError [
+                _UnknownPrimitiveNameError_location>>: var "path",
+                _UnknownPrimitiveNameError_name>>: var "primName"]),
+        -- Elimination checks
+        _Function_elimination>>: "elim" ~>
+          cases _Elimination (var "elim") (Just noError) [
+            -- T5: Projection — check empty type name
+            _Elimination_record>>: "proj" ~>
+              "tname" <~ Core.projectionTypeName (var "proj") $
+              Logic.ifElse (Equality.equal (Core.unName $ var "tname") (string ""))
+                (mkJust $ inject _InvalidTermError _InvalidTermError_emptyTypeNameInTerm $
+                  record _EmptyTypeNameInTermError [
+                    _EmptyTypeNameInTermError_location>>: var "path"])
+                noError,
+            -- T4/T5/T6: CaseStatement — check empty type name, empty cases, duplicate case fields
+            _Elimination_union>>: "cs" ~>
+              "tname" <~ Core.caseStatementTypeName (var "cs") $
+              "csDefault" <~ Core.caseStatementDefault (var "cs") $
+              "csCases" <~ Core.caseStatementCases (var "cs") $
+              firstError @@ list [
+                -- T5. EmptyTypeNameInTermError
+                Logic.ifElse (Equality.equal (Core.unName $ var "tname") (string ""))
+                  (mkJust $ inject _InvalidTermError _InvalidTermError_emptyTypeNameInTerm $
+                    record _EmptyTypeNameInTermError [
+                      _EmptyTypeNameInTermError_location>>: var "path"])
+                  noError,
+                -- T6. EmptyCaseStatementError
+                Logic.ifElse
+                  (Logic.and (Lists.null $ var "csCases") (Maybes.isNothing $ var "csDefault"))
+                  (mkJust $ inject _InvalidTermError _InvalidTermError_emptyCaseStatement $
+                    record _EmptyCaseStatementError [
+                      _EmptyCaseStatementError_location>>: var "path",
+                      _EmptyCaseStatementError_typeName>>: var "tname"])
+                  noError,
+                -- T4. DuplicateCaseStatementFieldNamesError (via DuplicateFieldError)
+                checkDuplicateFields @@ var "path" @@ (Lists.map
+                  (unaryFunction Core.fieldName)
+                  (var "csCases"))]]],
+
+    -- T9. UndefinedTypeVariableInTypeApplicationError (typed mode only)
+    _Term_typeApplication>>: "ta" ~>
+      Logic.ifElse (var "typed")
+        (checkUndefinedTypeVariablesInType
+          @@ var "path" @@ var "cx" @@ (Core.typeApplicationTermType $ var "ta")
+          @@ ("uvName" ~>
+            mkJust $ inject _InvalidTermError _InvalidTermError_undefinedTypeVariableInTypeApplication $
+              record _UndefinedTypeVariableInTypeApplicationError [
+                _UndefinedTypeVariableInTypeApplicationError_location>>: var "path",
+                _UndefinedTypeVariableInTypeApplicationError_name>>: var "uvName"]))
+        noError,
+
+    -- T12/T19: TypeLambda — type variable shadowing and naming
+    _Term_typeLambda>>: "tl" ~>
+      "tvName" <~ Core.typeLambdaParameter (var "tl") $
+      firstError @@ list [
+        -- T12. TypeVariableShadowingInTypeLambdaError
+        -- Note: the graph has already been extended with this type lambda's parameter.
+        Logic.ifElse
+          (Sets.member (var "tvName") (Sets.delete (var "tvName") (Graph.graphTypeVariables $ var "cx")))
+          (mkJust $ inject _InvalidTermError _InvalidTermError_typeVariableShadowingInTypeLambda $
+            record _TypeVariableShadowingInTypeLambdaError [
+              _TypeVariableShadowingInTypeLambdaError_location>>: var "path",
+              _TypeVariableShadowingInTypeLambdaError_name>>: var "tvName"])
+          noError,
+        -- T19. InvalidTypeLambdaParameterNameError
+        Logic.ifElse (isValidName @@ var "tvName")
+          noError
+          (mkJust $ inject _InvalidTermError _InvalidTermError_invalidTypeLambdaParameterName $
+            record _InvalidTypeLambdaParameterNameError [
+              _InvalidTypeLambdaParameterNameError_location>>: var "path",
+              _InvalidTypeLambdaParameterNameError_name>>: var "tvName"])],
+
+    -- T7. UndefinedTermVariableError — check boundTerms, lambdaVariables, and primitives
+    _Term_variable>>: "varName" ~>
+      Logic.ifElse
+        (Logic.or
+          (Maybes.isJust $ Maps.lookup (var "varName") (Graph.graphBoundTerms $ var "cx"))
+          (Logic.or
+            (Sets.member (var "varName") (Graph.graphLambdaVariables $ var "cx"))
+            (Maybes.isJust $ Maps.lookup (var "varName") (Graph.graphPrimitives $ var "cx"))))
+        noError
+        (mkJust $ inject _InvalidTermError _InvalidTermError_undefinedTermVariable $
+          record _UndefinedTermVariableError [
+            _UndefinedTermVariableError_location>>: var "path",
+            _UndefinedTermVariableError_name>>: var "varName"]),
+
+    -- T5: TermWrap — check for empty type name
+    _Term_wrap>>: "wt" ~>
+      "tname" <~ Core.wrappedTermTypeName (var "wt") $
+      Logic.ifElse (Equality.equal (Core.unName $ var "tname") (string ""))
+        (mkJust $ inject _InvalidTermError _InvalidTermError_emptyTypeNameInTerm $
+          record _EmptyTypeNameInTermError [
+            _EmptyTypeNameInTermError_location>>: var "path"])
+        noError]
+
+-- | Check a list of names for shadowing against the current graph scope
+checkShadowing :: TBinding (SubtermPath -> Graph -> [Name] -> Maybe InvalidTermError)
+checkShadowing = define "checkShadowing" $
+  doc "Check if any name in a list shadows a variable already in scope" $
+  "path" ~> "cx" ~> "names" ~>
+  -- Find the first name that is already bound
+  "result" <~ Lists.foldl
+    ("acc" ~> "name" ~>
+      Maybes.cases (var "acc")
+        (Logic.ifElse
+          (Logic.or
+            (Maybes.isJust $ Maps.lookup (var "name") (Graph.graphBoundTerms $ var "cx"))
+            (Sets.member (var "name") (Graph.graphLambdaVariables $ var "cx")))
+          (mkJust $ inject _InvalidTermError _InvalidTermError_termVariableShadowing $
+            record _TermVariableShadowingError [
+              _TermVariableShadowingError_location>>: var "path",
+              _TermVariableShadowingError_name>>: var "name"])
+          noError)
+        (constant $ var "acc"))
+    noError
+    (var "names") $
+  var "result"
+
+-- | Check a list of bindings for duplicate names
+checkDuplicateBindings :: TBinding (SubtermPath -> [Binding] -> Maybe InvalidTermError)
+checkDuplicateBindings = define "checkDuplicateBindings" $
+  doc "Check for duplicate binding names in a list of bindings" $
+  "path" ~> "bindings" ~>
+  "names" <~ Lists.map (unaryFunction Core.bindingName) (var "bindings") $
+  "dup" <~ findDuplicate @@ var "names" $
+  Maybes.map ("name" ~>
+    inject _InvalidTermError _InvalidTermError_duplicateBinding $
+      record _DuplicateBindingError [
+        _DuplicateBindingError_location>>: var "path",
+        _DuplicateBindingError_name>>: var "name"])
+    (var "dup")
+
+-- | Check a list of field names for duplicates
+checkDuplicateFields :: TBinding (SubtermPath -> [Name] -> Maybe InvalidTermError)
+checkDuplicateFields = define "checkDuplicateFields" $
+  doc "Check for duplicate field names in a list of fields" $
+  "path" ~> "names" ~>
+  "dup" <~ findDuplicate @@ var "names" $
+  Maybes.map ("name" ~>
+    inject _InvalidTermError _InvalidTermError_duplicateField $
+      record _DuplicateFieldError [
+        _DuplicateFieldError_location>>: var "path",
+        _DuplicateFieldError_name>>: var "name"])
+    (var "dup")
+
+-- | Find the first duplicate in a list, if any
+findDuplicate :: TBinding ([Name] -> Maybe Name)
+findDuplicate = define "findDuplicate" $
+  doc "Find the first duplicate name in a list" $
+  "names" ~>
+  -- Fold through names, tracking seen names in a set.
+  -- Accumulator is (Set Name, Maybe Name): seen set and first duplicate found.
+  "result" <~ Lists.foldl
+    ("acc" ~> "name" ~>
+      "seen" <~ Pairs.first (var "acc") $
+      "dup" <~ Pairs.second (var "acc") $
+      Maybes.cases (var "dup")
+        (Logic.ifElse (Sets.member (var "name") (var "seen"))
+          (pair (var "seen") (just $ var "name"))
+          (pair (Sets.insert (var "name") (var "seen")) nothing))
+        (constant $ var "acc"))
+    (pair Sets.empty nothing)
+    (var "names") $
+  Pairs.second (var "result")
+
+-- | Validate a name at an introduction site.
+-- Currently only rejects empty strings; may be extended with additional naming conventions.
+isValidName :: TBinding (Name -> Bool)
+isValidName = define "isValidName" $
+  doc "Check whether a name is valid at an introduction site. Currently rejects empty strings." $
+  "name" ~>
+  Logic.not $ Equality.equal (Core.unName $ var "name") (string "")
+
+-- | Check a type for undefined type variables against the current graph scope.
+-- Takes a path, graph, type, and a handler function that receives the first undefined variable name
+-- and returns an error. Returns Nothing if all type variables are defined.
+checkUndefinedTypeVariablesInType :: TBinding (SubtermPath -> Graph -> Type -> (Name -> Maybe InvalidTermError) -> Maybe InvalidTermError)
+checkUndefinedTypeVariablesInType = define "checkUndefinedTypeVariablesInType" $
+  doc "Check a type for type variables not bound in the current scope" $
+  "path" ~> "cx" ~> "typ" ~> "mkError" ~>
+  "freeVars" <~ Rewriting.freeVariablesInType @@ var "typ" $
+  "undefined" <~ Sets.difference (var "freeVars") (Graph.graphTypeVariables $ var "cx") $
+  Logic.ifElse (Sets.null $ var "undefined")
+    noError
+    ("firstUndefined" <~ Lists.head (Sets.toList $ var "undefined") $
+      var "mkError" @@ var "firstUndefined")
+
+-- | Check a type scheme for undefined type variables against the current graph scope.
+-- The scheme's own bound variables are excluded before checking.
+checkUndefinedTypeVariablesInTypeScheme :: TBinding (SubtermPath -> Graph -> TypeScheme -> (Name -> Maybe InvalidTermError) -> Maybe InvalidTermError)
+checkUndefinedTypeVariablesInTypeScheme = define "checkUndefinedTypeVariablesInTypeScheme" $
+  doc "Check a type scheme for type variables not bound by the scheme or the current scope" $
+  "path" ~> "cx" ~> "ts" ~> "mkError" ~>
+  "freeVars" <~ Rewriting.freeVariablesInTypeScheme @@ var "ts" $
+  "undefined" <~ Sets.difference (var "freeVars") (Graph.graphTypeVariables $ var "cx") $
+  Logic.ifElse (Sets.null $ var "undefined")
+    noError
+    ("firstUndefined" <~ Lists.head (Sets.toList $ var "undefined") $
+      var "mkError" @@ var "firstUndefined")
+
+-- ============================================================================
+-- Type validation
+-- ============================================================================
+
+-- | A Nothing of type Maybe InvalidTypeError
+noTypeError :: TTerm (Maybe InvalidTypeError)
+noTypeError = TTerm $ TermMaybe Nothing
+
+-- | A Just of type InvalidTypeError -> Maybe InvalidTypeError
+mkJustType :: TTerm InvalidTypeError -> TTerm (Maybe InvalidTypeError)
+mkJustType = just
+
+-- | Return the first Just from a list of Maybe InvalidTypeError values
+firstTypeError :: TBinding ([Maybe InvalidTypeError] -> Maybe InvalidTypeError)
+firstTypeError = define "firstTypeError" $
+  doc "Return the first type error from a list of optional errors, or nothing if all are valid" $
+  "checks" ~>
+  Lists.foldl
+    ("acc" ~> "check" ~>
+      Maybes.cases (var "acc")
+        (var "check")
+        (constant $ var "acc"))
+    noTypeError
+    (var "checks")
+
+-- | Validate a type, returning the first error found or nothing if valid.
+-- Recursively traverses the type, tracking bound type variables through forall binders.
+type_ :: TBinding (S.Set Name -> Type -> Maybe InvalidTypeError)
+type_ = define "type" $
+  doc "Validate a type, returning the first error found or nothing if valid. The first argument is the set of type variables already in scope." $
+  "boundVars" ~> "typ" ~>
+  -- Check the current node first
+  "checkResult" <~ validateTypeNode @@ var "boundVars" @@ var "typ" $
+  Maybes.cases (var "checkResult")
+    -- No error at this node: recurse into subtypes with updated scope
+    (cases _Type (var "typ") (Just noTypeError) [
+      -- For forall, extend bound vars before recursing into the body
+      _Type_forall>>: "ft" ~>
+        "newBound" <~ Sets.insert (Core.forallTypeParameter $ var "ft") (var "boundVars") $
+        type_ @@ var "newBound" @@ (Core.forallTypeBody $ var "ft"),
+      -- For all other types, recurse into subtypes with the same bound vars
+      _Type_annotated>>: "ann" ~> type_ @@ var "boundVars" @@ (Core.annotatedTypeBody $ var "ann"),
+      _Type_application>>: "at" ~>
+        firstTypeError @@ list [
+          type_ @@ var "boundVars" @@ (Core.applicationTypeFunction $ var "at"),
+          type_ @@ var "boundVars" @@ (Core.applicationTypeArgument $ var "at")],
+      _Type_either>>: "et" ~>
+        firstTypeError @@ list [
+          type_ @@ var "boundVars" @@ (Core.eitherTypeLeft $ var "et"),
+          type_ @@ var "boundVars" @@ (Core.eitherTypeRight $ var "et")],
+      _Type_function>>: "ft" ~>
+        firstTypeError @@ list [
+          type_ @@ var "boundVars" @@ (Core.functionTypeDomain $ var "ft"),
+          type_ @@ var "boundVars" @@ (Core.functionTypeCodomain $ var "ft")],
+      _Type_list>>: "lt" ~> type_ @@ var "boundVars" @@ var "lt",
+      _Type_map>>: "mt" ~>
+        firstTypeError @@ list [
+          type_ @@ var "boundVars" @@ (Core.mapTypeKeys $ var "mt"),
+          type_ @@ var "boundVars" @@ (Core.mapTypeValues $ var "mt")],
+      _Type_maybe>>: "mt" ~> type_ @@ var "boundVars" @@ var "mt",
+      _Type_pair>>: "pt" ~>
+        firstTypeError @@ list [
+          type_ @@ var "boundVars" @@ (Core.pairTypeFirst $ var "pt"),
+          type_ @@ var "boundVars" @@ (Core.pairTypeSecond $ var "pt")],
+      _Type_record>>: "fields" ~>
+        firstTypeError @@ (Lists.map
+          ("f" ~> type_ @@ var "boundVars" @@ (Core.fieldTypeType $ var "f"))
+          (var "fields")),
+      _Type_set>>: "st" ~> type_ @@ var "boundVars" @@ var "st",
+      _Type_union>>: "fields" ~>
+        firstTypeError @@ (Lists.map
+          ("f" ~> type_ @@ var "boundVars" @@ (Core.fieldTypeType $ var "f"))
+          (var "fields")),
+      _Type_wrap>>: "wt" ~> type_ @@ var "boundVars" @@ var "wt"])
+    -- Found an error: return it immediately
+    ("err" ~> mkJustType (var "err"))
+
+-- | Check if a type is TypeVoid and return a VoidInNonBottomPositionError if so
+checkVoid :: TBinding (Type -> Maybe InvalidTypeError)
+checkVoid = define "checkVoid" $
+  doc "Return an error if the given type is TypeVoid" $
+  "typ" ~>
+  cases _Type (var "typ") (Just noTypeError) [
+    _Type_void>>: constant $
+      mkJustType $ inject _InvalidTypeError _InvalidTypeError_voidInNonBottomPosition $
+        record _VoidInNonBottomPositionError [
+          _VoidInNonBottomPositionError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep]))]]
+
+-- | Check a single type node for validation errors (without recursing into subtypes).
+validateTypeNode :: TBinding (S.Set Name -> Type -> Maybe InvalidTypeError)
+validateTypeNode = define "validateTypeNode" $
+  doc "Check a single type node for validation errors" $
+  "boundVars" ~> "typ" ~>
+  cases _Type (var "typ") (Just noTypeError) [
+
+    -- Y8/Y9: TypeAnnotated — nested or empty annotations
+    _Type_annotated>>: "ann" ~>
+      "body" <~ Core.annotatedTypeBody (var "ann") $
+      "annMap" <~ Core.annotatedTypeAnnotation (var "ann") $
+      firstTypeError @@ list [
+        -- Y9. EmptyTypeAnnotationError
+        Logic.ifElse (Maps.null $ var "annMap")
+          (mkJustType $ inject _InvalidTypeError _InvalidTypeError_emptyTypeAnnotation $
+            record _EmptyTypeAnnotationError [
+              _EmptyTypeAnnotationError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep]))])
+          noTypeError,
+        -- Y8. NestedTypeAnnotationError
+        cases _Type (var "body") (Just noTypeError) [
+          _Type_annotated>>: constant $
+            mkJustType $ inject _InvalidTypeError _InvalidTypeError_nestedTypeAnnotation $
+              record _NestedTypeAnnotationError [
+                _NestedTypeAnnotationError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep]))]]],
+
+    -- Y10: TypeEither — void in either components
+    _Type_either>>: "et" ~>
+      firstTypeError @@ list [
+        checkVoid @@ (Core.eitherTypeLeft $ var "et"),
+        checkVoid @@ (Core.eitherTypeRight $ var "et")],
+
+    -- Y7/Y13: TypeForall — type variable shadowing and naming
+    _Type_forall>>: "ft" ~>
+      "paramName" <~ Core.forallTypeParameter (var "ft") $
+      firstTypeError @@ list [
+        -- Y7. TypeVariableShadowingInForallError
+        Logic.ifElse (Sets.member (var "paramName") (var "boundVars"))
+          (mkJustType $ inject _InvalidTypeError _InvalidTypeError_typeVariableShadowingInForall $
+            record _TypeVariableShadowingInForallError [
+              _TypeVariableShadowingInForallError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep])),
+              _TypeVariableShadowingInForallError_name>>: var "paramName"])
+          noTypeError,
+        -- Y13. InvalidForallParameterNameError
+        Logic.ifElse (isValidName @@ var "paramName")
+          noTypeError
+          (mkJustType $ inject _InvalidTypeError _InvalidTypeError_invalidForallParameterName $
+            record _InvalidForallParameterNameError [
+              _InvalidForallParameterNameError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep])),
+              _InvalidForallParameterNameError_name>>: var "paramName"])],
+
+    -- Y10: TypeFunction — void in codomain
+    _Type_function>>: "ft" ~>
+      checkVoid @@ (Core.functionTypeCodomain $ var "ft"),
+
+    -- Y10: TypeList — void element type
+    _Type_list>>: "lt" ~> checkVoid @@ var "lt",
+
+    -- Y11/Y10: TypeMap — non-comparable key type, void in key/value
+    _Type_map>>: "mt" ~>
+      "keyType" <~ Core.mapTypeKeys (var "mt") $
+      firstTypeError @@ list [
+        cases _Type (var "keyType") (Just noTypeError) [
+          _Type_function>>: constant $
+            mkJustType $ inject _InvalidTypeError _InvalidTypeError_nonComparableMapKeyType $
+              record _NonComparableMapKeyTypeError [
+                _NonComparableMapKeyTypeError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep])),
+                _NonComparableMapKeyTypeError_keyType>>: var "keyType"]],
+        checkVoid @@ var "keyType",
+        checkVoid @@ (Core.mapTypeValues $ var "mt")],
+
+    -- Y10: TypePair — void in pair components
+    _Type_pair>>: "pt" ~>
+      firstTypeError @@ list [
+        checkVoid @@ (Core.pairTypeFirst $ var "pt"),
+        checkVoid @@ (Core.pairTypeSecond $ var "pt")],
+
+    -- Y1/Y4/Y10: TypeRecord — empty, duplicate field names, void in fields
+    _Type_record>>: "fields" ~>
+      firstTypeError @@ list [
+        -- Y1. EmptyRecordTypeError
+        Logic.ifElse (Lists.null $ var "fields")
+          (mkJustType $ inject _InvalidTypeError _InvalidTypeError_emptyRecordType $
+            record _EmptyRecordTypeError [
+              _EmptyRecordTypeError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep]))])
+          noTypeError,
+        -- Y4. DuplicateRecordTypeFieldNamesError
+        checkDuplicateFieldTypes @@ (var "fields")
+          @@ ("dupName" ~>
+            mkJustType $ inject _InvalidTypeError _InvalidTypeError_duplicateRecordTypeFieldNames $
+              record _DuplicateRecordTypeFieldNamesError [
+                _DuplicateRecordTypeFieldNamesError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep])),
+                _DuplicateRecordTypeFieldNamesError_name>>: var "dupName"]),
+        -- Y10. VoidInNonBottomPositionError — check field types
+        firstTypeError @@ (Lists.map
+          ("f" ~> checkVoid @@ (Core.fieldTypeType $ var "f"))
+          (var "fields"))],
+
+    -- Y12/Y10: TypeSet — non-comparable element type, void element
+    _Type_set>>: "elemType" ~>
+      firstTypeError @@ list [
+        cases _Type (var "elemType") (Just noTypeError) [
+          _Type_function>>: constant $
+            mkJustType $ inject _InvalidTypeError _InvalidTypeError_nonComparableSetElementType $
+              record _NonComparableSetElementTypeError [
+                _NonComparableSetElementTypeError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep])),
+                _NonComparableSetElementTypeError_elementType>>: var "elemType"]],
+        checkVoid @@ var "elemType"],
+
+    -- Y2/Y3/Y5/Y10: TypeUnion — empty, single-variant, duplicate field names, void in fields
+    _Type_union>>: "fields" ~>
+      firstTypeError @@ list [
+        -- Y2. EmptyUnionTypeError
+        Logic.ifElse (Lists.null $ var "fields")
+          (mkJustType $ inject _InvalidTypeError _InvalidTypeError_emptyUnionType $
+            record _EmptyUnionTypeError [
+              _EmptyUnionTypeError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep]))])
+          noTypeError,
+        -- Y3. SingleVariantUnionError
+        Logic.ifElse (Equality.equal (Lists.length $ var "fields") (int32 1))
+          ("singleField" <~ Lists.head (var "fields") $
+            mkJustType $ inject _InvalidTypeError _InvalidTypeError_singleVariantUnion $
+              record _SingleVariantUnionError [
+                _SingleVariantUnionError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep])),
+                _SingleVariantUnionError_fieldName>>: Core.fieldTypeName (var "singleField")])
+          noTypeError,
+        -- Y5. DuplicateUnionTypeFieldNamesError
+        checkDuplicateFieldTypes @@ (var "fields")
+          @@ ("dupName" ~>
+            mkJustType $ inject _InvalidTypeError _InvalidTypeError_duplicateUnionTypeFieldNames $
+              record _DuplicateUnionTypeFieldNamesError [
+                _DuplicateUnionTypeFieldNamesError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep])),
+                _DuplicateUnionTypeFieldNamesError_name>>: var "dupName"]),
+        -- Y10. VoidInNonBottomPositionError — check field types
+        firstTypeError @@ (Lists.map
+          ("f" ~> checkVoid @@ (Core.fieldTypeType $ var "f"))
+          (var "fields"))],
+
+    -- Y6. UndefinedTypeVariableError
+    _Type_variable>>: "varName" ~>
+      Logic.ifElse (Sets.member (var "varName") (var "boundVars"))
+        noTypeError
+        (mkJustType $ inject _InvalidTypeError _InvalidTypeError_undefinedTypeVariable $
+          record _UndefinedTypeVariableError [
+            _UndefinedTypeVariableError_location>>: wrap _SubtermPath (list ([] :: [TTerm SubtermStep])),
+            _UndefinedTypeVariableError_name>>: var "varName"])]
+
+-- | Check a list of FieldType for duplicate names, calling a handler on the first duplicate found
+checkDuplicateFieldTypes :: TBinding ([FieldType] -> (Name -> Maybe InvalidTypeError) -> Maybe InvalidTypeError)
+checkDuplicateFieldTypes = define "checkDuplicateFieldTypes" $
+  doc "Check for duplicate field names in a list of field types" $
+  "fields" ~> "mkError" ~>
+  "names" <~ Lists.map (unaryFunction Core.fieldTypeName) (var "fields") $
+  "dup" <~ findDuplicateFieldType @@ var "names" $
+  Maybes.cases (var "dup")
+    noTypeError
+    ("name" ~> var "mkError" @@ var "name")
+
+-- | Find the first duplicate in a list of names (for field types)
+findDuplicateFieldType :: TBinding ([Name] -> Maybe Name)
+findDuplicateFieldType = define "findDuplicateFieldType" $
+  doc "Find the first duplicate name in a list (for field type validation)" $
+  "names" ~>
+  "result" <~ Lists.foldl
+    ("acc" ~> "name" ~>
+      "seen" <~ Pairs.first (var "acc") $
+      "dup" <~ Pairs.second (var "acc") $
+      Maybes.cases (var "dup")
+        (Logic.ifElse (Sets.member (var "name") (var "seen"))
+          (pair (var "seen") (just $ var "name"))
+          (pair (Sets.insert (var "name") (var "seen")) nothing))
+        (constant $ var "acc"))
+    (pair Sets.empty nothing)
+    (var "names") $
+  Pairs.second (var "result")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Terms/Validate/Packaging.hs b/src/main/haskell/Hydra/Sources/Kernel/Terms/Validate/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Terms/Validate/Packaging.hs
@@ -0,0 +1,253 @@
+module Hydra.Sources.Kernel.Terms.Validate.Packaging where
+
+-- Standard imports for kernel terms modules
+import Hydra.Kernel
+import Hydra.Packaging (Package)
+import Hydra.Sources.Libraries
+import qualified Hydra.Dsl.Error.Packaging       as ErrorPackaging
+import qualified Hydra.Dsl.Meta.Core             as Core
+import qualified Hydra.Dsl.Meta.Lib.Equality     as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists        as Lists
+import qualified Hydra.Dsl.Meta.Lib.Logic        as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps         as Maps
+import qualified Hydra.Dsl.Meta.Lib.Maybes       as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs        as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets         as Sets
+import qualified Hydra.Dsl.Meta.Lib.Strings      as Strings
+import qualified Hydra.Dsl.Module                as Module
+import qualified Hydra.Dsl.Packaging             as Packaging
+import           Hydra.Dsl.Meta.Phantoms         as Phantoms
+import           Hydra.Sources.Kernel.Types.All
+import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Names      as Names
+import           Prelude hiding ((++))
+import qualified Data.Set                        as S
+
+
+ns :: Namespace
+ns = Namespace "hydra.validate.packaging"
+
+module_ :: Module
+module_ = Module ns elements
+    [Formatting.ns, Names.ns]
+    kernelTypesNamespaces $
+    Just "Validation functions for modules and packages"
+  where
+    elements = [
+      toTermDefinition checkConflictingModuleNamespaces,
+      toTermDefinition checkConflictingVariantNames,
+      toTermDefinition checkDefinitionNamespaces,
+      toTermDefinition checkDuplicateDefinitionNames,
+      toTermDefinition checkDuplicateModuleNamespaces,
+      toTermDefinition definitionName,
+      toTermDefinition module',
+      toTermDefinition package]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+-- | Extract the name from a Definition (term or type)
+definitionName :: TBinding (Definition -> Name)
+definitionName = define "definitionName" $
+  doc "Extract the name from a definition" $
+  "def" ~>
+  cases _Definition (var "def") Nothing [
+    _Definition_term>>: "td" ~> Module.termDefinitionName (var "td"),
+    _Definition_type>>: "td" ~> Module.typeDefinitionName (var "td")]
+
+-- | Check for module namespaces that would conflict when mapped to a target language's
+-- directory structure. Two namespaces conflict if they are identical when lowercased,
+-- e.g. hydra.fooBar and hydra.foobar, or hydra.Foo.Bar and hydra.foo.bar.
+-- Fails on the first conflict found.
+checkConflictingModuleNamespaces :: TBinding (Package -> Maybe InvalidPackageError)
+checkConflictingModuleNamespaces = define "checkConflictingModuleNamespaces" $
+  doc "Check for module namespaces that conflict when mapped to target language paths" $
+  "pkg" ~>
+  -- Build a map from lowercased namespace strings to original namespaces.
+  -- If a lowercased version is already in the map, that's a conflict.
+  "result" <~ Lists.foldl
+    ("acc" ~> "mod" ~>
+      "seen" <~ Pairs.first (var "acc") $
+      "err" <~ Pairs.second (var "acc") $
+      Maybes.cases (var "err")
+        ("ns" <~ Module.moduleNamespace (var "mod") $
+          "key" <~ Strings.toLower (Module.unNamespace $ var "ns") $
+          "existing" <~ Maps.lookup (var "key") (var "seen") $
+          Maybes.cases (var "existing")
+            -- No conflict: add to map
+            (pair (Maps.insert (var "key") (var "ns") (var "seen")) nothing)
+            -- Conflict found
+            ("first" ~>
+              pair (var "seen") (just $
+                ErrorPackaging.invalidPackageErrorConflictingModuleNamespace $
+                  ErrorPackaging.conflictingModuleNamespaceError (var "first") (var "ns"))))
+        (constant $ var "acc"))
+    (pair Maps.empty nothing)
+    (Packaging.packageModules $ var "pkg") $
+  Pairs.second (var "result")
+
+-- | Check for union variant names that conflict with type definition names.
+-- For each union type, the capitalized type local name concatenated with
+-- the capitalized variant field name must not collide with any other type
+-- definition's local name in the same module.
+checkConflictingVariantNames :: TBinding (Module -> Maybe InvalidModuleError)
+checkConflictingVariantNames = define "checkConflictingVariantNames" $
+  doc "Check for union variant names that, when mapped to constructor names, conflict with other type definitions" $
+  "mod" ~>
+  "ns" <~ Module.moduleNamespace (var "mod") $
+  "defs" <~ Module.moduleDefinitions (var "mod") $
+  -- Collect all definition local names into a set
+  "defNames" <~ Lists.foldl
+    ("acc" ~> "def" ~>
+      Sets.insert (Names.localNameOf @@ (definitionName @@ var "def")) (var "acc"))
+    Sets.empty
+    (var "defs") $
+  -- For each type definition that is a union, check each field
+  Lists.foldl
+    ("acc" ~> "def" ~>
+      Maybes.cases (var "acc")
+        (cases _Definition (var "def") (Just nothing) [
+          _Definition_type>>: "td" ~>
+            "typeName" <~ Module.typeDefinitionName (var "td") $
+            "localTypeName" <~ (Names.localNameOf @@ var "typeName") $
+            "typ" <~ Module.typeDefinitionType (var "td") $
+            cases _Type (var "typ") (Just nothing) [
+              _Type_union>>: "fields" ~>
+                -- Check each field of the union
+                Lists.foldl
+                  ("innerAcc" ~> "field" ~>
+                    Maybes.cases (var "innerAcc")
+                      ("fieldName" <~ Core.fieldTypeName (var "field") $
+                        "localFieldName" <~ (Names.localNameOf @@ var "fieldName") $
+                        "constructorName" <~ Strings.cat2
+                          (Formatting.capitalize @@ var "localTypeName")
+                          (Formatting.capitalize @@ var "localFieldName") $
+                        Logic.ifElse (Sets.member (var "constructorName") (var "defNames"))
+                          (just $ ErrorPackaging.invalidModuleErrorConflictingVariantName $
+                            ErrorPackaging.conflictingVariantNameError
+                              (var "ns")
+                              (var "typeName")
+                              (var "fieldName")
+                              (Core.name $ var "constructorName"))
+                          nothing)
+                      (constant $ var "innerAcc"))
+                  nothing
+                  (var "fields")]])
+        (constant $ var "acc"))
+    nothing
+    (var "defs")
+
+-- | Check that all definition names in a module have the module's namespace as a prefix.
+-- For a module with namespace foo.bar, every definition name must have the form foo.bar.xyz.
+-- Fails on the first definition that violates this constraint.
+checkDefinitionNamespaces :: TBinding (Module -> Maybe InvalidModuleError)
+checkDefinitionNamespaces = define "checkDefinitionNamespaces" $
+  doc "Check that all definition names in a module have the module's namespace as a prefix" $
+  "mod" ~>
+  "ns" <~ Module.moduleNamespace (var "mod") $
+  "prefix" <~ (Strings.cat2 (Module.unNamespace $ var "ns") (string ".")) $
+  "prefixLen" <~ Strings.length (var "prefix") $
+  Lists.foldl
+    ("acc" ~> "def" ~>
+      Maybes.cases (var "acc")
+        -- No error yet: check this definition
+        ("name" <~ (definitionName @@ var "def") $
+          "nameStr" <~ Core.unName (var "name") $
+          "namePrefix" <~ Lists.take (var "prefixLen") (Strings.toList $ var "nameStr") $
+          Logic.ifElse (Equality.equal (Strings.fromList $ var "namePrefix") (var "prefix"))
+            nothing
+            (just $ ErrorPackaging.invalidModuleErrorDefinitionNotInModuleNamespace $
+              ErrorPackaging.definitionNotInModuleNamespaceError (var "ns") (var "name")))
+        -- Already have an error: stop
+        (constant $ var "acc"))
+    nothing
+    (Module.moduleDefinitions $ var "mod")
+
+-- | Check for duplicate definition names in a module.
+-- Fails on the first duplicate found.
+checkDuplicateDefinitionNames :: TBinding (Module -> Maybe InvalidModuleError)
+checkDuplicateDefinitionNames = define "checkDuplicateDefinitionNames" $
+  doc "Check for duplicate definition names in a module" $
+  "mod" ~>
+  "ns" <~ Module.moduleNamespace (var "mod") $
+  -- Fold through definitions tracking seen names in a set.
+  -- Accumulator is (Set Name, Maybe InvalidModuleError).
+  "result" <~ Lists.foldl
+    ("acc" ~> "def" ~>
+      "seen" <~ Pairs.first (var "acc") $
+      "err" <~ Pairs.second (var "acc") $
+      Maybes.cases (var "err")
+        -- No error yet: check this definition
+        ("name" <~ (definitionName @@ var "def") $
+          Logic.ifElse (Sets.member (var "name") (var "seen"))
+            (pair (var "seen") (just $
+              ErrorPackaging.invalidModuleErrorDuplicateDefinitionName $
+                ErrorPackaging.duplicateDefinitionNameError (var "ns") (var "name")))
+            (pair (Sets.insert (var "name") (var "seen")) nothing))
+        -- Already have an error: stop
+        (constant $ var "acc"))
+    (pair Sets.empty nothing)
+    (Module.moduleDefinitions $ var "mod") $
+  Pairs.second (var "result")
+
+-- | Check for duplicate module namespaces in a package.
+-- Fails on the first duplicate found.
+checkDuplicateModuleNamespaces :: TBinding (Package -> Maybe InvalidPackageError)
+checkDuplicateModuleNamespaces = define "checkDuplicateModuleNamespaces" $
+  doc "Check for duplicate module namespaces in a package" $
+  "pkg" ~>
+  "result" <~ Lists.foldl
+    ("acc" ~> "mod" ~>
+      "seen" <~ Pairs.first (var "acc") $
+      "err" <~ Pairs.second (var "acc") $
+      Maybes.cases (var "err")
+        ("ns" <~ Module.moduleNamespace (var "mod") $
+          Logic.ifElse (Sets.member (var "ns") (var "seen"))
+            (pair (var "seen") (just $
+              ErrorPackaging.invalidPackageErrorDuplicateModuleNamespace $
+                ErrorPackaging.duplicateModuleNamespaceError (var "ns")))
+            (pair (Sets.insert (var "ns") (var "seen")) nothing))
+        (constant $ var "acc"))
+    (pair Sets.empty nothing)
+    (Packaging.packageModules $ var "pkg") $
+  Pairs.second (var "result")
+
+-- | Validate a module, returning the first error found or nothing if valid.
+-- Checks are run in order; stops at the first failure.
+module' :: TBinding (Module -> Maybe InvalidModuleError)
+module' = define "module" $
+  doc "Validate a module, returning the first error found or nothing if valid" $
+  "mod" ~>
+  "r1" <~ (checkDefinitionNamespaces @@ var "mod") $
+  Maybes.cases (var "r1")
+    ("r2" <~ (checkDuplicateDefinitionNames @@ var "mod") $
+      Maybes.cases (var "r2")
+        (checkConflictingVariantNames @@ var "mod")
+        (constant $ var "r2"))
+    (constant $ var "r1")
+
+-- | Validate a package, returning the first error found or nothing if valid.
+-- Package-level checks run first, then each module is validated in order.
+-- Stops at the first failure.
+package :: TBinding (Package -> Maybe InvalidPackageError)
+package = define "package" $
+  doc "Validate a package, returning the first error found or nothing if valid" $
+  "pkg" ~>
+  "r1" <~ (checkDuplicateModuleNamespaces @@ var "pkg") $
+  Maybes.cases (var "r1")
+    ("r2" <~ (checkConflictingModuleNamespaces @@ var "pkg") $
+      Maybes.cases (var "r2")
+        -- No package-level errors: validate each module
+        (Lists.foldl
+      ("acc" ~> "mod" ~>
+        Maybes.cases (var "acc")
+          (Maybes.map
+            ("err" ~> ErrorPackaging.invalidPackageErrorInvalidModule (var "err"))
+            (module' @@ var "mod"))
+          (constant $ var "acc"))
+          nothing
+          (Packaging.packageModules $ var "pkg"))
+        -- Conflicting namespace error found: stop
+        (constant $ var "r2"))
+    -- Duplicate namespace error found: stop
+    (constant $ var "r1")
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Accessors.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Accessors.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Accessors.hs
+++ /dev/null
@@ -1,136 +0,0 @@
-module Hydra.Sources.Kernel.Types.Accessors where
-
--- Standard type-level kernel imports
-import           Hydra.Kernel
-import           Hydra.Dsl.Annotations (doc)
-import           Hydra.Dsl.Bootstrap
-import           Hydra.Dsl.Types ((>:), (@@), (~>))
-import qualified Hydra.Dsl.Types as T
-import qualified Hydra.Sources.Kernel.Types.Core as Core
-
-
-ns :: Namespace
-ns = Namespace "hydra.accessors"
-
-define :: String -> Type -> Binding
-define = defineType ns
-
-module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
-    Just "A model for term access patterns"
-  where
-    elements = [
-      accessorEdge,
-      accessorGraph,
-      accessorNode,
-      accessorPath,
-      termAccessor]
-
-accessorEdge :: Binding
-accessorEdge = define "AccessorEdge" $
-  doc "An edge in an accessor graph, connecting two nodes via a path" $
-  T.record [
-    "source">:
-      doc "The source node of the edge"
-      accessorNode,
-    "path">:
-      doc "The accessor path connecting source to target"
-      accessorPath,
-    "target">:
-      doc "The target node of the edge"
-      accessorNode]
-
-accessorGraph :: Binding
-accessorGraph = define "AccessorGraph" $
-  doc "A graph of accessor nodes and edges, representing term access patterns" $
-  T.record [
-    "nodes">:
-      doc "All nodes in the graph" $
-      T.list accessorNode,
-    "edges">:
-      doc "All edges in the graph" $
-      T.list accessorEdge]
-
-accessorNode :: Binding
-accessorNode = define "AccessorNode" $
-  doc "A node in an accessor graph, representing a term or subterm" $
-  T.record [
-    "name">:
-      doc "The qualified name of the term"
-      Core.name,
-    "label">:
-      doc "A human-readable label for the node"
-      T.string,
-    "id" >:
-      doc "A unique identifier for the node"
-      T.string]
-
-accessorPath :: Binding
-accessorPath = define "AccessorPath" $
-  doc "A sequence of term accessors forming a path through a term" $
-  T.wrap $ T.list termAccessor
-
-termAccessor :: Binding
-termAccessor = define "TermAccessor" $
-  doc "A function which maps from a term to a particular immediate subterm" $
-  T.union [
-    "annotatedBody">:
-      doc "Access the body of an annotated term"
-      T.unit,
-    "applicationFunction">:
-      doc "Access the function of an application term"
-      T.unit,
-    "applicationArgument">:
-      doc "Access the argument of an application term"
-      T.unit,
-    "lambdaBody">:
-      doc "Access the body of a lambda term"
-      T.unit,
-    "unionCasesDefault">:
-      doc "Access the default case of a union elimination"
-      T.unit,
-    "unionCasesBranch">:
-      doc "Access a specific branch of a union elimination by field name"
-      Core.name,
-    "letBody">:
-      doc "Access the body of a let term"
-      T.unit,
-    "letBinding">:
-      doc "Access a specific binding in a let term by variable name"
-      Core.name,
-    "listElement">:
-      doc "Access an element of a list by index"
-      T.int32,
-    "mapKey">:
-      doc "Access a key in a map by index"
-      T.int32,
-    "mapValue">:
-      doc "Access a value in a map by index"
-      T.int32,
-    "maybeTerm">:
-      doc "Access the term inside a Just value"
-      T.unit,
-    "productTerm">:
-      doc "Access an element of a product (tuple) by index"
-      T.int32,
-    "recordField">:
-      doc "Access a field of a record by field name"
-      Core.name,
-    "setElement">:
-      doc "Access an element of a set by index"
-      T.int32,
-    "sumTerm">:
-      doc "Access the term inside a sum variant"
-      T.unit,
-    "typeLambdaBody">:
-      doc "Access the body of a type lambda term"
-      T.unit,
-    "typeApplicationTerm">:
-      doc "Access the term being applied to a type"
-      T.unit,
-    "injectionTerm">:
-      doc "Access the term inside a union injection"
-      T.unit,
-    "wrappedTerm">:
-      doc "Access the term inside a wrapped term"
-      T.unit]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/All.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/All.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/All.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/All.hs
@@ -3,18 +3,21 @@
 
 import Hydra.Kernel
 
-import qualified Hydra.Sources.Kernel.Types.Accessors   as Accessors
+import qualified Hydra.Sources.Kernel.Types.Paths        as Paths
 import qualified Hydra.Sources.Kernel.Types.Ast         as Ast
 import qualified Hydra.Sources.Kernel.Types.Classes     as Classes
 import qualified Hydra.Sources.Kernel.Types.Coders      as Coders
-import qualified Hydra.Sources.Kernel.Types.Compute     as Compute
-import qualified Hydra.Sources.Kernel.Types.Constraints as Constraints
+import qualified Hydra.Sources.Kernel.Types.Context     as Context
 import qualified Hydra.Sources.Kernel.Types.Core        as Core
-import qualified Hydra.Sources.Kernel.Types.Grammar     as Grammar
+import qualified Hydra.Sources.Kernel.Types.Error.Checking as ErrorChecking
+import qualified Hydra.Sources.Kernel.Types.Error.Core     as ErrorCore
+import qualified Hydra.Sources.Kernel.Types.Error.Packaging as ErrorPackaging
+import qualified Hydra.Sources.Kernel.Types.Errors      as Errors
 import qualified Hydra.Sources.Kernel.Types.Graph       as Graph
 import qualified Hydra.Sources.Json.Model               as JsonModel
 import qualified Hydra.Sources.Kernel.Types.Variants    as Variants
 import qualified Hydra.Sources.Kernel.Types.Module      as Module
+import qualified Hydra.Sources.Kernel.Types.Packaging   as Packaging
 import qualified Hydra.Sources.Kernel.Types.Parsing     as Parsing
 import qualified Hydra.Sources.Kernel.Types.Phantoms    as Phantoms
 import qualified Hydra.Sources.Kernel.Types.Query       as Query
@@ -24,22 +27,24 @@
 import qualified Hydra.Sources.Kernel.Types.Topology    as Topology
 import qualified Hydra.Sources.Kernel.Types.Typing      as Typing
 import qualified Hydra.Sources.Kernel.Types.Util        as Util
-import qualified Hydra.Sources.Kernel.Types.Workflow    as Workflow
 
 
 kernelTypesModules :: [Module]
 kernelTypesModules = [
-  Accessors.module_,
+  Paths.module_,
   Ast.module_,
   Classes.module_,
   Coders.module_,
-  Compute.module_,
-  Constraints.module_,
+  Context.module_,
   Core.module_,
-  Grammar.module_,
+  ErrorChecking.module_,
+  ErrorCore.module_,
+  ErrorPackaging.module_,
+  Errors.module_,
   Graph.module_,
   JsonModel.module_,
   Module.module_,
+  Packaging.module_,
   Parsing.module_,
   Phantoms.module_,
   Query.module_,
@@ -49,8 +54,7 @@
   Topology.module_,
   Typing.module_,
   Util.module_,
-  Variants.module_,
-  Workflow.module_]
+  Variants.module_]
 
 -- | Namespaces of all kernel type modules
 kernelTypesNamespaces :: [Namespace]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Ast.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Ast.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Ast.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Ast.hs
@@ -16,7 +16,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [] [Core.ns] $
     Just "A model which provides a common syntax tree for Hydra serializers"
   where
     elements = [
@@ -31,6 +31,7 @@
       opExpr,
       padding,
       precedence,
+      seqExpr,
       symbol,
       ws]
 
@@ -93,7 +94,21 @@
       opExpr,
     "brackets">:
       doc "A bracketed expression"
-      bracketExpr]
+      bracketExpr,
+    "seq">:
+      doc "A sequence of expressions joined by a separator, treated as structural layout (not subject to parenthesization)"
+      seqExpr]
+
+seqExpr :: Binding
+seqExpr = define "SeqExpr" $
+  doc "A sequence of expressions joined by a separator operator. Unlike OpExpr, parenthesize ignores SeqExpr boundaries." $
+  T.record [
+    "op">:
+      doc "The separator operator"
+      op,
+    "elements">:
+      doc "The expressions to join" $
+      T.list expr]
 
 indentedExpression :: Binding
 indentedExpression = define "IndentedExpression" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Classes.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Classes.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Classes.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Classes.hs
@@ -16,7 +16,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Core.ns] [Core.ns] $
     Just "Type classes"
   where
     elements = [
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Coders.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Coders.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Coders.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Coders.hs
@@ -7,8 +7,8 @@
 import           Hydra.Dsl.Types ((>:), (@@), (~>))
 import qualified Hydra.Dsl.Types as T
 import qualified Hydra.Sources.Kernel.Types.Core as Core
-import qualified Hydra.Sources.Kernel.Types.Compute as Compute
 import qualified Hydra.Sources.Kernel.Types.Graph as Graph
+import qualified Hydra.Sources.Kernel.Types.Util as Util
 import qualified Hydra.Sources.Kernel.Types.Variants as Variants
 
 
@@ -19,7 +19,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Graph.ns, Compute.ns, Variants.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Graph.ns, Util.ns, Variants.ns] [Core.ns] $
     Just "Abstractions for paired transformations between languages"
   where
     elements = [
@@ -44,8 +44,7 @@
       language,
     "adapters">:
       doc "A map of type names to adapters for those types" $
-      T.map Core.name (Compute.adapter
-        @@ adapterContext @@ adapterContext
+      T.map Core.name (Util.adapter
         @@ Core.type_ @@ Core.type_
         @@ Core.term @@ Core.term)]
 
@@ -104,7 +103,7 @@
 symmetricAdapter :: Binding
 symmetricAdapter = define "SymmetricAdapter" $
   doc "A bidirectional encoder which maps between the same type and term languages on either side" $
-  T.forAlls ["s", "t", "v"] $ Compute.adapter @@ "s" @@ "s" @@ "t" @@ "t" @@ "v" @@ "v"
+  T.forAlls ["t", "v"] $ Util.adapter @@ "t" @@ "t" @@ "v" @@ "v"
 
 traversalOrder :: Binding
 traversalOrder = define "TraversalOrder" $
@@ -116,5 +115,5 @@
 typeAdapter :: Binding
 typeAdapter = define "TypeAdapter" $
   doc "A function which maps a Hydra type to a symmetric adapter between types and terms" $
-  Core.type_ ~> Compute.flow @@ adapterContext @@
-    (symmetricAdapter @@ adapterContext @@ Core.type_ @@ Core.term)
+  adapterContext ~> Core.type_ ~> T.either_ T.string
+    (symmetricAdapter @@ Core.type_ @@ Core.term)
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Compute.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Compute.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Compute.hs
+++ /dev/null
@@ -1,101 +0,0 @@
-module Hydra.Sources.Kernel.Types.Compute where
-
--- Standard type-level kernel imports
-import           Hydra.Kernel
-import           Hydra.Dsl.Annotations (doc)
-import           Hydra.Dsl.Bootstrap
-import           Hydra.Dsl.Types ((>:), (@@), (~>))
-import qualified Hydra.Dsl.Types as T
-import qualified Hydra.Sources.Kernel.Types.Core as Core
-
-
-ns :: Namespace
-ns = Namespace "hydra.compute"
-
-define :: String -> Type -> Binding
-define = defineType ns
-
-module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
-    Just "Abstractions for single- and bidirectional transformations"
-  where
-    elements = [
-      adapter,
-      bicoder,
-      coder,
-      flow,
-      flowState,
-      trace]
-
-adapter :: Binding
-adapter = define "Adapter" $
-  doc "A two-level bidirectional encoder which adapts types to types and terms to terms" $
-  T.forAlls ["s1", "s2", "t1", "t2", "v1", "v2"] $ T.record [
-    "isLossy">:
-      doc "Whether information may be lost in the course of this adaptation"
-      T.boolean,
-    "source">:
-      doc "The source type"
-      "t1",
-    "target">:
-      doc "The target type"
-      "t2",
-    "coder">:
-      doc "The coder for transforming instances of the source type to instances of the target type" $
-      coder @@ "s1" @@ "s2" @@ "v1" @@ "v2"]
-
-bicoder :: Binding
-bicoder = define "Bicoder" $
-  doc "A two-level encoder and decoder, operating both at a type level and an instance (data) level" $
-  T.forAlls ["s1", "s2", "t1", "t2", "v1", "v2"] $ T.record [
-    "encode">:
-      doc "A function from source types to adapters" $
-      "t1" ~> adapter @@ "s1" @@ "s2" @@ "t1" @@ "t2" @@ "v1" @@ "v2",
-    "decode">:
-      doc "A function from target types to adapters" $
-      "t2" ~> adapter @@ "s2" @@ "s1" @@ "t2" @@ "t1" @@ "v2" @@ "v1"]
-
-coder :: Binding
-coder = define "Coder" $
-  doc "An encoder and decoder; a bidirectional flow between two types" $
-  T.forAlls ["s1", "s2", "v1", "v2"] $ T.record [
-    "encode">:
-      doc "A function from source values to a flow of target values" $
-      "v1" ~> flow @@ "s1" @@ "v2",
-    "decode">:
-      doc "A function from target values to a flow of source values" $
-      "v2" ~> flow @@ "s2" @@ "v1"]
-
-flow :: Binding
-flow = define "Flow" $
-  doc "A variant of the State monad with built-in logging and error handling" $
-  T.forAlls ["s", "v"] $ T.wrap $
-    "s" ~> trace ~> flowState @@ "s" @@ "v"
-
-flowState :: Binding
-flowState = define "FlowState" $
-  doc "The result of evaluating a Flow" $
-  T.forAlls ["s", "v"] $ T.record [
-    "value">:
-      doc "The resulting value, or nothing in the case of failure" $
-      T.maybe "v",
-    "state">:
-      doc "The final state"
-      "s",
-    "trace">:
-      doc "The trace (log) produced during evaluation"
-      trace]
-
-trace :: Binding
-trace = define "Trace" $
-  doc "A container for logging and error information" $
-  T.record [
-    "stack">:
-      doc "A stack of context labels" $
-      T.list T.string,
-    "messages">:
-      doc "A log of warnings and/or info messages" $
-      T.list T.string,
-    "other">:
-      doc "A map of string keys to arbitrary terms as values, for application-specific use" $
-      T.map Core.name Core.term]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Constraints.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Constraints.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Constraints.hs
+++ /dev/null
@@ -1,47 +0,0 @@
-module Hydra.Sources.Kernel.Types.Constraints where
-
--- Standard type-level kernel imports
-import           Hydra.Kernel
-import           Hydra.Dsl.Annotations (doc)
-import           Hydra.Dsl.Bootstrap
-import           Hydra.Dsl.Types ((>:), (@@), (~>))
-import qualified Hydra.Dsl.Types as T
-import qualified Hydra.Sources.Kernel.Types.Core as Core
-import qualified Hydra.Sources.Kernel.Types.Query as Query
-
-
-ns :: Namespace
-ns = Namespace "hydra.constraints"
-
-define :: String -> Type -> Binding
-define = defineType ns
-
-module_ :: Module
-module_ = Module ns elements [Query.ns] [Core.ns] $
-    Just "A model for path- and pattern-based graph constraints, which may be considered as part of the schema of a graph"
-  where
-    elements = [
-      pathEquation,
-      patternImplication]
-
-pathEquation :: Binding
-pathEquation = define "PathEquation" $
-  doc "A declared equivalence between two abstract paths in a graph" $
-  T.record [
-    "left">:
-      doc "The left-hand side of the equation"
-      Query.path,
-    "right">:
-      doc "The right-hand side of the equation"
-      Query.path]
-
-patternImplication :: Binding
-patternImplication = define "PatternImplication" $
-  doc "A pattern which, if it matches in a given graph, implies that another pattern must also match. Query variables are shared between the two patterns." $
-  T.record [
-    "antecedent">:
-      doc "The pattern which, if it matches, triggers the constraint"
-      Query.pattern,
-    "consequent">:
-      doc "The pattern which must also match when the antecedent matches"
-      Query.pattern]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Context.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Context.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Context.hs
@@ -0,0 +1,48 @@
+module Hydra.Sources.Kernel.Types.Context where
+
+import           Hydra.Kernel
+import           Hydra.Dsl.Annotations (doc)
+import           Hydra.Dsl.Bootstrap
+import           Hydra.Dsl.Types ((>:))
+import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Core as Core
+
+
+ns :: Namespace
+ns = Namespace "hydra.context"
+
+define :: String -> Type -> Binding
+define = defineType ns
+
+module_ :: Module
+module_ = Module ns (map toTypeDef elements) [Core.ns] [Core.ns] $
+    Just "Execution context for tracing and diagnostics"
+  where
+    elements = [
+      context,
+      inContext]
+
+context :: Binding
+context = define "Context" $
+  doc "An execution context for tracing and diagnostics, threaded through function calls" $
+  T.record [
+    "trace">:
+      doc "A stack of context labels describing the current execution path" $
+      T.list T.string,
+    "messages">:
+      doc "A log of warnings and/or info messages" $
+      T.list T.string,
+    "other">:
+      doc "A map of string keys to arbitrary terms as values, for application-specific use" $
+      T.map Core.name Core.term]
+
+inContext :: Binding
+inContext = define "InContext" $
+  doc "A particular domain object (such as an error) together with an execution context" $
+  T.forAll "e" $ T.record [
+    "object">:
+      doc "A domain object; typically an error" $
+      T.var "e",
+    "context">:
+      doc "The execution context at the point of capture" $
+      context]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Core.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Core.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Core.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Core.hs
@@ -7,7 +7,9 @@
 import Hydra.Dsl.Types ((>:))
 import qualified Hydra.Dsl.Types as T
 
+import qualified Data.Map as M
 
+
 ns :: Namespace
 ns = Namespace "hydra.core"
 
@@ -15,10 +17,10 @@
 define = defineType ns
 
 hydraCoreGraph :: Graph
-hydraCoreGraph = elementsToGraph bootstrapGraph Nothing (moduleElements module_)
+hydraCoreGraph = elementsToGraph bootstrapGraph M.empty (moduleBindings module_)
 
 module_ :: Module
-module_ = Module ns elements [] [ns] $ -- Note: hydra.core uniquely takes itself as a type-level dependency
+module_ = Module ns (map toTypeDef elements) [] [ns] $ -- Note: hydra.core uniquely takes itself as a type-level dependency
     Just "Hydra's core data model, consisting of the fundamental hydra.core.Term type and all of its dependencies."
   where
     elements = [
@@ -49,15 +51,13 @@
       name,
       projection,
       record,
-      rowType,
       term,
       type_,
       typeApplicationTerm,
       typeLambda,
       typeScheme,
       typeVariableMetadata,
-      wrappedTerm,
-      wrappedType]
+      wrappedTerm]
 
 annotatedTerm :: Binding
 annotatedTerm = define "AnnotatedTerm" $
@@ -413,17 +413,6 @@
       doc "The fields of the record, as a list of name/term pairs" $
       T.list field]
 
-rowType :: Binding
-rowType = define "RowType" $
-  doc "A labeled record or union type" $
-  T.record [
-    "typeName">:
-      doc "The name of the row type, which must correspond to the name of a Type element"
-      name,
-    "fields">:
-      doc "The fields of this row type, excluding any inherited fields" $
-      T.list fieldType]
-
 term :: Binding
 term = define "Term" $
   doc "A data term" $
@@ -518,23 +507,26 @@
       doc "A pair (2-tuple) type"
       pairType,
     "record">:
-      doc "A record type"
-      rowType,
+      doc "A record type" $
+      T.list fieldType,
     "set">:
       doc "A set type"
       type_,
     "union">:
-      doc "A union type with field names"
-      rowType,
+      doc "A union type with field names" $
+      T.list fieldType,
     "unit">:
       doc "The unit type" $
       T.unit,
     "variable">:
       doc "A type variable"
       name,
+    "void">:
+      doc "The void (uninhabited, or bottom) type" $
+      T.unit,
     "wrap">:
       doc "A wrapped type (newtype)"
-      wrappedType]
+      type_]
 
 typeApplicationTerm :: Binding
 typeApplicationTerm = define "TypeApplicationTerm" $
@@ -591,13 +583,3 @@
       doc "The wrapped term"
       term]
 
-wrappedType :: Binding
-wrappedType = define "WrappedType" $
-  doc "A type wrapped in a type name; a newtype" $
-  T.record [
-    "typeName">:
-      doc "The name of the wrapper (newtype)"
-      name,
-    "body">:
-      doc "The wrapped type"
-      type_]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Checking.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Checking.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Checking.hs
@@ -0,0 +1,167 @@
+module Hydra.Sources.Kernel.Types.Error.Checking where
+
+import           Hydra.Kernel
+import           Hydra.Dsl.Annotations (doc)
+import           Hydra.Dsl.Bootstrap
+import           Hydra.Dsl.Types ((>:))
+import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Core as Core
+import qualified Hydra.Sources.Kernel.Types.Typing as Typing
+import qualified Hydra.Sources.Kernel.Types.Variants as Variants
+
+
+ns :: Namespace
+ns = Namespace "hydra.error.checking"
+
+define :: String -> Type -> Binding
+define = defineType ns
+
+module_ :: Module
+module_ = Module ns (map toTypeDef elements) [Core.ns, Typing.ns, Variants.ns] [Core.ns, Typing.ns, Variants.ns] $
+    Just "Error types for type checking"
+  where
+    elements = [
+      checkingError,
+      incorrectUnificationError,
+      notAForallTypeError,
+      notAFunctionTypeError,
+      typeArityMismatchError,
+      typeMismatchError,
+      unboundTypeVariablesError,
+      unequalTypesError,
+      unsupportedTermVariantError,
+      untypedLambdaError,
+      untypedLetBindingError]
+
+checkingError :: Binding
+checkingError = define "CheckingError" $
+  doc "An error that occurred during type checking" $
+  T.union [
+    "incorrectUnification">:
+      doc "A post-unification consistency check failure" $
+      incorrectUnificationError,
+    "notAForallType">:
+      doc "A type that is not a forall type when one was expected" $
+      notAForallTypeError,
+    "notAFunctionType">:
+      doc "A type that is not a function type when one was expected" $
+      notAFunctionTypeError,
+    "typeArityMismatch">:
+      doc "A type constructor applied to the wrong number of arguments" $
+      typeArityMismatchError,
+    "typeMismatch">:
+      doc "A type mismatch between expected and actual types" $
+      typeMismatchError,
+    "unboundTypeVariables">:
+      doc "Type variables that are not bound in scope" $
+      unboundTypeVariablesError,
+    "unequalTypes">:
+      doc "Multiple types that should be equal but are not" $
+      unequalTypesError,
+    "unsupportedTermVariant">:
+      doc "A term variant that the type checker does not support" $
+      unsupportedTermVariantError,
+    "untypedLambda">:
+      doc "A lambda expression without a type annotation on its parameter" $
+      untypedLambdaError,
+    "untypedLetBinding">:
+      doc "A let binding without a type annotation" $
+      untypedLetBindingError]
+
+incorrectUnificationError :: Binding
+incorrectUnificationError = define "IncorrectUnificationError" $
+  doc "A post-unification consistency check failure" $
+  T.record [
+    "substitution">:
+      doc "The substitution that failed the consistency check" $
+      Typing.typeSubst]
+
+notAForallTypeError :: Binding
+notAForallTypeError = define "NotAForallTypeError" $
+  doc "A type that is not a forall type when type arguments are being applied" $
+  T.record [
+    "type">:
+      doc "The actual type encountered" $
+      Core.type_,
+    "typeArguments">:
+      doc "The type arguments that were being applied" $
+      T.list Core.type_]
+
+notAFunctionTypeError :: Binding
+notAFunctionTypeError = define "NotAFunctionTypeError" $
+  doc "A type that is not a function type when one was expected in an application" $
+  T.record [
+    "type">:
+      doc "The actual type encountered" $
+      Core.type_]
+
+typeArityMismatchError :: Binding
+typeArityMismatchError = define "TypeArityMismatchError" $
+  doc "A type constructor applied to the wrong number of type arguments" $
+  T.record [
+    "type">:
+      doc "The type being checked" $
+      Core.type_,
+    "expectedArity">:
+      doc "The expected number of type arguments" $
+      T.int32,
+    "actualArity">:
+      doc "The actual number of type arguments provided" $
+      T.int32,
+    "typeArguments">:
+      doc "The type arguments that were provided" $
+      T.list Core.type_]
+
+typeMismatchError :: Binding
+typeMismatchError = define "TypeMismatchError" $
+  doc "A type mismatch between expected and actual types" $
+  T.record [
+    "expectedType">:
+      doc "The expected type" $
+      Core.type_,
+    "actualType">:
+      doc "The actual type encountered" $
+      Core.type_]
+
+unboundTypeVariablesError :: Binding
+unboundTypeVariablesError = define "UnboundTypeVariablesError" $
+  doc "Type variables that appear free in a type but are not bound in scope" $
+  T.record [
+    "variables">:
+      doc "The set of unbound type variable names" $
+      T.set Core.name,
+    "type">:
+      doc "The type containing the unbound variables" $
+      Core.type_]
+
+unequalTypesError :: Binding
+unequalTypesError = define "UnequalTypesError" $
+  doc "Multiple types that should all be equal but are not" $
+  T.record [
+    "types">:
+      doc "The list of types that are not all equal" $
+      T.list Core.type_,
+    "description">:
+      doc "A description of the context in which the types were expected to be equal" $
+      T.string]
+
+unsupportedTermVariantError :: Binding
+unsupportedTermVariantError = define "UnsupportedTermVariantError" $
+  doc "A term variant that the type checker does not support" $
+  T.record [
+    "termVariant">:
+      doc "The unsupported term variant" $
+      Variants.termVariant]
+
+untypedLambdaError :: Binding
+untypedLambdaError = define "UntypedLambdaError" $
+  doc "A lambda expression without a type annotation on its parameter" $
+  T.record []
+
+untypedLetBindingError :: Binding
+untypedLetBindingError = define "UntypedLetBindingError" $
+  doc "A let binding without a type annotation" $
+  T.record [
+    "binding">:
+      doc "The untyped binding" $
+      Core.binding]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Core.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Core.hs
@@ -0,0 +1,669 @@
+module Hydra.Sources.Kernel.Types.Error.Core where
+
+import           Hydra.Kernel
+import           Hydra.Dsl.Annotations (doc)
+import           Hydra.Dsl.Bootstrap
+import           Hydra.Dsl.Types ((>:))
+import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Paths as Paths
+import qualified Hydra.Sources.Kernel.Types.Core as Core
+import qualified Hydra.Sources.Kernel.Types.Variants as Variants
+
+
+ns :: Namespace
+ns = Namespace "hydra.error.core"
+
+define :: String -> Type -> Binding
+define = defineType ns
+
+module_ :: Module
+module_ = Module ns (map toTypeDef elements) [Paths.ns, Core.ns, Variants.ns] [Paths.ns, Core.ns, Variants.ns] $
+    Just "Error types for core type and term validation"
+  where
+    elements = [
+      -- Existing error types (pre-linter)
+      duplicateBindingError,
+      duplicateFieldError,
+      undefinedFieldError,
+      unexpectedTermVariantError,
+      unexpectedTypeVariantError,
+
+      -- Term validation errors
+      constantConditionError,
+      emptyCaseStatementError,
+      emptyLetBindingsError,
+      emptyTermAnnotationError,
+      emptyTypeNameInTermError,
+      invalidLambdaParameterNameError,
+      invalidLetBindingNameError,
+      invalidTypeLambdaParameterNameError,
+      nestedTermAnnotationError,
+      redundantWrapUnwrapError,
+      selfApplicationError,
+      termVariableShadowingError,
+      typeVariableShadowingInTypeLambdaError,
+      undefinedTermVariableError,
+      undefinedTypeVariableInBindingTypeError,
+      undefinedTypeVariableInLambdaDomainError,
+      undefinedTypeVariableInTypeApplicationError,
+      unknownPrimitiveNameError,
+      unnecessaryIdentityApplicationError,
+      untypedTermVariableError,
+      invalidTermError,
+
+      -- Type validation errors
+      duplicateRecordTypeFieldNamesError,
+      duplicateUnionTypeFieldNamesError,
+      emptyRecordTypeError,
+      emptyTypeAnnotationError,
+      emptyUnionTypeError,
+      invalidForallParameterNameError,
+      invalidTypeSchemeVariableNameError,
+      nestedTypeAnnotationError,
+      nonComparableMapKeyTypeError,
+      nonComparableSetElementTypeError,
+      singleVariantUnionError,
+      typeVariableShadowingInForallError,
+      undefinedTypeVariableError,
+      voidInNonBottomPositionError,
+      invalidTypeError]
+
+-- ============================================================================
+-- Existing error types (pre-linter)
+-- ============================================================================
+
+duplicateBindingError :: Binding
+duplicateBindingError = define "DuplicateBindingError" $
+  doc "A duplicate binding name in a let expression" $
+  T.record [
+    "location">:
+      doc "The path to the duplicate binding within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The duplicated binding name" $
+      Core.name]
+
+duplicateFieldError :: Binding
+duplicateFieldError = define "DuplicateFieldError" $
+  doc "A duplicate field name in a record or union type" $
+  T.record [
+    "location">:
+      doc "The path to the duplicate field within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The duplicated field name" $
+      Core.name]
+
+undefinedFieldError :: Binding
+undefinedFieldError = define "UndefinedFieldError" $
+  doc "A reference to a field that does not exist in the given type" $
+  T.record [
+    "fieldName">:
+      doc "The name of the undefined field" $
+      Core.name,
+    "typeName">:
+      doc "The name of the type in which the field was expected" $
+      Core.name]
+
+unexpectedTermVariantError :: Binding
+unexpectedTermVariantError = define "UnexpectedTermVariantError" $
+  doc "An unexpected term variant was encountered" $
+  T.record [
+    "expectedVariant">:
+      doc "The expected term variant" $
+      Variants.termVariant,
+    "actualTerm">:
+      doc "The actual term that was encountered" $
+      Core.term]
+
+unexpectedTypeVariantError :: Binding
+unexpectedTypeVariantError = define "UnexpectedTypeVariantError" $
+  doc "An unexpected type variant was encountered" $
+  T.record [
+    "expectedVariant">:
+      doc "The expected type variant" $
+      Variants.typeVariant,
+    "actualType">:
+      doc "The actual type that was encountered" $
+      Core.type_]
+
+-- ============================================================================
+-- Term validation errors
+-- ============================================================================
+
+-- T1. EmptyLetBindingsError (optional)
+emptyLetBindingsError :: Binding
+emptyLetBindingsError = define "EmptyLetBindingsError" $
+  doc "A let expression with an empty list of bindings (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the empty let expression within the term" $
+      Paths.subtermPath]
+
+-- T2. DuplicateLetBindingNamesError — covered by existing DuplicateBindingError
+
+-- T3. DuplicateRecordFieldNamesError — covered by existing DuplicateFieldError (for terms)
+
+-- T4. DuplicateCaseStatementFieldNamesError — covered by existing DuplicateFieldError (for terms)
+
+-- T5. EmptyTypeNameInTermError (optional)
+emptyTypeNameInTermError :: Binding
+emptyTypeNameInTermError = define "EmptyTypeNameInTermError" $
+  doc "A record, injection, projection, or case statement with an empty type name (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the term with the empty type name" $
+      Paths.subtermPath]
+
+-- T6. EmptyCaseStatementError (optional)
+emptyCaseStatementError :: Binding
+emptyCaseStatementError = define "EmptyCaseStatementError" $
+  doc "A case statement with no cases and no default (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the empty case statement within the term" $
+      Paths.subtermPath,
+    "typeName">:
+      doc "The name of the union type being matched" $
+      Core.name]
+
+-- T7. UndefinedTermVariableError (replaces UndefinedTermError)
+undefinedTermVariableError :: Binding
+undefinedTermVariableError = define "UndefinedTermVariableError" $
+  doc "A variable reference to a term name that is not bound in scope" $
+  T.record [
+    "location">:
+      doc "The path to the undefined variable within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the undefined variable" $
+      Core.name]
+
+-- T8. UndefinedTypeVariableInLambdaDomainError
+undefinedTypeVariableInLambdaDomainError :: Binding
+undefinedTypeVariableInLambdaDomainError = define "UndefinedTypeVariableInLambdaDomainError" $
+  doc "A type variable in a lambda domain annotation that is not bound in scope" $
+  T.record [
+    "location">:
+      doc "The path to the lambda within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the undefined type variable" $
+      Core.name]
+
+-- T9. UndefinedTypeVariableInTypeApplicationError
+undefinedTypeVariableInTypeApplicationError :: Binding
+undefinedTypeVariableInTypeApplicationError = define "UndefinedTypeVariableInTypeApplicationError" $
+  doc "A type variable in a type application term that is not bound in scope" $
+  T.record [
+    "location">:
+      doc "The path to the type application within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the undefined type variable" $
+      Core.name]
+
+-- T10. UndefinedTypeVariableInBindingTypeError
+undefinedTypeVariableInBindingTypeError :: Binding
+undefinedTypeVariableInBindingTypeError = define "UndefinedTypeVariableInBindingTypeError" $
+  doc "A type variable in a let binding's type scheme that is not bound by the scheme or enclosing scope" $
+  T.record [
+    "location">:
+      doc "The path to the binding within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the undefined type variable" $
+      Core.name]
+
+-- T11. TermVariableShadowingError (optional)
+termVariableShadowingError :: Binding
+termVariableShadowingError = define "TermVariableShadowingError" $
+  doc "A lambda parameter or let binding name that shadows a variable already in scope (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the shadowing binding within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the shadowed variable" $
+      Core.name]
+
+-- T12. TypeVariableShadowingInTypeLambdaError (optional)
+typeVariableShadowingInTypeLambdaError :: Binding
+typeVariableShadowingInTypeLambdaError = define "TypeVariableShadowingInTypeLambdaError" $
+  doc "A type lambda parameter that shadows a type variable already in scope (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the type lambda within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the shadowed type variable" $
+      Core.name]
+
+-- T13. ConstantConditionError (optional)
+constantConditionError :: Binding
+constantConditionError = define "ConstantConditionError" $
+  doc "An application of ifElse where the condition is a literal boolean, creating a dead branch (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the constant condition within the term" $
+      Paths.subtermPath,
+    "value">:
+      doc "The constant boolean value of the condition" $
+      T.boolean]
+
+-- T14. RedundantWrapUnwrapError (optional)
+redundantWrapUnwrapError :: Binding
+redundantWrapUnwrapError = define "RedundantWrapUnwrapError" $
+  doc "An unwrap elimination applied to a wrap term of the same type, forming a no-op round-trip (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the redundant wrap/unwrap within the term" $
+      Paths.subtermPath,
+    "typeName">:
+      doc "The type name of the wrapper" $
+      Core.name]
+
+-- T15. SelfApplicationError (optional)
+selfApplicationError :: Binding
+selfApplicationError = define "SelfApplicationError" $
+  doc "A variable applied to itself, which is almost always a mistake in Hydra's type system (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the self-application within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the variable applied to itself" $
+      Core.name]
+
+-- T16. UnnecessaryIdentityApplicationError (optional)
+unnecessaryIdentityApplicationError :: Binding
+unnecessaryIdentityApplicationError = define "UnnecessaryIdentityApplicationError" $
+  doc "An application of an identity lambda to an argument, which simplifies to the argument (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the identity application within the term" $
+      Paths.subtermPath]
+
+-- T17. InvalidLambdaParameterNameError (optional)
+invalidLambdaParameterNameError :: Binding
+invalidLambdaParameterNameError = define "InvalidLambdaParameterNameError" $
+  doc "A lambda parameter name that violates naming conventions (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the lambda within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The invalid parameter name" $
+      Core.name]
+
+-- T18. InvalidLetBindingNameError (optional)
+invalidLetBindingNameError :: Binding
+invalidLetBindingNameError = define "InvalidLetBindingNameError" $
+  doc "A let binding name that violates naming conventions (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the binding within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The invalid binding name" $
+      Core.name]
+
+-- T19. InvalidTypeLambdaParameterNameError (optional)
+invalidTypeLambdaParameterNameError :: Binding
+invalidTypeLambdaParameterNameError = define "InvalidTypeLambdaParameterNameError" $
+  doc "A type lambda parameter name that violates naming conventions (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the type lambda within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The invalid type lambda parameter name" $
+      Core.name]
+
+-- T20. NestedTermAnnotationError (optional)
+nestedTermAnnotationError :: Binding
+nestedTermAnnotationError = define "NestedTermAnnotationError" $
+  doc "A term annotation directly wrapping another term annotation; annotations should be merged (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the outer annotation within the term" $
+      Paths.subtermPath]
+
+-- T21. EmptyTermAnnotationError (optional)
+emptyTermAnnotationError :: Binding
+emptyTermAnnotationError = define "EmptyTermAnnotationError" $
+  doc "A term annotation with an empty annotation map (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the empty annotation within the term" $
+      Paths.subtermPath]
+
+-- T22. UnknownPrimitiveNameError
+unknownPrimitiveNameError :: Binding
+unknownPrimitiveNameError = define "UnknownPrimitiveNameError" $
+  doc "A primitive function reference to a name not in the known primitive registry" $
+  T.record [
+    "location">:
+      doc "The path to the primitive reference within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The unknown primitive name" $
+      Core.name]
+
+-- UntypedTermVariableError (replaces UndefinedTypeError)
+untypedTermVariableError :: Binding
+untypedTermVariableError = define "UntypedTermVariableError" $
+  doc "A term variable whose type is not known in the current scope" $
+  T.record [
+    "location">:
+      doc "The path to the untyped variable within the term" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the untyped variable" $
+      Core.name]
+
+-- InvalidTermError: the union of all term validation errors
+invalidTermError :: Binding
+invalidTermError = define "InvalidTermError" $
+  doc "An error indicating that a term is invalid" $
+  T.union [
+    "constantCondition">:
+      doc "An ifElse with a literal boolean condition (optional)" $
+      constantConditionError,
+    "duplicateBinding">:
+      doc "A duplicate binding name in a let expression" $
+      duplicateBindingError,
+    "duplicateField">:
+      doc "A duplicate field name in a record or case statement" $
+      duplicateFieldError,
+    "emptyCaseStatement">:
+      doc "A case statement with no cases and no default (optional)" $
+      emptyCaseStatementError,
+    "emptyLetBindings">:
+      doc "A let expression with no bindings (optional)" $
+      emptyLetBindingsError,
+    "emptyTermAnnotation">:
+      doc "A term annotation with an empty annotation map (optional)" $
+      emptyTermAnnotationError,
+    "emptyTypeNameInTerm">:
+      doc "A term with an empty type name (optional)" $
+      emptyTypeNameInTermError,
+    "invalidLambdaParameterName">:
+      doc "A lambda parameter name violating naming conventions (optional)" $
+      invalidLambdaParameterNameError,
+    "invalidLetBindingName">:
+      doc "A let binding name violating naming conventions (optional)" $
+      invalidLetBindingNameError,
+    "invalidTypeLambdaParameterName">:
+      doc "A type lambda parameter name violating naming conventions (optional)" $
+      invalidTypeLambdaParameterNameError,
+    "nestedTermAnnotation">:
+      doc "Nested term annotations that should be merged (optional)" $
+      nestedTermAnnotationError,
+    "redundantWrapUnwrap">:
+      doc "A no-op unwrap-of-wrap round-trip (optional)" $
+      redundantWrapUnwrapError,
+    "selfApplication">:
+      doc "A variable applied to itself (optional)" $
+      selfApplicationError,
+    "termVariableShadowing">:
+      doc "A binding that shadows a variable already in scope (optional)" $
+      termVariableShadowingError,
+    "typeVariableShadowingInTypeLambda">:
+      doc "A type lambda parameter that shadows a type variable in scope (optional)" $
+      typeVariableShadowingInTypeLambdaError,
+    "undefinedTermVariable">:
+      doc "A variable reference to an unbound term name" $
+      undefinedTermVariableError,
+    "undefinedTypeVariableInBindingType">:
+      doc "An unbound type variable in a let binding's type scheme" $
+      undefinedTypeVariableInBindingTypeError,
+    "undefinedTypeVariableInLambdaDomain">:
+      doc "An unbound type variable in a lambda domain annotation" $
+      undefinedTypeVariableInLambdaDomainError,
+    "undefinedTypeVariableInTypeApplication">:
+      doc "An unbound type variable in a type application term" $
+      undefinedTypeVariableInTypeApplicationError,
+    "unknownPrimitiveName">:
+      doc "A reference to an unknown primitive function" $
+      unknownPrimitiveNameError,
+    "unnecessaryIdentityApplication">:
+      doc "An identity lambda applied to an argument (optional)" $
+      unnecessaryIdentityApplicationError,
+    "untypedTermVariable">:
+      doc "A term variable whose type is not known" $
+      untypedTermVariableError]
+
+-- ============================================================================
+-- Type validation errors
+-- ============================================================================
+
+-- Y1. EmptyRecordTypeError (optional)
+emptyRecordTypeError :: Binding
+emptyRecordTypeError = define "EmptyRecordTypeError" $
+  doc "A record type with no fields; TypeUnit is preferred for the unit-like case (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the empty record type" $
+      Paths.subtermPath]
+
+-- Y2. EmptyUnionTypeError (optional)
+emptyUnionTypeError :: Binding
+emptyUnionTypeError = define "EmptyUnionTypeError" $
+  doc "A union type with no alternatives; TypeVoid is preferred (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the empty union type" $
+      Paths.subtermPath]
+
+-- Y3. SingleVariantUnionError (optional)
+singleVariantUnionError :: Binding
+singleVariantUnionError = define "SingleVariantUnionError" $
+  doc "A union type with exactly one field; could be a wrapped type or record instead (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the single-variant union type" $
+      Paths.subtermPath,
+    "fieldName">:
+      doc "The name of the single field" $
+      Core.name]
+
+-- Y4. DuplicateRecordTypeFieldNamesError
+duplicateRecordTypeFieldNamesError :: Binding
+duplicateRecordTypeFieldNamesError = define "DuplicateRecordTypeFieldNamesError" $
+  doc "A record type with duplicate field names" $
+  T.record [
+    "location">:
+      doc "The path to the record type with duplicate fields" $
+      Paths.subtermPath,
+    "name">:
+      doc "The duplicated field name" $
+      Core.name]
+
+-- Y5. DuplicateUnionTypeFieldNamesError
+duplicateUnionTypeFieldNamesError :: Binding
+duplicateUnionTypeFieldNamesError = define "DuplicateUnionTypeFieldNamesError" $
+  doc "A union type with duplicate field names" $
+  T.record [
+    "location">:
+      doc "The path to the union type with duplicate fields" $
+      Paths.subtermPath,
+    "name">:
+      doc "The duplicated field name" $
+      Core.name]
+
+-- Y6. UndefinedTypeVariableError
+undefinedTypeVariableError :: Binding
+undefinedTypeVariableError = define "UndefinedTypeVariableError" $
+  doc "A type variable reference to a name that is not bound in scope" $
+  T.record [
+    "location">:
+      doc "The path to the undefined type variable" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the undefined type variable" $
+      Core.name]
+
+-- Y7. TypeVariableShadowingInForallError (optional)
+typeVariableShadowingInForallError :: Binding
+typeVariableShadowingInForallError = define "TypeVariableShadowingInForallError" $
+  doc "A forall type parameter that shadows a type variable already in scope (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the shadowing forall type" $
+      Paths.subtermPath,
+    "name">:
+      doc "The name of the shadowed type variable" $
+      Core.name]
+
+-- Y8. NestedTypeAnnotationError (optional)
+nestedTypeAnnotationError :: Binding
+nestedTypeAnnotationError = define "NestedTypeAnnotationError" $
+  doc "A type annotation directly wrapping another type annotation; annotations should be merged (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the outer annotation" $
+      Paths.subtermPath]
+
+-- Y9. EmptyTypeAnnotationError (optional)
+emptyTypeAnnotationError :: Binding
+emptyTypeAnnotationError = define "EmptyTypeAnnotationError" $
+  doc "A type annotation with an empty annotation map (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the empty annotation" $
+      Paths.subtermPath]
+
+-- Y10. VoidInNonBottomPositionError (optional)
+voidInNonBottomPositionError :: Binding
+voidInNonBottomPositionError = define "VoidInNonBottomPositionError" $
+  doc "TypeVoid appearing in a position where no value can be constructed, such as a record field, list element, map key/value, set element, pair component, or function codomain (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the void type in a non-bottom position" $
+      Paths.subtermPath]
+
+-- Y11. NonComparableMapKeyTypeError
+nonComparableMapKeyTypeError :: Binding
+nonComparableMapKeyTypeError = define "NonComparableMapKeyTypeError" $
+  doc "A map type whose key type is or directly contains a function type, which cannot be compared for equality" $
+  T.record [
+    "location">:
+      doc "The path to the map type" $
+      Paths.subtermPath,
+    "keyType">:
+      doc "The non-comparable key type" $
+      Core.type_]
+
+-- Y12. NonComparableSetElementTypeError
+nonComparableSetElementTypeError :: Binding
+nonComparableSetElementTypeError = define "NonComparableSetElementTypeError" $
+  doc "A set type whose element type is or directly contains a function type, which cannot be compared for equality" $
+  T.record [
+    "location">:
+      doc "The path to the set type" $
+      Paths.subtermPath,
+    "elementType">:
+      doc "The non-comparable element type" $
+      Core.type_]
+
+-- Y13. InvalidForallParameterNameError (optional)
+invalidForallParameterNameError :: Binding
+invalidForallParameterNameError = define "InvalidForallParameterNameError" $
+  doc "A forall type parameter name that violates type variable naming conventions (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the forall type" $
+      Paths.subtermPath,
+    "name">:
+      doc "The invalid parameter name" $
+      Core.name]
+
+-- Y14. InvalidTypeSchemeVariableNameError (optional)
+invalidTypeSchemeVariableNameError :: Binding
+invalidTypeSchemeVariableNameError = define "InvalidTypeSchemeVariableNameError" $
+  doc "A type scheme variable name that violates type variable naming conventions (optional)" $
+  T.record [
+    "location">:
+      doc "The path to the type scheme" $
+      Paths.subtermPath,
+    "name">:
+      doc "The invalid variable name" $
+      Core.name]
+
+-- InvalidTypeError: the union of all type validation errors
+invalidTypeError :: Binding
+invalidTypeError = define "InvalidTypeError" $
+  doc "An error indicating that a type is invalid" $
+  T.union [
+    "duplicateRecordTypeFieldNames">:
+      doc "A record type with duplicate field names" $
+      duplicateRecordTypeFieldNamesError,
+    "duplicateUnionTypeFieldNames">:
+      doc "A union type with duplicate field names" $
+      duplicateUnionTypeFieldNamesError,
+    "emptyRecordType">:
+      doc "A record type with no fields (optional)" $
+      emptyRecordTypeError,
+    "emptyTypeAnnotation">:
+      doc "A type annotation with an empty annotation map (optional)" $
+      emptyTypeAnnotationError,
+    "emptyUnionType">:
+      doc "A union type with no alternatives (optional)" $
+      emptyUnionTypeError,
+    "invalidForallParameterName">:
+      doc "A forall parameter name violating naming conventions (optional)" $
+      invalidForallParameterNameError,
+    "invalidTypeSchemeVariableName">:
+      doc "A type scheme variable name violating naming conventions (optional)" $
+      invalidTypeSchemeVariableNameError,
+    "nestedTypeAnnotation">:
+      doc "Nested type annotations that should be merged (optional)" $
+      nestedTypeAnnotationError,
+    "nonComparableMapKeyType">:
+      doc "A map with a non-comparable key type" $
+      nonComparableMapKeyTypeError,
+    "nonComparableSetElementType">:
+      doc "A set with a non-comparable element type" $
+      nonComparableSetElementTypeError,
+    "singleVariantUnion">:
+      doc "A union type with only one variant (optional)" $
+      singleVariantUnionError,
+    "typeVariableShadowingInForall">:
+      doc "A forall parameter that shadows a type variable in scope (optional)" $
+      typeVariableShadowingInForallError,
+    "undefinedTypeVariable">:
+      doc "A type variable reference to an unbound name" $
+      undefinedTypeVariableError,
+    "voidInNonBottomPosition">:
+      doc "TypeVoid in a position where no value can be constructed (optional)" $
+      voidInNonBottomPositionError]
+
+-- ============================================================================
+-- Deferred term checks (require more than O(1) analysis)
+-- ============================================================================
+
+-- T-D1. UnusedLetBindingError (optional)
+--   Requires free-variable computation over the let body and sibling bindings.
+
+-- T-D2. EmptyCollectionFoldError (optional)
+--   Requires recognizing primitive fold application patterns across the
+--   application spine (variable number of curried arguments).
+
+-- T-D3. DeeplyNestedApplicationError (optional)
+--   Requires depth tracking across chains of application terms.
+
+-- ============================================================================
+-- Deferred type checks (require more than O(1) analysis)
+-- ============================================================================
+
+-- Y-D1. UnusedForallTypeVariableError (optional)
+--   Requires free type variable computation over the forall body.
+
+-- Y-D2. NonCanonicalTypeFormError (optional)
+--   Requires recognizing beta-reducible type applications (type-level lambda
+--   applied to an argument).
+
+-- Y-D3. ExcessiveTypeNestingError (optional)
+--   Requires depth tracking across chains of function, application, or
+--   forall types.
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Packaging.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Error/Packaging.hs
@@ -0,0 +1,115 @@
+module Hydra.Sources.Kernel.Types.Error.Packaging where
+
+import           Hydra.Kernel
+import           Hydra.Dsl.Annotations (doc)
+import           Hydra.Dsl.Bootstrap
+import           Hydra.Dsl.Types ((>:))
+import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Core as Core
+import qualified Hydra.Sources.Kernel.Types.Module as Module
+
+
+ns :: Namespace
+ns = Namespace "hydra.error.packaging"
+
+define :: String -> Type -> Binding
+define = defineType ns
+
+module_ :: Module
+module_ = Module ns (map toTypeDef elements) [Core.ns, Module.ns] [Core.ns, Module.ns] $
+    Just "Error types for module and package validation"
+  where
+    elements = [
+      conflictingModuleNamespaceError,
+      conflictingVariantNameError,
+      definitionNotInModuleNamespaceError,
+      duplicateDefinitionNameError,
+      duplicateModuleNamespaceError,
+      invalidModuleError,
+      invalidPackageError]
+
+conflictingModuleNamespaceError :: Binding
+conflictingModuleNamespaceError = define "ConflictingModuleNamespaceError" $
+  doc "A module namespace which, when mapped to a target language's directory or package structure, conflicts with another module's mapped namespace. For example, hydra.foo.bar and hydra.fooBar might both map to the same directory in a case-insensitive filesystem." $
+  T.record [
+    "first">:
+      doc "The first module namespace" $
+      Module.namespace,
+    "second">:
+      doc "The second module namespace that conflicts with the first" $
+      Module.namespace]
+
+conflictingVariantNameError :: Binding
+conflictingVariantNameError = define "ConflictingVariantNameError" $
+  doc "A union type variant name which, when capitalized and concatenated with its type name, conflicts with another type definition name. For example, a union type Foo with a variant bar produces FooBar, which conflicts with an existing type definition FooBar. This is currently a problem only for the Haskell target." $
+  T.record [
+    "namespace">:
+      doc "The namespace of the module containing the conflict" $
+      Module.namespace,
+    "typeName">:
+      doc "The name of the union type" $
+      Core.name,
+    "variantName">:
+      doc "The name of the variant field causing the conflict" $
+      Core.name,
+    "conflictingName">:
+      doc "The name of the other type definition that conflicts with the generated constructor name" $
+      Core.name]
+
+definitionNotInModuleNamespaceError :: Binding
+definitionNotInModuleNamespaceError = define "DefinitionNotInModuleNamespaceError" $
+  doc "A definition whose name does not have the module's namespace as a prefix. If the module namespace is foo.bar, all definition names must have the form foo.bar.quux." $
+  T.record [
+    "namespace">:
+      doc "The namespace of the module" $
+      Module.namespace,
+    "name">:
+      doc "The definition name that does not match the module namespace" $
+      Core.name]
+
+duplicateDefinitionNameError :: Binding
+duplicateDefinitionNameError = define "DuplicateDefinitionNameError" $
+  doc "Two or more definitions in the same module share the same name" $
+  T.record [
+    "namespace">:
+      doc "The namespace of the module containing the duplicates" $
+      Module.namespace,
+    "name">:
+      doc "The duplicated definition name" $
+      Core.name]
+
+duplicateModuleNamespaceError :: Binding
+duplicateModuleNamespaceError = define "DuplicateModuleNamespaceError" $
+  doc "Two or more modules in the same package share the same namespace" $
+  T.record [
+    "namespace">:
+      doc "The duplicated module namespace" $
+      Module.namespace]
+
+invalidModuleError :: Binding
+invalidModuleError = define "InvalidModuleError" $
+  doc "An error indicating that a module is invalid" $
+  T.union [
+    "conflictingVariantName">:
+      doc "A union variant name that conflicts with another type definition when mapped to a target language" $
+      conflictingVariantNameError,
+    "definitionNotInModuleNamespace">:
+      doc "A definition whose name does not have the module's namespace as a prefix" $
+      definitionNotInModuleNamespaceError,
+    "duplicateDefinitionName">:
+      doc "Two or more definitions in the same module share the same name" $
+      duplicateDefinitionNameError]
+
+invalidPackageError :: Binding
+invalidPackageError = define "InvalidPackageError" $
+  doc "An error indicating that a package is invalid" $
+  T.union [
+    "conflictingModuleNamespace">:
+      doc "Two module namespaces that conflict when mapped to a target language" $
+      conflictingModuleNamespaceError,
+    "duplicateModuleNamespace">:
+      doc "Two or more modules in the same package share the same namespace" $
+      duplicateModuleNamespaceError,
+    "invalidModule">:
+      doc "A module within the package is invalid" $
+      invalidModuleError]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Errors.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Errors.hs
@@ -0,0 +1,94 @@
+module Hydra.Sources.Kernel.Types.Errors where
+
+import           Hydra.Kernel
+import           Hydra.Dsl.Annotations (doc)
+import           Hydra.Dsl.Bootstrap
+import           Hydra.Dsl.Types ((>:))
+import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Context as Context
+import qualified Hydra.Sources.Kernel.Types.Core as Core
+import qualified Hydra.Sources.Kernel.Types.Error.Checking as ErrorsChecking
+import qualified Hydra.Sources.Kernel.Types.Error.Core as ErrorsCore
+import qualified Hydra.Sources.Kernel.Types.Typing as Typing
+import qualified Hydra.Sources.Kernel.Types.Variants as Variants
+
+
+ns :: Namespace
+ns = Namespace "hydra.errors"
+
+define :: String -> Type -> Binding
+define = defineType ns
+
+module_ :: Module
+module_ = Module ns (map toTypeDef elements)
+    [Context.ns, Core.ns, ErrorsChecking.ns, ErrorsCore.ns, Typing.ns, Variants.ns]
+    [Context.ns, Core.ns, ErrorsChecking.ns, ErrorsCore.ns, Typing.ns, Variants.ns] $
+    Just "Top-level error types for the Hydra kernel"
+  where
+    elements = [
+      decodingError,
+      error_,
+      otherError,
+      unificationError]
+
+error_ :: Binding
+error_ = define "Error" $
+  doc "An error of any kind, with kernel errors particularly differentiated" $
+  T.union [
+    "checking">:
+      doc "A type checking error" $
+      ErrorsChecking.checkingError,
+    "decoding">:
+      doc "An error that occurred during decoding of a term" $
+      decodingError,
+    "duplicateBinding">:
+      doc "A duplicate binding name error" $
+      ErrorsCore.duplicateBindingError,
+    "duplicateField">:
+      doc "A duplicate field name error" $
+      ErrorsCore.duplicateFieldError,
+    "other">:
+      doc "Any other error" $
+      otherError,
+    "undefinedField">:
+      doc "A reference to an undefined field" $
+      ErrorsCore.undefinedFieldError,
+    "undefinedTermVariable">:
+      doc "A reference to an undefined term variable" $
+      ErrorsCore.undefinedTermVariableError,
+    "untypedTermVariable">:
+      doc "A term variable whose type is not known" $
+      ErrorsCore.untypedTermVariableError,
+    "unexpectedTermVariant">:
+      doc "An unexpected term variant" $
+      ErrorsCore.unexpectedTermVariantError,
+    "unexpectedTypeVariant">:
+      doc "An unexpected type variant" $
+      ErrorsCore.unexpectedTypeVariantError,
+    "unification">:
+      doc "A type unification error" $
+      unificationError]
+
+decodingError :: Binding
+decodingError = define "DecodingError" $
+  doc "An error that occurred during decoding of a term" $
+  T.wrap T.string
+
+otherError :: Binding
+otherError = define "OtherError" $
+  doc "Any other error" $
+  T.wrap T.string
+
+unificationError :: Binding
+unificationError = define "UnificationError" $
+  doc "An error that occurred during type unification" $
+  T.record [
+    "leftType">:
+      doc "The left-hand type in the unification" $
+      Core.type_,
+    "rightType">:
+      doc "The right-hand type in the unification" $
+      Core.type_,
+    "message">:
+      doc "A human-readable error message" $
+      T.string]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Grammar.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Grammar.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Grammar.hs
+++ /dev/null
@@ -1,117 +0,0 @@
--- | A model for Hydra labeled-BNF grammars
-
-module Hydra.Sources.Kernel.Types.Grammar where
-
--- Standard type-level kernel imports
-import           Hydra.Kernel
-import           Hydra.Dsl.Annotations (doc)
-import           Hydra.Dsl.Bootstrap
-import           Hydra.Dsl.Types ((>:), (@@), (~>))
-import qualified Hydra.Dsl.Types as T
-import qualified Hydra.Sources.Kernel.Types.Core as Core
-
-
-ns :: Namespace
-ns = Namespace "hydra.grammar"
-
-define :: String -> Type -> Binding
-define = defineType ns
-
-module_ :: Module
-module_ = Module ns elements [] [Core.ns] $
-    Just "A common API for BNF-based grammars, specifying context-free languages"
-  where
-    elements = [
-      constant,
-      grammar,
-      label,
-      labeledPattern,
-      pattern,
-      production,
-      regex,
-      symbol]
-
-constant :: Binding
-constant = define "Constant" $
-  doc "A constant pattern" $
-  T.wrap T.string
-
-grammar :: Binding
-grammar = define "Grammar" $
-  doc "An enhanced Backus-Naur form (BNF) grammar" $
-  T.wrap $ T.list production
-
-label :: Binding
-label = define "Label" $
-  doc "A name for a pattern" $
-  T.wrap T.string
-
-labeledPattern :: Binding
-labeledPattern = define "LabeledPattern" $
-  doc "A pattern together with a name (label)" $
-  T.record [
-    "label">:
-      doc "The label for the pattern"
-      label,
-    "pattern">:
-      doc "The pattern being labeled"
-      pattern]
-
-pattern :: Binding
-pattern = define "Pattern" $
-  doc "A pattern which matches valid expressions in the language" $
-  T.union [
-    "alternatives">:
-      doc "A choice between alternative patterns" $
-      T.list pattern,
-    "constant">:
-      doc "A constant (terminal) pattern"
-      constant,
-    "ignored">:
-      doc "A pattern to be ignored (not captured)"
-      pattern,
-    "labeled">:
-      doc "A labeled pattern"
-      labeledPattern,
-    "nil">:
-      doc "An empty pattern" $
-      T.unit,
-    "nonterminal">:
-      doc "A nonterminal symbol reference"
-      symbol,
-    "option">:
-      doc "An optional pattern (zero or one occurrence)"
-      pattern,
-    "plus">:
-      doc "One or more occurrences of a pattern"
-      pattern,
-    "regex">:
-      doc "A regular expression pattern"
-      regex,
-    "sequence">:
-      doc "A sequence of patterns" $
-      T.list pattern,
-    "star">:
-      doc "Zero or more occurrences of a pattern"
-      pattern]
-
-production :: Binding
-production = define "Production" $
-  doc "A BNF production" $
-  T.record [
-    "symbol">:
-      doc "The nonterminal symbol being defined"
-      symbol,
-    "pattern">:
-      doc "The pattern which defines the symbol"
-      pattern]
-
-regex :: Binding
-regex = define "Regex" $
-  doc "A regular expression" $
-  T.wrap T.string
-
-symbol :: Binding
-symbol = define "Symbol" $
-  doc "A nonterminal symbol" $
-  T.wrap T.string
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Graph.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Graph.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Graph.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Graph.hs
@@ -6,8 +6,9 @@
 import           Hydra.Dsl.Bootstrap
 import           Hydra.Dsl.Types ((>:), (@@), (~>))
 import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Context as Context
 import qualified Hydra.Sources.Kernel.Types.Core as Core
-import qualified Hydra.Sources.Kernel.Types.Compute as Compute
+import qualified Hydra.Sources.Kernel.Types.Errors as Error
 
 
 ns :: Namespace
@@ -17,7 +18,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Compute.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Context.ns, Core.ns, Error.ns] [Context.ns, Core.ns, Error.ns] $
     Just "The extension to graphs of Hydra's core type system (hydra.core)"
   where
     elements = [
@@ -27,30 +28,37 @@
 
 graph :: Binding
 graph = define "Graph" $
-  doc "A graph, or set of name/term bindings together with parameters (annotations, primitives) and a schema graph" $
+  doc "A graph, or lexical environment which binds names to terms, types, primitives, and metadata" $
   T.record [
-    "elements">:
-      doc "All of the elements in the graph" $
-      T.list Core.binding,
-    "environment">:
-      doc "The lambda environment of this graph context; it indicates whether a variable is bound by a lambda (Nothing) or a let (Just term)" $
-      T.map Core.name (T.maybe Core.term),
-    "types">:
-      doc "The typing environment of the graph" $
+    "boundTerms">:
+      doc "The terms bound by all term variables in scope" $
+      T.map Core.name Core.term,
+    "boundTypes">:
+      doc "The type schemes of all term variables in scope" $
       T.map Core.name Core.typeScheme,
-    "body">:
-      doc "The body of the term which generated this context"
-      Core.term,
+    "classConstraints">:
+      doc ("A mutable map from type variable names to their accumulated class constraints."
+        ++ " This is populated during type inference when operations requiring Eq or Ord are encountered.") $
+      T.map Core.name Core.typeVariableMetadata,
+    "lambdaVariables">:
+      doc "The set of term variables introduced by specifically by lambdas" $
+      T.set Core.name,
+    "metadata">:
+      doc "Any additional metadata bound to term variables in scope" $
+      T.map Core.name Core.term,
     "primitives">:
-      doc "All supported primitive constants and functions, by name" $
+      doc "All primitive functions and constants by name" $
       T.map Core.name primitive,
-    "schema">:
-      doc "The schema of this graph. If this parameter is omitted (nothing), the graph is its own schema graph." $
-      T.maybe graph]
+    "schemaTypes">:
+      doc "All schema types (type schemes) in scope" $
+      T.map Core.name Core.typeScheme,
+    "typeVariables">:
+      doc "The set of type variables introduced specifically by type lambdas" $
+      T.set Core.name]
 
 primitive :: Binding
 primitive = define "Primitive" $
-  doc "A built-in function" $
+  doc "A built-in function or constant" $
   T.record [
     "name">:
       doc "The unique name of the primitive function"
@@ -59,16 +67,23 @@
       doc "The type signature of the primitive function"
       Core.typeScheme,
     "implementation">:
-      doc "A concrete implementation of the primitive function" $
-      T.list Core.term ~> Compute.flow @@ graph @@ Core.term]
+      doc ("A concrete implementation of the primitive function."
+        ++ " The Context and Graph parameters are needed by higher-order primitives"
+        ++ " (e.g. lists.map, lists.foldl, eithers.bind) which must evaluate function arguments"
+        ++ " via term reduction; the Graph provides variable and primitive bindings,"
+        ++ " while the Context supports tracing and error reporting.") $
+      Context.context ~> graph ~> T.list Core.term ~> T.either_ (Context.inContext @@ Error.error_) Core.term]
 
 termCoder :: Binding
 termCoder = define "TermCoder" $
-  doc "A type together with a coder for mapping terms into arguments for primitive functions, and mapping computed results into terms" $
+  doc "A type together with a coder for mapping terms into arguments for primitive functions, and mapping computed results into terms." $
   T.forAll "a" $ T.record [
     "type">:
       doc "The Hydra type of encoded terms"
       Core.type_,
-    "coder">:
-      doc "A coder between Hydra terms and instances of the given type" $
-      Compute.coder @@ graph @@ graph @@ Core.term @@ "a"]
+    "encode">:
+      doc "An encode function from terms to native values" $
+      Context.context ~> graph ~> Core.term ~> T.either_ (Context.inContext @@ Error.error_) "a",
+    "decode">:
+      doc "A decode function from native values to terms" $
+      Context.context ~> "a" ~> T.either_ (Context.inContext @@ Error.error_) Core.term]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Module.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Module.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Module.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Module.hs
@@ -17,7 +17,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Graph.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Graph.ns] [Core.ns] $
     Just "A model for Hydra namespaces and modules"
   where
     elements = [
@@ -68,9 +68,9 @@
     "namespace">:
       doc "A common prefix for all element names in the module"
       namespace,
-    "elements">:
-      doc "The elements defined in this module" $
-      T.list Core.binding,
+    "definitions">:
+      doc "The definitions in this module" $
+      T.list definition,
     "termDependencies">:
       doc "Any modules which the term expressions of this module directly depend upon" $
       T.list namespace,
@@ -119,8 +119,8 @@
       doc "The term being defined"
       Core.term,
     "type">:
-      doc "The type scheme of the term, including any class constraints"
-      Core.typeScheme]
+      doc "The type scheme of the term, including any class constraints" $
+      T.maybe Core.typeScheme]
 
 typeDefinition :: Binding
 typeDefinition = define "TypeDefinition" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Packaging.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Packaging.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Packaging.hs
@@ -0,0 +1,46 @@
+module Hydra.Sources.Kernel.Types.Packaging where
+
+-- Standard type-level kernel imports
+import           Hydra.Kernel
+import           Hydra.Dsl.Annotations (doc)
+import           Hydra.Dsl.Bootstrap
+import           Hydra.Dsl.Types ((>:))
+import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Module as Module
+
+
+ns :: Namespace
+ns = Namespace "hydra.packaging"
+
+define :: String -> Type -> Binding
+define = defineType ns
+
+module_ :: Module
+module_ = Module ns (map toTypeDef elements) [Module.ns] [] $
+    Just "A model for Hydra packages"
+  where
+    elements = [
+      package,
+      packageName]
+
+package :: Binding
+package = define "Package" $
+  doc "A package, which is a named collection of modules with metadata and dependencies" $
+  T.record [
+    "name">:
+      doc "The name of the package"
+      packageName,
+    "modules">:
+      doc "The modules in this package" $
+      T.list Module.module',
+    "dependencies">:
+      doc "The packages which this package depends on" $
+      T.list packageName,
+    "description">:
+      doc "An optional human-readable description of the package" $
+      T.maybe T.string]
+
+packageName :: Binding
+packageName = define "PackageName" $
+  doc "The unique name of a package, e.g. \"hydra-kernel\" or \"hydra-python\"" $
+  T.wrap T.string
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Parsing.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Parsing.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Parsing.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Parsing.hs
@@ -16,7 +16,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [] [Core.ns] $
     Just "Parser combinator types for text parsing"
   where
     elements = [
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Paths.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Paths.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Paths.hs
@@ -0,0 +1,248 @@
+module Hydra.Sources.Kernel.Types.Paths where
+
+-- Standard type-level kernel imports
+import           Hydra.Kernel
+import           Hydra.Dsl.Annotations (doc)
+import           Hydra.Dsl.Bootstrap
+import           Hydra.Dsl.Types ((>:), (@@), (~>))
+import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Core as Core
+
+
+ns :: Namespace
+ns = Namespace "hydra.paths"
+
+define :: String -> Type -> Binding
+define = defineType ns
+
+module_ :: Module
+module_ = Module ns (map toTypeDef elements) [Core.ns] [Core.ns] $
+    Just "A model for subterm and subtype access patterns"
+  where
+    elements = [
+      subtermEdge,
+      subtermGraph,
+      subtermNode,
+      subtermPath,
+      subtermStep,
+      subtypeEdge,
+      subtypeGraph,
+      subtypeNode,
+      subtypePath,
+      subtypeStep]
+
+-- Subterm types
+
+subtermEdge :: Binding
+subtermEdge = define "SubtermEdge" $
+  doc "An edge in a subterm graph, connecting two nodes via a path" $
+  T.record [
+    "source">:
+      doc "The source node of the edge"
+      subtermNode,
+    "path">:
+      doc "The subterm path connecting source to target"
+      subtermPath,
+    "target">:
+      doc "The target node of the edge"
+      subtermNode]
+
+subtermGraph :: Binding
+subtermGraph = define "SubtermGraph" $
+  doc "A graph of subterm nodes and edges, representing term access patterns" $
+  T.record [
+    "nodes">:
+      doc "All nodes in the graph" $
+      T.list subtermNode,
+    "edges">:
+      doc "All edges in the graph" $
+      T.list subtermEdge]
+
+subtermNode :: Binding
+subtermNode = define "SubtermNode" $
+  doc "A node in a subterm graph, representing a term or subterm" $
+  T.record [
+    "name">:
+      doc "The qualified name of the term"
+      Core.name,
+    "label">:
+      doc "A human-readable label for the node"
+      T.string,
+    "id" >:
+      doc "A unique identifier for the node"
+      T.string]
+
+subtermPath :: Binding
+subtermPath = define "SubtermPath" $
+  doc "A sequence of subterm steps forming a path through a term" $
+  T.wrap $ T.list subtermStep
+
+subtermStep :: Binding
+subtermStep = define "SubtermStep" $
+  doc "A function which maps from a term to a particular immediate subterm" $
+  T.union [
+    "annotatedBody">:
+      doc "Access the body of an annotated term"
+      T.unit,
+    "applicationFunction">:
+      doc "Access the function of an application term"
+      T.unit,
+    "applicationArgument">:
+      doc "Access the argument of an application term"
+      T.unit,
+    "lambdaBody">:
+      doc "Access the body of a lambda term"
+      T.unit,
+    "unionCasesDefault">:
+      doc "Access the default case of a union elimination"
+      T.unit,
+    "unionCasesBranch">:
+      doc "Access a specific branch of a union elimination by field name"
+      Core.name,
+    "letBody">:
+      doc "Access the body of a let term"
+      T.unit,
+    "letBinding">:
+      doc "Access a specific binding in a let term by variable name"
+      Core.name,
+    "listElement">:
+      doc "Access an element of a list by index"
+      T.int32,
+    "mapKey">:
+      doc "Access a key in a map by index"
+      T.int32,
+    "mapValue">:
+      doc "Access a value in a map by index"
+      T.int32,
+    "maybeTerm">:
+      doc "Access the term inside a Just value"
+      T.unit,
+    "productTerm">:
+      doc "Access an element of a product (tuple) by index"
+      T.int32,
+    "recordField">:
+      doc "Access a field of a record by field name"
+      Core.name,
+    "setElement">:
+      doc "Access an element of a set by index"
+      T.int32,
+    "sumTerm">:
+      doc "Access the term inside a sum variant"
+      T.unit,
+    "typeLambdaBody">:
+      doc "Access the body of a type lambda term"
+      T.unit,
+    "typeApplicationTerm">:
+      doc "Access the term being applied to a type"
+      T.unit,
+    "injectionTerm">:
+      doc "Access the term inside a union injection"
+      T.unit,
+    "wrappedTerm">:
+      doc "Access the term inside a wrapped term"
+      T.unit]
+
+-- Subtype types
+
+subtypeEdge :: Binding
+subtypeEdge = define "SubtypeEdge" $
+  doc "An edge in a subtype graph, connecting two nodes via a path" $
+  T.record [
+    "source">:
+      doc "The source node of the edge"
+      subtypeNode,
+    "path">:
+      doc "The subtype path connecting source to target"
+      subtypePath,
+    "target">:
+      doc "The target node of the edge"
+      subtypeNode]
+
+subtypeGraph :: Binding
+subtypeGraph = define "SubtypeGraph" $
+  doc "A graph of subtype nodes and edges, representing type access patterns" $
+  T.record [
+    "nodes">:
+      doc "All nodes in the graph" $
+      T.list subtypeNode,
+    "edges">:
+      doc "All edges in the graph" $
+      T.list subtypeEdge]
+
+subtypeNode :: Binding
+subtypeNode = define "SubtypeNode" $
+  doc "A node in a subtype graph, representing a type or subtype" $
+  T.record [
+    "name">:
+      doc "The qualified name of the type"
+      Core.name,
+    "label">:
+      doc "A human-readable label for the node"
+      T.string,
+    "id" >:
+      doc "A unique identifier for the node"
+      T.string]
+
+subtypePath :: Binding
+subtypePath = define "SubtypePath" $
+  doc "A sequence of subtype steps forming a path through a type" $
+  T.wrap $ T.list subtypeStep
+
+subtypeStep :: Binding
+subtypeStep = define "SubtypeStep" $
+  doc "A function which maps from a type to a particular immediate subtype" $
+  T.union [
+    "annotatedBody">:
+      doc "Access the body of an annotated type"
+      T.unit,
+    "applicationFunction">:
+      doc "Access the function of an application type"
+      T.unit,
+    "applicationArgument">:
+      doc "Access the argument of an application type"
+      T.unit,
+    "eitherLeft">:
+      doc "Access the left type of an either type"
+      T.unit,
+    "eitherRight">:
+      doc "Access the right type of an either type"
+      T.unit,
+    "forallBody">:
+      doc "Access the body of a universally quantified type"
+      T.unit,
+    "functionDomain">:
+      doc "Access the domain type of a function type"
+      T.unit,
+    "functionCodomain">:
+      doc "Access the codomain type of a function type"
+      T.unit,
+    "listElement">:
+      doc "Access the element type of a list type"
+      T.unit,
+    "mapKeys">:
+      doc "Access the key type of a map type"
+      T.unit,
+    "mapValues">:
+      doc "Access the value type of a map type"
+      T.unit,
+    "maybeElement">:
+      doc "Access the element type of an optional type"
+      T.unit,
+    "pairFirst">:
+      doc "Access the first type of a pair type"
+      T.unit,
+    "pairSecond">:
+      doc "Access the second type of a pair type"
+      T.unit,
+    "recordField">:
+      doc "Access a field type of a record type by field name"
+      Core.name,
+    "setElement">:
+      doc "Access the element type of a set type"
+      T.unit,
+    "unionField">:
+      doc "Access a field type of a union type by field name"
+      Core.name,
+    "wrappedType">:
+      doc "Access the type inside a wrapped type"
+      T.unit]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Phantoms.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Phantoms.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Phantoms.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Phantoms.hs
@@ -16,7 +16,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Core.ns] [Core.ns] $
     Just "Phantom types for use with Hydra DSLs"
   where
     elements = [
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Query.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Query.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Query.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Query.hs
@@ -16,7 +16,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Core.ns] [Core.ns] $
     Just "A model for language-agnostic graph pattern queries"
   where
     elements = [
@@ -25,7 +25,9 @@
       graphPattern,
       node,
       path,
+      pathEquation,
       pattern,
+      patternImplication,
       query,
       range,
       regexQuantifier,
@@ -90,6 +92,28 @@
     "inverse">:
       doc "A path given by the inverse of another path"
       path]
+
+pathEquation :: Binding
+pathEquation = define "PathEquation" $
+  doc "A declared equivalence between two abstract paths in a graph" $
+  T.record [
+    "left">:
+      doc "The left-hand side of the equation"
+      path,
+    "right">:
+      doc "The right-hand side of the equation"
+      path]
+
+patternImplication :: Binding
+patternImplication = define "PatternImplication" $
+  doc "A pattern which, if it matches in a given graph, implies that another pattern must also match. Query variables are shared between the two patterns." $
+  T.record [
+    "antecedent">:
+      doc "The pattern which, if it matches, triggers the constraint"
+      pattern,
+    "consequent">:
+      doc "The pattern which must also match when the antecedent matches"
+      pattern]
 
 pattern :: Binding
 pattern = define "Pattern" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Relational.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Relational.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Relational.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Relational.hs
@@ -17,7 +17,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [] [Core.ns] $
     Just ("An interpretation of Codd's Relational Model, " ++
       "as described in 'A Relational Model of Data for Large Shared Data Banks' (1970). " ++
       "Types ('domains') and values are parameterized so as to allow for application-specific implementations. " ++
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Tabular.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Tabular.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Tabular.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Tabular.hs
@@ -17,7 +17,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Core.ns, Relational.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Core.ns, Relational.ns] [Core.ns] $
     Just "A simple, untyped tabular data model, suitable for CSVs and TSVs"
   where
     elements = [
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Testing.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Testing.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Testing.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Testing.hs
@@ -10,12 +10,12 @@
 
 import qualified Hydra.Sources.Kernel.Types.Ast as Ast
 import qualified Hydra.Sources.Kernel.Types.Coders as Coders
-import qualified Hydra.Sources.Kernel.Types.Compute as Compute
 import qualified Hydra.Sources.Kernel.Types.Graph as Graph
 import qualified Hydra.Sources.Json.Model as JsonModel
 import qualified Hydra.Sources.Kernel.Types.Module as Module
 import qualified Hydra.Sources.Kernel.Types.Parsing as Parsing
 import qualified Hydra.Sources.Kernel.Types.Typing as Typing
+import qualified Hydra.Sources.Kernel.Types.Error.Core as ErrorsCore
 import qualified Hydra.Sources.Kernel.Types.Util as Util
 
 
@@ -26,7 +26,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Ast.ns, Coders.ns, Compute.ns, Graph.ns, JsonModel.ns, Module.ns, Parsing.ns, Typing.ns, Util.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Ast.ns, Coders.ns, ErrorsCore.ns, Graph.ns, JsonModel.ns, Module.ns, Parsing.ns, Typing.ns, Util.ns] [Core.ns] $
     Just "A model for unit testing"
   where
     elements = [
@@ -53,7 +53,6 @@
       evaluationTestCase,
       inferenceFailureTestCase,
       inferenceTestCase,
-      jsonCoderTestCase,
       jsonDecodeTestCase,
       jsonEncodeTestCase,
       jsonParserTestCase,
@@ -63,6 +62,7 @@
       parserTestCase,
       tag,
       testCodec,
+      testGenerator,
       testCase,
       testCaseWithMetadata,
       testGroup,
@@ -80,7 +80,8 @@
       variableOccursInTypeTestCase,
       unshadowVariablesTestCase,
       unifyTypesTestCase,
-      joinTypesTestCase]
+      joinTypesTestCase,
+      validateCoreTermTestCase]
 
 alphaConversionTestCase :: Binding
 alphaConversionTestCase = define "AlphaConversionTestCase" $
@@ -374,21 +375,6 @@
       doc "The expected type scheme"
       Core.typeScheme]
 
-jsonCoderTestCase :: Binding
-jsonCoderTestCase = define "JsonCoderTestCase" $
-  doc ("A test case which encodes a Hydra term to JSON using a type-directed coder,"
-    <> " and verifies that decoding produces the original term (round-trip)") $
-  T.record [
-    "type">:
-      doc "The Hydra type that determines how the term is encoded/decoded"
-      Core.type_,
-    "term">:
-      doc "The Hydra term to encode"
-      Core.term,
-    "json">:
-      doc "The expected JSON value"
-      JsonModel.value]
-
 jsonDecodeTestCase :: Binding
 jsonDecodeTestCase = define "JsonDecodeTestCase" $
   doc ("A test case for the Either-based JSON decoder."
@@ -478,10 +464,10 @@
       Module.fileExtension,
     "encodeTerm">:
       doc "A function for encoding Hydra terms into the target language" $
-      Core.term ~> Compute.flow @@ Graph.graph @@ T.string,
+      Core.term ~> Graph.graph ~> T.either_ T.string T.string,
     "encodeType">:
       doc "A function for encoding Hydra types into the target language" $
-      Core.type_ ~> Compute.flow @@ Graph.graph @@ T.string,
+      Core.type_ ~> Graph.graph ~> T.either_ T.string T.string,
     "formatTestName">:
       doc "A function for formatting test case names according to the target language's conventions" $
       T.string ~> T.string,
@@ -504,6 +490,23 @@
       doc "A function that determines the necessary imports for a given set of dependencies" $
       T.set Core.name ~> T.list T.string]
 
+testGenerator :: Binding
+testGenerator = define "TestGenerator" $
+  doc "A language-agnostic test generator abstraction, parameterized by the namespace/module name type" $
+  T.forAll "a" $ T.record [
+    "namespacesForModule">:
+      doc "Build namespaces for a module, resolving all imports and primitives" $
+      Module.module' ~> Graph.graph ~> T.either_ T.string (Module.namespaces @@ "a"),
+    "createCodec">:
+      doc "Create a test codec from resolved namespaces" $
+      Module.namespaces @@ "a" ~> testCodec,
+    "generateTestFile">:
+      doc "Generate a complete test file for a module and test group" $
+      Module.module' ~> testGroup ~> Graph.graph ~> T.either_ T.string (T.pair T.string T.string),
+    "aggregatorFile">:
+      doc "Generate an aggregator file (e.g., Spec.hs for Haskell, conftest.py for Python). Takes base directory and list of modules, returns (filepath, content) or Nothing if not needed" $
+      T.maybe (T.string ~> T.list Module.module' ~> T.pair T.string T.string)]
+
 testCase :: Binding
 testCase = define "TestCase" $
   doc "A simple test case with an input and an expected output" $
@@ -541,9 +544,6 @@
     "inferenceFailure">:
       doc "A type inference failure test"
       inferenceFailureTestCase,
-    "jsonCoder">:
-      doc "A JSON coder (round-trip) test using Flow-based coder"
-      jsonCoderTestCase,
     "jsonDecode">:
       doc "A JSON decode test using Either-based decoder"
       jsonDecodeTestCase,
@@ -624,7 +624,10 @@
       joinTypesTestCase,
     "unshadowVariables">:
       doc "An unshadow variables test"
-      unshadowVariablesTestCase]
+      unshadowVariablesTestCase,
+    "validateCoreTerm">:
+      doc "A core term validation test"
+      validateCoreTermTestCase]
 
 testCaseWithMetadata :: Binding
 testCaseWithMetadata = define "TestCaseWithMetadata" $
@@ -849,3 +852,17 @@
     "output">:
       doc "The expected term after unshadowing"
       Core.term]
+
+validateCoreTermTestCase :: Binding
+validateCoreTermTestCase = define "ValidateCoreTermTestCase" $
+  doc "A test case which validates a term and compares the result with an expected Maybe InvalidTermError" $
+  T.record [
+    "typed">:
+      doc "Whether to expect System F (typed) terms. When true, type variable binding checks and UntypedTermVariableError are active."
+      T.boolean,
+    "input">:
+      doc "The term to validate"
+      Core.term,
+    "output">:
+      doc "The expected validation result (Nothing if valid, Just error if invalid)"
+      (T.optional ErrorsCore.invalidTermError)]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Topology.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Topology.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Topology.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Topology.hs
@@ -16,7 +16,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [] [Core.ns] $
     Just "A model for simple graphs as adjacency lists"
   where
     elements = [
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Typing.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Typing.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Typing.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Typing.hs
@@ -7,6 +7,7 @@
 import           Hydra.Dsl.Types ((>:), (@@), (~>))
 import qualified Hydra.Dsl.Types as T
 import qualified Hydra.Sources.Kernel.Types.Core as Core
+import qualified Hydra.Sources.Kernel.Types.Context as Context
 
 
 ns :: Namespace
@@ -16,41 +17,16 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Core.ns, Context.ns] [Core.ns, Context.ns] $
     Just "Types supporting type inference and type reconstruction."
   where
     elements = [
       functionStructure,
-      inferenceContext,
       inferenceResult,
       termSubst,
       typeConstraint,
-      typeContext,
       typeSubst]
 
-inferenceContext :: Binding
-inferenceContext = define "InferenceContext" $
-  doc "The context provided to type inference, including various typing environments." $
-  T.record [
-    "schemaTypes">:
-      doc "A fixed typing environment which is derived from the schema of the graph." $
-      T.map Core.name Core.typeScheme,
-    "primitiveTypes">:
-      doc "A fixed typing environment which is derived from the set of primitives in the graph." $
-      T.map Core.name Core.typeScheme,
-    "dataTypes">:
-      doc ("A mutable typing environment which is specific to the current graph being processed."
-        ++ " This environment is (usually) smaller than the schema and primitive typing environments,"
-        ++ " and is subject to global substitutions.") $
-      T.map Core.name Core.typeScheme,
-    "classConstraints">:
-      doc ("A mutable map from type variable names to their accumulated class constraints."
-        ++ " This is populated during type inference when operations requiring Eq or Ord are encountered.") $
-      T.map Core.name Core.typeVariableMetadata,
-    "debug">:
-      doc "Whether to enable debug output during type inference"
-      T.boolean]
-
 inferenceResult :: Binding
 inferenceResult = define "InferenceResult" $
   doc "The result of applying inference rules to a term." $
@@ -66,7 +42,10 @@
       typeSubst,
     "classConstraints">:
       doc "Class constraints discovered during inference (e.g., Ord constraints from Map.lookup)" $
-      T.map Core.name Core.typeVariableMetadata]
+      T.map Core.name Core.typeVariableMetadata,
+    "context">:
+      doc "The updated context after inference (carries fresh variable state)" $
+      Context.context]
 
 termSubst :: Binding
 termSubst = define "TermSubst" $
@@ -86,29 +65,6 @@
     "comment">:
       doc "A description of the type constraint which may be used for tracing or debugging"
       T.string]
-
-typeContext :: Binding
-typeContext = define "TypeContext" $
-  doc "A typing environment used for type reconstruction (typeOf) over System F terms" $
-  T.record [
-    "types">:
-      doc "A mapping of lambda- and let-bound variables to their types" $
-      T.map Core.name Core.type_,
-    "metadata">:
-      doc "Any additional metadata about lambda- and let-bound variables" $
-      T.map Core.name Core.term,
-    "typeVariables">:
-      doc "The set of type variables introduced by enclosing type lambdas" $
-      T.set Core.name,
-    "lambdaVariables">:
-      doc "The set of term variables introduced by lambdas (even if untyped)" $
-      T.set Core.name,
-    "letVariables">:
-      doc "The set of term variables introduced by let bindings (even if untyped)" $
-      T.set Core.name,
-    "inferenceContext">:
-      doc "The schema types, primitive types, and data types of the graph"
-      inferenceContext]
 
 typeSubst :: Binding
 typeSubst = define "TypeSubst" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Util.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Util.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Util.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Util.hs
@@ -6,7 +6,9 @@
 import           Hydra.Dsl.Bootstrap
 import           Hydra.Dsl.Types ((>:), (@@), (~>))
 import qualified Hydra.Dsl.Types as T
+import qualified Hydra.Sources.Kernel.Types.Context as Context
 import qualified Hydra.Sources.Kernel.Types.Core as Core
+import qualified Hydra.Sources.Kernel.Types.Errors as Error
 
 
 ns :: Namespace
@@ -16,15 +18,59 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Context.ns, Core.ns, Error.ns] [Context.ns, Core.ns, Error.ns] $
     Just "General-purpose utility types used across Hydra."
   where
+    -- Note: either_ and pair are NOT included here because they correspond to built-in
+    -- type constructors (TypeEither, TypePair) which are handled natively by all target languages.
+    -- Including them would cause conflicts with Haskell's Prelude.Either.
     elements = [
+      adapter,
+      bicoder,
       caseConvention,
+      coder,
       comparison,
-      decodingError,
       precision]
 
+adapter :: Binding
+adapter = define "Adapter" $
+  doc "A two-level bidirectional encoder which adapts types to types and terms to terms" $
+  T.forAlls ["t1", "t2", "v1", "v2"] $ T.record [
+    "isLossy">:
+      doc "Whether information may be lost in the course of this adaptation"
+      T.boolean,
+    "source">:
+      doc "The source type"
+      "t1",
+    "target">:
+      doc "The target type"
+      "t2",
+    "coder">:
+      doc "The coder for transforming instances of the source type to instances of the target type" $
+      coder @@ "v1" @@ "v2"]
+
+bicoder :: Binding
+bicoder = define "Bicoder" $
+  doc "A two-level encoder and decoder, operating both at a type level and an instance (data) level" $
+  T.forAlls ["t1", "t2", "v1", "v2"] $ T.record [
+    "encode">:
+      doc "A function from source types to adapters" $
+      "t1" ~> adapter @@ "t1" @@ "t2" @@ "v1" @@ "v2",
+    "decode">:
+      doc "A function from target types to adapters" $
+      "t2" ~> adapter @@ "t2" @@ "t1" @@ "v2" @@ "v1"]
+
+coder :: Binding
+coder = define "Coder" $
+  doc "An encoder and decoder; a bidirectional transformation between two types" $
+  T.forAlls ["v1", "v2"] $ T.record [
+    "encode">:
+      doc "A function which encodes source values as target values in a given context" $
+      Context.context ~> "v1" ~> T.either_ (Context.inContext @@ Error.error_) "v2",
+    "decode">:
+      doc "A function which decodes target values as source values in a given context" $
+      Context.context ~> "v2" ~> T.either_ (Context.inContext @@ Error.error_) "v1"]
+
 caseConvention :: Binding
 caseConvention = define "CaseConvention" $
   doc "A naming convention for symbols, such as camelCase or snake_case" $
@@ -38,10 +84,27 @@
     "equalTo",
     "greaterThan"]
 
-decodingError :: Binding
-decodingError = define "DecodingError" $
-  doc "An error that occurred during decoding of a term" $
-  T.wrap T.string
+either_ :: Binding
+either_ = define "Either" $
+  doc "A named union type equivalent to the built-in Either type constructor, for use in languages that lack anonymous sum types" $
+  T.forAlls ["a", "b"] $ T.union [
+    "left">:
+      doc "The left alternative"
+      (T.var "a"),
+    "right">:
+      doc "The right alternative"
+      (T.var "b")]
+
+pair :: Binding
+pair = define "Pair" $
+  doc "A named record type equivalent to the built-in Pair type constructor, for use in languages that lack anonymous product types" $
+  T.forAlls ["a", "b"] $ T.record [
+    "first">:
+      doc "The first component"
+      (T.var "a"),
+    "second">:
+      doc "The second component"
+      (T.var "b")]
 
 precision :: Binding
 precision = define "Precision" $
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Variants.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Variants.hs
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Variants.hs
+++ b/src/main/haskell/Hydra/Sources/Kernel/Types/Variants.hs
@@ -16,7 +16,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Core.ns] [Core.ns] $
     Just "Variant types which describe the structure of Hydra core types and terms."
   where
     elements = [
@@ -94,4 +94,5 @@
     "union",
     "unit",
     "variable",
+    "void",
     "wrap"]
diff --git a/src/main/haskell/Hydra/Sources/Kernel/Types/Workflow.hs b/src/main/haskell/Hydra/Sources/Kernel/Types/Workflow.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Kernel/Types/Workflow.hs
+++ /dev/null
@@ -1,86 +0,0 @@
-module Hydra.Sources.Kernel.Types.Workflow where
-
--- Standard type-level kernel imports
-import           Hydra.Kernel
-import           Hydra.Dsl.Annotations (doc)
-import           Hydra.Dsl.Bootstrap
-import           Hydra.Dsl.Types ((>:), (@@), (~>))
-import qualified Hydra.Dsl.Types as T
-import qualified Hydra.Sources.Kernel.Types.Core as Core
-import qualified Hydra.Sources.Kernel.Types.Compute as Compute
-import qualified Hydra.Sources.Kernel.Types.Graph as Graph
-import qualified Hydra.Sources.Kernel.Types.Module as Module
-
-
-ns :: Namespace
-ns = Namespace "hydra.workflow"
-
-define :: String -> Type -> Binding
-define = defineType ns
-
-module_ :: Module
-module_ = Module ns elements [Compute.ns, Graph.ns, Module.ns] [Core.ns] $
-    Just "A model for Hydra transformation workflows"
-  where
-    elements = [
-      hydraSchemaSpec,
-      lastMile,
-      schemaSpec,
-      transformWorkflow]
-
-hydraSchemaSpec :: Binding
-hydraSchemaSpec = define "HydraSchemaSpec" $
-  doc "The specification of a Hydra schema, provided as a set of modules and a distinguished type" $
-  T.record [
-    "modules">:
-      doc "The modules to include in the schema graph" $
-      T.list Module.module',
-    "typeName">:
-      doc "The name of the top-level type; all data which passes through the workflow will be instances of this type"
-      Core.name]
-
-lastMile :: Binding
-lastMile = define "LastMile" $
-  doc "The last mile of a transformation, which encodes and serializes terms to a file" $
-  T.forAlls ["s", "a"] $ T.record [
-    "encoder">:
-      doc "An encoder for terms to a list of output objects" $
-      Core.type_ ~> Compute.flow @@ "s"
-        @@ (Core.term ~> Graph.graph ~> Compute.flow @@ "s" @@ T.list "a"),
-    "serializer">:
-      doc "A function which serializes a list of output objects to a string representation" $
-      T.list "a" ~> Compute.flow @@ "s" @@ T.string,
-    "fileExtension">:
-      doc "A file extension for the generated file(s)" $
-      T.string]
-
-schemaSpec :: Binding
-schemaSpec = define "SchemaSpec" $
-  doc "The specification of a schema at the source end of a workflow" $
-  T.union [
-    "hydra">:
-      doc "A native Hydra schema"
-      hydraSchemaSpec,
-    "file">:
-      doc "A schema provided as a file, available at the given file path" $
-      T.string,
-    "provided">:
-      doc "A schema which will be provided within the workflow" $
-      T.unit]
-
-transformWorkflow :: Binding
-transformWorkflow = define "TransformWorkflow" $
-  doc "The specification of a workflow which takes a schema specification, reads data from a directory, and writes data to another directory" $
-  T.record [
-    "name">:
-      doc "A descriptive name for the workflow" $
-      T.string,
-    "schemaSpec">:
-      doc "The schema specification"
-      schemaSpec,
-    "srcDir">:
-      doc "The source directory" $
-      T.string,
-    "destDir">:
-      doc "The destination directory" $
-      T.string]
diff --git a/src/main/haskell/Hydra/Sources/Libraries.hs b/src/main/haskell/Hydra/Sources/Libraries.hs
--- a/src/main/haskell/Hydra/Sources/Libraries.hs
+++ b/src/main/haskell/Hydra/Sources/Libraries.hs
@@ -2,11 +2,10 @@
 -- | Implementations of the Hydra standard libraries in Haskell
 module Hydra.Sources.Libraries (
   module Hydra.Sources.Libraries,
-  module Hydra.Staging.Lib.Names,
 ) where
 
 import Hydra.Kernel
-import Hydra.Staging.Lib.Names
+import qualified Hydra.Lib.Names as LibNames
 import Hydra.Dsl.Prims as Prims
 import qualified Hydra.Dsl.Terms as Terms
 import qualified Hydra.Dsl.Types as Types
@@ -14,7 +13,6 @@
 import qualified Hydra.Lib.Chars as Chars
 import qualified Hydra.Lib.Eithers as Eithers
 import qualified Hydra.Lib.Equality as Equality
-import qualified Hydra.Lib.Flows as Flows
 import qualified Hydra.Lib.Lists as Lists
 import qualified Hydra.Lib.Literals as Literals
 import qualified Hydra.Lib.Logic as Logic
@@ -22,20 +20,300 @@
 import qualified Hydra.Lib.Math as Math
 import qualified Hydra.Lib.Maybes as Maybes
 import qualified Hydra.Lib.Pairs as Pairs
+import qualified Hydra.Lib.Regex as Regex
 import qualified Hydra.Lib.Sets as Sets
 import qualified Hydra.Lib.Strings as Strings
 
-import qualified Hydra.Eval.Lib.Eithers as EvalEithers
-import qualified Hydra.Eval.Lib.Flows as EvalFlows
-import qualified Hydra.Eval.Lib.Lists as EvalLists
-import qualified Hydra.Eval.Lib.Maps as EvalMaps
-import qualified Hydra.Eval.Lib.Maybes as EvalMaybes
-import qualified Hydra.Eval.Lib.Pairs as EvalPairs
-import qualified Hydra.Eval.Lib.Sets as EvalSets
-
 import qualified Data.List as L
 
 
+-- Compatibility aliases for legacy _* names (from the old Staging.Lib.Names module).
+-- These map old names to the new generated Hydra.Lib.Names constants.
+
+-- Namespace aliases
+_hydra_lib_chars    = LibNames.chars
+_hydra_lib_eithers  = LibNames.eithers
+_hydra_lib_equality = LibNames.equality
+_hydra_lib_lists    = LibNames.lists
+_hydra_lib_literals = LibNames.literals
+_hydra_lib_logic    = LibNames.logic
+_hydra_lib_maps     = LibNames.maps
+_hydra_lib_math     = LibNames.math
+_hydra_lib_maybes   = LibNames.maybes
+_hydra_lib_pairs    = LibNames.pairs
+_hydra_lib_regex    = LibNames.regex
+_hydra_lib_sets     = LibNames.sets
+_hydra_lib_strings  = LibNames.strings
+_hydra_typeclass    = LibNames.typeclass
+
+-- Chars
+_chars_isAlphaNum = LibNames.charsIsAlphaNum
+_chars_isLower    = LibNames.charsIsLower
+_chars_isSpace    = LibNames.charsIsSpace
+_chars_isUpper    = LibNames.charsIsUpper
+_chars_toLower    = LibNames.charsToLower
+_chars_toUpper    = LibNames.charsToUpper
+
+-- Eithers
+_eithers_bimap            = LibNames.eithersBimap
+_eithers_bind             = LibNames.eithersBind
+_eithers_either           = LibNames.eithersEither
+_eithers_foldl            = LibNames.eithersFoldl
+_eithers_fromLeft         = LibNames.eithersFromLeft
+_eithers_fromRight        = LibNames.eithersFromRight
+_eithers_isLeft           = LibNames.eithersIsLeft
+_eithers_isRight          = LibNames.eithersIsRight
+_eithers_lefts            = LibNames.eithersLefts
+_eithers_map              = LibNames.eithersMap
+_eithers_mapList          = LibNames.eithersMapList
+_eithers_mapMaybe         = LibNames.eithersMapMaybe
+_eithers_mapSet           = LibNames.eithersMapSet
+_eithers_partitionEithers = LibNames.eithersPartitionEithers
+_eithers_rights           = LibNames.eithersRights
+
+-- Equality
+_equality_compare  = LibNames.equalityCompare
+_equality_equal    = LibNames.equalityEqual
+_equality_gt       = LibNames.equalityGt
+_equality_gte      = LibNames.equalityGte
+_equality_identity = LibNames.equalityIdentity
+_equality_lt       = LibNames.equalityLt
+_equality_lte      = LibNames.equalityLte
+_equality_max      = LibNames.equalityMax
+_equality_min      = LibNames.equalityMin
+
+-- Lists
+_lists_apply       = LibNames.listsApply
+_lists_at          = LibNames.listsAt
+_lists_bind        = LibNames.listsBind
+_lists_concat      = LibNames.listsConcat
+_lists_concat2     = LibNames.listsConcat2
+_lists_cons        = LibNames.listsCons
+_lists_drop        = LibNames.listsDrop
+_lists_dropWhile   = LibNames.listsDropWhile
+_lists_elem        = LibNames.listsElem
+_lists_filter      = LibNames.listsFilter
+_lists_find        = LibNames.listsFind
+_lists_foldl       = LibNames.listsFoldl
+_lists_foldr       = LibNames.listsFoldr
+_lists_group       = LibNames.listsGroup
+_lists_head        = LibNames.listsHead
+_lists_init        = LibNames.listsInit
+_lists_intercalate = LibNames.listsIntercalate
+_lists_intersperse = LibNames.listsIntersperse
+_lists_last        = LibNames.listsLast
+_lists_length      = LibNames.listsLength
+_lists_map         = LibNames.listsMap
+_lists_nub         = LibNames.listsNub
+_lists_null        = LibNames.listsNull
+_lists_partition   = LibNames.listsPartition
+_lists_pure        = LibNames.listsPure
+_lists_replicate   = LibNames.listsReplicate
+_lists_reverse     = LibNames.listsReverse
+_lists_safeHead    = LibNames.listsSafeHead
+_lists_singleton   = LibNames.listsSingleton
+_lists_sort        = LibNames.listsSort
+_lists_sortOn      = LibNames.listsSortOn
+_lists_span        = LibNames.listsSpan
+_lists_tail        = LibNames.listsTail
+_lists_take        = LibNames.listsTake
+_lists_transpose   = LibNames.listsTranspose
+_lists_zip         = LibNames.listsZip
+_lists_zipWith     = LibNames.listsZipWith
+
+-- Literals
+_literals_bigfloatToBigint  = LibNames.literalsBigfloatToBigint
+_literals_bigfloatToFloat32 = LibNames.literalsBigfloatToFloat32
+_literals_bigfloatToFloat64 = LibNames.literalsBigfloatToFloat64
+_literals_bigintToBigfloat  = LibNames.literalsBigintToBigfloat
+_literals_bigintToInt8      = LibNames.literalsBigintToInt8
+_literals_bigintToInt16     = LibNames.literalsBigintToInt16
+_literals_bigintToInt32     = LibNames.literalsBigintToInt32
+_literals_bigintToInt64     = LibNames.literalsBigintToInt64
+_literals_bigintToUint8     = LibNames.literalsBigintToUint8
+_literals_bigintToUint16    = LibNames.literalsBigintToUint16
+_literals_bigintToUint32    = LibNames.literalsBigintToUint32
+_literals_bigintToUint64    = LibNames.literalsBigintToUint64
+_literals_binaryToBytes     = LibNames.literalsBinaryToBytes
+_literals_binaryToString    = LibNames.literalsBinaryToString
+_literals_float32ToBigfloat = LibNames.literalsFloat32ToBigfloat
+_literals_float64ToBigfloat = LibNames.literalsFloat64ToBigfloat
+_literals_int8ToBigint      = LibNames.literalsInt8ToBigint
+_literals_int16ToBigint     = LibNames.literalsInt16ToBigint
+_literals_int32ToBigint     = LibNames.literalsInt32ToBigint
+_literals_int64ToBigint     = LibNames.literalsInt64ToBigint
+_literals_readBigfloat      = LibNames.literalsReadBigfloat
+_literals_readBigint        = LibNames.literalsReadBigint
+_literals_readBoolean       = LibNames.literalsReadBoolean
+_literals_readFloat32       = LibNames.literalsReadFloat32
+_literals_readFloat64       = LibNames.literalsReadFloat64
+_literals_readInt8          = LibNames.literalsReadInt8
+_literals_readInt16         = LibNames.literalsReadInt16
+_literals_readInt32         = LibNames.literalsReadInt32
+_literals_readInt64         = LibNames.literalsReadInt64
+_literals_readString        = LibNames.literalsReadString
+_literals_readUint8         = LibNames.literalsReadUint8
+_literals_readUint16        = LibNames.literalsReadUint16
+_literals_readUint32        = LibNames.literalsReadUint32
+_literals_readUint64        = LibNames.literalsReadUint64
+_literals_showBigfloat      = LibNames.literalsShowBigfloat
+_literals_showBigint        = LibNames.literalsShowBigint
+_literals_showBoolean       = LibNames.literalsShowBoolean
+_literals_showFloat32       = LibNames.literalsShowFloat32
+_literals_showFloat64       = LibNames.literalsShowFloat64
+_literals_showInt8          = LibNames.literalsShowInt8
+_literals_showInt16         = LibNames.literalsShowInt16
+_literals_showInt32         = LibNames.literalsShowInt32
+_literals_showInt64         = LibNames.literalsShowInt64
+_literals_showString        = LibNames.literalsShowString
+_literals_showUint8         = LibNames.literalsShowUint8
+_literals_showUint16        = LibNames.literalsShowUint16
+_literals_showUint32        = LibNames.literalsShowUint32
+_literals_showUint64        = LibNames.literalsShowUint64
+_literals_stringToBinary    = LibNames.literalsStringToBinary
+_literals_uint8ToBigint     = LibNames.literalsUint8ToBigint
+_literals_uint16ToBigint    = LibNames.literalsUint16ToBigint
+_literals_uint32ToBigint    = LibNames.literalsUint32ToBigint
+_literals_uint64ToBigint    = LibNames.literalsUint64ToBigint
+
+-- Logic
+_logic_and    = LibNames.logicAnd
+_logic_ifElse = LibNames.logicIfElse
+_logic_not    = LibNames.logicNot
+_logic_or     = LibNames.logicOr
+
+-- Maps
+_maps_alter           = LibNames.mapsAlter
+_maps_bimap           = LibNames.mapsBimap
+_maps_delete          = LibNames.mapsDelete
+_maps_elems           = LibNames.mapsElems
+_maps_empty           = LibNames.mapsEmpty
+_maps_filter          = LibNames.mapsFilter
+_maps_filterWithKey   = LibNames.mapsFilterWithKey
+_maps_findWithDefault = LibNames.mapsFindWithDefault
+_maps_fromList        = LibNames.mapsFromList
+_maps_insert          = LibNames.mapsInsert
+_maps_keys            = LibNames.mapsKeys
+_maps_lookup          = LibNames.mapsLookup
+_maps_map             = LibNames.mapsMap
+_maps_mapKeys         = LibNames.mapsMapKeys
+_maps_member          = LibNames.mapsMember
+_maps_null            = LibNames.mapsNull
+_maps_singleton       = LibNames.mapsSingleton
+_maps_size            = LibNames.mapsSize
+_maps_toList          = LibNames.mapsToList
+_maps_union           = LibNames.mapsUnion
+
+-- Math
+_math_abs      = LibNames.mathAbs
+_math_acos     = LibNames.mathAcos
+_math_acosh    = LibNames.mathAcosh
+_math_add      = LibNames.mathAdd
+_math_asin     = LibNames.mathAsin
+_math_asinh    = LibNames.mathAsinh
+_math_atan     = LibNames.mathAtan
+_math_atan2    = LibNames.mathAtan2
+_math_atanh    = LibNames.mathAtanh
+_math_ceiling  = LibNames.mathCeiling
+_math_cos      = LibNames.mathCos
+_math_cosh     = LibNames.mathCosh
+_math_div      = LibNames.mathDiv
+_math_e        = LibNames.mathE
+_math_even     = LibNames.mathEven
+_math_exp      = LibNames.mathExp
+_math_floor    = LibNames.mathFloor
+_math_log      = LibNames.mathLog
+_math_logBase  = LibNames.mathLogBase
+_math_max      = LibNames.mathMax
+_math_min      = LibNames.mathMin
+_math_mod      = LibNames.mathMod
+_math_mul      = LibNames.mathMul
+_math_negate   = LibNames.mathNegate
+_math_odd      = LibNames.mathOdd
+_math_pi       = LibNames.mathPi
+_math_pow      = LibNames.mathPow
+_math_pred     = LibNames.mathPred
+_math_range    = LibNames.mathRange
+_math_rem      = LibNames.mathRem
+_math_round         = LibNames.mathRound
+_math_roundBigfloat = LibNames.mathRoundBigfloat
+_math_roundFloat32  = LibNames.mathRoundFloat32
+_math_roundFloat64  = LibNames.mathRoundFloat64
+_math_signum        = LibNames.mathSignum
+_math_sin      = LibNames.mathSin
+_math_sinh     = LibNames.mathSinh
+_math_sqrt     = LibNames.mathSqrt
+_math_sub      = LibNames.mathSub
+_math_succ     = LibNames.mathSucc
+_math_tan      = LibNames.mathTan
+_math_tanh     = LibNames.mathTanh
+_math_truncate = LibNames.mathTruncate
+
+-- Maybes
+_maybes_apply     = LibNames.maybesApply
+_maybes_bind      = LibNames.maybesBind
+_maybes_cases     = LibNames.maybesCases
+_maybes_cat       = LibNames.maybesCat
+_maybes_compose   = LibNames.maybesCompose
+_maybes_fromJust  = LibNames.maybesFromJust
+_maybes_fromMaybe = LibNames.maybesFromMaybe
+_maybes_isJust    = LibNames.maybesIsJust
+_maybes_isNothing = LibNames.maybesIsNothing
+_maybes_map       = LibNames.maybesMap
+_maybes_mapMaybe  = LibNames.maybesMapMaybe
+_maybes_maybe     = LibNames.maybesMaybe
+_maybes_pure      = LibNames.maybesPure
+_maybes_toList    = LibNames.maybesToList
+
+-- Pairs
+_pairs_bimap  = LibNames.pairsBimap
+_pairs_first  = LibNames.pairsFirst
+_pairs_second = LibNames.pairsSecond
+
+-- Sets
+_sets_delete       = LibNames.setsDelete
+_sets_difference   = LibNames.setsDifference
+_sets_empty        = LibNames.setsEmpty
+_sets_fromList     = LibNames.setsFromList
+_sets_insert       = LibNames.setsInsert
+_sets_intersection = LibNames.setsIntersection
+_sets_map          = LibNames.setsMap
+_sets_member       = LibNames.setsMember
+_sets_null         = LibNames.setsNull
+_sets_singleton    = LibNames.setsSingleton
+_sets_size         = LibNames.setsSize
+_sets_toList       = LibNames.setsToList
+_sets_union        = LibNames.setsUnion
+_sets_unions       = LibNames.setsUnions
+
+-- Regex
+_regex_find       = LibNames.regexFind
+_regex_findAll    = LibNames.regexFindAll
+_regex_matches    = LibNames.regexMatches
+_regex_replace    = LibNames.regexReplace
+_regex_replaceAll = LibNames.regexReplaceAll
+_regex_split      = LibNames.regexSplit
+
+-- Strings
+_strings_cat         = LibNames.stringsCat
+_strings_cat2        = LibNames.stringsCat2
+_strings_charAt      = LibNames.stringsCharAt
+_strings_fromList    = LibNames.stringsFromList
+_strings_intercalate = LibNames.stringsIntercalate
+_strings_length      = LibNames.stringsLength
+_strings_lines       = LibNames.stringsLines
+_strings_null        = LibNames.stringsNull
+_strings_splitOn     = LibNames.stringsSplitOn
+_strings_toList      = LibNames.stringsToList
+_strings_toLower     = LibNames.stringsToLower
+_strings_toUpper     = LibNames.stringsToUpper
+_strings_unlines     = LibNames.stringsUnlines
+
+-- Type classes
+_typeclass_Eq  = LibNames.typeclassEq
+_typeclass_Ord = LibNames.typeclassOrd
+
+
 -- Type variables (TypeVar) for primitive type schemes
 -- Unconstrained
 _a, _b, _c, _d, _k, _k1, _k2, _s, _v, _v1, _v2, _w, _x, _y, _z :: TypeVar
@@ -90,7 +368,6 @@
   hydraLibChars,
   hydraLibEithers,
   hydraLibEquality,
-  hydraLibFlows,
   hydraLibLists,
   hydraLibLiterals,
   hydraLibLogic,
@@ -99,6 +376,7 @@
   hydraLibMathInt32,
   hydraLibMaybes,
   hydraLibPairs,
+  hydraLibRegex,
   hydraLibSets,
   hydraLibStrings]
 
@@ -112,7 +390,7 @@
 --   functions to native functions. This allows higher-order primitives like map,
 --   filter, foldl, etc. to use native implementations rather than eval-level ones.
 fun :: TermCoder x -> TermCoder y -> TermCoder (x -> y)
-fun = Prims.functionWithReduce (reduceTerm True)
+fun = Prims.functionWithReduce (\cx g t -> reduceTerm cx g True t)
 
 hydraLibChars :: Library
 hydraLibChars = standardLibrary _hydra_lib_chars [
@@ -125,9 +403,10 @@
 
 hydraLibEithers :: Library
 hydraLibEithers = standardLibrary _hydra_lib_eithers [
-    prim2       _eithers_bind             Eithers.bind             [_x, _y, _z]     (Prims.either_ x_ y_) (fun y_ (Prims.either_ x_ z_)) (Prims.either_ x_ z_),
     prim3       _eithers_bimap            Eithers.bimap            [_x, _y, _z, _w] (fun x_ z_) (fun y_ w_) (Prims.either_ x_ y_) (Prims.either_ z_ w_),
+    prim2       _eithers_bind             Eithers.bind             [_x, _y, _z]     (Prims.either_ x_ y_) (fun y_ (Prims.either_ x_ z_)) (Prims.either_ x_ z_),
     prim3       _eithers_either           Eithers.either           [_x, _y, _z]     (fun x_ z_) (fun y_ z_) (Prims.either_ x_ y_) z_,
+    prim3       _eithers_foldl            Eithers.foldl            [_x, _y, _z]     (fun x_ (fun y_ (Prims.either_ z_ x_))) x_ (list y_) (Prims.either_ z_ x_),
     prim2       _eithers_fromLeft         Eithers.fromLeft         [_x, _y]         x_ (Prims.either_ x_ y_) x_,
     prim2       _eithers_fromRight        Eithers.fromRight        [_x, _y]         y_ (Prims.either_ x_ y_) y_,
     prim1       _eithers_isLeft           Eithers.isLeft           [_x, _y]         (Prims.either_ x_ y_) boolean,
@@ -136,6 +415,7 @@
     prim2       _eithers_map              Eithers.map              [_x, _y, _z]     (fun x_ y_) (Prims.either_ z_ x_) (Prims.either_ z_ y_),
     prim2       _eithers_mapList          Eithers.mapList          [_x, _y, _z]     (fun x_ (Prims.either_ z_ y_)) (list x_) (Prims.either_ z_ (list y_)),
     prim2       _eithers_mapMaybe         Eithers.mapMaybe         [_x, _y, _z]     (fun x_ (Prims.either_ z_ y_)) (optional x_) (Prims.either_ z_ (optional y_)),
+    prim2       _eithers_mapSet           Eithers.mapSet           [_x, _y, _z]     (fun x_ (Prims.either_ z_ y_)) (set x_) (Prims.either_ z_ (set y_)),
     prim1       _eithers_partitionEithers Eithers.partitionEithers [_x, _y]         (list $ Prims.either_ x_ y_) (pair (list x_) (list y_)),
     prim1       _eithers_rights           Eithers.rights           [_x, _y]         (list $ Prims.either_ x_ y_) (list y_)]
 
@@ -143,30 +423,14 @@
 hydraLibEquality = standardLibrary _hydra_lib_equality [
     prim2 _equality_compare  Equality.compare  [_xOrd] x_ x_ comparison,
     prim2 _equality_equal    Equality.equal    [_xEq]  x_ x_ boolean,
-    prim1 _equality_identity Equality.identity [_x]    x_ x_,
     prim2 _equality_gt       Equality.gt       [_xOrd] x_ x_ boolean,
     prim2 _equality_gte      Equality.gte      [_xOrd] x_ x_ boolean,
+    prim1 _equality_identity Equality.identity [_x]    x_ x_,
     prim2 _equality_lt       Equality.lt       [_xOrd] x_ x_ boolean,
     prim2 _equality_lte      Equality.lte      [_xOrd] x_ x_ boolean,
     prim2 _equality_max      Equality.max      [_xOrd] x_ x_ x_,
     prim2 _equality_min      Equality.min      [_xOrd] x_ x_ x_]
 
-hydraLibFlows :: Library
-hydraLibFlows = standardLibrary _hydra_lib_flows [
-    prim2Eval _flows_apply    EvalFlows.apply    [_s, _x, _y]                 (flow s_ (function x_ y_)) (flow s_ x_) (flow s_ y_),
-    prim2Eval _flows_bind     EvalFlows.bind     [_s, _x, _y]                 (flow s_ x_) (function x_ (flow s_ y_)) (flow s_ y_),
-    prim1     _flows_fail     Flows.fail         [_s, _x]                     string (flow s_ x_),
-    prim3Eval _flows_foldl    EvalFlows.foldl    [_y, _x, _s]                 (function y_ (function x_ (flow s_ y_))) y_ (list x_) (flow s_ y_),
-    prim2Eval _flows_map      EvalFlows.map      [_x, _y, _s]                 (function x_ y_) (flow s_ x_) (flow s_ y_),
-    prim2Eval _flows_mapElems EvalFlows.mapElems [_v1, _s, _v2, _kOrd]        (function v1_ (flow s_ v2_)) (Prims.map k_ v1_) (flow s_ (Prims.map k_ v2_)),
-    prim2Eval _flows_mapKeys  EvalFlows.mapKeys  [_k1Ord, _s, _k2Ord, _v]     (function k1_ (flow s_ k2_)) (Prims.map k1_ v_) (flow s_ (Prims.map k2_ v_)),
-    prim2Eval _flows_mapList  EvalFlows.mapList  [_x, _s, _y]                 (function x_ (flow s_ y_)) (list x_) (flow s_ (list y_)),
-    prim2Eval _flows_mapMaybe EvalFlows.mapMaybe [_x, _s, _y]                 (function x_ $ flow s_ y_) (optional x_) (flow s_ $ optional y_),
-    prim2Eval _flows_mapSet   EvalFlows.mapSet   [_xOrd, _s, _yOrd]           (function x_ (flow s_ y_)) (set x_) (flow s_ (set y_)),
-    prim1     _flows_pure     Flows.pure         [_s, _x]                     x_ (flow s_ x_),
-    prim1     _flows_sequence Flows.sequence     [_s, _x]                     (list (flow s_ x_)) (flow s_ (list x_)),
-    prim2Eval _flows_withDefault EvalFlows.withDefault [_s, _x]               x_ (flow s_ x_) (flow s_ x_)]
-
 hydraLibLists :: Library
 hydraLibLists = standardLibrary _hydra_lib_lists [
     prim2     _lists_apply        Lists.apply         [_x, _y]     (list $ fun x_ y_) (list x_) (list y_),
@@ -181,6 +445,7 @@
     prim2     _lists_filter      Lists.filter        [_x]         (fun x_ boolean) (list x_) (list x_),
     prim2     _lists_find        Lists.find          [_x]         (fun x_ boolean) (list x_) (optional x_),
     prim3     _lists_foldl       Lists.foldl         [_y, _x]     (fun y_ (fun x_ y_)) y_ (list x_) y_,
+    prim3     _lists_foldr       Lists.foldr         [_x, _y]     (fun x_ (fun y_ y_)) y_ (list x_) y_,
     prim1     _lists_group       Lists.group         [_xEq]       (list x_) (list (list x_)),
     prim1     _lists_head        Lists.head          [_x]         (list x_) x_,
     prim1     _lists_init        Lists.init          [_x]         (list x_) (list x_),
@@ -197,9 +462,9 @@
     prim1     _lists_reverse     Lists.reverse       [_x]         (list x_) (list x_),
     prim1     _lists_safeHead    Lists.safeHead      [_x]         (list x_) (optional x_),
     prim1     _lists_singleton   Lists.singleton     [_x]         x_ (list x_),
+    prim1     _lists_sort        Lists.sort          [_xOrd]      (list x_) (list x_),
     prim2     _lists_sortOn      Lists.sortOn        [_x, _yOrd]  (fun x_ y_) (list x_) (list x_),
     prim2     _lists_span        Lists.span          [_x]         (fun x_ boolean) (list x_) (pair (list x_) (list x_)),
-    prim1     _lists_sort        Lists.sort          [_xOrd]      (list x_) (list x_),
     prim1     _lists_tail        Lists.tail          [_x]         (list x_) (list x_),
     prim2     _lists_take        Lists.take          [_x]         int32 (list x_) (list x_),
     prim1     _lists_transpose   Lists.transpose     [_x]         (list (list x_)) (list (list x_)),
@@ -251,11 +516,11 @@
   prim1 _literals_showInt16         Literals.showInt16         [] int16 string,
   prim1 _literals_showInt32         Literals.showInt32         [] int32 string,
   prim1 _literals_showInt64         Literals.showInt64         [] int64 string,
+  prim1 _literals_showString        Literals.showString        [] string string,
   prim1 _literals_showUint8         Literals.showUint8         [] uint8 string,
   prim1 _literals_showUint16        Literals.showUint16        [] uint16 string,
   prim1 _literals_showUint32        Literals.showUint32        [] uint32 string,
   prim1 _literals_showUint64        Literals.showUint64        [] uint64 string,
-  prim1 _literals_showString        Literals.showString        [] string string,
   prim1 _literals_stringToBinary    Literals.stringToBinary    [] string binary,
   prim1 _literals_uint8ToBigint     Literals.uint8ToBigint     [] uint8 bigint,
   prim1 _literals_uint16ToBigint    Literals.uint16ToBigint    [] uint16 bigint,
@@ -273,8 +538,8 @@
 hydraLibMaps = standardLibrary _hydra_lib_maps [
     prim3     _maps_alter           Maps.alter             [_v, _kOrd]                  (fun (optional v_) (optional v_)) k_ mapKv mapKv,
     prim3     _maps_bimap           Maps.bimap             [_k1Ord, _k2Ord, _v1, _v2]   (fun k1_ k2_) (fun v1_ v2_) (Prims.map k1_ v1_) (Prims.map k2_ v2_),
-    prim1     _maps_elems           Maps.elems             [_kOrd, _v]                  mapKv (list v_),
     prim2     _maps_delete          Maps.delete            [_kOrd, _v]                  k_ mapKv mapKv,
+    prim1     _maps_elems           Maps.elems             [_kOrd, _v]                  mapKv (list v_),
     prim0     _maps_empty           Maps.empty             [_kOrd, _v]                  mapKv,
     prim2     _maps_filter          Maps.filter            [_v, _kOrd]                  (fun v_ boolean) mapKv mapKv,
     prim2     _maps_filterWithKey   Maps.filterWithKey     [_kOrd, _v]                  (fun k_ (fun v_ boolean)) mapKv mapKv,
@@ -287,8 +552,8 @@
     prim2     _maps_mapKeys         Maps.mapKeys           [_k1Ord, _k2Ord, _v]         (fun k1_ k2_) (Prims.map k1_ v_) (Prims.map k2_ v_),
     prim2     _maps_member          Maps.member            [_kOrd, _v]                  k_ mapKv boolean,
     prim1     _maps_null            Maps.null              [_kOrd, _v]                  mapKv boolean,
-    prim1     _maps_size            Maps.size              [_kOrd, _v]                  mapKv int32,
     prim2     _maps_singleton       Maps.singleton         [_kOrd, _v]                  k_ v_ mapKv,
+    prim1     _maps_size            Maps.size              [_kOrd, _v]                  mapKv int32,
     prim1     _maps_toList          Maps.toList            [_kOrd, _v]                  mapKv (list $ pair k_ v_),
     prim2     _maps_union           Maps.union             [_kOrd, _v]                  mapKv mapKv mapKv]
   where
@@ -313,8 +578,11 @@
   prim2 _math_logBase  Math.logBase  [] float64 float64 float64,
   prim0 _math_pi       Math.pi       [] float64,
   prim2 _math_pow      Math.pow      [] float64 float64 float64,
-  prim1 _math_round    Math.round    [] float64 bigint,
-  prim1 _math_sin      Math.sin      [] float64 float64,
+  prim1 _math_round         Math.round         [] float64 bigint,
+  prim2 _math_roundBigfloat Math.roundBigfloat [] int32 bigfloat bigfloat,
+  prim2 _math_roundFloat32  Math.roundFloat32  [] int32 float32 float32,
+  prim2 _math_roundFloat64  Math.roundFloat64  [] int32 float64 float64,
+  prim1 _math_sin            Math.sin           [] float64 float64,
   prim1 _math_sinh     Math.sinh     [] float64 float64,
   prim1 _math_sqrt     Math.sqrt     [] float64 float64,
   prim1 _math_tan      Math.tan      [] float64 float64,
@@ -354,7 +622,8 @@
     prim2     _maybes_map       Maybes.map          [_x, _y]     (fun x_ y_) (optional x_) (optional y_),
     prim2     _maybes_mapMaybe  Maybes.mapMaybe     [_x, _y]     (fun x_ $ optional y_) (list x_) (list y_),
     prim3     _maybes_maybe     Maybes.maybe        [_y, _x]     y_ (fun x_ y_) (optional x_) y_,
-    prim1     _maybes_pure      Maybes.pure         [_x]         x_ (optional x_)]
+    prim1     _maybes_pure      Maybes.pure         [_x]         x_ (optional x_),
+    prim1     _maybes_toList    Maybes.toList       [_x]         (optional x_) (list x_)]
 
 hydraLibPairs :: Library
 hydraLibPairs = standardLibrary _hydra_lib_pairs [
@@ -378,6 +647,15 @@
     prim1     _sets_toList       Sets.toList       [_xOrd]        (set x_) (list x_),
     prim2     _sets_union        Sets.union        [_xOrd]        (set x_) (set x_) (set x_),
     prim1     _sets_unions       Sets.unions       [_xOrd]        (list $ set x_) (set x_)]
+
+hydraLibRegex :: Library
+hydraLibRegex = standardLibrary _hydra_lib_regex [
+  prim2 _regex_find       Regex.find       [] string string (optional string),
+  prim2 _regex_findAll    Regex.findAll    [] string string (list string),
+  prim2 _regex_matches    Regex.matches    [] string string boolean,
+  prim3 _regex_replace    Regex.replace    [] string string string string,
+  prim3 _regex_replaceAll Regex.replaceAll [] string string string string,
+  prim2 _regex_split      Regex.split      [] string string (list string)]
 
 hydraLibStrings :: Library
 hydraLibStrings = standardLibrary _hydra_lib_strings [
diff --git a/src/main/haskell/Hydra/Sources/Test/Annotations.hs b/src/main/haskell/Hydra/Sources/Test/Annotations.hs
--- a/src/main/haskell/Hydra/Sources/Test/Annotations.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Annotations.hs
@@ -20,21 +20,21 @@
 import qualified Hydra.Dsl.Meta.Lib.Maps as Maps
 import qualified Hydra.Sources.Kernel.Terms.Annotations as Annotations
 import qualified Hydra.Sources.Kernel.Terms.Constants as Constants
+import qualified Hydra.Dsl.Meta.Graph as Graph
 import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
 
 
--- | Test trace for Flow-based tests
-testTrace :: TTerm Term
-testTrace = metaref Monads.emptyTrace
 
--- | Test state for Flow-based tests (using Graph as the state type, since
--- functions like getTermDescription return Flow Graph ...)
--- Note: the type is TTerm Term because at the meta level, everything is a Term
+-- | Test state (an empty Graph)
 testState :: TTerm Term
 testState = metaref Lexical.emptyGraph
 
+-- | Empty Context for Either-based function tests
+testContext :: TTerm Term
+testContext = metaref Lexical.emptyContext
 
+
+
 ns :: Namespace
 ns = Namespace "hydra.test.annotations"
 
@@ -42,7 +42,7 @@
 module_ = Module ns elements [Annotations.ns, Lexical.ns] [] $
     Just "Test cases for hydra.annotations functions"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 
 -- | Test cases for getTermAnnotation and setTermAnnotation
@@ -62,27 +62,27 @@
 
   -- Retrieve a single value (multiple cases)
   -- Note: These tests require the interpreter because getTermAnnotation uses pattern matching on Term
-  evalCaseWithTags "get existing annotation #1" [tag_requiresFlowDecoding]
+  evalCase "get existing annotation #1"
     (metaref Annotations.getTermAnnotation @@ nameTerm "k1"
       @@ (metaref Annotations.setTermAnnotation @@ nameTerm "k1" @@ (optional $ just $ stringTerm "value") @@ int32Term 42))
     (optional $ just $ stringTerm "value"),
-  evalCaseWithTags "get existing annotation #2" [tag_requiresFlowDecoding]
+  evalCase "get existing annotation #2"
     (metaref Annotations.getTermAnnotation @@ nameTerm "foo"
       @@ (metaref Annotations.setTermAnnotation @@ nameTerm "foo" @@ (optional $ just $ stringTerm "") @@ int32Term 99))
     (optional $ just $ stringTerm ""),
-  evalCaseWithTags "get existing annotation #3" [tag_requiresFlowDecoding]
+  evalCase "get existing annotation #3"
     (metaref Annotations.getTermAnnotation @@ nameTerm "key"
       @@ (metaref Annotations.setTermAnnotation @@ nameTerm "key" @@ (optional $ just $ int32Term 123) @@ stringTerm "test"))
     (optional $ just $ int32Term 123),
 
   -- Retrieve a null value (annotation not present) - multiple cases
-  evalCaseWithTags "get missing annotation #1" [tag_requiresFlowDecoding]
+  evalCase "get missing annotation #1"
     (metaref Annotations.getTermAnnotation @@ nameTerm "k1" @@ int16Term 42)
     (optional nothing),
-  evalCaseWithTags "get missing annotation #2" [tag_requiresFlowDecoding]
+  evalCase "get missing annotation #2"
     (metaref Annotations.getTermAnnotation @@ nameTerm "nonexistent" @@ stringTerm "hello")
     (optional nothing),
-  evalCaseWithTags "get missing annotation #3" [tag_requiresFlowDecoding]
+  evalCase "get missing annotation #3"
     (metaref Annotations.getTermAnnotation @@ nameTerm "k1"
       @@ (metaref Annotations.setTermAnnotation @@ nameTerm "k2" @@ (optional $ just $ int32Term 1) @@ int32Term 42))
     (optional nothing),
@@ -152,37 +152,30 @@
     (metaref Annotations.setTermDescription @@ (optional $ just $ string "A longer description with spaces") @@ booleanTerm True)
     (annotatedTerm (booleanTerm True) $ Terms.map $ Maps.singleton (nameTerm "description") (stringTerm "A longer description with spaces")),
 
-  -- Get existing description (returns Flow Graph (Maybe String))
-  -- Note: These tests require the interpreter because getTermDescription uses Flow and pattern matching
-  evalCaseWithTags "get existing description #1" [tag_requiresFlowDecoding]
-    (unFlowTerm @@ (metaref Annotations.getTermDescription
+  -- Get existing description (returns Either (InContext Error) (Maybe String))
+  evalCase "get existing description #1"
+    (metaref Annotations.getTermDescription @@ testContext @@ testState
       @@ (metaref Annotations.setTermDescription @@ (optional $ just $ string "hello") @@ int32Term 42))
-      @@ testState @@ testTrace)
-    (flowStateTerm (optional $ just $ (optional $ just $ string "hello")) testState testTrace),
-  evalCaseWithTags "get existing description #2" [tag_requiresFlowDecoding]
-    (unFlowTerm @@ (metaref Annotations.getTermDescription
+    (right (optional $ just $ string "hello")),
+  evalCase "get existing description #2"
+    (metaref Annotations.getTermDescription @@ testContext @@ testState
       @@ (metaref Annotations.setTermDescription @@ (optional $ just $ string "") @@ stringTerm "test"))
-      @@ testState @@ testTrace)
-    (flowStateTerm (optional $ just $ (optional $ just $ string "")) testState testTrace),
-  evalCaseWithTags "get existing description #3" [tag_requiresFlowDecoding]
-    (unFlowTerm @@ (metaref Annotations.getTermDescription
+    (right (optional $ just $ string "")),
+  evalCase "get existing description #3"
+    (metaref Annotations.getTermDescription @@ testContext @@ testState
       @@ (metaref Annotations.setTermDescription @@ (optional $ just $ string "desc") @@ booleanTerm False))
-      @@ testState @@ testTrace)
-    (flowStateTerm (optional $ just $ (optional $ just $ string "desc")) testState testTrace),
+    (right (optional $ just $ string "desc")),
 
   -- Get missing description (no description annotation present)
-  evalCaseWithTags "get missing description #1" [tag_requiresFlowDecoding]
-    (unFlowTerm @@ (metaref Annotations.getTermDescription @@ int16Term 42)
-      @@ testState @@ testTrace)
-    (flowStateTerm (optional $ just $ (optional nothing)) testState testTrace),
-  evalCaseWithTags "get missing description #2" [tag_requiresFlowDecoding]
-    (unFlowTerm @@ (metaref Annotations.getTermDescription @@ stringTerm "no description here")
-      @@ testState @@ testTrace)
-    (flowStateTerm (optional $ just $ (optional nothing)) testState testTrace),
-  evalCaseWithTags "get missing description #3" [tag_requiresFlowDecoding]
-    (unFlowTerm @@ (metaref Annotations.getTermDescription @@ int32Term 0)
-      @@ testState @@ testTrace)
-    (flowStateTerm (optional $ just $ (optional nothing)) testState testTrace),
+  evalCase "get missing description #1"
+    (metaref Annotations.getTermDescription @@ testContext @@ testState @@ int16Term 42)
+    (right (optional nothing)),
+  evalCase "get missing description #2"
+    (metaref Annotations.getTermDescription @@ testContext @@ testState @@ stringTerm "no description here")
+    (right (optional nothing)),
+  evalCase "get missing description #3"
+    (metaref Annotations.getTermDescription @@ testContext @@ testState @@ int32Term 0)
+    (right (optional nothing)),
 
   -- An outer description overrides an inner one (multiple cases)
   evalCase "outer description overrides inner #1"
@@ -209,23 +202,23 @@
 layeredAnnotationTests :: TTerm TestGroup
 layeredAnnotationTests = subgroup "layered annotations" [
   -- Annotations at different levels, with different keys, are all available
-  evalCaseWithTags "get annotation from unannotated term" [tag_requiresFlowDecoding]
+  evalCase "get annotation from unannotated term"
     (metaref Annotations.getTermAnnotation @@ nameTerm "one" @@ int32Term 42)
     (optional nothing),
 
-  evalCaseWithTags "get annotation from singly annotated term" [tag_requiresFlowDecoding]
+  evalCase "get annotation from singly annotated term"
     (metaref Annotations.getTermAnnotation @@ nameTerm "one"
       @@ (annotatedTerm (int32Term 42) $ Terms.map $ Maps.singleton (nameTerm "one") (int32Term 1)))
     (optional $ just $ int32Term 1),
 
-  evalCaseWithTags "get inner annotation from doubly annotated term" [tag_requiresFlowDecoding]
+  evalCase "get inner annotation from doubly annotated term"
     (metaref Annotations.getTermAnnotation @@ nameTerm "one"
       @@ (annotatedTerm
            (annotatedTerm (int32Term 42) $ Terms.map $ Maps.singleton (nameTerm "one") (int32Term 1))
            $ Terms.map $ Maps.singleton (nameTerm "two") (int32Term 2)))
     (optional $ just $ int32Term 1),
 
-  evalCaseWithTags "get outer annotation from doubly annotated term" [tag_requiresFlowDecoding]
+  evalCase "get outer annotation from doubly annotated term"
     (metaref Annotations.getTermAnnotation @@ nameTerm "two"
       @@ (annotatedTerm
            (annotatedTerm (int32Term 42) $ Terms.map $ Maps.singleton (nameTerm "one") (int32Term 1))
@@ -233,7 +226,7 @@
     (optional $ just $ int32Term 2),
 
   -- Non-overridden annotation still accessible in triply annotated term
-  evalCaseWithTags "get non-overridden annotation from triply annotated term" [tag_requiresFlowDecoding]
+  evalCase "get non-overridden annotation from triply annotated term"
     (metaref Annotations.getTermAnnotation @@ nameTerm "two"
       @@ (annotatedTerm
            (annotatedTerm
@@ -243,7 +236,7 @@
     (optional $ just $ int32Term 2),
 
   -- Outer annotations override inner ones
-  evalCaseWithTags "outer annotation overrides inner in layered term" [tag_requiresFlowDecoding]
+  evalCase "outer annotation overrides inner in layered term"
     (metaref Annotations.getTermAnnotation @@ nameTerm "one"
       @@ (annotatedTerm
            (annotatedTerm
diff --git a/src/main/haskell/Hydra/Sources/Test/Checking/Advanced.hs b/src/main/haskell/Hydra/Sources/Test/Checking/Advanced.hs
--- a/src/main/haskell/Hydra/Sources/Test/Checking/Advanced.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Checking/Advanced.hs
@@ -27,13 +27,11 @@
     (Just "Advanced type checking test cases: annotated terms and flows")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding annotatedTermsTests,
-      Phantoms.toBinding topLevelAnnotationsTests,
-      Phantoms.toBinding nestedAnnotationsTests,
-      Phantoms.toBinding annotationsInComplexContextsTests,
-      Phantoms.toBinding flowsTests,
-      Phantoms.toBinding flowsWithFailureAcrossLetBindingsTests]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition annotatedTermsTests,
+      Phantoms.toTermDefinition topLevelAnnotationsTests,
+      Phantoms.toTermDefinition nestedAnnotationsTests,
+      Phantoms.toTermDefinition annotationsInComplexContextsTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -42,8 +40,7 @@
 allTests = define "allTests" $
   Phantoms.doc "Advanced type checking test cases" $
   supergroup "Advanced" [
-    annotatedTermsTests,
-    flowsTests]
+    annotatedTermsTests]
 
 ------ Helper functions ------
 
@@ -143,48 +140,4 @@
 --        var "add" @@ annotated (int32 10) M.empty @@ annotated (int32 20) M.empty)
 --      Types.int32
 
------- Flows ------
 
-flowsTests :: TBinding TestGroup
-flowsTests = define "flowsTests" $
-  supergroup "Flows" [
-    flowsWithFailureAcrossLetBindingsTests]
-
-flowsWithFailureAcrossLetBindingsTests :: TBinding TestGroup
-flowsWithFailureAcrossLetBindingsTests = define "flowsWithFailureAcrossLetBindingsTests" $
-  subgroup "Flows with failure across let bindings" [
-    checkTest "mutually referential failure functions with Flow monad" [tag_disabledForPython]  -- Very slow in Python (47+ seconds)
-      (lets ["conditionalUnexpected">: lambda "s" $ lambda "b" $ lambda "ignored" $
-               primitive _logic_ifElse @@ var "b" @@
-                 (var "unexpected" @@ string "oops") @@
-                 (var "unexpected" @@ var "s"),
-             "unexpected">: lambda "s" $ primitive _flows_fail @@ var "s"] $
-        var "conditionalUnexpected")
-      (tylams ["t0", "t1", "t2"] $
-        letsTyped [
-          ("conditionalUnexpected",
-           tylams ["t3", "t4", "t5"] $
-           lambdaTyped "s" T.string $
-           lambdaTyped "b" T.boolean $
-           lambdaTyped "ignored" (T.var "t3") $
-           tyapp (primitive _logic_ifElse) (T.applys (Core.typeVariable $ name "hydra.compute.Flow") [T.var "t4", T.var "t5"]) @@ var "b" @@
-             (tyapps (var "unexpected") [T.var "t4", T.var "t5"] @@ string "oops") @@
-             (tyapps (var "unexpected") [T.var "t4", T.var "t5"] @@ var "s"),
-           T.poly ["t3", "t4", "t5"] $
-             T.function T.string $
-             T.function T.boolean $
-             T.function (T.var "t3") $
-             T.applys (Core.typeVariable $ name "hydra.compute.Flow") [T.var "t4", T.var "t5"]),
-          ("unexpected",
-           tylams ["t3", "t4"] $
-           lambdaTyped "s" T.string $
-             tyapps (primitive _flows_fail) [T.var "t3", T.var "t4"] @@ var "s",
-           T.poly ["t3", "t4"] $
-             T.function T.string $
-             T.applys (Core.typeVariable $ name "hydra.compute.Flow") [T.var "t3", T.var "t4"])] $
-        tyapps (var "conditionalUnexpected") [T.var "t0", T.var "t1", T.var "t2"])
-      (T.forAlls ["t0", "t1", "t2"] $
-        T.function T.string $
-        T.function T.boolean $
-        T.function (T.var "t0") $
-        T.applys (Core.typeVariable $ name "hydra.compute.Flow") [T.var "t1", T.var "t2"])]
diff --git a/src/main/haskell/Hydra/Sources/Test/Checking/AlgebraicTypes.hs b/src/main/haskell/Hydra/Sources/Test/Checking/AlgebraicTypes.hs
--- a/src/main/haskell/Hydra/Sources/Test/Checking/AlgebraicTypes.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Checking/AlgebraicTypes.hs
@@ -27,29 +27,29 @@
     (Just "Algebraic type checking test cases: unit, pairs, eithers, optionals")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding unitTests,
-      Phantoms.toBinding unitTermTests,
-      Phantoms.toBinding unitTermInPolymorphicContextTests,
-      Phantoms.toBinding pairsTests,
-      Phantoms.toBinding basicPairsTests,
-      Phantoms.toBinding polymorphicPairsTests,
-      Phantoms.toBinding pairsInComplexContextsTests,
-      Phantoms.toBinding nestedPairsTests,
-      Phantoms.toBinding pairsWithComplexTypesTests,
-      Phantoms.toBinding eithersTests,
-      Phantoms.toBinding leftValuesTests,
-      Phantoms.toBinding rightValuesTests,
-      Phantoms.toBinding polymorphicEithersTests,
-      Phantoms.toBinding eithersInComplexContextsTests,
-      Phantoms.toBinding nestedEithersTests,
-      Phantoms.toBinding eithersWithComplexTypesTests,
-      Phantoms.toBinding optionalsTests,
-      Phantoms.toBinding monomorphicOptionalsTests,
-      Phantoms.toBinding polymorphicOptionalsTests,
-      Phantoms.toBinding optionalsInComplexContextsTests,
-      Phantoms.toBinding nestedOptionalsTests,
-      Phantoms.toBinding optionalsWithComplexTypesTests]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition unitTests,
+      Phantoms.toTermDefinition unitTermTests,
+      Phantoms.toTermDefinition unitTermInPolymorphicContextTests,
+      Phantoms.toTermDefinition pairsTests,
+      Phantoms.toTermDefinition basicPairsTests,
+      Phantoms.toTermDefinition polymorphicPairsTests,
+      Phantoms.toTermDefinition pairsInComplexContextsTests,
+      Phantoms.toTermDefinition nestedPairsTests,
+      Phantoms.toTermDefinition pairsWithComplexTypesTests,
+      Phantoms.toTermDefinition eithersTests,
+      Phantoms.toTermDefinition leftValuesTests,
+      Phantoms.toTermDefinition rightValuesTests,
+      Phantoms.toTermDefinition polymorphicEithersTests,
+      Phantoms.toTermDefinition eithersInComplexContextsTests,
+      Phantoms.toTermDefinition nestedEithersTests,
+      Phantoms.toTermDefinition eithersWithComplexTypesTests,
+      Phantoms.toTermDefinition optionalsTests,
+      Phantoms.toTermDefinition monomorphicOptionalsTests,
+      Phantoms.toTermDefinition polymorphicOptionalsTests,
+      Phantoms.toTermDefinition optionalsInComplexContextsTests,
+      Phantoms.toTermDefinition nestedOptionalsTests,
+      Phantoms.toTermDefinition optionalsWithComplexTypesTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Checking/All.hs b/src/main/haskell/Hydra/Sources/Test/Checking/All.hs
--- a/src/main/haskell/Hydra/Sources/Test/Checking/All.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Checking/All.hs
@@ -28,7 +28,7 @@
 module_ = Module ns elements namespaces kernelTypesNamespaces $
     Just "Hydra's type checking test suite"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
     namespaces = [
       Advanced.ns,
       AlgebraicTypes.ns,
diff --git a/src/main/haskell/Hydra/Sources/Test/Checking/Collections.hs b/src/main/haskell/Hydra/Sources/Test/Checking/Collections.hs
--- a/src/main/haskell/Hydra/Sources/Test/Checking/Collections.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Checking/Collections.hs
@@ -27,24 +27,24 @@
     (Just "Collection type checking test cases: lists, sets, maps")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding listsTests,
-      Phantoms.toBinding listsOfLiteralsTests,
-      Phantoms.toBinding emptyListsTests,
-      Phantoms.toBinding polymorphicListsTests,
-      Phantoms.toBinding nestedListsTests,
-      Phantoms.toBinding listsInComplexContextsTests,
-      Phantoms.toBinding mapsTests,
-      Phantoms.toBinding monomorphicMapsTests,
-      Phantoms.toBinding polymorphicMapsTests,
-      Phantoms.toBinding mapsInComplexContextsTests,
-      Phantoms.toBinding mapsWithComplexTypesTests,
-      Phantoms.toBinding setsTests,
-      Phantoms.toBinding monomorphicSetsTests,
-      Phantoms.toBinding polymorphicSetsTests,
-      Phantoms.toBinding setsInComplexContextsTests,
-      Phantoms.toBinding nestedSetsTests,
-      Phantoms.toBinding setsWithComplexTypesTests]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition listsTests,
+      Phantoms.toTermDefinition listsOfLiteralsTests,
+      Phantoms.toTermDefinition emptyListsTests,
+      Phantoms.toTermDefinition polymorphicListsTests,
+      Phantoms.toTermDefinition nestedListsTests,
+      Phantoms.toTermDefinition listsInComplexContextsTests,
+      Phantoms.toTermDefinition mapsTests,
+      Phantoms.toTermDefinition monomorphicMapsTests,
+      Phantoms.toTermDefinition polymorphicMapsTests,
+      Phantoms.toTermDefinition mapsInComplexContextsTests,
+      Phantoms.toTermDefinition mapsWithComplexTypesTests,
+      Phantoms.toTermDefinition setsTests,
+      Phantoms.toTermDefinition monomorphicSetsTests,
+      Phantoms.toTermDefinition polymorphicSetsTests,
+      Phantoms.toTermDefinition setsInComplexContextsTests,
+      Phantoms.toTermDefinition nestedSetsTests,
+      Phantoms.toTermDefinition setsWithComplexTypesTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Checking/Failures.hs b/src/main/haskell/Hydra/Sources/Test/Checking/Failures.hs
--- a/src/main/haskell/Hydra/Sources/Test/Checking/Failures.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Checking/Failures.hs
@@ -27,9 +27,9 @@
     (Just "Type checking failure test cases")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding failOnUntypedTests,
-      Phantoms.toBinding untypedLambdasTests]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition failOnUntypedTests,
+      Phantoms.toTermDefinition untypedLambdasTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Checking/Fundamentals.hs b/src/main/haskell/Hydra/Sources/Test/Checking/Fundamentals.hs
--- a/src/main/haskell/Hydra/Sources/Test/Checking/Fundamentals.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Checking/Fundamentals.hs
@@ -30,49 +30,49 @@
     (Just "Fundamental type checking test cases: literals, variables, lambdas, applications, let terms, and primitives")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding applicationsTests,
-      Phantoms.toBinding simpleFunctionApplicationsTests,
-      Phantoms.toBinding partialApplicationsTests,
-      Phantoms.toBinding higherOrderApplicationsTests,
-      Phantoms.toBinding polymorphicApplicationsTests,
-      Phantoms.toBinding applicationsInComplexContextsTests,
-      Phantoms.toBinding applicationsWithComplexArgumentsTests,
-      Phantoms.toBinding lambdasTests,
-      Phantoms.toBinding simpleLambdasTests,
-      Phantoms.toBinding multiParameterLambdasTests,
-      Phantoms.toBinding lambdasWithOperationsTests,
-      Phantoms.toBinding nestedLambdasTests,
-      Phantoms.toBinding lambdasInComplexContextsTests,
-      Phantoms.toBinding higherOrderLambdasTests,
-      Phantoms.toBinding letTermsTests,
-      Phantoms.toBinding simpleLetBindingsTests,
-      Phantoms.toBinding letTermsWithShadowingTests,
-      Phantoms.toBinding recursiveBindingsTests,
-      Phantoms.toBinding mutualRecursionTests,
-      Phantoms.toBinding nestedLetTermsTests,
-      Phantoms.toBinding letWithComplexExpressionsTests,
-      Phantoms.toBinding literalsTests,
-      Phantoms.toBinding booleanLiteralsTests,
-      Phantoms.toBinding stringLiteralsTests,
-      Phantoms.toBinding integerLiteralsTests,
-      Phantoms.toBinding floatLiteralsTests,
---      toBinding binaryLiteralsTests,  -- TODO: restore when binary literal code generation is supported
-      Phantoms.toBinding literalsInComplexContextsTests,
-      Phantoms.toBinding primitivesTests,
-      Phantoms.toBinding nullaryPrimitivesTests,
-      Phantoms.toBinding unaryPrimitivesTests,
-      Phantoms.toBinding binaryPrimitivesTests,
-      Phantoms.toBinding ternaryPrimitivesTests,
-      Phantoms.toBinding monomorphicVsPolymorphicTests,
-      Phantoms.toBinding higherOrderPrimitivesTests,
-      Phantoms.toBinding primitivesInComplexContextsTests,
-      Phantoms.toBinding variablesTests,
-      Phantoms.toBinding simpleVariableLookupTests,
-      Phantoms.toBinding variableScopingTests,
-      Phantoms.toBinding polymorphicVariablesTests,
-      Phantoms.toBinding variablesInComplexContextsTests,
-      Phantoms.toBinding recursiveVariablesTests]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition applicationsTests,
+      Phantoms.toTermDefinition simpleFunctionApplicationsTests,
+      Phantoms.toTermDefinition partialApplicationsTests,
+      Phantoms.toTermDefinition higherOrderApplicationsTests,
+      Phantoms.toTermDefinition polymorphicApplicationsTests,
+      Phantoms.toTermDefinition applicationsInComplexContextsTests,
+      Phantoms.toTermDefinition applicationsWithComplexArgumentsTests,
+      Phantoms.toTermDefinition lambdasTests,
+      Phantoms.toTermDefinition simpleLambdasTests,
+      Phantoms.toTermDefinition multiParameterLambdasTests,
+      Phantoms.toTermDefinition lambdasWithOperationsTests,
+      Phantoms.toTermDefinition nestedLambdasTests,
+      Phantoms.toTermDefinition lambdasInComplexContextsTests,
+      Phantoms.toTermDefinition higherOrderLambdasTests,
+      Phantoms.toTermDefinition letTermsTests,
+      Phantoms.toTermDefinition simpleLetBindingsTests,
+      Phantoms.toTermDefinition letTermsWithShadowingTests,
+      Phantoms.toTermDefinition recursiveBindingsTests,
+      Phantoms.toTermDefinition mutualRecursionTests,
+      Phantoms.toTermDefinition nestedLetTermsTests,
+      Phantoms.toTermDefinition letWithComplexExpressionsTests,
+      Phantoms.toTermDefinition literalsTests,
+      Phantoms.toTermDefinition booleanLiteralsTests,
+      Phantoms.toTermDefinition stringLiteralsTests,
+      Phantoms.toTermDefinition integerLiteralsTests,
+      Phantoms.toTermDefinition floatLiteralsTests,
+--      toTermDefinition binaryLiteralsTests,  -- TODO: restore when binary literal code generation is supported
+      Phantoms.toTermDefinition literalsInComplexContextsTests,
+      Phantoms.toTermDefinition primitivesTests,
+      Phantoms.toTermDefinition nullaryPrimitivesTests,
+      Phantoms.toTermDefinition unaryPrimitivesTests,
+      Phantoms.toTermDefinition binaryPrimitivesTests,
+      Phantoms.toTermDefinition ternaryPrimitivesTests,
+      Phantoms.toTermDefinition monomorphicVsPolymorphicTests,
+      Phantoms.toTermDefinition higherOrderPrimitivesTests,
+      Phantoms.toTermDefinition primitivesInComplexContextsTests,
+      Phantoms.toTermDefinition variablesTests,
+      Phantoms.toTermDefinition simpleVariableLookupTests,
+      Phantoms.toTermDefinition variableScopingTests,
+      Phantoms.toTermDefinition polymorphicVariablesTests,
+      Phantoms.toTermDefinition variablesInComplexContextsTests,
+      Phantoms.toTermDefinition recursiveVariablesTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Checking/NominalTypes.hs b/src/main/haskell/Hydra/Sources/Test/Checking/NominalTypes.hs
--- a/src/main/haskell/Hydra/Sources/Test/Checking/NominalTypes.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Checking/NominalTypes.hs
@@ -27,61 +27,61 @@
     (Just "Nominal type checking test cases: records, unions, field access, injection, projection")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding recordsTests,
-      Phantoms.toBinding monomorphicRecordsTests,
-      Phantoms.toBinding polymorphicRecordsTests,
-      Phantoms.toBinding recordsInComplexContextsTests,
-      Phantoms.toBinding multiParameterPolymorphicRecordsTests,
-      Phantoms.toBinding recordEliminationsTests,
-      Phantoms.toBinding simpleRecordProjectionsTests,
-      Phantoms.toBinding recordProjectionsAppliedToRecordsTests,
-      Phantoms.toBinding polymorphicRecordProjectionsTests,
-      Phantoms.toBinding polymorphicRecordProjectionsAppliedTests,
-      Phantoms.toBinding recordProjectionsWithVariablesTests,
-      Phantoms.toBinding recordProjectionsInComplexContextsTests,
-      Phantoms.toBinding multiParameterPolymorphicProjectionsTests,
-      Phantoms.toBinding higherOrderRecordProjectionsTests,
-      Phantoms.toBinding recursiveRecordProjectionsTests,
-      Phantoms.toBinding recordProjectionsWithMutualRecursionTests,
-      Phantoms.toBinding unionsTests,
-      Phantoms.toBinding simpleUnionInjectionsTests,
-      Phantoms.toBinding unionInjectionsWithDataTests,
-      Phantoms.toBinding polymorphicUnionInjectionsTests,
-      Phantoms.toBinding polymorphicRecursiveUnionInjectionsTests,
-      Phantoms.toBinding polymorphicUnionsFromLambdaTests,
-      Phantoms.toBinding unionsInComplexContextsTests,
-      Phantoms.toBinding multiParameterPolymorphicInjectionsTests,
-      Phantoms.toBinding unionEliminationsTests,
-      Phantoms.toBinding simpleUnitVariantEliminationsTests,
-      Phantoms.toBinding unionEliminationsWithDataTests,
-      Phantoms.toBinding polymorphicUnionEliminationsTests,
-      Phantoms.toBinding simplePolymorphicUnionTests,
-      Phantoms.toBinding usingUnionPolymorphicRecursiveTests,
-      Phantoms.toBinding usingKernelTypesTests,
-      Phantoms.toBinding unionEliminationsWithDefaultsTests,
-      Phantoms.toBinding nestedUnionEliminationsTests,
-      Phantoms.toBinding unionEliminationsInComplexContextsTests,
-      Phantoms.toBinding multiParameterPolymorphicCaseStatementsTests,
-      Phantoms.toBinding higherOrderUnionEliminationsTests,
-      Phantoms.toBinding recursiveUnionEliminationsTests,
-      Phantoms.toBinding wrappedTermsTests,
-      Phantoms.toBinding monomorphicWrappedTermsTests,
-      Phantoms.toBinding polymorphicWrappedTermsTests,
-      Phantoms.toBinding wrappedTermsInComplexContextsTests,
-      Phantoms.toBinding nestedWrappedTermsTests,
-      Phantoms.toBinding multipleWrappingLevelsTests,
-      Phantoms.toBinding multiParameterPolymorphicWrappersTests,
-      Phantoms.toBinding wrapEliminationsTests,
-      Phantoms.toBinding monomorphicUnwrappingTests,
-      Phantoms.toBinding polymorphicUnwrappingTests,
-      Phantoms.toBinding unwrapEliminationsInApplicationsTests,
-      Phantoms.toBinding unwrapInComplexContextsTests,
-      Phantoms.toBinding multiParameterPolymorphicUnwrappersTests,
-      Phantoms.toBinding chainedUnwrappingTests,
-      Phantoms.toBinding multipleUnwrapOperationsTests,
-      Phantoms.toBinding eliminationsTests,
-      Phantoms.toBinding projectionsWithVariablesTests]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition recordsTests,
+      Phantoms.toTermDefinition monomorphicRecordsTests,
+      Phantoms.toTermDefinition polymorphicRecordsTests,
+      Phantoms.toTermDefinition recordsInComplexContextsTests,
+      Phantoms.toTermDefinition multiParameterPolymorphicRecordsTests,
+      Phantoms.toTermDefinition recordEliminationsTests,
+      Phantoms.toTermDefinition simpleRecordProjectionsTests,
+      Phantoms.toTermDefinition recordProjectionsAppliedToRecordsTests,
+      Phantoms.toTermDefinition polymorphicRecordProjectionsTests,
+      Phantoms.toTermDefinition polymorphicRecordProjectionsAppliedTests,
+      Phantoms.toTermDefinition recordProjectionsWithVariablesTests,
+      Phantoms.toTermDefinition recordProjectionsInComplexContextsTests,
+      Phantoms.toTermDefinition multiParameterPolymorphicProjectionsTests,
+      Phantoms.toTermDefinition higherOrderRecordProjectionsTests,
+      Phantoms.toTermDefinition recursiveRecordProjectionsTests,
+      Phantoms.toTermDefinition recordProjectionsWithMutualRecursionTests,
+      Phantoms.toTermDefinition unionsTests,
+      Phantoms.toTermDefinition simpleUnionInjectionsTests,
+      Phantoms.toTermDefinition unionInjectionsWithDataTests,
+      Phantoms.toTermDefinition polymorphicUnionInjectionsTests,
+      Phantoms.toTermDefinition polymorphicRecursiveUnionInjectionsTests,
+      Phantoms.toTermDefinition polymorphicUnionsFromLambdaTests,
+      Phantoms.toTermDefinition unionsInComplexContextsTests,
+      Phantoms.toTermDefinition multiParameterPolymorphicInjectionsTests,
+      Phantoms.toTermDefinition unionEliminationsTests,
+      Phantoms.toTermDefinition simpleUnitVariantEliminationsTests,
+      Phantoms.toTermDefinition unionEliminationsWithDataTests,
+      Phantoms.toTermDefinition polymorphicUnionEliminationsTests,
+      Phantoms.toTermDefinition simplePolymorphicUnionTests,
+      Phantoms.toTermDefinition usingUnionPolymorphicRecursiveTests,
+      Phantoms.toTermDefinition usingKernelTypesTests,
+      Phantoms.toTermDefinition unionEliminationsWithDefaultsTests,
+      Phantoms.toTermDefinition nestedUnionEliminationsTests,
+      Phantoms.toTermDefinition unionEliminationsInComplexContextsTests,
+      Phantoms.toTermDefinition multiParameterPolymorphicCaseStatementsTests,
+      Phantoms.toTermDefinition higherOrderUnionEliminationsTests,
+      Phantoms.toTermDefinition recursiveUnionEliminationsTests,
+      Phantoms.toTermDefinition wrappedTermsTests,
+      Phantoms.toTermDefinition monomorphicWrappedTermsTests,
+      Phantoms.toTermDefinition polymorphicWrappedTermsTests,
+      Phantoms.toTermDefinition wrappedTermsInComplexContextsTests,
+      Phantoms.toTermDefinition nestedWrappedTermsTests,
+      Phantoms.toTermDefinition multipleWrappingLevelsTests,
+      Phantoms.toTermDefinition multiParameterPolymorphicWrappersTests,
+      Phantoms.toTermDefinition wrapEliminationsTests,
+      Phantoms.toTermDefinition monomorphicUnwrappingTests,
+      Phantoms.toTermDefinition polymorphicUnwrappingTests,
+      Phantoms.toTermDefinition unwrapEliminationsInApplicationsTests,
+      Phantoms.toTermDefinition unwrapInComplexContextsTests,
+      Phantoms.toTermDefinition multiParameterPolymorphicUnwrappersTests,
+      Phantoms.toTermDefinition chainedUnwrappingTests,
+      Phantoms.toTermDefinition multipleUnwrapOperationsTests,
+      Phantoms.toTermDefinition eliminationsTests,
+      Phantoms.toTermDefinition projectionsWithVariablesTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -1005,33 +1005,34 @@
           nothing [
           "encode">: lambda "_" $
             lambda "v12" $
-              project (name "hydra.compute.Coder") (name "encode")
+              project (name "hydra.util.Coder") (name "encode")
                 @@ var "coder" @@ var "v12",
           "decode">: lambda "_" $
             lambda "v12" $
-              project (name "hydra.compute.Coder") (name "decode")
+              project (name "hydra.util.Coder") (name "decode")
                 @@ var "coder" @@ var "v12"]
           @@ var "dir")
-    (tylams ["t0", "t1"] $
+    (tylams ["t0"] $
       lambdaTyped "dir" (T.var "hydra.coders.CoderDirection") $
-        lambdaTyped "coder" (T.applys (T.var "hydra.compute.Coder") (T.var <$> ["t0", "t0", "t1", "t1"])) $
+        lambdaTyped "coder" (T.applys (T.var "hydra.util.Coder") (T.var <$> ["t0", "t0"])) $
           match (name "hydra.coders.CoderDirection")
             nothing [
             "encode">: lambdaTyped "_" T.unit $
-              lambdaTyped "v12" (T.var "t1") $
-                tyapps (project (name "hydra.compute.Coder") (name "encode")) (T.var <$> ["t0", "t0", "t1", "t1"])
+              lambdaTyped "v12" (T.var "hydra.context.Context") $
+                tyapps (project (name "hydra.util.Coder") (name "encode")) (T.var <$> ["t0", "t0"])
                   @@ var "coder" @@ var "v12",
             "decode">: lambdaTyped "_" T.unit $
-              lambdaTyped "v12" (T.var "t1") $
-                tyapps (project (name "hydra.compute.Coder") (name "decode")) (T.var <$> ["t0", "t0", "t1", "t1"])
+              lambdaTyped "v12" (T.var "hydra.context.Context") $
+                tyapps (project (name "hydra.util.Coder") (name "decode")) (T.var <$> ["t0", "t0"])
                   @@ var "coder" @@ var "v12"]
           @@ var "dir")
-    (T.forAlls ["t0", "t1"] $
+    (T.forAll "t0" $
       T.functionMany [
         T.var "hydra.coders.CoderDirection",
-        T.applys (T.var "hydra.compute.Coder") (T.var <$> ["t0", "t0", "t1", "t1"]),
-        T.var "t1",
-        T.applys (Core.typeVariable $ name "hydra.compute.Flow") [T.var "t0", T.var "t1"]])]
+        T.applys (T.var "hydra.util.Coder") (T.var <$> ["t0", "t0"]),
+        T.var "hydra.context.Context",
+        T.var "t0",
+        T.either_ (T.applys (T.var "hydra.context.InContext") [T.var "hydra.errors.Error"]) (T.var "t0")])]
 
 unionEliminationsWithDefaultsTests :: TBinding TestGroup
 unionEliminationsWithDefaultsTests = define "unionEliminationsWithDefaultsTests" $
diff --git a/src/main/haskell/Hydra/Sources/Test/EtaExpansion.hs b/src/main/haskell/Hydra/Sources/Test/EtaExpansion.hs
--- a/src/main/haskell/Hydra/Sources/Test/EtaExpansion.hs
+++ b/src/main/haskell/Hydra/Sources/Test/EtaExpansion.hs
@@ -28,7 +28,7 @@
     (Just "Test cases for eta expansion of terms")
   where
     elements = [
-      Phantoms.toBinding allTests]
+      Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = Phantoms.definitionInModule module_
@@ -384,20 +384,20 @@
 
     nonExpansionOfEliminations = testGroup (Phantoms.string "Non-expansion of eliminations which produce functions") Phantoms.nothing (Phantoms.list ([] :: [TTerm TestGroup])) (Phantoms.list [
       noChange "applied case statement"
-        (tylams ["t0", "t1"] $
+        (tylams ["t0"] $
           lambdaTyped "dir" (T.var "hydra.coders.CoderDirection") $
-            lambdaTyped "coder" (T.applys (T.var "hydra.compute.Coder") (T.var <$> ["t0", "t0", "t1", "t1"])) $
-              match (Core.nameLift _CoderDirection)
-                nothing [
-                "encode">: lambdaTyped "_" T.unit $
-                  lambdaTyped "v12" (T.var "t1") $
-                    tyapps (project (Core.nameLift _Coder) (Core.name (Phantoms.string "encode"))) (T.var <$> ["t0", "t0", "t1", "t1"])
-                      @@ var "coder" @@ var "v12",
-                "decode">: lambdaTyped "_" T.unit $
-                  lambdaTyped "v12" (T.var "t1") $
-                    tyapps (project (Core.nameLift _Coder) (Core.name (Phantoms.string "decode"))) (T.var <$> ["t0", "t0", "t1", "t1"])
-                      @@ var "coder" @@ var "v12"]
-              @@ var "dir"),
+            lambdaTyped "coder" (T.applys (T.var "hydra.util.Coder") (T.var <$> ["t0", "t0"])) $
+              lambdaTyped "cx" (T.var "hydra.context.Context") $
+                lambdaTyped "v1" (T.var "t0") $
+                  match (Core.nameLift _CoderDirection)
+                    nothing [
+                    "encode">: lambdaTyped "_" T.unit $
+                      tyapps (project (Core.nameLift _Coder) (Core.name (Phantoms.string "encode"))) (T.var <$> ["t0", "t0"])
+                        @@ var "coder" @@ var "cx" @@ var "v1",
+                    "decode">: lambdaTyped "_" T.unit $
+                      tyapps (project (Core.nameLift _Coder) (Core.name (Phantoms.string "decode"))) (T.var <$> ["t0", "t0"])
+                        @@ var "coder" @@ var "cx" @@ var "v1"]
+                  @@ var "dir"),
       noChange "applied projection"
         (tyapps (project TestTypes.testTypeTripleName (Core.name (Phantoms.string "third"))) [T.int32, T.int32, T.function T.string T.string]
         @@ (record TestTypes.testTypeTripleName [
diff --git a/src/main/haskell/Hydra/Sources/Test/Formatting.hs b/src/main/haskell/Hydra/Sources/Test/Formatting.hs
--- a/src/main/haskell/Hydra/Sources/Test/Formatting.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Formatting.hs
@@ -14,7 +14,7 @@
 import qualified Data.List                    as L
 import qualified Data.Map                     as M
 
-import qualified Hydra.Dsl.Meta.Util as Util
+import qualified Hydra.Dsl.Util as Util
 import qualified Hydra.Show.Util as ShowUtil
 
 
@@ -28,8 +28,8 @@
     (Just "Test cases for string formatting and case conversion")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding caseConversionTests]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition caseConversionTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Hoisting.hs b/src/main/haskell/Hydra/Sources/Test/Hoisting.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Test/Hoisting.hs
+++ /dev/null
@@ -1,2137 +0,0 @@
--- | Test cases for hoisting transformations
-module Hydra.Sources.Test.Hoisting where
-
--- Standard imports for shallow DSL tests
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Testing                 as Testing
-import Hydra.Dsl.Meta.Terms                   as Terms
-import Hydra.Sources.Kernel.Types.All
-import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
-import qualified Hydra.Dsl.Meta.Types         as T
-import qualified Hydra.Sources.Test.TestGraph as TestGraph
-import qualified Hydra.Sources.Test.TestTerms as TestTerms
-import qualified Hydra.Sources.Test.TestTypes as TestTypes
-import qualified Data.List                    as L
-import qualified Data.Map                     as M
-
-import Hydra.Testing
-import Hydra.Sources.Libraries
-
-
-ns :: Namespace
-ns = Namespace "hydra.test.hoisting"
-
-module_ :: Module
-module_ = Module ns elements [] [] $
-    Just "Test cases for hoisting transformations"
-  where
-    elements = [Phantoms.toBinding allTests]
-
-allTests :: TBinding TestGroup
-allTests = definitionInModule module_ "allTests" $
-    Phantoms.doc "Test cases for hoisting transformations" $
-    supergroup "hoisting" [
-      hoistSubtermsGroup,
-      hoistCaseStatementsGroup,
-      hoistLetBindingsGroup,
-      hoistPolymorphicLetBindingsGroup,
-      hoistPolymorphicTypeParametersGroup]
-
--- Helper to build names
-nm :: String -> TTerm Name
-nm s = Core.name $ Phantoms.string s
-
--- Helper to build an empty annotation map
-emptyAnnMap :: TTerm (M.Map Name Term)
-emptyAnnMap = Phantoms.map M.empty
-
--- Helper for single-binding let
-letExpr :: String -> TTerm Term -> TTerm Term -> TTerm Term
-letExpr varName value body = lets [(nm varName, value)] body
-
--- Helper for multi-binding let
-multiLet :: [(String, TTerm Term)] -> TTerm Term -> TTerm Term
-multiLet bindings body = lets ((\(n, v) -> (nm n, v)) <$> bindings) body
-
--- | Test cases for hoistSubterms
--- This function hoists subterms matching a predicate into local let bindings.
--- The predicate receives the term and returns True if the term should be hoisted.
--- For each let term, immediate subterms (binding values and body) are processed:
--- matching subterms are collected and hoisted into a local let that wraps
--- that immediate subterm.
-hoistSubtermsGroup :: TTerm TestGroup
-hoistSubtermsGroup = subgroup "hoistSubterms" [
-    -- ============================================================
-    -- Test: hoistNothing predicate (identity transformation)
-    -- The hoistNothing predicate never hoists anything.
-    -- ============================================================
-
-    hoistCase "hoistNothing: simple let unchanged"
-      hoistPredicateNothing
-      -- Input: let x = 42 in x
-      (letExpr "x" (int32 42) (var "x"))
-      -- Output: unchanged
-      (letExpr "x" (int32 42) (var "x")),
-
-    hoistCase "hoistNothing: let with list in body unchanged"
-      hoistPredicateNothing
-      -- Input: let x = 1 in [x, 2, 3]
-      (letExpr "x" (int32 1) (list [var "x", int32 2, int32 3]))
-      -- Output: unchanged - hoistNothing never hoists
-      (letExpr "x" (int32 1) (list [var "x", int32 2, int32 3])),
-
-    hoistCase "hoistNothing: let with application in body unchanged"
-      hoistPredicateNothing
-      -- Input: let f = g in f (h 42)
-      (letExpr "f" (var "g") (apply (var "f") (apply (var "h") (int32 42))))
-      -- Output: unchanged
-      (letExpr "f" (var "g") (apply (var "f") (apply (var "h") (int32 42)))),
-
-    -- ============================================================
-    -- Test: hoistLists predicate
-    -- Hoists list terms. Matching subterms within an immediate subterm
-    -- are collected and wrapped in a local let around that subterm.
-    -- ============================================================
-
-    hoistCase "hoistLists: list in body is hoisted into local let"
-      hoistPredicateLists
-      -- Input: let x = 1 in f [1, 2, 3]
-      (letExpr "x" (int32 1) (apply (var "f") (list [int32 1, int32 2, int32 3])))
-      -- Output: body is wrapped in local let with hoisted list
-      (letExpr "x" (int32 1)
-        (letExpr "_hoist__body_1" (list [int32 1, int32 2, int32 3])
-          (apply (var "f") (var "_hoist__body_1")))),
-
-    hoistCase "hoistLists: multiple lists in body are hoisted together"
-      hoistPredicateLists
-      -- Input: let x = 1 in pair [1, 2] [3, 4]
-      (letExpr "x" (int32 1)
-        (apply (apply (var "pair") (list [int32 1, int32 2]))
-                                         (list [int32 3, int32 4])))
-      -- Output: body is wrapped in local let with both hoisted lists
-      (letExpr "x" (int32 1)
-        (multiLet [
-          ("_hoist__body_1", list [int32 1, int32 2]),
-          ("_hoist__body_2", list [int32 3, int32 4])]
-          (apply (apply (var "pair") (var "_hoist__body_1")) (var "_hoist__body_2")))),
-
-    hoistCase "hoistLists: list in binding value is hoisted into local let"
-      hoistPredicateLists
-      -- Input: let x = f [1, 2] in x
-      (letExpr "x" (apply (var "f") (list [int32 1, int32 2])) (var "x"))
-      -- Output: binding value is wrapped in local let
-      (letExpr "x"
-        (letExpr "_hoist_x_1" (list [int32 1, int32 2])
-          (apply (var "f") (var "_hoist_x_1")))
-        (var "x")),
-
-    hoistCase "hoistLists: nested lists hoisted from inside out"
-      hoistPredicateLists
-      -- Input: let x = 1 in f [[1, 2], 3]
-      (letExpr "x" (int32 1)
-        (apply (var "f") (list [list [int32 1, int32 2], int32 3])))
-      -- Output: inner list hoisted first, then outer list
-      (letExpr "x" (int32 1)
-        (multiLet [
-          ("_hoist__body_1", list [int32 1, int32 2]),
-          ("_hoist__body_2", list [var "_hoist__body_1", int32 3])]
-          (apply (var "f") (var "_hoist__body_2")))),
-
-    -- ============================================================
-    -- Test: hoistApplications predicate
-    -- Hoists function applications.
-    -- ============================================================
-
-    hoistCase "hoistApplications: application in list element is hoisted"
-      hoistPredicateApplications
-      -- Input: let x = 1 in [f x, y]
-      (letExpr "x" (int32 1)
-        (list [apply (var "f") (var "x"), var "y"]))
-      -- Output: body is wrapped in local let
-      (letExpr "x" (int32 1)
-        (letExpr "_hoist__body_1" (apply (var "f") (var "x"))
-          (list [var "_hoist__body_1", var "y"]))),
-
-    hoistCase "hoistApplications: application in record field is hoisted"
-      hoistPredicateApplications
-      -- Input: let x = 1 in {value: f x}
-      (letExpr "x" (int32 1)
-        (record (nm "Data") [(nm "value", apply (var "f") (var "x"))]))
-      -- Output: body is wrapped in local let
-      (letExpr "x" (int32 1)
-        (letExpr "_hoist__body_1" (apply (var "f") (var "x"))
-          (record (nm "Data") [(nm "value", var "_hoist__body_1")]))),
-
-    hoistCase "hoistApplications: nested applications hoisted from inside out"
-      hoistPredicateApplications
-      -- Input: let x = 1 in [f (g x)]
-      (letExpr "x" (int32 1)
-        (list [apply (var "f") (apply (var "g") (var "x"))]))
-      -- Output: inner application hoisted first, then outer
-      (letExpr "x" (int32 1)
-        (multiLet [
-          ("_hoist__body_1", apply (var "g") (var "x")),
-          ("_hoist__body_2", apply (var "f") (var "_hoist__body_1"))]
-          (list [var "_hoist__body_2"]))),
-
-    -- ============================================================
-    -- Test: hoistCaseStatements predicate
-    -- Hoists case/match statements.
-    -- ============================================================
-
-    hoistCase "hoistCaseStatements: case in application argument is hoisted"
-      hoistPredicateCaseStatements
-      -- Input: let x = just 42 in f (match x with just y -> y | nothing -> 0)
-      (letExpr "x" (optional $ just $ int32 42)
-        (apply (var "f")
-          (match (nm "Optional") (just $ var "x")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])))
-      -- Output: body is wrapped in local let with hoisted case
-      (letExpr "x" (optional $ just $ int32 42)
-        (letExpr "_hoist__body_1"
-          (match (nm "Optional") (just $ var "x")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (apply (var "f") (var "_hoist__body_1")))),
-
-    hoistCase "hoistCaseStatements: case in list element is hoisted"
-      hoistPredicateCaseStatements
-      -- Input: let x = 1 in [match y with ok -> x | err -> 0]
-      (letExpr "x" (int32 1)
-        (list [match (nm "Result") (just $ var "y")
-          [(nm "ok", var "x"),
-           (nm "err", int32 0)]]))
-      -- Output: body is wrapped in local let
-      (letExpr "x" (int32 1)
-        (letExpr "_hoist__body_1"
-          (match (nm "Result") (just $ var "y")
-            [(nm "ok", var "x"),
-             (nm "err", int32 0)])
-          (list [var "_hoist__body_1"]))),
-
-    -- ============================================================
-    -- Test: Nested let expressions
-    -- Each let is processed independently; inner lets are processed first.
-    -- ============================================================
-
-    hoistCase "hoistLists: nested let - inner let processed independently"
-      hoistPredicateLists
-      -- Input: let x = 1 in (let y = 2 in f [x, y])
-      (letExpr "x" (int32 1)
-        (letExpr "y" (int32 2)
-          (apply (var "f") (list [var "x", var "y"]))))
-      -- Output: the list is hoisted in the inner let's body
-      (letExpr "x" (int32 1)
-        (letExpr "y" (int32 2)
-          (letExpr "_hoist__body_1" (list [var "x", var "y"])
-            (apply (var "f") (var "_hoist__body_1"))))),
-
-    -- ============================================================
-    -- Test: Non-let terms are unchanged
-    -- hoistSubterms only processes let expressions.
-    -- ============================================================
-
-    hoistCase "hoistLists: non-let term is unchanged"
-      hoistPredicateLists
-      -- Input: f [1, 2, 3] (no enclosing let)
-      (apply (var "f") (list [int32 1, int32 2, int32 3]))
-      -- Output: unchanged - no let to hoist into
-      (apply (var "f") (list [int32 1, int32 2, int32 3])),
-
-    hoistCase "hoistApplications: bare application unchanged"
-      hoistPredicateApplications
-      -- Input: f (g x) (no enclosing let)
-      (apply (var "f") (apply (var "g") (var "x")))
-      -- Output: unchanged
-      (apply (var "f") (apply (var "g") (var "x"))),
-
-    -- ============================================================
-    -- Test: Lambda-bound variable capture during hoisting
-    -- When hoisting a term that contains free variables which are
-    -- lambda-bound at an enclosing scope within the immediate subterm,
-    -- those variables must be captured: the hoisted binding is wrapped
-    -- in lambdas for those variables, and the reference is replaced
-    -- with an application of those variables.
-    -- ============================================================
-
-    -- Case 1: Hoisted term refers to let-bound variable (no capture needed)
-    hoistCase "hoistLists: term referring to let-bound variable needs no capture"
-      hoistPredicateLists
-      -- Input: let x = 1 in f [x, 2]
-      -- The list refers to x which is let-bound, not lambda-bound
-      (letExpr "x" (int32 1)
-        (apply (var "f") (list [var "x", int32 2])))
-      -- Output: list is hoisted without any lambda wrapping
-      (letExpr "x" (int32 1)
-        (letExpr "_hoist__body_1" (list [var "x", int32 2])
-          (apply (var "f") (var "_hoist__body_1")))),
-
-    -- Case 2: Hoisted term refers to lambda-bound variable ABOVE the let (no capture needed)
-    hoistCase "hoistLists: term referring to lambda above let needs no capture"
-      hoistPredicateLists
-      -- Input: \y -> let x = 1 in f [y, x]
-      -- y is lambda-bound above the let, so it's not in the immediate subterm's scope
-      (lambda "y"
-        (letExpr "x" (int32 1)
-          (apply (var "f") (list [var "y", var "x"]))))
-      -- Output: list is hoisted without lambda wrapping (y was bound before let)
-      (lambda "y"
-        (letExpr "x" (int32 1)
-          (letExpr "_hoist__body_1" (list [var "y", var "x"])
-            (apply (var "f") (var "_hoist__body_1"))))),
-
-    -- Case 3: Lambda-bound variable between let and hoisted term, but NOT free in hoisted term
-    hoistCase "hoistLists: lambda-bound var not free in hoisted term needs no capture"
-      hoistPredicateLists
-      -- Input: let x = 1 in (\y -> f [x, 2])
-      -- y is lambda-bound between let and list, but y does not appear in the list [x, 2]
-      -- So [x, 2] should be hoisted without capturing y
-      (letExpr "x" (int32 1)
-        (lambda "y" (apply (var "f") (list [var "x", int32 2]))))
-      -- Output: list [x, 2] is hoisted without lambda wrapping for y (y not free in list)
-      (letExpr "x" (int32 1)
-        (letExpr "_hoist__body_1" (list [var "x", int32 2])
-          (lambda "y" (apply (var "f") (var "_hoist__body_1"))))),
-
-    -- Case 4: Lambda-bound variable between let and hoisted term, IS free in hoisted term
-    hoistCase "hoistLists: lambda-bound var free in hoisted term requires capture"
-      hoistPredicateLists
-      -- Input: let x = 1 in (\y -> f [x, y])
-      -- y is lambda-bound between let and list, and y appears in the list [x, y]
-      -- So [x, y] should be hoisted with y captured
-      (letExpr "x" (int32 1)
-        (lambda "y" (apply (var "f") (list [var "x", var "y"]))))
-      -- Output: _hoist__body_1 = \y -> [x, y], reference becomes _hoist__body_1 y
-      (letExpr "x" (int32 1)
-        (letExpr "_hoist__body_1" (lambda "y" (list [var "x", var "y"]))
-          (lambda "y" (apply (var "f") (apply (var "_hoist__body_1") (var "y")))))),
-
-    -- Case 5: Multiple lambda-bound variables, only some free in hoisted term
-    hoistCase "hoistLists: only free lambda-bound vars are captured"
-      hoistPredicateLists
-      -- Input: let x = 1 in (\a -> \b -> f [x, b])
-      -- Both a and b are lambda-bound between let and list
-      -- But only b appears in the list [x, b], so only b is captured
-      (letExpr "x" (int32 1)
-        (lambda "a" (lambda "b" (apply (var "f") (list [var "x", var "b"])))))
-      -- Output: _hoist__body_1 = \b -> [x, b], reference becomes _hoist__body_1 b
-      (letExpr "x" (int32 1)
-        (letExpr "_hoist__body_1" (lambda "b" (list [var "x", var "b"]))
-          (lambda "a" (lambda "b" (apply (var "f") (apply (var "_hoist__body_1") (var "b"))))))),
-
-    -- ============================================================
-    -- Test: Stable naming for sibling immediate subterms
-    -- Each sibling uses its parent binding name as a prefix, ensuring
-    -- that changes to one sibling don't affect the names in another.
-    -- ============================================================
-
-    hoistCase "hoistLists: stable naming for binding and body"
-      hoistPredicateLists
-      -- Input: let x = f [1, 2] in g [3, 4]
-      -- Both binding value and body have lists to hoist
-      (letExpr "x" (apply (var "f") (list [int32 1, int32 2]))
-                   (apply (var "g") (list [int32 3, int32 4])))
-      -- Output: binding uses _hoist_x_1, body uses _hoist__body_1
-      (letExpr "x"
-        (letExpr "_hoist_x_1" (list [int32 1, int32 2])
-          (apply (var "f") (var "_hoist_x_1")))
-        (letExpr "_hoist__body_1" (list [int32 3, int32 4])
-          (apply (var "g") (var "_hoist__body_1")))),
-
-    hoistCase "hoistLists: stable naming for multiple bindings"
-      hoistPredicateLists
-      -- Input: let x = f [1]; y = g [2] in x
-      (multiLet [
-        ("x", apply (var "f") (list [int32 1])),
-        ("y", apply (var "g") (list [int32 2]))]
-        (var "x"))
-      -- Output: each binding uses its own name as prefix (_hoist_x_1, _hoist_y_1)
-      (multiLet [
-        ("x", letExpr "_hoist_x_1" (list [int32 1])
-                (apply (var "f") (var "_hoist_x_1"))),
-        ("y", letExpr "_hoist_y_1" (list [int32 2])
-                (apply (var "g") (var "_hoist_y_1")))]
-        (var "x")),
-
-    -- ============================================================
-    -- Test: Polymorphic recursion - this is the key test case
-    -- The new local-let approach avoids polymorphic mutual recursion
-    -- by keeping hoisted bindings local to each immediate subterm.
-    -- ============================================================
-
-    hoistCase "hoistLists: polymorphic binding with self-reference below hoisted term"
-      hoistPredicateLists
-      -- Input: let f = \x -> pair (f x) [x, 1] in f 42
-      -- f is polymorphic and has a self-reference, with a list below it
-      -- With sibling hoisting, this would create: let f = ...; _hoist_f_1 = [x, 1] in ...
-      -- which causes polymorphic mutual recursion issues.
-      -- With local hoisting, we get: let f = (let _hoist_f_1 = ... in ...) in ...
-      -- which is polymorphic nesting (OK) rather than mutual recursion.
-      (letExpr "f"
-        (lambda "x" (apply (apply (var "pair") (apply (var "f") (var "x")))
-                               (list [var "x", int32 1])))
-        (apply (var "f") (int32 42)))
-      -- Output: the list is hoisted into a local let within f's binding value
-      (letExpr "f"
-        (letExpr "_hoist_f_1" (lambda "x" (list [var "x", int32 1]))
-          (lambda "x" (apply (apply (var "pair") (apply (var "f") (var "x")))
-                                 (apply (var "_hoist_f_1") (var "x")))))
-        (apply (var "f") (int32 42)))]
-
--- | Test cases for hoistCaseStatements
--- This function hoists case statements (eliminations) that are NOT at "top level".
--- Top level means: the root, or reachable through annotations, lambda bodies,
--- or ONE application LHS. Case statements at top level can become Python match
--- statements; those not at top level need to be hoisted.
-hoistCaseStatementsGroup :: TTerm TestGroup
-hoistCaseStatementsGroup = subgroup "hoistCaseStatements" [
-    -- ============================================================
-    -- Test: Case statement at top level - should NOT be hoisted
-    -- ============================================================
-
-    hoistCaseStatementsCase "case at top level of let body is NOT hoisted"
-      -- Input: let x = just 42 in match x with just y -> y | nothing -> 0
-      -- The case statement is directly in the let body (top level)
-      (letExpr "x" (optional $ just $ int32 42)
-        (match (nm "Optional") (just $ var "x")
-          [(nm "just", lambda "y" (var "y")),
-           (nm "nothing", int32 0)]))
-      -- Output: unchanged - case is at top level
-      (letExpr "x" (optional $ just $ int32 42)
-        (match (nm "Optional") (just $ var "x")
-          [(nm "just", lambda "y" (var "y")),
-           (nm "nothing", int32 0)])),
-
-    hoistCaseStatementsCase "case in let binding value is NOT hoisted"
-      -- Input: let x = match y with just z -> z | nothing -> 0 in x
-      -- The case statement is at top level of binding value
-      (letExpr "x"
-        (match (nm "Optional") (just $ var "y")
-          [(nm "just", lambda "z" (var "z")),
-           (nm "nothing", int32 0)])
-        (var "x"))
-      -- Output: unchanged - case is at top level
-      (letExpr "x"
-        (match (nm "Optional") (just $ var "y")
-          [(nm "just", lambda "z" (var "z")),
-           (nm "nothing", int32 0)])
-        (var "x")),
-
-    hoistCaseStatementsCase "case inside lambda body is NOT hoisted"
-      -- Input: let f = \a -> match a with just y -> y | nothing -> 0 in f (just 42)
-      -- The case is inside a lambda body, but lambda bodies are pass-through
-      -- This becomes def f(a): match a: ... in Python
-      (letExpr "f"
-        (lambda "a"
-          (match (nm "Optional") (just $ var "a")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]))
-        (apply (var "f") (optional $ just $ int32 42)))
-      -- Output: unchanged - case is at top level (through lambda body)
-      (letExpr "f"
-        (lambda "a"
-          (match (nm "Optional") (just $ var "a")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]))
-        (apply (var "f") (optional $ just $ int32 42))),
-
-    hoistCaseStatementsCase "case inside nested lambdas is NOT hoisted"
-      -- Input: let f = \a -> \b -> match a with ok -> b | err -> 0 in f
-      -- The case is inside nested lambdas - still at top level
-      -- This becomes def f(a, b): match a: ... in Python
-      (letExpr "f"
-        (lambda "a" (lambda "b"
-          (match (nm "Result") (just $ var "a")
-            [(nm "ok", var "b"),
-             (nm "err", int32 0)])))
-        (var "f"))
-      -- Output: unchanged - case is at top level (through lambda bodies)
-      (letExpr "f"
-        (lambda "a" (lambda "b"
-          (match (nm "Result") (just $ var "a")
-            [(nm "ok", var "b"),
-             (nm "err", int32 0)])))
-        (var "f")),
-
-    hoistCaseStatementsCase "case as LHS of one application is NOT hoisted"
-      -- Input: let f = (match Optional with ...) x in f
-      -- The case is LHS of one application - still at top level (one app LHS allowed)
-      -- This is match taking its single argument
-      (letExpr "f"
-        (apply
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (var "x"))
-        (var "f"))
-      -- Output: unchanged - case is at top level (one application LHS)
-      (letExpr "f"
-        (apply
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (var "x"))
-        (var "f")),
-
-    hoistCaseStatementsCase "case wrapped in annotation is NOT hoisted"
-      -- Input: let f = @ann (match Optional with ...) in f
-      -- The case is wrapped in annotation - annotations are transparent
-      (letExpr "f"
-        (annot emptyAnnMap
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]))
-        (var "f"))
-      -- Output: unchanged - case is at top level (through annotation)
-      (letExpr "f"
-        (annot emptyAnnMap
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]))
-        (var "f")),
-
-    hoistCaseStatementsCase "case in lambda with one application is NOT hoisted"
-      -- Input: let f = \a -> (match Optional with ...) a in f
-      -- Lambda body + one application LHS = still at top level
-      (letExpr "f"
-        (lambda "a"
-          (apply
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])
-            (var "a")))
-        (var "f"))
-      -- Output: unchanged - case is at top level
-      (letExpr "f"
-        (lambda "a"
-          (apply
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])
-            (var "a")))
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Case statement NOT at top level - SHOULD be hoisted
-    -- ============================================================
-
-    hoistCaseStatementsCase "case as RHS of application IS hoisted"
-      -- Input: let f = g (match Optional with ...) in f
-      -- The case is RHS of application (argument position) - NOT top level
-      (letExpr "f"
-        (apply (var "g")
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]))
-        (var "f"))
-      -- Output: case is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (apply (var "g") (var "_hoist_f_1")))
-        (var "f")),
-
-    hoistCaseStatementsCase "case in nested application LHS IS hoisted"
-      -- Input: let f = ((match Optional with ...) x) y in f
-      -- The case is LHS of LHS of application - only ONE app LHS allowed
-      -- The second application takes us out of top level
-      (letExpr "f"
-        (apply
-          (apply
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "z" (lambda "w" (var "z"))),
-               (nm "nothing", lambda "w" (int32 0))])
-            (var "x"))
-          (var "y"))
-        (var "f"))
-      -- Output: case is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "z" (lambda "w" (var "z"))),
-             (nm "nothing", lambda "w" (int32 0))])
-          (apply (apply (var "_hoist_f_1") (var "x")) (var "y")))
-        (var "f")),
-
-    hoistCaseStatementsCase "case inside list element IS hoisted"
-      -- Input: let f = [match Optional with ...] in f
-      -- The case is inside a list element - NOT top level
-      (letExpr "f"
-        (list [match (nm "Optional") nothing
-          [(nm "just", lambda "y" (var "y")),
-           (nm "nothing", int32 0)]])
-        (var "f"))
-      -- Output: case is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (list [var "_hoist_f_1"]))
-        (var "f")),
-
-    hoistCaseStatementsCase "case inside lambda inside list IS hoisted"
-      -- Input: let f = [\a -> match a with ...] in f
-      -- Even though case is inside lambda, the lambda itself is inside a list
-      -- The list position makes it not top level
-      (letExpr "f"
-        (list [lambda "a"
-          (match (nm "Optional") (just $ var "a")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])])
-        (var "f"))
-      -- Output: case is hoisted with 'a' captured
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (lambda "a"
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)]))
-          (list [lambda "a" (apply (var "_hoist_f_1") (var "a"))]))
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Non-case terms - should NOT be hoisted regardless
-    -- ============================================================
-
-    hoistCaseStatementsCase "list inside lambda is NOT hoisted (only case statements)"
-      -- Input: let f = \a -> [a, 1, 2] in f 0
-      -- The list is not at top level, but hoistCaseStatements only hoists cases
-      (letExpr "f"
-        (lambda "a" (list [var "a", int32 1, int32 2]))
-        (apply (var "f") (int32 0)))
-      -- Output: unchanged - only case statements are hoisted
-      (letExpr "f"
-        (lambda "a" (list [var "a", int32 1, int32 2]))
-        (apply (var "f") (int32 0))),
-
-    -- ============================================================
-    -- Test: Mixed scenarios
-    -- ============================================================
-
-    hoistCaseStatementsCase "case in binding is not hoisted, case in arg position is hoisted"
-      -- Input: let x = match a with ... in f (match b with ...)
-      -- First case is at top level of binding, second is in argument position
-      (letExpr "x"
-        (match (nm "Optional") (just $ var "a")
-          [(nm "just", lambda "z" (var "z")),
-           (nm "nothing", int32 0)])
-        (apply (var "f")
-          (match (nm "Optional") (just $ var "b")
-            [(nm "just", lambda "w" (var "w")),
-             (nm "nothing", int32 0)])))
-      -- Output: only second case is hoisted
-      (letExpr "x"
-        (match (nm "Optional") (just $ var "a")
-          [(nm "just", lambda "z" (var "z")),
-           (nm "nothing", int32 0)])
-        (letExpr "_hoist__body_1"
-          (match (nm "Optional") (just $ var "b")
-            [(nm "just", lambda "w" (var "w")),
-             (nm "nothing", int32 0)])
-          (apply (var "f") (var "_hoist__body_1")))),
-
-    -- ============================================================
-    -- Test: Mixed let and lambda at top level (no hoisting needed)
-    -- ============================================================
-
-    hoistCaseStatementsCase "case in nested let body is NOT hoisted"
-      -- Input: let x = 1 in let y = 2 in match z with ...
-      -- The case is in nested let body - still at top level
-      (letExpr "x" (int32 1)
-        (letExpr "y" (int32 2)
-          (match (nm "Optional") (just $ var "z")
-            [(nm "just", lambda "w" (var "w")),
-             (nm "nothing", int32 0)])))
-      -- Output: unchanged
-      (letExpr "x" (int32 1)
-        (letExpr "y" (int32 2)
-          (match (nm "Optional") (just $ var "z")
-            [(nm "just", lambda "w" (var "w")),
-             (nm "nothing", int32 0)]))),
-
-    hoistCaseStatementsCase "case in let inside lambda is NOT hoisted"
-      -- Input: let f = \a -> let x = 1 in match a with ...
-      -- Lambda body then let body - both pass through
-      (letExpr "f"
-        (lambda "a"
-          (letExpr "x" (int32 1)
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])))
-        (var "f"))
-      -- Output: unchanged
-      (letExpr "f"
-        (lambda "a"
-          (letExpr "x" (int32 1)
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])))
-        (var "f")),
-
-    hoistCaseStatementsCase "case in lambda inside let body is NOT hoisted"
-      -- Input: let x = 1 in \a -> match a with ...
-      -- Let body then lambda body - both pass through
-      (letExpr "x" (int32 1)
-        (lambda "a"
-          (match (nm "Optional") (just $ var "a")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])))
-      -- Output: unchanged
-      (letExpr "x" (int32 1)
-        (lambda "a"
-          (match (nm "Optional") (just $ var "a")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]))),
-
-    hoistCaseStatementsCase "case with let+lambda+app is NOT hoisted"
-      -- Input: let f = \a -> let x = 1 in (match a with ...) x
-      -- Lambda body, let body, one app LHS - all pass through
-      (letExpr "f"
-        (lambda "a"
-          (letExpr "x" (int32 1)
-            (apply
-              (match (nm "Optional") nothing
-                [(nm "just", lambda "y" (var "y")),
-                 (nm "nothing", int32 0)])
-              (var "x"))))
-        (var "f"))
-      -- Output: unchanged
-      (letExpr "f"
-        (lambda "a"
-          (letExpr "x" (int32 1)
-            (apply
-              (match (nm "Optional") nothing
-                [(nm "just", lambda "y" (var "y")),
-                 (nm "nothing", int32 0)])
-              (var "x"))))
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Multiple applications (hoisting required)
-    -- ============================================================
-
-    hoistCaseStatementsCase "case in triple application LHS IS hoisted"
-      -- Input: let f = (((match ...) x) y) z in f
-      -- Three nested applications - only one app LHS allowed
-      (letExpr "f"
-        (apply
-          (apply
-            (apply
-              (match (nm "Optional") nothing
-                [(nm "just", lambda "a" (lambda "b" (lambda "c" (var "a")))),
-                 (nm "nothing", lambda "b" (lambda "c" (int32 0)))])
-              (var "x"))
-            (var "y"))
-          (var "z"))
-        (var "f"))
-      -- Output: case is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "a" (lambda "b" (lambda "c" (var "a")))),
-             (nm "nothing", lambda "b" (lambda "c" (int32 0)))])
-          (apply (apply (apply (var "_hoist_f_1") (var "x")) (var "y")) (var "z")))
-        (var "f")),
-
-    hoistCaseStatementsCase "case as second argument IS hoisted"
-      -- Input: let f = g x (match ...) in f
-      -- Case is RHS of second application
-      (letExpr "f"
-        (apply (apply (var "g") (var "x"))
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]))
-        (var "f"))
-      -- Output: case is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (apply (apply (var "g") (var "x")) (var "_hoist_f_1")))
-        (var "f")),
-
-    hoistCaseStatementsCase "case in both arguments - both hoisted"
-      -- Input: let f = g (match a ...) (match b ...) in f
-      -- Both cases are in argument positions
-      (letExpr "f"
-        (apply
-          (apply (var "g")
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "x" (var "x")),
-               (nm "nothing", int32 0)]))
-          (match (nm "Optional") (just $ var "b")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 1)]))
-        (var "f"))
-      -- Output: both cases hoisted into a SINGLE let with two bindings
-      -- (hoistSubterms collects all hoistable terms from one subterm into one let)
-      (letExpr "f"
-        (lets
-          [(nm "_hoist_f_1",
-            match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "x" (var "x")),
-               (nm "nothing", int32 0)]),
-           (nm "_hoist_f_2",
-            match (nm "Optional") (just $ var "b")
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 1)])]
-          (apply (apply (var "g") (var "_hoist_f_1")) (var "_hoist_f_2")))
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Descent into various structures (hoisting required)
-    -- ============================================================
-
-    hoistCaseStatementsCase "case in second list element IS hoisted"
-      -- Input: let f = [1, match ...] in f
-      (letExpr "f"
-        (list [int32 1,
-          match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]])
-        (var "f"))
-      -- Output: case is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (list [int32 1, var "_hoist_f_1"]))
-        (var "f")),
-
-    hoistCaseStatementsCase "multiple cases in list - all hoisted"
-      -- Input: let f = [match a ..., match b ...] in f
-      (letExpr "f"
-        (list [
-          match (nm "Optional") (just $ var "a")
-            [(nm "just", lambda "x" (var "x")),
-             (nm "nothing", int32 0)],
-          match (nm "Optional") (just $ var "b")
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 1)]])
-        (var "f"))
-      -- Output: both cases hoisted into a SINGLE let with two bindings
-      (letExpr "f"
-        (lets
-          [(nm "_hoist_f_1",
-            match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "x" (var "x")),
-               (nm "nothing", int32 0)]),
-           (nm "_hoist_f_2",
-            match (nm "Optional") (just $ var "b")
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 1)])]
-          (list [var "_hoist_f_1", var "_hoist_f_2"]))
-        (var "f")),
-
-    hoistCaseStatementsCase "case in pair first element IS hoisted"
-      -- Input: let f = (match ..., 1) in f
-      (letExpr "f"
-        (pair
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (int32 1))
-        (var "f"))
-      -- Output: case is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (pair (var "_hoist_f_1") (int32 1)))
-        (var "f")),
-
-    hoistCaseStatementsCase "case in pair second element IS hoisted"
-      -- Input: let f = (1, match ...) in f
-      (letExpr "f"
-        (pair
-          (int32 1)
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)]))
-        (var "f"))
-      -- Output: case is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (pair (int32 1) (var "_hoist_f_1")))
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Nested let terms - case hoisted into CHILD let, not parent
-    -- This is critical: hoisting is local to immediate subterms
-    -- ============================================================
-
-    hoistCaseStatementsCase "case in child let binding hoisted into child"
-      -- Input: let outer = (let inner = g (match ...) in inner) in outer
-      -- The case is in the binding of inner let, inside argument position
-      -- It should be hoisted into the inner let, not the outer
-      (letExpr "outer"
-        (letExpr "inner"
-          (apply (var "g")
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)]))
-          (var "inner"))
-        (var "outer"))
-      -- Output: case hoisted into inner let's binding
-      (letExpr "outer"
-        (letExpr "inner"
-          (letExpr "_hoist_inner_1"
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])
-            (apply (var "g") (var "_hoist_inner_1")))
-          (var "inner"))
-        (var "outer")),
-
-    hoistCaseStatementsCase "case in child let body hoisted into child"
-      -- Input: let outer = (let inner = 1 in g (match ...)) in outer
-      -- The case is in the body of inner let, inside argument position
-      -- It should be hoisted into the inner let's body, not the outer
-      (letExpr "outer"
-        (letExpr "inner" (int32 1)
-          (apply (var "g")
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])))
-        (var "outer"))
-      -- Output: case hoisted into inner let's body
-      (letExpr "outer"
-        (letExpr "inner" (int32 1)
-          (letExpr "_hoist__body_1"
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])
-            (apply (var "g") (var "_hoist__body_1"))))
-        (var "outer")),
-
-    hoistCaseStatementsCase "case at top level of child let NOT hoisted"
-      -- Input: let outer = (let inner = match ... in inner) in outer
-      -- The case is at top level of inner let's binding - no hoisting needed
-      (letExpr "outer"
-        (letExpr "inner"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (var "inner"))
-        (var "outer"))
-      -- Output: unchanged
-      (letExpr "outer"
-        (letExpr "inner"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (var "inner"))
-        (var "outer")),
-
-    hoistCaseStatementsCase "cases in both outer and child - each hoisted locally"
-      -- Input: let outer = f (match a ...) (let inner = g (match b ...) in inner) in outer
-      -- First case in outer's body (arg position), second in inner's binding (arg position)
-      -- Each should be hoisted into its respective scope
-      -- Each binding uses its name as prefix: inner gets _hoist_inner_1, outer gets _hoist_outer_1
-      (letExpr "outer"
-        (apply
-          (apply (var "f")
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "x" (var "x")),
-               (nm "nothing", int32 0)]))
-          (letExpr "inner"
-            (apply (var "g")
-              (match (nm "Optional") (just $ var "b")
-                [(nm "just", lambda "y" (var "y")),
-                 (nm "nothing", int32 1)]))
-            (var "inner")))
-        (var "outer"))
-      -- Output: outer binding gets _hoist_outer_1, inner binding gets _hoist_inner_1
-      (letExpr "outer"
-        (letExpr "_hoist_outer_1"
-          (match (nm "Optional") (just $ var "a")
-            [(nm "just", lambda "x" (var "x")),
-             (nm "nothing", int32 0)])
-          (apply
-            (apply (var "f") (var "_hoist_outer_1"))
-            (letExpr "inner"
-              (letExpr "_hoist_inner_1"
-                (match (nm "Optional") (just $ var "b")
-                  [(nm "just", lambda "y" (var "y")),
-                   (nm "nothing", int32 1)])
-                (apply (var "g") (var "_hoist_inner_1")))
-              (var "inner"))))
-        (var "outer")),
-
-    -- ============================================================
-    -- Test: Lambda after app LHS - should trigger hoisting
-    -- ============================================================
-
-    hoistCaseStatementsCase "lambda after app LHS takes us out of top level"
-      -- Input: let f = ((\a -> match a with ...) x) in f
-      -- App LHS then lambda body - after using app, lambda doesn't help
-      (letExpr "f"
-        (apply
-          (lambda "a"
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)]))
-          (var "x"))
-        (var "f"))
-      -- Output: case is hoisted because lambda comes after we've used our one app LHS
-      -- Path to case: letBinding, applicationFunction, lambdaBody
-      -- Processing: letBinding (pass), applicationFunction (use app, mark usedApp=true), lambdaBody (usedApp=true, fail)
-      -- So case IS hoisted. The case uses 'a' which is lambda-bound, so it's wrapped in a lambda
-      -- and the reference becomes (_hoist_f_1 a)
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          -- The hoisted case is wrapped in a lambda to capture 'a'
-          (lambda "a"
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)]))
-          -- The original lambda body is replaced with (_hoist_f_1 a)
-          (apply
-            (lambda "a" (apply (var "_hoist_f_1") (var "a")))
-            (var "x")))
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Case statements inside case branches (nested cases)
-    -- Case branches bind variables, so they are like lambda bodies
-    -- ============================================================
-
-    hoistCaseStatementsCase "case inside case branch is NOT hoisted"
-      -- Input: let f = match x with just a -> match a with ... | nothing -> 0 in f
-      -- Inner case is inside a case branch - branches are pass-through like lambdas
-      (letExpr "f"
-        (match (nm "Optional") (just $ var "x")
-          [(nm "just", lambda "a"
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "b" (var "b")),
-               (nm "nothing", int32 0)])),
-           (nm "nothing", int32 0)])
-        (var "f"))
-      -- Output: unchanged - inner case is at top level (through case branch)
-      (letExpr "f"
-        (match (nm "Optional") (just $ var "x")
-          [(nm "just", lambda "a"
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "b" (var "b")),
-               (nm "nothing", int32 0)])),
-           (nm "nothing", int32 0)])
-        (var "f")),
-
-    hoistCaseStatementsCase "case inside case default branch is NOT hoisted"
-      -- Input: let f = match x with just a -> a | nothing -> match y with ... in f
-      -- Inner case is in default branch - still pass-through
-      (letExpr "f"
-        (match (nm "Optional") (just $ var "x")
-          [(nm "just", lambda "a" (var "a")),
-           (nm "nothing",
-            match (nm "Optional") (just $ var "y")
-              [(nm "just", lambda "b" (var "b")),
-               (nm "nothing", int32 0)])])
-        (var "f"))
-      -- Output: unchanged - inner case is at top level (through case default)
-      (letExpr "f"
-        (match (nm "Optional") (just $ var "x")
-          [(nm "just", lambda "a" (var "a")),
-           (nm "nothing",
-            match (nm "Optional") (just $ var "y")
-              [(nm "just", lambda "b" (var "b")),
-               (nm "nothing", int32 0)])])
-        (var "f")),
-
-    hoistCaseStatementsCase "case in arg position inside case branch IS hoisted"
-      -- Input: let f = match x with just a -> g (match a with ...) | nothing -> 0 in f
-      -- Inner case is in argument position inside a case branch - should be hoisted
-      (letExpr "f"
-        (match (nm "Optional") (just $ var "x")
-          [(nm "just", lambda "a"
-            (apply (var "g")
-              (match (nm "Optional") (just $ var "a")
-                [(nm "just", lambda "b" (var "b")),
-                 (nm "nothing", int32 0)]))),
-           (nm "nothing", int32 0)])
-        (var "f"))
-      -- Output: inner case is hoisted to the OUTER let level (not inside the branch)
-      -- because hoistSubterms only creates lets at existing let boundaries.
-      -- The inner case uses 'a' which is lambda-bound, so it's wrapped in a lambda
-      -- and the reference becomes (_hoist_f_1 a)
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          -- The inner case wrapped in a lambda to capture 'a'
-          (lambda "a"
-            (match (nm "Optional") (just $ var "a")
-              [(nm "just", lambda "b" (var "b")),
-               (nm "nothing", int32 0)]))
-          -- The outer case with the reference (_hoist_f_1 a) inside the branch
-          (match (nm "Optional") (just $ var "x")
-            [(nm "just", lambda "a"
-              (apply (var "g") (apply (var "_hoist_f_1") (var "a")))),
-             (nm "nothing", int32 0)]))
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Case inside case default with let binding
-    -- This is the pattern from isSimpleAssignment in CoderUtils:
-    -- match term with
-    --   specific_case -> ...
-    --   _ -> let baseTerm = f(term) in match baseTerm with ...
-    -- The inner case in the default branch's let body must be hoisted
-    -- because Python can't encode match statements inline in case branches
-    -- ============================================================
-
-    hoistCaseStatementsCase "case in let body inside applied case default IS hoisted"
-      -- Input: let f = (case x of just a -> a | _ -> let b = g(x) in (case b of ...)(b)) x
-      -- The outer case is applied (through `cases`/`apply`), putting default branch
-      -- at non-top-level. Inner applied case in default > let body must be hoisted.
-      -- This is the pattern from isSimpleAssignment in CoderUtils.
-      (letExpr "f"
-        (apply
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "a" (var "a")),
-             (nm "nothing",
-              letExpr "b" (apply (var "g") (var "x"))
-                (apply
-                  (match (nm "Result") nothing
-                    [(nm "ok", lambda "y" (var "y")),
-                     (nm "err", int32 0)])
-                  (var "b")))])
-          (var "x"))
-        (var "f"))
-      -- Output: inner applied case is hoisted within the inner let (preserving let-bound variable scoping)
-      (letExpr "f"
-        (apply
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "a" (var "a")),
-             (nm "nothing",
-              letExpr "b" (apply (var "g") (var "x"))
-                (letExpr "_hoist__body_1"
-                  (match (nm "Result") nothing
-                    [(nm "ok", lambda "y" (var "y")),
-                     (nm "err", int32 0)])
-                  (apply (var "_hoist__body_1") (var "b"))))])
-          (var "x"))
-        (var "f")),
-
-    hoistCaseStatementsCase "case in let body inside applied case branch IS hoisted"
-      -- Input: let f = (case x of just a -> let b = h(a) in (case b of ...)(b) | nothing -> 0) x
-      -- Like above but inner case is in a named branch rather than default.
-      -- 'a' IS lambda-bound (from the case branch), so it IS captured.
-      (letExpr "f"
-        (apply
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "a"
-              (letExpr "b" (apply (var "h") (var "a"))
-                (apply
-                  (match (nm "Result") nothing
-                    [(nm "ok", lambda "y" (var "y")),
-                     (nm "err", int32 0)])
-                  (var "b")))),
-             (nm "nothing", int32 0)])
-          (var "x"))
-        (var "f"))
-      -- Output: inner case is hoisted within the inner let (preserving let-bound variable scoping)
-      (letExpr "f"
-        (apply
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "a"
-              (letExpr "b" (apply (var "h") (var "a"))
-                (letExpr "_hoist__body_1"
-                  (match (nm "Result") nothing
-                    [(nm "ok", lambda "y" (var "y")),
-                     (nm "err", int32 0)])
-                  (apply (var "_hoist__body_1") (var "b"))))),
-             (nm "nothing", int32 0)])
-          (var "x"))
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Case applications (case function applied to argument)
-    -- ============================================================
-
-    hoistCaseStatementsCase "case application at top level of binding is NOT hoisted"
-      -- Input: let f = (match Optional with ...) x in f
-      -- The case application is at top level (one app LHS)
-      (letExpr "f"
-        (apply
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (var "x"))
-        (var "f"))
-      -- Output: unchanged
-      (letExpr "f"
-        (apply
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (var "x"))
-        (var "f")),
-
-    hoistCaseStatementsCase "case application in arg position IS hoisted"
-      -- Input: let f = g ((match Optional with ...) x) in f
-      -- The bare case function is hoisted first (bottom-up), then the application
-      -- uses the hoisted reference. 'x' is not lambda-bound so not captured.
-      (letExpr "f"
-        (apply (var "g")
-          (apply
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])
-            (var "x")))
-        (var "f"))
-      -- Output: bare case function is hoisted, application becomes _hoist_f_1(x)
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (apply (var "g") (apply (var "_hoist_f_1") (var "x"))))
-        (var "f")),
-
-    hoistCaseStatementsCase "case application inside immediately-applied lambda IS hoisted"
-      -- Input: let f = (\a -> (match Optional with ...) a) x in f
-      -- The bare case function is inside \a -> (case ...) a. Bottom-up processing:
-      -- The bare case function at path [LetBinding f, ApplicationFunction, LambdaBody, ApplicationFunction]
-      -- gets hoisted. No captured variables (case function has no free vars).
-      (letExpr "f"
-        (apply
-          (lambda "a"
-            (apply
-              (match (nm "Optional") nothing
-                [(nm "just", lambda "y" (var "y")),
-                 (nm "nothing", int32 0)])
-              (var "a")))
-          (var "x"))
-        (var "f"))
-      -- Output: bare case function is hoisted
-      (letExpr "f"
-        (letExpr "_hoist_f_1"
-          (match (nm "Optional") nothing
-            [(nm "just", lambda "y" (var "y")),
-             (nm "nothing", int32 0)])
-          (apply
-            (lambda "a" (apply (var "_hoist_f_1") (var "a")))
-            (var "x")))
-        (var "f")),
-
-    hoistCaseStatementsCase "case application in lambda body is NOT hoisted"
-      -- Input: let f = \a -> (match Optional with ...) a in f
-      -- Lambda body + one app LHS = still at top level
-      (letExpr "f"
-        (lambda "a"
-          (apply
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])
-            (var "a")))
-        (var "f"))
-      -- Output: unchanged
-      (letExpr "f"
-        (lambda "a"
-          (apply
-            (match (nm "Optional") nothing
-              [(nm "just", lambda "y" (var "y")),
-               (nm "nothing", int32 0)])
-            (var "a")))
-        (var "f"))]
-
--- | Test cases for hoistPolymorphicLetBindings
--- This function hoists polymorphic let bindings (those with non-empty type scheme variables)
--- to the top level of the given let term.
-hoistPolymorphicLetBindingsGroup :: TTerm TestGroup
-hoistPolymorphicLetBindingsGroup = subgroup "hoistPolymorphicLetBindings" [
-    -- ============================================================
-    -- Test: No polymorphic bindings - unchanged
-    -- ============================================================
-
-    hoistPolyCase "no polymorphic bindings: simple let unchanged"
-      -- Input: let x : Int32 = 42 in x
-      (mkLet [(nm "x", int32 42, monoType T.int32)] (var "x"))
-      -- Output: unchanged
-      (mkLet [(nm "x", int32 42, monoType T.int32)] (var "x")),
-
-    hoistPolyCase "no polymorphic bindings: multiple monomorphic bindings"
-      -- Input: let x : Int32 = 1; y : String = "hi" in pair x y
-      (mkLet [
-        (nm "x", int32 1, monoType T.int32),
-        (nm "y", string "hi", monoType T.string)]
-        (apply (apply (var "pair") (var "x")) (var "y")))
-      -- Output: unchanged
-      (mkLet [
-        (nm "x", int32 1, monoType T.int32),
-        (nm "y", string "hi", monoType T.string)]
-        (apply (apply (var "pair") (var "x")) (var "y"))),
-
-    -- ============================================================
-    -- Test: Single polymorphic binding at top level - stays in place
-    -- ============================================================
-
-    hoistPolyCase "single polymorphic binding: already at top level"
-      -- Input: let id : forall a. a -> a = \x -> x in id 42
-      (mkLet [(nm "id", lambda "x" (var "x"), polyType ["a"] (T.function (T.var "a") (T.var "a")))]
-        (apply (var "id") (int32 42)))
-      -- Output: unchanged (already at top)
-      (mkLet [(nm "id", lambda "x" (var "x"), polyType ["a"] (T.function (T.var "a") (T.var "a")))]
-        (apply (var "id") (int32 42))),
-
-    -- ============================================================
-    -- Test: Polymorphic binding inside lambda body
-    -- ============================================================
-
-    hoistPolyCase "polymorphic binding inside lambda: no capture"
-      -- Input: let f = \a -> (let id : forall b. b -> b = \x -> x in id a) in f 42
-      -- Here 'id' does not reference 'a', so it can be hoisted directly
-      (mkLet [(nm "f",
-        lambda "a" (Core.termLet $ mkLet [(nm "id", lambda "x" (var "x"), polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-          (apply (var "id") (var "a"))),
-        monoType (T.function T.int32 T.int32))]
-        (apply (var "f") (int32 42)))
-      -- Output: f comes first (original binding), then f_id is hoisted (no wrapping needed)
-      (mkLet [
-        (nm "f",
-          lambda "a" (apply (var "f_id") (var "a")),
-          monoType (T.function T.int32 T.int32)),
-        (nm "f_id", tylam "b" (lambda "x" (var "x")), polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-        (apply (var "f") (int32 42))),
-
-    -- ============================================================
-    -- Test: Polymorphic binding captures lambda variable - requires wrapping
-    -- ============================================================
-
-    hoistPolyCase "polymorphic binding captures lambda variable: wrapped in lambda"
-      -- Input: let f = \(a:String) -> (let g : forall b. b -> Pair<String, b> = \x -> pair a x in g 42) in f "hello"
-      -- Here 'g' references 'a' (the enclosing lambda's variable), so when hoisted,
-      -- it must be wrapped in a lambda that takes 'a', and the reference replaced with an application
-      (mkLet [(nm "f",
-        lambdaTyped "a" T.string (Core.termLet $ mkLet [
-          (nm "g", lambda "x" (apply (apply (var "pair") (var "a")) (var "x")),
-            polyType ["b"] (T.function (T.var "b") (T.pair T.string (T.var "b"))))]
-          (apply (var "g") (int32 42))),
-        monoType (T.function T.string (T.pair T.string T.int32)))]
-        (apply (var "f") (string "hello")))
-      -- Output: f comes first (original binding), then f_g is hoisted wrapped in \(a:String) -> ..., and reference becomes (f_g a)
-      (mkLet [
-        (nm "f",
-          lambdaTyped "a" T.string (apply (apply (var "f_g") (var "a")) (int32 42)),
-          monoType (T.function T.string (T.pair T.string T.int32))),
-        (nm "f_g", tylam "b" (lambdaTyped "a" T.string (lambda "x" (apply (apply (var "pair") (var "a")) (var "x")))),
-          polyType ["b"] (T.function T.string (T.function (T.var "b") (T.pair T.string (T.var "b")))))]
-        (apply (var "f") (string "hello"))),
-
-    hoistPolyCase "polymorphic binding captures multiple lambda variables"
-      -- Input: let f = \(a:Int32) -> \(b:Int32) -> (let g : forall c. c -> c = \x -> triple a b x in g 42) in f 1 2
-      -- Here 'g' references both 'a' and 'b', so it needs to be wrapped with both
-      (mkLet [(nm "f",
-        lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (Core.termLet $ mkLet [
-          (nm "g", lambda "x" (apply (apply (apply (var "triple") (var "a")) (var "b")) (var "x")),
-            polyType ["c"] (T.function (T.var "c") (T.var "c")))]
-          (apply (var "g") (int32 42)))),
-        monoType (T.function T.int32 (T.function T.int32 T.int32)))]
-        (apply (apply (var "f") (int32 1)) (int32 2)))
-      -- Output: f comes first (original binding), then f_g is wrapped in \(a:Int32) -> \(b:Int32) -> ..., references become ((f_g a) b)
-      (mkLet [
-        (nm "f",
-          lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (apply (apply (apply (var "f_g") (var "a")) (var "b")) (int32 42))),
-          monoType (T.function T.int32 (T.function T.int32 T.int32))),
-        (nm "f_g", tylam "c" (lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (lambda "x" (apply (apply (apply (var "triple") (var "a")) (var "b")) (var "x"))))),
-          polyType ["c"] (T.function T.int32 (T.function T.int32 (T.function (T.var "c") (T.var "c")))))]
-        (apply (apply (var "f") (int32 1)) (int32 2))),
-
-    hoistPolyCase "polymorphic binding captures some but not all lambda variables"
-      -- Input: let f = \(a:Int32) -> \(b:Int32) -> (let g : forall c. c -> Pair<Int32, c> = \x -> pair a x in g b) in f 1 2
-      -- Here 'g' only references 'a', not 'b'
-      (mkLet [(nm "f",
-        lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (Core.termLet $ mkLet [
-          (nm "g", lambda "x" (apply (apply (var "pair") (var "a")) (var "x")),
-            polyType ["c"] (T.function (T.var "c") (T.pair T.int32 (T.var "c"))))]
-          (apply (var "g") (var "b")))),
-        monoType (T.function T.int32 (T.function T.int32 (T.pair T.int32 T.int32))))]
-        (apply (apply (var "f") (int32 1)) (int32 2)))
-      -- Output: f comes first (original binding), then f_g is wrapped only in \(a:Int32) -> ..., reference becomes (f_g a)
-      (mkLet [
-        (nm "f",
-          lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (apply (apply (var "f_g") (var "a")) (var "b"))),
-          monoType (T.function T.int32 (T.function T.int32 (T.pair T.int32 T.int32)))),
-        (nm "f_g", tylam "c" (lambdaTyped "a" T.int32 (lambda "x" (apply (apply (var "pair") (var "a")) (var "x")))),
-          polyType ["c"] (T.function T.int32 (T.function (T.var "c") (T.pair T.int32 (T.var "c")))))]
-        (apply (apply (var "f") (int32 1)) (int32 2))),
-
-    hoistPolyCase "polymorphic binding captures both lambda-bound and let-bound variables"
-      -- Input: let f = \(a:Int32) -> (let x : Int32 = 1; g : forall b. b -> b = \y -> add (add a x) y in g 42) in f 10
-      -- Here 'g' references 'a' (lambda-bound from enclosing scope) and 'x' (let-bound sibling).
-      -- When g is hoisted to the top level, it goes OUTSIDE the inner let block, so it must capture
-      -- both 'a' (from the enclosing lambda) AND 'x' (which is no longer a sibling after hoisting).
-      (mkLet [(nm "f",
-        lambdaTyped "a" T.int32 (Core.termLet $ mkLet [
-          (nm "x", int32 1, monoType T.int32),
-          (nm "g", lambda "y" (apply (apply (primitive _math_add)
-                    (apply (apply (primitive _math_add) (var "a")) (var "x"))) (var "y")),
-            polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-          (apply (var "g") (int32 42))),
-        monoType (T.function T.int32 T.int32))]
-        (apply (var "f") (int32 10)))
-      -- Output: f comes first (original binding), then f_g captures both 'a' and 'x', reference becomes ((f_g a) x)
-      (mkLet [
-        (nm "f",
-          lambdaTyped "a" T.int32 (Core.termLet $ mkLet [
-            (nm "x", int32 1, monoType T.int32)]
-            (apply (apply (apply (var "f_g") (var "a")) (var "x")) (int32 42))),
-          monoType (T.function T.int32 T.int32)),
-        (nm "f_g", tylam "b" (lambdaTyped "a" T.int32 (lambdaTyped "x" T.int32
-          (lambda "y" (apply (apply (primitive _math_add)
-            (apply (apply (primitive _math_add) (var "a")) (var "x"))) (var "y"))))),
-          polyType ["b"] (T.function T.int32 (T.function T.int32 (T.function (T.var "b") (T.var "b")))))]
-        (apply (var "f") (int32 10))),
-
-    hoistPolyCase "sibling polymorphic bindings inside lambda: one calls the other"
-      -- Input: let wrapper = \outer : Int32 -> let g : forall a. a -> a = \y -> add outer y; h : forall b. b -> b = \z -> g z in h 42 in wrapper 10
-      -- This mimics the structure in unifyTypeConstraints where bind and tryBinding are
-      -- both inside withConstraint lambda and one calls the other.
-      -- g captures 'outer', h calls g which means h must transitively capture 'outer'
-      (mkLet [(nm "wrapper",
-        lambdaTyped "outer" T.int32 (Core.termLet $ mkLet [
-          (nm "g", lambda "y" (apply (apply (primitive _math_add) (var "outer")) (var "y")),
-            polyType ["a"] (T.function (T.var "a") (T.var "a"))),
-          (nm "h", lambda "z" (apply (var "g") (var "z")),
-            polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-          (apply (var "h") (int32 42))),
-        monoType (T.function T.int32 T.int32))]
-        (apply (var "wrapper") (int32 10)))
-      -- Output: wrapper first (original), then wrapper_g and wrapper_h hoisted (both capture outer)
-      -- wrapper_g is wrapped: \outer -> \y -> add outer y
-      -- wrapper_h is wrapped: \outer -> \z -> (wrapper_g outer) z
-      -- The reference to wrapper_g inside wrapper_h becomes (wrapper_g outer)
-      (mkLet [
-        (nm "wrapper",
-          lambdaTyped "outer" T.int32 (apply (apply (var "wrapper_h") (var "outer")) (int32 42)),
-          monoType (T.function T.int32 T.int32)),
-        (nm "wrapper_g", tylam "a" (lambdaTyped "outer" T.int32 (lambda "y" (apply (apply (primitive _math_add) (var "outer")) (var "y")))),
-          polyType ["a"] (T.function T.int32 (T.function (T.var "a") (T.var "a")))),
-        (nm "wrapper_h", tylam "b" (lambdaTyped "outer" T.int32 (lambda "z" (apply (apply (var "wrapper_g") (var "outer")) (var "z")))),
-          polyType ["b"] (T.function T.int32 (T.function (T.var "b") (T.var "b"))))]
-        (apply (var "wrapper") (int32 10))),
-
-    hoistPolyCase "sibling polymorphic bindings inside lambda: h passes its own args to g"
-      -- Input: let wrapper = \outer -> let g : forall a. a -> a = \v -> \t -> add outer (add v t);
-      --                                    h : forall b. b -> b = \v -> \t -> g v t
-      --                                in h 1 2
-      --        in wrapper 10
-      -- Here h calls g with its own args v and t. After hoisting:
-      -- g becomes \outer -> \v -> \t -> add outer (add v t)
-      -- h becomes \outer -> \v -> \t -> ((g outer) v) t
-      -- The reference to g in h should NOT duplicate outer, v, or t
-      (mkLet [(nm "wrapper",
-        lambdaTyped "outer" T.int32 (Core.termLet $ mkLet [
-          (nm "g", lambda "v" (lambda "t" (apply (apply (primitive _math_add) (var "outer"))
-            (apply (apply (primitive _math_add) (var "v")) (var "t")))),
-            polyType ["a"] (T.function (T.var "a") (T.function (T.var "a") (T.var "a")))),
-          (nm "h", lambda "v" (lambda "t" (apply (apply (var "g") (var "v")) (var "t"))),
-            polyType ["b"] (T.function (T.var "b") (T.function (T.var "b") (T.var "b"))))]
-          (apply (apply (var "h") (int32 1)) (int32 2))),
-        monoType (T.function T.int32 T.int32))]
-        (apply (var "wrapper") (int32 10)))
-      -- Output: wrapper first (original), then wrapper_g and wrapper_h hoisted (both capture outer)
-      -- wrapper_g: \outer -> \v -> \t -> add outer (add v t)
-      -- wrapper_h: \outer -> \v -> \t -> ((wrapper_g outer) v) t
-      (mkLet [
-        (nm "wrapper",
-          lambdaTyped "outer" T.int32 (apply (apply (apply (var "wrapper_h") (var "outer")) (int32 1)) (int32 2)),
-          monoType (T.function T.int32 T.int32)),
-        (nm "wrapper_g", tylam "a" (lambdaTyped "outer" T.int32
-          (lambda "v" (lambda "t" (apply (apply (primitive _math_add) (var "outer"))
-            (apply (apply (primitive _math_add) (var "v")) (var "t")))))),
-          polyType ["a"] (T.function T.int32 (T.function (T.var "a") (T.function (T.var "a") (T.var "a"))))),
-        (nm "wrapper_h", tylam "b" (lambdaTyped "outer" T.int32
-          (lambda "v" (lambda "t" (apply (apply (apply (var "wrapper_g") (var "outer")) (var "v")) (var "t"))))),
-          polyType ["b"] (T.function T.int32 (T.function (T.var "b") (T.function (T.var "b") (T.var "b")))))]
-        (apply (var "wrapper") (int32 10))),
-
-    -- ============================================================
-    -- Test: Untyped bindings are treated as monomorphic
-    -- ============================================================
-
-    hoistPolyCase "untyped binding: not hoisted"
-      -- Input: let x = 1 in (let y = 2 in x + y)
-      -- Neither binding has a type, so neither is polymorphic
-      (mkLetUntyped [(nm "x", int32 1)]
-        (Core.termLet $ mkLetUntyped [(nm "y", int32 2)]
-          (apply (apply (primitive _math_add) (var "x")) (var "y"))))
-      -- Output: unchanged (untyped bindings are not polymorphic)
-      (mkLetUntyped [(nm "x", int32 1)]
-        (Core.termLet $ mkLetUntyped [(nm "y", int32 2)]
-          (apply (apply (primitive _math_add) (var "x")) (var "y")))),
-
-    -- ============================================================
-    -- Test: Name collision - nested binding has same name as top-level (after unshadowing)
-    -- Note: This test uses distinct names as unshadowVariables would produce.
-    -- The hoisting code assumes no shadowing. If there were shadowing,
-    -- two bindings named 'id' would collide at top level.
-    -- ============================================================
-
-    hoistPolyCase "no name collision: distinct names after unshadowing"
-      -- Input: let id = \x -> x; f = \a -> (let id2 : forall b. b -> b = \y -> y in id2 (id a)) in f 42
-      -- Here 'id' is monomorphic at top level, 'id2' is polymorphic nested
-      -- They have distinct names (as unshadowVariables would ensure)
-      (mkLet [
-        (nm "id", lambda "x" (var "x"), monoType (T.function T.int32 T.int32)),
-        (nm "f",
-          lambda "a" (Core.termLet $ mkLet [
-            (nm "id2", lambda "y" (var "y"), polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-            (apply (var "id2") (apply (var "id") (var "a")))),
-          monoType (T.function T.int32 T.int32))]
-        (apply (var "f") (int32 42)))
-      -- Output: id and f first (original), then f_id2 hoisted
-      (mkLet [
-        (nm "id", lambda "x" (var "x"), monoType (T.function T.int32 T.int32)),
-        (nm "f",
-          lambda "a" (apply (var "f_id2") (apply (var "id") (var "a"))),
-          monoType (T.function T.int32 T.int32)),
-        (nm "f_id2", tylam "b" (lambda "y" (var "y")), polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-        (apply (var "f") (int32 42))),
-
-    -- ============================================================
-    -- Test: Nested polymorphic binding calls enclosing polymorphic binding
-    -- When a polymorphic binding h at a nested level calls a polymorphic
-    -- binding g from an enclosing (but not top) level, g should NOT be
-    -- passed as a term argument to h. Instead, h's body should reference
-    -- the hoisted g (wrapper_g) directly, since polymorphic let-bound
-    -- variables are excluded from capture.
-    -- ============================================================
-
-    hoistPolyCase "nested polymorphic binding calls enclosing polymorphic binding"
-      -- Input: let wrapper = \outer:Int32 ->
-      --          let g : forall a. a -> a = \y -> y
-      --          in \inner:Int32 ->
-      --            let h : forall b. b -> b = \z -> g z
-      --            in h 42
-      --        in wrapper 10 20
-      -- Here g is polymorphic at an outer let level, and h is polymorphic
-      -- at an inner let level. h calls g. When both are hoisted:
-      -- - g becomes wrapper_g (no captures needed)
-      -- - h becomes wrapper_h, and should reference wrapper_g directly
-      --   (NOT receive g as a term parameter)
-      (mkLet [(nm "wrapper",
-        lambdaTyped "outer" T.int32 (Core.termLet $ mkLet [
-          -- g : forall a. a -> a (at outer let level)
-          (nm "g",
-            lambda "y" (var "y"),
-            polyType ["a"] (T.function (T.var "a") (T.var "a")))]
-          -- inner lambda
-          (lambdaTyped "inner" T.int32 (Core.termLet $ mkLet [
-            -- h : forall b. b -> b (at inner let level, calls g)
-            (nm "h",
-              lambda "z" (apply (var "g") (var "z")),
-              polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-            (apply (var "h") (int32 42))))),
-        monoType (T.function T.int32 (T.function T.int32 T.int32)))]
-        (apply (apply (var "wrapper") (int32 10)) (int32 20)))
-      -- Output: wrapper simplified, wrapper_g and wrapper_h hoisted.
-      -- CRITICAL: wrapper_h references wrapper_g directly, NOT through a parameter.
-      -- Neither g nor any enclosing lambda variables are captured by h,
-      -- because g is polymorphic (excluded from capture) and h doesn't use outer/inner.
-      (mkLet [
-        (nm "wrapper",
-          lambdaTyped "outer" T.int32
-            (lambdaTyped "inner" T.int32
-              (apply (var "wrapper_h") (int32 42))),
-          monoType (T.function T.int32 (T.function T.int32 T.int32))),
-        -- wrapper_g: hoisted, no captures
-        (nm "wrapper_g",
-          tylam "a" (lambda "y" (var "y")),
-          polyType ["a"] (T.function (T.var "a") (T.var "a"))),
-        -- wrapper_h: hoisted, references wrapper_g directly (no g parameter)
-        (nm "wrapper_h",
-          tylam "b" (lambda "z" (apply (var "wrapper_g") (var "z"))),
-          polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-        (apply (apply (var "wrapper") (int32 10)) (int32 20))),
-
-    -- ============================================================
-    -- Test: Polymorphic binding captures monomorphic sibling in same let
-    -- This test case demonstrates the bug in joinTypes where:
-    -- - sleft/sright are monomorphic bindings (NOT hoisted)
-    -- - cannotUnify is polymorphic (HOISTED) and references sleft/sright
-    -- When cannotUnify is hoisted, it must capture sleft/sright as parameters
-    -- because they are defined in the same let and won't be hoisted with it.
-    -- ============================================================
-
-    hoistPolyCase "polymorphic binding captures monomorphic sibling in same let"
-      -- This mirrors the joinTypes structure:
-      -- let wrapper = \left -> \right ->
-      --   let sleft : Int32 = f left;           -- monomorphic, NOT hoisted
-      --       sright : Int32 = f right;         -- monomorphic, NOT hoisted
-      --       cannotUnify : forall a. a -> a = \x -> add sleft (add sright x)  -- polymorphic, refs sleft/sright
-      --   in cannotUnify 42
-      -- in wrapper 1 2
-      --
-      -- When cannotUnify is hoisted, it must capture sleft and sright since they are
-      -- defined in the same let and won't be hoisted with it.
-      (mkLet [(nm "wrapper",
-        lambdaTyped "left" T.int32
-          (lambdaTyped "right" T.int32
-            (Core.termLet $ mkLet [
-              (nm "sleft", apply (var "f") (var "left"), monoType T.int32),
-              (nm "sright", apply (var "f") (var "right"), monoType T.int32),
-              (nm "cannotUnify",
-                lambda "x" (apply (apply (primitive _math_add) (var "sleft"))
-                  (apply (apply (primitive _math_add) (var "sright")) (var "x"))),
-                polyType ["a"] (T.function (T.var "a") (T.var "a")))]
-              (apply (var "cannotUnify") (int32 42)))),
-        monoType (T.function T.int32 (T.function T.int32 T.int32)))]
-        (apply (apply (var "wrapper") (int32 1)) (int32 2)))
-      -- Expected output:
-      -- wrapper is simplified, wrapper_cannotUnify is hoisted with sleft and sright captured
-      -- wrapper_cannotUnify: forall a. \sleft:Int32 -> \sright:Int32 -> \x -> add sleft (add sright x)
-      -- Reference becomes: ((wrapper_cannotUnify sleft) sright) 42
-      (mkLet [
-        (nm "wrapper",
-          lambdaTyped "left" T.int32
-            (lambdaTyped "right" T.int32
-              (Core.termLet $ mkLet [
-                (nm "sleft", apply (var "f") (var "left"), monoType T.int32),
-                (nm "sright", apply (var "f") (var "right"), monoType T.int32)]
-                (apply (apply (apply (var "wrapper_cannotUnify") (var "sleft")) (var "sright")) (int32 42)))),
-          monoType (T.function T.int32 (T.function T.int32 T.int32))),
-        (nm "wrapper_cannotUnify",
-          tylam "a"
-            (lambdaTyped "sleft" T.int32
-              (lambdaTyped "sright" T.int32
-                (lambda "x" (apply (apply (primitive _math_add) (var "sleft"))
-                  (apply (apply (primitive _math_add) (var "sright")) (var "x")))))),
-          polyType ["a"] (T.function T.int32 (T.function T.int32 (T.function (T.var "a") (T.var "a")))))]
-        (apply (apply (var "wrapper") (int32 1)) (int32 2))),
-
-    -- This test uses NESTED lets (as the DSL generates with <~) rather than a single flat let.
-    -- The bug: when poly bindings in different nested lets reference each other,
-    -- transitive captured variables are not propagated correctly.
-    --
-    -- Structure (nested lets, like DSL generates):
-    --   wrapper = \left ->
-    --     let sleft = left                              -- mono (outermost nested let)
-    --     in let cannotUnify = fail sleft              -- poly, refs sleft (middle nested let)
-    --        in let joinList = cannotUnify 1           -- poly, refs cannotUnify (innermost nested let)
-    --           in joinList
-    --
-    -- When joinList is hoisted, it captures cannotUnify (from outer let).
-    -- When cannotUnify is hoisted, it captures sleft and its replacement becomes: wrapper_cannotUnify sleft
-    -- The replacement for cannotUnify gets substituted into joinList's body.
-    -- Bug: joinList ends up with free variable sleft because it wasn't captured transitively.
-    hoistPolyCase "nested lets: poly binding references poly sibling from outer let"
-      (mkLet [(nm "wrapper",
-        lambdaTyped "left" T.int32
-          -- Outer nested let: sleft (mono)
-          (Core.termLet $ mkLet [
-            (nm "sleft", var "left", monoType T.int32)]
-            -- Middle nested let: cannotUnify (poly, refs sleft)
-            (Core.termLet $ mkLet [
-              (nm "cannotUnify",
-                lambda "x" (apply (apply (primitive _math_add) (var "sleft")) (var "x")),
-                polyType ["a"] (T.function (T.var "a") (T.var "a")))]
-              -- Inner nested let: joinList (poly, refs cannotUnify)
-              (Core.termLet $ mkLet [
-                (nm "joinList",
-                  lambda "y" (apply (var "cannotUnify") (var "y")),
-                  polyType ["b"] (T.function (T.var "b") (T.var "b")))]
-                (apply (var "joinList") (int32 42))))),
-        monoType (T.function T.int32 T.int32))]
-        (apply (var "wrapper") (int32 1)))
-      -- Expected: both cannotUnify and joinList are hoisted.
-      -- wrapper_cannotUnify captures sleft.
-      -- wrapper_joinList must ALSO capture sleft (transitively through cannotUnify).
-      -- The reference to cannotUnify in joinList becomes wrapper_cannotUnify sleft,
-      -- so joinList needs sleft in scope.
-      (mkLet [
-        (nm "wrapper",
-          lambdaTyped "left" T.int32
-            (Core.termLet $ mkLet [
-              (nm "sleft", var "left", monoType T.int32)]
-              (apply (apply (var "wrapper_joinList") (var "sleft")) (int32 42))),
-          monoType (T.function T.int32 T.int32)),
-        (nm "wrapper_cannotUnify",
-          tylam "a"
-            (lambdaTyped "sleft" T.int32
-              (lambda "x" (apply (apply (primitive _math_add) (var "sleft")) (var "x")))),
-          polyType ["a"] (T.function T.int32 (T.function (T.var "a") (T.var "a")))),
-        (nm "wrapper_joinList",
-          tylam "b"
-            (lambdaTyped "sleft" T.int32
-              (lambda "y" (apply (apply (var "wrapper_cannotUnify") (var "sleft")) (var "y")))),
-          polyType ["b"] (T.function T.int32 (T.function (T.var "b") (T.var "b"))))]
-        (apply (var "wrapper") (int32 1))),
-
-    -- ============================================================
-    -- Regression test: polymorphic binding with pair term must preserve
-    -- type application wrappers after hoisting. This reproduces the
-    -- "pair type requires 2 type arguments, got 0" error in Java code
-    -- generation. The binding `init` (like in hoistLetBindingsWithPredicate)
-    -- contains a pair of empty list and a set. After inference, the pair
-    -- has TypeApplication wrappers. These wrappers must survive hoisting.
-    -- ============================================================
-
-    hoistPolyCase "polymorphic binding with pair: type applications preserved"
-      -- Input: let f = \b:Name ->
-      --          let init : forall t0. Pair<List<t0>, Set<Name>>
-      --                   = Λt0. @(Set<Name>) @(List<t0>) pair((@t0 []), singleton(b))
-      --          in init
-      --        in f (name "x")
-      -- The init binding is polymorphic (has type var t0 from empty list).
-      -- After hoisting, the pair must KEEP its TypeApplication wrappers.
-      (mkLet [(nm "f",
-        lambdaTyped "b" (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string) (Core.termLet $ mkLet [
-          (nm "init",
-            -- Term with type lambda and type applications (as inference would produce):
-            -- Λt0. TypeApp(TypeApp(Pair(TypeApp([], t0), singleton(b)), List<t0>), Set<Name>)
-            tylam "t0" (tyapp (tyapp
-              (pair
-                (tyapp (list ([] :: [TTerm Term])) (T.var "t0"))
-                (apply (var "singleton") (var "b")))
-              (T.list (T.var "t0")))
-              (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string))),
-            polyType ["t0"] (T.pair (T.list (T.var "t0")) (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string))))]
-          (var "init")),
-        monoType (T.function (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
-          (T.pair (T.list (T.var "t0")) (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)))))]
-        (apply (var "f") (var "name_x")))
-      -- Expected output: f first (original), then f_init hoisted.
-      -- The hoisted binding must retain TypeApplication wrappers on the pair.
-      -- Λt0 is stripped and re-added by hoisting, but inner type apps on pair are preserved.
-      (mkLet [
-        (nm "f",
-          lambdaTyped "b" (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
-            (apply (var "f_init") (var "b")),
-          monoType (T.function (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
-            (T.pair (T.list (T.var "t0")) (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string))))),
-        (nm "f_init",
-          -- After hoisting: captures b, re-adds type lambda for t0
-          -- The inner type applications on the pair MUST be preserved
-          tylam "t0" (lambdaTyped "b" (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
-            (tyapp (tyapp
-              (pair
-                (tyapp (list ([] :: [TTerm Term])) (T.var "t0"))
-                (apply (var "singleton") (var "b")))
-              (T.list (T.var "t0")))
-              (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)))),
-          polyType ["t0"] (T.function (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
-            (T.pair (T.list (T.var "t0")) (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)))))]
-        (apply (var "f") (var "name_x"))),
-
-    -- ============================================================
-    -- Regression test: monomorphic binding referencing outer type variables
-    -- must get type applications at the call site after hoisting.
-    -- This reproduces the Java "T70848" bug: without type apps on the
-    -- hoisted reference, the Java coder falls back to tryTypeOf which
-    -- generates fresh inference variables instead of using the correct
-    -- type parameters from the enclosing scope.
-    -- ============================================================
-
-    hoistPolyCase "monomorphic binding captures type vars: replacement includes type applications"
-      -- Input: let f = TypeLambda a (TypeLambda b (
-      --          \(x:a) -> let q : TypeScheme([], a -> b) = \(y:a) -> g y
-      --                    in q x))
-      --        in f
-      -- Here 'q' is monomorphic but references outer type vars 'a' and 'b'.
-      -- When hoisted, q becomes polymorphic in [a, b].
-      -- The replacement must include TypeApp(b, TypeApp(a, Var(f_q))) to instantiate
-      -- the hoisted binding with the correct type variables.
-      (mkLet [(nm "f",
-        tylam "a" (tylam "b" (
-          lambdaTyped "x" (T.var "a") (Core.termLet $ mkLet [
-            (nm "q",
-              lambdaTyped "y" (T.var "a") (apply (var "g") (var "y")),
-              monoType (T.function (T.var "a") (T.var "b")))]
-            (apply (var "q") (var "x"))))),
-        polyType ["a", "b"] (T.function (T.var "a") (T.var "b")))]
-        (var "f"))
-      -- Expected output: f first, then f_q hoisted with type lambdas for [a, b].
-      -- q does not reference x, so no lambda capture is needed.
-      -- The replacement for q SHOULD be TypeApp(b, TypeApp(a, Var(f_q)))
-      -- so that downstream code knows the type variable instantiation.
-      -- Using Core.termTypeApplication directly to avoid meta-encoding issues with tyapp.
-      (mkLet [
-        (nm "f",
-          tylam "a" (tylam "b" (
-            lambdaTyped "x" (T.var "a")
-              (apply
-                (Core.termTypeApplication $ Core.typeApplicationTerm
-                  (Core.termTypeApplication $ Core.typeApplicationTerm (var "f_q") (T.var "a"))
-                  (T.var "b"))
-                (var "x")))),
-          polyType ["a", "b"] (T.function (T.var "a") (T.var "b"))),
-        (nm "f_q",
-          tylam "a" (tylam "b" (
-            lambdaTyped "y" (T.var "a") (apply (var "g") (var "y")))),
-          polyType ["a", "b"] (T.function (T.var "a") (T.var "b")))]
-        (var "f"))]
-
--- | Test cases for hoistLetBindings with hoistAll=True
--- This function hoists ALL let bindings (not just polymorphic ones) to the top level.
--- This is used for Java which cannot have let expressions in arbitrary positions.
--- Key behavior: type lambdas are boundaries - we don't hoist bindings OUT of type lambdas
--- because doing so could move code that references type variables outside their scope.
-hoistLetBindingsGroup :: TTerm TestGroup
-hoistLetBindingsGroup = subgroup "hoistLetBindings" [
-    -- ============================================================
-    -- Test: Basic nested let hoisting (no type lambdas)
-    -- ============================================================
-
-    hoistAllCase "nested let inside lambda: binding hoisted with lambda capture"
-      -- Input: let f = \a -> (let g = a + 1 in g * 2) in f 10
-      (mkLetUntyped [(nm "f",
-        lambda "a" (Core.termLet $ mkLetUntyped [(nm "g", apply (apply (primitive _math_add) (var "a")) (int32 1))]
-          (apply (apply (primitive _math_mul) (var "g")) (int32 2))))]
-        (apply (var "f") (int32 10)))
-      -- Output: f comes first (original binding), then f_g is hoisted with lambda to capture 'a', reference becomes (f_g a)
-      (mkLetUntyped [
-        (nm "f",
-          lambda "a" (apply (apply (primitive _math_mul) (apply (var "f_g") (var "a"))) (int32 2))),
-        (nm "f_g", lambda "a" (apply (apply (primitive _math_add) (var "a")) (int32 1)))]
-        (apply (var "f") (int32 10))),
-
-    -- ============================================================
-    -- Test: Type applications are processed normally (they don't introduce type variables)
-    -- But the inner lambda still has nested let that gets hoisted
-    -- ============================================================
-
-    hoistAllCase "type application: nested let outside lambda CAN be hoisted"
-      -- Input: let f = (let y = 1 in \x -> x + y) @Int32 in f 10
-      -- The let is OUTSIDE the lambda, so y can be hoisted without capture
-      (mkLetUntyped [(nm "f",
-        tyapp (Core.termLet $ mkLetUntyped [(nm "y", int32 1)]
-          (lambda "x" (apply (apply (primitive _math_add) (var "x")) (var "y")))) T.int32)]
-        (apply (var "f") (int32 10)))
-      -- Output: f comes first (original binding), then f_y is hoisted
-      (mkLetUntyped [
-        (nm "f",
-          tyapp (lambda "x" (apply (apply (primitive _math_add) (var "x")) (var "f_y"))) T.int32),
-        (nm "f_y", int32 1)]
-        (apply (var "f") (int32 10)))]
-
--- | Convenience function for creating hoist let bindings test cases (hoistAll=True)
-hoistAllCase :: String -> TTerm Let -> TTerm Let -> TTerm TestCaseWithMetadata
-hoistAllCase cname input output = hoistLetBindingsCase cname input output
-
--- | Helper for creating a Let term with typed bindings
-mkLet :: [(TTerm Name, TTerm Term, TTerm (Maybe TypeScheme))] -> TTerm Term -> TTerm Let
-mkLet bindings body = Core.let_ (Phantoms.list $ mkBinding <$> bindings) body
-  where
-    mkBinding :: (TTerm Name, TTerm Term, TTerm (Maybe TypeScheme)) -> TTerm Binding
-    mkBinding (n, t, ts) = Core.binding n t ts
-
--- | Helper for creating a Let term with untyped bindings
-mkLetUntyped :: [(TTerm Name, TTerm Term)] -> TTerm Term -> TTerm Let
-mkLetUntyped bindings body = Core.let_ (Phantoms.list $ mkBinding <$> bindings) body
-  where
-    mkBinding :: (TTerm Name, TTerm Term) -> TTerm Binding
-    mkBinding (n, t) = Core.binding n t Phantoms.nothing
-
--- | Helper for creating a monomorphic type scheme
-monoType :: TTerm Type -> TTerm (Maybe TypeScheme)
-monoType typ = Phantoms.just $ Core.typeScheme (Phantoms.list ([] :: [TTerm Name])) typ Phantoms.nothing
-
--- | Helper for creating a polymorphic type scheme
-polyType :: [String] -> TTerm Type -> TTerm (Maybe TypeScheme)
-polyType vars typ = Phantoms.just $ Core.typeScheme (Phantoms.list $ nm <$> vars) typ Phantoms.nothing
-
--- | Convenience function for creating hoist polymorphic let bindings test cases
-hoistPolyCase :: String -> TTerm Let -> TTerm Let -> TTerm TestCaseWithMetadata
-hoistPolyCase cname input output = hoistPolymorphicLetBindingsCase cname input output
-
--- | Test cases for type parameter extraction when hoisting polymorphic let bindings
--- This group specifically tests scenarios where Java code generation fails because
--- type parameters (t0, t1, t2, etc.) are used in generated code but not declared
--- in method signatures. The root cause is that javaTypeParametersForType doesn't
--- properly collect all free type variables from nested generic types.
---
--- These tests illustrate the EXPECTED behavior after the issue is fixed.
--- Currently, the Java coder fails to generate compilable code for these cases.
-hoistPolymorphicTypeParametersGroup :: TTerm TestGroup
-hoistPolymorphicTypeParametersGroup = subgroup "hoistPolymorphicTypeParameters" [
-    -- ============================================================
-    -- Test: Nested polymorphic bindings with multiple type variables
-    -- This is the core issue: when a polymorphic binding like `choose`
-    -- uses type variables (t0, t1, t2) in nested function types,
-    -- those variables must be declared in the hoisted method signature.
-    -- ============================================================
-
-    hoistPolyCase "nested function types: all type variables must be declared"
-      -- Input: let f = (let choose : forall t0 t1 t2. (t0 -> t1) -> (t2 -> t1) -> t0 -> t1 = ... in choose) in f
-      -- This simulates the `mutateTrace` scenario where `choose` is a polymorphic
-      -- local binding with multiple type parameters in nested function types.
-      -- (Simplified to avoid using "Either" as a type variable name)
-      (mkLet [(nm "f",
-        Core.termLet $ mkLet [(nm "choose",
-          lambda "forLeft" (lambda "forRight" (lambda "e"
-            (apply (var "forLeft") (var "e")))),
-          -- Type: forall t0 t1 t2. (t0 -> t1) -> (t2 -> t1) -> t0 -> t1
-          polyType ["t0", "t1", "t2"]
-            (T.function
-              (T.function (T.var "t0") (T.var "t1"))
-              (T.function
-                (T.function (T.var "t2") (T.var "t1"))
-                (T.function (T.var "t0") (T.var "t1")))))]
-          (var "choose"),
-        monoType (T.function
-          (T.function T.string T.int32)
-          (T.function
-            (T.function T.boolean T.int32)
-            (T.function T.string T.int32))))]
-        (var "f"))
-      -- Output: f first (original), then f_choose hoisted with ALL type parameters preserved
-      -- When generating Java, the method signature must declare t0, t1, t2
-      (mkLet [
-        (nm "f",
-          var "f_choose",
-          monoType (T.function
-            (T.function T.string T.int32)
-            (T.function
-              (T.function T.boolean T.int32)
-              (T.function T.string T.int32)))),
-        (nm "f_choose",
-          tylam "t0" (tylam "t1" (tylam "t2" (lambda "forLeft" (lambda "forRight" (lambda "e"
-            (apply (var "forLeft") (var "e"))))))),
-          polyType ["t0", "t1", "t2"]
-            (T.function
-              (T.function (T.var "t0") (T.var "t1"))
-              (T.function
-                (T.function (T.var "t2") (T.var "t1"))
-                (T.function (T.var "t0") (T.var "t1")))))]
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Type variable in return position only
-    -- Type variables appearing only in the return type of a nested
-    -- function must still be declared.
-    -- ============================================================
-
-    hoistPolyCase "type variable in return position only"
-      -- Input: let f = (let returnT : forall t. () -> t = ... in returnT) in f
-      (mkLet [(nm "f",
-        Core.termLet $ mkLet [(nm "returnT",
-          lambda "unit" (var "undefined"),
-          polyType ["t"] (T.function T.unit (T.var "t")))]
-          (var "returnT"),
-        monoType (T.function T.unit T.int32))]
-        (var "f"))
-      -- Output: f first (original), then f_returnT hoisted with t declared
-      (mkLet [
-        (nm "f",
-          var "f_returnT",
-          monoType (T.function T.unit T.int32)),
-        (nm "f_returnT",
-          tylam "t" (lambda "unit" (var "undefined")),
-          polyType ["t"] (T.function T.unit (T.var "t")))]
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Type variables in deeply nested generic types
-    -- The Java coder uses freeVariablesInType but may not recurse
-    -- into all nested type structures.
-    -- ============================================================
-
-    hoistPolyCase "type variables in deeply nested generics"
-      -- Input: let f = (let nested : forall t0 t1 t2. ((t0, t1), t2) -> t0 = ... in nested) in f
-      -- Type variables t0, t1, t2 are in nested pair types
-      -- (Simplified from original which used List<Map<...>> - those are treated as type vars in tests)
-      (mkLet [(nm "f",
-        Core.termLet $ mkLet [(nm "nested",
-          lambda "x" (var "undefined"),
-          -- Type: forall t0 t1 t2. ((t0, t1), t2) -> t0
-          polyType ["t0", "t1", "t2"]
-            (T.function
-              (T.pair (T.pair (T.var "t0") (T.var "t1")) (T.var "t2"))
-              (T.var "t0")))]
-          (var "nested"),
-        monoType (T.function
-          (T.pair (T.pair T.string T.int32) T.boolean)
-          T.string))]
-        (var "f"))
-      -- Output: f first (original), then f_nested hoisted with all type parameters t0, t1, t2 declared
-      (mkLet [
-        (nm "f",
-          var "f_nested",
-          monoType (T.function
-            (T.pair (T.pair T.string T.int32) T.boolean)
-            T.string)),
-        (nm "f_nested",
-          tylam "t0" (tylam "t1" (tylam "t2" (lambda "x" (var "undefined")))),
-          polyType ["t0", "t1", "t2"]
-            (T.function
-              (T.pair (T.pair (T.var "t0") (T.var "t1")) (T.var "t2"))
-              (T.var "t0")))]
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Multiple polymorphic bindings that share type variable names
-    -- Each binding should independently track its own type variables.
-    -- ============================================================
-
-    hoistPolyCase "multiple bindings with overlapping type variable names"
-      -- Input: let outer = (let id1 : forall t. t -> t = \x -> x; id2 : forall t. t -> t = \y -> y in pair id1 id2) in outer
-      -- Both id1 and id2 use "t" but they are independent
-      (mkLet [(nm "outer",
-        Core.termLet $ mkLet [
-          (nm "id1", lambda "x" (var "x"), polyType ["t"] (T.function (T.var "t") (T.var "t"))),
-          (nm "id2", lambda "y" (var "y"), polyType ["t"] (T.function (T.var "t") (T.var "t")))]
-          (apply (apply (var "pair") (var "id1")) (var "id2")),
-        monoType (T.pair
-          (T.function T.int32 T.int32)
-          (T.function T.string T.string)))]
-        (var "outer"))
-      -- Output: outer first (original), then outer_id1 and outer_id2 hoisted (each with their own t parameter)
-      (mkLet [
-        (nm "outer",
-          apply (apply (var "pair") (var "outer_id1")) (var "outer_id2"),
-          monoType (T.pair
-            (T.function T.int32 T.int32)
-            (T.function T.string T.string))),
-        (nm "outer_id1", tylam "t" (lambda "x" (var "x")), polyType ["t"] (T.function (T.var "t") (T.var "t"))),
-        (nm "outer_id2", tylam "t" (lambda "y" (var "y")), polyType ["t"] (T.function (T.var "t") (T.var "t")))]
-        (var "outer")),
-
-    -- ============================================================
-    -- Test: Polymorphic binding with captured term variable AND type parameters
-    -- This is the combination case: the binding both captures a lambda-bound
-    -- term variable AND has type parameters that need to be declared.
-    -- ============================================================
-
-    hoistPolyCase "captured variable with type parameters"
-      -- Input: let f = \(a:String) -> (let g : forall t. t -> Pair<String, t> = \x -> pair a x in g 42) in f "hello"
-      -- Here 'g' captures 'a' AND has type parameter t
-      -- When hoisted: g must be wrapped in lambda for 'a', AND method must declare t
-      (mkLet [(nm "f",
-        lambdaTyped "a" T.string (Core.termLet $ mkLet [
-          (nm "g",
-            lambda "x" (apply (apply (var "pair") (var "a")) (var "x")),
-            polyType ["t"] (T.function (T.var "t") (T.pair T.string (T.var "t"))))]
-          (apply (var "g") (int32 42))),
-        monoType (T.function T.string (T.pair T.string T.int32)))]
-        (apply (var "f") (string "hello")))
-      -- Output: f first (original), then f_g hoisted with lambda wrapper for 'a', and t must be declared
-      -- Java signature: <t> Function<String, Function<t, Pair<String, t>>> f_g = a -> x -> pair(a, x);
-      (mkLet [
-        (nm "f",
-          lambdaTyped "a" T.string (apply (apply (var "f_g") (var "a")) (int32 42)),
-          monoType (T.function T.string (T.pair T.string T.int32))),
-        (nm "f_g",
-          tylam "t" (lambdaTyped "a" T.string (lambda "x" (apply (apply (var "pair") (var "a")) (var "x")))),
-          polyType ["t"] (T.function T.string (T.function (T.var "t") (T.pair T.string (T.var "t")))))]
-        (apply (var "f") (string "hello"))),
-
-    -- ============================================================
-    -- Test: Short type variable names (the isLambdaBoundVariable heuristic)
-    -- The Java coder's isLambdaBoundVariable uses name length <= 4 to identify
-    -- type variables. These tests ensure that this heuristic correctly
-    -- identifies variables that should become Java type parameters.
-    -- ============================================================
-
-    hoistPolyCase "short type variable names are treated as type parameters"
-      -- Input: let f = (let g : forall s t v. s -> t -> v = ... in g) in f
-      -- s, t, v have length <= 4, so they should be recognized as type parameters
-      (mkLet [(nm "f",
-        Core.termLet $ mkLet [(nm "g",
-          lambda "s" (lambda "t" (var "undefined")),
-          polyType ["s", "t", "v"]
-            (T.function (T.var "s")
-              (T.function (T.var "t") (T.var "v"))))]
-          (var "g"),
-        monoType (T.function T.int32 (T.function T.string T.boolean)))]
-        (var "f"))
-      -- Output: f first (original), then f_g hoisted with s, t, v declared as type parameters
-      (mkLet [
-        (nm "f",
-          var "f_g",
-          monoType (T.function T.int32 (T.function T.string T.boolean))),
-        (nm "f_g",
-          tylam "s" (tylam "t" (tylam "v" (lambda "s" (lambda "t" (var "undefined"))))),
-          polyType ["s", "t", "v"]
-            (T.function (T.var "s")
-              (T.function (T.var "t") (T.var "v"))))]
-        (var "f")),
-
-    hoistPolyCase "numbered type variables like t0 t1 t2"
-      -- Input: let f = (let g : forall t0 t1 t2. t0 -> t1 -> t2 = ... in g) in f
-      -- t0, t1, t2 have length <= 4, common pattern in generated code
-      (mkLet [(nm "f",
-        Core.termLet $ mkLet [(nm "g",
-          lambda "x" (lambda "y" (var "undefined")),
-          polyType ["t0", "t1", "t2"]
-            (T.function (T.var "t0")
-              (T.function (T.var "t1") (T.var "t2"))))]
-          (var "g"),
-        monoType (T.function T.int32 (T.function T.string T.boolean)))]
-        (var "f"))
-      -- Output: f first (original), then f_g hoisted with t0, t1, t2 declared
-      (mkLet [
-        (nm "f",
-          var "f_g",
-          monoType (T.function T.int32 (T.function T.string T.boolean))),
-        (nm "f_g",
-          tylam "t0" (tylam "t1" (tylam "t2" (lambda "x" (lambda "y" (var "undefined"))))),
-          polyType ["t0", "t1", "t2"]
-            (T.function (T.var "t0")
-              (T.function (T.var "t1") (T.var "t2"))))]
-        (var "f")),
-
-    -- ============================================================
-    -- Test: Complex "choose" pattern from mutateTrace
-    -- This directly models the failing code in Monads.java
-    -- NOTE: This test uses T.var "Either" which causes "Either" to be
-    -- treated as a free type variable. In real code, Either would be a defined
-    -- type constructor and wouldn't be captured as a free variable. This test
-    -- has been simplified to avoid this issue by using only type variables.
-    -- ============================================================
-
-    hoistPolyCase "choose pattern from mutateTrace"
-      -- Input simulates: let mutateTrace = ... in
-      --   choose <~ (forLeft ~> forRight ~> e ~> either forLeft forRight e) $
-      --   ... rest of mutateTrace ...
-      -- The `choose` binding has type:
-      --   forall t0 t1 t2. (t0 -> t1) -> (t2 -> t1) -> t0 -> t1
-      -- (Simplified to avoid using "Either" as a type variable name)
-      (mkLet [(nm "mutateTrace",
-        lambda "mutate" (lambda "restore" (lambda "f"
-          (Core.termLet $ mkLet [(nm "choose",
-            -- choose = \forLeft -> \forRight -> \e -> forLeft e
-            lambda "forLeft" (lambda "forRight" (lambda "e"
-              (apply (var "forLeft") (var "e")))),
-            -- Type: forall t0 t1 t2. (t0 -> t1) -> (t2 -> t1) -> t0 -> t1
-            polyType ["t0", "t1", "t2"]
-              (T.function
-                (T.function (T.var "t0") (T.var "t1"))
-                (T.function
-                  (T.function (T.var "t2") (T.var "t1"))
-                  (T.function (T.var "t0") (T.var "t1")))))]
-            -- Body uses choose
-            (apply (apply (apply (var "choose") (var "forLeft")) (var "forRight")) (var "e"))))),
-        -- Full type of mutateTrace (using concrete types)
-        monoType (T.function T.int32
-          (T.function T.int32
-            (T.function T.int32 T.int32))))]
-        (var "mutateTrace"))
-      -- Output: mutateTrace first (original), then mutateTrace_choose hoisted, MUST have t0, t1, t2 declared
-      (mkLet [
-        (nm "mutateTrace",
-          lambda "mutate" (lambda "restore" (lambda "f"
-            (apply (apply (apply (var "mutateTrace_choose") (var "forLeft")) (var "forRight")) (var "e")))),
-          monoType (T.function T.int32
-            (T.function T.int32
-              (T.function T.int32 T.int32)))),
-        (nm "mutateTrace_choose",
-          tylam "t0" (tylam "t1" (tylam "t2" (lambda "forLeft" (lambda "forRight" (lambda "e"
-            (apply (var "forLeft") (var "e"))))))),
-          polyType ["t0", "t1", "t2"]
-            (T.function
-              (T.function (T.var "t0") (T.var "t1"))
-              (T.function
-                (T.function (T.var "t2") (T.var "t1"))
-                (T.function (T.var "t0") (T.var "t1")))))]
-        (var "mutateTrace"))]
diff --git a/src/main/haskell/Hydra/Sources/Test/Hoisting/All.hs b/src/main/haskell/Hydra/Sources/Test/Hoisting/All.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Hoisting/All.hs
@@ -0,0 +1,39 @@
+
+module Hydra.Sources.Test.Hoisting.All where
+
+import Hydra.Kernel
+import Hydra.Dsl.Meta.Testing as Testing
+import Hydra.Sources.Kernel.Types.All
+import Hydra.Dsl.Meta.Phantoms as Phantoms
+import qualified Hydra.Dsl.Meta.Core as Core
+import qualified Hydra.Dsl.Meta.Types as T
+import qualified Hydra.Sources.Test.TestGraph as TestGraph
+import qualified Hydra.Sources.Test.TestTerms as TestTerms
+import qualified Hydra.Sources.Test.TestTypes as TestTypes
+import qualified Data.List as L
+import qualified Data.Map  as M
+
+import qualified Hydra.Sources.Test.Hoisting.Cases as Cases
+import qualified Hydra.Sources.Test.Hoisting.Let as Let
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.hoisting.all"
+
+module_ :: Module
+module_ = Module ns elements namespaces kernelTypesNamespaces $
+    Just "Hydra's hoisting test suite"
+  where
+    elements = [Phantoms.toTermDefinition allTests]
+    namespaces = [
+      Cases.ns,
+      Let.ns]
+
+allTests :: TBinding TestGroup
+allTests = definitionInModule module_ "allTests" $
+    doc "The group of all hoisting tests" $
+    Testing.testGroup (string "hoisting") nothing (list subgroups) (list ([] :: [TTerm TestCaseWithMetadata]))
+  where
+    subgroups = [
+      Cases.allTests,
+      Let.allTests]
diff --git a/src/main/haskell/Hydra/Sources/Test/Hoisting/Cases.hs b/src/main/haskell/Hydra/Sources/Test/Hoisting/Cases.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Hoisting/Cases.hs
@@ -0,0 +1,1244 @@
+-- | Test cases for subterm hoisting and case statement hoisting transformations
+
+module Hydra.Sources.Test.Hoisting.Cases where
+
+-- Standard imports for shallow DSL tests
+import Hydra.Kernel
+import Hydra.Dsl.Meta.Testing                 as Testing
+import Hydra.Dsl.Meta.Terms                   as Terms
+import Hydra.Sources.Kernel.Types.All
+import qualified Hydra.Dsl.Meta.Core          as Core
+import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
+import qualified Hydra.Dsl.Meta.Types         as T
+import qualified Hydra.Sources.Test.TestGraph as TestGraph
+import qualified Hydra.Sources.Test.TestTerms as TestTerms
+import qualified Hydra.Sources.Test.TestTypes as TestTypes
+import qualified Data.List                    as L
+import qualified Data.Map                     as M
+
+import Hydra.Testing
+import Hydra.Sources.Libraries
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.hoisting.cases"
+
+module_ :: Module
+module_ = Module ns elements [] kernelTypesNamespaces $
+    Just "Test cases for subterm hoisting and case statement hoisting"
+  where
+    elements = [Phantoms.toTermDefinition allTests]
+
+allTests :: TBinding TestGroup
+allTests = definitionInModule module_ "allTests" $
+    Phantoms.doc "Test cases for subterm hoisting and case statement hoisting" $
+    supergroup "hoistCases" [
+      hoistSubtermsGroup,
+      hoistCaseStatementsGroup]
+
+-- Helper to build names
+nm :: String -> TTerm Name
+nm s = Core.name $ Phantoms.string s
+
+-- Helper to build an empty annotation map
+emptyAnnMap :: TTerm (M.Map Name Term)
+emptyAnnMap = Phantoms.map M.empty
+
+-- Helper for single-binding let
+letExpr :: String -> TTerm Term -> TTerm Term -> TTerm Term
+letExpr varName value body = lets [(nm varName, value)] body
+
+-- Helper for multi-binding let
+multiLet :: [(String, TTerm Term)] -> TTerm Term -> TTerm Term
+multiLet bindings body = lets ((\(n, v) -> (nm n, v)) <$> bindings) body
+
+-- | Test cases for hoistSubterms
+-- This function hoists subterms matching a predicate into local let bindings.
+-- The predicate receives the term and returns True if the term should be hoisted.
+-- For each let term, immediate subterms (binding values and body) are processed:
+-- matching subterms are collected and hoisted into a local let that wraps
+-- that immediate subterm.
+hoistSubtermsGroup :: TTerm TestGroup
+hoistSubtermsGroup = subgroup "hoistSubterms" [
+    -- ============================================================
+    -- Test: hoistNothing predicate (identity transformation)
+    -- The hoistNothing predicate never hoists anything.
+    -- ============================================================
+
+    hoistCase "hoistNothing: simple let unchanged"
+      hoistPredicateNothing
+      -- Input: let x = 42 in x
+      (letExpr "x" (int32 42) (var "x"))
+      -- Output: unchanged
+      (letExpr "x" (int32 42) (var "x")),
+
+    hoistCase "hoistNothing: let with list in body unchanged"
+      hoistPredicateNothing
+      -- Input: let x = 1 in [x, 2, 3]
+      (letExpr "x" (int32 1) (list [var "x", int32 2, int32 3]))
+      -- Output: unchanged - hoistNothing never hoists
+      (letExpr "x" (int32 1) (list [var "x", int32 2, int32 3])),
+
+    hoistCase "hoistNothing: let with application in body unchanged"
+      hoistPredicateNothing
+      -- Input: let f = g in f (h 42)
+      (letExpr "f" (var "g") (apply (var "f") (apply (var "h") (int32 42))))
+      -- Output: unchanged
+      (letExpr "f" (var "g") (apply (var "f") (apply (var "h") (int32 42)))),
+
+    -- ============================================================
+    -- Test: hoistLists predicate
+    -- Hoists list terms. Matching subterms within an immediate subterm
+    -- are collected and wrapped in a local let around that subterm.
+    -- ============================================================
+
+    hoistCase "hoistLists: list in body is hoisted into local let"
+      hoistPredicateLists
+      -- Input: let x = 1 in f [1, 2, 3]
+      (letExpr "x" (int32 1) (apply (var "f") (list [int32 1, int32 2, int32 3])))
+      -- Output: body is wrapped in local let with hoisted list
+      (letExpr "x" (int32 1)
+        (letExpr "_hoist_x_body_1" (list [int32 1, int32 2, int32 3])
+          (apply (var "f") (var "_hoist_x_body_1")))),
+
+    hoistCase "hoistLists: multiple lists in body are hoisted together"
+      hoistPredicateLists
+      -- Input: let x = 1 in pair [1, 2] [3, 4]
+      (letExpr "x" (int32 1)
+        (apply (apply (var "pair") (list [int32 1, int32 2]))
+                                         (list [int32 3, int32 4])))
+      -- Output: body is wrapped in local let with both hoisted lists
+      (letExpr "x" (int32 1)
+        (multiLet [
+          ("_hoist_x_body_1", list [int32 1, int32 2]),
+          ("_hoist_x_body_2", list [int32 3, int32 4])]
+          (apply (apply (var "pair") (var "_hoist_x_body_1")) (var "_hoist_x_body_2")))),
+
+    hoistCase "hoistLists: list in binding value is hoisted into local let"
+      hoistPredicateLists
+      -- Input: let x = f [1, 2] in x
+      (letExpr "x" (apply (var "f") (list [int32 1, int32 2])) (var "x"))
+      -- Output: binding value is wrapped in local let
+      (letExpr "x"
+        (letExpr "_hoist_x_1" (list [int32 1, int32 2])
+          (apply (var "f") (var "_hoist_x_1")))
+        (var "x")),
+
+    hoistCase "hoistLists: nested lists hoisted from inside out"
+      hoistPredicateLists
+      -- Input: let x = 1 in f [[1, 2], 3]
+      (letExpr "x" (int32 1)
+        (apply (var "f") (list [list [int32 1, int32 2], int32 3])))
+      -- Output: inner list hoisted first, then outer list
+      (letExpr "x" (int32 1)
+        (multiLet [
+          ("_hoist_x_body_1", list [int32 1, int32 2]),
+          ("_hoist_x_body_2", list [var "_hoist_x_body_1", int32 3])]
+          (apply (var "f") (var "_hoist_x_body_2")))),
+
+    -- ============================================================
+    -- Test: hoistApplications predicate
+    -- Hoists function applications.
+    -- ============================================================
+
+    hoistCase "hoistApplications: application in list element is hoisted"
+      hoistPredicateApplications
+      -- Input: let x = 1 in [f x, y]
+      (letExpr "x" (int32 1)
+        (list [apply (var "f") (var "x"), var "y"]))
+      -- Output: body is wrapped in local let
+      (letExpr "x" (int32 1)
+        (letExpr "_hoist_x_body_1" (apply (var "f") (var "x"))
+          (list [var "_hoist_x_body_1", var "y"]))),
+
+    hoistCase "hoistApplications: application in record field is hoisted"
+      hoistPredicateApplications
+      -- Input: let x = 1 in {value: f x}
+      (letExpr "x" (int32 1)
+        (record (nm "Data") [(nm "value", apply (var "f") (var "x"))]))
+      -- Output: body is wrapped in local let
+      (letExpr "x" (int32 1)
+        (letExpr "_hoist_x_body_1" (apply (var "f") (var "x"))
+          (record (nm "Data") [(nm "value", var "_hoist_x_body_1")]))),
+
+    hoistCase "hoistApplications: nested applications hoisted from inside out"
+      hoistPredicateApplications
+      -- Input: let x = 1 in [f (g x)]
+      (letExpr "x" (int32 1)
+        (list [apply (var "f") (apply (var "g") (var "x"))]))
+      -- Output: inner application hoisted first, then outer
+      (letExpr "x" (int32 1)
+        (multiLet [
+          ("_hoist_x_body_1", apply (var "g") (var "x")),
+          ("_hoist_x_body_2", apply (var "f") (var "_hoist_x_body_1"))]
+          (list [var "_hoist_x_body_2"]))),
+
+    -- ============================================================
+    -- Test: hoistCaseStatements predicate
+    -- Hoists case/match statements.
+    -- ============================================================
+
+    hoistCase "hoistCaseStatements: case in application argument is hoisted"
+      hoistPredicateCaseStatements
+      -- Input: let x = just 42 in f (match x with just y -> y | nothing -> 0)
+      (letExpr "x" (optional $ just $ int32 42)
+        (apply (var "f")
+          (match (nm "Optional") (just $ var "x")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])))
+      -- Output: body is wrapped in local let with hoisted case
+      (letExpr "x" (optional $ just $ int32 42)
+        (letExpr "_hoist_x_body_1"
+          (match (nm "Optional") (just $ var "x")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (apply (var "f") (var "_hoist_x_body_1")))),
+
+    hoistCase "hoistCaseStatements: case in list element is hoisted"
+      hoistPredicateCaseStatements
+      -- Input: let x = 1 in [match y with ok -> x | err -> 0]
+      (letExpr "x" (int32 1)
+        (list [match (nm "Result") (just $ var "y")
+          [(nm "ok", var "x"),
+           (nm "err", int32 0)]]))
+      -- Output: body is wrapped in local let
+      (letExpr "x" (int32 1)
+        (letExpr "_hoist_x_body_1"
+          (match (nm "Result") (just $ var "y")
+            [(nm "ok", var "x"),
+             (nm "err", int32 0)])
+          (list [var "_hoist_x_body_1"]))),
+
+    -- ============================================================
+    -- Test: Nested let expressions
+    -- Each let is processed independently; inner lets are processed first.
+    -- ============================================================
+
+    hoistCase "hoistLists: nested let - inner let processed independently"
+      hoistPredicateLists
+      -- Input: let x = 1 in (let y = 2 in f [x, y])
+      (letExpr "x" (int32 1)
+        (letExpr "y" (int32 2)
+          (apply (var "f") (list [var "x", var "y"]))))
+      -- Output: the list is hoisted in the inner let's body
+      (letExpr "x" (int32 1)
+        (letExpr "y" (int32 2)
+          (letExpr "_hoist_y_body_1" (list [var "x", var "y"])
+            (apply (var "f") (var "_hoist_y_body_1"))))),
+
+    -- ============================================================
+    -- Test: Non-let terms are unchanged
+    -- hoistSubterms only processes let expressions.
+    -- ============================================================
+
+    hoistCase "hoistLists: non-let term is unchanged"
+      hoistPredicateLists
+      -- Input: f [1, 2, 3] (no enclosing let)
+      (apply (var "f") (list [int32 1, int32 2, int32 3]))
+      -- Output: unchanged - no let to hoist into
+      (apply (var "f") (list [int32 1, int32 2, int32 3])),
+
+    hoistCase "hoistApplications: bare application unchanged"
+      hoistPredicateApplications
+      -- Input: f (g x) (no enclosing let)
+      (apply (var "f") (apply (var "g") (var "x")))
+      -- Output: unchanged
+      (apply (var "f") (apply (var "g") (var "x"))),
+
+    -- ============================================================
+    -- Test: Lambda-bound variable capture during hoisting
+    -- When hoisting a term that contains free variables which are
+    -- lambda-bound at an enclosing scope within the immediate subterm,
+    -- those variables must be captured: the hoisted binding is wrapped
+    -- in lambdas for those variables, and the reference is replaced
+    -- with an application of those variables.
+    -- ============================================================
+
+    -- Case 1: Hoisted term refers to let-bound variable (no capture needed)
+    hoistCase "hoistLists: term referring to let-bound variable needs no capture"
+      hoistPredicateLists
+      -- Input: let x = 1 in f [x, 2]
+      -- The list refers to x which is let-bound, not lambda-bound
+      (letExpr "x" (int32 1)
+        (apply (var "f") (list [var "x", int32 2])))
+      -- Output: list is hoisted without any lambda wrapping
+      (letExpr "x" (int32 1)
+        (letExpr "_hoist_x_body_1" (list [var "x", int32 2])
+          (apply (var "f") (var "_hoist_x_body_1")))),
+
+    -- Case 2: Hoisted term refers to lambda-bound variable ABOVE the let (no capture needed)
+    hoistCase "hoistLists: term referring to lambda above let needs no capture"
+      hoistPredicateLists
+      -- Input: \y -> let x = 1 in f [y, x]
+      -- y is lambda-bound above the let, so it's not in the immediate subterm's scope
+      (lambda "y"
+        (letExpr "x" (int32 1)
+          (apply (var "f") (list [var "y", var "x"]))))
+      -- Output: list is hoisted without lambda wrapping (y was bound before let)
+      (lambda "y"
+        (letExpr "x" (int32 1)
+          (letExpr "_hoist_x_body_1" (list [var "y", var "x"])
+            (apply (var "f") (var "_hoist_x_body_1"))))),
+
+    -- Case 3: Lambda-bound variable between let and hoisted term, but NOT free in hoisted term
+    hoistCase "hoistLists: lambda-bound var not free in hoisted term needs no capture"
+      hoistPredicateLists
+      -- Input: let x = 1 in (\y -> f [x, 2])
+      -- y is lambda-bound between let and list, but y does not appear in the list [x, 2]
+      -- So [x, 2] should be hoisted without capturing y
+      (letExpr "x" (int32 1)
+        (lambda "y" (apply (var "f") (list [var "x", int32 2]))))
+      -- Output: list [x, 2] is hoisted without lambda wrapping for y (y not free in list)
+      (letExpr "x" (int32 1)
+        (letExpr "_hoist_x_body_1" (list [var "x", int32 2])
+          (lambda "y" (apply (var "f") (var "_hoist_x_body_1"))))),
+
+    -- Case 4: Lambda-bound variable between let and hoisted term, IS free in hoisted term
+    hoistCase "hoistLists: lambda-bound var free in hoisted term requires capture"
+      hoistPredicateLists
+      -- Input: let x = 1 in (\y -> f [x, y])
+      -- y is lambda-bound between let and list, and y appears in the list [x, y]
+      -- So [x, y] should be hoisted with y captured
+      (letExpr "x" (int32 1)
+        (lambda "y" (apply (var "f") (list [var "x", var "y"]))))
+      -- Output: _hoist_x_body_1 = \y -> [x, y], reference becomes _hoist_x_body_1 y
+      (letExpr "x" (int32 1)
+        (letExpr "_hoist_x_body_1" (lambda "y" (list [var "x", var "y"]))
+          (lambda "y" (apply (var "f") (apply (var "_hoist_x_body_1") (var "y")))))),
+
+    -- Case 5: Multiple lambda-bound variables, only some free in hoisted term
+    hoistCase "hoistLists: only free lambda-bound vars are captured"
+      hoistPredicateLists
+      -- Input: let x = 1 in (\a -> \b -> f [x, b])
+      -- Both a and b are lambda-bound between let and list
+      -- But only b appears in the list [x, b], so only b is captured
+      (letExpr "x" (int32 1)
+        (lambda "a" (lambda "b" (apply (var "f") (list [var "x", var "b"])))))
+      -- Output: _hoist_x_body_1 = \b -> [x, b], reference becomes _hoist_x_body_1 b
+      (letExpr "x" (int32 1)
+        (letExpr "_hoist_x_body_1" (lambda "b" (list [var "x", var "b"]))
+          (lambda "a" (lambda "b" (apply (var "f") (apply (var "_hoist_x_body_1") (var "b"))))))),
+
+    -- ============================================================
+    -- Test: Stable naming for sibling immediate subterms
+    -- Each sibling uses its parent binding name as a prefix, ensuring
+    -- that changes to one sibling don't affect the names in another.
+    -- ============================================================
+
+    hoistCase "hoistLists: stable naming for binding and body"
+      hoistPredicateLists
+      -- Input: let x = f [1, 2] in g [3, 4]
+      -- Both binding value and body have lists to hoist
+      (letExpr "x" (apply (var "f") (list [int32 1, int32 2]))
+                   (apply (var "g") (list [int32 3, int32 4])))
+      -- Output: binding uses _hoist_x_1, body uses _hoist_x_body_1
+      (letExpr "x"
+        (letExpr "_hoist_x_1" (list [int32 1, int32 2])
+          (apply (var "f") (var "_hoist_x_1")))
+        (letExpr "_hoist_x_body_1" (list [int32 3, int32 4])
+          (apply (var "g") (var "_hoist_x_body_1")))),
+
+    hoistCase "hoistLists: stable naming for multiple bindings"
+      hoistPredicateLists
+      -- Input: let x = f [1]; y = g [2] in x
+      (multiLet [
+        ("x", apply (var "f") (list [int32 1])),
+        ("y", apply (var "g") (list [int32 2]))]
+        (var "x"))
+      -- Output: each binding uses its own name as prefix (_hoist_x_1, _hoist_y_1)
+      (multiLet [
+        ("x", letExpr "_hoist_x_1" (list [int32 1])
+                (apply (var "f") (var "_hoist_x_1"))),
+        ("y", letExpr "_hoist_y_1" (list [int32 2])
+                (apply (var "g") (var "_hoist_y_1")))]
+        (var "x")),
+
+    -- ============================================================
+    -- Test: Polymorphic recursion - this is the key test case
+    -- The new local-let approach avoids polymorphic mutual recursion
+    -- by keeping hoisted bindings local to each immediate subterm.
+    -- ============================================================
+
+    hoistCase "hoistLists: polymorphic binding with self-reference below hoisted term"
+      hoistPredicateLists
+      -- Input: let f = \x -> pair (f x) [x, 1] in f 42
+      -- f is polymorphic and has a self-reference, with a list below it
+      -- With sibling hoisting, this would create: let f = ...; _hoist_f_1 = [x, 1] in ...
+      -- which causes polymorphic mutual recursion issues.
+      -- With local hoisting, we get: let f = (let _hoist_f_1 = ... in ...) in ...
+      -- which is polymorphic nesting (OK) rather than mutual recursion.
+      (letExpr "f"
+        (lambda "x" (apply (apply (var "pair") (apply (var "f") (var "x")))
+                               (list [var "x", int32 1])))
+        (apply (var "f") (int32 42)))
+      -- Output: the list is hoisted into a local let within f's binding value
+      (letExpr "f"
+        (letExpr "_hoist_f_1" (lambda "x" (list [var "x", int32 1]))
+          (lambda "x" (apply (apply (var "pair") (apply (var "f") (var "x")))
+                                 (apply (var "_hoist_f_1") (var "x")))))
+        (apply (var "f") (int32 42)))]
+
+-- | Test cases for hoistCaseStatements
+-- This function hoists case statements (eliminations) that are NOT at "top level".
+-- Top level means: the root, or reachable through annotations, lambda bodies,
+-- or ONE application LHS. Case statements at top level can become Python match
+-- statements; those not at top level need to be hoisted.
+hoistCaseStatementsGroup :: TTerm TestGroup
+hoistCaseStatementsGroup = subgroup "hoistCaseStatements" [
+    -- ============================================================
+    -- Test: Case statement at top level - should NOT be hoisted
+    -- ============================================================
+
+    hoistCaseStatementsCase "case at top level of let body is NOT hoisted"
+      -- Input: let x = just 42 in match x with just y -> y | nothing -> 0
+      -- The case statement is directly in the let body (top level)
+      (letExpr "x" (optional $ just $ int32 42)
+        (match (nm "Optional") (just $ var "x")
+          [(nm "just", lambda "y" (var "y")),
+           (nm "nothing", int32 0)]))
+      -- Output: unchanged - case is at top level
+      (letExpr "x" (optional $ just $ int32 42)
+        (match (nm "Optional") (just $ var "x")
+          [(nm "just", lambda "y" (var "y")),
+           (nm "nothing", int32 0)])),
+
+    hoistCaseStatementsCase "case in let binding value is NOT hoisted"
+      -- Input: let x = match y with just z -> z | nothing -> 0 in x
+      -- The case statement is at top level of binding value
+      (letExpr "x"
+        (match (nm "Optional") (just $ var "y")
+          [(nm "just", lambda "z" (var "z")),
+           (nm "nothing", int32 0)])
+        (var "x"))
+      -- Output: unchanged - case is at top level
+      (letExpr "x"
+        (match (nm "Optional") (just $ var "y")
+          [(nm "just", lambda "z" (var "z")),
+           (nm "nothing", int32 0)])
+        (var "x")),
+
+    hoistCaseStatementsCase "case inside lambda body is NOT hoisted"
+      -- Input: let f = \a -> match a with just y -> y | nothing -> 0 in f (just 42)
+      -- The case is inside a lambda body, but lambda bodies are pass-through
+      -- This becomes def f(a): match a: ... in Python
+      (letExpr "f"
+        (lambda "a"
+          (match (nm "Optional") (just $ var "a")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]))
+        (apply (var "f") (optional $ just $ int32 42)))
+      -- Output: unchanged - case is at top level (through lambda body)
+      (letExpr "f"
+        (lambda "a"
+          (match (nm "Optional") (just $ var "a")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]))
+        (apply (var "f") (optional $ just $ int32 42))),
+
+    hoistCaseStatementsCase "case inside nested lambdas is NOT hoisted"
+      -- Input: let f = \a -> \b -> match a with ok -> b | err -> 0 in f
+      -- The case is inside nested lambdas - still at top level
+      -- This becomes def f(a, b): match a: ... in Python
+      (letExpr "f"
+        (lambda "a" (lambda "b"
+          (match (nm "Result") (just $ var "a")
+            [(nm "ok", var "b"),
+             (nm "err", int32 0)])))
+        (var "f"))
+      -- Output: unchanged - case is at top level (through lambda bodies)
+      (letExpr "f"
+        (lambda "a" (lambda "b"
+          (match (nm "Result") (just $ var "a")
+            [(nm "ok", var "b"),
+             (nm "err", int32 0)])))
+        (var "f")),
+
+    hoistCaseStatementsCase "case as LHS of one application is NOT hoisted"
+      -- Input: let f = (match Optional with ...) x in f
+      -- The case is LHS of one application - still at top level (one app LHS allowed)
+      -- This is match taking its single argument
+      (letExpr "f"
+        (apply
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (var "x"))
+        (var "f"))
+      -- Output: unchanged - case is at top level (one application LHS)
+      (letExpr "f"
+        (apply
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (var "x"))
+        (var "f")),
+
+    hoistCaseStatementsCase "case wrapped in annotation is NOT hoisted"
+      -- Input: let f = @ann (match Optional with ...) in f
+      -- The case is wrapped in annotation - annotations are transparent
+      (letExpr "f"
+        (annot emptyAnnMap
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]))
+        (var "f"))
+      -- Output: unchanged - case is at top level (through annotation)
+      (letExpr "f"
+        (annot emptyAnnMap
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]))
+        (var "f")),
+
+    hoistCaseStatementsCase "case in lambda with one application is NOT hoisted"
+      -- Input: let f = \a -> (match Optional with ...) a in f
+      -- Lambda body + one application LHS = still at top level
+      (letExpr "f"
+        (lambda "a"
+          (apply
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])
+            (var "a")))
+        (var "f"))
+      -- Output: unchanged - case is at top level
+      (letExpr "f"
+        (lambda "a"
+          (apply
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])
+            (var "a")))
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Case statement NOT at top level - SHOULD be hoisted
+    -- ============================================================
+
+    hoistCaseStatementsCase "case as RHS of application IS hoisted"
+      -- Input: let f = g (match Optional with ...) in f
+      -- The case is RHS of application (argument position) - NOT top level
+      (letExpr "f"
+        (apply (var "g")
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]))
+        (var "f"))
+      -- Output: case is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (apply (var "g") (var "_hoist_f_1")))
+        (var "f")),
+
+    hoistCaseStatementsCase "case in nested application LHS IS hoisted"
+      -- Input: let f = ((match Optional with ...) x) y in f
+      -- The case is LHS of LHS of application - only ONE app LHS allowed
+      -- The second application takes us out of top level
+      (letExpr "f"
+        (apply
+          (apply
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "z" (lambda "w" (var "z"))),
+               (nm "nothing", lambda "w" (int32 0))])
+            (var "x"))
+          (var "y"))
+        (var "f"))
+      -- Output: case is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "z" (lambda "w" (var "z"))),
+             (nm "nothing", lambda "w" (int32 0))])
+          (apply (apply (var "_hoist_f_1") (var "x")) (var "y")))
+        (var "f")),
+
+    hoistCaseStatementsCase "case inside list element IS hoisted"
+      -- Input: let f = [match Optional with ...] in f
+      -- The case is inside a list element - NOT top level
+      (letExpr "f"
+        (list [match (nm "Optional") nothing
+          [(nm "just", lambda "y" (var "y")),
+           (nm "nothing", int32 0)]])
+        (var "f"))
+      -- Output: case is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (list [var "_hoist_f_1"]))
+        (var "f")),
+
+    hoistCaseStatementsCase "case inside lambda inside list IS hoisted"
+      -- Input: let f = [\a -> match a with ...] in f
+      -- Even though case is inside lambda, the lambda itself is inside a list
+      -- The list position makes it not top level
+      (letExpr "f"
+        (list [lambda "a"
+          (match (nm "Optional") (just $ var "a")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])])
+        (var "f"))
+      -- Output: case is hoisted with 'a' captured
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (lambda "a"
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)]))
+          (list [lambda "a" (apply (var "_hoist_f_1") (var "a"))]))
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Non-case terms - should NOT be hoisted regardless
+    -- ============================================================
+
+    hoistCaseStatementsCase "list inside lambda is NOT hoisted (only case statements)"
+      -- Input: let f = \a -> [a, 1, 2] in f 0
+      -- The list is not at top level, but hoistCaseStatements only hoists cases
+      (letExpr "f"
+        (lambda "a" (list [var "a", int32 1, int32 2]))
+        (apply (var "f") (int32 0)))
+      -- Output: unchanged - only case statements are hoisted
+      (letExpr "f"
+        (lambda "a" (list [var "a", int32 1, int32 2]))
+        (apply (var "f") (int32 0))),
+
+    -- ============================================================
+    -- Test: Mixed scenarios
+    -- ============================================================
+
+    hoistCaseStatementsCase "case in binding is not hoisted, case in arg position is hoisted"
+      -- Input: let x = match a with ... in f (match b with ...)
+      -- First case is at top level of binding, second is in argument position
+      (letExpr "x"
+        (match (nm "Optional") (just $ var "a")
+          [(nm "just", lambda "z" (var "z")),
+           (nm "nothing", int32 0)])
+        (apply (var "f")
+          (match (nm "Optional") (just $ var "b")
+            [(nm "just", lambda "w" (var "w")),
+             (nm "nothing", int32 0)])))
+      -- Output: only second case is hoisted
+      (letExpr "x"
+        (match (nm "Optional") (just $ var "a")
+          [(nm "just", lambda "z" (var "z")),
+           (nm "nothing", int32 0)])
+        (letExpr "_hoist_x_body_1"
+          (match (nm "Optional") (just $ var "b")
+            [(nm "just", lambda "w" (var "w")),
+             (nm "nothing", int32 0)])
+          (apply (var "f") (var "_hoist_x_body_1")))),
+
+    -- ============================================================
+    -- Test: Mixed let and lambda at top level (no hoisting needed)
+    -- ============================================================
+
+    hoistCaseStatementsCase "case in nested let body is NOT hoisted"
+      -- Input: let x = 1 in let y = 2 in match z with ...
+      -- The case is in nested let body - still at top level
+      (letExpr "x" (int32 1)
+        (letExpr "y" (int32 2)
+          (match (nm "Optional") (just $ var "z")
+            [(nm "just", lambda "w" (var "w")),
+             (nm "nothing", int32 0)])))
+      -- Output: unchanged
+      (letExpr "x" (int32 1)
+        (letExpr "y" (int32 2)
+          (match (nm "Optional") (just $ var "z")
+            [(nm "just", lambda "w" (var "w")),
+             (nm "nothing", int32 0)]))),
+
+    hoistCaseStatementsCase "case in let inside lambda is NOT hoisted"
+      -- Input: let f = \a -> let x = 1 in match a with ...
+      -- Lambda body then let body - both pass through
+      (letExpr "f"
+        (lambda "a"
+          (letExpr "x" (int32 1)
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])))
+        (var "f"))
+      -- Output: unchanged
+      (letExpr "f"
+        (lambda "a"
+          (letExpr "x" (int32 1)
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])))
+        (var "f")),
+
+    hoistCaseStatementsCase "case in lambda inside let body is NOT hoisted"
+      -- Input: let x = 1 in \a -> match a with ...
+      -- Let body then lambda body - both pass through
+      (letExpr "x" (int32 1)
+        (lambda "a"
+          (match (nm "Optional") (just $ var "a")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])))
+      -- Output: unchanged
+      (letExpr "x" (int32 1)
+        (lambda "a"
+          (match (nm "Optional") (just $ var "a")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]))),
+
+    hoistCaseStatementsCase "case with let+lambda+app is NOT hoisted"
+      -- Input: let f = \a -> let x = 1 in (match a with ...) x
+      -- Lambda body, let body, one app LHS - all pass through
+      (letExpr "f"
+        (lambda "a"
+          (letExpr "x" (int32 1)
+            (apply
+              (match (nm "Optional") nothing
+                [(nm "just", lambda "y" (var "y")),
+                 (nm "nothing", int32 0)])
+              (var "x"))))
+        (var "f"))
+      -- Output: unchanged
+      (letExpr "f"
+        (lambda "a"
+          (letExpr "x" (int32 1)
+            (apply
+              (match (nm "Optional") nothing
+                [(nm "just", lambda "y" (var "y")),
+                 (nm "nothing", int32 0)])
+              (var "x"))))
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Multiple applications (hoisting required)
+    -- ============================================================
+
+    hoistCaseStatementsCase "case in triple application LHS IS hoisted"
+      -- Input: let f = (((match ...) x) y) z in f
+      -- Three nested applications - only one app LHS allowed
+      (letExpr "f"
+        (apply
+          (apply
+            (apply
+              (match (nm "Optional") nothing
+                [(nm "just", lambda "a" (lambda "b" (lambda "c" (var "a")))),
+                 (nm "nothing", lambda "b" (lambda "c" (int32 0)))])
+              (var "x"))
+            (var "y"))
+          (var "z"))
+        (var "f"))
+      -- Output: case is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "a" (lambda "b" (lambda "c" (var "a")))),
+             (nm "nothing", lambda "b" (lambda "c" (int32 0)))])
+          (apply (apply (apply (var "_hoist_f_1") (var "x")) (var "y")) (var "z")))
+        (var "f")),
+
+    hoistCaseStatementsCase "case as second argument IS hoisted"
+      -- Input: let f = g x (match ...) in f
+      -- Case is RHS of second application
+      (letExpr "f"
+        (apply (apply (var "g") (var "x"))
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]))
+        (var "f"))
+      -- Output: case is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (apply (apply (var "g") (var "x")) (var "_hoist_f_1")))
+        (var "f")),
+
+    hoistCaseStatementsCase "case in both arguments - both hoisted"
+      -- Input: let f = g (match a ...) (match b ...) in f
+      -- Both cases are in argument positions
+      (letExpr "f"
+        (apply
+          (apply (var "g")
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "x" (var "x")),
+               (nm "nothing", int32 0)]))
+          (match (nm "Optional") (just $ var "b")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 1)]))
+        (var "f"))
+      -- Output: both cases hoisted into a SINGLE let with two bindings
+      -- (hoistSubterms collects all hoistable terms from one subterm into one let)
+      (letExpr "f"
+        (lets
+          [(nm "_hoist_f_1",
+            match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "x" (var "x")),
+               (nm "nothing", int32 0)]),
+           (nm "_hoist_f_2",
+            match (nm "Optional") (just $ var "b")
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 1)])]
+          (apply (apply (var "g") (var "_hoist_f_1")) (var "_hoist_f_2")))
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Descent into various structures (hoisting required)
+    -- ============================================================
+
+    hoistCaseStatementsCase "case in second list element IS hoisted"
+      -- Input: let f = [1, match ...] in f
+      (letExpr "f"
+        (list [int32 1,
+          match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]])
+        (var "f"))
+      -- Output: case is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (list [int32 1, var "_hoist_f_1"]))
+        (var "f")),
+
+    hoistCaseStatementsCase "multiple cases in list - all hoisted"
+      -- Input: let f = [match a ..., match b ...] in f
+      (letExpr "f"
+        (list [
+          match (nm "Optional") (just $ var "a")
+            [(nm "just", lambda "x" (var "x")),
+             (nm "nothing", int32 0)],
+          match (nm "Optional") (just $ var "b")
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 1)]])
+        (var "f"))
+      -- Output: both cases hoisted into a SINGLE let with two bindings
+      (letExpr "f"
+        (lets
+          [(nm "_hoist_f_1",
+            match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "x" (var "x")),
+               (nm "nothing", int32 0)]),
+           (nm "_hoist_f_2",
+            match (nm "Optional") (just $ var "b")
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 1)])]
+          (list [var "_hoist_f_1", var "_hoist_f_2"]))
+        (var "f")),
+
+    hoistCaseStatementsCase "case in pair first element IS hoisted"
+      -- Input: let f = (match ..., 1) in f
+      (letExpr "f"
+        (pair
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (int32 1))
+        (var "f"))
+      -- Output: case is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (pair (var "_hoist_f_1") (int32 1)))
+        (var "f")),
+
+    hoistCaseStatementsCase "case in pair second element IS hoisted"
+      -- Input: let f = (1, match ...) in f
+      (letExpr "f"
+        (pair
+          (int32 1)
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)]))
+        (var "f"))
+      -- Output: case is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (pair (int32 1) (var "_hoist_f_1")))
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Nested let terms - case hoisted into CHILD let, not parent
+    -- This is critical: hoisting is local to immediate subterms
+    -- ============================================================
+
+    hoistCaseStatementsCase "case in child let binding hoisted into child"
+      -- Input: let outer = (let inner = g (match ...) in inner) in outer
+      -- The case is in the binding of inner let, inside argument position
+      -- It should be hoisted into the inner let, not the outer
+      (letExpr "outer"
+        (letExpr "inner"
+          (apply (var "g")
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)]))
+          (var "inner"))
+        (var "outer"))
+      -- Output: case hoisted into inner let's binding
+      (letExpr "outer"
+        (letExpr "inner"
+          (letExpr "_hoist_inner_1"
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])
+            (apply (var "g") (var "_hoist_inner_1")))
+          (var "inner"))
+        (var "outer")),
+
+    hoistCaseStatementsCase "case in child let body hoisted into child"
+      -- Input: let outer = (let inner = 1 in g (match ...)) in outer
+      -- The case is in the body of inner let, inside argument position
+      -- It should be hoisted into the inner let's body, not the outer
+      (letExpr "outer"
+        (letExpr "inner" (int32 1)
+          (apply (var "g")
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])))
+        (var "outer"))
+      -- Output: case hoisted into inner let's body
+      (letExpr "outer"
+        (letExpr "inner" (int32 1)
+          (letExpr "_hoist_inner_body_1"
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])
+            (apply (var "g") (var "_hoist_inner_body_1"))))
+        (var "outer")),
+
+    hoistCaseStatementsCase "case at top level of child let NOT hoisted"
+      -- Input: let outer = (let inner = match ... in inner) in outer
+      -- The case is at top level of inner let's binding - no hoisting needed
+      (letExpr "outer"
+        (letExpr "inner"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (var "inner"))
+        (var "outer"))
+      -- Output: unchanged
+      (letExpr "outer"
+        (letExpr "inner"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (var "inner"))
+        (var "outer")),
+
+    hoistCaseStatementsCase "cases in both outer and child - each hoisted locally"
+      -- Input: let outer = f (match a ...) (let inner = g (match b ...) in inner) in outer
+      -- First case in outer's body (arg position), second in inner's binding (arg position)
+      -- Each should be hoisted into its respective scope
+      -- Each binding uses its name as prefix: inner gets _hoist_inner_1, outer gets _hoist_outer_1
+      (letExpr "outer"
+        (apply
+          (apply (var "f")
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "x" (var "x")),
+               (nm "nothing", int32 0)]))
+          (letExpr "inner"
+            (apply (var "g")
+              (match (nm "Optional") (just $ var "b")
+                [(nm "just", lambda "y" (var "y")),
+                 (nm "nothing", int32 1)]))
+            (var "inner")))
+        (var "outer"))
+      -- Output: outer binding gets _hoist_outer_1, inner binding gets _hoist_inner_1
+      (letExpr "outer"
+        (letExpr "_hoist_outer_1"
+          (match (nm "Optional") (just $ var "a")
+            [(nm "just", lambda "x" (var "x")),
+             (nm "nothing", int32 0)])
+          (apply
+            (apply (var "f") (var "_hoist_outer_1"))
+            (letExpr "inner"
+              (letExpr "_hoist_inner_1"
+                (match (nm "Optional") (just $ var "b")
+                  [(nm "just", lambda "y" (var "y")),
+                   (nm "nothing", int32 1)])
+                (apply (var "g") (var "_hoist_inner_1")))
+              (var "inner"))))
+        (var "outer")),
+
+    -- ============================================================
+    -- Test: Lambda after app LHS - should trigger hoisting
+    -- ============================================================
+
+    hoistCaseStatementsCase "lambda after app LHS takes us out of top level"
+      -- Input: let f = ((\a -> match a with ...) x) in f
+      -- App LHS then lambda body - after using app, lambda doesn't help
+      (letExpr "f"
+        (apply
+          (lambda "a"
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)]))
+          (var "x"))
+        (var "f"))
+      -- Output: case is hoisted because lambda comes after we've used our one app LHS
+      -- Path to case: letBinding, applicationFunction, lambdaBody
+      -- Processing: letBinding (pass), applicationFunction (use app, mark usedApp=true), lambdaBody (usedApp=true, fail)
+      -- So case IS hoisted. The case uses 'a' which is lambda-bound, so it's wrapped in a lambda
+      -- and the reference becomes (_hoist_f_1 a)
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          -- The hoisted case is wrapped in a lambda to capture 'a'
+          (lambda "a"
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)]))
+          -- The original lambda body is replaced with (_hoist_f_1 a)
+          (apply
+            (lambda "a" (apply (var "_hoist_f_1") (var "a")))
+            (var "x")))
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Case statements inside case branches (nested cases)
+    -- Case branches bind variables, so they are like lambda bodies
+    -- ============================================================
+
+    hoistCaseStatementsCase "case inside case branch is NOT hoisted"
+      -- Input: let f = match x with just a -> match a with ... | nothing -> 0 in f
+      -- Inner case is inside a case branch - branches are pass-through like lambdas
+      (letExpr "f"
+        (match (nm "Optional") (just $ var "x")
+          [(nm "just", lambda "a"
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "b" (var "b")),
+               (nm "nothing", int32 0)])),
+           (nm "nothing", int32 0)])
+        (var "f"))
+      -- Output: unchanged - inner case is at top level (through case branch)
+      (letExpr "f"
+        (match (nm "Optional") (just $ var "x")
+          [(nm "just", lambda "a"
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "b" (var "b")),
+               (nm "nothing", int32 0)])),
+           (nm "nothing", int32 0)])
+        (var "f")),
+
+    hoistCaseStatementsCase "case inside case default branch is NOT hoisted"
+      -- Input: let f = match x with just a -> a | nothing -> match y with ... in f
+      -- Inner case is in default branch - still pass-through
+      (letExpr "f"
+        (match (nm "Optional") (just $ var "x")
+          [(nm "just", lambda "a" (var "a")),
+           (nm "nothing",
+            match (nm "Optional") (just $ var "y")
+              [(nm "just", lambda "b" (var "b")),
+               (nm "nothing", int32 0)])])
+        (var "f"))
+      -- Output: unchanged - inner case is at top level (through case default)
+      (letExpr "f"
+        (match (nm "Optional") (just $ var "x")
+          [(nm "just", lambda "a" (var "a")),
+           (nm "nothing",
+            match (nm "Optional") (just $ var "y")
+              [(nm "just", lambda "b" (var "b")),
+               (nm "nothing", int32 0)])])
+        (var "f")),
+
+    hoistCaseStatementsCase "case in arg position inside case branch IS hoisted"
+      -- Input: let f = match x with just a -> g (match a with ...) | nothing -> 0 in f
+      -- Inner case is in argument position inside a case branch - should be hoisted
+      (letExpr "f"
+        (match (nm "Optional") (just $ var "x")
+          [(nm "just", lambda "a"
+            (apply (var "g")
+              (match (nm "Optional") (just $ var "a")
+                [(nm "just", lambda "b" (var "b")),
+                 (nm "nothing", int32 0)]))),
+           (nm "nothing", int32 0)])
+        (var "f"))
+      -- Output: inner case is hoisted to the OUTER let level (not inside the branch)
+      -- because hoistSubterms only creates lets at existing let boundaries.
+      -- The inner case uses 'a' which is lambda-bound, so it's wrapped in a lambda
+      -- and the reference becomes (_hoist_f_1 a)
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          -- The inner case wrapped in a lambda to capture 'a'
+          (lambda "a"
+            (match (nm "Optional") (just $ var "a")
+              [(nm "just", lambda "b" (var "b")),
+               (nm "nothing", int32 0)]))
+          -- The outer case with the reference (_hoist_f_1 a) inside the branch
+          (match (nm "Optional") (just $ var "x")
+            [(nm "just", lambda "a"
+              (apply (var "g") (apply (var "_hoist_f_1") (var "a")))),
+             (nm "nothing", int32 0)]))
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Case inside case default with let binding
+    -- This is the pattern from isSimpleAssignment in CoderUtils:
+    -- match term with
+    --   specific_case -> ...
+    --   _ -> let baseTerm = f(term) in match baseTerm with ...
+    -- The inner case in the default branch's let body must be hoisted
+    -- because Python can't encode match statements inline in case branches
+    -- ============================================================
+
+    hoistCaseStatementsCase "case in let body inside applied case default IS hoisted"
+      -- Input: let f = (case x of just a -> a | _ -> let b = g(x) in (case b of ...)(b)) x
+      -- The outer case is applied (through `cases`/`apply`), putting default branch
+      -- at non-top-level. Inner applied case in default > let body must be hoisted.
+      -- This is the pattern from isSimpleAssignment in CoderUtils.
+      (letExpr "f"
+        (apply
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "a" (var "a")),
+             (nm "nothing",
+              letExpr "b" (apply (var "g") (var "x"))
+                (apply
+                  (match (nm "Result") nothing
+                    [(nm "ok", lambda "y" (var "y")),
+                     (nm "err", int32 0)])
+                  (var "b")))])
+          (var "x"))
+        (var "f"))
+      -- Output: inner applied case is hoisted within the inner let (preserving let-bound variable scoping)
+      (letExpr "f"
+        (apply
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "a" (var "a")),
+             (nm "nothing",
+              letExpr "b" (apply (var "g") (var "x"))
+                (letExpr "_hoist_b_body_1"
+                  (match (nm "Result") nothing
+                    [(nm "ok", lambda "y" (var "y")),
+                     (nm "err", int32 0)])
+                  (apply (var "_hoist_b_body_1") (var "b"))))])
+          (var "x"))
+        (var "f")),
+
+    hoistCaseStatementsCase "case in let body inside applied case branch IS hoisted"
+      -- Input: let f = (case x of just a -> let b = h(a) in (case b of ...)(b) | nothing -> 0) x
+      -- Like above but inner case is in a named branch rather than default.
+      -- 'a' IS lambda-bound (from the case branch), so it IS captured.
+      (letExpr "f"
+        (apply
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "a"
+              (letExpr "b" (apply (var "h") (var "a"))
+                (apply
+                  (match (nm "Result") nothing
+                    [(nm "ok", lambda "y" (var "y")),
+                     (nm "err", int32 0)])
+                  (var "b")))),
+             (nm "nothing", int32 0)])
+          (var "x"))
+        (var "f"))
+      -- Output: inner case is hoisted within the inner let (preserving let-bound variable scoping)
+      (letExpr "f"
+        (apply
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "a"
+              (letExpr "b" (apply (var "h") (var "a"))
+                (letExpr "_hoist_b_body_1"
+                  (match (nm "Result") nothing
+                    [(nm "ok", lambda "y" (var "y")),
+                     (nm "err", int32 0)])
+                  (apply (var "_hoist_b_body_1") (var "b"))))),
+             (nm "nothing", int32 0)])
+          (var "x"))
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Case applications (case function applied to argument)
+    -- ============================================================
+
+    hoistCaseStatementsCase "case application at top level of binding is NOT hoisted"
+      -- Input: let f = (match Optional with ...) x in f
+      -- The case application is at top level (one app LHS)
+      (letExpr "f"
+        (apply
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (var "x"))
+        (var "f"))
+      -- Output: unchanged
+      (letExpr "f"
+        (apply
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (var "x"))
+        (var "f")),
+
+    hoistCaseStatementsCase "case application in arg position IS hoisted"
+      -- Input: let f = g ((match Optional with ...) x) in f
+      -- The bare case function is hoisted first (bottom-up), then the application
+      -- uses the hoisted reference. 'x' is not lambda-bound so not captured.
+      (letExpr "f"
+        (apply (var "g")
+          (apply
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])
+            (var "x")))
+        (var "f"))
+      -- Output: bare case function is hoisted, application becomes _hoist_f_1(x)
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (apply (var "g") (apply (var "_hoist_f_1") (var "x"))))
+        (var "f")),
+
+    hoistCaseStatementsCase "case application inside immediately-applied lambda IS hoisted"
+      -- Input: let f = (\a -> (match Optional with ...) a) x in f
+      -- The bare case function is inside \a -> (case ...) a. Bottom-up processing:
+      -- The bare case function at path [LetBinding f, ApplicationFunction, LambdaBody, ApplicationFunction]
+      -- gets hoisted. No captured variables (case function has no free vars).
+      (letExpr "f"
+        (apply
+          (lambda "a"
+            (apply
+              (match (nm "Optional") nothing
+                [(nm "just", lambda "y" (var "y")),
+                 (nm "nothing", int32 0)])
+              (var "a")))
+          (var "x"))
+        (var "f"))
+      -- Output: bare case function is hoisted
+      (letExpr "f"
+        (letExpr "_hoist_f_1"
+          (match (nm "Optional") nothing
+            [(nm "just", lambda "y" (var "y")),
+             (nm "nothing", int32 0)])
+          (apply
+            (lambda "a" (apply (var "_hoist_f_1") (var "a")))
+            (var "x")))
+        (var "f")),
+
+    hoistCaseStatementsCase "case application in lambda body is NOT hoisted"
+      -- Input: let f = \a -> (match Optional with ...) a in f
+      -- Lambda body + one app LHS = still at top level
+      (letExpr "f"
+        (lambda "a"
+          (apply
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])
+            (var "a")))
+        (var "f"))
+      -- Output: unchanged
+      (letExpr "f"
+        (lambda "a"
+          (apply
+            (match (nm "Optional") nothing
+              [(nm "just", lambda "y" (var "y")),
+               (nm "nothing", int32 0)])
+            (var "a")))
+        (var "f"))]
diff --git a/src/main/haskell/Hydra/Sources/Test/Hoisting/Let.hs b/src/main/haskell/Hydra/Sources/Test/Hoisting/Let.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Hoisting/Let.hs
@@ -0,0 +1,941 @@
+-- | Test cases for let-binding hoisting transformations
+
+module Hydra.Sources.Test.Hoisting.Let where
+
+-- Standard imports for shallow DSL tests
+import Hydra.Kernel
+import Hydra.Dsl.Meta.Testing                 as Testing
+import Hydra.Dsl.Meta.Terms                   as Terms
+import Hydra.Sources.Kernel.Types.All
+import qualified Hydra.Dsl.Meta.Core          as Core
+import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
+import qualified Hydra.Dsl.Meta.Types         as T
+import qualified Hydra.Sources.Test.TestGraph as TestGraph
+import qualified Hydra.Sources.Test.TestTerms as TestTerms
+import qualified Hydra.Sources.Test.TestTypes as TestTypes
+import qualified Data.List                    as L
+import qualified Data.Map                     as M
+
+import Hydra.Testing
+import Hydra.Sources.Libraries
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.hoisting.let"
+
+module_ :: Module
+module_ = Module ns elements [] kernelTypesNamespaces $
+    Just "Test cases for let-binding hoisting transformations"
+  where
+    elements = [Phantoms.toTermDefinition allTests]
+
+allTests :: TBinding TestGroup
+allTests = definitionInModule module_ "allTests" $
+    Phantoms.doc "Test cases for let-binding hoisting transformations" $
+    supergroup "hoistLet" [
+      hoistLetBindingsGroup,
+      hoistPolymorphicLetBindingsGroup,
+      hoistPolymorphicTypeParametersGroup]
+
+-- Helper to build names
+nm :: String -> TTerm Name
+nm s = Core.name $ Phantoms.string s
+
+-- Helper for single-binding let
+letExpr :: String -> TTerm Term -> TTerm Term -> TTerm Term
+letExpr varName value body = lets [(nm varName, value)] body
+
+-- Helper for multi-binding let
+multiLet :: [(String, TTerm Term)] -> TTerm Term -> TTerm Term
+multiLet bindings body = lets ((\(n, v) -> (nm n, v)) <$> bindings) body
+
+-- | Convenience function for creating hoist let bindings test cases (hoistAll=True)
+hoistAllCase :: String -> TTerm Let -> TTerm Let -> TTerm TestCaseWithMetadata
+hoistAllCase cname input output = hoistLetBindingsCase cname input output
+
+-- | Helper for creating a Let term with typed bindings
+mkLet :: [(TTerm Name, TTerm Term, TTerm (Maybe TypeScheme))] -> TTerm Term -> TTerm Let
+mkLet bindings body = Core.let_ (Phantoms.list $ mkBinding <$> bindings) body
+  where
+    mkBinding :: (TTerm Name, TTerm Term, TTerm (Maybe TypeScheme)) -> TTerm Binding
+    mkBinding (n, t, ts) = Core.binding n t ts
+
+-- | Helper for creating a Let term with untyped bindings
+mkLetUntyped :: [(TTerm Name, TTerm Term)] -> TTerm Term -> TTerm Let
+mkLetUntyped bindings body = Core.let_ (Phantoms.list $ mkBinding <$> bindings) body
+  where
+    mkBinding :: (TTerm Name, TTerm Term) -> TTerm Binding
+    mkBinding (n, t) = Core.binding n t Phantoms.nothing
+
+-- | Helper for creating a monomorphic type scheme
+monoType :: TTerm Type -> TTerm (Maybe TypeScheme)
+monoType typ = Phantoms.just $ Core.typeScheme (Phantoms.list ([] :: [TTerm Name])) typ Phantoms.nothing
+
+-- | Helper for creating a polymorphic type scheme
+polyType :: [String] -> TTerm Type -> TTerm (Maybe TypeScheme)
+polyType vars typ = Phantoms.just $ Core.typeScheme (Phantoms.list $ nm <$> vars) typ Phantoms.nothing
+
+-- | Convenience function for creating hoist polymorphic let bindings test cases
+hoistPolyCase :: String -> TTerm Let -> TTerm Let -> TTerm TestCaseWithMetadata
+hoistPolyCase cname input output = hoistPolymorphicLetBindingsCase cname input output
+
+-- | Test cases for hoistPolymorphicLetBindings
+-- This function hoists polymorphic let bindings (those with non-empty type scheme variables)
+-- to the top level of the given let term.
+hoistPolymorphicLetBindingsGroup :: TTerm TestGroup
+hoistPolymorphicLetBindingsGroup = subgroup "hoistPolymorphicLetBindings" [
+    -- ============================================================
+    -- Test: No polymorphic bindings - unchanged
+    -- ============================================================
+
+    hoistPolyCase "no polymorphic bindings: simple let unchanged"
+      -- Input: let x : Int32 = 42 in x
+      (mkLet [(nm "x", int32 42, monoType T.int32)] (var "x"))
+      -- Output: unchanged
+      (mkLet [(nm "x", int32 42, monoType T.int32)] (var "x")),
+
+    hoistPolyCase "no polymorphic bindings: multiple monomorphic bindings"
+      -- Input: let x : Int32 = 1; y : String = "hi" in pair x y
+      (mkLet [
+        (nm "x", int32 1, monoType T.int32),
+        (nm "y", string "hi", monoType T.string)]
+        (apply (apply (var "pair") (var "x")) (var "y")))
+      -- Output: unchanged
+      (mkLet [
+        (nm "x", int32 1, monoType T.int32),
+        (nm "y", string "hi", monoType T.string)]
+        (apply (apply (var "pair") (var "x")) (var "y"))),
+
+    -- ============================================================
+    -- Test: Single polymorphic binding at top level - stays in place
+    -- ============================================================
+
+    hoistPolyCase "single polymorphic binding: already at top level"
+      -- Input: let id : forall a. a -> a = \x -> x in id 42
+      (mkLet [(nm "id", lambda "x" (var "x"), polyType ["a"] (T.function (T.var "a") (T.var "a")))]
+        (apply (var "id") (int32 42)))
+      -- Output: unchanged (already at top)
+      (mkLet [(nm "id", lambda "x" (var "x"), polyType ["a"] (T.function (T.var "a") (T.var "a")))]
+        (apply (var "id") (int32 42))),
+
+    -- ============================================================
+    -- Test: Polymorphic binding inside lambda body
+    -- ============================================================
+
+    hoistPolyCase "polymorphic binding inside lambda: no capture"
+      -- Input: let f = \a -> (let id : forall b. b -> b = \x -> x in id a) in f 42
+      -- Here 'id' does not reference 'a', so it can be hoisted directly
+      (mkLet [(nm "f",
+        lambda "a" (Core.termLet $ mkLet [(nm "id", lambda "x" (var "x"), polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+          (apply (var "id") (var "a"))),
+        monoType (T.function T.int32 T.int32))]
+        (apply (var "f") (int32 42)))
+      -- Output: f comes first (original binding), then f_id is hoisted (no wrapping needed)
+      (mkLet [
+        (nm "f",
+          lambda "a" (apply (var "f_id") (var "a")),
+          monoType (T.function T.int32 T.int32)),
+        (nm "f_id", tylam "b" (lambda "x" (var "x")), polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+        (apply (var "f") (int32 42))),
+
+    -- ============================================================
+    -- Test: Polymorphic binding captures lambda variable - requires wrapping
+    -- ============================================================
+
+    hoistPolyCase "polymorphic binding captures lambda variable: wrapped in lambda"
+      -- Input: let f = \(a:String) -> (let g : forall b. b -> Pair<String, b> = \x -> pair a x in g 42) in f "hello"
+      -- Here 'g' references 'a' (the enclosing lambda's variable), so when hoisted,
+      -- it must be wrapped in a lambda that takes 'a', and the reference replaced with an application
+      (mkLet [(nm "f",
+        lambdaTyped "a" T.string (Core.termLet $ mkLet [
+          (nm "g", lambda "x" (apply (apply (var "pair") (var "a")) (var "x")),
+            polyType ["b"] (T.function (T.var "b") (T.pair T.string (T.var "b"))))]
+          (apply (var "g") (int32 42))),
+        monoType (T.function T.string (T.pair T.string T.int32)))]
+        (apply (var "f") (string "hello")))
+      -- Output: f comes first (original binding), then f_g is hoisted wrapped in \(a:String) -> ..., and reference becomes (f_g a)
+      (mkLet [
+        (nm "f",
+          lambdaTyped "a" T.string (apply (apply (var "f_g") (var "a")) (int32 42)),
+          monoType (T.function T.string (T.pair T.string T.int32))),
+        (nm "f_g", tylam "b" (lambdaTyped "a" T.string (lambda "x" (apply (apply (var "pair") (var "a")) (var "x")))),
+          polyType ["b"] (T.function T.string (T.function (T.var "b") (T.pair T.string (T.var "b")))))]
+        (apply (var "f") (string "hello"))),
+
+    hoistPolyCase "polymorphic binding captures multiple lambda variables"
+      -- Input: let f = \(a:Int32) -> \(b:Int32) -> (let g : forall c. c -> c = \x -> triple a b x in g 42) in f 1 2
+      -- Here 'g' references both 'a' and 'b', so it needs to be wrapped with both
+      (mkLet [(nm "f",
+        lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (Core.termLet $ mkLet [
+          (nm "g", lambda "x" (apply (apply (apply (var "triple") (var "a")) (var "b")) (var "x")),
+            polyType ["c"] (T.function (T.var "c") (T.var "c")))]
+          (apply (var "g") (int32 42)))),
+        monoType (T.function T.int32 (T.function T.int32 T.int32)))]
+        (apply (apply (var "f") (int32 1)) (int32 2)))
+      -- Output: f comes first (original binding), then f_g is wrapped in \(a:Int32) -> \(b:Int32) -> ..., references become ((f_g a) b)
+      (mkLet [
+        (nm "f",
+          lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (apply (apply (apply (var "f_g") (var "a")) (var "b")) (int32 42))),
+          monoType (T.function T.int32 (T.function T.int32 T.int32))),
+        (nm "f_g", tylam "c" (lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (lambda "x" (apply (apply (apply (var "triple") (var "a")) (var "b")) (var "x"))))),
+          polyType ["c"] (T.function T.int32 (T.function T.int32 (T.function (T.var "c") (T.var "c")))))]
+        (apply (apply (var "f") (int32 1)) (int32 2))),
+
+    hoistPolyCase "polymorphic binding captures some but not all lambda variables"
+      -- Input: let f = \(a:Int32) -> \(b:Int32) -> (let g : forall c. c -> Pair<Int32, c> = \x -> pair a x in g b) in f 1 2
+      -- Here 'g' only references 'a', not 'b'
+      (mkLet [(nm "f",
+        lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (Core.termLet $ mkLet [
+          (nm "g", lambda "x" (apply (apply (var "pair") (var "a")) (var "x")),
+            polyType ["c"] (T.function (T.var "c") (T.pair T.int32 (T.var "c"))))]
+          (apply (var "g") (var "b")))),
+        monoType (T.function T.int32 (T.function T.int32 (T.pair T.int32 T.int32))))]
+        (apply (apply (var "f") (int32 1)) (int32 2)))
+      -- Output: f comes first (original binding), then f_g is wrapped only in \(a:Int32) -> ..., reference becomes (f_g a)
+      (mkLet [
+        (nm "f",
+          lambdaTyped "a" T.int32 (lambdaTyped "b" T.int32 (apply (apply (var "f_g") (var "a")) (var "b"))),
+          monoType (T.function T.int32 (T.function T.int32 (T.pair T.int32 T.int32)))),
+        (nm "f_g", tylam "c" (lambdaTyped "a" T.int32 (lambda "x" (apply (apply (var "pair") (var "a")) (var "x")))),
+          polyType ["c"] (T.function T.int32 (T.function (T.var "c") (T.pair T.int32 (T.var "c")))))]
+        (apply (apply (var "f") (int32 1)) (int32 2))),
+
+    hoistPolyCase "polymorphic binding captures both lambda-bound and let-bound variables"
+      -- Input: let f = \(a:Int32) -> (let x : Int32 = 1; g : forall b. b -> b = \y -> add (add a x) y in g 42) in f 10
+      -- Here 'g' references 'a' (lambda-bound from enclosing scope) and 'x' (let-bound sibling).
+      -- When g is hoisted to the top level, it goes OUTSIDE the inner let block, so it must capture
+      -- both 'a' (from the enclosing lambda) AND 'x' (which is no longer a sibling after hoisting).
+      (mkLet [(nm "f",
+        lambdaTyped "a" T.int32 (Core.termLet $ mkLet [
+          (nm "x", int32 1, monoType T.int32),
+          (nm "g", lambda "y" (apply (apply (primitive _math_add)
+                    (apply (apply (primitive _math_add) (var "a")) (var "x"))) (var "y")),
+            polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+          (apply (var "g") (int32 42))),
+        monoType (T.function T.int32 T.int32))]
+        (apply (var "f") (int32 10)))
+      -- Output: f comes first (original binding), then f_g captures both 'a' and 'x', reference becomes ((f_g a) x)
+      (mkLet [
+        (nm "f",
+          lambdaTyped "a" T.int32 (Core.termLet $ mkLet [
+            (nm "x", int32 1, monoType T.int32)]
+            (apply (apply (apply (var "f_g") (var "a")) (var "x")) (int32 42))),
+          monoType (T.function T.int32 T.int32)),
+        (nm "f_g", tylam "b" (lambdaTyped "a" T.int32 (lambdaTyped "x" T.int32
+          (lambda "y" (apply (apply (primitive _math_add)
+            (apply (apply (primitive _math_add) (var "a")) (var "x"))) (var "y"))))),
+          polyType ["b"] (T.function T.int32 (T.function T.int32 (T.function (T.var "b") (T.var "b")))))]
+        (apply (var "f") (int32 10))),
+
+    hoistPolyCase "sibling polymorphic bindings inside lambda: one calls the other"
+      -- Input: let wrapper = \outer : Int32 -> let g : forall a. a -> a = \y -> add outer y; h : forall b. b -> b = \z -> g z in h 42 in wrapper 10
+      -- This mimics the structure in unifyTypeConstraints where bind and tryBinding are
+      -- both inside withConstraint lambda and one calls the other.
+      -- g captures 'outer', h calls g which means h must transitively capture 'outer'
+      (mkLet [(nm "wrapper",
+        lambdaTyped "outer" T.int32 (Core.termLet $ mkLet [
+          (nm "g", lambda "y" (apply (apply (primitive _math_add) (var "outer")) (var "y")),
+            polyType ["a"] (T.function (T.var "a") (T.var "a"))),
+          (nm "h", lambda "z" (apply (var "g") (var "z")),
+            polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+          (apply (var "h") (int32 42))),
+        monoType (T.function T.int32 T.int32))]
+        (apply (var "wrapper") (int32 10)))
+      -- Output: wrapper first (original), then wrapper_g and wrapper_h hoisted (both capture outer)
+      -- wrapper_g is wrapped: \outer -> \y -> add outer y
+      -- wrapper_h is wrapped: \outer -> \z -> (wrapper_g outer) z
+      -- The reference to wrapper_g inside wrapper_h becomes (wrapper_g outer)
+      (mkLet [
+        (nm "wrapper",
+          lambdaTyped "outer" T.int32 (apply (apply (var "wrapper_h") (var "outer")) (int32 42)),
+          monoType (T.function T.int32 T.int32)),
+        (nm "wrapper_g", tylam "a" (lambdaTyped "outer" T.int32 (lambda "y" (apply (apply (primitive _math_add) (var "outer")) (var "y")))),
+          polyType ["a"] (T.function T.int32 (T.function (T.var "a") (T.var "a")))),
+        (nm "wrapper_h", tylam "b" (lambdaTyped "outer" T.int32 (lambda "z" (apply (apply (var "wrapper_g") (var "outer")) (var "z")))),
+          polyType ["b"] (T.function T.int32 (T.function (T.var "b") (T.var "b"))))]
+        (apply (var "wrapper") (int32 10))),
+
+    hoistPolyCase "sibling polymorphic bindings inside lambda: h passes its own args to g"
+      -- Input: let wrapper = \outer -> let g : forall a. a -> a = \v -> \t -> add outer (add v t);
+      --                                    h : forall b. b -> b = \v -> \t -> g v t
+      --                                in h 1 2
+      --        in wrapper 10
+      -- Here h calls g with its own args v and t. After hoisting:
+      -- g becomes \outer -> \v -> \t -> add outer (add v t)
+      -- h becomes \outer -> \v -> \t -> ((g outer) v) t
+      -- The reference to g in h should NOT duplicate outer, v, or t
+      (mkLet [(nm "wrapper",
+        lambdaTyped "outer" T.int32 (Core.termLet $ mkLet [
+          (nm "g", lambda "v" (lambda "t" (apply (apply (primitive _math_add) (var "outer"))
+            (apply (apply (primitive _math_add) (var "v")) (var "t")))),
+            polyType ["a"] (T.function (T.var "a") (T.function (T.var "a") (T.var "a")))),
+          (nm "h", lambda "v" (lambda "t" (apply (apply (var "g") (var "v")) (var "t"))),
+            polyType ["b"] (T.function (T.var "b") (T.function (T.var "b") (T.var "b"))))]
+          (apply (apply (var "h") (int32 1)) (int32 2))),
+        monoType (T.function T.int32 T.int32))]
+        (apply (var "wrapper") (int32 10)))
+      -- Output: wrapper first (original), then wrapper_g and wrapper_h hoisted (both capture outer)
+      -- wrapper_g: \outer -> \v -> \t -> add outer (add v t)
+      -- wrapper_h: \outer -> \v -> \t -> ((wrapper_g outer) v) t
+      (mkLet [
+        (nm "wrapper",
+          lambdaTyped "outer" T.int32 (apply (apply (apply (var "wrapper_h") (var "outer")) (int32 1)) (int32 2)),
+          monoType (T.function T.int32 T.int32)),
+        (nm "wrapper_g", tylam "a" (lambdaTyped "outer" T.int32
+          (lambda "v" (lambda "t" (apply (apply (primitive _math_add) (var "outer"))
+            (apply (apply (primitive _math_add) (var "v")) (var "t")))))),
+          polyType ["a"] (T.function T.int32 (T.function (T.var "a") (T.function (T.var "a") (T.var "a"))))),
+        (nm "wrapper_h", tylam "b" (lambdaTyped "outer" T.int32
+          (lambda "v" (lambda "t" (apply (apply (apply (var "wrapper_g") (var "outer")) (var "v")) (var "t"))))),
+          polyType ["b"] (T.function T.int32 (T.function (T.var "b") (T.function (T.var "b") (T.var "b")))))]
+        (apply (var "wrapper") (int32 10))),
+
+    -- ============================================================
+    -- Test: Untyped bindings are treated as monomorphic
+    -- ============================================================
+
+    hoistPolyCase "untyped binding: not hoisted"
+      -- Input: let x = 1 in (let y = 2 in x + y)
+      -- Neither binding has a type, so neither is polymorphic
+      (mkLetUntyped [(nm "x", int32 1)]
+        (Core.termLet $ mkLetUntyped [(nm "y", int32 2)]
+          (apply (apply (primitive _math_add) (var "x")) (var "y"))))
+      -- Output: unchanged (untyped bindings are not polymorphic)
+      (mkLetUntyped [(nm "x", int32 1)]
+        (Core.termLet $ mkLetUntyped [(nm "y", int32 2)]
+          (apply (apply (primitive _math_add) (var "x")) (var "y")))),
+
+    -- ============================================================
+    -- Test: Name collision - nested binding has same name as top-level (after unshadowing)
+    -- Note: This test uses distinct names as unshadowVariables would produce.
+    -- The hoisting code assumes no shadowing. If there were shadowing,
+    -- two bindings named 'id' would collide at top level.
+    -- ============================================================
+
+    hoistPolyCase "no name collision: distinct names after unshadowing"
+      -- Input: let id = \x -> x; f = \a -> (let id2 : forall b. b -> b = \y -> y in id2 (id a)) in f 42
+      -- Here 'id' is monomorphic at top level, 'id2' is polymorphic nested
+      -- They have distinct names (as unshadowVariables would ensure)
+      (mkLet [
+        (nm "id", lambda "x" (var "x"), monoType (T.function T.int32 T.int32)),
+        (nm "f",
+          lambda "a" (Core.termLet $ mkLet [
+            (nm "id2", lambda "y" (var "y"), polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+            (apply (var "id2") (apply (var "id") (var "a")))),
+          monoType (T.function T.int32 T.int32))]
+        (apply (var "f") (int32 42)))
+      -- Output: id and f first (original), then f_id2 hoisted
+      (mkLet [
+        (nm "id", lambda "x" (var "x"), monoType (T.function T.int32 T.int32)),
+        (nm "f",
+          lambda "a" (apply (var "f_id2") (apply (var "id") (var "a"))),
+          monoType (T.function T.int32 T.int32)),
+        (nm "f_id2", tylam "b" (lambda "y" (var "y")), polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+        (apply (var "f") (int32 42))),
+
+    -- ============================================================
+    -- Test: Nested polymorphic binding calls enclosing polymorphic binding
+    -- When a polymorphic binding h at a nested level calls a polymorphic
+    -- binding g from an enclosing (but not top) level, g should NOT be
+    -- passed as a term argument to h. Instead, h's body should reference
+    -- the hoisted g (wrapper_g) directly, since polymorphic let-bound
+    -- variables are excluded from capture.
+    -- ============================================================
+
+    hoistPolyCase "nested polymorphic binding calls enclosing polymorphic binding"
+      -- Input: let wrapper = \outer:Int32 ->
+      --          let g : forall a. a -> a = \y -> y
+      --          in \inner:Int32 ->
+      --            let h : forall b. b -> b = \z -> g z
+      --            in h 42
+      --        in wrapper 10 20
+      -- Here g is polymorphic at an outer let level, and h is polymorphic
+      -- at an inner let level. h calls g. When both are hoisted:
+      -- - g becomes wrapper_g (no captures needed)
+      -- - h becomes wrapper_h, and should reference wrapper_g directly
+      --   (NOT receive g as a term parameter)
+      (mkLet [(nm "wrapper",
+        lambdaTyped "outer" T.int32 (Core.termLet $ mkLet [
+          -- g : forall a. a -> a (at outer let level)
+          (nm "g",
+            lambda "y" (var "y"),
+            polyType ["a"] (T.function (T.var "a") (T.var "a")))]
+          -- inner lambda
+          (lambdaTyped "inner" T.int32 (Core.termLet $ mkLet [
+            -- h : forall b. b -> b (at inner let level, calls g)
+            (nm "h",
+              lambda "z" (apply (var "g") (var "z")),
+              polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+            (apply (var "h") (int32 42))))),
+        monoType (T.function T.int32 (T.function T.int32 T.int32)))]
+        (apply (apply (var "wrapper") (int32 10)) (int32 20)))
+      -- Output: wrapper simplified, wrapper_g and wrapper_h hoisted.
+      -- CRITICAL: wrapper_h references wrapper_g directly, NOT through a parameter.
+      -- Neither g nor any enclosing lambda variables are captured by h,
+      -- because g is polymorphic (excluded from capture) and h doesn't use outer/inner.
+      (mkLet [
+        (nm "wrapper",
+          lambdaTyped "outer" T.int32
+            (lambdaTyped "inner" T.int32
+              (apply (var "wrapper_h") (int32 42))),
+          monoType (T.function T.int32 (T.function T.int32 T.int32))),
+        -- wrapper_g: hoisted, no captures
+        (nm "wrapper_g",
+          tylam "a" (lambda "y" (var "y")),
+          polyType ["a"] (T.function (T.var "a") (T.var "a"))),
+        -- wrapper_h: hoisted, references wrapper_g directly (no g parameter)
+        (nm "wrapper_h",
+          tylam "b" (lambda "z" (apply (var "wrapper_g") (var "z"))),
+          polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+        (apply (apply (var "wrapper") (int32 10)) (int32 20))),
+
+    -- ============================================================
+    -- Test: Polymorphic binding captures monomorphic sibling in same let
+    -- This test case demonstrates the bug in joinTypes where:
+    -- - sleft/sright are monomorphic bindings (NOT hoisted)
+    -- - cannotUnify is polymorphic (HOISTED) and references sleft/sright
+    -- When cannotUnify is hoisted, it must capture sleft/sright as parameters
+    -- because they are defined in the same let and won't be hoisted with it.
+    -- ============================================================
+
+    hoistPolyCase "polymorphic binding captures monomorphic sibling in same let"
+      -- This mirrors the joinTypes structure:
+      -- let wrapper = \left -> \right ->
+      --   let sleft : Int32 = f left;           -- monomorphic, NOT hoisted
+      --       sright : Int32 = f right;         -- monomorphic, NOT hoisted
+      --       cannotUnify : forall a. a -> a = \x -> add sleft (add sright x)  -- polymorphic, refs sleft/sright
+      --   in cannotUnify 42
+      -- in wrapper 1 2
+      --
+      -- When cannotUnify is hoisted, it must capture sleft and sright since they are
+      -- defined in the same let and won't be hoisted with it.
+      (mkLet [(nm "wrapper",
+        lambdaTyped "left" T.int32
+          (lambdaTyped "right" T.int32
+            (Core.termLet $ mkLet [
+              (nm "sleft", apply (var "f") (var "left"), monoType T.int32),
+              (nm "sright", apply (var "f") (var "right"), monoType T.int32),
+              (nm "cannotUnify",
+                lambda "x" (apply (apply (primitive _math_add) (var "sleft"))
+                  (apply (apply (primitive _math_add) (var "sright")) (var "x"))),
+                polyType ["a"] (T.function (T.var "a") (T.var "a")))]
+              (apply (var "cannotUnify") (int32 42)))),
+        monoType (T.function T.int32 (T.function T.int32 T.int32)))]
+        (apply (apply (var "wrapper") (int32 1)) (int32 2)))
+      -- Expected output:
+      -- wrapper is simplified, wrapper_cannotUnify is hoisted with sleft and sright captured
+      -- wrapper_cannotUnify: forall a. \sleft:Int32 -> \sright:Int32 -> \x -> add sleft (add sright x)
+      -- Reference becomes: ((wrapper_cannotUnify sleft) sright) 42
+      (mkLet [
+        (nm "wrapper",
+          lambdaTyped "left" T.int32
+            (lambdaTyped "right" T.int32
+              (Core.termLet $ mkLet [
+                (nm "sleft", apply (var "f") (var "left"), monoType T.int32),
+                (nm "sright", apply (var "f") (var "right"), monoType T.int32)]
+                (apply (apply (apply (var "wrapper_cannotUnify") (var "sleft")) (var "sright")) (int32 42)))),
+          monoType (T.function T.int32 (T.function T.int32 T.int32))),
+        (nm "wrapper_cannotUnify",
+          tylam "a"
+            (lambdaTyped "sleft" T.int32
+              (lambdaTyped "sright" T.int32
+                (lambda "x" (apply (apply (primitive _math_add) (var "sleft"))
+                  (apply (apply (primitive _math_add) (var "sright")) (var "x")))))),
+          polyType ["a"] (T.function T.int32 (T.function T.int32 (T.function (T.var "a") (T.var "a")))))]
+        (apply (apply (var "wrapper") (int32 1)) (int32 2))),
+
+    -- This test uses NESTED lets (as the DSL generates with <~) rather than a single flat let.
+    -- The bug: when poly bindings in different nested lets reference each other,
+    -- transitive captured variables are not propagated correctly.
+    --
+    -- Structure (nested lets, like DSL generates):
+    --   wrapper = \left ->
+    --     let sleft = left                              -- mono (outermost nested let)
+    --     in let cannotUnify = fail sleft              -- poly, refs sleft (middle nested let)
+    --        in let joinList = cannotUnify 1           -- poly, refs cannotUnify (innermost nested let)
+    --           in joinList
+    --
+    -- When joinList is hoisted, it captures cannotUnify (from outer let).
+    -- When cannotUnify is hoisted, it captures sleft and its replacement becomes: wrapper_cannotUnify sleft
+    -- The replacement for cannotUnify gets substituted into joinList's body.
+    -- Bug: joinList ends up with free variable sleft because it wasn't captured transitively.
+    hoistPolyCase "nested lets: poly binding references poly sibling from outer let"
+      (mkLet [(nm "wrapper",
+        lambdaTyped "left" T.int32
+          -- Outer nested let: sleft (mono)
+          (Core.termLet $ mkLet [
+            (nm "sleft", var "left", monoType T.int32)]
+            -- Middle nested let: cannotUnify (poly, refs sleft)
+            (Core.termLet $ mkLet [
+              (nm "cannotUnify",
+                lambda "x" (apply (apply (primitive _math_add) (var "sleft")) (var "x")),
+                polyType ["a"] (T.function (T.var "a") (T.var "a")))]
+              -- Inner nested let: joinList (poly, refs cannotUnify)
+              (Core.termLet $ mkLet [
+                (nm "joinList",
+                  lambda "y" (apply (var "cannotUnify") (var "y")),
+                  polyType ["b"] (T.function (T.var "b") (T.var "b")))]
+                (apply (var "joinList") (int32 42))))),
+        monoType (T.function T.int32 T.int32))]
+        (apply (var "wrapper") (int32 1)))
+      -- Expected: both cannotUnify and joinList are hoisted.
+      -- wrapper_cannotUnify captures sleft.
+      -- wrapper_joinList must ALSO capture sleft (transitively through cannotUnify).
+      -- The reference to cannotUnify in joinList becomes wrapper_cannotUnify sleft,
+      -- so joinList needs sleft in scope.
+      (mkLet [
+        (nm "wrapper",
+          lambdaTyped "left" T.int32
+            (Core.termLet $ mkLet [
+              (nm "sleft", var "left", monoType T.int32)]
+              (apply (apply (var "wrapper_joinList") (var "sleft")) (int32 42))),
+          monoType (T.function T.int32 T.int32)),
+        (nm "wrapper_cannotUnify",
+          tylam "a"
+            (lambdaTyped "sleft" T.int32
+              (lambda "x" (apply (apply (primitive _math_add) (var "sleft")) (var "x")))),
+          polyType ["a"] (T.function T.int32 (T.function (T.var "a") (T.var "a")))),
+        (nm "wrapper_joinList",
+          tylam "b"
+            (lambdaTyped "sleft" T.int32
+              (lambda "y" (apply (apply (var "wrapper_cannotUnify") (var "sleft")) (var "y")))),
+          polyType ["b"] (T.function T.int32 (T.function (T.var "b") (T.var "b"))))]
+        (apply (var "wrapper") (int32 1))),
+
+    -- ============================================================
+    -- Regression test: polymorphic binding with pair term must preserve
+    -- type application wrappers after hoisting. This reproduces the
+    -- "pair type requires 2 type arguments, got 0" error in Java code
+    -- generation. The binding `init` (like in hoistLetBindingsWithPredicate)
+    -- contains a pair of empty list and a set. After inference, the pair
+    -- has TypeApplication wrappers. These wrappers must survive hoisting.
+    -- ============================================================
+
+    hoistPolyCase "polymorphic binding with pair: type applications preserved"
+      -- Input: let f = \b:Name ->
+      --          let init : forall t0. Pair<List<t0>, Set<Name>>
+      --                   = Λt0. @(Set<Name>) @(List<t0>) pair((@t0 []), singleton(b))
+      --          in init
+      --        in f (name "x")
+      -- The init binding is polymorphic (has type var t0 from empty list).
+      -- After hoisting, the pair must KEEP its TypeApplication wrappers.
+      (mkLet [(nm "f",
+        lambdaTyped "b" (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string) (Core.termLet $ mkLet [
+          (nm "init",
+            -- Term with type lambda and type applications (as inference would produce):
+            -- Λt0. TypeApp(TypeApp(Pair(TypeApp([], t0), singleton(b)), List<t0>), Set<Name>)
+            tylam "t0" (tyapp (tyapp
+              (pair
+                (tyapp (list ([] :: [TTerm Term])) (T.var "t0"))
+                (apply (var "singleton") (var "b")))
+              (T.list (T.var "t0")))
+              (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string))),
+            polyType ["t0"] (T.pair (T.list (T.var "t0")) (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string))))]
+          (var "init")),
+        monoType (T.function (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
+          (T.pair (T.list (T.var "t0")) (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)))))]
+        (apply (var "f") (var "name_x")))
+      -- Expected output: f first (original), then f_init hoisted.
+      -- The hoisted binding must retain TypeApplication wrappers on the pair.
+      -- Λt0 is stripped and re-added by hoisting, but inner type apps on pair are preserved.
+      (mkLet [
+        (nm "f",
+          lambdaTyped "b" (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
+            (apply (var "f_init") (var "b")),
+          monoType (T.function (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
+            (T.pair (T.list (T.var "t0")) (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string))))),
+        (nm "f_init",
+          -- After hoisting: captures b, re-adds type lambda for t0
+          -- The inner type applications on the pair MUST be preserved
+          tylam "t0" (lambdaTyped "b" (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
+            (tyapp (tyapp
+              (pair
+                (tyapp (list ([] :: [TTerm Term])) (T.var "t0"))
+                (apply (var "singleton") (var "b")))
+              (T.list (T.var "t0")))
+              (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)))),
+          polyType ["t0"] (T.function (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)
+            (T.pair (T.list (T.var "t0")) (T.set (T.wrap (Core.name (Phantoms.string "hydra.core.Name")) T.string)))))]
+        (apply (var "f") (var "name_x"))),
+
+    -- ============================================================
+    -- Regression test: monomorphic binding referencing outer type variables
+    -- must get type applications at the call site after hoisting.
+    -- This reproduces the Java "T70848" bug: without type apps on the
+    -- hoisted reference, the Java coder falls back to tryTypeOf which
+    -- generates fresh inference variables instead of using the correct
+    -- type parameters from the enclosing scope.
+    -- ============================================================
+
+    hoistPolyCase "monomorphic binding captures type vars: replacement includes type applications"
+      -- Input: let f = TypeLambda a (TypeLambda b (
+      --          \(x:a) -> let q : TypeScheme([], a -> b) = \(y:a) -> g y
+      --                    in q x))
+      --        in f
+      -- Here 'q' is monomorphic but references outer type vars 'a' and 'b'.
+      -- When hoisted, q becomes polymorphic in [a, b].
+      -- The replacement must include TypeApp(b, TypeApp(a, Var(f_q))) to instantiate
+      -- the hoisted binding with the correct type variables.
+      (mkLet [(nm "f",
+        tylam "a" (tylam "b" (
+          lambdaTyped "x" (T.var "a") (Core.termLet $ mkLet [
+            (nm "q",
+              lambdaTyped "y" (T.var "a") (apply (var "g") (var "y")),
+              monoType (T.function (T.var "a") (T.var "b")))]
+            (apply (var "q") (var "x"))))),
+        polyType ["a", "b"] (T.function (T.var "a") (T.var "b")))]
+        (var "f"))
+      -- Expected output: f first, then f_q hoisted with type lambdas for [a, b].
+      -- q does not reference x, so no lambda capture is needed.
+      -- The replacement for q SHOULD be TypeApp(b, TypeApp(a, Var(f_q)))
+      -- so that downstream code knows the type variable instantiation.
+      -- Using Core.termTypeApplication directly to avoid meta-encoding issues with tyapp.
+      (mkLet [
+        (nm "f",
+          tylam "a" (tylam "b" (
+            lambdaTyped "x" (T.var "a")
+              (apply
+                (Core.termTypeApplication $ Core.typeApplicationTerm
+                  (Core.termTypeApplication $ Core.typeApplicationTerm (var "f_q") (T.var "a"))
+                  (T.var "b"))
+                (var "x")))),
+          polyType ["a", "b"] (T.function (T.var "a") (T.var "b"))),
+        (nm "f_q",
+          tylam "a" (tylam "b" (
+            lambdaTyped "y" (T.var "a") (apply (var "g") (var "y")))),
+          polyType ["a", "b"] (T.function (T.var "a") (T.var "b")))]
+        (var "f"))]
+
+-- | Test cases for hoistLetBindings with hoistAll=True
+-- This function hoists ALL let bindings (not just polymorphic ones) to the top level.
+-- This is used for Java which cannot have let expressions in arbitrary positions.
+-- Key behavior: type lambdas are boundaries - we don't hoist bindings OUT of type lambdas
+-- because doing so could move code that references type variables outside their scope.
+hoistLetBindingsGroup :: TTerm TestGroup
+hoistLetBindingsGroup = subgroup "hoistLetBindings" [
+    -- ============================================================
+    -- Test: Basic nested let hoisting (no type lambdas)
+    -- ============================================================
+
+    hoistAllCase "nested let inside lambda: binding hoisted with lambda capture"
+      -- Input: let f = \a -> (let g = a + 1 in g * 2) in f 10
+      (mkLetUntyped [(nm "f",
+        lambda "a" (Core.termLet $ mkLetUntyped [(nm "g", apply (apply (primitive _math_add) (var "a")) (int32 1))]
+          (apply (apply (primitive _math_mul) (var "g")) (int32 2))))]
+        (apply (var "f") (int32 10)))
+      -- Output: f comes first (original binding), then f_g is hoisted with lambda to capture 'a', reference becomes (f_g a)
+      (mkLetUntyped [
+        (nm "f",
+          lambda "a" (apply (apply (primitive _math_mul) (apply (var "f_g") (var "a"))) (int32 2))),
+        (nm "f_g", lambda "a" (apply (apply (primitive _math_add) (var "a")) (int32 1)))]
+        (apply (var "f") (int32 10))),
+
+    -- ============================================================
+    -- Test: Type applications are processed normally (they don't introduce type variables)
+    -- But the inner lambda still has nested let that gets hoisted
+    -- ============================================================
+
+    hoistAllCase "type application: nested let outside lambda CAN be hoisted"
+      -- Input: let f = (let y = 1 in \x -> x + y) @Int32 in f 10
+      -- The let is OUTSIDE the lambda, so y can be hoisted without capture
+      (mkLetUntyped [(nm "f",
+        tyapp (Core.termLet $ mkLetUntyped [(nm "y", int32 1)]
+          (lambda "x" (apply (apply (primitive _math_add) (var "x")) (var "y")))) T.int32)]
+        (apply (var "f") (int32 10)))
+      -- Output: f comes first (original binding), then f_y is hoisted
+      (mkLetUntyped [
+        (nm "f",
+          tyapp (lambda "x" (apply (apply (primitive _math_add) (var "x")) (var "f_y"))) T.int32),
+        (nm "f_y", int32 1)]
+        (apply (var "f") (int32 10)))]
+
+-- | Test cases for type parameter extraction when hoisting polymorphic let bindings
+-- This group specifically tests scenarios where Java code generation fails because
+-- type parameters (t0, t1, t2, etc.) are used in generated code but not declared
+-- in method signatures. The root cause is that javaTypeParametersForType doesn't
+-- properly collect all free type variables from nested generic types.
+--
+-- These tests illustrate the EXPECTED behavior after the issue is fixed.
+-- Currently, the Java coder fails to generate compilable code for these cases.
+hoistPolymorphicTypeParametersGroup :: TTerm TestGroup
+hoistPolymorphicTypeParametersGroup = subgroup "hoistPolymorphicTypeParameters" [
+    -- ============================================================
+    -- Test: Nested polymorphic bindings with multiple type variables
+    -- This is the core issue: when a polymorphic binding like `choose`
+    -- uses type variables (t0, t1, t2) in nested function types,
+    -- those variables must be declared in the hoisted method signature.
+    -- ============================================================
+
+    hoistPolyCase "nested function types: all type variables must be declared"
+      -- Input: let f = (let choose : forall t0 t1 t2. (t0 -> t1) -> (t2 -> t1) -> t0 -> t1 = ... in choose) in f
+      -- This simulates the `mutateTrace` scenario where `choose` is a polymorphic
+      -- local binding with multiple type parameters in nested function types.
+      -- (Simplified to avoid using "Either" as a type variable name)
+      (mkLet [(nm "f",
+        Core.termLet $ mkLet [(nm "choose",
+          lambda "forLeft" (lambda "forRight" (lambda "e"
+            (apply (var "forLeft") (var "e")))),
+          -- Type: forall t0 t1 t2. (t0 -> t1) -> (t2 -> t1) -> t0 -> t1
+          polyType ["t0", "t1", "t2"]
+            (T.function
+              (T.function (T.var "t0") (T.var "t1"))
+              (T.function
+                (T.function (T.var "t2") (T.var "t1"))
+                (T.function (T.var "t0") (T.var "t1")))))]
+          (var "choose"),
+        monoType (T.function
+          (T.function T.string T.int32)
+          (T.function
+            (T.function T.boolean T.int32)
+            (T.function T.string T.int32))))]
+        (var "f"))
+      -- Output: f first (original), then f_choose hoisted with ALL type parameters preserved
+      -- When generating Java, the method signature must declare t0, t1, t2
+      (mkLet [
+        (nm "f",
+          var "f_choose",
+          monoType (T.function
+            (T.function T.string T.int32)
+            (T.function
+              (T.function T.boolean T.int32)
+              (T.function T.string T.int32)))),
+        (nm "f_choose",
+          tylam "t0" (tylam "t1" (tylam "t2" (lambda "forLeft" (lambda "forRight" (lambda "e"
+            (apply (var "forLeft") (var "e"))))))),
+          polyType ["t0", "t1", "t2"]
+            (T.function
+              (T.function (T.var "t0") (T.var "t1"))
+              (T.function
+                (T.function (T.var "t2") (T.var "t1"))
+                (T.function (T.var "t0") (T.var "t1")))))]
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Type variable in return position only
+    -- Type variables appearing only in the return type of a nested
+    -- function must still be declared.
+    -- ============================================================
+
+    hoistPolyCase "type variable in return position only"
+      -- Input: let f = (let returnT : forall t. () -> t = ... in returnT) in f
+      (mkLet [(nm "f",
+        Core.termLet $ mkLet [(nm "returnT",
+          lambda "unit" (var "undefined"),
+          polyType ["t"] (T.function T.unit (T.var "t")))]
+          (var "returnT"),
+        monoType (T.function T.unit T.int32))]
+        (var "f"))
+      -- Output: f first (original), then f_returnT hoisted with t declared
+      (mkLet [
+        (nm "f",
+          var "f_returnT",
+          monoType (T.function T.unit T.int32)),
+        (nm "f_returnT",
+          tylam "t" (lambda "unit" (var "undefined")),
+          polyType ["t"] (T.function T.unit (T.var "t")))]
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Type variables in deeply nested generic types
+    -- The Java coder uses freeVariablesInType but may not recurse
+    -- into all nested type structures.
+    -- ============================================================
+
+    hoistPolyCase "type variables in deeply nested generics"
+      -- Input: let f = (let nested : forall t0 t1 t2. ((t0, t1), t2) -> t0 = ... in nested) in f
+      -- Type variables t0, t1, t2 are in nested pair types
+      -- (Simplified from original which used List<Map<...>> - those are treated as type vars in tests)
+      (mkLet [(nm "f",
+        Core.termLet $ mkLet [(nm "nested",
+          lambda "x" (var "undefined"),
+          -- Type: forall t0 t1 t2. ((t0, t1), t2) -> t0
+          polyType ["t0", "t1", "t2"]
+            (T.function
+              (T.pair (T.pair (T.var "t0") (T.var "t1")) (T.var "t2"))
+              (T.var "t0")))]
+          (var "nested"),
+        monoType (T.function
+          (T.pair (T.pair T.string T.int32) T.boolean)
+          T.string))]
+        (var "f"))
+      -- Output: f first (original), then f_nested hoisted with all type parameters t0, t1, t2 declared
+      (mkLet [
+        (nm "f",
+          var "f_nested",
+          monoType (T.function
+            (T.pair (T.pair T.string T.int32) T.boolean)
+            T.string)),
+        (nm "f_nested",
+          tylam "t0" (tylam "t1" (tylam "t2" (lambda "x" (var "undefined")))),
+          polyType ["t0", "t1", "t2"]
+            (T.function
+              (T.pair (T.pair (T.var "t0") (T.var "t1")) (T.var "t2"))
+              (T.var "t0")))]
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Multiple polymorphic bindings that share type variable names
+    -- Each binding should independently track its own type variables.
+    -- ============================================================
+
+    hoistPolyCase "multiple bindings with overlapping type variable names"
+      -- Input: let outer = (let id1 : forall t. t -> t = \x -> x; id2 : forall t. t -> t = \y -> y in pair id1 id2) in outer
+      -- Both id1 and id2 use "t" but they are independent
+      (mkLet [(nm "outer",
+        Core.termLet $ mkLet [
+          (nm "id1", lambda "x" (var "x"), polyType ["t"] (T.function (T.var "t") (T.var "t"))),
+          (nm "id2", lambda "y" (var "y"), polyType ["t"] (T.function (T.var "t") (T.var "t")))]
+          (apply (apply (var "pair") (var "id1")) (var "id2")),
+        monoType (T.pair
+          (T.function T.int32 T.int32)
+          (T.function T.string T.string)))]
+        (var "outer"))
+      -- Output: outer first (original), then outer_id1 and outer_id2 hoisted (each with their own t parameter)
+      (mkLet [
+        (nm "outer",
+          apply (apply (var "pair") (var "outer_id1")) (var "outer_id2"),
+          monoType (T.pair
+            (T.function T.int32 T.int32)
+            (T.function T.string T.string))),
+        (nm "outer_id1", tylam "t" (lambda "x" (var "x")), polyType ["t"] (T.function (T.var "t") (T.var "t"))),
+        (nm "outer_id2", tylam "t" (lambda "y" (var "y")), polyType ["t"] (T.function (T.var "t") (T.var "t")))]
+        (var "outer")),
+
+    -- ============================================================
+    -- Test: Polymorphic binding with captured term variable AND type parameters
+    -- This is the combination case: the binding both captures a lambda-bound
+    -- term variable AND has type parameters that need to be declared.
+    -- ============================================================
+
+    hoistPolyCase "captured variable with type parameters"
+      -- Input: let f = \(a:String) -> (let g : forall t. t -> Pair<String, t> = \x -> pair a x in g 42) in f "hello"
+      -- Here 'g' captures 'a' AND has type parameter t
+      -- When hoisted: g must be wrapped in lambda for 'a', AND method must declare t
+      (mkLet [(nm "f",
+        lambdaTyped "a" T.string (Core.termLet $ mkLet [
+          (nm "g",
+            lambda "x" (apply (apply (var "pair") (var "a")) (var "x")),
+            polyType ["t"] (T.function (T.var "t") (T.pair T.string (T.var "t"))))]
+          (apply (var "g") (int32 42))),
+        monoType (T.function T.string (T.pair T.string T.int32)))]
+        (apply (var "f") (string "hello")))
+      -- Output: f first (original), then f_g hoisted with lambda wrapper for 'a', and t must be declared
+      -- Java signature: <t> Function<String, Function<t, Pair<String, t>>> f_g = a -> x -> pair(a, x);
+      (mkLet [
+        (nm "f",
+          lambdaTyped "a" T.string (apply (apply (var "f_g") (var "a")) (int32 42)),
+          monoType (T.function T.string (T.pair T.string T.int32))),
+        (nm "f_g",
+          tylam "t" (lambdaTyped "a" T.string (lambda "x" (apply (apply (var "pair") (var "a")) (var "x")))),
+          polyType ["t"] (T.function T.string (T.function (T.var "t") (T.pair T.string (T.var "t")))))]
+        (apply (var "f") (string "hello"))),
+
+    -- ============================================================
+    -- Test: Short type variable names (the isLambdaBoundVariable heuristic)
+    -- The Java coder's isLambdaBoundVariable uses name length <= 4 to identify
+    -- type variables. These tests ensure that this heuristic correctly
+    -- identifies variables that should become Java type parameters.
+    -- ============================================================
+
+    hoistPolyCase "short type variable names are treated as type parameters"
+      -- Input: let f = (let g : forall s t v. s -> t -> v = ... in g) in f
+      -- s, t, v have length <= 4, so they should be recognized as type parameters
+      (mkLet [(nm "f",
+        Core.termLet $ mkLet [(nm "g",
+          lambda "s" (lambda "t" (var "undefined")),
+          polyType ["s", "t", "v"]
+            (T.function (T.var "s")
+              (T.function (T.var "t") (T.var "v"))))]
+          (var "g"),
+        monoType (T.function T.int32 (T.function T.string T.boolean)))]
+        (var "f"))
+      -- Output: f first (original), then f_g hoisted with s, t, v declared as type parameters
+      (mkLet [
+        (nm "f",
+          var "f_g",
+          monoType (T.function T.int32 (T.function T.string T.boolean))),
+        (nm "f_g",
+          tylam "s" (tylam "t" (tylam "v" (lambda "s" (lambda "t" (var "undefined"))))),
+          polyType ["s", "t", "v"]
+            (T.function (T.var "s")
+              (T.function (T.var "t") (T.var "v"))))]
+        (var "f")),
+
+    hoistPolyCase "numbered type variables like t0 t1 t2"
+      -- Input: let f = (let g : forall t0 t1 t2. t0 -> t1 -> t2 = ... in g) in f
+      -- t0, t1, t2 have length <= 4, common pattern in generated code
+      (mkLet [(nm "f",
+        Core.termLet $ mkLet [(nm "g",
+          lambda "x" (lambda "y" (var "undefined")),
+          polyType ["t0", "t1", "t2"]
+            (T.function (T.var "t0")
+              (T.function (T.var "t1") (T.var "t2"))))]
+          (var "g"),
+        monoType (T.function T.int32 (T.function T.string T.boolean)))]
+        (var "f"))
+      -- Output: f first (original), then f_g hoisted with t0, t1, t2 declared
+      (mkLet [
+        (nm "f",
+          var "f_g",
+          monoType (T.function T.int32 (T.function T.string T.boolean))),
+        (nm "f_g",
+          tylam "t0" (tylam "t1" (tylam "t2" (lambda "x" (lambda "y" (var "undefined"))))),
+          polyType ["t0", "t1", "t2"]
+            (T.function (T.var "t0")
+              (T.function (T.var "t1") (T.var "t2"))))]
+        (var "f")),
+
+    -- ============================================================
+    -- Test: Complex "choose" pattern from mutateTrace
+    -- This directly models the failing code in Monads.java
+    -- NOTE: This test uses T.var "Either" which causes "Either" to be
+    -- treated as a free type variable. In real code, Either would be a defined
+    -- type constructor and wouldn't be captured as a free variable. This test
+    -- has been simplified to avoid this issue by using only type variables.
+    -- ============================================================
+
+    hoistPolyCase "choose pattern from mutateTrace"
+      -- Input simulates: let mutateTrace = ... in
+      --   choose <~ (forLeft ~> forRight ~> e ~> either forLeft forRight e) $
+      --   ... rest of mutateTrace ...
+      -- The `choose` binding has type:
+      --   forall t0 t1 t2. (t0 -> t1) -> (t2 -> t1) -> t0 -> t1
+      -- (Simplified to avoid using "Either" as a type variable name)
+      (mkLet [(nm "mutateTrace",
+        lambda "mutate" (lambda "restore" (lambda "f"
+          (Core.termLet $ mkLet [(nm "choose",
+            -- choose = \forLeft -> \forRight -> \e -> forLeft e
+            lambda "forLeft" (lambda "forRight" (lambda "e"
+              (apply (var "forLeft") (var "e")))),
+            -- Type: forall t0 t1 t2. (t0 -> t1) -> (t2 -> t1) -> t0 -> t1
+            polyType ["t0", "t1", "t2"]
+              (T.function
+                (T.function (T.var "t0") (T.var "t1"))
+                (T.function
+                  (T.function (T.var "t2") (T.var "t1"))
+                  (T.function (T.var "t0") (T.var "t1")))))]
+            -- Body uses choose
+            (apply (apply (apply (var "choose") (var "forLeft")) (var "forRight")) (var "e"))))),
+        -- Full type of mutateTrace (using concrete types)
+        monoType (T.function T.int32
+          (T.function T.int32
+            (T.function T.int32 T.int32))))]
+        (var "mutateTrace"))
+      -- Output: mutateTrace first (original), then mutateTrace_choose hoisted, MUST have t0, t1, t2 declared
+      (mkLet [
+        (nm "mutateTrace",
+          lambda "mutate" (lambda "restore" (lambda "f"
+            (apply (apply (apply (var "mutateTrace_choose") (var "forLeft")) (var "forRight")) (var "e")))),
+          monoType (T.function T.int32
+            (T.function T.int32
+              (T.function T.int32 T.int32)))),
+        (nm "mutateTrace_choose",
+          tylam "t0" (tylam "t1" (tylam "t2" (lambda "forLeft" (lambda "forRight" (lambda "e"
+            (apply (var "forLeft") (var "e"))))))),
+          polyType ["t0", "t1", "t2"]
+            (T.function
+              (T.function (T.var "t0") (T.var "t1"))
+              (T.function
+                (T.function (T.var "t2") (T.var "t1"))
+                (T.function (T.var "t0") (T.var "t1")))))]
+        (var "mutateTrace"))]
diff --git a/src/main/haskell/Hydra/Sources/Test/Inference/AlgebraicTypes.hs b/src/main/haskell/Hydra/Sources/Test/Inference/AlgebraicTypes.hs
--- a/src/main/haskell/Hydra/Sources/Test/Inference/AlgebraicTypes.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Inference/AlgebraicTypes.hs
@@ -25,15 +25,15 @@
     (Just "Inference tests for algebraic data types")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding testGroupForCollectionPrimitives,
-      Phantoms.toBinding testGroupForEithers,
-      Phantoms.toBinding testGroupForFolds,
-      Phantoms.toBinding testGroupForLists,
-      Phantoms.toBinding testGroupForMaps,
-      Phantoms.toBinding testGroupForOptionals,
-      Phantoms.toBinding testGroupForPairs,
-      Phantoms.toBinding testGroupForSets]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition testGroupForCollectionPrimitives,
+      Phantoms.toTermDefinition testGroupForEithers,
+      Phantoms.toTermDefinition testGroupForFolds,
+      Phantoms.toTermDefinition testGroupForLists,
+      Phantoms.toTermDefinition testGroupForMaps,
+      Phantoms.toTermDefinition testGroupForOptionals,
+      Phantoms.toTermDefinition testGroupForPairs,
+      Phantoms.toTermDefinition testGroupForSets]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -58,17 +58,17 @@
     -- Applying maps.map to a concrete function
     subgroup "maps.map applied to a function" [
       -- maps.map (partially applied): maps.map negate => map<k, int32> -> map<k, int32>
-      expectPoly 1 [tag_disabledForMinimalInference]
+      expectPolyConstrained 1 [tag_disabledForMinimalInference]
         (primitive _maps_map @@ primitive _math_negate)
-        ["t0"] (T.function (T.map (T.var "t0") T.int32) (T.map (T.var "t0") T.int32)),
+        ["t0"] [("t0", ["ordering"])] (T.function (T.map (T.var "t0") T.int32) (T.map (T.var "t0") T.int32)),
       -- maps.map with a lambda
-      expectPoly 2 [tag_disabledForMinimalInference]
+      expectPolyConstrained 2 [tag_disabledForMinimalInference]
         (primitive _maps_map @@ lambda "x" (list [var "x"]))
-        ["t0", "t1"] (T.function (T.map (T.var "t0") (T.var "t1")) (T.map (T.var "t0") (T.list $ T.var "t1"))),
+        ["t0", "t1"] [("t0", ["ordering"])] (T.function (T.map (T.var "t0") (T.var "t1")) (T.map (T.var "t0") (T.list $ T.var "t1"))),
       -- maps.map with sets.fromList: transforms map values from lists to sets
-      expectPoly 3 [tag_disabledForMinimalInference]
+      expectPolyConstrained 3 [tag_disabledForMinimalInference]
         (primitive _maps_map @@ primitive _sets_fromList)
-        ["t0", "t1"] (T.function (T.map (T.var "t0") (T.list $ T.var "t1")) (T.map (T.var "t0") (T.set $ T.var "t1")))],
+        ["t0", "t1"] [("t0", ["ordering"]), ("t1", ["ordering"])] (T.function (T.map (T.var "t0") (T.list $ T.var "t1")) (T.map (T.var "t0") (T.set $ T.var "t1")))],
 
     -- Applying sets.map to cross-collection functions
     subgroup "sets.map applied to a function" [
@@ -77,18 +77,18 @@
         (primitive _sets_map @@ primitive _math_negate)
         (T.function (T.set T.int32) (T.set T.int32)),
       -- sets.map with lists.length: set<list<t>> -> set<int32>
-      expectPoly 2 [tag_disabledForMinimalInference]
+      expectPolyConstrained 2 [tag_disabledForMinimalInference]
         (primitive _sets_map @@ primitive _lists_length)
-        ["t0"] (T.function (T.set $ T.list $ T.var "t0") (T.set T.int32))],
+        ["t0"] [("t0", ["ordering"])] (T.function (T.set $ T.list $ T.var "t0") (T.set T.int32))],
 
     -- Composing collection primitives in let bindings
     subgroup "Composing collection primitives in let" [
       -- let f = maps.map sets.fromList in f
-      expectPoly 1 [tag_disabledForMinimalInference]
+      expectPolyConstrained 1 [tag_disabledForMinimalInference]
         (lets [
           "f">: primitive _maps_map @@ primitive _sets_fromList]
           $ var "f")
-        ["t0", "t1"] (T.function (T.map (T.var "t0") (T.list $ T.var "t1")) (T.map (T.var "t0") (T.set $ T.var "t1"))),
+        ["t0", "t1"] [("t0", ["ordering"]), ("t1", ["ordering"])] (T.function (T.map (T.var "t0") (T.list $ T.var "t1")) (T.map (T.var "t0") (T.set $ T.var "t1"))),
       -- let f = maps.map sets.fromList; g = f (map literal) in g
       expectMono 2 [tag_disabledForMinimalInference]
         (lets [
@@ -100,13 +100,13 @@
     -- Composing map operations in lambdas
     subgroup "Map operations in lambdas" [
       -- \m. maps.map lists.length m  =>  map<k, list<t>> -> map<k, int32>
-      expectPoly 1 [tag_disabledForMinimalInference]
+      expectPolyConstrained 1 [tag_disabledForMinimalInference]
         (lambda "m" $ primitive _maps_map @@ primitive _lists_length @@ var "m")
-        ["t0", "t1"] (T.function (T.map (T.var "t0") (T.list $ T.var "t1")) (T.map (T.var "t0") T.int32)),
+        ["t0", "t1"] [("t0", ["ordering"])] (T.function (T.map (T.var "t0") (T.list $ T.var "t1")) (T.map (T.var "t0") T.int32)),
       -- \f. \m. maps.map f m  =>  (v1 -> v2) -> map<k, v1> -> map<k, v2>
-      expectPoly 2 [tag_disabledForMinimalInference]
+      expectPolyConstrained 2 [tag_disabledForMinimalInference]
         (lambda "f" $ lambda "m" $ primitive _maps_map @@ var "f" @@ var "m")
-        ["t0", "t1", "t2"] (T.functionMany [T.function (T.var "t0") (T.var "t1"), T.map (T.var "t2") (T.var "t0"), T.map (T.var "t2") (T.var "t1")])],
+        ["t0", "t1", "t2"] [("t2", ["ordering"])] (T.functionMany [T.function (T.var "t0") (T.var "t1"), T.map (T.var "t2") (T.var "t0"), T.map (T.var "t2") (T.var "t1")])],
 
     -- Fully applied collection conversions
     subgroup "Fully applied collection conversions" [
@@ -247,13 +247,13 @@
         (string "firstName", string "Arthur"),
         (string "lastName", string "Dent")])
       (T.map T.string T.string),
-    expectPoly 2 [tag_disabledForMinimalInference]
+    expectPolyConstrained 2 [tag_disabledForMinimalInference]
       (mapTerm [])
-      ["t0", "t1"] (T.map (T.var "t0") (T.var "t1")),
-    expectPoly 3 [tag_disabledForMinimalInference]
+      ["t0", "t1"] [("t0", ["ordering"])] (T.map (T.var "t0") (T.var "t1")),
+    expectPolyConstrained 3 [tag_disabledForMinimalInference]
       (lambdas ["x", "y"] $ mapTerm
         [(var "x", float64 0.1), (var "y", float64 0.2)])
-      ["t0"] (T.function (T.var "t0") (T.function (T.var "t0") (T.map (T.var "t0") T.float64)))]
+      ["t0"] [("t0", ["ordering"])] (T.function (T.var "t0") (T.function (T.var "t0") (T.map (T.var "t0") T.float64)))]
 
 testGroupForOptionals :: TBinding TestGroup
 testGroupForOptionals = define "testGroupForOptionals" $
@@ -325,6 +325,6 @@
     expectMono 1 [tag_disabledForMinimalInference]
       (set [true])
       (T.set T.boolean),
-    expectPoly 2 [tag_disabledForMinimalInference]
+    expectPolyConstrained 2 [tag_disabledForMinimalInference]
       (set [set []])
-      ["t0"] (T.set $ T.set $ T.var "t0")]
+      ["t0"] [("t0", ["ordering"])] (T.set $ T.set $ T.var "t0")]
diff --git a/src/main/haskell/Hydra/Sources/Test/Inference/AlgorithmW.hs b/src/main/haskell/Hydra/Sources/Test/Inference/AlgorithmW.hs
--- a/src/main/haskell/Hydra/Sources/Test/Inference/AlgorithmW.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Inference/AlgorithmW.hs
@@ -25,8 +25,8 @@
     (Just "Algorithm W inference tests")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding testGroupForSystemF]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition testGroupForSystemF]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Inference/All.hs b/src/main/haskell/Hydra/Sources/Test/Inference/All.hs
--- a/src/main/haskell/Hydra/Sources/Test/Inference/All.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Inference/All.hs
@@ -15,6 +15,7 @@
 
 import qualified Hydra.Sources.Test.Inference.AlgebraicTypes as AlgebraicTypes
 import qualified Hydra.Sources.Test.Inference.AlgorithmW as AlgorithmW
+import qualified Hydra.Sources.Test.Inference.Classes as Classes
 import qualified Hydra.Sources.Test.Inference.Failures as Failures
 import qualified Hydra.Sources.Test.Inference.Fundamentals as Fundamentals
 import qualified Hydra.Sources.Test.Inference.KernelExamples as KernelExamples
@@ -28,10 +29,11 @@
 module_ = Module ns elements namespaces kernelTypesNamespaces $
     Just "Hydra's inference test suite"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
     namespaces = [
       AlgebraicTypes.ns,
       AlgorithmW.ns,
+      Classes.ns,
       Failures.ns,
       Fundamentals.ns,
       KernelExamples.ns,
@@ -45,6 +47,7 @@
     subgroups = [
       AlgebraicTypes.allTests,
       AlgorithmW.allTests,
+      Classes.allTests,
       Failures.allTests,
       Fundamentals.allTests,
       KernelExamples.allTests,
diff --git a/src/main/haskell/Hydra/Sources/Test/Inference/Classes.hs b/src/main/haskell/Hydra/Sources/Test/Inference/Classes.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Inference/Classes.hs
@@ -0,0 +1,396 @@
+module Hydra.Sources.Test.Inference.Classes where
+
+-- Standard imports for shallow DSL tests
+import Hydra.Kernel
+import Hydra.Dsl.Meta.Testing                 as Testing
+import Hydra.Dsl.Meta.Terms                   as Terms
+import Hydra.Sources.Kernel.Types.All
+import qualified Hydra.Dsl.Meta.Core          as Core
+import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
+import qualified Hydra.Dsl.Meta.Types         as T
+import qualified Hydra.Sources.Test.TestGraph as TestGraph
+import qualified Hydra.Sources.Test.TestTerms as TestTerms
+import qualified Hydra.Sources.Test.TestTypes as TestTypes
+import qualified Data.List                    as L
+import qualified Data.Map                     as M
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.inference.classes"
+
+module_ :: Module
+module_ = Module ns elements
+    [TestGraph.ns]
+    kernelTypesNamespaces
+    (Just "Inference tests for type class constraints (ordering and equality)")
+  where
+    elements = [
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition testGroupForMonomorphicConstraints,
+      Phantoms.toTermDefinition testGroupForPrimitiveReferences,
+      Phantoms.toTermDefinition testGroupForPartialApplication,
+      Phantoms.toTermDefinition testGroupForLetBindings,
+      Phantoms.toTermDefinition testGroupForComposition,
+      Phantoms.toTermDefinition testGroupForNestedContainers,
+      Phantoms.toTermDefinition testGroupForCollectionTerms]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+allTests :: TBinding TestGroup
+allTests = define "allTests" $
+  Phantoms.doc "Type class constraint inference tests" $
+  supergroup "Type classes" [
+    testGroupForMonomorphicConstraints,
+    testGroupForPrimitiveReferences,
+    testGroupForPartialApplication,
+    testGroupForLetBindings,
+    testGroupForComposition,
+    testGroupForNestedContainers,
+    testGroupForCollectionTerms]
+
+-- | When all type variables are instantiated to concrete types, constraints vanish.
+testGroupForMonomorphicConstraints :: TBinding TestGroup
+testGroupForMonomorphicConstraints = define "testGroupForMonomorphicConstraints" $
+  supergroup "Monomorphic (constraints vanish)" [
+
+    subgroup "Map operations with concrete types" [
+      -- maps.fromList [("a", 1)] => Map String Int32
+      expectMono 1 []
+        (primitive _maps_fromList @@ list [pair (string "a") (int32 1)])
+        (T.map T.string T.int32),
+      -- maps.lookup "k" (maps.singleton "k" 42) => Optional Int32
+      expectMono 2 []
+        (primitive _maps_lookup @@ string "k" @@ (primitive _maps_singleton @@ string "k" @@ int32 42))
+        (T.optional T.int32),
+      -- maps.insert "k" 42 maps.empty => Map String Int32
+      expectMono 3 []
+        (primitive _maps_insert @@ string "k" @@ int32 42 @@ primitive _maps_empty)
+        (T.map T.string T.int32)],
+
+    subgroup "Set operations with concrete types" [
+      -- sets.fromList [1, 2, 3] => Set Int32
+      expectMono 1 []
+        (primitive _sets_fromList @@ list [int32 1, int32 2, int32 3])
+        (T.set T.int32),
+      -- sets.member 42 (sets.singleton 42) => Boolean
+      expectMono 2 []
+        (primitive _sets_member @@ int32 42 @@ (primitive _sets_singleton @@ int32 42))
+        T.boolean],
+
+    subgroup "Equality operations with concrete types" [
+      -- equality.equal 1 2 => Boolean
+      expectMono 1 []
+        (primitive _equality_equal @@ int32 1 @@ int32 2)
+        T.boolean,
+      -- equality.compare "a" "b" => Comparison
+      expectMono 2 []
+        (primitive _equality_compare @@ string "a" @@ string "b")
+        (T.var "hydra.util.Comparison")],
+
+    subgroup "List operations with concrete types" [
+      -- lists.sort [3, 1, 2] => [Int32]
+      expectMono 1 []
+        (primitive _lists_sort @@ list [int32 3, int32 1, int32 2])
+        (T.list T.int32)]]
+
+-- | Bare primitive references should retain constraints on type variables.
+testGroupForPrimitiveReferences :: TBinding TestGroup
+testGroupForPrimitiveReferences = define "testGroupForPrimitiveReferences" $
+  supergroup "Primitive references with constraints" [
+
+    subgroup "Map primitives (ordering on key type)" [
+      -- maps.fromList => forall k v. Ord k => [(k, v)] -> Map k v
+      expectPolyConstrained 1 []
+        (primitive _maps_fromList)
+        ["t0", "t1"] [("t0", ["ordering"])]
+        (T.function (T.list $ T.pair (T.var "t0") (T.var "t1")) (T.map (T.var "t0") (T.var "t1"))),
+      -- maps.lookup => forall k v. Ord k => k -> Map k v -> Optional v
+      expectPolyConstrained 2 []
+        (primitive _maps_lookup)
+        ["t0", "t1"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.map (T.var "t0") (T.var "t1"), T.optional (T.var "t1")]),
+      -- maps.insert => forall k v. Ord k => k -> v -> Map k v -> Map k v
+      expectPolyConstrained 3 []
+        (primitive _maps_insert)
+        ["t0", "t1"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.var "t1", T.map (T.var "t0") (T.var "t1"), T.map (T.var "t0") (T.var "t1")]),
+      -- maps.map => forall k v1 v2. Ord k => (v1 -> v2) -> Map k v1 -> Map k v2
+      expectPolyConstrained 4 []
+        (primitive _maps_map)
+        ["t0", "t1", "t2"] [("t2", ["ordering"])]
+        (T.functionMany [T.function (T.var "t0") (T.var "t1"), T.map (T.var "t2") (T.var "t0"), T.map (T.var "t2") (T.var "t1")]),
+      -- maps.empty => forall k v. Ord k => Map k v
+      expectPolyConstrained 5 []
+        (primitive _maps_empty)
+        ["t0", "t1"] [("t0", ["ordering"])]
+        (T.map (T.var "t0") (T.var "t1"))],
+
+    subgroup "Set primitives (ordering on element type)" [
+      -- sets.fromList => forall x. Ord x => [x] -> Set x
+      expectPolyConstrained 1 []
+        (primitive _sets_fromList)
+        ["t0"] [("t0", ["ordering"])]
+        (T.function (T.list $ T.var "t0") (T.set $ T.var "t0")),
+      -- sets.member => forall x. Ord x => x -> Set x -> Boolean
+      expectPolyConstrained 2 []
+        (primitive _sets_member)
+        ["t0"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.set (T.var "t0"), T.boolean]),
+      -- sets.insert => forall x. Ord x => x -> Set x -> Set x
+      expectPolyConstrained 3 []
+        (primitive _sets_insert)
+        ["t0"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.set (T.var "t0"), T.set (T.var "t0")]),
+      -- sets.map => forall a b. (Ord a, Ord b) => (a -> b) -> Set a -> Set b
+      expectPolyConstrained 4 []
+        (primitive _sets_map)
+        ["t0", "t1"] [("t0", ["ordering"]), ("t1", ["ordering"])]
+        (T.functionMany [T.function (T.var "t0") (T.var "t1"), T.set (T.var "t0"), T.set (T.var "t1")])],
+
+    subgroup "Equality primitives" [
+      -- equality.equal => forall x. Eq x => x -> x -> Boolean
+      expectPolyConstrained 1 []
+        (primitive _equality_equal)
+        ["t0"] [("t0", ["equality"])]
+        (T.functionMany [T.var "t0", T.var "t0", T.boolean]),
+      -- equality.compare => forall x. Ord x => x -> x -> Comparison
+      expectPolyConstrained 2 []
+        (primitive _equality_compare)
+        ["t0"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.var "t0", T.var "hydra.util.Comparison"])],
+
+    subgroup "List primitives with constraints" [
+      -- lists.sort => forall x. Ord x => [x] -> [x]
+      expectPolyConstrained 1 []
+        (primitive _lists_sort)
+        ["t0"] [("t0", ["ordering"])]
+        (T.function (T.list $ T.var "t0") (T.list $ T.var "t0")),
+      -- lists.nub => forall x. Eq x => [x] -> [x]
+      expectPolyConstrained 2 []
+        (primitive _lists_nub)
+        ["t0"] [("t0", ["equality"])]
+        (T.function (T.list $ T.var "t0") (T.list $ T.var "t0")),
+      -- lists.elem => forall x. Eq x => x -> [x] -> Boolean
+      expectPolyConstrained 3 []
+        (primitive _lists_elem)
+        ["t0"] [("t0", ["equality"])]
+        (T.functionMany [T.var "t0", T.list (T.var "t0"), T.boolean])]]
+
+-- | Partial application where the constrained variable is not yet fixed.
+testGroupForPartialApplication :: TBinding TestGroup
+testGroupForPartialApplication = define "testGroupForPartialApplication" $
+  supergroup "Partial application preserving constraints" [
+
+    subgroup "Map partial application" [
+      -- \k -> maps.lookup k => forall k v. Ord k => k -> Map k v -> Optional v
+      expectPolyConstrained 1 []
+        (lambda "k" $ primitive _maps_lookup @@ var "k")
+        ["t0", "t1"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.map (T.var "t0") (T.var "t1"), T.optional (T.var "t1")]),
+      -- \k -> \v -> maps.singleton k v => forall k v. Ord k => k -> v -> Map k v
+      expectPolyConstrained 2 []
+        (lambda "k" $ lambda "v" $ primitive _maps_singleton @@ var "k" @@ var "v")
+        ["t0", "t1"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.var "t1", T.map (T.var "t0") (T.var "t1")])],
+
+    subgroup "Set partial application" [
+      -- \x -> sets.member x => forall x. Ord x => x -> Set x -> Boolean
+      expectPolyConstrained 1 []
+        (lambda "x" $ primitive _sets_member @@ var "x")
+        ["t0"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.set (T.var "t0"), T.boolean])],
+
+    subgroup "Equality partial application" [
+      -- \x -> \y -> equality.equal x y => forall x. Eq x => x -> x -> Boolean
+      expectPolyConstrained 1 []
+        (lambda "x" $ lambda "y" $ primitive _equality_equal @@ var "x" @@ var "y")
+        ["t0"] [("t0", ["equality"])]
+        (T.functionMany [T.var "t0", T.var "t0", T.boolean])],
+
+    subgroup "Partial application fixing the constrained variable" [
+      -- \v -> maps.singleton "key" v => forall v. String -> v -> Map String v (no constraint)
+      expectPoly 1 []
+        (lambda "v" $ primitive _maps_singleton @@ string "key" @@ var "v")
+        ["t0"] (T.function (T.var "t0") (T.map T.string (T.var "t0")))]]
+
+-- | Constraints should propagate through let-bound generalizations.
+testGroupForLetBindings :: TBinding TestGroup
+testGroupForLetBindings = define "testGroupForLetBindings" $
+  supergroup "Let binding constraint propagation" [
+
+    subgroup "Simple let-bound wrappers" [
+      -- let lookup = \k -> \m -> maps.lookup k m in lookup
+      expectPolyConstrained 1 []
+        (lets [
+          "lookup">: lambda "k" $ lambda "m" $ primitive _maps_lookup @@ var "k" @@ var "m"]
+          $ var "lookup")
+        ["t0", "t1"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.map (T.var "t0") (T.var "t1"), T.optional (T.var "t1")]),
+      -- let member = \x -> \s -> sets.member x s in member
+      expectPolyConstrained 2 []
+        (lets [
+          "member">: lambda "x" $ lambda "s" $ primitive _sets_member @@ var "x" @@ var "s"]
+          $ var "member")
+        ["t0"] [("t0", ["ordering"])]
+        (T.functionMany [T.var "t0", T.set (T.var "t0"), T.boolean]),
+      -- let fromList = maps.fromList in fromList
+      expectPolyConstrained 3 []
+        (lets [
+          "fromList">: primitive _maps_fromList]
+          $ var "fromList")
+        ["t0", "t1"] [("t0", ["ordering"])]
+        (T.function (T.list $ T.pair (T.var "t0") (T.var "t1")) (T.map (T.var "t0") (T.var "t1")))],
+
+    subgroup "Let-bound with partial instantiation" [
+      -- let f = \m -> maps.map math.negate m in f  => Ord k => Map k Int32 -> Map k Int32
+      expectPolyConstrained 1 []
+        (lets [
+          "f">: lambda "m" $ primitive _maps_map @@ primitive _math_negate @@ var "m"]
+          $ var "f")
+        ["t0"] [("t0", ["ordering"])]
+        (T.function (T.map (T.var "t0") T.int32) (T.map (T.var "t0") T.int32)),
+      -- let f = \xs -> sets.fromList xs in f  => Ord x => [x] -> Set x
+      expectPolyConstrained 2 []
+        (lets [
+          "f">: lambda "xs" $ primitive _sets_fromList @@ var "xs"]
+          $ var "f")
+        ["t0"] [("t0", ["ordering"])]
+        (T.function (T.list $ T.var "t0") (T.set $ T.var "t0"))],
+
+    subgroup "Multiple uses of a constrained let binding" [
+      -- let f = maps.fromList in pair (f [("a", 1)]) (f [(true, "x")])
+      -- Both uses instantiate f, constraints vanish at concrete types
+      expectMono 1 []
+        (lets [
+          "f">: primitive _maps_fromList]
+          $ pair (var "f" @@ list [pair (string "a") (int32 1)])
+                 (var "f" @@ list [pair true (string "x")]))
+        (T.pair (T.map T.string T.int32) (T.map T.boolean T.string))]]
+
+-- | Constraint propagation through function composition.
+testGroupForComposition :: TBinding TestGroup
+testGroupForComposition = define "testGroupForComposition" $
+  supergroup "Composition and constraint merging" [
+
+    subgroup "Composing constrained primitives" [
+      -- \xs -> maps.fromList (lists.map (\x -> pair x x) xs)
+      -- Key type needs Ord (from maps.fromList)
+      expectPolyConstrained 1 []
+        (lambda "xs" $ primitive _maps_fromList @@ (primitive _lists_map @@ (lambda "x" $ pair (var "x") (var "x")) @@ var "xs"))
+        ["t0"] [("t0", ["ordering"])]
+        (T.function (T.list $ T.var "t0") (T.map (T.var "t0") (T.var "t0"))),
+      -- \f -> \xs -> sets.fromList (lists.map f xs)
+      -- Result element type needs Ord (from sets.fromList)
+      expectPolyConstrained 2 []
+        (lambda "f" $ lambda "xs" $ primitive _sets_fromList @@ (primitive _lists_map @@ var "f" @@ var "xs"))
+        ["t0", "t1"] [("t1", ["ordering"])]
+        (T.functionMany [T.function (T.var "t0") (T.var "t1"), T.list (T.var "t0"), T.set (T.var "t1")])],
+
+    subgroup "Composing map and sort" [
+      -- \m -> maps.map lists.sort m
+      -- Value type needs Ord (from lists.sort), key type needs Ord (from maps.map)
+      expectPolyConstrained 1 []
+        (lambda "m" $ primitive _maps_map @@ primitive _lists_sort @@ var "m")
+        ["t0", "t1"] [("t0", ["ordering"]), ("t1", ["ordering"])]
+        (T.function (T.map (T.var "t0") (T.list $ T.var "t1")) (T.map (T.var "t0") (T.list $ T.var "t1")))]]
+
+-- | Nested container types where constraints apply at multiple levels.
+testGroupForNestedContainers :: TBinding TestGroup
+testGroupForNestedContainers = define "testGroupForNestedContainers" $
+  supergroup "Nested containers" [
+
+    subgroup "Maps of sets" [
+      -- \m -> maps.map sets.fromList m
+      -- Map key needs Ord, set element needs Ord
+      expectPolyConstrained 1 []
+        (lambda "m" $ primitive _maps_map @@ primitive _sets_fromList @@ var "m")
+        ["t0", "t1"] [("t0", ["ordering"]), ("t1", ["ordering"])]
+        (T.function (T.map (T.var "t0") (T.list $ T.var "t1")) (T.map (T.var "t0") (T.set $ T.var "t1")))],
+
+    subgroup "Sets of sets" [
+      -- \xss -> sets.map sets.fromList xss
+      -- Outer: Set (List x) needs Ord on (List x); inner: sets.fromList needs Ord on x
+      -- Both source and target element types need Ord
+      expectPolyConstrained 1 []
+        (lambda "xss" $ primitive _sets_map @@ primitive _sets_fromList @@ var "xss")
+        ["t0"] [("t0", ["ordering"])]
+        (T.function (T.set $ T.list $ T.var "t0") (T.set $ T.set $ T.var "t0"))],
+
+    subgroup "Map from sorted list" [
+      -- \xs -> maps.fromList (lists.map (\x -> pair x (sets.singleton x)) xs)
+      -- Key needs Ord (maps.fromList), element needs Ord (sets.singleton) — same variable
+      expectPolyConstrained 1 []
+        (lambda "xs" $ primitive _maps_fromList @@
+          (primitive _lists_map @@ (lambda "x" $ pair (var "x") (primitive _sets_singleton @@ var "x")) @@ var "xs"))
+        ["t0"] [("t0", ["ordering"])]
+        (T.function (T.list $ T.var "t0") (T.map (T.var "t0") (T.set $ T.var "t0")))]]
+
+-- | Constraints derived from collection term literals (set and map syntax).
+testGroupForCollectionTerms :: TBinding TestGroup
+testGroupForCollectionTerms = define "testGroupForCollectionTerms" $
+  supergroup "Collection term constraints" [
+
+    -- Set literals with polymorphic elements
+    subgroup "Set literals" [
+      -- \x -> set{x}  =>  forall t0. Ord t0 => t0 -> Set t0
+      expectPolyConstrained 1 [tag_disabledForMinimalInference]
+        (lambda "x" $ set [var "x"])
+        ["t0"] [("t0", ["ordering"])] (T.function (T.var "t0") (T.set $ T.var "t0")),
+      -- \x -> \y -> set{x, y}  =>  forall t0. Ord t0 => t0 -> t0 -> Set t0
+      expectPolyConstrained 2 [tag_disabledForMinimalInference]
+        (lambda "x" $ lambda "y" $ set [var "x", var "y"])
+        ["t0"] [("t0", ["ordering"])] (T.functionMany [T.var "t0", T.var "t0", T.set $ T.var "t0"]),
+      -- set{1, 2}  =>  Set Int32  (monomorphic: constraint vanishes)
+      expectMono 3 [tag_disabledForMinimalInference]
+        (set [int32 1, int32 2])
+        (T.set T.int32)],
+
+    -- Map literals with polymorphic keys
+    subgroup "Map literals" [
+      -- \k -> \v -> map{k: v}  =>  forall t0 t1. Ord t0 => t0 -> t1 -> Map t0 t1
+      expectPolyConstrained 1 [tag_disabledForMinimalInference]
+        (lambda "k" $ lambda "v" $ mapTerm [(var "k", var "v")])
+        ["t0", "t1"] [("t0", ["ordering"])] (T.functionMany [T.var "t0", T.var "t1", T.map (T.var "t0") (T.var "t1")]),
+      -- map{"a": 1}  =>  Map String Int32  (monomorphic: constraint vanishes)
+      expectMono 2 [tag_disabledForMinimalInference]
+        (mapTerm [(string "a", int32 1)])
+        (T.map T.string T.int32)],
+
+    -- Mixed: collection terms combined with primitives (monomorphic cases)
+    subgroup "Collection terms with primitives" [
+      -- \x -> set{x, math.negate x}  =>  Int32 -> Set Int32  (negate forces Int32)
+      expectMono 1 [tag_disabledForMinimalInference]
+        (lambda "x" $ set [var "x", primitive _math_negate @@ var "x"])
+        (T.function T.int32 (T.set T.int32)),
+      -- \k -> map{k: lists.sort (list [k])}
+      -- Key needs Ord (from map literal), value needs Ord (from lists.sort) — same variable
+      expectPolyConstrained 2 [tag_disabledForMinimalInference]
+        (lambda "k" $ mapTerm [(var "k", primitive _lists_sort @@ list [var "k"])])
+        ["t0"] [("t0", ["ordering"])] (T.function (T.var "t0") (T.map (T.var "t0") (T.list $ T.var "t0")))],
+
+    -- Constraint propagation through inferMany: constraints from sub-expressions
+    -- inside collection literals must survive into the final result.
+    subgroup "Constraint propagation through collection elements" [
+      -- \xs -> map{lists.length xs: sets.fromList xs}
+      -- Key is Int32 (concrete), value is Set t0 (Ord t0 from sets.fromList)
+      -- Tests: map value inference propagates constraints through inferMany
+      expectPolyConstrained 1 [tag_disabledForMinimalInference]
+        (lambda "xs" $ mapTerm [(primitive _lists_length @@ var "xs", primitive _sets_fromList @@ var "xs")])
+        ["t0"] [("t0", ["ordering"])] (T.function (T.list $ T.var "t0") (T.map T.int32 (T.set $ T.var "t0"))),
+      -- [lists.sort]  =>  forall t0. Ord t0 => [t0 -> t0]
+      -- Tests: list element inference propagates constraints through inferMany
+      expectPolyConstrained 2 [tag_disabledForMinimalInference]
+        (list [primitive _lists_sort])
+        ["t0"] [("t0", ["ordering"])] (T.list $ T.function (T.list $ T.var "t0") (T.list $ T.var "t0")),
+      -- pair (sets.fromList) 42  =>  forall t0. Ord t0 => pair<([t0] -> Set t0), Int32>
+      -- Tests: pair inference propagates constraints through inferMany
+      expectPolyConstrained 3 [tag_disabledForMinimalInference]
+        (pair (primitive _sets_fromList) (int32 42))
+        ["t0"] [("t0", ["ordering"])] (T.pair (T.function (T.list $ T.var "t0") (T.set $ T.var "t0")) T.int32),
+      -- \xs -> set{sets.fromList xs}
+      -- Outer set needs Ord on set<t0>, inner sets.fromList needs Ord on t0
+      -- Tests: set element inference propagates constraints through inferMany
+      expectPolyConstrained 4 [tag_disabledForMinimalInference]
+        (lambda "xs" $ set [primitive _sets_fromList @@ var "xs"])
+        ["t0"] [("t0", ["ordering"])] (T.function (T.list $ T.var "t0") (T.set $ T.set $ T.var "t0"))]]
diff --git a/src/main/haskell/Hydra/Sources/Test/Inference/Failures.hs b/src/main/haskell/Hydra/Sources/Test/Inference/Failures.hs
--- a/src/main/haskell/Hydra/Sources/Test/Inference/Failures.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Inference/Failures.hs
@@ -25,20 +25,20 @@
     (Just "Inference tests for expected failures")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding undefinedVariableTests,
-      Phantoms.toBinding unificationFailureTests,
-      Phantoms.toBinding invalidApplicationTests,
-      Phantoms.toBinding selfApplicationTests,
-      Phantoms.toBinding arityMismatchTests,
-      Phantoms.toBinding recursiveTypeTests,
-      Phantoms.toBinding occurCheckTests,
-      Phantoms.toBinding typeConstructorMisuseTests,
-      Phantoms.toBinding polymorphismViolationTests,
-      Phantoms.toBinding letBindingMismatchTests,
-      Phantoms.toBinding constraintSolverEdgeCaseTests,
-      Phantoms.toBinding primitiveTypeErrorTests,
-      Phantoms.toBinding complexConstraintFailureTests]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition undefinedVariableTests,
+      Phantoms.toTermDefinition unificationFailureTests,
+      Phantoms.toTermDefinition invalidApplicationTests,
+      Phantoms.toTermDefinition selfApplicationTests,
+      Phantoms.toTermDefinition arityMismatchTests,
+      Phantoms.toTermDefinition recursiveTypeTests,
+      Phantoms.toTermDefinition occurCheckTests,
+      Phantoms.toTermDefinition typeConstructorMisuseTests,
+      Phantoms.toTermDefinition polymorphismViolationTests,
+      Phantoms.toTermDefinition letBindingMismatchTests,
+      Phantoms.toTermDefinition constraintSolverEdgeCaseTests,
+      Phantoms.toTermDefinition primitiveTypeErrorTests,
+      Phantoms.toTermDefinition complexConstraintFailureTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Inference/Fundamentals.hs b/src/main/haskell/Hydra/Sources/Test/Inference/Fundamentals.hs
--- a/src/main/haskell/Hydra/Sources/Test/Inference/Fundamentals.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Inference/Fundamentals.hs
@@ -25,13 +25,13 @@
     (Just "Inference tests for fundamental language features")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding testGroupForLambdas,
-      Phantoms.toBinding testGroupForLet,
-      Phantoms.toBinding testGroupForLiterals,
-      Phantoms.toBinding testGroupForPathologicalTerms,
-      Phantoms.toBinding testGroupForPolymorphism,
-      Phantoms.toBinding testGroupForPrimitives]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition testGroupForLambdas,
+      Phantoms.toTermDefinition testGroupForLet,
+      Phantoms.toTermDefinition testGroupForLiterals,
+      Phantoms.toTermDefinition testGroupForPathologicalTerms,
+      Phantoms.toTermDefinition testGroupForPolymorphism,
+      Phantoms.toTermDefinition testGroupForPrimitives]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Inference/KernelExamples.hs b/src/main/haskell/Hydra/Sources/Test/Inference/KernelExamples.hs
--- a/src/main/haskell/Hydra/Sources/Test/Inference/KernelExamples.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Inference/KernelExamples.hs
@@ -25,8 +25,8 @@
     (Just "Inference tests for examples from the Hydra kernel")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding testGroupForNestedLet]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition testGroupForNestedLet]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Inference/NominalTypes.hs b/src/main/haskell/Hydra/Sources/Test/Inference/NominalTypes.hs
--- a/src/main/haskell/Hydra/Sources/Test/Inference/NominalTypes.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Inference/NominalTypes.hs
@@ -27,12 +27,12 @@
     (Just "Inference tests for nominal types")
   where
     elements = [
-      Phantoms.toBinding allTests,
-      Phantoms.toBinding testGroupForCaseStatements,
-      Phantoms.toBinding testGroupForProjections,
-      Phantoms.toBinding testGroupForRecords,
-      Phantoms.toBinding testGroupForVariants,
-      Phantoms.toBinding testGroupForWrappers]
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition testGroupForCaseStatements,
+      Phantoms.toTermDefinition testGroupForProjections,
+      Phantoms.toTermDefinition testGroupForRecords,
+      Phantoms.toTermDefinition testGroupForVariants,
+      Phantoms.toTermDefinition testGroupForWrappers]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Json/Coder.hs b/src/main/haskell/Hydra/Sources/Test/Json/Coder.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Test/Json/Coder.hs
+++ /dev/null
@@ -1,231 +0,0 @@
--- | Test cases for the type-directed JSON coder
-module Hydra.Sources.Test.Json.Coder where
-
--- Standard imports for shallow DSL tests
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Testing                 as Testing
-import Hydra.Dsl.Meta.Terms                   as Terms
-import Hydra.Sources.Kernel.Types.All
-import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
-import qualified Hydra.Dsl.Meta.Types         as T
-import qualified Hydra.Sources.Test.TestGraph as TestGraph
-import qualified Hydra.Sources.Test.TestTerms as TestTerms
-import qualified Hydra.Sources.Test.TestTypes as TestTypes
-import qualified Data.List                    as L
-import qualified Data.Map                     as M
-
--- Additional imports specific to this module
-import Hydra.Json.Model (Value)
-import Hydra.Testing
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Json as Json
-
-
-ns :: Namespace
-ns = Namespace "hydra.test.json.coder"
-
-module_ :: Module
-module_ = Module ns elements
-    []
-    kernelTypesNamespaces
-    (Just "Test cases for the type-directed JSON coder (Hydra Term <-> JSON Value)")
-  where
-    elements = [
-        Phantoms.toBinding allTests]
-
-define :: String -> TTerm a -> TBinding a
-define = definitionInModule module_
-
-allTests :: TBinding TestGroup
-allTests = define "allTests" $
-    Phantoms.doc "Test cases for the type-directed JSON coder" $
-    supergroup "JSON coder" [
-      literalCoderGroup,
-      integerCoderGroup,
-      floatCoderGroup,
-      collectionCoderGroup,
-      optionalCoderGroup,
-      recordCoderGroup]
-
--- Helper for creating JSON coder test cases
-coderTest :: String -> TTerm Type -> TTerm Term -> TTerm Value -> TTerm TestCaseWithMetadata
-coderTest name typ term json = testCaseWithMetadata (Phantoms.string name)
-  (testCaseJsonCoder $ jsonCoderTestCase typ term json)
-  Phantoms.nothing (Phantoms.list ([] :: [TTerm Tag]))
-
--- | Test cases for literal type encoding/decoding
-literalCoderGroup :: TTerm TestGroup
-literalCoderGroup = subgroup "literal types" [
-    -- Booleans
-    coderTest "boolean true"
-      T.boolean
-      (Terms.boolean True)
-      (Json.valueBoolean $ Phantoms.boolean True),
-    coderTest "boolean false"
-      T.boolean
-      (Terms.boolean False)
-      (Json.valueBoolean $ Phantoms.boolean False),
-
-    -- Integers
-    coderTest "int32 positive"
-      T.int32
-      (Terms.int32 42)
-      (Json.valueNumber $ Phantoms.bigfloat 42.0),
-    coderTest "int32 negative"
-      T.int32
-      (Terms.int32 (-17))
-      (Json.valueNumber $ Phantoms.bigfloat (-17.0)),
-    coderTest "int32 zero"
-      T.int32
-      (Terms.int32 0)
-      (Json.valueNumber $ Phantoms.bigfloat 0.0),
-
-    -- Floats (using exact binary fractions to avoid precision issues)
-    coderTest "float32"
-      T.float32
-      (Terms.float32 1.5)
-      (Json.valueNumber $ Phantoms.bigfloat 1.5),
-    coderTest "float64"
-      T.float64
-      (Terms.float64 2.718)
-      (Json.valueNumber $ Phantoms.bigfloat 2.718),
-
-    -- Strings
-    coderTest "string simple"
-      T.string
-      (Terms.string "hello")
-      (Json.valueString $ Phantoms.string "hello"),
-    coderTest "string empty"
-      T.string
-      (Terms.string "")
-      (Json.valueString $ Phantoms.string ""),
-    coderTest "string with spaces"
-      T.string
-      (Terms.string "hello world")
-      (Json.valueString $ Phantoms.string "hello world")]
-
--- | Test cases for all integer types
-integerCoderGroup :: TTerm TestGroup
-integerCoderGroup = subgroup "integer types" [
-    -- int8
-    coderTest "int8 positive"
-      T.int8
-      (Terms.int8 127)
-      (Json.valueNumber $ Phantoms.bigfloat 127.0),
-    coderTest "int8 negative"
-      T.int8
-      (Terms.int8 (-128))
-      (Json.valueNumber $ Phantoms.bigfloat (-128.0)),
-
-    -- int16
-    coderTest "int16 positive"
-      T.int16
-      (Terms.int16 1000)
-      (Json.valueNumber $ Phantoms.bigfloat 1000.0),
-    coderTest "int16 negative"
-      T.int16
-      (Terms.int16 (-1000))
-      (Json.valueNumber $ Phantoms.bigfloat (-1000.0)),
-
-    -- uint8
-    coderTest "uint8 max"
-      T.uint8
-      (Terms.uint8 255)
-      (Json.valueNumber $ Phantoms.bigfloat 255.0),
-    coderTest "uint8 zero"
-      T.uint8
-      (Terms.uint8 0)
-      (Json.valueNumber $ Phantoms.bigfloat 0.0),
-
-    -- uint16
-    coderTest "uint16 positive"
-      T.uint16
-      (Terms.uint16 60000)
-      (Json.valueNumber $ Phantoms.bigfloat 60000.0),
-
-    -- uint32
-    coderTest "uint32 positive"
-      T.uint32
-      (Terms.uint32 4000000000)
-      (Json.valueNumber $ Phantoms.bigfloat 4000000000.0),
-
-    -- uint64
-    coderTest "uint64 positive"
-      T.uint64
-      (Terms.uint64 1000000)
-      (Json.valueNumber $ Phantoms.bigfloat 1000000.0),
-
-    -- bigint (encoded as number, like other integer types)
-    coderTest "bigint positive"
-      T.bigint
-      (Terms.bigint 123456789012345)
-      (Json.valueNumber $ Phantoms.bigfloat 123456789012345.0),
-    coderTest "bigint negative"
-      T.bigint
-      (Terms.bigint (-999999999999))
-      (Json.valueNumber $ Phantoms.bigfloat (-999999999999.0))]
-
--- | Test cases for float types
-floatCoderGroup :: TTerm TestGroup
-floatCoderGroup = subgroup "float types" [
-    -- bigfloat (note: like bigint, these may be encoded as strings for precision in some cases)
-    coderTest "bigfloat positive"
-      T.bigfloat
-      (Terms.bigfloat 3.14159265359)
-      (Json.valueNumber $ Phantoms.bigfloat 3.14159265359),
-    coderTest "bigfloat negative"
-      T.bigfloat
-      (Terms.bigfloat (-2.71828))
-      (Json.valueNumber $ Phantoms.bigfloat (-2.71828)),
-    coderTest "bigfloat zero"
-      T.bigfloat
-      (Terms.bigfloat 0.0)
-      (Json.valueNumber $ Phantoms.bigfloat 0.0)]
-
--- | Test cases for collection type encoding/decoding
-collectionCoderGroup :: TTerm TestGroup
-collectionCoderGroup = subgroup "collection types" [
-    -- Lists
-    coderTest "list of integers"
-      (T.list T.int32)
-      (Terms.list [Terms.int32 1, Terms.int32 2, Terms.int32 3])
-      (Json.valueArray $ Phantoms.list [
-          Json.valueNumber $ Phantoms.bigfloat 1.0,
-          Json.valueNumber $ Phantoms.bigfloat 2.0,
-          Json.valueNumber $ Phantoms.bigfloat 3.0]),
-    coderTest "list of strings"
-      (T.list T.string)
-      (Terms.list [Terms.string "a", Terms.string "b"])
-      (Json.valueArray $ Phantoms.list [
-          Json.valueString $ Phantoms.string "a",
-          Json.valueString $ Phantoms.string "b"]),
-    coderTest "empty list"
-      (T.list T.int32)
-      (Terms.list [])
-      (Json.valueArray $ Phantoms.list ([] :: [TTerm Value]))]
-    -- Note: Map tests are more complex due to the map term representation
-
--- | Test cases for optional type encoding/decoding
-optionalCoderGroup :: TTerm TestGroup
-optionalCoderGroup = subgroup "optional types" [
-    coderTest "optional string with value"
-      (T.optional T.string)
-      (Terms.optional $ Phantoms.just $ Terms.string "hello")
-      (Json.valueString $ Phantoms.string "hello"),
-    coderTest "optional string nothing"
-      (T.optional T.string)
-      (Terms.optional Phantoms.nothing)
-      Json.valueNull,
-    coderTest "optional int with value"
-      (T.optional T.int32)
-      (Terms.optional $ Phantoms.just $ Terms.int32 42)
-      (Json.valueNumber $ Phantoms.bigfloat 42.0),
-    coderTest "optional int nothing"
-      (T.optional T.int32)
-      (Terms.optional Phantoms.nothing)
-      Json.valueNull]
-
--- | Test cases for record type encoding/decoding
-recordCoderGroup :: TTerm TestGroup
-recordCoderGroup = subgroup "record types" ([] :: [TTerm TestCaseWithMetadata])
diff --git a/src/main/haskell/Hydra/Sources/Test/Json/Parser.hs b/src/main/haskell/Hydra/Sources/Test/Json/Parser.hs
--- a/src/main/haskell/Hydra/Sources/Test/Json/Parser.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Json/Parser.hs
@@ -18,8 +18,8 @@
 import Hydra.Json.Model (Value)
 import Hydra.Testing
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Json as Json
-import qualified Hydra.Dsl.Meta.Parsing as Parsing
+import qualified Hydra.Dsl.Json.Model as Json
+import qualified Hydra.Dsl.Parsing as Parsing
 
 
 ns :: Namespace
@@ -32,7 +32,7 @@
     (Just "Test cases for JSON parsing")
   where
     elements = [
-        Phantoms.toBinding allTests]
+        Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Json/Roundtrip.hs b/src/main/haskell/Hydra/Sources/Test/Json/Roundtrip.hs
--- a/src/main/haskell/Hydra/Sources/Test/Json/Roundtrip.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Json/Roundtrip.hs
@@ -1,11 +1,8 @@
--- | Round-trip test cases for the Either-based JSON encoder and decoder
+-- | Round-trip test cases for the JSON encoder and decoder
 --
 -- These tests verify that:
 -- 1. Terms can be encoded to JSON and decoded back to the original term
 -- 2. The encoder and decoder handle all supported term constructs correctly
---
--- Note: These tests use the existing Flow-based JSON coder for now.
--- The Either-based encoder/decoder will be used once generated.
 module Hydra.Sources.Test.Json.Roundtrip where
 
 -- Standard imports for shallow DSL tests
@@ -36,7 +33,7 @@
     (Just "Round-trip test cases for JSON encoding and decoding")
   where
     elements = [
-        Phantoms.toBinding allTests]
+        Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Json/Writer.hs b/src/main/haskell/Hydra/Sources/Test/Json/Writer.hs
--- a/src/main/haskell/Hydra/Sources/Test/Json/Writer.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Json/Writer.hs
@@ -18,7 +18,7 @@
 import Hydra.Json.Model (Value)
 import Hydra.Testing
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Json as Json
+import qualified Hydra.Dsl.Json.Model as Json
 
 
 ns :: Namespace
@@ -31,7 +31,7 @@
     (Just "Test cases for JSON serialization")
   where
     elements = [
-        Phantoms.toBinding allTests]
+        Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Chars.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Chars.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Chars.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Chars.hs
@@ -27,7 +27,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.chars primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Test groups for hydra.lib.chars primitives
 
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Eithers.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Eithers.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Eithers.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Eithers.hs
@@ -27,7 +27,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.eithers primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Helper to create Left terms
 leftInt32 :: Int -> TTerm Term
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Equality.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Equality.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Equality.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Equality.hs
@@ -26,7 +26,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.equality primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Test groups for hydra.lib.equality primitives
 
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Flows.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Flows.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Flows.hs
+++ /dev/null
@@ -1,267 +0,0 @@
--- | Test cases for hydra.lib.flows primitives
-module Hydra.Sources.Test.Lib.Flows where
-
--- Standard imports for shallow DSL tests
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Testing                 as Testing
-import Hydra.Dsl.Meta.Terms                   as Terms
-import Hydra.Sources.Kernel.Types.All
-import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
-import qualified Hydra.Dsl.Meta.Types         as T
-import qualified Hydra.Sources.Test.TestGraph as TestGraph
-import qualified Hydra.Sources.Test.TestTerms as TestTerms
-import qualified Hydra.Sources.Test.TestTypes as TestTypes
-import qualified Data.List                    as L
-import qualified Data.Map                     as M
-
--- Additional imports specific to this file
-import Hydra.Testing
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Compute as Compute
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
-
-
-ns :: Namespace
-ns = Namespace "hydra.test.lib.flows"
-
-module_ :: Module
-module_ = Module ns elements [Monads.ns] kernelTypesNamespaces $
-    Just "Test cases for hydra.lib.flows primitives"
-  where
-    elements = [Phantoms.toBinding allTests]
-
--- | Trace at the TTerm Term level
-testTrace :: TTerm Term
-testTrace = traceTerm (list []) (list []) (Terms.map (Phantoms.map M.empty))
-
--- Test groups for hydra.lib.flows primitives
-
--- | Test cases for flows.pure: lifts a value into a successful flow
--- Note: This uses the kernel Monads.pure since the primitive doesn't have an eval implementation
-flowsPure :: TTerm TestGroup
-flowsPure = subgroup "pure" [
-  test "pure integer" (int32 42),
-  test "pure zero" (int32 0),
-  test "pure negative" (int32 (-5)),
-  test "pure string" (string "hello")]
-  where
-    test testName val = evalCase testName
-      (unFlowTerm @@ (metaref Monads.pure @@ val) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just val) unit testTrace)
-
--- | Test cases for flows.fail: creates a failing flow
--- Note: This uses the kernel Monads.fail since the primitive doesn't have an eval implementation
-flowsFail :: TTerm TestGroup
-flowsFail = subgroup "fail" [
-  test "fail with message"]
-  where
-    test testName = evalCase testName
-      (unFlowTerm @@ (metaref Monads.fail @@ string "test error message") @@ unit @@ testTrace)
-      (flowStateTerm (optional nothing) unit (traceWithMessages ["Error: test error message ()"]))
-    traceWithMessages msgs = traceTerm (list []) (list $ fmap string msgs) (Terms.map (Phantoms.map M.empty))
-
--- | Test cases for flows.map: transforms the value inside a flow
--- Tests the primitive _flows_map with kernel Monads.pure for flow construction
-flowsMap :: TTerm TestGroup
-flowsMap = subgroup "map" [
-  test "map negate" (primitive _math_negate) (int32 5) (int32 (-5)),
-  test "map abs" (primitive _math_abs) (int32 (-3)) (int32 3)]
-  where
-    test testName fn inVal outVal = evalCase testName
-      (unFlowTerm @@ (primitive _flows_map @@ fn @@ (metaref Monads.pure @@ inVal)) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just outVal) unit testTrace)
-
--- | Test cases for flows.bind: chains flow computations together
--- Uses kernel Monads.bind since the primitive isn't completing evaluation
-flowsBind :: TTerm TestGroup
-flowsBind = subgroup "bind" [
-  test "bind add" (primitive _math_add) (int32 5) (int32 5) (int32 10),
-  test "bind multiply" (primitive _math_mul) (int32 3) (int32 4) (int32 12)]
-  where
-    test testName op x y result = evalCase testName
-      (unFlowTerm @@ (metaref Monads.bind
-        @@ (metaref Monads.pure @@ x)
-        @@ (lambda "n" (metaref Monads.pure @@ (op @@ var "n" @@ y)))) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just result) unit testTrace)
-
--- | Test cases for flows.apply: applies a function inside a flow to a value inside a flow
--- This test uses kernel Monads definitions to construct the apply operation.
-flowsApply :: TTerm TestGroup
-flowsApply = subgroup "apply" [
-  test "apply add" (int32 8)]
-  where
-    -- apply (pure (add 3)) (pure 5) = pure 8
-    -- Using Monads definitions: bind flowFun (\f -> bind flowArg (\x -> pure (f x)))
-    test testName result =
-      let flowFun = metaref Monads.pure @@ (primitive _math_add @@ int32 3)
-          flowArg = metaref Monads.pure @@ int32 5
-          -- Build the nested bind structure using kernel definitions
-          applyTerm = metaref Monads.bind @@ flowFun @@
-            (lambda "f" (metaref Monads.bind @@ flowArg @@
-              (lambda "x" (metaref Monads.pure @@ (var "f" @@ var "x")))))
-      in evalCase testName
-        (unFlowTerm @@ applyTerm @@ unit @@ testTrace)
-        (flowStateTerm (optional $ just result) unit testTrace)
-
--- | Test cases for flows.foldl: folds over a list with flow-returning function
--- Manually constructs the fold using kernel Monads.bind/pure
-flowsFoldl :: TTerm TestGroup
-flowsFoldl = subgroup "foldl" [
-  test "foldl sum"]
-  where
-    -- foldl (\acc x -> pure (acc + x)) 0 [1,2,3] = pure 6
-    -- Unrolled: bind (pure 0 >>= \a0 -> pure (a0+1)) >>= \a1 -> bind (pure (a1+2)) >>= \a2 -> pure (a2+3)
-    -- Simplified: bind (pure 1) >>= \a1 -> bind (pure (a1+2)) >>= \a2 -> pure (a2+3)
-    test testName = evalCase testName
-      (unFlowTerm @@ foldTerm @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just (int32 6)) unit testTrace)
-    -- Manually unroll: foldl (+) 0 [1,2,3] using bind
-    foldTerm =
-      metaref Monads.bind @@ (metaref Monads.pure @@ int32 0) @@
-        (lambda "a0" $ metaref Monads.bind @@ (metaref Monads.pure @@ (primitive _math_add @@ var "a0" @@ int32 1)) @@
-          (lambda "a1" $ metaref Monads.bind @@ (metaref Monads.pure @@ (primitive _math_add @@ var "a1" @@ int32 2)) @@
-            (lambda "a2" $ metaref Monads.pure @@ (primitive _math_add @@ var "a2" @@ int32 3))))
-
--- | Test cases for flows.mapList: maps a flow-returning function over a list
--- Manually constructs the mapList using kernel Monads.bind/pure
-flowsMapList :: TTerm TestGroup
-flowsMapList = subgroup "mapList" [
-  test "mapList add one"]
-  where
-    -- mapList (\n -> pure (n + 1)) [1,2,3] = pure [2,3,4]
-    -- Unrolled: bind (pure 2) (\y1 -> bind (pure 3) (\y2 -> bind (pure 4) (\y3 -> pure [y1,y2,y3])))
-    test testName = evalCase testName
-      (unFlowTerm @@ mapListTerm @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just (list [int32 2, int32 3, int32 4])) unit testTrace)
-    addOne n = metaref Monads.pure @@ (primitive _math_add @@ n @@ int32 1)
-    mapListTerm =
-      metaref Monads.bind @@ addOne (int32 1) @@
-        (lambda "y1" $ metaref Monads.bind @@ addOne (int32 2) @@
-          (lambda "y2" $ metaref Monads.bind @@ addOne (int32 3) @@
-            (lambda "y3" $ metaref Monads.pure @@ list [var "y1", var "y2", var "y3"])))
-
--- | Test cases for flows.sequence: sequences a list of flows into a flow of list
--- Manually constructs using kernel Monads.bind/pure
-flowsSequence :: TTerm TestGroup
-flowsSequence = subgroup "sequence" [
-  test "sequence pure list"]
-  where
-    -- sequence [pure 1, pure 2, pure 3] = pure [1,2,3]
-    -- Unrolled: bind (pure 1) (\x1 -> bind (pure 2) (\x2 -> bind (pure 3) (\x3 -> pure [x1,x2,x3])))
-    test testName = evalCase testName
-      (unFlowTerm @@ sequenceTerm @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just (list [int32 1, int32 2, int32 3])) unit testTrace)
-    sequenceTerm =
-      metaref Monads.bind @@ (metaref Monads.pure @@ int32 1) @@
-        (lambda "x1" $ metaref Monads.bind @@ (metaref Monads.pure @@ int32 2) @@
-          (lambda "x2" $ metaref Monads.bind @@ (metaref Monads.pure @@ int32 3) @@
-            (lambda "x3" $ metaref Monads.pure @@ list [var "x1", var "x2", var "x3"])))
-
--- | Test cases for flows.mapMaybe: maps a flow-returning function over a Maybe
--- Manually constructs using kernel Monads operations
-flowsMapMaybe :: TTerm TestGroup
-flowsMapMaybe = subgroup "mapMaybe" [
-  testJust "mapMaybe just" (int32 5) (int32 6),
-  testNothing "mapMaybe nothing"]
-  where
-    -- mapMaybe (\n -> pure (n + 1)) (Just 5) = pure (Just 6)
-    testJust testName inVal outVal = evalCase testName
-      (unFlowTerm @@ (metaref Monads.bind @@ addOnePure inVal @@
-        (lambda "y" $ metaref Monads.pure @@ (optional $ just (var "y")))) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just (optional $ just outVal)) unit testTrace)
-    -- mapMaybe (\n -> pure (n + 1)) Nothing = pure Nothing
-    testNothing testName = evalCase testName
-      (unFlowTerm @@ (metaref Monads.pure @@ (optional nothing)) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just (optional nothing)) unit testTrace)
-    addOnePure n = metaref Monads.pure @@ (primitive _math_add @@ n @@ int32 1)
-
--- | Test cases for flows.mapSet: maps a flow-returning function over a Set
--- Manually constructs using kernel Monads operations
-flowsMapSet :: TTerm TestGroup
-flowsMapSet = subgroup "mapSet" [
-  test "mapSet add one"]
-  where
-    -- mapSet (\n -> pure (n + 1)) {1,2,3} = pure {2,3,4}
-    -- Unrolled similar to mapList, then convert to set
-    test testName = evalCase testName
-      (unFlowTerm @@ mapSetTerm @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just (Core.termSet $ Phantoms.set [int32 2, int32 3, int32 4])) unit testTrace)
-    addOne n = metaref Monads.pure @@ (primitive _math_add @@ n @@ int32 1)
-    -- Build: bind (addOne 1) (\y1 -> bind (addOne 2) (\y2 -> bind (addOne 3) (\y3 -> pure (fromList [y1,y2,y3]))))
-    mapSetTerm =
-      metaref Monads.bind @@ addOne (int32 1) @@
-        (lambda "y1" $ metaref Monads.bind @@ addOne (int32 2) @@
-          (lambda "y2" $ metaref Monads.bind @@ addOne (int32 3) @@
-            (lambda "y3" $ metaref Monads.pure @@ (primitive _sets_fromList @@ list [var "y1", var "y2", var "y3"]))))
-
--- | Test cases for flows.mapElems: maps a flow-returning function over Map values
--- Manually constructs using kernel Monads operations
-flowsMapElems :: TTerm TestGroup
-flowsMapElems = subgroup "mapElems" [
-  test "mapElems add one"]
-  where
-    -- mapElems (\v -> pure (v + 1)) {a:1, b:2} = pure {a:2, b:3}
-    -- Unrolled: bind (addOne 1) (\v1 -> bind (addOne 2) (\v2 -> pure (fromList [("a",v1),("b",v2)])))
-    test testName = evalCase testName
-      (unFlowTerm @@ mapElemsTerm @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just expectedMap) unit testTrace)
-    addOne n = metaref Monads.pure @@ (primitive _math_add @@ n @@ int32 1)
-    expectedMap = Core.termMap $ Phantoms.map $ M.fromList [(string "a", int32 2), (string "b", int32 3)]
-    mapElemsTerm =
-      metaref Monads.bind @@ addOne (int32 1) @@
-        (lambda "v1" $ metaref Monads.bind @@ addOne (int32 2) @@
-          (lambda "v2" $ metaref Monads.pure @@
-            (primitive _maps_fromList @@ list [pair (string "a") (var "v1"), pair (string "b") (var "v2")])))
-
--- | Test cases for flows.mapKeys: maps a flow-returning function over Map keys
--- Manually constructs using kernel Monads operations
-flowsMapKeys :: TTerm TestGroup
-flowsMapKeys = subgroup "mapKeys" [
-  test "mapKeys add one"]
-  where
-    -- mapKeys (\k -> pure (k + 1)) {1:a, 2:b} = pure {2:a, 3:b}
-    -- Unrolled: bind (addOne 1) (\k1 -> bind (addOne 2) (\k2 -> pure (fromList [(k1,"a"),(k2,"b")])))
-    test testName = evalCase testName
-      (unFlowTerm @@ mapKeysTerm @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just expectedMap) unit testTrace)
-    addOne n = metaref Monads.pure @@ (primitive _math_add @@ n @@ int32 1)
-    expectedMap = Core.termMap $ Phantoms.map $ M.fromList [(int32 2, string "a"), (int32 3, string "b")]
-    mapKeysTerm =
-      metaref Monads.bind @@ addOne (int32 1) @@
-        (lambda "k1" $ metaref Monads.bind @@ addOne (int32 2) @@
-          (lambda "k2" $ metaref Monads.pure @@
-            (primitive _maps_fromList @@ list [pair (var "k1") (string "a"), pair (var "k2") (string "b")])))
-
--- | Test cases for flows.withDefault: uses fallback value if flow fails
-flowsWithDefault :: TTerm TestGroup
-flowsWithDefault = subgroup "withDefault" [
-  testSuccess "withDefault on success returns original",
-  testFailure "withDefault on failure returns fallback"]
-  where
-    -- withDefault 0 (pure 42) = pure 42 (success case)
-    testSuccess testName = evalCase testName
-      (unFlowTerm @@ (primitive _flows_withDefault @@ int32 0 @@ (metaref Monads.pure @@ int32 42)) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just (int32 42)) unit testTrace)
-    -- withDefault 99 (fail "error") = pure 99 (failure case - uses fallback)
-    testFailure testName = evalCase testName
-      (unFlowTerm @@ (primitive _flows_withDefault @@ int32 99 @@ (metaref Monads.fail @@ string "error")) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just (int32 99)) unit testTrace)
-
-allTests :: TBinding TestGroup
-allTests = definitionInModule module_ "allTests" $
-    Phantoms.doc "Test cases for hydra.lib.flows primitives" $
-    supergroup "hydra.lib.flows primitives" [
-      flowsApply,
-      flowsBind,
-      flowsFail,
-      flowsFoldl,
-      flowsMap,
-      flowsMapElems,
-      flowsMapKeys,
-      flowsMapList,
-      flowsMapMaybe,
-      flowsMapSet,
-      flowsPure,
-      flowsSequence,
-      flowsWithDefault]
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Lists.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Lists.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Lists.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Lists.hs
@@ -29,7 +29,7 @@
     (Just "Test cases for hydra.lib.lists primitives")
   where
     elements = [
-      Phantoms.toBinding allTests]
+      Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -68,6 +68,7 @@
       listsFilter,
       listsFind,
       listsFoldl,
+      listsFoldr,
       listsGroup,
       listsHead,
       listsInit,
@@ -207,7 +208,16 @@
         test "subtraction fold" (primitive _math_sub) 10 [1, 2, 3] 4]
         where
           test name op acc lst result = primCase name _lists_foldl [op, int32 acc, intList lst] (int32 result)
-  
+
+      listsFoldr = subgroup "foldr" [
+        test "subtraction fold right" (primitive _math_sub) 0 [1, 2, 3] 2,
+        test "empty list" (primitive _math_add) 5 [] 5,
+        test "single element" (primitive _math_add) 10 [5] 15,
+        test "sum with addition" (primitive _math_add) 0 [1, 2, 3, 4] 10,
+        test "subtraction vs foldl" (primitive _math_sub) 10 [1, 2, 3] (-8)]
+        where
+          test name op acc lst result = primCase name _lists_foldr [op, int32 acc, intList lst] (int32 result)
+
       listsGroup = subgroup "group" [
         test "consecutive duplicates" [1, 1, 2, 2, 2, 3, 1] [[1, 1], [2, 2, 2], [3], [1]],
         test "no duplicates" [1, 2, 3] [[1], [2], [3]],
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Literals.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Literals.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Literals.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Literals.hs
@@ -28,7 +28,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.literals primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Test groups for hydra.lib.literals primitives
 -- Note: Testing a representative subset of the many literal conversion functions
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Logic.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Logic.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Logic.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Logic.hs
@@ -26,7 +26,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.logic primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Test groups for hydra.lib.logic primitives
 
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Maps.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Maps.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Maps.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Maps.hs
@@ -27,7 +27,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.maps primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 emptyStringMap = intStringMap []
 intStringMapOrEmpty = intStringMap
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Math.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Math.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Math.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Math.hs
@@ -17,6 +17,7 @@
 -- Additional imports specific to this file
 import Hydra.Testing
 import Hydra.Sources.Libraries
+import qualified Hydra.Lib.Math as Math
 
 
 ns :: Namespace
@@ -26,7 +27,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.math primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Test groups for hydra.lib.math primitives
 
@@ -177,127 +178,181 @@
     test name x result = primCase name _math_succ [int32 x] (int32 result)
 
 -- Float64 tests
+--
+-- Note on floating-point portability (see also docs/recipes/extending-tests.md):
+-- Transcendental functions (sin, cos, exp, atanh, etc.) are implemented via the platform's
+-- C math library (libm), which is NOT required by IEEE 754 to produce bit-identical results
+-- across platforms. Even GHC delegates to libm, so Haskell-computed expected values like
+-- (sinh 1.0) can differ by 1 ULP between macOS and Linux.
+--
+-- When adding float64 test cases for transcendental functions:
+--   * Prefer inputs that produce exact results: sin(0)=0, exp(0)=1, sqrt(4)=2
+--   * If a non-trivial input is needed, use roundFloat64 (or roundFloat32/roundBigfloat)
+--     on both the expected value and the test input's expected result to eliminate
+--     platform-dependent rounding in the last digit.
 
+-- | Number of significant digits to use when rounding transcendental results
+-- for platform-independent comparison. 12 digits is well within float64 precision
+-- (which has ~15.9 significant digits) while safely absorbing 1-ULP differences.
+roundDigits :: Int
+roundDigits = 12
+
+-- | Build a test case that rounds both the computed and expected results to
+-- a fixed number of significant digits using roundFloat64. This makes
+-- transcendental function tests portable across platforms with different libm
+-- implementations.
+roundedPrimCase1 :: String -> Name -> Double -> Double -> TTerm TestCaseWithMetadata
+roundedPrimCase1 cname primName x result = evalCase cname input output
+  where
+    input = Terms.primitive _math_roundFloat64 @@ int32 roundDigits @@ (Terms.primitive primName @@ float64 x)
+    output = float64 (Math.roundFloat64 roundDigits result)
+
+roundedPrimCase2 :: String -> Name -> Double -> Double -> Double -> TTerm TestCaseWithMetadata
+roundedPrimCase2 cname primName x y result = evalCase cname input output
+  where
+    input = Terms.primitive _math_roundFloat64 @@ int32 roundDigits @@ (Terms.primitive primName @@ float64 x @@ float64 y)
+    output = float64 (Math.roundFloat64 roundDigits result)
+
 mathE :: TTerm TestGroup
 mathE = subgroup "e" [
-  test "Euler's number"]
-  where
-    test name = primCase name _math_e [] (float64 (exp 1))
+  evalCase "Euler's number"
+    (Terms.primitive _math_roundFloat64 @@ int32 roundDigits @@ Terms.primitive _math_e)
+    (float64 (Math.roundFloat64 roundDigits (exp 1)))]
 
 mathPi :: TTerm TestGroup
 mathPi = subgroup "pi" [
-  test "pi constant"]
-  where
-    test name = primCase name _math_pi [] (float64 pi)
+  evalCase "pi constant"
+    (Terms.primitive _math_roundFloat64 @@ int32 roundDigits @@ Terms.primitive _math_pi)
+    (float64 (Math.roundFloat64 roundDigits pi))]
 
 mathSin :: TTerm TestGroup
 mathSin = subgroup "sin" [
   test "sin 0" 0.0 0.0,
-  test "sin pi/2" (pi / 2) 1.0,
-  test "sin pi" pi (sin pi)]  -- Use actual computed value for precision
+  roundedPrimCase1 "sin pi/2" _math_sin (pi / 2) 1.0,
+  roundedPrimCase1 "sin pi" _math_sin pi (sin pi),
+  roundedPrimCase1 "sin 1" _math_sin 1.0 (sin 1.0),
+  roundedPrimCase1 "sin 0.5" _math_sin 0.5 (sin 0.5)]
   where
     test name x result = primCase name _math_sin [float64 x] (float64 result)
 
 mathCos :: TTerm TestGroup
 mathCos = subgroup "cos" [
   test "cos 0" 0.0 1.0,
-  test "cos pi/2" (pi / 2) (cos (pi / 2)),  -- Use actual computed value for precision
-  test "cos pi" pi (-1.0)]
+  roundedPrimCase1 "cos pi/2" _math_cos (pi / 2) (cos (pi / 2)),
+  test "cos pi" pi (-1.0),
+  roundedPrimCase1 "cos 1" _math_cos 1.0 (cos 1.0),
+  roundedPrimCase1 "cos 0.5" _math_cos 0.5 (cos 0.5)]
   where
     test name x result = primCase name _math_cos [float64 x] (float64 result)
 
 mathTan :: TTerm TestGroup
 mathTan = subgroup "tan" [
   test "tan 0" 0.0 0.0,
-  test "tan pi/4" (pi / 4) (tan (pi / 4))]  -- Use actual computed value for precision
+  roundedPrimCase1 "tan pi/4" _math_tan (pi / 4) (tan (pi / 4)),
+  roundedPrimCase1 "tan 1" _math_tan 1.0 (tan 1.0),
+  roundedPrimCase1 "tan 0.5" _math_tan 0.5 (tan 0.5)]
   where
     test name x result = primCase name _math_tan [float64 x] (float64 result)
 
 mathAsin :: TTerm TestGroup
 mathAsin = subgroup "asin" [
   test "asin 0" 0.0 0.0,
-  test "asin 1" 1.0 (pi / 2),
-  test "asin -1" (-1.0) (-(pi / 2))]
+  roundedPrimCase1 "asin 1" _math_asin 1.0 (pi / 2),
+  roundedPrimCase1 "asin -1" _math_asin (-1.0) (-(pi / 2)),
+  roundedPrimCase1 "asin 0.5" _math_asin 0.5 (asin 0.5)]
   where
     test name x result = primCase name _math_asin [float64 x] (float64 result)
 
 mathAcos :: TTerm TestGroup
 mathAcos = subgroup "acos" [
   test "acos 1" 1.0 0.0,
-  test "acos 0" 0.0 (pi / 2),
-  test "acos -1" (-1.0) pi]
+  roundedPrimCase1 "acos 0" _math_acos 0.0 (pi / 2),
+  roundedPrimCase1 "acos -1" _math_acos (-1.0) pi,
+  roundedPrimCase1 "acos 0.5" _math_acos 0.5 (acos 0.5)]
   where
     test name x result = primCase name _math_acos [float64 x] (float64 result)
 
 mathAtan :: TTerm TestGroup
 mathAtan = subgroup "atan" [
   test "atan 0" 0.0 0.0,
-  test "atan 1" 1.0 (pi / 4)]
+  roundedPrimCase1 "atan 1" _math_atan 1.0 (pi / 4),
+  roundedPrimCase1 "atan 0.5" _math_atan 0.5 (atan 0.5)]
   where
     test name x result = primCase name _math_atan [float64 x] (float64 result)
 
 mathAtan2 :: TTerm TestGroup
 mathAtan2 = subgroup "atan2" [
-  test "atan2 1 1" 1.0 1.0 (pi / 4),
-  test "atan2 1 0" 1.0 0.0 (pi / 2),
-  test "atan2 0 1" 0.0 1.0 0.0]
+  roundedPrimCase2 "atan2 1 1" _math_atan2 1.0 1.0 (pi / 4),
+  roundedPrimCase2 "atan2 1 0" _math_atan2 1.0 0.0 (pi / 2),
+  test "atan2 0 1" 0.0 1.0 0.0,
+  roundedPrimCase2 "atan2 3 4" _math_atan2 3.0 4.0 (atan2 3.0 4.0)]
   where
     test name y x result = primCase name _math_atan2 [float64 y, float64 x] (float64 result)
 
 mathSinh :: TTerm TestGroup
 mathSinh = subgroup "sinh" [
   test "sinh 0" 0.0 0.0,
-  test "sinh 1" 1.0 (sinh 1.0)]
+  roundedPrimCase1 "sinh 1" _math_sinh 1.0 (sinh 1.0),
+  roundedPrimCase1 "sinh 2" _math_sinh 2.0 (sinh 2.0)]
   where
     test name x result = primCase name _math_sinh [float64 x] (float64 result)
 
 mathCosh :: TTerm TestGroup
 mathCosh = subgroup "cosh" [
   test "cosh 0" 0.0 1.0,
-  test "cosh 1" 1.0 (cosh 1.0)]
+  roundedPrimCase1 "cosh 1" _math_cosh 1.0 (cosh 1.0),
+  roundedPrimCase1 "cosh 2" _math_cosh 2.0 (cosh 2.0)]
   where
     test name x result = primCase name _math_cosh [float64 x] (float64 result)
 
 mathTanh :: TTerm TestGroup
 mathTanh = subgroup "tanh" [
   test "tanh 0" 0.0 0.0,
-  test "tanh 1" 1.0 (tanh 1.0)]
+  roundedPrimCase1 "tanh 1" _math_tanh 1.0 (tanh 1.0),
+  roundedPrimCase1 "tanh 0.5" _math_tanh 0.5 (tanh 0.5)]
   where
     test name x result = primCase name _math_tanh [float64 x] (float64 result)
 
 mathAsinh :: TTerm TestGroup
 mathAsinh = subgroup "asinh" [
   test "asinh 0" 0.0 0.0,
-  test "asinh 1" 1.0 (asinh 1.0)]
+  roundedPrimCase1 "asinh 1" _math_asinh 1.0 (asinh 1.0),
+  roundedPrimCase1 "asinh 0.5" _math_asinh 0.5 (asinh 0.5)]
   where
     test name x result = primCase name _math_asinh [float64 x] (float64 result)
 
 mathAcosh :: TTerm TestGroup
 mathAcosh = subgroup "acosh" [
   test "acosh 1" 1.0 0.0,
-  test "acosh 2" 2.0 (acosh 2.0)]
+  roundedPrimCase1 "acosh 2" _math_acosh 2.0 (acosh 2.0),
+  roundedPrimCase1 "acosh 3" _math_acosh 3.0 (acosh 3.0)]
   where
     test name x result = primCase name _math_acosh [float64 x] (float64 result)
 
 mathAtanh :: TTerm TestGroup
 mathAtanh = subgroup "atanh" [
   test "atanh 0" 0.0 0.0,
-  test "atanh 0.5" 0.5 (atanh 0.5)]
+  roundedPrimCase1 "atanh 0.5" _math_atanh 0.5 (atanh 0.5),
+  roundedPrimCase1 "atanh 0.1" _math_atanh 0.1 (atanh 0.1)]
   where
     test name x result = primCase name _math_atanh [float64 x] (float64 result)
 
 mathExp :: TTerm TestGroup
 mathExp = subgroup "exp" [
   test "exp 0" 0.0 1.0,
-  test "exp 1" 1.0 (exp 1.0),
-  test "exp -1" (-1.0) (exp (-1.0))]
+  roundedPrimCase1 "exp 1" _math_exp 1.0 (exp 1.0),
+  roundedPrimCase1 "exp -1" _math_exp (-1.0) (exp (-1.0)),
+  roundedPrimCase1 "exp 2" _math_exp 2.0 (exp 2.0),
+  roundedPrimCase1 "exp 0.5" _math_exp 0.5 (exp 0.5)]
   where
     test name x result = primCase name _math_exp [float64 x] (float64 result)
 
 mathLog :: TTerm TestGroup
 mathLog = subgroup "log" [
   test "log 1" 1.0 0.0,
-  test "log e" (exp 1.0) 1.0]
+  roundedPrimCase1 "log e" _math_log (exp 1.0) 1.0,
+  roundedPrimCase1 "log 2" _math_log 2.0 (log 2.0),
+  roundedPrimCase1 "log 10" _math_log 10.0 (log 10.0)]
   where
     test name x result = primCase name _math_log [float64 x] (float64 result)
 
@@ -306,7 +361,8 @@
   test "log10 1" 10.0 1.0 0.0,
   test "log10 10" 10.0 10.0 1.0,
   test "log10 100" 10.0 100.0 2.0,
-  test "log2 8" 2.0 8.0 3.0]
+  test "log2 8" 2.0 8.0 3.0,
+  roundedPrimCase2 "log2 10" _math_logBase 2.0 10.0 (logBase 2.0 10.0)]
   where
     test name base x result = primCase name _math_logBase [float64 base, float64 x] (float64 result)
 
@@ -314,7 +370,8 @@
 mathPow = subgroup "pow" [
   test "2^3" 2.0 3.0 8.0,
   test "10^0" 10.0 0.0 1.0,
-  test "2^-1" 2.0 (-1.0) 0.5]
+  test "2^-1" 2.0 (-1.0) 0.5,
+  roundedPrimCase2 "2^0.5" _math_pow 2.0 0.5 (2.0 ** 0.5)]
   where
     test name base exp result = primCase name _math_pow [float64 base, float64 exp] (float64 result)
 
@@ -323,7 +380,8 @@
   test "sqrt 4" 4.0 2.0,
   test "sqrt 9" 9.0 3.0,
   test "sqrt 2" 2.0 (sqrt 2.0),
-  test "sqrt 0" 0.0 0.0]
+  test "sqrt 0" 0.0 0.0,
+  roundedPrimCase1 "sqrt 3" _math_sqrt 3.0 (sqrt 3.0)]
   where
     test name x result = primCase name _math_sqrt [float64 x] (float64 result)
 
@@ -355,6 +413,37 @@
   where
     test name x result = primCase name _math_round [float64 x] (bigint result)
 
+mathRoundBigfloat :: TTerm TestGroup
+mathRoundBigfloat = subgroup "roundBigfloat" [
+  test "zero" 5 0.0 0.0,
+  test "round pi to 4 digits" 4 3.141592653589793 3.142,
+  test "round 1234.5 to 3 digits" 3 1234.5 1230.0,
+  test "round 0.001234 to 2 digits" 2 0.001234 0.0012,
+  test "negative" 3 (-1234.5) (-1230.0)]
+  where
+    test name n x result = primCase name _math_roundBigfloat [int32 n, bigfloat x] (bigfloat result)
+
+mathRoundFloat32 :: TTerm TestGroup
+mathRoundFloat32 = subgroup "roundFloat32" [
+  test "zero" 5 0.0 0.0,
+  test "round pi to 4 digits" 4 3.1415927 3.142,
+  test "round 1234.5 to 3 digits" 3 1234.5 1230.0,
+  test "negative" 3 (-1234.5) (-1230.0)]
+  where
+    test name n x result = primCase name _math_roundFloat32 [int32 n, float32 x] (float32 result)
+
+mathRoundFloat64 :: TTerm TestGroup
+mathRoundFloat64 = subgroup "roundFloat64" [
+  test "zero" 5 0.0 0.0,
+  test "round pi to 4 digits" 4 3.141592653589793 3.142,
+  test "round pi to 10 digits" 10 3.141592653589793 3.141592654,
+  test "round 1234.5 to 3 digits" 3 1234.5 1230.0,
+  test "round 0.001234 to 2 digits" 2 0.001234 0.0012,
+  test "negative" 3 (-1234.5) (-1230.0),
+  test "round 1 digit" 1 9.876 10.0]
+  where
+    test name n x result = primCase name _math_roundFloat64 [int32 n, float64 x] (float64 result)
+
 mathTruncate :: TTerm TestGroup
 mathTruncate = subgroup "truncate" [
   test "truncate 3.8" 3.8 3,
@@ -409,4 +498,7 @@
       mathCeiling,
       mathFloor,
       mathRound,
+      mathRoundBigfloat,
+      mathRoundFloat32,
+      mathRoundFloat64,
       mathTruncate]
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Maybes.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Maybes.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Maybes.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Maybes.hs
@@ -26,7 +26,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.maybes primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Helper to create Just terms for Int32 values
 justInt32 :: Int -> TTerm Term
@@ -169,6 +169,13 @@
     test name input expected = primCase name _maybes_compose [funF, funG, int32 input] (justInt32 expected)
     testFails name input = primCase name _maybes_compose [funF, funG, int32 input] nothingTerm
 
+maybesToList :: TTerm TestGroup
+maybesToList = subgroup "toList" [
+  test "just value" (justInt32 42) [42],
+  test "nothing" nothingTerm []]
+  where
+    test name x expected = primCase name _maybes_toList [x] (list $ fmap int32 expected)
+
 allTests :: TBinding TestGroup
 allTests = definitionInModule module_ "allTests" $
     Phantoms.doc "Test cases for hydra.lib.maybes primitives" $
@@ -185,4 +192,5 @@
       maybesMap,
       maybesMapMaybe,
       maybesMaybe,
-      maybesPure]
+      maybesPure,
+      maybesToList]
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Pairs.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Pairs.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Pairs.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Pairs.hs
@@ -26,7 +26,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.pairs primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Helper to create pair terms
 pairTerm :: Int -> String -> TTerm Term
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Regex.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Regex.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Regex.hs
@@ -0,0 +1,121 @@
+module Hydra.Sources.Test.Lib.Regex where
+
+-- Standard imports for shallow DSL tests
+import Hydra.Kernel
+import Hydra.Dsl.Meta.Testing                 as Testing
+import Hydra.Dsl.Meta.Terms                   as Terms
+import Hydra.Sources.Kernel.Types.All
+import qualified Hydra.Dsl.Meta.Core          as Core
+import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
+import qualified Hydra.Dsl.Meta.Types         as T
+import qualified Hydra.Sources.Test.TestGraph as TestGraph
+import qualified Hydra.Sources.Test.TestTerms as TestTerms
+import qualified Hydra.Sources.Test.TestTypes as TestTypes
+import qualified Data.List                    as L
+import qualified Data.Map                     as M
+
+-- Additional imports specific to this file
+import Hydra.Testing
+import Hydra.Sources.Libraries
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.lib.regex"
+
+module_ :: Module
+module_ = Module ns elements
+    [TestGraph.ns]
+    kernelTypesNamespaces
+    (Just "Test cases for hydra.lib.regex primitives")
+  where
+    elements = [
+        Phantoms.toTermDefinition allTests]
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+allTests :: TBinding TestGroup
+allTests = define "allTests" $
+    Phantoms.doc "Test cases for hydra.lib.regex primitives" $
+    supergroup "hydra.lib.regex primitives" [
+      regexMatches,
+      regexFind,
+      regexFindAll,
+      regexReplace,
+      regexReplaceAll,
+      regexSplit]
+    where
+      regexMatches = subgroup "matches" [
+        -- Basic matching
+        test2 "exact match" "hello" "hello" True,
+        test2 "pattern match" "[a-z]+" "hello" True,
+        test2 "no match" "[0-9]+" "hello" False,
+
+        -- Anchoring behavior (matches checks full string)
+        test2 "partial content does not match" "[a-z]+" "hello123" False,
+        test2 "digit pattern" "[0-9]+" "12345" True,
+        test2 "mixed pattern" "[a-z]+[0-9]+" "hello123" True,
+
+        -- Empty string
+        test2 "empty pattern matches empty" "" "" True,
+        test2 "empty pattern does not match non-empty" "" "hello" False,
+        test2 "star matches empty" "a*" "" True,
+
+        -- Special regex features
+        test2 "alternation" "cat|dog" "cat" True,
+        test2 "alternation second" "cat|dog" "dog" True,
+        test2 "alternation no match" "cat|dog" "bird" False,
+        test2 "quantifier" "ab?c" "ac" True,
+        test2 "quantifier with optional" "ab?c" "abc" True]
+        where
+          test2 name pat input result =
+            primCase name _regex_matches [string pat, string input] (boolean result)
+
+      regexFind = subgroup "find" [
+        test2 "simple find" "[0-9]+" "abc123def" (Just "123"),
+        test2 "no match" "[0-9]+" "abcdef" Nothing,
+        test2 "find first" "[a-z]+" "123abc456def" (Just "abc"),
+        test2 "empty input" "[0-9]+" "" Nothing,
+        test2 "full match" ".*" "hello" (Just "hello")]
+        where
+          test2 name pat input result =
+            primCase name _regex_find [string pat, string input] (Core.termMaybe $ optStr result)
+          optStr Nothing = nothing
+          optStr (Just s) = just (string s)
+
+      regexFindAll = subgroup "findAll" [
+        test2 "multiple matches" "[0-9]+" "a1b2c3" ["1", "2", "3"],
+        test2 "no matches" "[0-9]+" "abc" [],
+        test2 "overlapping words" "[a-z]+" "abc def ghi" ["abc", "def", "ghi"],
+        test2 "single match" "hello" "say hello world" ["hello"]]
+        where
+          test2 name pat input result =
+            primCase name _regex_findAll [string pat, string input] (list (string <$> result))
+
+      regexReplace = subgroup "replace" [
+        test3 "basic replace" "[0-9]+" "X" "abc123def456" "abcXdef456",
+        test3 "no match" "[0-9]+" "X" "abcdef" "abcdef",
+        test3 "replace at start" "^[a-z]+" "X" "abc123" "X123",
+        test3 "empty replacement" "[0-9]+" "" "abc123def" "abcdef"]
+        where
+          test3 name pat repl input result =
+            primCase name _regex_replace [string pat, string repl, string input] (string result)
+
+      regexReplaceAll = subgroup "replaceAll" [
+        test3 "replace all digits" "[0-9]+" "X" "a1b2c3" "aXbXcX",
+        test3 "no match" "[0-9]+" "X" "abc" "abc",
+        test3 "replace all words" "[a-z]+" "X" "abc 123 def" "X 123 X",
+        test3 "empty replacement" "[0-9]+" "" "a1b2c3" "abc"]
+        where
+          test3 name pat repl input result =
+            primCase name _regex_replaceAll [string pat, string repl, string input] (string result)
+
+      regexSplit = subgroup "split" [
+        test2 "split on comma" "," "a,b,c" ["a", "b", "c"],
+        test2 "split on spaces" " +" "a b  c" ["a", "b", "c"],
+        test2 "no match" "," "abc" ["abc"],
+        test2 "split on digits" "[0-9]+" "a1b2c" ["a", "b", "c"],
+        test2 "trailing delimiter" "," "a,b," ["a", "b", ""]]
+        where
+          test2 name pat input result =
+            primCase name _regex_split [string pat, string input] (list (string <$> result))
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Sets.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Sets.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Sets.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Sets.hs
@@ -26,7 +26,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for hydra.lib.sets primitives"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 emptyStringSet = intSet []
 intSetOrEmpty = intSet
diff --git a/src/main/haskell/Hydra/Sources/Test/Lib/Strings.hs b/src/main/haskell/Hydra/Sources/Test/Lib/Strings.hs
--- a/src/main/haskell/Hydra/Sources/Test/Lib/Strings.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Lib/Strings.hs
@@ -29,7 +29,7 @@
     (Just "Test cases for hydra.lib.strings primitives")
   where
     elements = [
-        Phantoms.toBinding allTests]
+        Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Monads.hs b/src/main/haskell/Hydra/Sources/Test/Monads.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Sources/Test/Monads.hs
+++ /dev/null
@@ -1,96 +0,0 @@
--- | Test cases for hydra.monads functions
-module Hydra.Sources.Test.Monads where
-
--- Standard imports for shallow DSL tests
-import Hydra.Kernel
-import Hydra.Dsl.Meta.Testing                 as Testing
-import Hydra.Dsl.Meta.Terms                   as Terms
-import Hydra.Sources.Kernel.Types.All
-import qualified Hydra.Dsl.Meta.Core          as Core
-import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
-import qualified Hydra.Dsl.Meta.Types         as T
-import qualified Hydra.Sources.Test.TestGraph as TestGraph
-import qualified Hydra.Sources.Test.TestTerms as TestTerms
-import qualified Hydra.Sources.Test.TestTypes as TestTypes
-import qualified Data.List                    as L
-import qualified Data.Map                     as M
-
-import Hydra.Testing
-import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Compute as Compute
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
-import qualified Hydra.Sources.Kernel.Terms.Constants as Constants
-
-
-ns :: Namespace
-ns = Namespace "hydra.test.monads"
-
-module_ :: Module
-module_ = Module ns elements [Monads.ns] [] $
-    Just "Test cases for hydra.monads functions"
-  where
-    elements = [Phantoms.toBinding allTests]
-
-testTrace :: TTerm Term
-testTrace = traceTerm (list []) (list []) (Terms.map (Phantoms.map M.empty))
-
--- | Test cases for pure: lifts a value into a successful flow
-pureTests :: TTerm TestGroup
-pureTests = subgroup "pure" [
-  test "integer" (int32 42),
-  test "string" (string "hello")]
-  where
-    test testName val = evalCaseWithTags testName []
-      (unFlowTerm @@ (metaref Monads.pure @@ val) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just val) unit testTrace)
-
--- | Test cases for map: transforms the value inside a flow
-mapTests :: TTerm TestGroup
-mapTests = subgroup "map" [
-  test "map negate" (primitive _math_negate) (int32 5) (int32 (-5)),
-  test "map absolute" (primitive _math_abs) (int32 (-3)) (int32 3)]
-  where
-    test testName fn inVal outVal = evalCase testName
-      (unFlowTerm @@ (metaref Monads.map @@ fn @@ (metaref Monads.pure @@ inVal)) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just outVal) unit testTrace)
-
--- | Test cases for bind: chains flow computations together
-bindTests :: TTerm TestGroup
-bindTests = subgroup "bind" [
-  test "bind add" (primitive _math_add) (int32 10) (int32 5) (int32 15),
-  test "bind multiply" (primitive _math_mul) (int32 3) (int32 4) (int32 12)]
-  where
-    test testName op x y result = evalCase testName
-      (unFlowTerm @@ (metaref Monads.bind @@ (metaref Monads.pure @@ x) @@ (lambda "n" (metaref Monads.pure @@ (op @@ var "n" @@ y)))) @@ unit @@ testTrace)
-      (flowStateTerm (optional $ just result) unit testTrace)
-
--- | Build an empty trace with custom messages
-traceWithMessages :: [String] -> TTerm Term
-traceWithMessages msgs = traceTerm
-  (list [])
-  (list $ fmap string msgs)
-  (Terms.map (Phantoms.map M.empty))
-
--- | Test cases for error trace ordering
--- Tests that withTrace annotations are properly recorded and errors include the trace context
-errorTraceTests :: TTerm TestGroup
-errorTraceTests = subgroup "error traces" [
-  evalCaseWithTags "Error traces are in the right order" [tag_disabledForPython]  -- Causes RecursionError in Python due to term explosion during beta reduction
-    -- Input: withTrace "one" $ withTrace "two" $ fail "oops"
-    (unFlowTerm
-      @@ (metaref Monads.withTrace @@ string "one"
-          @@ (metaref Monads.withTrace @@ string "two"
-              @@ (metaref Monads.fail @@ string "oops")))
-      @@ unit
-      @@ testTrace)
-    -- Output: FlowState Nothing () (Trace [] ["Error: oops (one > two)"] {})
-    (flowStateTerm (optional nothing) unit (traceWithMessages ["Error: oops (one > two)"]))]
-
-allTests :: TBinding TestGroup
-allTests = definitionInModule module_ "allTests" $
-    Phantoms.doc "Test cases for hydra.monads functions" $
-    supergroup "monads" [
-      pureTests,
-      mapTests,
-      bindTests,
-      errorTraceTests]
diff --git a/src/main/haskell/Hydra/Sources/Test/Ordering.hs b/src/main/haskell/Hydra/Sources/Test/Ordering.hs
--- a/src/main/haskell/Hydra/Sources/Test/Ordering.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Ordering.hs
@@ -26,7 +26,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for Ord instance comparisons on complex Hydra types"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- Helper for comparison result - exactly matching Equality.hs style
 compResult :: String -> TTerm Term
diff --git a/src/main/haskell/Hydra/Sources/Test/Reduction.hs b/src/main/haskell/Hydra/Sources/Test/Reduction.hs
--- a/src/main/haskell/Hydra/Sources/Test/Reduction.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Reduction.hs
@@ -26,7 +26,7 @@
 module_ = Module ns elements [] [] $
     Just "Test cases for term reduction/evaluation mechanics"
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 -- | Test cases for beta reduction (lambda application)
 betaReductionTests :: TTerm TestGroup
diff --git a/src/main/haskell/Hydra/Sources/Test/Rewriting.hs b/src/main/haskell/Hydra/Sources/Test/Rewriting.hs
--- a/src/main/haskell/Hydra/Sources/Test/Rewriting.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Rewriting.hs
@@ -18,7 +18,7 @@
 
 import Hydra.Testing
 import Hydra.Sources.Libraries
-import qualified Hydra.Dsl.Meta.Coders        as Coders
+import qualified Hydra.Dsl.Coders        as Coders
 import qualified Data.Set                     as S
 
 -- NOTE: This file previously used T for Terms and Ty for Types.
@@ -34,7 +34,7 @@
     kernelTypesNamespaces
     (Just "Test cases for term rewriting operations")
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Serialization.hs b/src/main/haskell/Hydra/Sources/Test/Serialization.hs
--- a/src/main/haskell/Hydra/Sources/Test/Serialization.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Serialization.hs
@@ -21,9 +21,9 @@
 import Hydra.Testing
 import Hydra.Sources.Libraries
 import Hydra.Dsl.AsTerm
-import qualified Hydra.Dsl.Meta.Ast as Ast
+import qualified Hydra.Dsl.Ast as Ast
+import qualified Hydra.Dsl.Meta.Lib.Math as Math
 import qualified Hydra.Sources.Kernel.Terms.Serialization as Serialization
-import qualified Hydra.Sources.Haskell.Operators as Operators
 
 import Hydra.Ast (Expr, Op, BlockStyle)
 
@@ -33,11 +33,18 @@
 
 module_ :: Module
 module_ = Module ns elements
-    [Serialization.ns, Operators.ns]
+    [Serialization.ns]
     kernelTypesNamespaces
     (Just "Test cases for AST serialization")
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [
+      Phantoms.toTermDefinition arrowOp,
+      Phantoms.toTermDefinition gtOp,
+      Phantoms.toTermDefinition plusOp,
+      Phantoms.toTermDefinition multOp,
+      Phantoms.toTermDefinition lambdaOp,
+      Phantoms.toTermDefinition caseOp,
+      Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -80,14 +87,30 @@
 inlineBlockStyle :: TBinding BlockStyle
 inlineBlockStyle = Serialization.inlineStyle
 
--- Reference to Haskell operators
-arrowOp, gtOp, plusOp, multOp, lambdaOp, caseOp :: TBinding Op
-arrowOp = Operators.arrowOp
-gtOp = Operators.gtOp
-plusOp = Operators.plusOp
-multOp = Operators.multOp
-lambdaOp = Operators.lambdaOp
-caseOp = Operators.caseOp
+-- Test operators defined locally to avoid a dependency on hydra.ext.haskell.operators
+arrowOp :: TBinding Op
+arrowOp = define "arrowOp" $
+  Serialization.op @@ string "->" @@ (Math.negate $ int32 1) @@ Ast.associativityRight
+
+gtOp :: TBinding Op
+gtOp = define "gtOp" $
+  Serialization.op @@ string ">" @@ int32 4 @@ Ast.associativityNone
+
+plusOp :: TBinding Op
+plusOp = define "plusOp" $
+  Serialization.op @@ string "+" @@ int32 6 @@ Ast.associativityBoth
+
+multOp :: TBinding Op
+multOp = define "multOp" $
+  Serialization.op @@ string "*" @@ int32 7 @@ Ast.associativityBoth
+
+lambdaOp :: TBinding Op
+lambdaOp = define "lambdaOp" $
+  Serialization.op @@ string "->" @@ (Math.negate $ int32 1) @@ Ast.associativityRight
+
+caseOp :: TBinding Op
+caseOp = define "caseOp" $
+  Serialization.op @@ string "->" @@ int32 0 @@ Ast.associativityNone
 
 -- Helper for lambda expressions: \vars -> body
 -- lambdaExpr ["x", "y"] body = ifx lambdaOp (cst "\x y") body
diff --git a/src/main/haskell/Hydra/Sources/Test/Sorting.hs b/src/main/haskell/Hydra/Sources/Test/Sorting.hs
--- a/src/main/haskell/Hydra/Sources/Test/Sorting.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Sorting.hs
@@ -38,7 +38,7 @@
     kernelTypesNamespaces
     (Just "Test cases for topological sorting algorithms")
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = Phantoms.definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Substitution.hs b/src/main/haskell/Hydra/Sources/Test/Substitution.hs
--- a/src/main/haskell/Hydra/Sources/Test/Substitution.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Substitution.hs
@@ -27,7 +27,7 @@
     kernelTypesNamespaces
     (Just "Test cases for type and term substitution operations")
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/TestGraph.hs b/src/main/haskell/Hydra/Sources/Test/TestGraph.hs
--- a/src/main/haskell/Hydra/Sources/Test/TestGraph.hs
+++ b/src/main/haskell/Hydra/Sources/Test/TestGraph.hs
@@ -11,7 +11,7 @@
 import qualified Hydra.Sources.Test.TestTerms as TestTerms
 import qualified Hydra.Sources.Test.TestTypes as TestTypes
 import qualified Hydra.Dsl.Meta.Graph         as Graph
-import qualified Hydra.Dsl.Meta.Module        as DModule
+import qualified Hydra.Dsl.Module        as DModule
 import qualified Hydra.Dsl.Meta.Lib.Chars     as Chars
 import qualified Hydra.Dsl.Meta.Lib.Equality  as Equality
 import qualified Hydra.Dsl.Meta.Lib.Lists     as Lists
@@ -42,10 +42,10 @@
     Just ("A module defining the graph used in the test suite.")
   where
    elements = [
-     Phantoms.toBinding testTerms,
-     Phantoms.toBinding testTypes,
-     Phantoms.toBinding testNamespace,
-     Phantoms.toBinding testSchemaNamespace]
+     Phantoms.toTermDefinition testTerms,
+     Phantoms.toTermDefinition testTypes,
+     Phantoms.toTermDefinition testNamespace,
+     Phantoms.toTermDefinition testSchemaNamespace]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -65,8 +65,6 @@
     Phantoms.pair TestTypes.testTypeBuddyListBName TestTypes.testTypeBuddyListB,
     Phantoms.pair TestTypes.testTypeComparisonName TestTypes.testTypeComparison,
     Phantoms.pair TestTypes.testTypeEitherName TestTypes.testTypeEither,
-    Phantoms.pair TestTypes.testTypeFlowName TestTypes.testTypeFlow,
-    Phantoms.pair TestTypes.testTypeFlowStateName TestTypes.testTypeFlowState,
     Phantoms.pair TestTypes.testTypeHydraLiteralTypeName TestTypes.testTypeHydraLiteralType,
     Phantoms.pair TestTypes.testTypeHydraTypeName TestTypes.testTypeHydraType,
     Phantoms.pair TestTypes.testTypeIntListName TestTypes.testTypeIntList,
@@ -81,7 +79,6 @@
     Phantoms.pair TestTypes.testTypeStringAliasName TestTypes.testTypeStringAlias,
     Phantoms.pair TestTypes.testTypeSymmetricTripleName TestTypes.testTypeSymmetricTriple,
     Phantoms.pair TestTypes.testTypeTimestampName TestTypes.testTypeTimestamp,
-    Phantoms.pair TestTypes.testTypeTraceName TestTypes.testTypeTrace,
     Phantoms.pair TestTypes.testTypeTripleName TestTypes.testTypeTriple,
     Phantoms.pair TestTypes.testTypeUnionMonomorphicName TestTypes.testTypeUnionMonomorphic,
     Phantoms.pair TestTypes.testTypeUnionPolymorphicRecursiveName TestTypes.testTypeUnionPolymorphicRecursive,
diff --git a/src/main/haskell/Hydra/Sources/Test/TestSuite.hs b/src/main/haskell/Hydra/Sources/Test/TestSuite.hs
--- a/src/main/haskell/Hydra/Sources/Test/TestSuite.hs
+++ b/src/main/haskell/Hydra/Sources/Test/TestSuite.hs
@@ -19,7 +19,6 @@
 import qualified Hydra.Sources.Test.Lib.Chars as Chars
 import qualified Hydra.Sources.Test.Lib.Eithers as Eithers
 import qualified Hydra.Sources.Test.Lib.Equality as Equality
-import qualified Hydra.Sources.Test.Lib.Flows as Flows
 import qualified Hydra.Sources.Test.Lib.Lists as Lists
 import qualified Hydra.Sources.Test.Lib.Literals as Literals
 import qualified Hydra.Sources.Test.Lib.Logic as Logic
@@ -28,8 +27,8 @@
 import qualified Hydra.Sources.Test.Lib.Maybes as Maybes
 import qualified Hydra.Sources.Test.Annotations as Annotations
 import qualified Hydra.Sources.Test.Ordering as Ordering
-import qualified Hydra.Sources.Test.Monads as Monads
 import qualified Hydra.Sources.Test.Lib.Pairs as Pairs
+import qualified Hydra.Sources.Test.Lib.Regex as Regex
 import qualified Hydra.Sources.Test.Lib.Sets as Sets
 import qualified Hydra.Sources.Test.Lib.Strings as Strings
 import qualified Hydra.Sources.Test.Checking.All as CheckingAll
@@ -47,18 +46,22 @@
 import qualified Hydra.Sources.Test.Inference.Failures as InferenceFailures
 import qualified Hydra.Sources.Test.Inference.Fundamentals as InferenceFundamentals
 import qualified Hydra.Sources.Test.Inference.KernelExamples as InferenceKernelExamples
+import qualified Hydra.Sources.Test.Inference.Classes as InferenceClasses
 import qualified Hydra.Sources.Test.Inference.NominalTypes as InferenceNominalTypes
-import qualified Hydra.Sources.Test.Json.Coder as JsonCoder
 import qualified Hydra.Sources.Test.Json.Parser as JsonParser
 import qualified Hydra.Sources.Test.Json.Roundtrip as JsonRoundtrip
 import qualified Hydra.Sources.Test.Json.Writer as JsonWriter
-import qualified Hydra.Sources.Test.Hoisting as Hoisting
+import qualified Hydra.Sources.Test.Hoisting.All as HoistingAll
+import qualified Hydra.Sources.Test.Hoisting.Cases as HoistingCases
+import qualified Hydra.Sources.Test.Hoisting.Let as HoistingLet
 import qualified Hydra.Sources.Test.Reduction as Reduction
 import qualified Hydra.Sources.Test.Rewriting as Rewriting
 import qualified Hydra.Sources.Test.Serialization as Serialization
 import qualified Hydra.Sources.Test.Sorting as Sorting
 import qualified Hydra.Sources.Test.Substitution as Substitution
 import qualified Hydra.Sources.Test.Unification as Unification
+import qualified Hydra.Sources.Test.Validate.All as ValidateAll
+import qualified Hydra.Sources.Test.Validate.Core as ValidateCore
 
 
 ns :: Namespace
@@ -69,7 +72,7 @@
     Just ("Hydra's common test suite, which is designed to run identically in each Hydra implementation;"
       <> " the criterion for a true Hydra implementation is that all test cases pass.")
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
     namespaces = fst <$> testPairs
 
 allTests :: TBinding TestGroup
@@ -84,7 +87,6 @@
   (Chars.ns, Chars.allTests),
   (Eithers.ns, Eithers.allTests),
   (Equality.ns, Equality.allTests),
-  (Flows.ns, Flows.allTests),
   (Lists.ns, Lists.allTests),
   (Literals.ns, Literals.allTests),
   (Logic.ns, Logic.allTests),
@@ -92,6 +94,7 @@
   (Math.ns, Math.allTests),
   (Maybes.ns, Maybes.allTests),
   (Pairs.ns, Pairs.allTests),
+  (Regex.ns, Regex.allTests),
   (Sets.ns, Sets.allTests),
   (Strings.ns, Strings.allTests)]
 
@@ -101,20 +104,19 @@
   (CheckingAll.ns, CheckingAll.allTests),
   (EtaExpansion.ns, EtaExpansion.allTests),
   (Formatting.ns, Formatting.allTests),
-  (Hoisting.ns, Hoisting.allTests),
+  (HoistingAll.ns, HoistingAll.allTests),
   (InferenceAll.ns, InferenceAll.allTests),
-  (JsonCoder.ns, JsonCoder.allTests),
   (JsonParser.ns, JsonParser.allTests),
   (JsonRoundtrip.ns, JsonRoundtrip.allTests),
   (JsonWriter.ns, JsonWriter.allTests),
-  (Monads.ns, Monads.allTests),
   -- TODO: (Ordering.ns, Ordering.allTests) temporarily removed - needs investigation
   (Reduction.ns, Reduction.allTests),
   (Rewriting.ns, Rewriting.allTests),
   (Serialization.ns, Serialization.allTests),
   (Sorting.ns, Sorting.allTests),
   (Substitution.ns, Substitution.allTests),
-  (Unification.ns, Unification.allTests)]
+  (Unification.ns, Unification.allTests),
+  (ValidateAll.ns, ValidateAll.allTests)]
 
 testPairs :: [(Namespace, TBinding TestGroup)]
 testPairs = libPairs ++ otherPairs
@@ -123,13 +125,15 @@
 testSuiteModules :: [Module]
 testSuiteModules =
   -- Lib tests
-  [Chars.module_, Eithers.module_, Equality.module_, Flows.module_,
+  [Chars.module_, Eithers.module_, Equality.module_,
    Lists.module_, Literals.module_, Logic.module_, Maps.module_,
-   Math.module_, Maybes.module_, Pairs.module_, Sets.module_, Strings.module_,
+   Math.module_, Maybes.module_, Pairs.module_, Regex.module_, Sets.module_, Strings.module_,
+   -- Hoisting tests (including sub-modules)
+   HoistingAll.module_, HoistingCases.module_, HoistingLet.module_,
    -- Other tests
-   Annotations.module_, EtaExpansion.module_, Formatting.module_, Hoisting.module_,
-   JsonCoder.module_, JsonParser.module_, JsonRoundtrip.module_, JsonWriter.module_,
-   Monads.module_, Reduction.module_, Rewriting.module_, Serialization.module_, Sorting.module_,
+   Annotations.module_, EtaExpansion.module_, Formatting.module_,
+   JsonParser.module_, JsonRoundtrip.module_, JsonWriter.module_,
+   Reduction.module_, Rewriting.module_, Serialization.module_, Sorting.module_,
    -- TODO: Ordering.module_ temporarily removed - needs investigation
    -- Checking tests (including sub-modules)
    CheckingAll.module_,
@@ -137,7 +141,9 @@
    CheckingFailures.module_, CheckingFundamentals.module_, CheckingNominalTypes.module_,
    -- Inference tests (including sub-modules)
    InferenceAll.module_,
-   InferenceAlgebraicTypes.module_, InferenceAlgorithmW.module_, InferenceFailures.module_,
+   InferenceAlgebraicTypes.module_, InferenceAlgorithmW.module_, InferenceClasses.module_, InferenceFailures.module_,
    InferenceFundamentals.module_, InferenceKernelExamples.module_, InferenceNominalTypes.module_,
    -- Substitution and unification tests
-   Substitution.module_, Unification.module_]
+   Substitution.module_, Unification.module_,
+   -- Validation tests
+   ValidateAll.module_, ValidateCore.module_]
diff --git a/src/main/haskell/Hydra/Sources/Test/TestTerms.hs b/src/main/haskell/Hydra/Sources/Test/TestTerms.hs
--- a/src/main/haskell/Hydra/Sources/Test/TestTerms.hs
+++ b/src/main/haskell/Hydra/Sources/Test/TestTerms.hs
@@ -11,7 +11,7 @@
 import qualified Data.List                    as L
 import qualified Data.Map                     as M
 
-import qualified Hydra.Dsl.Meta.Module        as DModule
+import qualified Hydra.Dsl.Module        as DModule
 import           Prelude hiding ((++))
 
 
@@ -28,10 +28,10 @@
     (Just "Term definitions for the test suite")
   where
     elements = [
-      Phantoms.toBinding latlonRecord,
-      Phantoms.toBinding testDataArthur,
-      Phantoms.toBinding testElementArthur,
-      Phantoms.toBinding testElementFirstName]
+      Phantoms.toTermDefinition latlonRecord,
+      Phantoms.toTermDefinition testDataArthur,
+      Phantoms.toTermDefinition testElementArthur,
+      Phantoms.toTermDefinition testElementFirstName]
 
 defineTerm :: String -> TTerm a -> TBinding a
 defineTerm = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/TestTypes.hs b/src/main/haskell/Hydra/Sources/Test/TestTypes.hs
--- a/src/main/haskell/Hydra/Sources/Test/TestTypes.hs
+++ b/src/main/haskell/Hydra/Sources/Test/TestTypes.hs
@@ -10,7 +10,7 @@
 import qualified Data.Map                     as M
 
 import Hydra.Dsl.Meta.Base (name, (>:))
-import qualified Hydra.Dsl.Meta.Module        as DModule
+import qualified Hydra.Dsl.Module        as DModule
 import qualified Hydra.Dsl.Types              as Types
 import           Prelude hiding ((++))
 
@@ -25,75 +25,69 @@
     (Just "Type definitions for the test suite")
   where
     elements = [
-      toBinding testTypeBuddyListA,
-      toBinding testTypeBuddyListAName,
-      toBinding testTypeBuddyListB,
-      toBinding testTypeBuddyListBName,
-      toBinding testTypeComparison,
-      toBinding testTypeComparisonName,
-      toBinding testTypeEither,
-      toBinding testTypeEitherName,
-      toBinding testTypeFlow,
-      toBinding testTypeFlowName,
-      toBinding testTypeFlowState,
-      toBinding testTypeFlowStateName,
-      toBinding testTypeHydraLiteralType,
-      toBinding testTypeHydraLiteralTypeName,
-      toBinding testTypeHydraType,
-      toBinding testTypeHydraTypeName,
-      toBinding testTypeIntList,
-      toBinding testTypeIntListName,
-      toBinding testTypeLatLon,
-      toBinding testTypeLatLonName,
-      toBinding testTypeLatLonPoly,
-      toBinding testTypeLatLonPolyName,
-      toBinding testTypeList,
-      toBinding testTypeListName,
-      toBinding testTypeNumber,
-      toBinding testTypeNumberName,
-      toBinding testTypePerson,
-      toBinding testTypePersonName,
-      toBinding testTypePersonOrSomething,
-      toBinding testTypePersonOrSomethingName,
-      toBinding testTypePolymorphicWrapper,
-      toBinding testTypePolymorphicWrapperName,
-      toBinding testTypeSimpleNumber,
-      toBinding testTypeSimpleNumberName,
-      toBinding testTypeStringAlias,
-      toBinding testTypeStringAliasName,
-      toBinding testTypeSymmetricTriple,
-      toBinding testTypeSymmetricTripleName,
-      toBinding testTypeTimestamp,
-      toBinding testTypeTimestampName,
-      toBinding testTypeTrace,
-      toBinding testTypeTraceName,
-      toBinding testTypeTriple,
-      toBinding testTypeTripleName,
-      toBinding testTypeUnionMonomorphic,
-      toBinding testTypeUnionMonomorphicName,
-      toBinding testTypeUnionPolymorphicRecursive,
-      toBinding testTypeUnionPolymorphicRecursiveName,
-      toBinding testTypeUnit,
-      toBinding testTypeUnitName,
+      toTermDefinition testTypeBuddyListA,
+      toTermDefinition testTypeBuddyListAName,
+      toTermDefinition testTypeBuddyListB,
+      toTermDefinition testTypeBuddyListBName,
+      toTermDefinition testTypeComparison,
+      toTermDefinition testTypeComparisonName,
+      toTermDefinition testTypeEither,
+      toTermDefinition testTypeEitherName,
+      toTermDefinition testTypeHydraLiteralType,
+      toTermDefinition testTypeHydraLiteralTypeName,
+      toTermDefinition testTypeHydraType,
+      toTermDefinition testTypeHydraTypeName,
+      toTermDefinition testTypeIntList,
+      toTermDefinition testTypeIntListName,
+      toTermDefinition testTypeLatLon,
+      toTermDefinition testTypeLatLonName,
+      toTermDefinition testTypeLatLonPoly,
+      toTermDefinition testTypeLatLonPolyName,
+      toTermDefinition testTypeList,
+      toTermDefinition testTypeListName,
+      toTermDefinition testTypeNumber,
+      toTermDefinition testTypeNumberName,
+      toTermDefinition testTypePerson,
+      toTermDefinition testTypePersonName,
+      toTermDefinition testTypePersonOrSomething,
+      toTermDefinition testTypePersonOrSomethingName,
+      toTermDefinition testTypePolymorphicWrapper,
+      toTermDefinition testTypePolymorphicWrapperName,
+      toTermDefinition testTypeSimpleNumber,
+      toTermDefinition testTypeSimpleNumberName,
+      toTermDefinition testTypeStringAlias,
+      toTermDefinition testTypeStringAliasName,
+      toTermDefinition testTypeSymmetricTriple,
+      toTermDefinition testTypeSymmetricTripleName,
+      toTermDefinition testTypeTimestamp,
+      toTermDefinition testTypeTimestampName,
+      toTermDefinition testTypeTriple,
+      toTermDefinition testTypeTripleName,
+      toTermDefinition testTypeUnionMonomorphic,
+      toTermDefinition testTypeUnionMonomorphicName,
+      toTermDefinition testTypeUnionPolymorphicRecursive,
+      toTermDefinition testTypeUnionPolymorphicRecursiveName,
+      toTermDefinition testTypeUnit,
+      toTermDefinition testTypeUnitName,
       -- Additional utility types
-      toBinding concatType,
-      toBinding compareStringsType,
-      toBinding eitherStringOrInt8TypeName,
-      toBinding eitherStringOrInt8Type,
-      toBinding exampleProjectionType,
-      toBinding listOfInt8sType,
-      toBinding listOfInt16sType,
-      toBinding listOfListsOfStringsType,
-      toBinding listOfSetOfStringsType,
-      toBinding listOfStringsType,
-      toBinding mapOfStringsToIntsType,
-      toBinding optionalInt8Type,
-      toBinding optionalInt16Type,
-      toBinding optionalStringType,
-      toBinding setOfStringsType,
-      toBinding stringOrIntName,
-      toBinding stringOrIntType,
-      toBinding testTypeName]
+      toTermDefinition concatType,
+      toTermDefinition compareStringsType,
+      toTermDefinition eitherStringOrInt8TypeName,
+      toTermDefinition eitherStringOrInt8Type,
+      toTermDefinition exampleProjectionType,
+      toTermDefinition listOfInt8sType,
+      toTermDefinition listOfInt16sType,
+      toTermDefinition listOfListsOfStringsType,
+      toTermDefinition listOfSetOfStringsType,
+      toTermDefinition listOfStringsType,
+      toTermDefinition mapOfStringsToIntsType,
+      toTermDefinition optionalInt8Type,
+      toTermDefinition optionalInt16Type,
+      toTermDefinition optionalStringType,
+      toTermDefinition setOfStringsType,
+      toTermDefinition stringOrIntName,
+      toTermDefinition stringOrIntType,
+      toTermDefinition testTypeName]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
@@ -123,14 +117,6 @@
 testTypeEitherName = define "testTypeEitherName" $
   testTypesName "Either"
 
-testTypeFlowName :: TBinding Name
-testTypeFlowName = define "testTypeFlowName" $
-  name "hydra.compute.Flow"
-
-testTypeFlowStateName :: TBinding Name
-testTypeFlowStateName = define "testTypeFlowStateName" $
-  name "hydra.compute.FlowState"
-
 testTypeHydraLiteralTypeName :: TBinding Name
 testTypeHydraLiteralTypeName = define "testTypeHydraLiteralTypeName" $
   testTypesName "HydraLiteralType"
@@ -187,10 +173,6 @@
 testTypeTimestampName = define "testTypeTimestampName" $
   testTypesName "Timestamp"
 
-testTypeTraceName :: TBinding Name
-testTypeTraceName = define "testTypeTraceName" $
-  name "hydra.compute.Trace"
-
 testTypeTripleName :: TBinding Name
 testTypeTripleName = define "testTypeTripleName" $
   testTypesName "Triple"
@@ -235,18 +217,6 @@
     "left">: T.variable "a",
     "right">: T.variable "b"]
 
-testTypeFlow :: TBinding Type
-testTypeFlow = defineType "testTypeFlow" $
-  T.forAll "s" $ T.forAll "a" $ T.record testTypeFlowName [
-    "value">: T.function (T.variable "s") (T.apply (T.apply (Core.typeVariable testTypeFlowStateName) (T.variable "s")) (T.variable "a"))]
-
-testTypeFlowState :: TBinding Type
-testTypeFlowState = defineType "testTypeFlowState" $
-  T.forAll "s" $ T.forAll "a" $ T.record testTypeFlowStateName [
-    "value">: T.maybe (T.variable "a"),
-    "state">: T.variable "s",
-    "trace">: Core.typeVariable testTypeTraceName]
-
 testTypeHydraLiteralType :: TBinding Type
 testTypeHydraLiteralType = defineType "testTypeHydraLiteralType" $
   T.union testTypeHydraLiteralTypeName [
@@ -305,7 +275,7 @@
 
 testTypePolymorphicWrapper :: TBinding Type
 testTypePolymorphicWrapper = defineType "testTypePolymorphicWrapper" $
-  T.forAll "a" $ Core.typeWrap $ Core.wrappedType testTypePolymorphicWrapperName (T.list $ T.variable "a")
+  T.forAll "a" $ Core.typeWrap (T.list $ T.variable "a")
 
 testTypeSimpleNumber :: TBinding Type
 testTypeSimpleNumber = defineType "testTypeSimpleNumber" $
@@ -315,7 +285,7 @@
 
 testTypeStringAlias :: TBinding Type
 testTypeStringAlias = defineType "testTypeStringAlias" $
-  Core.typeWrap $ Core.wrappedType testTypeStringAliasName T.string
+  Core.typeWrap T.string
 
 testTypeSymmetricTriple :: TBinding Type
 testTypeSymmetricTriple = defineType "testTypeSymmetricTriple" $
@@ -327,13 +297,6 @@
   T.union testTypeTimestampName [
     "unixTimeMillis">: T.uint64,
     "date">: T.string]
-
-testTypeTrace :: TBinding Type
-testTypeTrace = defineType "testTypeTrace" $
-  T.record testTypeTraceName [
-    "stack">: T.list T.string,
-    "messages">: T.list T.string,
-    "other">: T.map T.string T.string]
 
 testTypeTriple :: TBinding Type
 testTypeTriple = defineType "testTypeTriple" $
diff --git a/src/main/haskell/Hydra/Sources/Test/Transform.hs b/src/main/haskell/Hydra/Sources/Test/Transform.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Transform.hs
@@ -0,0 +1,289 @@
+-- | Transform test cases for code generation, filtering to tests that can be compiled to target languages
+
+module Hydra.Sources.Test.Transform where
+
+-- Standard imports for term-level sources outside of the kernel
+import Hydra.Kernel hiding (transformModule)
+import Hydra.Sources.Libraries
+import           Hydra.Dsl.Meta.Lib.Strings                as Strings
+import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
+import qualified Hydra.Dsl.Annotations                     as Annotations
+import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
+import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
+import qualified Hydra.Dsl.Literals                        as Literals
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
+import qualified Hydra.Dsl.Meta.Base                       as MetaBase
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
+import qualified Hydra.Dsl.Meta.Context                    as Ctx
+import qualified Hydra.Dsl.Meta.Core                       as Core
+import qualified Hydra.Dsl.Errors                     as Error
+import qualified Hydra.Dsl.Meta.Graph                      as Graph
+import qualified Hydra.Dsl.Json.Model                       as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps                   as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math                   as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
+import qualified Hydra.Dsl.Module                     as Module
+import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
+import qualified Hydra.Dsl.Meta.Testing                    as Testing
+import qualified Hydra.Dsl.Topology                   as Topology
+import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
+import qualified Hydra.Dsl.Meta.Variants                   as Variants
+import qualified Hydra.Dsl.Prims                           as Prims
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
+import qualified Hydra.Dsl.Terms                           as Terms
+import qualified Hydra.Dsl.Tests                           as Tests
+import qualified Hydra.Dsl.Types                           as Types
+import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
+import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
+import           Prelude hiding ((++))
+import qualified Data.Int                                  as I
+import qualified Data.List                                 as L
+import qualified Data.Map                                  as M
+import qualified Data.Set                                  as S
+import qualified Data.Maybe                                as Y
+
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.transform"
+
+
+module_ :: Module
+module_ = Module ns elements
+    [Formatting.ns, Sorting.ns]
+    KernelTypes.kernelTypesNamespaces $
+    Just "Transform test cases for code generation, filtering to tests that can be compiled to target languages"
+  where
+    elements = [
+      toTermDefinition transformToCompiledTests,
+      toTermDefinition transformTestCase,
+      toTermDefinition buildConvertCaseCall,
+      toTermDefinition encodeCaseConvention,
+      toTermDefinition addGenerationPrefix,
+      toTermDefinition transformModule,
+      toTermDefinition collectTestCases,
+      toTermDefinition buildTopologicalSortCall,
+      toTermDefinition buildTopologicalSortSCCCall,
+      toTermDefinition encodeAdjacencyList,
+      toTermDefinition encodeInt,
+      toTermDefinition encodeEitherListList,
+      toTermDefinition encodeListList,
+      toTermDefinition encodeIntList]
+
+
+-- | Transform test group hierarchy to only include delegated evaluation tests
+transformToCompiledTests :: TBinding (TestGroup -> Maybe TestGroup)
+transformToCompiledTests = define "transformToCompiledTests" $
+  doc "Transform test group hierarchy to only include delegated evaluation tests" $
+  lambda "tg" $ lets [
+    "name_">: project _TestGroup _TestGroup_name @@ var "tg",
+    "desc">: project _TestGroup _TestGroup_description @@ var "tg",
+    "subgroups">: project _TestGroup _TestGroup_subgroups @@ var "tg",
+    "cases_">: project _TestGroup _TestGroup_cases @@ var "tg",
+    "transformedCases">: Maybes.cat (Lists.map (lambda "tc" $ transformTestCase @@ var "tc") (var "cases_")),
+    "transformedSubgroups">: Maybes.cat (Lists.map (lambda "sg" $ transformToCompiledTests @@ var "sg") (var "subgroups"))] $
+    Logic.ifElse
+      (Logic.and (Lists.null (var "transformedCases")) (Lists.null (var "transformedSubgroups")))
+      nothing
+      (just $ Testing.testGroup (var "name_") (var "desc") (var "transformedSubgroups") (var "transformedCases"))
+
+
+-- | Transform a test case to DelegatedEvaluationTestCase if applicable
+transformTestCase :: TBinding (TestCaseWithMetadata -> Maybe TestCaseWithMetadata)
+transformTestCase = define "transformTestCase" $
+  doc "Transform a test case to DelegatedEvaluationTestCase if applicable" $
+  lambda "tcm" $ lets [
+    "name_">: project _TestCaseWithMetadata _TestCaseWithMetadata_name @@ var "tcm",
+    "tc">: project _TestCaseWithMetadata _TestCaseWithMetadata_case @@ var "tcm",
+    "desc">: project _TestCaseWithMetadata _TestCaseWithMetadata_description @@ var "tcm",
+    "tags_">: project _TestCaseWithMetadata _TestCaseWithMetadata_tags @@ var "tcm"] $
+    cases _TestCase (var "tc") (Just nothing) [
+      _TestCase_caseConversion>>: lambda "ccase" $ lets [
+        "fromConv">: project _CaseConversionTestCase _CaseConversionTestCase_fromConvention @@ var "ccase",
+        "toConv">: project _CaseConversionTestCase _CaseConversionTestCase_toConvention @@ var "ccase",
+        "fromStr">: project _CaseConversionTestCase _CaseConversionTestCase_fromString @@ var "ccase",
+        "toStr">: project _CaseConversionTestCase _CaseConversionTestCase_toString @@ var "ccase"] $
+        just $ Testing.testCaseWithMetadata (var "name_")
+          (Testing.testCaseDelegatedEvaluation $ Testing.delegatedEvaluationTestCase
+            (buildConvertCaseCall @@ var "fromConv" @@ var "toConv" @@ var "fromStr")
+            (Core.termLiteral $ Core.literalString (var "toStr")))
+          (var "desc") (var "tags_"),
+
+      _TestCase_evaluation>>: lambda "ecase" $ lets [
+        "input_">: project _EvaluationTestCase _EvaluationTestCase_input @@ var "ecase",
+        "output_">: project _EvaluationTestCase _EvaluationTestCase_output @@ var "ecase"] $
+        just $ Testing.testCaseWithMetadata (var "name_")
+          (Testing.testCaseDelegatedEvaluation $ Testing.delegatedEvaluationTestCase
+            (var "input_") (var "output_"))
+          (var "desc") (var "tags_"),
+
+      _TestCase_delegatedEvaluation>>: lambda "_" $
+        just (var "tcm"),
+
+      _TestCase_topologicalSort>>: lambda "tscase" $ lets [
+        "adjList">: project _TopologicalSortTestCase _TopologicalSortTestCase_adjacencyList @@ var "tscase",
+        "expected">: project _TopologicalSortTestCase _TopologicalSortTestCase_expected @@ var "tscase"] $
+        just $ Testing.testCaseWithMetadata (var "name_")
+          (Testing.testCaseDelegatedEvaluation $ Testing.delegatedEvaluationTestCase
+            (buildTopologicalSortCall @@ var "adjList")
+            (encodeEitherListList @@ var "expected"))
+          (var "desc") (var "tags_"),
+
+      _TestCase_topologicalSortSCC>>: lambda "scccase" $ lets [
+        "adjList">: project _TopologicalSortSCCTestCase _TopologicalSortSCCTestCase_adjacencyList @@ var "scccase",
+        "expected">: project _TopologicalSortSCCTestCase _TopologicalSortSCCTestCase_expected @@ var "scccase"] $
+        just $ Testing.testCaseWithMetadata (var "name_")
+          (Testing.testCaseDelegatedEvaluation $ Testing.delegatedEvaluationTestCase
+            (buildTopologicalSortSCCCall @@ var "adjList")
+            (encodeListList @@ var "expected"))
+          (var "desc") (var "tags_"),
+
+      _TestCase_validateCoreTerm>>: lambda "_" $
+        just (var "tcm")]
+
+
+-- | Build a Term representing a convertCase function call
+buildConvertCaseCall :: TBinding (CaseConvention -> CaseConvention -> String -> Term)
+buildConvertCaseCall = define "buildConvertCaseCall" $
+  doc "Build a Term representing a convertCase function call" $
+  lambdas ["fromConv", "toConv", "input_"] $
+    Core.termApplication $ Core.application
+      (Core.termApplication $ Core.application
+        (Core.termApplication $ Core.application
+          (Core.termVariable $ Core.name (string "hydra.formatting.convertCase"))
+          (encodeCaseConvention @@ var "fromConv"))
+        (encodeCaseConvention @@ var "toConv"))
+      (Core.termLiteral $ Core.literalString (var "input_"))
+
+
+-- | Encode CaseConvention as a Term (unit variant)
+encodeCaseConvention :: TBinding (CaseConvention -> Term)
+encodeCaseConvention = define "encodeCaseConvention" $
+  doc "Encode CaseConvention as a Term (unit variant)" $
+  lambda "conv" $
+    Core.termUnion $ Core.injection
+      (Core.nameLift _CaseConvention)
+      (Core.field
+        (cases _CaseConvention (var "conv") Nothing [
+          _CaseConvention_lowerSnake>>: constant (Core.nameLift _CaseConvention_lowerSnake),
+          _CaseConvention_upperSnake>>: constant (Core.nameLift _CaseConvention_upperSnake),
+          _CaseConvention_camel>>: constant (Core.nameLift _CaseConvention_camel),
+          _CaseConvention_pascal>>: constant (Core.nameLift _CaseConvention_pascal)])
+        Core.termUnit)
+
+
+-- | Add "generation" namespace prefix
+addGenerationPrefix :: TBinding (Namespace -> Namespace)
+addGenerationPrefix = define "addGenerationPrefix" $
+  doc "Add generation namespace prefix" $
+  lambda "ns_" $
+    wrap _Namespace (Strings.cat2 (string "generation.") (unwrap _Namespace @@ var "ns_"))
+
+
+-- | Transform module with generation namespace
+transformModule :: TBinding (Module -> Module)
+transformModule = define "transformModule" $
+  doc "Transform module with generation namespace" $
+  lambda "m" $
+    Module.module_
+      (addGenerationPrefix @@ (project _Module _Module_namespace @@ var "m"))
+      (project _Module _Module_definitions @@ var "m")
+      (project _Module _Module_termDependencies @@ var "m")
+      (project _Module _Module_typeDependencies @@ var "m")
+      (project _Module _Module_description @@ var "m")
+
+
+-- | Collect all test cases from a test group (flattening hierarchy)
+collectTestCases :: TBinding (TestGroup -> [TestCaseWithMetadata])
+collectTestCases = define "collectTestCases" $
+  doc "Collect all test cases from a test group (flattening hierarchy)" $
+  lambda "tg" $
+    Lists.concat2
+      (project _TestGroup _TestGroup_cases @@ var "tg")
+      (Lists.concat (Lists.map (lambda "sg" $ collectTestCases @@ var "sg")
+        (project _TestGroup _TestGroup_subgroups @@ var "tg")))
+
+
+-- | Build a Term representing a topologicalSort function call
+buildTopologicalSortCall :: TBinding ([(Int, [Int])] -> Term)
+buildTopologicalSortCall = define "buildTopologicalSortCall" $
+  doc "Build a Term representing a topologicalSort function call" $
+  lambda "adjList" $
+    Core.termApplication $ Core.application
+      (Core.termVariable $ Core.name (string "hydra.sorting.topologicalSort"))
+      (encodeAdjacencyList @@ var "adjList")
+
+
+-- | Build a Term representing a topologicalSortComponents function call
+buildTopologicalSortSCCCall :: TBinding ([(Int, [Int])] -> Term)
+buildTopologicalSortSCCCall = define "buildTopologicalSortSCCCall" $
+  doc "Build a Term representing a topologicalSortComponents function call" $
+  lambda "adjList" $
+    Core.termApplication $ Core.application
+      (Core.termVariable $ Core.name (string "hydra.sorting.topologicalSortComponents"))
+      (encodeAdjacencyList @@ var "adjList")
+
+
+-- | Encode an adjacency list as a Term
+encodeAdjacencyList :: TBinding ([(Int, [Int])] -> Term)
+encodeAdjacencyList = define "encodeAdjacencyList" $
+  doc "Encode an adjacency list as a Term" $
+  lambda "pairs" $
+    Core.termList (Lists.map
+      (lambda "p" $
+        Core.termPair (pair
+          (encodeInt @@ (Pairs.first (var "p")))
+          (Core.termList (Lists.map (lambda "d" $ encodeInt @@ var "d") (Pairs.second (var "p"))))))
+      (var "pairs"))
+
+
+-- | Encode an Int as a Term
+encodeInt :: TBinding (Int -> Term)
+encodeInt = define "encodeInt" $
+  doc "Encode an Int as a Term" $
+  lambda "n" $
+    Core.termLiteral $ Core.literalInteger $ Core.integerValueInt32 (var "n")
+
+
+-- | Encode Either [[Int]] [Int] as a Term
+encodeEitherListList :: TBinding (Either [[Int]] [Int] -> Term)
+encodeEitherListList = define "encodeEitherListList" $
+  doc "Encode Either [[Int]] [Int] as a Term" $
+  lambda "e" $
+    Core.termEither (Eithers.bimap
+      (lambda "cycles" $ encodeListList @@ var "cycles")
+      (lambda "sorted" $ encodeIntList @@ var "sorted")
+      (var "e"))
+
+
+-- | Encode [[Int]] as a Term
+encodeListList :: TBinding ([[Int]] -> Term)
+encodeListList = define "encodeListList" $
+  doc "Encode [[Int]] as a Term" $
+  lambda "lists" $
+    Core.termList (Lists.map (lambda "l" $ encodeIntList @@ var "l") (var "lists"))
+
+
+-- | Encode [Int] as a Term
+encodeIntList :: TBinding ([Int] -> Term)
+encodeIntList = define "encodeIntList" $
+  doc "Encode [Int] as a Term" $
+  lambda "ints" $
+    Core.termList (Lists.map (lambda "n" $ encodeInt @@ var "n") (var "ints"))
+
diff --git a/src/main/haskell/Hydra/Sources/Test/Unification.hs b/src/main/haskell/Hydra/Sources/Test/Unification.hs
--- a/src/main/haskell/Hydra/Sources/Test/Unification.hs
+++ b/src/main/haskell/Hydra/Sources/Test/Unification.hs
@@ -27,7 +27,7 @@
     kernelTypesNamespaces
     (Just "Test cases for type unification operations")
   where
-    elements = [Phantoms.toBinding allTests]
+    elements = [Phantoms.toTermDefinition allTests]
 
 define :: String -> TTerm a -> TBinding a
 define = definitionInModule module_
diff --git a/src/main/haskell/Hydra/Sources/Test/Utils.hs b/src/main/haskell/Hydra/Sources/Test/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Utils.hs
@@ -0,0 +1,164 @@
+-- | Shared utility functions for test code generation codecs.
+-- These functions handle type inference on test group terms and are used by
+-- both the Java and Python test codec modules.
+
+module Hydra.Sources.Test.Utils where
+
+-- Standard imports for term-level sources outside of the kernel
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import           Hydra.Dsl.Meta.Lib.Strings                as Strings
+import           Hydra.Dsl.Meta.Phantoms                   as Phantoms
+import qualified Hydra.Dsl.Annotations                     as Annotations
+import qualified Hydra.Dsl.Bootstrap                       as Bootstrap
+import qualified Hydra.Dsl.LiteralTypes                    as LiteralTypes
+import qualified Hydra.Dsl.Literals                        as Literals
+import qualified Hydra.Dsl.Paths                  as Paths
+import qualified Hydra.Dsl.Ast                        as Ast
+import qualified Hydra.Dsl.Meta.Base                       as MetaBase
+import qualified Hydra.Dsl.Coders                     as Coders
+import qualified Hydra.Dsl.Util                    as Util
+import qualified Hydra.Dsl.Meta.Context                    as Ctx
+import qualified Hydra.Dsl.Meta.Core                       as Core
+import qualified Hydra.Dsl.Errors                     as Error
+import qualified Hydra.Dsl.Meta.Graph                      as Graph
+import qualified Hydra.Dsl.Json.Model                       as Json
+import qualified Hydra.Dsl.Meta.Lib.Chars                  as Chars
+import qualified Hydra.Dsl.Meta.Lib.Eithers                as Eithers
+import qualified Hydra.Dsl.Meta.Lib.Equality               as Equality
+import qualified Hydra.Dsl.Meta.Lib.Lists                  as Lists
+import qualified Hydra.Dsl.Meta.Lib.Literals               as Literals
+import qualified Hydra.Dsl.Meta.Lib.Logic                  as Logic
+import qualified Hydra.Dsl.Meta.Lib.Maps                   as Maps
+import qualified Hydra.Dsl.Meta.Lib.Math                   as Math
+import qualified Hydra.Dsl.Meta.Lib.Maybes                 as Maybes
+import qualified Hydra.Dsl.Meta.Lib.Pairs                  as Pairs
+import qualified Hydra.Dsl.Meta.Lib.Sets                   as Sets
+import qualified Hydra.Dsl.Module                     as Module
+import qualified Hydra.Dsl.Meta.Terms                      as MetaTerms
+import qualified Hydra.Dsl.Meta.Testing                    as Testing
+import qualified Hydra.Dsl.Topology                   as Topology
+import qualified Hydra.Dsl.Meta.Types                      as MetaTypes
+import qualified Hydra.Dsl.Typing                     as Typing
+import qualified Hydra.Dsl.Util                       as Util
+import qualified Hydra.Dsl.Meta.Variants                   as Variants
+import qualified Hydra.Dsl.Prims                           as Prims
+import qualified Hydra.Dsl.Meta.Tabular                         as Tabular
+import qualified Hydra.Dsl.Terms                           as Terms
+import qualified Hydra.Dsl.Tests                           as Tests
+import qualified Hydra.Dsl.Types                           as Types
+import qualified Hydra.Sources.Decode.Core                 as DecodeCore
+import qualified Hydra.Sources.Encode.Core                 as EncodeCore
+import qualified Hydra.Sources.Kernel.Terms.Adapt           as Adapt
+import qualified Hydra.Sources.Kernel.Terms.All            as KernelTerms
+import qualified Hydra.Sources.Kernel.Terms.Annotations    as Annotations
+import qualified Hydra.Sources.Kernel.Terms.Arity          as Arity
+import qualified Hydra.Sources.Kernel.Terms.Checking       as Checking
+import qualified Hydra.Sources.Kernel.Terms.Constants      as Constants
+import qualified Hydra.Sources.Kernel.Terms.Extract.Core   as ExtractCore
+import qualified Hydra.Sources.Kernel.Terms.Extract.Util   as ExtractUtil
+import qualified Hydra.Sources.Kernel.Terms.Formatting     as Formatting
+import qualified Hydra.Sources.Kernel.Terms.Inference      as Inference
+import qualified Hydra.Sources.Kernel.Terms.Languages      as Languages
+import qualified Hydra.Sources.Kernel.Terms.Lexical        as Lexical
+import qualified Hydra.Sources.Kernel.Terms.Literals       as Literals
+import qualified Hydra.Sources.Kernel.Terms.Names          as Names
+import qualified Hydra.Sources.Kernel.Terms.Reduction      as Reduction
+import qualified Hydra.Sources.Kernel.Terms.Reflect        as Reflect
+import qualified Hydra.Sources.Kernel.Terms.Rewriting      as Rewriting
+import qualified Hydra.Sources.Kernel.Terms.Schemas        as Schemas
+import qualified Hydra.Sources.Kernel.Terms.Serialization  as Serialization
+import qualified Hydra.Sources.Kernel.Terms.Show.Paths as ShowPaths
+import qualified Hydra.Sources.Kernel.Terms.Show.Errors    as ShowError
+import qualified Hydra.Sources.Kernel.Terms.Show.Core      as ShowCore
+import qualified Hydra.Sources.Kernel.Terms.Show.Graph     as ShowGraph
+import qualified Hydra.Sources.Kernel.Terms.Show.Meta      as ShowMeta
+import qualified Hydra.Sources.Kernel.Terms.Show.Typing    as ShowTyping
+import qualified Hydra.Sources.Kernel.Terms.Sorting        as Sorting
+import qualified Hydra.Sources.Kernel.Terms.Substitution   as Substitution
+import qualified Hydra.Sources.Kernel.Terms.Templates      as Templates
+import qualified Hydra.Sources.Kernel.Terms.Unification    as Unification
+import qualified Hydra.Sources.Kernel.Types.All            as KernelTypes
+import           Prelude hiding ((++))
+import qualified Data.Int                                  as I
+import qualified Data.List                                 as L
+import qualified Data.Map                                  as M
+import qualified Data.Set                                  as S
+import qualified Data.Maybe                                as Y
+
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.utils"
+
+
+module_ :: Module
+module_ = Module ns elements
+    [Inference.ns, ShowError.ns, Lexical.ns]
+    KernelTypes.kernelTypesNamespaces $
+    Just "Shared utility functions for test code generation codecs"
+  where
+    elements = [
+      toTermDefinition inferTestGroupTerms,
+      toTermDefinition inferTestCase,
+      toTermDefinition inferTerm]
+
+
+-- | Run type inference on all terms in a TestGroup
+inferTestGroupTerms :: TBinding (Graph -> TestGroup -> Either String TestGroup)
+inferTestGroupTerms = define "inferTestGroupTerms" $
+  doc "Run type inference on all terms in a TestGroup to ensure lambdas have domain types" $
+  lambda "g" $ lambda "tg" $ lets [
+    "name_">: project _TestGroup _TestGroup_name @@ var "tg",
+    "desc">: project _TestGroup _TestGroup_description @@ var "tg",
+    "subgroups">: project _TestGroup _TestGroup_subgroups @@ var "tg",
+    "cases_">: project _TestGroup _TestGroup_cases @@ var "tg"] $
+    Eithers.bind
+      (Eithers.mapList (lambda "sg" $ inferTestGroupTerms @@ var "g" @@ var "sg") (var "subgroups"))
+      (lambda "inferredSubgroups" $
+        Eithers.map
+          (lambda "inferredCases" $
+            Testing.testGroup (var "name_") (var "desc") (var "inferredSubgroups") (var "inferredCases"))
+          (Eithers.mapList (lambda "tc" $ inferTestCase @@ var "g" @@ var "tc") (var "cases_")))
+
+
+-- | Run type inference on the terms in a test case
+inferTestCase :: TBinding (Graph -> TestCaseWithMetadata -> Either String TestCaseWithMetadata)
+inferTestCase = define "inferTestCase" $
+  doc "Run type inference on the terms in a test case" $
+  lambda "g" $ lambda "tcm" $ lets [
+    "name_">: project _TestCaseWithMetadata _TestCaseWithMetadata_name @@ var "tcm",
+    "tcase">: project _TestCaseWithMetadata _TestCaseWithMetadata_case @@ var "tcm",
+    "desc">: project _TestCaseWithMetadata _TestCaseWithMetadata_description @@ var "tcm",
+    "tags_">: project _TestCaseWithMetadata _TestCaseWithMetadata_tags @@ var "tcm"] $
+    Eithers.map
+      (lambda "inferredCase" $
+        Testing.testCaseWithMetadata (var "name_") (var "inferredCase") (var "desc") (var "tags_"))
+      (cases _TestCase (var "tcase") (Just (Phantoms.right (var "tcase"))) [
+        _TestCase_delegatedEvaluation>>: lambda "delCase" $ lets [
+          "input_">: project _DelegatedEvaluationTestCase _DelegatedEvaluationTestCase_input @@ var "delCase",
+          "output_">: project _DelegatedEvaluationTestCase _DelegatedEvaluationTestCase_output @@ var "delCase"] $
+          Eithers.bind
+            (inferTerm @@ var "g" @@ var "input_")
+            (lambda "inferredInput" $
+              Eithers.map
+                (lambda "inferredOutput" $
+                  inject _TestCase _TestCase_delegatedEvaluation
+                    (record _DelegatedEvaluationTestCase [
+                      _DelegatedEvaluationTestCase_input>>: var "inferredInput",
+                      _DelegatedEvaluationTestCase_output>>: var "inferredOutput"]))
+                (inferTerm @@ var "g" @@ var "output_"))])
+
+
+-- | Run type inference on a single term
+inferTerm :: TBinding (Graph -> Term -> Either String Term)
+inferTerm = define "inferTerm" $
+  doc "Run type inference on a single term" $
+  lambda "g" $ lambda "term" $
+    Eithers.bimap
+      ("ic" ~> ShowError.error_ @@ Ctx.inContextObject (var "ic"))
+      ("x" ~> Typing.inferenceResultTerm (var "x"))
+      (Inference.inferInGraphContext @@ asTerm Lexical.emptyContext @@ var "g" @@ var "term")
diff --git a/src/main/haskell/Hydra/Sources/Test/Validate/All.hs b/src/main/haskell/Hydra/Sources/Test/Validate/All.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Validate/All.hs
@@ -0,0 +1,34 @@
+
+module Hydra.Sources.Test.Validate.All where
+
+import Hydra.Kernel
+import Hydra.Dsl.Meta.Testing as Testing
+import Hydra.Sources.Kernel.Types.All
+import Hydra.Dsl.Meta.Phantoms as Phantoms
+import qualified Hydra.Dsl.Meta.Core as Core
+import qualified Hydra.Dsl.Meta.Types as T
+import qualified Hydra.Sources.Test.TestGraph as TestGraph
+import qualified Hydra.Sources.Test.TestTerms as TestTerms
+import qualified Hydra.Sources.Test.TestTypes as TestTypes
+import qualified Data.List as L
+import qualified Data.Map  as M
+
+import qualified Hydra.Sources.Test.Validate.Core as ValidateCore
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.validate.all"
+
+module_ :: Module
+module_ = Module ns elements namespaces kernelTypesNamespaces $
+    Just "Hydra's validation test suite"
+  where
+    elements = [Phantoms.toTermDefinition allTests]
+    namespaces = [ValidateCore.ns]
+
+allTests :: TBinding TestGroup
+allTests = definitionInModule module_ "allTests" $
+    doc "The group of all validation tests" $
+    Testing.testGroup (string "validation") nothing (list subgroups) (list ([] :: [TTerm TestCaseWithMetadata]))
+  where
+    subgroups = [ValidateCore.allTests]
diff --git a/src/main/haskell/Hydra/Sources/Test/Validate/Core.hs b/src/main/haskell/Hydra/Sources/Test/Validate/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/main/haskell/Hydra/Sources/Test/Validate/Core.hs
@@ -0,0 +1,446 @@
+
+-- | Test cases for core term and type validation
+module Hydra.Sources.Test.Validate.Core where
+
+-- Standard imports for shallow DSL tests
+import Hydra.Kernel
+import Hydra.Dsl.Meta.Testing                 as Testing
+import Hydra.Dsl.Meta.Terms                   as Terms
+import Hydra.Sources.Kernel.Types.All
+import qualified Hydra.Dsl.Meta.Core          as Core
+import qualified Hydra.Dsl.Meta.Phantoms      as Phantoms
+import qualified Hydra.Dsl.Meta.Types         as T
+import qualified Hydra.Sources.Test.TestGraph as TestGraph
+import qualified Hydra.Sources.Test.TestTerms as TestTerms
+import qualified Hydra.Sources.Test.TestTypes as TestTypes
+import qualified Data.List                    as L
+import qualified Data.Map                     as M
+
+import Hydra.Testing
+import Hydra.Sources.Libraries
+
+
+ns :: Namespace
+ns = Namespace "hydra.test.validate.core"
+
+module_ :: Module
+module_ = Module ns elements
+    []
+    kernelTypesNamespaces
+    (Just "Test cases for core term and type validation")
+  where
+    elements = [
+      Phantoms.toTermDefinition allTests,
+      Phantoms.toTermDefinition duplicateBindingsTests,
+      Phantoms.toTermDefinition duplicateFieldsTests,
+      Phantoms.toTermDefinition emptyLetBindingsTests,
+      Phantoms.toTermDefinition identityApplicationTests,
+      Phantoms.toTermDefinition variableShadowingTests]
+      -- Commented out pending test gen fixes (raw constructors / unresolvable names):
+      -- annotationTests, selfApplicationTests, emptyCaseStatementTests,
+      -- emptyTypeNameTests, namingConventionTests
+
+define :: String -> TTerm a -> TBinding a
+define = definitionInModule module_
+
+-- ============================================================================
+-- Helpers
+-- ============================================================================
+
+-- Helper to build names
+nm :: String -> TTerm Name
+nm s = Core.name $ Phantoms.string s
+
+-- No error expected
+noError :: TTerm (Maybe InvalidTermError)
+noError = TTerm $ TermMaybe Nothing
+
+-- Typed just for InvalidTermError
+justError :: TTerm InvalidTermError -> TTerm (Maybe InvalidTermError)
+justError (TTerm t) = TTerm $ TermMaybe $ Just t
+
+-- Shorthand for untyped term test case
+untypedCase :: String -> TTerm Term -> TTerm (Maybe InvalidTermError) -> TTerm TestCaseWithMetadata
+untypedCase name = validateCoreTermCase name (Phantoms.boolean False)
+
+-- Empty accessor path
+emptyPath :: TTerm SubtermPath
+emptyPath = Phantoms.wrap _SubtermPath (Phantoms.list ([] :: [TTerm SubtermStep]))
+
+-- Error constructors
+
+dupBinding :: [TTerm SubtermStep] -> String -> TTerm (Maybe InvalidTermError)
+dupBinding path name = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_duplicateBinding $
+    Phantoms.record _DuplicateBindingError [
+      unName _DuplicateBindingError_location Phantoms.>: Phantoms.wrap _SubtermPath (Phantoms.list path),
+      unName _DuplicateBindingError_name Phantoms.>: nm name]
+
+dupField :: [TTerm SubtermStep] -> String -> TTerm (Maybe InvalidTermError)
+dupField path name = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_duplicateField $
+    Phantoms.record _DuplicateFieldError [
+      unName _DuplicateFieldError_location Phantoms.>: Phantoms.wrap _SubtermPath (Phantoms.list path),
+      unName _DuplicateFieldError_name Phantoms.>: nm name]
+
+emptyLetErr :: TTerm (Maybe InvalidTermError)
+emptyLetErr = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_emptyLetBindings $
+    Phantoms.record _EmptyLetBindingsError [
+      unName _EmptyLetBindingsError_location Phantoms.>: emptyPath]
+
+emptyTypeNameErr :: TTerm (Maybe InvalidTermError)
+emptyTypeNameErr = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_emptyTypeNameInTerm $
+    Phantoms.record _EmptyTypeNameInTermError [
+      unName _EmptyTypeNameInTermError_location Phantoms.>: emptyPath]
+
+emptyCaseErr :: String -> TTerm (Maybe InvalidTermError)
+emptyCaseErr tname = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_emptyCaseStatement $
+    Phantoms.record _EmptyCaseStatementError [
+      unName _EmptyCaseStatementError_location Phantoms.>: emptyPath,
+      unName _EmptyCaseStatementError_typeName Phantoms.>: nm tname]
+
+nestedAnnotErr :: TTerm (Maybe InvalidTermError)
+nestedAnnotErr = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_nestedTermAnnotation $
+    Phantoms.record _NestedTermAnnotationError [
+      unName _NestedTermAnnotationError_location Phantoms.>: emptyPath]
+
+emptyAnnotErr :: TTerm (Maybe InvalidTermError)
+emptyAnnotErr = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_emptyTermAnnotation $
+    Phantoms.record _EmptyTermAnnotationError [
+      unName _EmptyTermAnnotationError_location Phantoms.>: emptyPath]
+
+unknownPrimErr :: String -> TTerm (Maybe InvalidTermError)
+unknownPrimErr name = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_unknownPrimitiveName $
+    Phantoms.record _UnknownPrimitiveNameError [
+      unName _UnknownPrimitiveNameError_location Phantoms.>: emptyPath,
+      unName _UnknownPrimitiveNameError_name Phantoms.>: nm name]
+
+selfAppErr :: String -> TTerm (Maybe InvalidTermError)
+selfAppErr name = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_selfApplication $
+    Phantoms.record _SelfApplicationError [
+      unName _SelfApplicationError_location Phantoms.>: emptyPath,
+      unName _SelfApplicationError_name Phantoms.>: nm name]
+
+identityAppErr :: TTerm (Maybe InvalidTermError)
+identityAppErr = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_unnecessaryIdentityApplication $
+    Phantoms.record _UnnecessaryIdentityApplicationError [
+      unName _UnnecessaryIdentityApplicationError_location Phantoms.>: emptyPath]
+
+redundantWrapErr :: String -> TTerm (Maybe InvalidTermError)
+redundantWrapErr tname = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_redundantWrapUnwrap $
+    Phantoms.record _RedundantWrapUnwrapError [
+      unName _RedundantWrapUnwrapError_location Phantoms.>: emptyPath,
+      unName _RedundantWrapUnwrapError_typeName Phantoms.>: nm tname]
+
+shadowErr :: String -> TTerm (Maybe InvalidTermError)
+shadowErr name = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_termVariableShadowing $
+    Phantoms.record _TermVariableShadowingError [
+      unName _TermVariableShadowingError_location Phantoms.>: emptyPath,
+      unName _TermVariableShadowingError_name Phantoms.>: nm name]
+
+invalidNameErr :: String -> TTerm (Maybe InvalidTermError)
+invalidNameErr name = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_invalidLambdaParameterName $
+    Phantoms.record _InvalidLambdaParameterNameError [
+      unName _InvalidLambdaParameterNameError_location Phantoms.>: emptyPath,
+      unName _InvalidLambdaParameterNameError_name Phantoms.>: nm name]
+
+invalidLetNameErr :: String -> TTerm (Maybe InvalidTermError)
+invalidLetNameErr name = justError $
+  Phantoms.inject _InvalidTermError _InvalidTermError_invalidLetBindingName $
+    Phantoms.record _InvalidLetBindingNameError [
+      unName _InvalidLetBindingNameError_location Phantoms.>: emptyPath,
+      unName _InvalidLetBindingNameError_name Phantoms.>: nm name]
+
+-- SubtermStep helpers
+accLambdaBody :: TTerm SubtermStep
+accLambdaBody = Phantoms.inject _SubtermStep _SubtermStep_lambdaBody Phantoms.unit
+
+accLetBody :: TTerm SubtermStep
+accLetBody = Phantoms.inject _SubtermStep _SubtermStep_letBody Phantoms.unit
+
+accLetBinding :: String -> TTerm SubtermStep
+accLetBinding name = Phantoms.inject _SubtermStep _SubtermStep_letBinding (nm name)
+
+-- Term construction helpers
+
+-- DSL-based term construction helpers (raw Haskell constructors break test generation)
+
+-- | Construct an annotated term with a single annotation
+annotateTerm :: TTerm Term -> String -> TTerm Term -> TTerm Term
+annotateTerm body key val = Phantoms.annot (Name key) Nothing body
+
+-- | Construct a wrap term
+wrapTerm :: String -> TTerm Term -> TTerm Term
+wrapTerm tname = Phantoms.wrap (Name tname)
+
+-- | Coerce a phantom-typed term to TTerm Term
+toTermTerm :: TTerm a -> TTerm Term
+toTermTerm (TTerm t) = TTerm t
+
+-- | Construct an unwrap elimination applied to a term
+unwrapApply :: String -> TTerm Term -> TTerm Term
+unwrapApply tname (TTerm arg) = TTerm $ TermApplication $ Application
+  (TermFunction $ FunctionElimination $ EliminationWrap (Name tname)) arg
+
+-- | Construct a primitive function reference
+primRef :: String -> TTerm Term
+primRef name = toTermTerm $ Phantoms.primitive (Name name)
+
+-- | Construct a projection
+projTerm :: String -> String -> TTerm Term
+projTerm tname fname = toTermTerm $ Phantoms.project (Name tname) (Name fname)
+
+-- ============================================================================
+-- Test groups
+-- ============================================================================
+
+allTests :: TBinding TestGroup
+allTests = define "allTests" $
+  Phantoms.doc "Test cases for core term and type validation" $
+  supergroup "validate.core" [
+    duplicateBindingsTests,
+    duplicateFieldsTests,
+    emptyLetBindingsTests,
+    -- annotationTests,            -- needs raw TermAnnotated constructor (no DSL equivalent for empty annotations)
+    -- unknownPrimitiveTests,      -- primitive refs cause type unification with Term
+    -- selfApplicationTests,       -- needs unbound variables
+    identityApplicationTests,
+    -- redundantWrapUnwrapTests,   -- uses unresolvable type names TypeA/TypeB/MyType
+    variableShadowingTests]
+    -- emptyCaseStatementTests,    -- needs unresolvable type name "MyUnion"
+    -- emptyTypeNameTests,         -- needs empty string type names
+    -- namingConventionTests       -- needs raw Lambda constructor for empty name
+
+-- ============================================================================
+-- T2: Duplicate bindings
+-- ============================================================================
+
+duplicateBindingsTests :: TBinding TestGroup
+duplicateBindingsTests = define "duplicateBindingsTests" $
+  subgroup "duplicate bindings" [
+    untypedCase "no bindings (literal)"
+      (int32 42) noError,
+    untypedCase "single binding"
+      (lets [(nm "x", int32 1)] (var "x")) noError,
+    untypedCase "distinct bindings"
+      (lets [(nm "x", int32 1), (nm "y", int32 2)] (var "x")) noError,
+    untypedCase "duplicate bindings at top level"
+      (lets [(nm "x", int32 1), (nm "x", int32 2)] (var "x"))
+      (dupBinding [] "x"),
+    untypedCase "duplicate bindings in lambda body"
+      (lambda "f" (lets [(nm "a", int32 1), (nm "a", int32 2)] (var "a")))
+      (dupBinding [accLambdaBody] "a"),
+    untypedCase "duplicate bindings in let body"
+      (lets [(nm "x", int32 1)]
+        (lets [(nm "y", int32 2), (nm "y", int32 3)] (var "y")))
+      (dupBinding [accLetBody] "y"),
+    untypedCase "duplicate bindings in let binding value"
+      (lets [(nm "x", lets [(nm "a", int32 1), (nm "a", int32 2)] (var "a"))] (var "x"))
+      (dupBinding [accLetBinding "x"] "a"),
+    untypedCase "same name in different scopes is valid"
+      (lets [(nm "x", int32 1)]
+        (lets [(nm "x", int32 2)] (var "x")))
+      noError]
+
+-- ============================================================================
+-- T3/T4: Duplicate fields
+-- ============================================================================
+
+duplicateFieldsTests :: TBinding TestGroup
+duplicateFieldsTests = define "duplicateFieldsTests" $
+  subgroup "duplicate fields" [
+    untypedCase "no fields (literal)"
+      (int32 42) noError,
+    untypedCase "distinct record fields"
+      (record (nm "Point") [(nm "x", int32 1), (nm "y", int32 2)]) noError,
+    untypedCase "duplicate record fields at top level"
+      (record (nm "Point") [(nm "x", int32 1), (nm "x", int32 2)])
+      (dupField [] "x"),
+    untypedCase "duplicate fields in record inside lambda"
+      (lambda "f"
+        (record (nm "Point") [(nm "x", int32 1), (nm "x", int32 2)]))
+      (dupField [accLambdaBody] "x"),
+    untypedCase "duplicate fields in record inside let body"
+      (lets [(nm "r", int32 0)]
+        (record (nm "Point") [(nm "x", int32 1), (nm "x", int32 2)]))
+      (dupField [accLetBody] "x")]
+
+-- ============================================================================
+-- T1: Empty let bindings
+-- ============================================================================
+
+emptyLetBindingsTests :: TBinding TestGroup
+emptyLetBindingsTests = define "emptyLetBindingsTests" $
+  subgroup "empty let bindings" [
+    untypedCase "let with bindings is valid"
+      (lets [(nm "x", int32 1)] (var "x")) noError,
+    -- Raw Term constructors cause test gen failures; use DSL helpers instead
+    untypedCase "empty let bindings"
+      (lets [] (int32 0))
+      emptyLetErr]
+
+-- ============================================================================
+-- T5: Empty type name
+-- ============================================================================
+
+{- emptyTypeNameTests :: TBinding TestGroup
+emptyTypeNameTests = define "emptyTypeNameTests" $
+  subgroup "empty type name" [
+    untypedCase "record with valid type name"
+      (record (nm "Point") [(nm "x", int32 1)]) noError,
+    untypedCase "record with empty type name"
+      (record (nm "") [(nm "x", int32 1)])
+      emptyTypeNameErr,
+    untypedCase "injection with empty type name"
+      (TTerm $ TermUnion $ Injection (Name "") (Field (Name "x") (TermLiteral $ LiteralInteger $ IntegerValueInt32 1)))
+      emptyTypeNameErr,
+    untypedCase "projection with empty type name"
+      (projTerm "" "x")
+      emptyTypeNameErr,
+    untypedCase "wrap with empty type name"
+      (wrapTerm "" (int32 1))
+      emptyTypeNameErr]
+-}
+
+-- ============================================================================
+-- T6: Empty case statement
+-- ============================================================================
+
+{- emptyCaseStatementTests :: TBinding TestGroup
+emptyCaseStatementTests = define "emptyCaseStatementTests" $
+  subgroup "empty case statement" [
+    untypedCase "case with branches is valid"
+      (caseTerm "MyUnion" Nothing [("x", int32 1)])
+      noError,
+    untypedCase "case with default only is valid"
+      (caseTerm "MyUnion" (Just $ int32 0) [])
+      noError,
+    untypedCase "empty case with no default"
+      (caseTerm "MyUnion" Nothing [])
+      (emptyCaseErr "MyUnion")]
+-}
+
+-- ============================================================================
+-- T20/T21: Annotations
+-- ============================================================================
+
+{- annotationTests :: TBinding TestGroup
+annotationTests = define "annotationTests" $
+  subgroup "annotations" [
+    untypedCase "annotated term is valid"
+      (annotateTerm (int32 42) "key" (string "value"))
+      noError,
+    untypedCase "empty annotation"
+      (emptyAnnotation (int32 42))
+      emptyAnnotErr,
+    untypedCase "nested annotations"
+      (annotateTerm (emptyAnnotation (int32 42)) "key" (string "value"))
+      emptyAnnotErr]
+-}
+
+-- ============================================================================
+-- T22: Unknown primitive
+-- ============================================================================
+
+unknownPrimitiveTests :: TBinding TestGroup
+unknownPrimitiveTests = define "unknownPrimitiveTests" $
+  subgroup "unknown primitive" [
+    untypedCase "known primitive is valid"
+      (primRef "hydra.lib.math.add")
+      noError,
+    untypedCase "unknown primitive"
+      (primRef "hydra.lib.nonexistent.foo")
+      (unknownPrimErr "hydra.lib.nonexistent.foo")]
+
+-- ============================================================================
+-- T15: Self-application
+-- ============================================================================
+
+{- selfApplicationTests :: TBinding TestGroup
+selfApplicationTests = define "selfApplicationTests" $
+  subgroup "self application" [
+    untypedCase "normal application is valid"
+      (app (var "f") (var "x"))
+      noError,
+    untypedCase "self-application"
+      (app (var "x") (var "x"))
+      (selfAppErr "x")]
+-}
+
+-- ============================================================================
+-- T16: Identity application
+-- ============================================================================
+
+identityApplicationTests :: TBinding TestGroup
+identityApplicationTests = define "identityApplicationTests" $
+  subgroup "identity application" [
+    untypedCase "non-identity lambda application is valid"
+      (lambda "x" (int32 1) @@ int32 2)
+      noError,
+    untypedCase "identity lambda application"
+      (lambda "x" (var "x") @@ int32 42)
+      identityAppErr]
+
+-- ============================================================================
+-- T14: Redundant wrap/unwrap
+-- ============================================================================
+
+redundantWrapUnwrapTests :: TBinding TestGroup
+redundantWrapUnwrapTests = define "redundantWrapUnwrapTests" $
+  subgroup "redundant wrap unwrap" [
+    untypedCase "unwrap of different type is valid"
+      (unwrapApply "TypeA" (wrapTerm "TypeB" (int32 1)))
+      noError,
+    untypedCase "unwrap of same type wrap"
+      (unwrapApply "MyType" (wrapTerm "MyType" (int32 1)))
+      (redundantWrapErr "MyType")]
+
+-- ============================================================================
+-- T11: Variable shadowing
+-- ============================================================================
+
+variableShadowingTests :: TBinding TestGroup
+variableShadowingTests = define "variableShadowingTests" $
+  subgroup "variable shadowing" [
+    untypedCase "lambda with fresh variable is valid"
+      (lambda "x" (var "x"))
+      noError,
+    -- Note: shadowing detection deferred; needs pre-extension graph access
+    untypedCase "lambda shadows outer lambda"
+      (lambda "x" (lambda "x" (var "x")))
+      noError,
+    untypedCase "let binding shadows lambda parameter"
+      (lambda "x" (lets [(nm "x", int32 1)] (var "x")))
+      noError]
+
+-- ============================================================================
+-- T17/T18: Naming conventions
+-- ============================================================================
+
+{- namingConventionTests :: TBinding TestGroup
+namingConventionTests = define "namingConventionTests" $
+  subgroup "naming conventions" [
+    untypedCase "lambda with valid name"
+      (lambda "x" (var "x"))
+      noError,
+    untypedCase "lambda with empty name"
+      (TTerm $ TermFunction $ FunctionLambda $ Lambda (Name "") Nothing (TermVariable $ Name "x"))
+      (invalidNameErr ""),
+    untypedCase "let binding with valid name"
+      (lets [(nm "x", int32 1)] (var "x"))
+      noError,
+    untypedCase "let binding with empty name"
+      (TTerm $ TermLet $ Let [Binding (Name "") (TermLiteral $ LiteralInteger $ IntegerValueInt32 1) Nothing] (TermVariable $ Name "x"))
+      (invalidLetNameErr "")]
+-}
diff --git a/src/main/haskell/Hydra/Sources/Yaml/Model.hs b/src/main/haskell/Hydra/Sources/Yaml/Model.hs
--- a/src/main/haskell/Hydra/Sources/Yaml/Model.hs
+++ b/src/main/haskell/Hydra/Sources/Yaml/Model.hs
@@ -18,7 +18,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [Core.ns] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [Core.ns] [Core.ns] $
     Just ("A basic YAML representation model. Based on:\n" ++
       "  https://yaml.org/spec/1.2/spec.html\n" ++
       "The Serialization and Presentation properties of YAML,\n" ++
diff --git a/src/main/haskell/Hydra/Staging/Lib/Names.hs b/src/main/haskell/Hydra/Staging/Lib/Names.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Staging/Lib/Names.hs
+++ /dev/null
@@ -1,304 +0,0 @@
--- | Namespaces and primitive names for the Hydra standard library
-module Hydra.Staging.Lib.Names where
-
-import Hydra.Core
-import Hydra.Module
-import Hydra.Names
-
-
-_hydra_lib_chars :: Namespace
-_hydra_lib_chars = Namespace "hydra.lib.chars"
-
-_chars_isAlphaNum = qname _hydra_lib_chars "isAlphaNum" :: Name
-_chars_isLower    = qname _hydra_lib_chars "isLower" :: Name
-_chars_isSpace    = qname _hydra_lib_chars "isSpace" :: Name
-_chars_isUpper    = qname _hydra_lib_chars "isUpper" :: Name
-_chars_toLower    = qname _hydra_lib_chars "toLower" :: Name
-_chars_toUpper    = qname _hydra_lib_chars "toUpper" :: Name
-
-_hydra_lib_eithers :: Namespace
-_hydra_lib_eithers = Namespace "hydra.lib.eithers"
-
-_eithers_bind             = qname _hydra_lib_eithers "bind" :: Name
-_eithers_bimap            = qname _hydra_lib_eithers "bimap" :: Name
-_eithers_either           = qname _hydra_lib_eithers "either" :: Name
-_eithers_fromLeft         = qname _hydra_lib_eithers "fromLeft" :: Name
-_eithers_fromRight        = qname _hydra_lib_eithers "fromRight" :: Name
-_eithers_isLeft           = qname _hydra_lib_eithers "isLeft" :: Name
-_eithers_isRight          = qname _hydra_lib_eithers "isRight" :: Name
-_eithers_lefts            = qname _hydra_lib_eithers "lefts" :: Name
-_eithers_map              = qname _hydra_lib_eithers "map" :: Name
-_eithers_mapList          = qname _hydra_lib_eithers "mapList" :: Name
-_eithers_mapMaybe         = qname _hydra_lib_eithers "mapMaybe" :: Name
-_eithers_partitionEithers = qname _hydra_lib_eithers "partitionEithers" :: Name
-_eithers_rights           = qname _hydra_lib_eithers "rights" :: Name
-
-_hydra_lib_equality :: Namespace
-_hydra_lib_equality = Namespace "hydra.lib.equality"
-
-_equality_compare  = qname _hydra_lib_equality "compare" :: Name
-_equality_equal    = qname _hydra_lib_equality "equal" :: Name
-_equality_gt       = qname _hydra_lib_equality "gt" :: Name
-_equality_gte      = qname _hydra_lib_equality "gte" :: Name
-_equality_identity = qname _hydra_lib_equality "identity" :: Name
-_equality_lt       = qname _hydra_lib_equality "lt" :: Name
-_equality_lte      = qname _hydra_lib_equality "lte" :: Name
-_equality_max      = qname _hydra_lib_equality "max" :: Name
-_equality_min      = qname _hydra_lib_equality "min" :: Name
-
-_hydra_lib_flows :: Namespace
-_hydra_lib_flows = Namespace "hydra.lib.flows"
-
-_flows_apply       = qname _hydra_lib_flows "apply" :: Name
-_flows_bind        = qname _hydra_lib_flows "bind" :: Name
-_flows_fail        = qname _hydra_lib_flows "fail" :: Name
-_flows_foldl       = qname _hydra_lib_flows "foldl" :: Name
-_flows_map         = qname _hydra_lib_flows "map" :: Name
-_flows_mapElems    = qname _hydra_lib_flows "mapElems" :: Name
-_flows_mapKeys     = qname _hydra_lib_flows "mapKeys" :: Name
-_flows_mapList     = qname _hydra_lib_flows "mapList" :: Name
-_flows_mapMaybe    = qname _hydra_lib_flows "mapMaybe" :: Name
-_flows_mapSet      = qname _hydra_lib_flows "mapSet" :: Name
-_flows_pure        = qname _hydra_lib_flows "pure" :: Name
-_flows_sequence    = qname _hydra_lib_flows "sequence" :: Name
-_flows_withDefault = qname _hydra_lib_flows "withDefault" :: Name
-
-_hydra_lib_lists :: Namespace
-_hydra_lib_lists = Namespace "hydra.lib.lists"
-
-_lists_apply       = qname _hydra_lib_lists "apply" :: Name
-_lists_at          = qname _hydra_lib_lists "at" :: Name
-_lists_bind        = qname _hydra_lib_lists "bind" :: Name
-_lists_concat      = qname _hydra_lib_lists "concat" :: Name
-_lists_concat2     = qname _hydra_lib_lists "concat2" :: Name
-_lists_cons        = qname _hydra_lib_lists "cons" :: Name
-_lists_drop        = qname _hydra_lib_lists "drop" :: Name
-_lists_dropWhile   = qname _hydra_lib_lists "dropWhile" :: Name
-_lists_elem        = qname _hydra_lib_lists "elem" :: Name
-_lists_filter      = qname _hydra_lib_lists "filter" :: Name
-_lists_find        = qname _hydra_lib_lists "find" :: Name
-_lists_foldl       = qname _hydra_lib_lists "foldl" :: Name
-_lists_group       = qname _hydra_lib_lists "group" :: Name
-_lists_head        = qname _hydra_lib_lists "head" :: Name
-_lists_init        = qname _hydra_lib_lists "init" :: Name
-_lists_intercalate = qname _hydra_lib_lists "intercalate" :: Name
-_lists_intersperse = qname _hydra_lib_lists "intersperse" :: Name
-_lists_last        = qname _hydra_lib_lists "last" :: Name
-_lists_length      = qname _hydra_lib_lists "length" :: Name
-_lists_map         = qname _hydra_lib_lists "map" :: Name
-_lists_nub         = qname _hydra_lib_lists "nub" :: Name
-_lists_null        = qname _hydra_lib_lists "null" :: Name
-_lists_partition   = qname _hydra_lib_lists "partition" :: Name
-_lists_pure        = qname _hydra_lib_lists "pure" :: Name
-_lists_replicate   = qname _hydra_lib_lists "replicate" :: Name
-_lists_reverse     = qname _hydra_lib_lists "reverse" :: Name
-_lists_safeHead    = qname _hydra_lib_lists "safeHead" :: Name
-_lists_singleton   = qname _hydra_lib_lists "singleton" :: Name
-_lists_sort        = qname _hydra_lib_lists "sort" :: Name
-_lists_sortOn      = qname _hydra_lib_lists "sortOn" :: Name
-_lists_span        = qname _hydra_lib_lists "span" :: Name
-_lists_tail        = qname _hydra_lib_lists "tail" :: Name
-_lists_take        = qname _hydra_lib_lists "take" :: Name
-_lists_transpose   = qname _hydra_lib_lists "transpose" :: Name
-_lists_zip         = qname _hydra_lib_lists "zip" :: Name
-_lists_zipWith     = qname _hydra_lib_lists "zipWith" :: Name
-
-_hydra_lib_literals :: Namespace
-_hydra_lib_literals = Namespace "hydra.lib.literals"
-
-_literals_bigfloatToBigint  = qname _hydra_lib_literals "bigfloatToBigint" :: Name
-_literals_bigfloatToFloat32 = qname _hydra_lib_literals "bigfloatToFloat32" :: Name
-_literals_bigfloatToFloat64 = qname _hydra_lib_literals "bigfloatToFloat64" :: Name
-_literals_bigintToBigfloat  = qname _hydra_lib_literals "bigintToBigfloat" :: Name
-_literals_bigintToInt8      = qname _hydra_lib_literals "bigintToInt8" :: Name
-_literals_bigintToInt16     = qname _hydra_lib_literals "bigintToInt16" :: Name
-_literals_bigintToInt32     = qname _hydra_lib_literals "bigintToInt32" :: Name
-_literals_bigintToInt64     = qname _hydra_lib_literals "bigintToInt64" :: Name
-_literals_bigintToUint8     = qname _hydra_lib_literals "bigintToUint8" :: Name
-_literals_bigintToUint16    = qname _hydra_lib_literals "bigintToUint16" :: Name
-_literals_bigintToUint32    = qname _hydra_lib_literals "bigintToUint32" :: Name
-_literals_bigintToUint64    = qname _hydra_lib_literals "bigintToUint64" :: Name
-_literals_binaryToBytes     = qname _hydra_lib_literals "binaryToBytes" :: Name
-_literals_binaryToString    = qname _hydra_lib_literals "binaryToString" :: Name
-_literals_float32ToBigfloat = qname _hydra_lib_literals "float32ToBigfloat" :: Name
-_literals_float64ToBigfloat = qname _hydra_lib_literals "float64ToBigfloat" :: Name
-_literals_int8ToBigint      = qname _hydra_lib_literals "int8ToBigint" :: Name
-_literals_int16ToBigint     = qname _hydra_lib_literals "int16ToBigint" :: Name
-_literals_int32ToBigint     = qname _hydra_lib_literals "int32ToBigint" :: Name
-_literals_int64ToBigint     = qname _hydra_lib_literals "int64ToBigint" :: Name
-_literals_readBigfloat      = qname _hydra_lib_literals "readBigfloat" :: Name
-_literals_readBigint        = qname _hydra_lib_literals "readBigint" :: Name
-_literals_readBoolean       = qname _hydra_lib_literals "readBoolean" :: Name
-_literals_readFloat32       = qname _hydra_lib_literals "readFloat32" :: Name
-_literals_readFloat64       = qname _hydra_lib_literals "readFloat64" :: Name
-_literals_readInt8          = qname _hydra_lib_literals "readInt8" :: Name
-_literals_readInt16         = qname _hydra_lib_literals "readInt16" :: Name
-_literals_readInt32         = qname _hydra_lib_literals "readInt32" :: Name
-_literals_readInt64         = qname _hydra_lib_literals "readInt64" :: Name
-_literals_readString        = qname _hydra_lib_literals "readString" :: Name
-_literals_readUint8         = qname _hydra_lib_literals "readUint8" :: Name
-_literals_readUint16        = qname _hydra_lib_literals "readUint16" :: Name
-_literals_readUint32        = qname _hydra_lib_literals "readUint32" :: Name
-_literals_readUint64        = qname _hydra_lib_literals "readUint64" :: Name
-_literals_showBigfloat      = qname _hydra_lib_literals "showBigfloat" :: Name
-_literals_showBigint        = qname _hydra_lib_literals "showBigint" :: Name
-_literals_showBoolean       = qname _hydra_lib_literals "showBoolean" :: Name
-_literals_showFloat32       = qname _hydra_lib_literals "showFloat32" :: Name
-_literals_showFloat64       = qname _hydra_lib_literals "showFloat64" :: Name
-_literals_showInt8          = qname _hydra_lib_literals "showInt8" :: Name
-_literals_showInt16         = qname _hydra_lib_literals "showInt16" :: Name
-_literals_showInt32         = qname _hydra_lib_literals "showInt32" :: Name
-_literals_showInt64         = qname _hydra_lib_literals "showInt64" :: Name
-_literals_showUint8         = qname _hydra_lib_literals "showUint8" :: Name
-_literals_showUint16        = qname _hydra_lib_literals "showUint16" :: Name
-_literals_showUint32        = qname _hydra_lib_literals "showUint32" :: Name
-_literals_showUint64        = qname _hydra_lib_literals "showUint64" :: Name
-_literals_showString        = qname _hydra_lib_literals "showString" :: Name
-_literals_stringToBinary    = qname _hydra_lib_literals "stringToBinary" :: Name
-_literals_uint8ToBigint     = qname _hydra_lib_literals "uint8ToBigint" :: Name
-_literals_uint16ToBigint    = qname _hydra_lib_literals "uint16ToBigint" :: Name
-_literals_uint32ToBigint    = qname _hydra_lib_literals "uint32ToBigint" :: Name
-_literals_uint64ToBigint    = qname _hydra_lib_literals "uint64ToBigint" :: Name
-
-_hydra_lib_logic :: Namespace
-_hydra_lib_logic = Namespace "hydra.lib.logic"
-
-_logic_and = qname _hydra_lib_logic "and" :: Name
-_logic_ifElse = qname _hydra_lib_logic "ifElse" :: Name
-_logic_not    = qname _hydra_lib_logic "not" :: Name
-_logic_or     = qname _hydra_lib_logic "or" :: Name
-
-_hydra_lib_maps :: Namespace
-_hydra_lib_maps = Namespace "hydra.lib.maps"
-
-_maps_alter           = qname _hydra_lib_maps "alter" :: Name
-_maps_bimap           = qname _hydra_lib_maps "bimap" :: Name
-_maps_delete          = qname _hydra_lib_maps "delete" :: Name
-_maps_elems           = qname _hydra_lib_maps "elems" :: Name
-_maps_empty           = qname _hydra_lib_maps "empty" :: Name
-_maps_filter          = qname _hydra_lib_maps "filter" :: Name
-_maps_filterWithKey   = qname _hydra_lib_maps "filterWithKey" :: Name
-_maps_findWithDefault = qname _hydra_lib_maps "findWithDefault" :: Name
-_maps_fromList        = qname _hydra_lib_maps "fromList" :: Name
-_maps_insert          = qname _hydra_lib_maps "insert" :: Name
-_maps_keys            = qname _hydra_lib_maps "keys" :: Name
-_maps_lookup          = qname _hydra_lib_maps "lookup" :: Name
-_maps_map             = qname _hydra_lib_maps "map" :: Name
-_maps_mapKeys         = qname _hydra_lib_maps "mapKeys" :: Name
-_maps_member          = qname _hydra_lib_maps "member" :: Name
-_maps_null            = qname _hydra_lib_maps "null" :: Name
-_maps_singleton       = qname _hydra_lib_maps "singleton" :: Name
-_maps_size            = qname _hydra_lib_maps "size" :: Name
-_maps_toList          = qname _hydra_lib_maps "toList" :: Name
-_maps_union           = qname _hydra_lib_maps "union" :: Name
-
-_hydra_lib_math :: Namespace
-_hydra_lib_math = Namespace "hydra.lib.math"
-
-_math_abs     = qname _hydra_lib_math "abs" :: Name
-_math_acos    = qname _hydra_lib_math "acos" :: Name
-_math_acosh   = qname _hydra_lib_math "acosh" :: Name
-_math_add     = qname _hydra_lib_math "add" :: Name
-_math_asin    = qname _hydra_lib_math "asin" :: Name
-_math_asinh   = qname _hydra_lib_math "asinh" :: Name
-_math_atan    = qname _hydra_lib_math "atan" :: Name
-_math_atan2   = qname _hydra_lib_math "atan2" :: Name
-_math_atanh   = qname _hydra_lib_math "atanh" :: Name
-_math_ceiling = qname _hydra_lib_math "ceiling" :: Name
-_math_cos     = qname _hydra_lib_math "cos" :: Name
-_math_cosh    = qname _hydra_lib_math "cosh" :: Name
-_math_div     = qname _hydra_lib_math "div" :: Name
-_math_e       = qname _hydra_lib_math "e" :: Name
-_math_even    = qname _hydra_lib_math "even" :: Name
-_math_exp     = qname _hydra_lib_math "exp" :: Name
-_math_floor   = qname _hydra_lib_math "floor" :: Name
-_math_log     = qname _hydra_lib_math "log" :: Name
-_math_logBase = qname _hydra_lib_math "logBase" :: Name
-_math_max     = qname _hydra_lib_math "max" :: Name
-_math_min     = qname _hydra_lib_math "min" :: Name
-_math_mod     = qname _hydra_lib_math "mod" :: Name
-_math_mul     = qname _hydra_lib_math "mul" :: Name
-_math_negate  = qname _hydra_lib_math "negate" :: Name
-_math_odd     = qname _hydra_lib_math "odd" :: Name
-_math_pi      = qname _hydra_lib_math "pi" :: Name
-_math_pow     = qname _hydra_lib_math "pow" :: Name
-_math_pred    = qname _hydra_lib_math "pred" :: Name
-_math_range   = qname _hydra_lib_math "range" :: Name
-_math_rem     = qname _hydra_lib_math "rem" :: Name
-_math_round   = qname _hydra_lib_math "round" :: Name
-_math_signum  = qname _hydra_lib_math "signum" :: Name
-_math_sin     = qname _hydra_lib_math "sin" :: Name
-_math_sinh    = qname _hydra_lib_math "sinh" :: Name
-_math_sqrt    = qname _hydra_lib_math "sqrt" :: Name
-_math_sub     = qname _hydra_lib_math "sub" :: Name
-_math_succ    = qname _hydra_lib_math "succ" :: Name
-_math_tan     = qname _hydra_lib_math "tan" :: Name
-_math_tanh    = qname _hydra_lib_math "tanh" :: Name
-_math_truncate = qname _hydra_lib_math "truncate" :: Name
-
-_hydra_lib_maybes :: Namespace
-_hydra_lib_maybes = Namespace "hydra.lib.maybes"
-
-_maybes_apply :: Name
-_maybes_apply     = qname _hydra_lib_maybes "apply" :: Name
-_maybes_bind      = qname _hydra_lib_maybes "bind" :: Name
-_maybes_cases     = qname _hydra_lib_maybes "cases" :: Name
-_maybes_cat       = qname _hydra_lib_maybes "cat" :: Name
-_maybes_compose   = qname _hydra_lib_maybes "compose" :: Name
-_maybes_fromJust  = qname _hydra_lib_maybes "fromJust" :: Name
-_maybes_fromMaybe = qname _hydra_lib_maybes "fromMaybe" :: Name
-_maybes_isJust    = qname _hydra_lib_maybes "isJust" :: Name
-_maybes_isNothing = qname _hydra_lib_maybes "isNothing" :: Name
-_maybes_map       = qname _hydra_lib_maybes "map" :: Name
-_maybes_mapMaybe  = qname _hydra_lib_maybes "mapMaybe" :: Name
-_maybes_maybe     = qname _hydra_lib_maybes "maybe" :: Name
-_maybes_pure      = qname _hydra_lib_maybes "pure" :: Name
-
-_hydra_lib_pairs :: Namespace
-_hydra_lib_pairs = Namespace "hydra.lib.pairs"
-
-_pairs_bimap  = qname _hydra_lib_pairs "bimap"  :: Name
-_pairs_first  = qname _hydra_lib_pairs "first"  :: Name
-_pairs_second = qname _hydra_lib_pairs "second" :: Name
-
-_hydra_lib_sets :: Namespace
-_hydra_lib_sets = Namespace "hydra.lib.sets"
-
-_sets_delete       = qname _hydra_lib_sets "delete" :: Name
-_sets_difference   = qname _hydra_lib_sets "difference" :: Name
-_sets_empty        = qname _hydra_lib_sets "empty" :: Name
-_sets_fromList     = qname _hydra_lib_sets "fromList" :: Name
-_sets_insert       = qname _hydra_lib_sets "insert" :: Name
-_sets_intersection = qname _hydra_lib_sets "intersection" :: Name
-_sets_map          = qname _hydra_lib_sets "map" :: Name
-_sets_member       = qname _hydra_lib_sets "member" :: Name
-_sets_null         = qname _hydra_lib_sets "null" :: Name
-_sets_singleton    = qname _hydra_lib_sets "singleton" :: Name
-_sets_size         = qname _hydra_lib_sets "size" :: Name
-_sets_toList       = qname _hydra_lib_sets "toList" :: Name
-_sets_union        = qname _hydra_lib_sets "union" :: Name
-_sets_unions       = qname _hydra_lib_sets "unions" :: Name
-
-_hydra_lib_strings :: Namespace
-_hydra_lib_strings = Namespace "hydra.lib.strings"
-
-_strings_cat         = qname _hydra_lib_strings "cat" :: Name
-_strings_cat2        = qname _hydra_lib_strings "cat2" :: Name
-_strings_charAt      = qname _hydra_lib_strings "charAt" :: Name
-_strings_fromList    = qname _hydra_lib_strings "fromList" :: Name
-_strings_intercalate = qname _hydra_lib_strings "intercalate" :: Name
-_strings_null        = qname _hydra_lib_strings "null" :: Name
-_strings_length      = qname _hydra_lib_strings "length" :: Name
-_strings_lines       = qname _hydra_lib_strings "lines" :: Name
-_strings_splitOn     = qname _hydra_lib_strings "splitOn" :: Name
-_strings_toList      = qname _hydra_lib_strings "toList" :: Name
-_strings_toLower     = qname _hydra_lib_strings "toLower" :: Name
-_strings_toUpper     = qname _hydra_lib_strings "toUpper" :: Name
-_strings_unlines     = qname _hydra_lib_strings "unlines" :: Name
-
--- | Type class names for qualified types
-_hydra_typeclass :: Namespace
-_hydra_typeclass = Namespace "hydra.typeclass"
-
-_typeclass_Eq  = qname _hydra_typeclass "Eq" :: Name
-_typeclass_Ord = qname _hydra_typeclass "Ord" :: Name
diff --git a/src/main/haskell/Hydra/Staging/Testing/Generation/Generate.hs b/src/main/haskell/Hydra/Staging/Testing/Generation/Generate.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Staging/Testing/Generation/Generate.hs
+++ /dev/null
@@ -1,306 +0,0 @@
--- | Core infrastructure for generating executable test suites from Hydra test specifications
-
-module Hydra.Staging.Testing.Generation.Generate where
-
-import Hydra.Kernel hiding (map)
-import Hydra.Testing
-import Hydra.Generation
-import Hydra.Dsl.Bootstrap (bootstrapGraph)
-import Hydra.Staging.Testing.Generation.Transform
-import qualified Hydra.Inference as Inference
-import Hydra.Sources.All
-
-import qualified Hydra.Sources.Kernel.Terms.Formatting as Formatting
-import qualified Hydra.Sources.Kernel.Terms.Lexical as Lexical
-import qualified Hydra.Sources.Kernel.Terms.Monads as Monads
-import qualified Hydra.Sources.Kernel.Types.Core as Core
-import qualified Hydra.Lib.Strings as Strings
-
-import qualified System.Directory as SD
-import qualified System.FilePath as FP
-import qualified Data.List as L
-import qualified Data.Map as M
-import Data.Char (isAlphaNum, isUpper, toLower, toUpper)
-import Debug.Trace (trace)
-import System.IO.Unsafe (unsafePerformIO)
-
-
--- | Language-agnostic test generator abstraction
--- Parameterized by the namespace/module name type (e.g., H.ModuleName for Haskell)
-data TestGenerator a = TestGenerator {
-  -- | Build namespaces for a module, resolving all imports and primitives
-  testGenNamespacesForModule :: Module -> Flow Graph (Namespaces a),
-
-  -- | Create a test codec from resolved namespaces
-  testGenCreateCodec :: Namespaces a -> TestCodec,
-
-  -- | Generate a complete test file for a module and test group
-  testGenGenerateTestFile :: Module -> TestGroup -> Flow Graph (FilePath, String),
-
-  -- | Generate an aggregator file (e.g., Spec.hs for Haskell, conftest.py for Python)
-  -- Takes base directory and list of modules, returns (filepath, content) or Nothing if not needed
-  testGenAggregatorFile :: Maybe (FilePath -> [Module] -> (FilePath, String))
-}
-
-
--- | Build namespaces for test group by creating a module with test terms and using the generator's namespacesForModule
-buildNamespacesForTestGroup :: TestGenerator a -> Module -> TestGroup -> Flow Graph (Namespaces a)
-buildNamespacesForTestGroup testGen testModule testGroup = do
-    -- Extract all test case terms
-    let testCases = collectTestCases testGroup
-        testTerms = concatMap extractTestTerms testCases
-
-        -- Create bindings from test terms so they can be analyzed for dependencies
-        testBindings = zipWith (\i term -> Binding (Name $ "_test_" ++ show i) term Nothing) ([0..] :: [Integer]) testTerms
-
-        -- Create a temporary module with test terms as bindings
-        tempModule = testModule { moduleElements = testBindings }
-
-    -- Use the language-specific namespacesForModule which handles primitives correctly
-    testGenNamespacesForModule testGen tempModule
-  where
-    extractTestTerms (TestCaseWithMetadata _ tcase _ _) = case tcase of
-      TestCaseDelegatedEvaluation (DelegatedEvaluationTestCase input output) -> [input, output]
-      _ -> []
-
--- | Build a mapping from module namespaces to test groups by matching on derived keys.
--- This handles the case where submodules and subgroups may be in different orders
--- (e.g., due to code generation reordering).
--- Note: subModules must be provided explicitly as namespaces since Module dependencies are now just Namespaces.
-buildTestGroupMap :: [Namespace] -> TestGroup -> M.Map Namespace TestGroup
-buildTestGroupMap subModuleNamespaces rootTestGroup =
-  let subGroups = testGroupSubgroups rootTestGroup
-      -- Build a map from test group name to test group for lookup
-      groupByName = M.fromList [(testGroupName g, g) | g <- subGroups]
-      -- Match each module namespace to its test group by deriving the expected test group name
-      pairs = [(ns, group) |
-               ns <- subModuleNamespaces,
-               let expectedName = deriveTestGroupName ns,
-               Just group <- [M.lookup expectedName groupByName]]
-  in M.fromList pairs
-  where
-    -- Derive the test group name from a module namespace
-    -- Handles various patterns:
-    -- e.g., "hydra.test.lib.chars" -> "hydra.lib.chars primitives"
-    -- e.g., "hydra.test.formatting" -> "formatting"
-    -- e.g., "hydra.test.checking.all" -> "checking"
-    -- e.g., "hydra.test.monads" -> "hydra.monads"
-    -- e.g., "hydra.test.etaExpansion" -> "eta expansion"
-    -- e.g., "hydra.test.json.coder" -> "JSON coder"
-    deriveTestGroupName (Namespace ns) =
-      let parts = Strings.splitOn "." ns
-          -- Remove "hydra.test." prefix and handle different patterns
-          withoutPrefix = drop 2 parts  -- drop "hydra" and "test"
-      in case withoutPrefix of
-        ("lib":rest) -> "hydra.lib." ++ L.intercalate "." rest ++ " primitives"
-        -- JSON special cases
-        ["json", "coder"] -> "JSON coder"
-        ["json", "parser"] -> "JSON parsing"
-        ["json", "writer"] -> "JSON serialization"
-        -- Handle camelCase conversion (e.g., etaExpansion -> eta expansion)
-        [name] -> decamelize name
-        -- Handle .all suffix (e.g., checking.all -> checking, inference.all -> inference)
-        parts' | not (null parts') && last parts' == "all" -> L.intercalate "." (init parts')
-        _ -> L.intercalate "." withoutPrefix
-
-    -- Convert camelCase to space-separated lowercase
-    decamelize s = map toLower $ L.intercalate " " $ splitCamelCase s
-
-    -- Split a camelCase string into words
-    splitCamelCase [] = []
-    splitCamelCase (c:cs) =
-      let (word, rest) = span (not . isUpper) cs
-      in (c:word) : splitCamelCase rest
-
--- | Create a lookup function from a test group hierarchy
--- This walks the test group and module hierarchies to build the mapping
--- Note: subModuleNamespaces must be provided explicitly since Module dependencies are now Namespaces
-createTestGroupLookup :: [Namespace] -> TestGroup -> (Namespace -> Maybe TestGroup)
-createTestGroupLookup subModuleNamespaces rootTestGroup =
-  let testGroupMap = buildTestGroupMap subModuleNamespaces rootTestGroup
-  in \ns -> M.lookup ns testGroupMap
-
--- | Main entry point: generate generation test suite from test modules
--- Takes a test generator, output directory, test modules, and a lookup function for test groups
--- Note: testModules must be provided explicitly since Module dependencies are now Namespaces
-generateGenerationTestSuite :: TestGenerator a -> FilePath -> [Module] -> (Namespace -> Maybe TestGroup) -> IO Bool
-generateGenerationTestSuite testGen outDir modules lookupTestGroup = do
-  putStrLn "Processing test modules..."
-
-  putStrLn $ "Found " ++ show (length modules) ++ " test module(s)"
-  putStrLn "Transforming test suite to generation tests..."
-
-  -- Match modules with their test groups and transform
-  let moduleTestPairs = [(mod, transformed) |
-        mod <- modules,
-        Just testGroup <- [lookupTestGroup (moduleNamespace mod)],
-        Just transformed <- [transformToCompiledTests testGroup]]
-
-  if null moduleTestPairs
-    then do
-      putStrLn "No generation tests to generate"
-      return True
-    else do
-      putStrLn $ "Found " ++ show (length moduleTestPairs) ++ " module(s) with generation tests, generating to " ++ outDir
-
-      let graph = modulesToGraph (mainModules ++ testModules) $ modules ++ extraModules
-
-      -- Generate using the provided test generator, writing files incrementally
-      result <- runFlowWithGraph graph $ generateAllModuleTestsIncremental testGen outDir moduleTestPairs writeFilePair
-
-      case result of
-        Left trace -> do
-          putStrLn $ "✗ Generation failed: " ++ traceSummary trace
-          return False
-        Right count -> do
-          putStrLn $ "✓ Successfully generated " ++ show count ++ " test file(s)"
-          return True
-  where
-    writeFilePair (fullPath, content) = do
-      SD.createDirectoryIfMissing True $ FP.takeDirectory fullPath
-      writeFile fullPath content
-      putStrLn $ "  Generated: " ++ fullPath
-    -- Core.module_ is required for schema types like Either, Maybe, etc.
-    -- Monads.module_ is required for primitives like hydra.monads.pure
-    -- Lexical.module_ is required for hydra.lexical.emptyGraph used in Flow tests
-    extraModules = [Formatting.module_, Lexical.module_, Monads.module_, Core.module_]
-
--- Note: collectModules removed since Module dependencies are now Namespaces.
--- Callers should provide explicit module lists instead of relying on traversal.
-
--- | Run a Flow action with the given graph, returning Maybe
-runFlowWithGraph :: s -> Flow s a -> IO (Either Trace a)
-runFlowWithGraph s f = do
-    return $ case v of
-      Nothing -> Left trace
-      Just value -> Right value
-  where
-    FlowState v _ trace = unFlow f s emptyTrace
-
--- | Generate all test files using the provided test generator
--- Returns a list of (FilePath, content) pairs
-generateAllModuleTests :: TestGenerator a -> FilePath -> [(Module, TestGroup)] -> Flow Graph [(FilePath, String)]
-generateAllModuleTests testGen baseDir modulePairs = do
-  -- Perform type inference ONCE upfront for the entire graph
-  -- This is critical for performance: inferGraphTypes is expensive and should not be called per-module
-  g0 <- getState
-  trace ("Starting type inference...") $ return ()
-  g <- Inference.inferGraphTypes g0
-  trace ("Type inference complete. Generating " ++ show (length modulePairs) ++ " module(s)...") $ return ()
-  putState g
-
-  files <- mapM (generateModuleTestWithProgress testGen baseDir) (zip [1..] modulePairs)
-  -- Generate an aggregator file if the generator provides one
-  case testGenAggregatorFile testGen of
-    Just genAggregator -> return (genAggregator baseDir (map fst modulePairs) : files)
-    Nothing -> return files
-
--- | Generate all test files incrementally, writing each file immediately after generation
--- This reduces peak memory usage by not accumulating all file contents in memory
--- Uses unsafePerformIO to write files from within Flow - this is safe because:
--- 1. The IO is idempotent (writing the same file twice produces the same result)
--- 2. The ordering doesn't affect the final result
--- Returns the count of files generated
-generateAllModuleTestsIncremental :: TestGenerator a -> FilePath -> [(Module, TestGroup)] -> ((FilePath, String) -> IO ()) -> Flow Graph Int
-generateAllModuleTestsIncremental testGen baseDir modulePairs writeFile = do
-  -- Perform type inference ONCE upfront for the entire graph
-  g0 <- getState
-  trace ("Starting type inference...") $ return ()
-  g <- Inference.inferGraphTypes g0
-  trace ("Type inference complete. Generating " ++ show (length modulePairs) ++ " module(s)...") $ return ()
-  putState g
-
-  -- Generate files one at a time, writing each immediately
-  -- Strict: any failure stops generation
-  mapM_ (generateAndWriteModuleStrict testGen baseDir writeFile) (zip [1..] modulePairs)
-  let successCount = length modulePairs
-
-  -- Generate an aggregator file if the generator provides one
-  case testGenAggregatorFile testGen of
-    Just genAggregator -> do
-      let aggregator = genAggregator baseDir (map fst modulePairs)
-      unsafePerformIO (writeFile aggregator) `seq` return (successCount + 1)
-    Nothing -> return successCount
-
--- | Generate and write a single module strictly (fails on any error)
-generateAndWriteModuleStrict :: TestGenerator a -> FilePath -> ((FilePath, String) -> IO ()) -> (Int, (Module, TestGroup)) -> Flow Graph ()
-generateAndWriteModuleStrict testGen baseDir writeFile (idx, pair) = do
-  let (sourceModule, _) = pair
-      ns = moduleNamespace sourceModule
-  trace ("  Generating module " ++ show idx ++ ": " ++ show ns) $ return ()
-  result <- generateModuleTest testGen baseDir pair
-  unsafePerformIO (writeFile result) `seq` return ()
-
--- | Try to run a Flow, returning Nothing if it fails instead of propagating the error
-tryFlow :: Flow s a -> Flow s (Maybe a)
-tryFlow f = Flow $ \s t ->
-  let FlowState mval s' t' = unFlow f s t
-  in FlowState (Just mval) s' t'
-
--- | Try to run a Flow, returning (Maybe result, error trace summary)
-tryFlowWithTrace :: Flow s a -> Flow s (Maybe a, String)
-tryFlowWithTrace f = Flow $ \s t ->
-  let FlowState mval s' t' = unFlow f s t
-      errMsg = case mval of
-        Just _ -> ""
-        Nothing -> traceSummary t'
-  in FlowState (Just (mval, errMsg)) s' t'
-
--- | Generate a single module test and write it immediately
-generateAndWriteModule :: TestGenerator a -> FilePath -> ((FilePath, String) -> IO ()) -> (Int, (Module, TestGroup)) -> Flow Graph ()
-generateAndWriteModule testGen baseDir writeFile (idx, pair) = do
-  let (sourceModule, _) = pair
-      ns = moduleNamespace sourceModule
-  trace ("  Generating module " ++ show idx ++ ": " ++ show ns) $ return ()
-  result <- generateModuleTest testGen baseDir pair
-  -- Use unsafePerformIO to write the file immediately, then discard the result
-  -- This allows GC to reclaim the generated content
-  unsafePerformIO (writeFile result) `seq` return ()
-
--- | Generate a single test file for a module and its test group (with progress)
-generateModuleTestWithProgress :: TestGenerator a -> FilePath -> (Int, (Module, TestGroup)) -> Flow Graph (FilePath, String)
-generateModuleTestWithProgress testGen baseDir (idx, pair) = do
-  let (sourceModule, _) = pair
-  trace ("  Generating module " ++ show idx ++ ": " ++ show (moduleNamespace sourceModule)) $ return ()
-  generateModuleTest testGen baseDir pair
-
--- | Generate a single test file for a module and its test group
-generateModuleTest :: TestGenerator a -> FilePath -> (Module, TestGroup) -> Flow Graph (FilePath, String)
-generateModuleTest testGen baseDir (sourceModule, testGroup) = do
-  -- Use the test generator's file generation function
-  (filePath, content) <- testGenGenerateTestFile testGen generationModule testGroup
-
-  let fullPath = FP.combine baseDir filePath
-  return (fullPath, content)
-  where
-    -- Use the source module's namespace with "generation." prefix
-    -- Keep the same dependencies so imports are generated correctly
-    generationModule = sourceModule {moduleNamespace = addGenerationPrefix (moduleNamespace sourceModule)}
-
--- | Generate an aggregator spec file that imports all generated test modules
-generateAggregatorSpec :: FilePath -> [Module] -> (FilePath, String)
-generateAggregatorSpec baseDir modules =
-  let addSpecSuffix (Namespace ns) = Namespace (ns ++ "Spec")
-      modulePaths = map (namespaceToModuleName . addSpecSuffix . addGenerationPrefix . moduleNamespace) modules
-      imports = L.intercalate "\n" $ map (\m -> "import qualified " ++ m ++ " as " ++ sanitizeModuleName m) modulePaths
-      specs = L.intercalate "\n    " $ map (\m -> sanitizeModuleName m ++ ".spec") modulePaths
-      content = unlines [
-        "-- Note: this is an automatically generated file. Do not edit.",
-        "",
-        "module Generation.Spec (spec) where",
-        "",
-        "import qualified Test.Hspec as H",
-        imports,
-        "",
-        "spec :: H.Spec",
-        "spec = do",
-        "    " ++ specs
-        ]
-      filePath = FP.combine baseDir "Generation/Spec.hs"
-  in (filePath, content)
-  where
-    sanitizeModuleName = map (\c -> if c == '.' then '_' else c)
-    namespaceToModuleName (Namespace ns) =
-      L.intercalate "." $ L.map capitalize (L.filter (not . null) $ Strings.splitOn "." ns)
-    capitalize [] = []
-    capitalize (x:xs) = toUpper x : xs
diff --git a/src/main/haskell/Hydra/Staging/Testing/Generation/HaskellCodec.hs b/src/main/haskell/Hydra/Staging/Testing/Generation/HaskellCodec.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Staging/Testing/Generation/HaskellCodec.hs
+++ /dev/null
@@ -1,533 +0,0 @@
--- | Haskell-specific test code generation using HSpec
-
-module Hydra.Staging.Testing.Generation.HaskellCodec where
-
-import Hydra.Kernel hiding (map)
-import Hydra.Testing
-import Hydra.Coders (LanguageName(..))
-import Hydra.Staging.Testing.Generation.Transform (collectTestCases, addGenerationPrefix)
-import Hydra.Staging.Testing.Generation.Generate (TestGenerator(..), createTestGroupLookup, generateGenerationTestSuite)
-import qualified Hydra.Ext.Haskell.Coder as HaskellCoder
-import Hydra.Ext.Haskell.Utils (namespacesForModule, sanitizeHaskellName)
-import qualified Hydra.Ext.Haskell.Serde as HaskellSerde
-import Hydra.Serialization (printExpr, parenthesize)
-import qualified Hydra.Ext.Haskell.Ast as H
-import qualified Hydra.Names as Names
-import qualified Hydra.Util as Util
-import qualified Hydra.Show.Core as ShowCore
-import qualified Hydra.Formatting as Formatting
-import qualified Hydra.Lib.Strings as Strings
-import qualified Hydra.Lib.Lists as Lists
-
-import qualified Data.Map as M
-import qualified Data.List as L
-import qualified Data.Set as S
-import qualified Hydra.Rewriting as Rewriting
-import qualified Hydra.Inference as Inference
-import qualified Hydra.Substitution as Substitution
-import qualified Hydra.Typing as Typing
-import qualified Hydra.Decode.Core as DecodeCore
-import Data.Char (toUpper)
-import qualified System.FilePath as FP
-
-
--- | Extract all variable names from term-encoded terms in a given term.
--- This recursively decodes encoded terms and extracts the variable names.
-extractEncodedTermVariableNames :: Graph -> Term -> S.Set Name
-extractEncodedTermVariableNames graph term =
-  Rewriting.foldOverTerm TraversalOrderPre collectNames S.empty term
-  where
-    collectNames :: S.Set Name -> Term -> S.Set Name
-    collectNames names t
-      | isEncodedTerm (Rewriting.deannotateTerm t) =
-          case DecodeCore.term graph t of
-            Right decodedTerm ->
-              -- Recursively extract variable names from the decoded term
-              S.union names (Rewriting.termDependencyNames True True True decodedTerm)
-            Left _ -> names
-      | otherwise = names
-
--- | Add namespaces from a set of names to existing namespaces
-addNamespacesToNamespaces :: Namespaces H.ModuleName -> S.Set Name -> Namespaces H.ModuleName
-addNamespacesToNamespaces ns0 names =
-  let newNamespaces = S.fromList $ mapMaybe Names.namespaceOf $ S.toList names
-      toModuleName namespace =
-        let parts = Strings.splitOn "." (unNamespace namespace)
-            lastPart = L.last parts
-        in H.ModuleName (Formatting.capitalize lastPart)
-      toPair ns = (ns, toModuleName ns)
-      newMappings = M.fromList $ map toPair $ S.toList newNamespaces
-  in ns0 { namespacesMapping = M.union (namespacesMapping ns0) newMappings }
-  where
-    mapMaybe f = foldr (\x acc -> maybe acc (:acc) (f x)) []
-
--- | Check if a term is a FlowState record.
--- Returns Just (value, state, trace) if it is a FlowState record, Nothing otherwise.
-isFlowStateRecord :: Term -> Maybe (Term, Term, Term)
-isFlowStateRecord term = case Rewriting.deannotateTerm term of
-  TermRecord rec | unName (recordTypeName rec) == "hydra.compute.FlowState" ->
-    let fields = recordFields rec
-        getValue = findField "value" fields
-        getState = findField "state" fields
-        getTrace = findField "trace" fields
-    in case (getValue, getState, getTrace) of
-         (Just v, Just s, Just t) -> Just (v, s, t)
-         _ -> Nothing
-  _ -> Nothing
-  where
-    findField :: String -> [Field] -> Maybe Term
-    findField name = L.foldr (\f acc -> if unName (fieldName f) == name then Just (fieldTerm f) else acc) Nothing
-
--- | Preprocess input term to replace TermUnit state with emptyGraph in Flow unrolling patterns.
--- The kernel test generation converts the Flow state argument (e.g. emptyGraph) to TermUnit
--- due to type erasure, but some functions (like annotation functions) specifically require Graph state.
-preprocessFlowInput :: Term -> Term
-preprocessFlowInput = Rewriting.rewriteTerm rewrite
-  where
-    emptyGraphVar = TermVariable (Name "hydra.lexical.emptyGraph")
-
-    rewrite :: (Term -> Term) -> Term -> Term
-    rewrite recurse t = case Rewriting.deannotateTerm t of
-      -- Pattern: (((unFlow flowExpr) state) trace)
-      -- Structure: Application { function = Application { function = Application { function = Eliminator, arg = flowExpr }, arg = state }, arg = trace }
-      -- We want to replace state=TermUnit with emptyGraph
-      TermApplication app ->
-        let func = applicationFunction app     -- Application { function = Application { ... }, arg = state }
-            traceArg = applicationArgument app -- trace
-        in case Rewriting.deannotateTerm func of
-          TermApplication stateApp ->
-            let unFlowApp = applicationFunction stateApp  -- Application { function = Eliminator, arg = flowExpr }
-                stateArg = applicationArgument stateApp   -- state (might be TermUnit)
-            in case Rewriting.deannotateTerm unFlowApp of
-              TermApplication elimApp ->
-                let elimFunc = applicationFunction elimApp  -- Eliminator
-                in case Rewriting.deannotateTerm elimFunc of
-                  TermFunction (FunctionElimination (EliminationWrap wrapName))
-                    | unName wrapName == "hydra.compute.Flow" ->
-                      -- Found the pattern! Check if stateArg is TermUnit
-                      let newState = case Rewriting.deannotateTerm stateArg of
-                            TermUnit -> emptyGraphVar
-                            _ -> recurse stateArg
-                          -- Rebuild: ((unFlowApp newState) trace)
-                          newStateApp = TermApplication $ Application (recurse unFlowApp) newState
-                      in TermApplication $ Application newStateApp (recurse traceArg)
-                  _ -> recurse t
-              _ -> recurse t
-          _ -> recurse t
-      _ -> recurse t
-
-termToHaskell :: Namespaces H.ModuleName -> Term -> Flow Graph String
-termToHaskell namespaces term = do
-  result <- HaskellCoder.encodeTerm namespaces term
-  return $ printExpr . parenthesize . HaskellSerde.expressionToExpr $ result
-
-typeToHaskell :: Namespaces H.ModuleName -> Type -> Flow Graph String
-typeToHaskell namespaces typ = (printExpr . parenthesize . HaskellSerde.typeToExpr) <$>
-  HaskellCoder.encodeType namespaces typ
-
--- | Create a Haskell TestCodec that uses the real Haskell coder
-haskellTestCodec :: Namespaces H.ModuleName -> TestCodec
-haskellTestCodec namespaces = TestCodec {
-    testCodecLanguage = LanguageName "haskell",
-    testCodecFileExtension = FileExtension "hs",
-    testCodecEncodeTerm = termToHaskell namespaces,
-    testCodecEncodeType = typeToHaskell namespaces,
-    testCodecFormatTestName = id,  -- Keep test names as-is
-    testCodecFormatModuleName = namespaceToModuleName,
-    testCodecTestCaseTemplate = haskellTestCaseTemplate,
-    testCodecTestGroupTemplate = haskellTestGroupTemplate,
-    testCodecModuleTemplate = haskellModuleTemplate,
-    testCodecImportTemplate = haskellImportTemplate,
-    testCodecFindImports = findHaskellImports namespaces}
-
--- Templates for Haskell test generation
-haskellTestCaseTemplate :: String
-haskellTestCaseTemplate = unlines [
-  "  H.it {name} $ H.shouldBe",
-  "    ({input})",
-  "    ({output})"]
-
-haskellTestGroupTemplate :: String
-haskellTestGroupTemplate = "spec = H.describe {groupName} $ do"
-
-haskellModuleTemplate :: String
-haskellModuleTemplate = unlines [
-  "-- " ++ warningAutoGeneratedFile,
-  "",
-  "module {moduleName} where",
-  "",
-  "{imports}",
-  "",
-  "spec :: H.Spec",
-  "{testGroup}",
-  "{testCases}"]
-
-haskellImportTemplate :: String
-haskellImportTemplate = "import qualified {namespace} as {alias}"
-
--- | Find necessary imports for Haskell based on referenced names
-findHaskellImports :: Namespaces H.ModuleName -> S.Set Name -> [String]
-findHaskellImports namespaces names = L.map makeImport (M.toList filteredMapping)
-  where
-    -- Filter out test module namespaces (hydra.test.*) which aren't in main library
-    isTestNamespace (Namespace ns) = "hydra.test." `L.isPrefixOf` ns
-    filteredMapping = M.filterWithKey (\ns _ -> not (isTestNamespace ns)) (namespacesMapping namespaces)
-    makeImport (ns, alias) =
-      "import qualified " ++ nsToModuleName ns ++ " as " ++ H.unModuleName alias
-    nsToModuleName (Namespace ns) =
-      Strings.intercalate "." $ Lists.map Formatting.capitalize (Strings.splitOn "." ns)
-
--- | Generate test hierarchy preserving the structure with H.describe blocks for subgroups
-generateTestGroupHierarchy :: InferenceContext -> Namespaces H.ModuleName -> TestCodec -> Int -> TestGroup -> Flow Graph String
-generateTestGroupHierarchy infContext namespaces codec depth testGroup = do
-  -- Generate test cases at the current level with proper indentation
-  testCaseLinesRaw <- mapM (generateTestCaseWithCodec infContext namespaces codec depth) (testGroupCases testGroup)
-  let indent = replicate (depth * 2) ' '
-      indentTestCase = L.map (indent ++)
-      testCaseLines = fmap indentTestCase testCaseLinesRaw
-      testCasesStr = L.intercalate "\n" (concat testCaseLines)
-
-  -- Generate H.describe blocks for each subgroup
-  subgroupStrs <- mapM generateSubgroupBlock (testGroupSubgroups testGroup)
-  let subgroupsStr = L.intercalate "\n" subgroupStrs
-
-  -- Combine test cases and subgroups
-  return $ testCasesStr ++ (if null testCasesStr || null subgroupsStr then "" else "\n") ++ subgroupsStr
-  where
-    generateSubgroupBlock :: TestGroup -> Flow Graph String
-    generateSubgroupBlock subgroup = do
-      let indent = replicate (depth * 2) ' '
-      -- Recursively generate content for this subgroup at depth+1 (nested inside this H.describe)
-      subgroupContent <- generateTestGroupHierarchy infContext namespaces codec (depth + 1) subgroup
-      let groupName = testGroupName subgroup
-      -- Generate the H.describe block with proper indentation
-      return $ indent ++ "H.describe " ++ show groupName ++ " $ do\n" ++ subgroupContent
-
--- | Generic test file generation using a TestCodec
-generateTestFileWithCodec :: TestCodec -> Module -> TestGroup -> Namespaces H.ModuleName -> Flow Graph (FilePath, String)
-generateTestFileWithCodec codec testModule testGroup namespaces = do
-  -- Note: Type inference is now performed ONCE upfront in generateAllModuleTests (Generate.hs)
-  -- This is critical for performance: inferGraphTypes is expensive and should not be called per-module
-  g <- getState
-  infContext <- graphToInferenceContext g
-
-  -- Generate test hierarchy preserving the structure
-  testBody <- generateTestGroupHierarchy infContext namespaces codec 1 testGroup
-
-  -- Build the complete test module
-  let testModuleContent = buildTestModuleWithCodec codec testModule testGroup testBody namespaces
-
-  -- Use the codec's file extension for the path
-  -- Append "Spec" to the namespace for hspec-discover compatibility
-  let FileExtension ext = testCodecFileExtension codec
-  let Namespace ns = moduleNamespace testModule
-  let specNs = Namespace (ns ++ "Spec")
-  let filePath = Names.namespaceToFilePath Util.CaseConventionPascal
-                   (FileExtension ext)
-                   specNs
-
-  return (filePath, testModuleContent)
-
--- | Generate a single test case using a TestCodec
-generateTestCaseWithCodec :: InferenceContext -> Namespaces H.ModuleName -> TestCodec -> Int -> TestCaseWithMetadata -> Flow Graph [String]
-generateTestCaseWithCodec infContext namespaces codec depth (TestCaseWithMetadata name tcase _ _) = case tcase of
-  TestCaseDelegatedEvaluation (DelegatedEvaluationTestCase inputRaw output) -> do
-    -- Preprocess input to replace TermUnit state with emptyGraph in Flow patterns
-    let input = preprocessFlowInput inputRaw
-
-    -- Check if output is a FlowState record - if so, we compare only the flowStateValue
-    -- because FlowState Graph a cannot be compared with shouldBe (Graph has no Show instance)
-    case isFlowStateRecord output of
-      Just (expectedValue, _, _) -> do
-        -- Generate test that extracts flowStateValue from the result and compares it
-        inputCode <- testCodecEncodeTerm codec input
-        expectedValueCode <- testCodecEncodeTerm codec expectedValue
-
-        let formattedName = testCodecFormatTestName codec name
-            indentLines n s = L.intercalate ("\n" ++ replicate n ' ') (L.lines s)
-            continuationIndent = depth * 2 + 4
-            indentedInputCode = indentLines continuationIndent inputCode
-            indentedExpectedCode = indentLines continuationIndent expectedValueCode
-
-        -- Check if we need a type annotation for the expected value
-        -- Use expectedValue (the unwrapped flowStateValue) for inference, not full FlowState output
-        typeAnnotation <- generateTypeAnnotationForFlowStateValue infContext namespaces input expectedValue
-        let finalExpectedCode = case typeAnnotation of
-              Just anno -> indentedExpectedCode ++ anno
-              Nothing -> indentedExpectedCode
-
-        return [
-          "H.it " ++ show formattedName ++ " $ H.shouldBe",
-          "  (Compute.flowStateValue (" ++ indentedInputCode ++ "))",
-          "  (" ++ finalExpectedCode ++ ")"]
-
-      Nothing -> do
-        -- Standard comparison - output is not a FlowState
-        inputCode <- testCodecEncodeTerm codec input
-        outputCode <- testCodecEncodeTerm codec output
-
-        let formattedName = testCodecFormatTestName codec name
-            indentLines n s = L.intercalate ("\n" ++ replicate n ' ') (L.lines s)
-            continuationIndent = depth * 2 + 4
-            indentedInputCode = indentLines continuationIndent inputCode
-            indentedOutputCode = indentLines continuationIndent outputCode
-
-        typeAnnotation <- generateTypeAnnotationFor infContext namespaces input output
-        let (finalInputCode, finalOutputCode) = case typeAnnotation of
-              Just anno -> (indentedInputCode, indentedOutputCode ++ anno)
-              Nothing -> (indentedInputCode, indentedOutputCode)
-
-        return [
-          "H.it " ++ show formattedName ++ " $ H.shouldBe",
-          "  (" ++ finalInputCode ++ ")",
-          "  (" ++ finalOutputCode ++ ")"]
-
-  _ -> return []  -- Skip non-delegated tests (shouldn't happen after transform)
-
--- | Generate a type annotation for FlowState value extraction.
--- Adds annotation when:
--- 1. Bare `Nothing` (always ambiguous) -> `Maybe Int`
--- 2. `Just Nothing` when INPUT also contains bare `Nothing` (polymorphic) -> `Maybe (Maybe Int)`
--- For (2), if input is concrete (like getTermDescription), GHC infers from input.
-generateTypeAnnotationForFlowStateValue :: InferenceContext -> Namespaces H.ModuleName -> Term -> Term -> Flow Graph (Maybe String)
-generateTypeAnnotationForFlowStateValue _ _ inputTerm expectedValue =
-  case Rewriting.deannotateTerm expectedValue of
-    TermMaybe Nothing -> return $ Just " :: Maybe Int"
-    TermMaybe (Just inner) ->
-      case Rewriting.deannotateTerm inner of
-        TermMaybe Nothing ->
-          -- Check if INPUT is polymorphic (contains bare Nothing)
-          if inputContainsNothing inputTerm
-            then return $ Just " :: Maybe (Maybe Int)"
-            else return Nothing  -- Input is concrete, GHC can infer
-        _ -> return Nothing
-    _ -> return Nothing
-  where
-    -- Check if input term contains bare Nothing (indicates polymorphism)
-    inputContainsNothing :: Term -> Bool
-    inputContainsNothing term = case Rewriting.deannotateTerm term of
-      TermMaybe Nothing -> True
-      TermMaybe (Just inner) -> inputContainsNothing inner
-      TermApplication app ->
-        inputContainsNothing (applicationFunction app) ||
-        inputContainsNothing (applicationArgument app)
-      TermFunction (FunctionLambda lam) -> inputContainsNothing (lambdaBody lam)
-      TermRecord rec -> any (inputContainsNothing . fieldTerm) (recordFields rec)
-      TermList xs -> any inputContainsNothing xs
-      _ -> False
-
--- | Extract the value type from a FlowState type.
--- FlowState s a has flowStateValue :: Maybe a, so we extract the `Maybe a` type.
--- The type structure is: TypeApplication (ApplicationType (TypeApplication (ApplicationType (TypeRecord "FlowState") s)) a)
-extractFlowStateValueType :: Type -> Flow Graph (Maybe Type)
-extractFlowStateValueType typ = case Rewriting.deannotateType typ of
-  -- FlowState s a -> extract Maybe a
-  -- Structure: TypeApplication (TypeApplication FlowState s) a
-  TypeApplication (ApplicationType (TypeApplication (ApplicationType base sType)) aType)
-    | isFlowStateType base -> return $ Just $ TypeMaybe aType
-  -- Check for TypeRecord with FlowState name
-  TypeRecord rowType | unName (rowTypeTypeName rowType) == "hydra.compute.FlowState" ->
-    -- FlowState as a record - extract the value field type
-    let valueField = L.find (\f -> unName (fieldTypeName f) == "value") (rowTypeFields rowType)
-    in case valueField of
-         Just ft -> return $ Just $ fieldTypeType ft  -- Already Maybe a
-         Nothing -> return Nothing
-  -- If it's wrapped in Maybe already (shouldn't happen), just return it
-  TypeMaybe inner -> return $ Just typ
-  -- Otherwise, return Nothing to indicate we couldn't extract the type
-  _ -> return Nothing
-  where
-    isFlowStateType t = case Rewriting.deannotateType t of
-      TypeWrap wt -> unName (wrappedTypeTypeName wt) == "hydra.compute.FlowState"
-      TypeRecord rt -> unName (rowTypeTypeName rt) == "hydra.compute.FlowState"
-      _ -> False
-
--- | Generate a type annotation for polymorphic output values
--- Adds annotations when BOTH:
--- 1. The inferred type has free type variables that GHC cannot resolve
--- 2. The output has no concrete values to guide type inference (empty list, etc.)
---
--- The annotation is derived from the INPUT term's inferred type, since the input
--- is the expression being evaluated and its result type should match the output type.
--- Free type variables are replaced with Int32.
-generateTypeAnnotationFor :: InferenceContext -> Namespaces H.ModuleName -> Term -> Term -> Flow Graph (Maybe String)
-generateTypeAnnotationFor infContext namespaces inputTerm outputTerm = do
-  -- Only consider annotation if output has no concrete values to guide inference
-  if not needsAnnotation
-    then return Nothing
-    else do
-      -- Infer the type of the input expression (which gives us the result/output type)
-      -- Use tryInferTypeOf to gracefully handle inference failures (e.g., when schema types
-      -- like Graph conflict with polymorphic type variables)
-      mresult <- tryInferTypeOf infContext inputTerm
-      case mresult of
-        Nothing -> return Nothing  -- Inference failed; skip annotation
-        Just (_, typeScheme) -> do
-          let typ = typeSchemeType typeScheme
-              -- Check if there are any free type variables that need grounding
-              freeVars = S.toList $ S.difference
-                (Rewriting.freeVariablesInType typ)
-                schemaVars
-          -- Either types ALWAYS need annotations (one branch is always unconstrained),
-          -- while other polymorphic types only need annotations if they have free variables.
-          if isEitherTerm outputTerm || not (null freeVars)
-            then do
-              -- Replace free type variables with Int32
-              let int32Type = TypeLiteral (LiteralTypeInteger IntegerTypeInt32)
-                  subst = Typing.TypeSubst $ M.fromList [(v, int32Type) | v <- freeVars]
-                  groundedType = Substitution.substInType subst typ
-              -- Encode the type as Haskell
-              typeStr <- typeToHaskell namespaces groundedType
-              return $ Just (" :: " ++ typeStr)
-            else return Nothing
-  where
-    schemaVars = S.fromList $ M.keys $ inferenceContextSchemaTypes infContext
-    needsAnnotation = containsTriviallyPolymorphic outputTerm
-    isEitherTerm (TermEither _) = True
-    isEitherTerm _ = False
-
--- | Try to infer the type of a term, returning Nothing if inference fails
--- This allows graceful degradation when type inference encounters issues
--- (e.g., schema types being unified with polymorphic type variables)
-tryInferTypeOf :: InferenceContext -> Term -> Flow Graph (Maybe (Term, TypeScheme))
-tryInferTypeOf infContext term = Flow $ \s t ->
-  let FlowState mval s' t' = unFlow (Inference.inferTypeOf infContext term) s t
-  in FlowState (Just mval) s' t'
-
--- | Check if a term CONTAINS any trivially polymorphic sub-terms (empty list, Nothing, etc.)
--- This recursively searches through the term structure to find any parts that would
--- cause GHC to need type annotations.
-containsTriviallyPolymorphic :: Term -> Bool
-containsTriviallyPolymorphic term = case term of
-  TermList [] -> True  -- Empty list
-  TermList xs -> any containsTriviallyPolymorphic xs  -- Check list elements
-  TermSet s -> S.null s || any containsTriviallyPolymorphic (S.toList s)  -- Empty set or elements
-  TermMap m -> M.null m || any containsTriviallyPolymorphic (M.keys m) || any containsTriviallyPolymorphic (M.elems m)
-  TermMaybe Nothing -> True  -- Nothing value
-  TermMaybe (Just x) -> containsTriviallyPolymorphic x  -- Check content
-  -- Either values ALWAYS need type annotations because one branch is unconstrained.
-  -- Even `Right 5` needs an annotation because the Left type is ambiguous.
-  TermEither _ -> True
-  TermUnion inj -> containsTriviallyPolymorphic (fieldTerm $ injectionField inj)
-  TermPair (a, b) -> containsTriviallyPolymorphic a || containsTriviallyPolymorphic b
-  TermRecord fields -> any (containsTriviallyPolymorphic . fieldTerm) (recordFields fields)
-  TermApplication app -> containsTriviallyPolymorphic (applicationFunction app) ||
-                         containsTriviallyPolymorphic (applicationArgument app)
-  _ -> False
-
--- | Build the complete test module using a TestCodec
-buildTestModuleWithCodec :: TestCodec -> Module -> TestGroup -> String -> Namespaces H.ModuleName -> String
-buildTestModuleWithCodec codec testModule testGroup testBody namespaces = header ++ testBody ++ "\n"
-  where
-    -- Append "Spec" to module name for hspec-discover compatibility
-    Namespace ns = moduleNamespace testModule
-    specNs = Namespace (ns ++ "Spec")
-    moduleNameString = testCodecFormatModuleName codec specNs
-    groupName = testGroupName testGroup
-
-    -- Use the codec's findImports to determine necessary imports
-    -- For now, we'll pass an empty set since we're not tracking names yet
-    -- TODO: collect names from test cases
-    domainImports = testCodecFindImports codec S.empty
-
-    -- Standard imports that are always needed for Haskell
-    standardImports = [
-      "import Hydra.Kernel",
-      "import qualified Test.Hspec as H",
-      "import qualified Data.List as L",
-      "import qualified Data.Map as M",
-      "import qualified Data.Set as S",
-      "import qualified Data.Maybe as Y"]
-
-    allImports = standardImports ++ domainImports
-
-    -- Debug comments showing namespace configuration
-    debugComments = [
-        "-- DEBUG: Focus namespace = " ++ show (namespacesFocus namespaces),
-        "-- DEBUG: Namespace mappings:",
-        "-- " ++ show (M.toList $ namespacesMapping namespaces)
-      ]
-
-    header = unlines ([
-        "-- " ++ warningAutoGeneratedFile,
-        ""
-      ] ++ debugComments ++ [
-        "",
-        "module " ++ moduleNameString ++ " where",
-        ""
-      ] ++ allImports ++ [
-        "",
-        "spec :: H.Spec",
-        "spec = H.describe " ++ show groupName ++ " $ do"
-      ])
-
--- | Convert namespace to Haskell module name
--- Uses the same logic as the Haskell coder's importName function
-namespaceToModuleName :: Namespace -> String
-namespaceToModuleName (Namespace ns) =
-  Strings.intercalate "." $ Lists.map Formatting.capitalize (Strings.splitOn "." ns)
-
--- | Generate generation test file for a test group using the Haskell codec
-generateHaskellTestFile :: Module -> TestGroup -> Flow Graph (FilePath, String)
-generateHaskellTestFile testModule testGroup = do
-  -- Build proper namespaces that include all primitives referenced in test terms
-  namespaces <- buildNamespacesForTestGroup testModule testGroup
-
-  -- Generate test file using the codec
-  generateTestFileWithCodec (haskellTestCodec namespaces) testModule testGroup namespaces
-  where
-    buildNamespacesForTestGroup mod tgroup = do
-      let testCases = collectTestCases tgroup
-          testTerms = concatMap extractTestTerms testCases
-          testBindings = zipWith (\i term -> Binding (Name $ "_test_" ++ show i) term Nothing) ([0..] :: [Integer]) testTerms
-          tempModule = mod { moduleElements = testBindings }
-      -- Get initial namespaces from the module
-      baseNamespaces <- namespacesForModule tempModule
-      -- Extract additional namespaces from term-encoded variable references
-      graph <- getState
-      let encodedNames = S.unions $ map (extractEncodedTermVariableNames graph) testTerms
-      -- Add the encoded term namespaces to the base namespaces
-      -- Also add hydra.lexical explicitly since it's needed for Flow tests (emptyGraph)
-      let extraNamespaces = S.fromList [Name "hydra.lexical.emptyGraph"]
-      return $ addNamespacesToNamespaces baseNamespaces (S.union encodedNames extraNamespaces)
-    extractTestTerms (TestCaseWithMetadata _ tcase _ _) = case tcase of
-      TestCaseDelegatedEvaluation (DelegatedEvaluationTestCase input output) -> [input, output]
-      _ -> []
-
--- | Haskell-specific test generator
--- Provides the complete Haskell implementation of the TestGenerator abstraction
-haskellTestGenerator :: TestGenerator H.ModuleName
-haskellTestGenerator = TestGenerator {
-  testGenNamespacesForModule = namespacesForModule,
-  testGenCreateCodec = haskellTestCodec,
-  testGenGenerateTestFile = generateHaskellTestFile,
-  testGenAggregatorFile = Just generateHaskellAggregatorSpec
-}
-
--- | Generate an aggregator spec file that imports all generated test modules (Haskell/HSpec style)
-generateHaskellAggregatorSpec :: FilePath -> [Module] -> (FilePath, String)
-generateHaskellAggregatorSpec baseDir modules =
-  let addSpecSuffix (Namespace ns) = Namespace (ns ++ "Spec")
-      modulePaths = map (namespaceToModuleName . addSpecSuffix . addGenerationPrefix . moduleNamespace) modules
-      imports = L.intercalate "\n" $ map (\m -> "import qualified " ++ m ++ " as " ++ sanitizeModuleName m) modulePaths
-      specs = L.intercalate "\n    " $ map (\m -> sanitizeModuleName m ++ ".spec") modulePaths
-      content = unlines [
-        "-- Note: this is an automatically generated file. Do not edit.",
-        "",
-        "module Generation.Spec (spec) where",
-        "",
-        "import qualified Test.Hspec as H",
-        imports,
-        "",
-        "spec :: H.Spec",
-        "spec = do",
-        "    " ++ specs
-        ]
-      filePath = FP.combine baseDir "Generation/Spec.hs"
-  in (filePath, content)
-  where
-    sanitizeModuleName = map (\c -> if c == '.' then '_' else c)
-    namespaceToModuleName (Namespace ns) =
-      L.intercalate "." $ L.map capitalize (L.filter (not . null) $ Strings.splitOn "." ns)
-    capitalize [] = []
-    capitalize (x:xs) = toUpper x : xs
diff --git a/src/main/haskell/Hydra/Staging/Testing/Generation/Transform.hs b/src/main/haskell/Hydra/Staging/Testing/Generation/Transform.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Staging/Testing/Generation/Transform.hs
+++ /dev/null
@@ -1,192 +0,0 @@
--- | Transform test cases for code generation, filtering to tests that can be compiled to target languages
-
-module Hydra.Staging.Testing.Generation.Transform where
-
-import Hydra.Kernel
-import Hydra.Testing
-import qualified Hydra.Dsl.Terms as Terms
-import qualified Data.Maybe as Y
-import qualified Data.Map as M
-import qualified Data.List as L
-
-
--- | Tag for tests that require decoding Flow values back to Terms (unsupported in generation tests)
-tag_requiresFlowDecoding :: Tag
-tag_requiresFlowDecoding = Tag "requiresFlowDecoding"
-
--- | Transform test group hierarchy to only include delegated evaluation tests.
--- These are the test cases which can be meaningfully transformed into executable code.
--- For example, a test case like `add 1 2 == 3` can be transformed into application-level code which is evaluated in
--- the runtime environment of the target language.
--- A test case like `freeVariablesInTerm (\x.y) == [y]` cannot be further transformed, except by term-encoding
--- the arguments.
--- Returns Nothing if the group becomes empty after filtering
-transformToCompiledTests :: TestGroup -> Maybe TestGroup
-transformToCompiledTests (TestGroup name desc subgroups cases) =
-  let transformedCases = Y.mapMaybe transformTestCase cases
-      transformedSubgroups = Y.mapMaybe transformToCompiledTests subgroups
-  in if null transformedCases && null transformedSubgroups
-     then Nothing
-     else Just $ TestGroup name desc transformedSubgroups transformedCases
-
--- | Transform a test case to DelegatedEvaluationTestCase if applicable
--- Returns Nothing if the test case type cannot be translated
-transformTestCase :: TestCaseWithMetadata -> Maybe TestCaseWithMetadata
-transformTestCase tcase@(TestCaseWithMetadata name tc desc tags) = case tc of
-    -- Case conversion: create delegated evaluation with convertCase call
-    TestCaseCaseConversion (CaseConversionTestCase fromConv toConv fromStr toStr) ->
-      Just $ TestCaseWithMetadata name delegated desc tags
-      where
-        delegated = TestCaseDelegatedEvaluation $ DelegatedEvaluationTestCase {
-          delegatedEvaluationTestCaseInput = buildConvertCaseCall fromConv toConv fromStr,
-          delegatedEvaluationTestCaseOutput = Terms.string toStr
-        }
-
-    -- Evaluation: convert directly to delegated evaluation
-    TestCaseEvaluation (EvaluationTestCase _style input output) ->
-      Just $ TestCaseWithMetadata name delegated desc tags
-      where
-        delegated = TestCaseDelegatedEvaluation $ DelegatedEvaluationTestCase {
-          delegatedEvaluationTestCaseInput = input,
-          delegatedEvaluationTestCaseOutput = output
-        }
-
-    -- Already delegated evaluation: keep as-is
-    TestCaseDelegatedEvaluation _ ->
-      Just tcase
-
-    TestCaseTopologicalSort (TopologicalSortTestCase adjList expected) ->
-      Just $ TestCaseWithMetadata name delegated desc tags
-      where
-        delegated = TestCaseDelegatedEvaluation $ DelegatedEvaluationTestCase {
-          delegatedEvaluationTestCaseInput = buildTopologicalSortCall adjList,
-          delegatedEvaluationTestCaseOutput = encodeEitherListList expected
-        }
-
-    TestCaseTopologicalSortSCC (TopologicalSortSCCTestCase adjList expected) ->
-      Just $ TestCaseWithMetadata name delegated desc tags
-      where
-        delegated = TestCaseDelegatedEvaluation $ DelegatedEvaluationTestCase {
-          delegatedEvaluationTestCaseInput = buildTopologicalSortSCCCall adjList,
-          delegatedEvaluationTestCaseOutput = encodeListList expected
-        }
-
-    -- Other test types: exclude (not applicable for compiled tests)
-    TestCaseAlphaConversion _ -> Nothing
-    TestCaseDeannotateTerm _ -> Nothing
-    TestCaseDeannotateType _ -> Nothing
-    TestCaseEtaExpansion _ -> Nothing
-    TestCaseFlattenLetTerms _ -> Nothing
-    TestCaseFoldOverTerm _ -> Nothing
-    TestCaseFreeVariables _ -> Nothing
-    TestCaseHoistCaseStatements _ -> Nothing
-    TestCaseHoistLetBindings _ -> Nothing
-    TestCaseHoistPolymorphicLetBindings _ -> Nothing
-    TestCaseHoistSubterms _ -> Nothing
-    TestCaseInference _ -> Nothing
-    TestCaseInferenceFailure _ -> Nothing
-    TestCaseJsonCoder _ -> Nothing
-    TestCaseJsonDecode _ -> Nothing
-    TestCaseJsonEncode _ -> Nothing
-    TestCaseJsonParser _ -> Nothing
-    TestCaseJsonRoundtrip _ -> Nothing
-    TestCaseJsonWriter _ -> Nothing
-    TestCaseLiftLambdaAboveLet _ -> Nothing
-    TestCaseNormalizeTypeVariables _ -> Nothing
-    TestCaseRewriteTerm _ -> Nothing
-    TestCaseRewriteType _ -> Nothing
-    TestCaseSerialization _ -> Nothing
-    TestCaseSimplifyTerm _ -> Nothing
-    TestCaseTopologicalSortBindings _ -> Nothing
-    TestCaseTypeChecking _ -> Nothing
-    TestCaseTypeCheckingFailure _ -> Nothing
-    TestCaseTypeReduction _ -> Nothing
-    TestCaseSubstInType _ -> Nothing
-    TestCaseVariableOccursInType _ -> Nothing
-    TestCaseUnshadowVariables _ -> Nothing
-    TestCaseUnifyTypes _ -> Nothing
-    TestCaseJoinTypes _ -> Nothing
-
--- | Build a Term representing a convertCase function call
-buildConvertCaseCall :: CaseConvention -> CaseConvention -> String -> Term
-buildConvertCaseCall fromConv toConv input =
-  TermApplication $ Application {
-    applicationFunction = TermApplication $ Application {
-      applicationFunction = TermApplication $ Application {
-        applicationFunction = TermVariable convertCaseName,
-        applicationArgument = encodeCaseConvention fromConv
-      },
-      applicationArgument = encodeCaseConvention toConv
-    },
-    applicationArgument = Terms.string input
-  }
-  where
-    convertCaseName = Name "hydra.formatting.convertCase"
-
--- | Encode CaseConvention as a Term (unit variant)
-encodeCaseConvention :: CaseConvention -> Term
-encodeCaseConvention conv =
-  TermUnion $ Injection _CaseConvention (Field fieldName TermUnit)
-  where
-    fieldName = case conv of
-      CaseConventionLowerSnake -> _CaseConvention_lowerSnake
-      CaseConventionUpperSnake -> _CaseConvention_upperSnake
-      CaseConventionCamel -> _CaseConvention_camel
-      CaseConventionPascal -> _CaseConvention_pascal
-
--- | Add "generation" namespace prefix
-addGenerationPrefix :: Namespace -> Namespace
-addGenerationPrefix (Namespace ns) = Namespace ("generation." ++ ns)
-
--- | Transform module with generation namespace
-transformModule :: Module -> Module
-transformModule (Module ns elements deps schemaDeps desc) =
-  Module (addGenerationPrefix ns) elements deps schemaDeps desc
-
--- | Collect all test cases from a test group (flattening hierarchy)
-collectTestCases :: TestGroup -> [TestCaseWithMetadata]
-collectTestCases (TestGroup _ _ subgroups cases) =
-  cases ++ concatMap collectTestCases subgroups
-
--- | Build a Term representing a topologicalSort function call
-buildTopologicalSortCall :: [(Int, [Int])] -> Term
-buildTopologicalSortCall adjList =
-  TermApplication $ Application {
-    applicationFunction = TermVariable topologicalSortName,
-    applicationArgument = encodeAdjacencyList adjList
-  }
-  where
-    topologicalSortName = Name "hydra.sorting.topologicalSort"
-
--- | Build a Term representing a topologicalSortComponents function call
-buildTopologicalSortSCCCall :: [(Int, [Int])] -> Term
-buildTopologicalSortSCCCall adjList =
-  TermApplication $ Application {
-    applicationFunction = TermVariable topologicalSortSCCName,
-    applicationArgument = encodeAdjacencyList adjList
-  }
-  where
-    topologicalSortSCCName = Name "hydra.sorting.topologicalSortComponents"
-
--- | Encode an adjacency list as a Term
-encodeAdjacencyList :: [(Int, [Int])] -> Term
-encodeAdjacencyList pairs = Terms.list (encodePair <$> pairs)
-  where
-    encodePair (node, deps) = Terms.pair (encodeInt node) (Terms.list (encodeInt <$> deps))
-
--- | Encode an Int as a Term
-encodeInt :: Int -> Term
-encodeInt = Terms.int32 . fromIntegral
-
--- | Encode Either [[Int]] [Int] as a Term
-encodeEitherListList :: Either [[Int]] [Int] -> Term
-encodeEitherListList (Left cycles) = Terms.left (encodeListList cycles)
-encodeEitherListList (Right sorted) = Terms.right (encodeIntList sorted)
-
--- | Encode [[Int]] as a Term
-encodeListList :: [[Int]] -> Term
-encodeListList = Terms.list . fmap encodeIntList
-
--- | Encode [Int] as a Term
-encodeIntList :: [Int] -> Term
-encodeIntList = Terms.list . fmap encodeInt
diff --git a/src/main/haskell/Hydra/Staging/Yaml/Coder.hs b/src/main/haskell/Hydra/Staging/Yaml/Coder.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Staging/Yaml/Coder.hs
+++ /dev/null
@@ -1,129 +0,0 @@
--- | Bidirectional coder between Hydra terms and YAML nodes
-
-module Hydra.Staging.Yaml.Coder (yamlCoder) where
-
-import Hydra.Kernel
-import Hydra.Adapt.Modules (languageAdapter)
-import Hydra.Staging.Yaml.Language
-import Hydra.Adapt.Utils
-import qualified Hydra.Ext.Org.Yaml.Model as YM
-import qualified Hydra.Dsl.Terms as Terms
-
-import qualified Control.Monad as CM
-import qualified Data.Map as M
-import qualified Data.Maybe as Y
-
-
-literalCoder :: LiteralType -> Flow Graph (Coder Graph Graph Literal YM.Scalar)
-literalCoder at = pure $ case at of
-  LiteralTypeBoolean -> Coder {
-    coderEncode = \(LiteralBoolean b) -> pure $ YM.ScalarBool b,
-    coderDecode = \s -> case s of
-      YM.ScalarBool b -> pure $ LiteralBoolean b
-      _ -> unexpected "boolean" $ show s}
-  LiteralTypeFloat _ -> Coder {
-    coderEncode = \(LiteralFloat (FloatValueBigfloat f)) -> pure $ YM.ScalarFloat f,
-    coderDecode = \s -> case s of
-      YM.ScalarFloat f -> pure $ LiteralFloat $ FloatValueBigfloat f
-      _ -> unexpected "floating-point value" $ show s}
-  LiteralTypeInteger _ -> Coder {
-    coderEncode = \(LiteralInteger (IntegerValueBigint i)) -> pure $ YM.ScalarInt i,
-    coderDecode = \s -> case s of
-      YM.ScalarInt i -> pure $ LiteralInteger $ IntegerValueBigint i
-      _ -> unexpected "integer" $ show s}
-  LiteralTypeString -> Coder {
-    coderEncode = \(LiteralString s) -> pure $ YM.ScalarStr s,
-    coderDecode = \s -> case s of
-      YM.ScalarStr s' -> pure $ LiteralString s'
-      _ -> unexpected "string" $ show s}
-
-recordCoder :: RowType -> Flow Graph (Coder Graph Graph Term YM.Node)
-recordCoder rt = do
-    coders <- CM.mapM (\f -> (,) <$> pure f <*> termCoder (fieldTypeType f)) (rowTypeFields rt)
-    return $ Coder (encode coders) (decode coders)
-  where
-    encode coders term = case deannotateTerm term of
-      TermRecord (Record _ fields) -> YM.NodeMapping . M.fromList . Y.catMaybes <$> CM.zipWithM encodeField coders fields
-        where
-          encodeField (ft, coder) (Field (Name fn) fv) = case (fieldTypeType ft, fv) of
-            (TypeMaybe _, TermMaybe Nothing) -> pure Nothing
-            _ -> Just <$> ((,) <$> pure (yamlString fn) <*> coderEncode coder fv)
-      _ -> unexpected "record" $ show term
-    decode coders n = case n of
-      YM.NodeMapping m -> Terms.record (rowTypeTypeName rt) <$>
-          CM.mapM (decodeField m) coders -- Note: unknown fields are ignored
-        where
-          decodeField a (FieldType fname@(Name fn) ft, coder) = do
-            v <- coderDecode coder $ Y.fromMaybe yamlNull $ M.lookup (yamlString fn) m
-            return $ Field fname v
-      _ -> unexpected "mapping" $ show n
-    getCoder coders fname = Y.maybe error pure $ M.lookup fname coders
-      where
-        error = fail $ "no such field: " ++ fname
-
-termCoder :: Type -> Flow Graph (Coder Graph Graph Term YM.Node)
-termCoder typ = case deannotateType typ of
-  TypeLiteral at -> do
-    ac <- literalCoder at
-    return Coder {
-      coderEncode = \t -> case t of
-         TermLiteral av -> YM.NodeScalar <$> coderEncode ac av
-         _ -> unexpected "literal" $ show t,
-      coderDecode = \n -> case n of
-        YM.NodeScalar s -> Terms.literal <$> coderDecode ac s
-        _ -> unexpected "scalar node" $ show n}
-  TypeList lt -> do
-    lc <- termCoder lt
-    return Coder {
-      coderEncode = \t -> case t of
-         TermList els -> YM.NodeSequence <$> CM.mapM (coderEncode lc) els
-         _ -> unexpected "list" $ show t,
-      coderDecode = \n -> case n of
-        YM.NodeSequence nodes -> Terms.list <$> CM.mapM (coderDecode lc) nodes
-        _ -> unexpected "sequence" $ show n}
-  TypeMaybe ot -> do
-    oc <- termCoder ot
-    return Coder {
-      coderEncode = \t -> case t of
-         TermMaybe el -> Y.maybe (pure yamlNull) (coderEncode oc) el
-         _ -> unexpected "maybe" $ show t,
-      coderDecode = \n -> case n of
-        YM.NodeScalar YM.ScalarNull -> pure $ Terms.optional Nothing
-        _ -> Terms.optional . Just <$> coderDecode oc n}
-  TypeMap (MapType kt vt) -> do
-    kc <- termCoder kt
-    vc <- termCoder vt
-    let encodeEntry (k, v) = (,) <$> coderEncode kc k <*> coderEncode vc v
-    let decodeEntry (k, v) = (,) <$> coderDecode kc k <*> coderDecode vc v
-    return Coder {
-      coderEncode = \t -> case t of
-        TermMap m -> YM.NodeMapping . M.fromList <$> CM.mapM encodeEntry (M.toList m)
-        _ -> unexpected "term" $ show t,
-      coderDecode = \n -> case n of
-        YM.NodeMapping m -> Terms.map . M.fromList <$> CM.mapM decodeEntry (M.toList m)
-        _ -> unexpected "mapping" $ show n}
-  TypeRecord rt -> recordCoder rt
-  TypeUnit -> pure unitCoder
-  _ -> fail $ "unsupported type variant: " ++ show (typeVariant typ)
-
-unitCoder :: Coder Graph Graph Term YM.Node
-unitCoder = Coder encode decode
-  where
-    encode term = case deannotateTerm term of
-      TermUnit -> pure $ YM.NodeScalar $ YM.ScalarNull
-      _ -> unexpected "unit" $ show term
-    decode n = case n of
-      (YM.NodeScalar YM.ScalarNull) -> pure Terms.unit
-      _ -> unexpected "null" $ show n
-
-yamlCoder :: Type -> Flow Graph (Coder Graph Graph Term YM.Node)
-yamlCoder typ = do
-  adapter <- languageAdapter yamlLanguage typ
-  coder <- termCoder $ adapterTarget adapter
-  return $ composeCoders (adapterCoder adapter) coder
-
-yamlNull :: YM.Node
-yamlNull = YM.NodeScalar YM.ScalarNull
-
-yamlString :: String -> YM.Node
-yamlString = YM.NodeScalar . YM.ScalarStr
diff --git a/src/main/haskell/Hydra/Staging/Yaml/Language.hs b/src/main/haskell/Hydra/Staging/Yaml/Language.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Staging/Yaml/Language.hs
+++ /dev/null
@@ -1,36 +0,0 @@
--- | Language constraints for YAML, defining which Hydra types can be represented in YAML
-
-module Hydra.Staging.Yaml.Language where
-
-import Hydra.Kernel
-
-import qualified Data.Set as S
-
-
-yamlLanguage :: Language
-yamlLanguage = Language (LanguageName "hydra.ext.yaml") $ LanguageConstraints {
-  languageConstraintsEliminationVariants = S.empty,
-  languageConstraintsLiteralVariants = S.fromList [
-    LiteralVariantBoolean, LiteralVariantFloat, LiteralVariantInteger, LiteralVariantString],
-  languageConstraintsFloatTypes = S.fromList [FloatTypeBigfloat],
-  languageConstraintsFunctionVariants = S.empty,
-  languageConstraintsIntegerTypes = S.fromList [IntegerTypeBigint],
-  languageConstraintsTermVariants = S.fromList [
-    TermVariantLiteral,
-    TermVariantList,
-    TermVariantMap,
-    TermVariantMaybe,
-    TermVariantRecord,
-    TermVariantUnit],
-    -- Note: TermVariantUnit is excluded because YAML null is used for optionals
-  languageConstraintsTypeVariants = S.fromList [
-    TypeVariantLiteral,
-    TypeVariantList,
-    TypeVariantMap,
-    TypeVariantMaybe,
-    TypeVariantRecord,
-    TypeVariantUnit],
-    -- Note: TypeVariantUnit is excluded because YAML null is used for optionals
-  languageConstraintsTypes = \typ -> case deannotateType typ of
-    TypeMaybe (TypeMaybe _) -> False
-    _ -> True }
diff --git a/src/main/haskell/Hydra/Staging/Yaml/Modules.hs b/src/main/haskell/Hydra/Staging/Yaml/Modules.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Staging/Yaml/Modules.hs
+++ /dev/null
@@ -1,36 +0,0 @@
--- | Module-level YAML generation for Hydra terms
-
-module Hydra.Staging.Yaml.Modules (moduleToYaml) where
-
-import Hydra.Kernel
-import Hydra.Staging.Yaml.Coder
-import Hydra.Staging.Yaml.Serde
-import Hydra.Staging.Yaml.Language
-import qualified Hydra.Ext.Org.Yaml.Model as YM
-import qualified Hydra.Dsl.Types as Types
-
-import qualified Control.Monad as CM
-import qualified Data.List as L
-import qualified Data.Map as M
-
-
--- | New simple adapter version that works with definitions directly
-moduleToYaml :: Module -> [Definition] -> Flow Graph (M.Map FilePath String)
-moduleToYaml mod defs = withTrace ("print module " ++ (unNamespace $ moduleNamespace mod)) $ do
-    let termDefs = [td | DefinitionTerm td <- defs]
-    node <- constructModule mod termDefs
-    return $ M.fromList [(path, hydraYamlToString node)]
-  where
-    path = namespaceToFilePath CaseConventionCamel (FileExtension "yaml") $ moduleNamespace mod
-
-constructModule :: Module -> [TermDefinition] -> Flow Graph YM.Node
-constructModule mod termDefs = do
-    keyvals <- withTrace "encoding terms" (CM.mapM toYaml termDefs)
-    return $ YM.NodeMapping $ M.fromList keyvals
-  where
-    toYaml (TermDefinition name term typeScheme) = withTrace ("element " ++ unName name) $ do
-      coder <- yamlCoder (typeSchemeType typeScheme)
-      node <- coderEncode coder term
-      return (YM.NodeScalar $ YM.ScalarStr $ localNameOf name, node)
-    ns = unNamespace $ moduleNamespace mod
-    localNameOf name = L.drop (1 + L.length ns) $ unName name
diff --git a/src/main/haskell/Hydra/Staging/Yaml/Serde.hs b/src/main/haskell/Hydra/Staging/Yaml/Serde.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Staging/Yaml/Serde.hs
+++ /dev/null
@@ -1,82 +0,0 @@
--- | YAML serialization and deserialization using the HsYAML library
-
-module Hydra.Staging.Yaml.Serde where
-
-import Hydra.Kernel
-import Hydra.Staging.Yaml.Coder
-import Hydra.Tools.Bytestrings
-import qualified Hydra.Ext.Org.Yaml.Model as YM
-
-import qualified Data.ByteString.Lazy as BS
-import qualified Control.Monad as CM
-import qualified Data.YAML as DY
-import qualified Data.YAML.Event as DYE
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Text as T
-import qualified Data.ByteString.Lazy.Char8 as LB
-
-
-bytesToHsYaml :: BS.ByteString -> Flow (Graph) (DY.Node DY.Pos)
-bytesToHsYaml bs = case DY.decodeNode bs of
-    Left (pos, msg) -> fail $ "YAML parser failure at " ++ show pos ++ ": " ++ msg
-    Right docs -> if L.null docs
-      then fail "no YAML document"
-      else if L.length docs > 1
-      then fail "multiple YAML documents"
-      else case L.head docs of
-        (DY.Doc node) -> pure node
-
-bytesToHydraYaml :: BS.ByteString -> Flow (Graph) YM.Node
-bytesToHydraYaml = bytesToHsYaml CM.>=> hsYamlToHydraYaml
-
-hsYamlToBytes :: DY.Node () -> BS.ByteString
-hsYamlToBytes node = DY.encodeNode [DY.Doc node]
-
-hsYamlToHydraYaml :: DY.Node x -> Flow (Graph) YM.Node
-hsYamlToHydraYaml hs = case hs of
-  DY.Scalar _ s -> YM.NodeScalar <$> case s of
-     DY.SNull -> pure YM.ScalarNull
-     DY.SBool b -> pure $ YM.ScalarBool b
-     DY.SFloat f -> pure $ YM.ScalarFloat f
-     DY.SInt i -> pure $ YM.ScalarInt i
-     DY.SStr t -> pure $ YM.ScalarStr $ T.unpack t
-     DY.SUnknown _ _ -> fail "YAML unknown scalars are unsupported"
-  DY.Mapping _ _ m -> YM.NodeMapping . M.fromList <$> CM.mapM mapPair (M.toList m)
-    where
-      mapPair (k, v) = (,) <$> hsYamlToHydraYaml k <*> hsYamlToHydraYaml v
-  DY.Sequence _ _ s -> YM.NodeSequence <$> CM.mapM hsYamlToHydraYaml s
-  DY.Anchor {} -> fail "YAML anchors are unsupported"
-
-hydraYamlToBytes :: YM.Node -> BS.ByteString
-hydraYamlToBytes = hsYamlToBytes . hydraYamlToHsYaml
-
-hydraYamlToHsYaml :: YM.Node -> DY.Node ()
-hydraYamlToHsYaml hy = case hy of
-  YM.NodeMapping m -> DY.Mapping () DYE.untagged $ M.fromList $ mapPair <$> M.toList m
-    where
-      mapPair (k, v) = (,) (hydraYamlToHsYaml k) (hydraYamlToHsYaml v)
-  YM.NodeScalar s -> DY.Scalar () $ case s of
-    YM.ScalarBool b -> DY.SBool b
-    YM.ScalarFloat f -> DY.SFloat f
-    YM.ScalarInt i -> DY.SInt i
-    YM.ScalarNull -> DY.SNull
-    YM.ScalarStr s -> DY.SStr $ T.pack s
-  YM.NodeSequence s -> DY.Sequence () DYE.untagged $ hydraYamlToHsYaml <$> s
-
-hydraYamlToString :: YM.Node -> String
-hydraYamlToString = bytesToString . hydraYamlToBytes
-
-yamlByteStringCoder :: Type -> Flow (Graph) (Coder (Graph) (Graph) (Term) BS.ByteString)
-yamlByteStringCoder typ = do
-  coder <- yamlCoder typ
-  return Coder {
-    coderEncode = fmap hydraYamlToBytes . coderEncode coder,
-    coderDecode = bytesToHydraYaml CM.>=> coderDecode coder}
-
-yamlStringCoder :: Type -> Flow (Graph) (Coder (Graph) (Graph) (Term) String)
-yamlStringCoder typ = do
-  serde <- yamlByteStringCoder typ
-  return Coder {
-    coderEncode = fmap LB.unpack . coderEncode serde,
-    coderDecode = coderDecode serde . LB.pack}
diff --git a/src/main/haskell/Hydra/Tools/Monads.hs b/src/main/haskell/Hydra/Tools/Monads.hs
deleted file mode 100644
--- a/src/main/haskell/Hydra/Tools/Monads.hs
+++ /dev/null
@@ -1,28 +0,0 @@
--- | Functions and type class implementations for working with Hydra's built-in Flow monad
-
-module Hydra.Tools.Monads where
-
-import Hydra.Compute
-import Hydra.Monads hiding (fail, pure)
-import qualified Hydra.Lib.Flows as Flows
-
-import qualified Control.Monad as CM
-import qualified System.IO as IO
-
-
-fromEither :: Show e => (e -> String) -> Either e a -> Flow c a
-fromEither printErr x = case x of
-  Left e -> Flows.fail $ printErr e
-  Right a -> return a
-
-flowToIo :: s -> Flow s a -> IO.IO a
-flowToIo cx f = case mv of
-    Just v -> return v
-    Nothing -> CM.fail $ traceSummary trace
-  where
-    FlowState mv _ trace = unFlow f cx emptyTrace
-
-fromMaybe :: String -> Maybe a -> Flow s a
-fromMaybe message m = case m of
-  Nothing -> Flows.fail message
-  Just v -> return v
diff --git a/src/main/haskell/Org/Example/Lispy.hs b/src/main/haskell/Org/Example/Lispy.hs
--- a/src/main/haskell/Org/Example/Lispy.hs
+++ b/src/main/haskell/Org/Example/Lispy.hs
@@ -21,7 +21,7 @@
 define = defineType ns
 
 module_ :: Module
-module_ = Module ns elements [] [Core.ns] $
+module_ = Module ns (map toTypeDef elements) [] [Core.ns] $
     Just "Data model definition for the Lispy interpreter"
   where
     elements = [
diff --git a/src/test/haskell/Hydra/Adapt/LiteralsSpec.hs b/src/test/haskell/Hydra/Adapt/LiteralsSpec.hs
deleted file mode 100644
--- a/src/test/haskell/Hydra/Adapt/LiteralsSpec.hs
+++ /dev/null
@@ -1,139 +0,0 @@
-{-
-stack ghci hydra:lib hydra:hydra-test
-
-Test.Hspec.hspec Hydra.Adapt.LiteralsSpec.spec
--}
-
-module Hydra.Adapt.LiteralsSpec where
-
-import Hydra.Kernel
-import qualified Hydra.Lib.Literals as Literals
-
-import Hydra.TestUtils
-
-import qualified Test.Hspec as H
-import qualified Test.QuickCheck as QC
-
-
-testFloatAdapter :: H.SpecWith ()
-testFloatAdapter = H.describe "Test floating-point adapter" $ do
-
-  H.it "upgrade float32 to bigfloat, since float32 and float64 are unsupported" $
-    QC.property $ \f -> checkFloatAdapter
-      [FloatTypeBigfloat]
-      FloatTypeFloat32 FloatTypeBigfloat False
-      (FloatValueFloat32 f) (FloatValueBigfloat $ realToFrac f)
-
-  H.it "downgrade bigfloat to float64" $
-    QC.property $ \d -> checkFloatAdapter
-      [FloatTypeFloat32, FloatTypeFloat64]
-      FloatTypeBigfloat FloatTypeFloat64 True
-      (FloatValueBigfloat d) (FloatValueFloat64 $ realToFrac d)
-
-  H.it "downgrade bigfloat to float32, since float64 is unsupported" $
-    QC.property $ \d -> checkFloatAdapter
-      [FloatTypeFloat32]
-      FloatTypeBigfloat FloatTypeFloat32 True
-      (FloatValueBigfloat d) (FloatValueFloat32 $ realToFrac d)
-
-  H.it "bigfloat is supported and remains unchanged" $
-    QC.property $ \d -> checkFloatAdapter
-      [FloatTypeFloat32, FloatTypeBigfloat]
-      FloatTypeBigfloat FloatTypeBigfloat False
-      (FloatValueBigfloat d) (FloatValueBigfloat d)
-
-testIntegerAdapter :: H.SpecWith ()
-testIntegerAdapter = H.describe "Test integer adapter" $ do
-
-  H.it "upgrade uint8 to uint16, not int16" $
-    QC.property $ \b -> checkIntegerAdapter
-      [IntegerTypeInt16, IntegerTypeUint16, IntegerTypeBigint]
-      IntegerTypeUint8 IntegerTypeUint16 False
-      (IntegerValueUint8 b) (IntegerValueUint16 $ fromIntegral b)
-
-  H.it "upgrade int8 to int16, not uint16" $
-    QC.property $ \b -> checkIntegerAdapter
-      [IntegerTypeInt16, IntegerTypeUint16, IntegerTypeBigint]
-      IntegerTypeInt8 IntegerTypeInt16 False
-      (IntegerValueInt8 b) (IntegerValueInt16 $ fromIntegral b)
-
-  H.it "upgrade uint8 to int16 when uint16 is not supported" $
-    QC.property $ \b -> checkIntegerAdapter
-      [IntegerTypeInt16, IntegerTypeInt32, IntegerTypeBigint]
-      IntegerTypeUint8 IntegerTypeInt16 False
-      (IntegerValueUint8 b) (IntegerValueInt16 $ fromIntegral b)
-
-  H.it "cross-convert uint32 to int32, even when uint16 is supported" $
-    QC.property $ \b -> checkIntegerAdapter
-      [IntegerTypeUint16, IntegerTypeInt32]
-      IntegerTypeUint32 IntegerTypeInt32 True
-      (IntegerValueUint32 b) (IntegerValueInt32 $ fromIntegral b)
-
-  H.it "downgrade bigint to int32, not uint32" $
-    QC.property $ \b -> checkIntegerAdapter
-      [IntegerTypeInt16, IntegerTypeUint16, IntegerTypeInt32, IntegerTypeUint32]
-      IntegerTypeBigint IntegerTypeInt32 True
-      (IntegerValueBigint b) (IntegerValueInt32 $ fromIntegral b)
-
-  H.it "upgrade uint64 to bigint when supported" $
-    QC.property $ \i -> checkIntegerAdapter
-      [IntegerTypeInt32, IntegerTypeUint32, IntegerTypeBigint]
-      IntegerTypeUint64 IntegerTypeBigint False
-      (IntegerValueUint64 i) (IntegerValueBigint $ fromIntegral i)
-
-  H.it "downgrade uint64 to uint32 when bigint is unsupported" $
-    QC.property $ \i -> checkIntegerAdapter
-      [IntegerTypeInt32, IntegerTypeUint32]
-      IntegerTypeUint64 IntegerTypeUint32 True
-      (IntegerValueUint64 i) (IntegerValueUint32 $ fromIntegral i)
-
-  H.it "upgrade int64 to bigint when supported" $
-    QC.property $ \i -> checkIntegerAdapter
-      [IntegerTypeBigint]
-      IntegerTypeInt64 IntegerTypeBigint False
-      (IntegerValueInt64 i) (IntegerValueBigint $ fromIntegral i)
-
-testLiteralAdapter :: H.SpecWith ()
-testLiteralAdapter = H.describe "Test literal adapter" $ do
-
-  H.it "encode binary data as strings (base64)" $
-    QC.property $ \b -> checkLiteralAdapter
-      [LiteralVariantString]
-      LiteralTypeBinary LiteralTypeString False
-      (LiteralBinary b) (LiteralString $ Literals.binaryToStringBS b)
-
-  H.it "encode booleans as strings" $
-    QC.property $ \b -> checkLiteralAdapter
-      [LiteralVariantString]
-      LiteralTypeBoolean LiteralTypeString False
-      (LiteralBoolean b) (LiteralString $ if b then "true" else "false")
-
-  H.it "encode booleans as integers" $
-    QC.property $ \b -> checkLiteralAdapter
-      [LiteralVariantInteger]
-      LiteralTypeBoolean (LiteralTypeInteger IntegerTypeInt16) False
-      (LiteralBoolean b) (LiteralInteger $ IntegerValueInt16 $ if b then 1 else 0)
-
-  H.it "floating-point encoding is delegated to the float adapter" $
-    QC.property $ \f -> checkLiteralAdapter
-      [LiteralVariantFloat]
-      (LiteralTypeFloat FloatTypeBigfloat) (LiteralTypeFloat FloatTypeFloat32) True
-      (LiteralFloat $ FloatValueBigfloat f) (LiteralFloat $ FloatValueFloat32 $ realToFrac f)
-
-  H.it "integer encoding is delegated to the integer adapter" $
-    QC.property $ \i -> checkLiteralAdapter
-      [LiteralVariantInteger]
-      (LiteralTypeInteger IntegerTypeBigint) (LiteralTypeInteger IntegerTypeInt32) True
-      (LiteralInteger $ IntegerValueBigint i) (LiteralInteger $ IntegerValueInt32 $ fromIntegral i)
-
-  H.it "strings are unchanged" $
-    QC.property $ \s -> checkLiteralAdapter
-      [LiteralVariantString]
-      LiteralTypeString LiteralTypeString False
-      (LiteralString s) (LiteralString s)
-
-spec :: H.Spec
-spec = do
-  testFloatAdapter
-  testIntegerAdapter
-  testLiteralAdapter
diff --git a/src/test/haskell/Hydra/Adapt/TermsSpec.hs b/src/test/haskell/Hydra/Adapt/TermsSpec.hs
deleted file mode 100644
--- a/src/test/haskell/Hydra/Adapt/TermsSpec.hs
+++ /dev/null
@@ -1,307 +0,0 @@
-module Hydra.Adapt.TermsSpec where
-
-import Hydra.Kernel
-import Hydra.Adapt.Terms
-import Hydra.Adapt.Utils
-import Hydra.Dsl.Terms as Terms
-import qualified Hydra.Dsl.Types as Types
-import Hydra.Dsl.Tests
-
-import Hydra.TestUtils
-
-import qualified Test.Hspec as H
-import qualified Data.Map as M
-import qualified Test.QuickCheck as QC
-import qualified Data.Set as S
-import qualified Data.Maybe as Y
-
-
-constraintsAreAsExpected :: H.SpecWith ()
-constraintsAreAsExpected = H.describe "Verify that the language constraints include/exclude the appropriate types" $ do
-
-    H.it "int16, int32, and bigint are supported in the test context" $ do
-      typeIsSupported (context [TypeVariantLiteral]) Types.int16 `H.shouldBe` True
-      typeIsSupported (context [TypeVariantLiteral]) Types.int32 `H.shouldBe` True
-      typeIsSupported (context [TypeVariantLiteral]) Types.bigint `H.shouldBe` True
-
-    H.it "int8 and uint32 are unsupported in the test context" $ do
-      typeIsSupported (context [TypeVariantLiteral]) Types.int8 `H.shouldBe` False
-      typeIsSupported (context [TypeVariantLiteral]) Types.uint32 `H.shouldBe` False
-
-    -- Note: floating-point constraints are untested
-
-    H.it "Records are supported, but unions are not" $ do
-      typeIsSupported (context [TypeVariantLiteral, TypeVariantRecord]) testTypeLatLon `H.shouldBe` True
-      typeIsSupported (context [TypeVariantLiteral, TypeVariantRecord]) stringOrIntType `H.shouldBe` False
-
-    H.it "Records are supported if and only if each of their fields are supported" $ do
-      typeIsSupported (context [TypeVariantLiteral, TypeVariantRecord])
-        (TypeRecord $ RowType (Name "Example") [Types.field "first" Types.string, Types.field "second" Types.int16])
-        `H.shouldBe` True
-      typeIsSupported (context [TypeVariantLiteral, TypeVariantRecord])
-        (TypeRecord $ RowType (Name "Example") [Types.field "first" Types.string, Types.field "second" Types.int8])
-        `H.shouldBe` False
-
-    H.it "Lists are supported if the list element type is supported" $ do
-      typeIsSupported (context [TypeVariantLiteral, TypeVariantList]) listOfStringsType `H.shouldBe` True
-      typeIsSupported (context [TypeVariantLiteral, TypeVariantList]) listOfListsOfStringsType `H.shouldBe` True
-      typeIsSupported (context [TypeVariantLiteral, TypeVariantList]) listOfSetOfStringsType `H.shouldBe` False
-
-  where
-    context = languageConstraints . adapterContextLanguage . termTestContext
-
-supportedConstructorsAreUnchanged :: H.SpecWith ()
-supportedConstructorsAreUnchanged = H.describe "Verify that supported term constructors are unchanged" $ do
-
-  H.it "Strings (and other supported literal values) pass through without change" $
-    QC.property $ \b -> checkDataAdapter
-      [TypeVariantLiteral]
-      Types.string
-      Types.string
-      False
-      (string b)
-      (string b)
-
-  H.it "Lists (when supported) pass through without change" $
-    QC.property $ \strings -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantList]
-      listOfStringsType
-      listOfStringsType
-      False
-      (list $ string <$> strings)
-      (list $ string <$> strings)
-
-  H.it "Maps (when supported) pass through without change" $
-    QC.property $ \keyvals -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantMap]
-      mapOfStringsToIntsType
-      mapOfStringsToIntsType
-      False
-      (makeMap keyvals)
-      (makeMap keyvals)
-
-  H.it "Optionals (when supported) pass through without change" $
-    QC.property $ \mi -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantMaybe]
-      optionalInt8Type
-      optionalInt16Type
-      False
-      (optional $ int8 <$> mi)
-      (optional $ int16 . fromIntegral <$> mi)
-
-  H.it "Records (when supported) pass through without change" $
-    QC.property $ \a1 a2 -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantRecord]
-      (TypeRecord $ RowType testTypeName [Types.field "first" Types.string, Types.field "second" Types.int8])
-      (TypeRecord $ RowType testTypeName [Types.field "first" Types.string, Types.field "second" Types.int16])
-      False
-      (record testTypeName [field "first" $ string a1, field "second" $ int8 a2])
-      (record testTypeName [field "first" $ string a1, field "second" $ int16 $ fromIntegral a2])
-
-  H.it "Unions (when supported) pass through without change" $
-    QC.property $ \int -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantUnion]
-      stringOrIntType
-      stringOrIntType
-      False
-      (inject stringOrIntName (Name "right") $ int32 int)
-      (inject stringOrIntName (Name "right") $ int32 int)
-
-  H.it "Sets (when supported) pass through without change" $
-    QC.property $ \strings -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantSet]
-      setOfStringsType
-      setOfStringsType
-      False
-      (stringSet strings)
-      (stringSet strings)
-
-  H.it "Primitive function references (when supported) pass through without change" $
-    QC.property $ \name -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantFunction]
-      concatType
-      concatType
-      False
-      (primitive name)
-      (primitive name)
-
-  H.it "Projections (when supported) pass through without change" $
-    QC.property $ \fname -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantFunction, TypeVariantRecord]
-      exampleProjectionType
-      exampleProjectionType
-      False
-      (project testTypePersonName fname)
-      (project testTypePersonName fname)
-
-unsupportedConstructorsAreModified :: H.SpecWith ()
-unsupportedConstructorsAreModified = H.describe "Verify that unsupported term constructors are changed in the expected ways" $ do
-
-  H.it "Sets (when unsupported) become lists" $
-    QC.property $ \strings -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantList]
-      setOfStringsType
-      listOfStringsType
-      False
-      (stringSet strings)
-      (stringList $ S.toList strings)
-
-  H.it "Optionals (when unsupported) become lists" $
-    QC.property $ \ms -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantList]
-      (Types.maybe Types.string)
-      (Types.list Types.string)
-      False
-      (optional $ string <$> ms)
-      (list $ Y.maybe [] (\s -> [string s]) ms)
-
-  H.it "Primitive function references (when unsupported) become inject terms" $
-    QC.property $ \name -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantUnion, TypeVariantRecord]
-      concatType
-      (functionProxyType Types.string)
-      False
-      (primitive name)
-      (inject functionProxyName (Name "primitive") (string $ unName name)) -- Note: the function name is not dereferenced
-
---  H.it "Projections (when unsupported) become inject terms" $
---    QC.property $ \fname -> checkDataAdapter
---      [TypeVariantLiteral, TypeVariantUnion, TypeVariantRecord]
---      exampleProjectionType
---      (functionProxyType testTypePerson)
---      False
---      (project testTypePersonName fname)
---      (inject functionProxyName $ field "record" $ string $
---        show (project testTypePersonName fname :: Term)) -- Note: the field name is not dereferenced
-
---  H.it "Nominal types (when unsupported) are dereferenced" $
---    QC.property $ \s -> checkDataAdapter
---      [TypeVariantLiteral, TypeVariantAnnotated]
---      testTypeStringAlias
---      (TypeAnnotated $ Annotated Types.string $ Kv $
---        M.fromList [(key_description, Terms.string "An alias for the string type")])
---      False
---      (string s)
---      (string s)
-
-  H.it "Unions (when unsupported) become records" $
-    QC.property $ \i -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantMaybe, TypeVariantRecord]
-      eitherStringOrInt8Type
-      (TypeRecord $ RowType eitherStringOrInt8TypeName [
-        Types.field "left" $ Types.maybe Types.string,
-        Types.field "right" $ Types.maybe Types.int16])
-      False
-      (inject eitherStringOrInt8TypeName (Name "right") (int8 i))
-      (record eitherStringOrInt8TypeName [
-        field "left" $ optional Nothing,
-        field "right" $ optional $ Just $ int16 $ fromIntegral i])
-
-termsAreAdaptedRecursively :: H.SpecWith ()
-termsAreAdaptedRecursively = H.describe "Verify that the adapter descends into subterms and transforms them appropriately" $ do
-
-  H.it "A list of int8's becomes a list of int32's" $
-    QC.property $ \ints -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantList]
-      listOfInt8sType
-      listOfInt16sType
-      False
-      (list $ int8 <$> ints)
-      (list $ int16 . fromIntegral <$> ints)
-
-  H.it "A list of sets of strings becomes a list of lists of strings" $
-    QC.property $ \lists -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantList]
-      listOfSetOfStringsType
-      listOfListsOfStringsType
-      False
-      (list $ (\l -> set $ S.fromList $ string <$> l) <$> lists)
-      (list $ (\l -> list $ string <$> S.toList (S.fromList l)) <$> lists)
-
-  H.it "A wrapped int64 becomes a wrapped bigint" $
-    QC.property $ \i -> checkDataAdapter
-      [TypeVariantLiteral, TypeVariantWrap]
-      (Types.wrapWithName aliasName Types.int64)
-      (Types.wrapWithName aliasName Types.bigint)
-      False
-      (wrap aliasName $ int64 i)
-      (wrap aliasName $ bigint $ fromIntegral i)
-  where
-    aliasName = Name "MyAlias"
-
-roundTripsPreserveSelectedTypes :: H.SpecWith ()
-roundTripsPreserveSelectedTypes = H.describe "Verify that the adapter is information preserving, i.e. that round-trips are no-ops" $ do
-
-  H.it "Check strings (pass-through)" $
-    QC.property $ \s -> roundTripIsNoop Types.string (string s)
-
-  H.it "Check lists (pass-through)" $
-    QC.property $ \strings -> roundTripIsNoop listOfStringsType (list $ string <$> strings)
-
-  H.it "Check sets (which map to lists)" $
-    QC.property $ \strings -> roundTripIsNoop setOfStringsType (stringSet strings)
-
-  H.it "Check primitive function references (which map to variants)" $
-    QC.property $ \name -> roundTripIsNoop concatType (primitive name)
-
---  H.it "Check projection terms (which map to variants)" $
---    QC.property $ \fname -> roundTripIsNoop exampleProjectionType (project testTypePersonName fname)
-
-  H.it "Check newtype terms (which pass through as instances of the aliased type)" $
-    QC.property $ \s -> roundTripIsNoop testTypeStringAlias (wrap testTypeStringAliasName $ string s)
-
---roundTripsPreserveArbitraryTypes :: H.SpecWith ()
---roundTripsPreserveArbitraryTypes = H.describe "Verify that the adapter is information preserving for arbitrary typed terms" $ do
---
---  H.it "Check arbitrary type/term pairs" $
---    QC.property $ \(TypeApplicationTerm term typ) -> roundTripIsNoop typ term
-
-fieldAdaptersAreAsExpected :: H.SpecWith ()
-fieldAdaptersAreAsExpected = H.describe "Check that field adapters are as expected" $ do
-
-  H.it "An int8 field becomes an int16 field" $
-    QC.property $ \i -> checkFieldAdapter
-      [TypeVariantLiteral, TypeVariantRecord]
-      (Types.field "second" Types.int8)
-      (Types.field "second" Types.int16)
-      False
-      (field "second" $ int8 i)
-      (field "second" $ int16 $ fromIntegral i)
-
-roundTripIsNoop :: Type -> Term -> H.Expectation
-roundTripIsNoop typ term = shouldSucceedWith
-   (step coderEncode term >>= step coderDecode)
-   term
-  where
-    step = adapt typ
-
-    -- Use a YAML-like language (but supporting unions) as the default target language
-    testLanguage = Language (LanguageName "hydra.test") $ LanguageConstraints {
-      languageConstraintsEliminationVariants = S.empty, -- S.fromList eliminationVariants,
-      languageConstraintsLiteralVariants = S.fromList [
-        LiteralVariantBoolean, LiteralVariantFloat, LiteralVariantInteger, LiteralVariantString],
-      languageConstraintsFloatTypes = S.fromList [FloatTypeBigfloat],
-      languageConstraintsFunctionVariants = S.empty,
-      languageConstraintsIntegerTypes = S.fromList [IntegerTypeBigint],
-      languageConstraintsTermVariants = S.fromList termVariants,
-      languageConstraintsTypeVariants = S.fromList [
-        TypeVariantAnnotated, TypeVariantLiteral, TypeVariantList, TypeVariantMap, TypeVariantRecord, TypeVariantUnion],
-      languageConstraintsTypes = \typ -> case deannotateType typ of
-        TypeMaybe (TypeMaybe _) -> False
-        _ -> True }
-
-    -- Note: in a real application, you wouldn't create the adapter just to use it once;
-    --       it should be created once, then applied to many terms.
-    adapt typ dir term = do
-      adapter <- languageAdapter testLanguage typ
-      dir (adapterCoder adapter) term
-
-spec :: H.Spec
-spec = do
-  constraintsAreAsExpected
-  supportedConstructorsAreUnchanged
-  unsupportedConstructorsAreModified
-  termsAreAdaptedRecursively
-  roundTripsPreserveSelectedTypes
---  roundTripsPreserveArbitraryTypes -- TODO: restore me
-  fieldAdaptersAreAsExpected
diff --git a/src/test/haskell/Hydra/ArbitraryCore.hs b/src/test/haskell/Hydra/ArbitraryCore.hs
--- a/src/test/haskell/Hydra/ArbitraryCore.hs
+++ b/src/test/haskell/Hydra/ArbitraryCore.hs
@@ -131,11 +131,11 @@
       FunctionLambda <$> (Lambda (Name "x") Nothing <$> arbitraryTerm cod n')]
      -- Note: two random types will rarely be equal, but it will happen occasionally with simple types
     domainSpecific = case dom of
-      TypeUnion (RowType n sfields) -> [cs]
+      TypeUnion sfields -> [cs]
         where
           cs = do
             afields <- CM.mapM arbitraryCase sfields
-            return $ FunctionElimination $ EliminationUnion $ CaseStatement n Nothing afields
+            return $ FunctionElimination $ EliminationUnion $ CaseStatement (Name "placeholder") Nothing afields
           arbitraryCase (FieldType fn dom') = do
             term <- arbitraryFunction (FunctionType dom' cod) n2
             return $ Field fn $ TermFunction term
@@ -189,14 +189,14 @@
           where
             n' = div n 2
     TypeMaybe ot -> optional <$> arbitraryOptional (arbitraryTerm ot) n'
-    TypeRecord (RowType n sfields) -> record n <$> arbitraryFields sfields
+    TypeRecord sfields -> record (Name "placeholder") <$> arbitraryFields sfields
     TypeSet st -> set <$> (S.fromList <$> arbitraryList False (arbitraryTerm st) n')
-    TypeUnion (RowType n sfields) -> do
+    TypeUnion sfields -> do
       f <- QC.elements sfields
       let fn = fieldTypeName f
       let Name fnStr = fn
       ft <- arbitraryTerm (fieldTypeType f) n'
-      return $ inject n (Name fnStr) ft
+      return $ inject (Name "placeholder") (Name fnStr) ft
     TypeUnit -> pure TermUnit
   where
     n' = decr n
@@ -262,14 +262,14 @@
         promoteType = (ot, \(TermMaybe m) -> Y.maybeToList m)
         shrinkType = (\(t, m) -> (Types.maybe t,
           \(TermMaybe mb) -> Y.maybe [] (fmap (optional . Just) . m) mb)) <$> shrinkers ot
-    TypeRecord (RowType name sfields) -> dropFields
-        ++ shrinkFieldNames (TypeRecord . RowType name) (record name) (\(TermRecord (Record _ dfields)) -> dfields) sfields
+    TypeRecord sfields -> dropFields
+        ++ shrinkFieldNames TypeRecord (record (Name "placeholder")) (\(TermRecord (Record _ dfields)) -> dfields) sfields
         ++ promoteTypes ++ shrinkTypes
       where
         dropFields = dropField <$> indices
           where
-            dropField i = (TypeRecord $ RowType name $ dropIth i sfields, \(TermRecord (Record _ dfields))
-              -> [record name $ dropIth i dfields])
+            dropField i = (TypeRecord $ dropIth i sfields, \(TermRecord (Record _ dfields))
+              -> [record (Name "placeholder") $ dropIth i dfields])
         promoteTypes = promoteField <$> indices
           where
             promoteField i = (fieldTypeType $ sfields !! i, \(TermRecord (Record _ dfields))
@@ -281,8 +281,8 @@
         dropElements = (Types.set st, \(TermSet els) -> set . S.fromList <$> dropAny (S.toList els))
         promoteType = (st, \(TermSet els) -> S.toList els)
         shrinkType = (\(t, m) -> (Types.set t, \(TermSet els) -> set . S.fromList <$> CM.mapM m (S.toList els))) <$> shrinkers st
-    TypeUnion (RowType name sfields) -> dropFields
-        ++ shrinkFieldNames (TypeUnion . RowType name) (\fs -> let Field (Name fn) ft = L.head fs in inject name (Name fn) ft) (\(TermUnion (Injection _ f)) -> [f]) sfields
+    TypeUnion sfields -> dropFields
+        ++ shrinkFieldNames TypeUnion (\fs -> let Field (Name fn) ft = L.head fs in inject (Name "placeholder") (Name fn) ft) (\(TermUnion (Injection _ f)) -> [f]) sfields
         ++ promoteTypes ++ shrinkTypes
       where
         dropFields = [] -- TODO
diff --git a/src/test/haskell/Hydra/CoreCodersSpec.hs b/src/test/haskell/Hydra/CoreCodersSpec.hs
--- a/src/test/haskell/Hydra/CoreCodersSpec.hs
+++ b/src/test/haskell/Hydra/CoreCodersSpec.hs
@@ -11,8 +11,7 @@
 import qualified Hydra.Dsl.Types as Types
 import qualified Hydra.Decode.Core as DecodeCore
 import qualified Hydra.Encode.Core as EncodeCore
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Util as Util
+import qualified Hydra.Errors as Error
 
 import Hydra.TestData
 import Hydra.TestUtils
@@ -23,6 +22,10 @@
 import qualified Data.Map as M
 
 
+-- | Helper to map DecodingError to String for test assertions
+decodeE :: Either DecodingError a -> Either String a
+decodeE = either (Left . Error.unDecodingError) Right
+
 individualEncoderTestCases :: H.SpecWith ()
 individualEncoderTestCases = do
   H.describe "Individual encoder test cases" $ do
@@ -44,18 +47,16 @@
 
     H.it "record type" $ do
       H.shouldBe
-        (strip $ EncodeCore.type_ (TypeRecord $ RowType (Name "Example")
+        (strip $ EncodeCore.type_ (TypeRecord
           [Types.field "something" Types.string, Types.field "nothing" Types.unit]) :: Term)
         (strip $ inject _Type _Type_record $
-          record _RowType [
-            Field _RowType_typeName $ wrap _Name $ string "Example",
-            Field _RowType_fields $ list [
-              record _FieldType [
-                Field _FieldType_name $ wrap _Name $ string "something",
-                Field _FieldType_type $ inject _Type _Type_literal $ injectUnit _LiteralType _LiteralType_string],
-              record _FieldType [
-                Field _FieldType_name $ wrap _Name $ string "nothing",
-                Field _FieldType_type $ injectUnit _Type _Type_unit]]])
+          list [
+            record _FieldType [
+              Field _FieldType_name $ wrap _Name $ string "something",
+              Field _FieldType_type $ inject _Type _Type_literal $ injectUnit _LiteralType _LiteralType_string],
+            record _FieldType [
+              Field _FieldType_name $ wrap _Name $ string "nothing",
+              Field _FieldType_type $ injectUnit _Type _Type_unit]])
 
     H.it "Name (wrapped type)" $ do
       H.shouldBe
@@ -116,62 +117,60 @@
 
     H.it "float32 literal type" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.literalType testGraph
+        (decodeE $ DecodeCore.literalType (testGraph)
           (inject _LiteralType _LiteralType_float $ injectUnit _FloatType _FloatType_float32))
         (LiteralTypeFloat FloatTypeFloat32)
 
     H.it "float32 type" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph
+        (decodeE $ DecodeCore.type_ (testGraph)
           (inject _Type _Type_literal $ inject _LiteralType _LiteralType_float $ injectUnit _FloatType _FloatType_float32))
         Types.float32
 
     H.it "union type" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph $
-          inject _Type _Type_union $ record _RowType [
-            Field _RowType_typeName $ wrap _Name $ string (unName testTypeName),
-            Field _RowType_fields $
-              list [
-                record _FieldType [
-                  Field _FieldType_name $ wrap _Name $ string "left",
-                  Field _FieldType_type $ inject _Type _Type_literal $ inject _LiteralType _LiteralType_integer $
-                    injectUnit _IntegerType _IntegerType_int64],
-                record _FieldType [
-                  Field _FieldType_name $ wrap _Name $ string "right",
-                  Field _FieldType_type $ inject _Type _Type_literal $ inject _LiteralType _LiteralType_float $
-                    injectUnit _FloatType _FloatType_float64]]])
-          (TypeUnion $ RowType testTypeName [
+        (decodeE $ DecodeCore.type_ (testGraph) $
+          inject _Type _Type_union $
+            list [
+              record _FieldType [
+                Field _FieldType_name $ wrap _Name $ string "left",
+                Field _FieldType_type $ inject _Type _Type_literal $ inject _LiteralType _LiteralType_integer $
+                  injectUnit _IntegerType _IntegerType_int64],
+              record _FieldType [
+                Field _FieldType_name $ wrap _Name $ string "right",
+                Field _FieldType_type $ inject _Type _Type_literal $ inject _LiteralType _LiteralType_float $
+                  injectUnit _FloatType _FloatType_float64]])
+          (TypeUnion [
             Types.field "left" Types.int64,
             Types.field "right" Types.float64])
 
     H.it "Name (wrapped type)" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.name testGraph $
+        (decodeE $ DecodeCore.name (testGraph) $
           wrap _Name $ string "test.Name")
         (Name "test.Name")
 
     H.it "string literal" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.literal testGraph $
+        (decodeE $ DecodeCore.literal (testGraph) $
           inject _Literal _Literal_string $ string "hello")
         (LiteralString "hello")
 
     H.it "int32 literal" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.literal testGraph $
+        (decodeE $ DecodeCore.literal (testGraph) $
           inject _Literal _Literal_integer $ inject _IntegerValue _IntegerValue_int32 $ int32 42)
         (LiteralInteger (IntegerValueInt32 42))
 
     H.it "boolean literal" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.literal testGraph $
+        (decodeE $ DecodeCore.literal (testGraph) $
           inject _Literal _Literal_boolean $ boolean True)
         (LiteralBoolean True)
 
     H.it "Field (record type)" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.field testGraph $
+        (decodeE $ DecodeCore.field (testGraph) $
           record _Field [
             Field _Field_name $ wrap _Name $ string "myField",
             Field _Field_term $ inject _Term _Term_literal $ inject _Literal _Literal_string $ string "value"])
@@ -179,7 +178,7 @@
 
     H.it "Lambda function" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.lambda testGraph $
+        (decodeE $ DecodeCore.lambda (testGraph) $
           record _Lambda [
             Field _Lambda_parameter $ wrap _Name $ string "x",
             Field _Lambda_domain $ optional Nothing,
@@ -188,7 +187,7 @@
 
     H.it "function type" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph $
+        (decodeE $ DecodeCore.type_ (testGraph) $
           inject _Type _Type_function $ record _FunctionType [
             Field _FunctionType_domain $ inject _Type _Type_literal $ injectUnit _LiteralType _LiteralType_string,
             Field _FunctionType_codomain $ inject _Type _Type_literal $ inject _LiteralType _LiteralType_integer $
@@ -197,13 +196,13 @@
 
     H.it "list type" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph $
+        (decodeE $ DecodeCore.type_ (testGraph) $
           inject _Type _Type_list $ inject _Type _Type_literal $ injectUnit _LiteralType _LiteralType_boolean)
         (Types.list Types.boolean)
 
     H.it "optional type" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph $
+        (decodeE $ DecodeCore.type_ (testGraph) $
           inject _Type _Type_maybe $ inject _Type _Type_literal $ injectUnit _LiteralType _LiteralType_string)
         (Types.optional Types.string)
 
@@ -212,23 +211,23 @@
   H.describe "Decode invalid terms" $ do
 
     H.it "Try to decode a term with wrong fields for Type" $ do
-      shouldFail (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph $ inject untyped (Name "unknownField") $ list [])
+      shouldFail (decodeE $ DecodeCore.type_ (testGraph) $ inject untyped (Name "unknownField") $ list [])
 
     H.it "Try to decode an incomplete representation of a Type" $ do
-      shouldFail (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph $ inject _Type _Type_literal $ injectUnit _LiteralType _LiteralType_integer)
+      shouldFail (decodeE $ DecodeCore.type_ (testGraph) $ inject _Type _Type_literal $ injectUnit _LiteralType _LiteralType_integer)
 
     H.it "Try to decode a Name from non-string" $ do
-      shouldFail (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.name testGraph $ wrap _Name $ int32 42)
+      shouldFail (decodeE $ DecodeCore.name (testGraph) $ wrap _Name $ int32 42)
 
     H.it "Try to decode a Literal from wrong union variant" $ do
-      shouldFail (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.literal testGraph $ inject untyped (Name "unknownVariant") $ string "bad")
+      shouldFail (decodeE $ DecodeCore.literal (testGraph) $ inject untyped (Name "unknownVariant") $ string "bad")
 
     H.it "Try to decode a record with missing field" $ do
-      shouldFail (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.field testGraph $
+      shouldFail (decodeE $ DecodeCore.field (testGraph) $
         record _Field [Field _Field_name $ wrap _Name $ string "onlyName"])
 
     H.it "Try to decode a Lambda with wrong body type" $ do
-      shouldFail (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.lambda testGraph $
+      shouldFail (decodeE $ DecodeCore.lambda (testGraph) $
         record _Lambda [
           Field _Lambda_parameter $ wrap _Name $ string "x",
           Field _Lambda_domain $ optional Nothing,
@@ -240,7 +239,7 @@
 
     H.it "Basic metadata" $ do
       shouldSucceedWith
-        (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph $ EncodeCore.type_ annotatedStringType)
+        (decodeE $ DecodeCore.type_ (testGraph) $ EncodeCore.type_ annotatedStringType)
         annotatedStringType
   where
     annotatedStringType :: Type
@@ -255,7 +254,7 @@
     H.it "Try random types" $
       QC.property $ \typ ->
         shouldSucceedWith
-          (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.type_ testGraph $ EncodeCore.type_ typ)
+          (decodeE $ DecodeCore.type_ (testGraph) $ EncodeCore.type_ typ)
           typ
 
 testRoundTripsFromLiteral :: H.SpecWith ()
@@ -265,7 +264,7 @@
     H.it "Try random literals" $
       QC.property $ \lit ->
         shouldSucceedWith
-          (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.literal testGraph $ EncodeCore.literal lit)
+          (decodeE $ DecodeCore.literal (testGraph) $ EncodeCore.literal lit)
           lit
 
 testRoundTripsFromLiteralType :: H.SpecWith ()
@@ -275,7 +274,7 @@
     H.it "Try random literal types" $
       QC.property $ \litType ->
         shouldSucceedWith
-          (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.literalType testGraph $ EncodeCore.literalType litType)
+          (decodeE $ DecodeCore.literalType (testGraph) $ EncodeCore.literalType litType)
           litType
 
 testRoundTripsFromName :: H.SpecWith ()
@@ -285,7 +284,7 @@
     H.it "Try random names" $
       QC.property $ \name ->
         shouldSucceedWith
-          (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.name testGraph $ EncodeCore.name name)
+          (decodeE $ DecodeCore.name (testGraph) $ EncodeCore.name name)
           name
 
 testRoundTripsFromIntegerType :: H.SpecWith ()
@@ -295,7 +294,7 @@
     H.it "Try random integer types" $
       QC.property $ \intType ->
         shouldSucceedWith
-          (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.integerType testGraph $ EncodeCore.integerType intType)
+          (decodeE $ DecodeCore.integerType (testGraph) $ EncodeCore.integerType intType)
           intType
 
 testRoundTripsFromFloatType :: H.SpecWith ()
@@ -305,7 +304,7 @@
     H.it "Try random float types" $
       QC.property $ \floatType ->
         shouldSucceedWith
-          (Monads.eitherToFlow Util.unDecodingError $ DecodeCore.floatType testGraph $ EncodeCore.floatType floatType)
+          (decodeE $ DecodeCore.floatType (testGraph) $ EncodeCore.floatType floatType)
           floatType
 
 spec :: H.Spec
diff --git a/src/test/haskell/Hydra/EvalPrimitives.hs b/src/test/haskell/Hydra/EvalPrimitives.hs
new file mode 100644
--- /dev/null
+++ b/src/test/haskell/Hydra/EvalPrimitives.hs
@@ -0,0 +1,339 @@
+-- | Eval-mode primitive adapters. Wraps the generated eval library functions
+--   (from Hydra.Eval.Lib.*) into Primitive values for the test infrastructure.
+--   The generated code is the source of truth; this module only adapts calling conventions.
+
+module Hydra.EvalPrimitives (
+  evalLibraries,
+) where
+
+import Hydra.Kernel
+import Hydra.Sources.Libraries
+import Hydra.Dsl.Prims as Prims
+
+import qualified Hydra.Eval.Lib.Eithers as EvalEithers
+import qualified Hydra.Eval.Lib.Equality as EvalEquality
+import qualified Hydra.Eval.Lib.Lists as EvalLists
+import qualified Hydra.Eval.Lib.Logic as EvalLogic
+import qualified Hydra.Eval.Lib.Maps as EvalMaps
+import qualified Hydra.Eval.Lib.Math as EvalMath
+import qualified Hydra.Eval.Lib.Maybes as EvalMaybes
+import qualified Hydra.Eval.Lib.Pairs as EvalPairs
+import qualified Hydra.Eval.Lib.Sets as EvalSets
+
+
+-- | All eval-mode libraries, to be used as replacements for standard libraries in test mode.
+evalLibraries :: [Library]
+evalLibraries = [
+  evalLibEithers,
+  evalLibEquality,
+  evalLibLists,
+  evalLibLogic,
+  evalLibMaps,
+  evalLibMath,
+  evalLibMaybes,
+  evalLibPairs,
+  evalLibSets]
+
+-- Helpers
+
+mkPrim :: Name -> Int -> (Context -> Graph -> [Term] -> Either (InContext Error) Term) -> Primitive
+mkPrim name arity impl = Primitive {
+  primitiveName = name,
+  primitiveType = dummyType arity,
+  primitiveImplementation = impl}
+
+dummyType :: Int -> TypeScheme
+dummyType 0 = TypeScheme [] (TypeVariable (Name "a")) Nothing
+dummyType n = TypeScheme [] (go n) Nothing
+  where
+    go 1 = funType (TypeVariable (Name "a")) (TypeVariable (Name "b"))
+    go k = funType (TypeVariable (Name "a")) (go (k - 1))
+
+funType :: Type -> Type -> Type
+funType a b = TypeFunction (FunctionType a b)
+
+-- | Coerce polymorphic error type to InContext Error for generated eval primitives
+--   whose type parameters are universally quantified (they always return Right).
+coerceError :: Either e Term -> Either (InContext Error) Term
+coerceError (Right t) = Right t
+coerceError (Left _) = error "coerceError: impossible Left from always-Right eval primitive"
+
+-- ---- Eithers ----
+
+evalLibEithers :: Library
+evalLibEithers = standardLibrary _hydra_lib_eithers [
+  mkPrim _eithers_bimap 3 $ \cx g args -> case args of
+    [lf, rf, t] -> EvalEithers.bimap cx g lf rf t
+    _ -> unexpected cx "eithers.bimap" 3,
+  mkPrim _eithers_bind 2 $ \cx g args -> case args of
+    [t, f] -> EvalEithers.bind cx g t f
+    _ -> unexpected cx "eithers.bind" 2,
+  mkPrim _eithers_either 3 $ \cx g args -> case args of
+    [lf, rf, t] -> EvalEithers.either cx g lf rf t
+    _ -> unexpected cx "eithers.either" 3,
+  mkPrim _eithers_foldl 3 $ \cx g args -> case args of
+    [f, init_, lt] -> EvalEithers.foldl cx g f init_ lt
+    _ -> unexpected cx "eithers.foldl" 3,
+  mkPrim _eithers_fromLeft 2 $ \cx g args -> case args of
+    [def, t] -> EvalEithers.fromLeft cx g def t
+    _ -> unexpected cx "eithers.fromLeft" 2,
+  mkPrim _eithers_fromRight 2 $ \cx g args -> case args of
+    [def, t] -> EvalEithers.fromRight cx g def t
+    _ -> unexpected cx "eithers.fromRight" 2,
+  mkPrim _eithers_isLeft 1 $ \cx g args -> case args of
+    [t] -> EvalEithers.isLeft cx g t
+    _ -> unexpected cx "eithers.isLeft" 1,
+  mkPrim _eithers_isRight 1 $ \cx g args -> case args of
+    [t] -> EvalEithers.isRight cx g t
+    _ -> unexpected cx "eithers.isRight" 1,
+  mkPrim _eithers_lefts 1 $ \cx g args -> case args of
+    [t] -> EvalEithers.lefts cx g t
+    _ -> unexpected cx "eithers.lefts" 1,
+  mkPrim _eithers_map 2 $ \cx g args -> case args of
+    [f, t] -> EvalEithers.map cx g f t
+    _ -> unexpected cx "eithers.map" 2,
+  mkPrim _eithers_mapList 2 $ \cx g args -> case args of
+    [f, lt] -> EvalEithers.mapList cx g f lt
+    _ -> unexpected cx "eithers.mapList" 2,
+  mkPrim _eithers_mapMaybe 2 $ \cx g args -> case args of
+    [f, mt] -> EvalEithers.mapMaybe cx g f mt
+    _ -> unexpected cx "eithers.mapMaybe" 2,
+  mkPrim _eithers_mapSet 2 $ \cx g args -> case args of
+    [f, st] -> EvalEithers.mapSet cx g f st
+    _ -> unexpected cx "eithers.mapSet" 2,
+  mkPrim _eithers_partitionEithers 1 $ \cx g args -> case args of
+    [t] -> fmap (\(ls, rs) -> TermPair (TermList ls, TermList rs)) (EvalEithers.partitionEithers cx g t)
+    _ -> unexpected cx "eithers.partitionEithers" 1,
+  mkPrim _eithers_rights 1 $ \cx g args -> case args of
+    [t] -> EvalEithers.rights cx g t
+    _ -> unexpected cx "eithers.rights" 1]
+
+-- ---- Equality ----
+
+evalLibEquality :: Library
+evalLibEquality = standardLibrary _hydra_lib_equality [
+  mkPrim _equality_identity 1 $ \cx g args -> case args of
+    [x] -> coerceError $ EvalEquality.identity cx g x
+    _ -> unexpected cx "equality.identity" 1,
+  mkPrim _equality_max 2 $ \cx g args -> case args of
+    [x, y] -> coerceError $ EvalEquality.max cx g x y
+    _ -> unexpected cx "equality.max" 2,
+  mkPrim _equality_min 2 $ \cx g args -> case args of
+    [x, y] -> coerceError $ EvalEquality.min cx g x y
+    _ -> unexpected cx "equality.min" 2]
+
+-- ---- Lists ----
+
+evalLibLists :: Library
+evalLibLists = standardLibrary _hydra_lib_lists [
+  mkPrim _lists_apply 2 $ \cx g args -> case args of
+    [ft, xt] -> EvalLists.apply cx g ft xt
+    _ -> unexpected cx "lists.apply" 2,
+  mkPrim _lists_bind 2 $ \cx g args -> case args of
+    [lt, f] -> EvalLists.bind cx g lt f
+    _ -> unexpected cx "lists.bind" 2,
+  mkPrim _lists_concat2 2 $ \cx g args -> case args of
+    [l1, l2] -> coerceError $ EvalLists.concat2 cx g l1 l2
+    _ -> unexpected cx "lists.concat2" 2,
+  mkPrim _lists_dropWhile 2 $ \cx g args -> case args of
+    [p, lt] -> coerceError $ EvalLists.dropWhile cx g p lt
+    _ -> unexpected cx "lists.dropWhile" 2,
+  mkPrim _lists_elem 2 $ \cx g args -> case args of
+    [x, lt] -> coerceError $ EvalLists.elem cx g x lt
+    _ -> unexpected cx "lists.elem" 2,
+  mkPrim _lists_filter 2 $ \cx g args -> case args of
+    [p, lt] -> EvalLists.filter cx g p lt
+    _ -> unexpected cx "lists.filter" 2,
+  mkPrim _lists_find 2 $ \cx g args -> case args of
+    [p, lt] -> coerceError $ EvalLists.find cx g p lt
+    _ -> unexpected cx "lists.find" 2,
+  mkPrim _lists_foldl 3 $ \cx g args -> case args of
+    [f, init_, lt] -> EvalLists.foldl cx g f init_ lt
+    _ -> unexpected cx "lists.foldl" 3,
+  mkPrim _lists_foldr 3 $ \cx g args -> case args of
+    [f, init_, lt] -> EvalLists.foldr cx g f init_ lt
+    _ -> unexpected cx "lists.foldr" 3,
+  mkPrim _lists_group 1 $ \cx g args -> case args of
+    [lt] -> EvalLists.group cx g lt
+    _ -> unexpected cx "lists.group" 1,
+  mkPrim _lists_intercalate 2 $ \cx g args -> case args of
+    [sep, xss] -> coerceError $ EvalLists.intercalate cx g sep xss
+    _ -> unexpected cx "lists.intercalate" 2,
+  mkPrim _lists_intersperse 2 $ \cx g args -> case args of
+    [sep, lt] -> EvalLists.intersperse cx g sep lt
+    _ -> unexpected cx "lists.intersperse" 2,
+  mkPrim _lists_map 2 $ \cx g args -> case args of
+    [f, lt] -> EvalLists.map cx g f lt
+    _ -> unexpected cx "lists.map" 2,
+  mkPrim _lists_nub 1 $ \cx g args -> case args of
+    [lt] -> EvalLists.nub cx g lt
+    _ -> unexpected cx "lists.nub" 1,
+  mkPrim _lists_partition 2 $ \cx g args -> case args of
+    [p, lt] -> EvalLists.partition cx g p lt
+    _ -> unexpected cx "lists.partition" 2,
+  mkPrim _lists_pure 1 $ \cx g args -> case args of
+    [x] -> coerceError $ EvalLists.pure cx g x
+    _ -> unexpected cx "lists.pure" 1,
+  mkPrim _lists_replicate 2 $ \cx g args -> case args of
+    [n, x] -> coerceError $ EvalLists.replicate cx g n x
+    _ -> unexpected cx "lists.replicate" 2,
+  mkPrim _lists_safeHead 1 $ \cx g args -> case args of
+    [lt] -> EvalLists.safeHead cx g lt
+    _ -> unexpected cx "lists.safeHead" 1,
+  mkPrim _lists_singleton 1 $ \cx g args -> case args of
+    [x] -> coerceError $ EvalLists.singleton cx g x
+    _ -> unexpected cx "lists.singleton" 1,
+  mkPrim _lists_sort 1 $ \cx g args -> case args of
+    [lt] -> coerceError $ EvalLists.sort cx g lt
+    _ -> unexpected cx "lists.sort" 1,
+  mkPrim _lists_sortOn 2 $ \cx g args -> case args of
+    [proj, lt] -> EvalLists.sortOn cx g proj lt
+    _ -> unexpected cx "lists.sortOn" 2,
+  mkPrim _lists_span 2 $ \cx g args -> case args of
+    [p, lt] -> EvalLists.span cx g p lt
+    _ -> unexpected cx "lists.span" 2,
+  mkPrim _lists_zipWith 3 $ \cx g args -> case args of
+    [f, lt1, lt2] -> EvalLists.zipWith cx g f lt1 lt2
+    _ -> unexpected cx "lists.zipWith" 3]
+
+-- ---- Logic ----
+
+evalLibLogic :: Library
+evalLibLogic = standardLibrary _hydra_lib_logic [
+  mkPrim _logic_and 2 $ \cx g args -> case args of
+    [a, b] -> coerceError $ EvalLogic.and cx g a b
+    _ -> unexpected cx "logic.and" 2,
+  mkPrim _logic_not 1 $ \cx g args -> case args of
+    [a] -> coerceError $ EvalLogic.not cx g a
+    _ -> unexpected cx "logic.not" 1,
+  mkPrim _logic_or 2 $ \cx g args -> case args of
+    [a, b] -> coerceError $ EvalLogic.or cx g a b
+    _ -> unexpected cx "logic.or" 2]
+
+-- ---- Maps ----
+
+evalLibMaps :: Library
+evalLibMaps = standardLibrary _hydra_lib_maps [
+  mkPrim _maps_alter 3 $ \cx g args -> case args of
+    [f, k, mt] -> EvalMaps.alter cx g f k mt
+    _ -> unexpected cx "maps.alter" 3,
+  mkPrim _maps_bimap 3 $ \cx g args -> case args of
+    [kf, vf, mt] -> EvalMaps.bimap cx g kf vf mt
+    _ -> unexpected cx "maps.bimap" 3,
+  mkPrim _maps_filter 2 $ \cx g args -> case args of
+    [p, mt] -> EvalMaps.filter cx g p mt
+    _ -> unexpected cx "maps.filter" 2,
+  mkPrim _maps_filterWithKey 2 $ \cx g args -> case args of
+    [p, mt] -> EvalMaps.filterWithKey cx g p mt
+    _ -> unexpected cx "maps.filterWithKey" 2,
+  mkPrim _maps_findWithDefault 3 $ \cx g args -> case args of
+    [def, k, mt] -> coerceError $ EvalMaps.findWithDefault cx g def k mt
+    _ -> unexpected cx "maps.findWithDefault" 3,
+  mkPrim _maps_map 2 $ \cx g args -> case args of
+    [vf, mt] -> EvalMaps.map cx g vf mt
+    _ -> unexpected cx "maps.map" 2,
+  mkPrim _maps_mapKeys 2 $ \cx g args -> case args of
+    [kf, mt] -> EvalMaps.mapKeys cx g kf mt
+    _ -> unexpected cx "maps.mapKeys" 2]
+
+-- ---- Math ----
+
+evalLibMath :: Library
+evalLibMath = standardLibrary _hydra_lib_math [
+  mkPrim _math_even 1 $ \cx g args -> case args of
+    [x] -> coerceError $ EvalMath.even cx g x
+    _ -> unexpected cx "math.even" 1,
+  mkPrim _math_odd 1 $ \cx g args -> case args of
+    [x] -> coerceError $ EvalMath.odd cx g x
+    _ -> unexpected cx "math.odd" 1,
+  mkPrim _math_pred 1 $ \cx g args -> case args of
+    [x] -> coerceError $ EvalMath.pred cx g x
+    _ -> unexpected cx "math.pred" 1,
+  mkPrim _math_succ 1 $ \cx g args -> case args of
+    [x] -> coerceError $ EvalMath.succ cx g x
+    _ -> unexpected cx "math.succ" 1]
+
+-- ---- Maybes ----
+
+evalLibMaybes :: Library
+evalLibMaybes = standardLibrary _hydra_lib_maybes [
+  mkPrim _maybes_apply 2 $ \cx g args -> case args of
+    [ft, xt] -> EvalMaybes.apply cx g ft xt
+    _ -> unexpected cx "maybes.apply" 2,
+  mkPrim _maybes_bind 2 $ \cx g args -> case args of
+    [t, f] -> EvalMaybes.bind cx g t f
+    _ -> unexpected cx "maybes.bind" 2,
+  mkPrim _maybes_cases 3 $ \cx g args -> case args of
+    [t, def, f] -> EvalMaybes.cases cx g t def f
+    _ -> unexpected cx "maybes.cases" 3,
+  mkPrim _maybes_cat 1 $ \cx g args -> case args of
+    [t] -> fmap TermList (EvalMaybes.cat cx g t)
+    _ -> unexpected cx "maybes.cat" 1,
+  mkPrim _maybes_compose 3 $ \cx g args -> case args of
+    [f, g_, x] -> coerceError $ EvalMaybes.compose cx g f g_ x
+    _ -> unexpected cx "maybes.compose" 3,
+  mkPrim _maybes_fromJust 1 $ \cx g args -> case args of
+    [t] -> EvalMaybes.fromJust cx g t
+    _ -> unexpected cx "maybes.fromJust" 1,
+  mkPrim _maybes_fromMaybe 2 $ \cx g args -> case args of
+    [def, t] -> EvalMaybes.fromMaybe cx g def t
+    _ -> unexpected cx "maybes.fromMaybe" 2,
+  mkPrim _maybes_isJust 1 $ \cx g args -> case args of
+    [t] -> EvalMaybes.isJust cx g t
+    _ -> unexpected cx "maybes.isJust" 1,
+  mkPrim _maybes_isNothing 1 $ \cx g args -> case args of
+    [t] -> EvalMaybes.isNothing cx g t
+    _ -> unexpected cx "maybes.isNothing" 1,
+  mkPrim _maybes_map 2 $ \cx g args -> case args of
+    [f, t] -> EvalMaybes.map cx g f t
+    _ -> unexpected cx "maybes.map" 2,
+  mkPrim _maybes_mapMaybe 2 $ \cx g args -> case args of
+    [f, t] -> EvalMaybes.mapMaybe cx g f t
+    _ -> unexpected cx "maybes.mapMaybe" 2,
+  mkPrim _maybes_maybe 3 $ \cx g args -> case args of
+    [def, f, t] -> EvalMaybes.maybe cx g def f t
+    _ -> unexpected cx "maybes.maybe" 3,
+  mkPrim _maybes_pure 1 $ \cx g args -> case args of
+    [x] -> coerceError $ EvalMaybes.pure cx g x
+    _ -> unexpected cx "maybes.pure" 1,
+  mkPrim _maybes_toList 1 $ \cx g args -> case args of
+    [t] -> EvalMaybes.toList cx g t
+    _ -> unexpected cx "maybes.toList" 1]
+
+-- ---- Pairs ----
+
+evalLibPairs :: Library
+evalLibPairs = standardLibrary _hydra_lib_pairs [
+  mkPrim _pairs_bimap 3 $ \cx g args -> case args of
+    [ff, sf, p] -> EvalPairs.bimap cx g ff sf p
+    _ -> unexpected cx "pairs.bimap" 3,
+  mkPrim _pairs_first 1 $ \cx g args -> case args of
+    [p] -> EvalPairs.first cx g p
+    _ -> unexpected cx "pairs.first" 1,
+  mkPrim _pairs_second 1 $ \cx g args -> case args of
+    [p] -> EvalPairs.second cx g p
+    _ -> unexpected cx "pairs.second" 1]
+
+-- ---- Sets ----
+
+evalLibSets :: Library
+evalLibSets = standardLibrary _hydra_lib_sets [
+  mkPrim _sets_difference 2 $ \cx g args -> case args of
+    [s1, s2] -> EvalSets.difference cx g s1 s2
+    _ -> unexpected cx "sets.difference" 2,
+  mkPrim _sets_intersection 2 $ \cx g args -> case args of
+    [s1, s2] -> EvalSets.intersection cx g s1 s2
+    _ -> unexpected cx "sets.intersection" 2,
+  mkPrim _sets_map 2 $ \cx g args -> case args of
+    [f, st] -> EvalSets.map cx g f st
+    _ -> unexpected cx "sets.map" 2,
+  mkPrim _sets_union 2 $ \cx g args -> case args of
+    [s1, s2] -> EvalSets.union cx g s1 s2
+    _ -> unexpected cx "sets.union" 2,
+  mkPrim _sets_unions 1 $ \cx g args -> case args of
+    [lt] -> EvalSets.unions cx g lt
+    _ -> unexpected cx "sets.unions" 1]
+
+-- | Error helper for wrong argument count
+unexpected :: Context -> String -> Int -> Either (InContext Error) Term
+unexpected cx name arity = Left $ InContext (ErrorOther (OtherError (name ++ ": expected " ++ show arity ++ " args"))) cx
diff --git a/src/test/haskell/Hydra/Json/AesonSpec.hs b/src/test/haskell/Hydra/Json/AesonSpec.hs
deleted file mode 100644
--- a/src/test/haskell/Hydra/Json/AesonSpec.hs
+++ /dev/null
@@ -1,80 +0,0 @@
--- | Cross-implementation round-trip tests for JSON serialization/parsing.
---   Tests that the new Hydra-native JSON implementation is compatible with
---   the existing Aeson-based implementation.
-
-{-
-stack ghci hydra:lib hydra:hydra-test
-
-Test.Hspec.hspec Hydra.Json.AesonSpec.spec
--}
-
-module Hydra.Json.AesonSpec where
-
-import Hydra.Json.Model (Value)
-import Hydra.Testing
-import Hydra.Parsing (ParseResult(..), ParseSuccess(..), ParseError(..))
-import qualified Hydra.Json.Writer as NewSerde
-import qualified Hydra.Json.Parser as NewParser
-import qualified Hydra.Staging.Json.Serde as AesonSerde
-import qualified Hydra.Test.Json.Writer as WriterTests
-import qualified Hydra.Test.Json.Parser as ParserTests
-
-import qualified Test.Hspec as H
-import qualified Data.List as L
-
-
--- | Extract all JSON values from writer test cases (inputs)
-extractWriterValues :: TestGroup -> [(String, Value)]
-extractWriterValues group = concatMap extractFromCase (testGroupCases group)
-    ++ concatMap extractWriterValues (testGroupSubgroups group)
-  where
-    extractFromCase tc = case testCaseWithMetadataCase tc of
-      TestCaseJsonWriter (WriterTestCase input _) ->
-        [(testCaseWithMetadataName tc, input)]
-      _ -> []
-
--- | Extract all JSON values from successful parser test cases (expected outputs)
-extractParserValues :: TestGroup -> [(String, Value)]
-extractParserValues group = concatMap extractFromCase (testGroupCases group)
-    ++ concatMap extractParserValues (testGroupSubgroups group)
-  where
-    extractFromCase tc = case testCaseWithMetadataCase tc of
-      TestCaseJsonParser (ParserTestCase _ (ParseResultSuccess success)) ->
-        [(testCaseWithMetadataName tc, parseSuccessValue success)]
-      _ -> []
-
--- | All JSON values from both writer and parser test suites
-allJsonValues :: [(String, Value)]
-allJsonValues = L.nubBy (\(n1, _) (n2, _) -> n1 == n2) $
-    extractWriterValues WriterTests.allTests
-    ++ extractParserValues ParserTests.allTests
-
--- | Test: Aeson writer -> New parser -> Compare
-aesonWriterNewParserRoundTrip :: H.SpecWith ()
-aesonWriterNewParserRoundTrip = H.describe "Aeson writer -> New parser round trip" $ do
-  mapM_ makeTest allJsonValues
-  where
-    makeTest (name, value) = H.it name $ do
-      let serialized = AesonSerde.jsonValueToString value
-      case NewParser.parseJson serialized of
-        ParseResultSuccess success ->
-          parseSuccessValue success `H.shouldBe` value
-        ParseResultFailure err ->
-          H.expectationFailure $ "Parse failed: " ++ parseErrorMessage err
-            ++ " at: " ++ take 50 (parseErrorRemainder err)
-
--- | Test: New writer -> Aeson parser -> Compare
-newWriterAesonParserRoundTrip :: H.SpecWith ()
-newWriterAesonParserRoundTrip = H.describe "New writer -> Aeson parser round trip" $ do
-  mapM_ makeTest allJsonValues
-  where
-    makeTest (name, value) = H.it name $ do
-      let serialized = NewSerde.printJson value
-      case AesonSerde.stringToJsonValue serialized of
-        Right parsed -> parsed `H.shouldBe` value
-        Left err -> H.expectationFailure $ "Parse failed: " ++ err
-
-spec :: H.Spec
-spec = do
-  aesonWriterNewParserRoundTrip
-  newWriterAesonParserRoundTrip
diff --git a/src/test/haskell/Hydra/MonadsSpec.hs b/src/test/haskell/Hydra/MonadsSpec.hs
deleted file mode 100644
--- a/src/test/haskell/Hydra/MonadsSpec.hs
+++ /dev/null
@@ -1,52 +0,0 @@
-{-
-stack ghci hydra:lib hydra:hydra-test
-
-Test.Hspec.hspec Hydra.MonadsSpec.spec
--}
-
-module Hydra.MonadsSpec where
-
-import Hydra.Kernel
-import qualified Hydra.Dsl.Terms as Terms
-import Hydra.TestUtils
-
-import qualified Test.Hspec as H
-import qualified Test.QuickCheck as QC
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Test.Hspec as H
-
-
--- This test cannot be included in the kernel because it requires
--- building terms with 4000+ nested withTrace calls, which exceeds the trace depth limit
--- during kernel generation. These tests remain as hand-written HSpec tests only.
-checkMaxTraceDepth :: H.SpecWith ()
-checkMaxTraceDepth = do
-  H.describe "Check breaking out of flows with an infinite loop" $ do
-
-    H.it "Flows with no trace are OK" $
-      H.shouldBe
-        (unFlow (testFlow 42 0) () emptyTrace)
-        (FlowState (Just 42) () emptyTrace)
-
-    H.it "Flows with a trace just below the maximum depth are OK" $
-      H.shouldBe
-        (unFlow (testFlow 42 maxTraceDepth) () emptyTrace)
-        (FlowState (Just 42) () emptyTrace)
-
-    H.it "Flows fail when their trace reaches the maximum depth" $ do
-      H.shouldBe (flowStateValue overflow) Nothing
-      H.shouldBe (L.length $ traceMessages $ flowStateTrace overflow) 1
-  where
-    overflow = unFlow (testFlow 42 (maxTraceDepth+1)) () emptyTrace
-
-testFlow :: x -> Int -> Flow () x
-testFlow seed depth = helper depth
-  where
-    helper d = if d == 0
-      then pure seed
-      else withTrace ("level " ++ show (depth-d)) $ helper (d-1)
-
-spec :: H.Spec
-spec = do
-  checkMaxTraceDepth
diff --git a/src/test/haskell/Hydra/Reference/AlgorithmWSpec.hs b/src/test/haskell/Hydra/Reference/AlgorithmWSpec.hs
--- a/src/test/haskell/Hydra/Reference/AlgorithmWSpec.hs
+++ b/src/test/haskell/Hydra/Reference/AlgorithmWSpec.hs
@@ -27,21 +27,36 @@
 import qualified Data.List as L
 import qualified Data.Map as M
 import qualified Data.Set as S
+import qualified Control.Exception as Exception
 import Control.Monad
 
 
 testHydraContext = W.HydraContext $ graphPrimitives testGraph
 
-inferType :: Term -> IO (Term, TypeScheme)
-inferType = W.termToInferredTerm testHydraContext
+inferType :: Term -> IO (Either String (Term, TypeScheme))
+inferType term = do
+  result <- Exception.try (W.termToInferredTerm testHydraContext term)
+    :: IO (Either Exception.SomeException (Term, TypeScheme))
+  return $ case result of
+    Left e -> Left (show e)
+    Right r -> Right r
 
+-- | Strip class constraints from a TypeScheme, since the reference Algorithm W
+--   implementation does not track type class constraints.
+stripConstraints :: TypeScheme -> TypeScheme
+stripConstraints ts = ts { typeSchemeConstraints = Nothing }
+
 expectType :: Term -> TypeScheme -> H.SpecWith ()
 expectType term ts = do
   result <- H.runIO $ inferType term
-  H.it "inferred type" $
-    H.shouldBe (ShowCore.typeScheme $ snd result) (ShowCore.typeScheme ts)
-  H.it "inferred term" $
-    H.shouldBe (ShowCore.term $ removeTypesFromTerm $ fst result) (ShowCore.term $ removeTypesFromTerm term)
+  case result of
+    Left err -> H.it "inferred type (skipped: unsupported by reference implementation)" $
+      H.pendingWith err
+    Right (iterm, its) -> do
+      H.it "inferred type" $
+        H.shouldBe (ShowCore.typeScheme $ stripConstraints its) (ShowCore.typeScheme $ stripConstraints ts)
+      H.it "inferred term" $
+        H.shouldBe (ShowCore.term $ removeTypesFromTerm iterm) (ShowCore.term $ removeTypesFromTerm term)
 
 algorithmWRunner :: TestRunner
 algorithmWRunner desc tcase = if Testing.isDisabled tcase || Testing.isDisabledForMinimalInference tcase
diff --git a/src/test/haskell/Hydra/Staging/Json/Serde.hs b/src/test/haskell/Hydra/Staging/Json/Serde.hs
deleted file mode 100644
--- a/src/test/haskell/Hydra/Staging/Json/Serde.hs
+++ /dev/null
@@ -1,86 +0,0 @@
--- Legacy JSON serializer/deserializer in Haskell which is used as a sanity check for Hydra's native JSON support
-
-module Hydra.Staging.Json.Serde where
-
-import Hydra.Tools.Monads
-import qualified Hydra.Compute as Compute
-import qualified Hydra.Core as Core
-import qualified Hydra.Graph as Graph
-import qualified Hydra.Monads as Monads
-import qualified Hydra.Ext.Org.Json.Coder as JsonCoder
-import qualified Hydra.Tools.Bytestrings as Bytestrings
-import qualified Hydra.Json.Model as Json
-
-import qualified Data.ByteString.Lazy as BS
-import qualified Control.Monad as CM
-import qualified Data.Aeson as A
-import qualified Data.Aeson.KeyMap as AKM
-import qualified Data.Aeson.Key as AK
-import qualified Data.List as L
-import qualified Data.Map as M
-import qualified Data.Text as T
-import qualified Data.Vector as V
-import qualified Data.Scientific as SC
-import qualified Data.Char as C
-import qualified Data.String as String
-
-
-aesonValueToBytes :: A.Value -> BS.ByteString
-aesonValueToBytes = A.encode
-
-aesonValueToJsonValue :: A.Value -> Json.Value
-aesonValueToJsonValue v = case v of
-  A.Object km -> Json.ValueObject $ M.fromList (mapPair <$> AKM.toList km)
-    where
-      mapPair (k, v) = (AK.toString k, aesonValueToJsonValue v)
-  A.Array a -> Json.ValueArray (aesonValueToJsonValue <$> V.toList a)
-  A.String t -> Json.ValueString $ T.unpack t
-  A.Number s -> Json.ValueNumber $ SC.toRealFloat s
-  A.Bool b -> Json.ValueBoolean b
-  A.Null -> Json.ValueNull
-
-bytesToAesonValue :: BS.ByteString -> Either String A.Value
-bytesToAesonValue = A.eitherDecode
-
-bytesToJsonValue :: BS.ByteString -> Either String Json.Value
-bytesToJsonValue bs = aesonValueToJsonValue <$> bytesToAesonValue bs
-
-jsonByteStringCoder :: Core.Type -> Compute.Flow Graph.Graph (Compute.Coder Graph.Graph Graph.Graph Core.Term BS.ByteString)
-jsonByteStringCoder typ = do
-  coder <- JsonCoder.jsonCoder typ
-  return Compute.Coder {
-    Compute.coderEncode = fmap jsonValueToBytes . Compute.coderEncode coder,
-    Compute.coderDecode = \bs -> case bytesToJsonValue bs of
-        Left msg -> Monads.fail $ "JSON parsing failed: " ++ msg
-        Right v -> Compute.coderDecode coder v}
-
--- | A convenience which maps typed terms to and from pretty-printed JSON strings, as opposed to JSON objects
-jsonStringCoder :: Core.Type -> Compute.Flow Graph.Graph (Compute.Coder Graph.Graph Graph.Graph Core.Term String)
-jsonStringCoder typ = do
-  serde <- jsonByteStringCoder typ
-  return Compute.Coder {
-    Compute.coderEncode = fmap Bytestrings.bytesToString . Compute.coderEncode serde,
-    Compute.coderDecode = Compute.coderDecode serde . Bytestrings.stringToBytes}
-
-jsonValueToAesonValue :: Json.Value -> A.Value
-jsonValueToAesonValue v = case v of
-    Json.ValueArray l -> A.Array $ V.fromList (jsonValueToAesonValue <$> l)
-    Json.ValueBoolean b -> A.Bool b
-    Json.ValueNull -> A.Null
-    Json.ValueNumber d -> A.Number $ SC.fromFloatDigits d
-    Json.ValueObject m -> A.Object $ AKM.fromList (mapPair <$> M.toList m)
-      where
-        mapPair (k, v) = (AK.fromString k, jsonValueToAesonValue v)
-    Json.ValueString s -> A.String $ T.pack s
-
-jsonValueToBytes :: Json.Value -> BS.ByteString
-jsonValueToBytes = aesonValueToBytes . jsonValueToAesonValue
-
-jsonValueToString :: Json.Value -> String
-jsonValueToString = Bytestrings.bytesToString . jsonValueToBytes
-
-jsonValuesToString :: [Json.Value] -> String
-jsonValuesToString = L.intercalate "\n" . fmap jsonValueToString
-
-stringToJsonValue :: String -> Either String Json.Value
-stringToJsonValue = bytesToJsonValue . Bytestrings.stringToBytes
diff --git a/src/test/haskell/Hydra/Staging/Yaml/CoderSpec.hs b/src/test/haskell/Hydra/Staging/Yaml/CoderSpec.hs
deleted file mode 100644
--- a/src/test/haskell/Hydra/Staging/Yaml/CoderSpec.hs
+++ /dev/null
@@ -1,124 +0,0 @@
-{-
-stack ghci hydra:lib hydra:hydra-test
-
-Test.Hspec.hspec Hydra.Staging.Yaml.CoderSpec.spec
--}
-module Hydra.Staging.Yaml.CoderSpec where
-
-import Hydra.Kernel
-import Hydra.Dsl.Terms
-import Hydra.Staging.Yaml.Coder
-import qualified Hydra.Ext.Org.Yaml.Model as YM
-import qualified Hydra.Dsl.Types as Types
-import Hydra.Dsl.Tests
-
-import Hydra.TestUtils
-
-import qualified Data.Bifunctor as BF
-import qualified Test.Hspec as H
-import qualified Test.HUnit.Lang as HL
-import qualified Data.Map as M
-import qualified Data.Set as S
-import qualified Data.Maybe as Y
-import qualified Test.QuickCheck as QC
-
-
-literalTypeConstraintsAreRespected :: H.SpecWith ()
-literalTypeConstraintsAreRespected = H.describe "Verify that YAML's literal type constraints are respected" $ do
-
-  -- TODO: binary data
-
-  H.it "Check booleans" $
-    QC.property $ \b -> checkYamlCoder Types.boolean (boolean b) (yamlBool b)
-
-  H.it "Check 32-bit floats" $
-    QC.property $ \f -> checkYamlCoder Types.float32 (float32 f) (yamlFloat $ realToFrac f)
-
-  H.it "Check 64-bit floats (doubles)" $
-    QC.property $ \d -> checkYamlCoder Types.float64 (float64 d) (yamlFloat $ realToFrac d)
-
-  -- TODO: bigfloat
-
-  H.it "Check 32-bit integers" $
-    QC.property $ \i -> checkYamlCoder Types.int32 (int32 i) (yamlInt i)
-
-  H.it "Check 16-bit unsigned integers" $
-    QC.property $ \i -> checkYamlCoder Types.uint16 (uint16 i) (yamlInt i)
-
-  H.it "Check arbitrary-precision integers" $
-    QC.property $ \i -> checkYamlCoder Types.bigint (bigint i) (yamlInt i)
-
-  H.it "Check strings" $
-    QC.property $ \s -> checkYamlCoder Types.string (string s) (yamlStr s)
-
-supportedTypesPassThrough :: H.SpecWith ()
-supportedTypesPassThrough = H.describe "Verify that supported types are mapped directly" $ do
-
-  H.it "Lists become YAML sequences" $
-    QC.property $ \strings -> checkYamlCoder listOfStringsType
-      (list $ string <$> strings) (YM.NodeSequence $ yamlStr <$> strings)
-
-  H.it "Maps become YAML mappings" $
-    QC.property $ \keyvals -> checkYamlCoder mapOfStringsToIntsType
-      (makeMap keyvals) (yamlMap $ BF.bimap yamlStr yamlInt <$> keyvals)
-
-  H.it "Optionals become YAML null or type-specific nodes" $
-    QC.property $ \ms -> checkYamlCoder optionalStringType
-      (optional $ string <$> ms) (YM.NodeScalar $ Y.maybe YM.ScalarNull YM.ScalarStr ms)
-
-  H.it "Records become YAML mappings" $
-    QC.property $ \lat lon -> checkYamlCoder testTypeLatLon
-      (latlonRecord lat lon) (yamlMap [
-        (yamlStr "lat", yamlFloat $ realToFrac lat),
-        (yamlStr "lon", yamlFloat $ realToFrac lon)])
-
-unsupportedTypesAreTransformed :: H.SpecWith ()
-unsupportedTypesAreTransformed = H.describe "Verify that unsupported types are transformed appropriately" $ do
-
-  -- TODO: functions
-
-  H.it "Sets become sequences" $
-    QC.property $ \strings -> checkYamlCoder setOfStringsType
-      (stringSet strings) (YM.NodeSequence $ yamlStr <$> S.toList strings)
-
-  H.it "Nominal types are dereferenced" $
-    QC.property $ \s -> checkYamlCoder testTypeStringAlias
-      (wrap testTypeStringAliasName $ string s) (yamlStr s)
-
-  H.it "Unions become YAML mappings (as records)" $
-    QC.property $ \int -> checkYamlCoder stringOrIntType
-      (inject stringOrIntName (Name "right") $ int32 int)
-      (yamlMap [(yamlStr "right", yamlInt int)])
-
-spec :: H.Spec
-spec = do
-  literalTypeConstraintsAreRespected
-  supportedTypesPassThrough
-  unsupportedTypesAreTransformed
-
-checkYamlCoder :: Type -> Term -> YM.Node -> H.Expectation
-checkYamlCoder typ term node = case mstep of
-    Nothing -> HL.assertFailure (traceSummary trace)
-    Just step -> do
-      shouldSucceedWith (coderEncode step term) node
-      shouldSucceedWith (coderEncode step term >>= coderDecode step) term
-  where
-    FlowState mstep _ trace = unFlow (yamlCoder typ) testGraph emptyTrace
-
-yamlBool :: Bool -> YM.Node
-yamlBool = YM.NodeScalar . YM.ScalarBool
-
-yamlFloat :: Double -> YM.Node
-yamlFloat = YM.NodeScalar . YM.ScalarFloat
-
-yamlInt :: Integral i => i -> YM.Node
-yamlInt = YM.NodeScalar . YM.ScalarInt . fromIntegral
-
-yamlMap :: [(YM.Node, YM.Node)] -> YM.Node
-yamlMap = YM.NodeMapping . M.fromList
-
-yamlNull :: YM.Node
-yamlNull = YM.NodeScalar YM.ScalarNull
-
-yamlStr :: String -> YM.Node
-yamlStr = YM.NodeScalar . YM.ScalarStr
diff --git a/src/test/haskell/Hydra/Staging/Yaml/SerdeSpec.hs b/src/test/haskell/Hydra/Staging/Yaml/SerdeSpec.hs
deleted file mode 100644
--- a/src/test/haskell/Hydra/Staging/Yaml/SerdeSpec.hs
+++ /dev/null
@@ -1,116 +0,0 @@
--- Note: these tests are dependent on HsYaml, both because the Serde depends on HsYaml
---       and because of the particular serialization style.
-
-{-
-stack ghci hydra:lib hydra:hydra-test
-
-Test.Hspec.hspec Hydra.Staging.Yaml.SerdeSpec.spec
--}
-
-module Hydra.Staging.Yaml.SerdeSpec where
-
-import Hydra.Kernel
-import Hydra.Dsl.Terms
-import Hydra.Staging.Yaml.Serde
-import qualified Hydra.Dsl.Types as Types
-
-import Hydra.TestData
-import Hydra.TestUtils
-
-import qualified Test.Hspec as H
-import qualified Test.HUnit.Lang as HL
-import qualified Data.List as L
-import qualified Test.QuickCheck as QC
-import qualified Data.Maybe as Y
-
-
-checkLiterals :: H.SpecWith ()
-checkLiterals = H.describe "Test literal values" $ do
-
-  H.it "Booleans become 'true' and 'false' (not 'y' and 'n')" $ do
-    QC.property $ \b -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm (boolean b) Types.boolean)
-      (if b then "true" else "false")
-
-  H.it "int32's become ints, and are serialized in the obvious way" $ do
-    QC.property $ \i -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm (int32 i) Types.int32)
-      (show i)
-
-  H.it "uint8's and other finite integer types become ints, and are serialized in the obvious way" $ do
-    QC.property $ \i -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm (uint8 i) Types.uint8)
-      (show i)
-
-  H.it "bigints become ints" $ do
-    QC.property $ \i -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm (bigint i) Types.bigint)
-      (show i)
-
-  -- TODO: examine quirks around floating-point serialization more closely. These could affect portability of the serialized YAML.
-
-  -- TODO: binary string and character string serialization
-
-checkOptionals :: H.SpecWith ()
-checkOptionals = H.describe "Test and document serialization of optionals" $ do
-
-  H.it "A 'nothing' becomes 'null' (except when it appears as a field)" $
-    QC.property $ \mi -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm
-        (optional $ (Just . int32) =<< mi)
-        (Types.maybe Types.int32))
-      (Y.maybe "null" show mi)
-
-  H.it "Nested optionals case #1: just x? :: optional<optional<int32>>" $
-    QC.property $ \mi -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm
-        (optional $ Just $ optional $ (Just . int32) =<< mi)
-        (Types.maybe $ Types.maybe Types.int32))
-      ("- " ++ Y.maybe "null" show mi)
-
-  H.it "Nested optionals case #2: nothing :: optional<optional<int32>>" $
-    QC.property $ \() -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm
-        (optional Nothing)
-        (Types.maybe $ Types.maybe Types.int32))
-      "[]"
-
-checkRecordsAndUnions :: H.SpecWith ()
-checkRecordsAndUnions = H.describe "Test and document handling of optionals vs. nulls for record and union types" $ do
-
-  H.it "Empty records become empty objects" $
-    QC.property $ \() -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm unit Types.unit)
-      "null"
-
-  H.it "Simple records become simple objects" $
-    QC.property $ \() -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm (latlonRecord 37.0 (negate 122.0)) testTypeLatLon)
-      "lat: 37.0\nlon: -122.0"
-
-  H.it "Optionals are omitted from record objects if 'nothing'" $
-    QC.property $ \() -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm
-        (record testTypeName [Field (Name "one") $ optional $ Just $ string "test", Field (Name "two") $ optional Nothing])
-        (TypeRecord $ RowType testTypeName [Types.field "one" $ Types.maybe Types.string, Types.field "two" $ Types.maybe Types.int32]))
-      "one: test"
-
-  H.it "Simple unions become simple objects, via records" $
-    QC.property $ \() -> checkSerialization yamlStringCoder
-      (TypeApplicationTerm
-        (inject testTypeName (Name "left") (string "test"))
-        (TypeUnion $ RowType testTypeName [Types.field "left" Types.string, Types.field "right" Types.int32]))
-      "left: test\n"
-
-yamlByteStringCoderIsInformationPreserving :: H.SpecWith ()
-yamlByteStringCoderIsInformationPreserving = H.describe "Verify that a round trip from a type+term, to serialized YAML, and back again is a no-op" $ do
-
-  H.it "Generate arbitrary type/term pairs, serialize the terms to YAML, deserialize them, and compare" $
-    QC.property (checkSerdeRoundTrip yamlByteStringCoder)
-
-spec :: H.Spec
-spec = do
-  checkLiterals
-  checkOptionals
-  checkRecordsAndUnions
---  yamlByteStringCoderIsInformationPreserving -- TODO: restore me
diff --git a/src/test/haskell/Hydra/TestSuiteSpec.hs b/src/test/haskell/Hydra/TestSuiteSpec.hs
--- a/src/test/haskell/Hydra/TestSuiteSpec.hs
+++ b/src/test/haskell/Hydra/TestSuiteSpec.hs
@@ -7,6 +7,7 @@
 module Hydra.TestSuiteSpec where
 
 import Hydra.Kernel
+import Hydra.Generation (showError)
 import Hydra.TestUtils
 import Hydra.Testing
 import Hydra.Inference
@@ -16,7 +17,8 @@
 import qualified Hydra.Dsl.Meta.Testing as Testing
 import qualified Hydra.Json.Writer as JsonWriter
 import qualified Hydra.Json.Parser as JsonParser
-import qualified Hydra.Ext.Org.Json.Coder as JsonCoder
+import qualified Hydra.Json.Decode as JsonDecode
+import qualified Hydra.Json.Encode as JsonEncode
 import qualified Hydra.Json.Model as Json
 import qualified Hydra.Sorting as Sorting
 import qualified Hydra.Serialization as Serialization
@@ -25,6 +27,7 @@
 import qualified Hydra.Hoisting as Hoisting
 import qualified Hydra.Coders as Coders
 import qualified Hydra.Unification as Unification
+import qualified Hydra.Validate.Core as ValidateCore
 
 import qualified Control.Exception
 import qualified Control.Monad as CM
@@ -47,7 +50,7 @@
 type TestRunner = String -> TestCaseWithMetadata -> Y.Maybe (H.SpecWith ())
 
 defaultTestRunner :: TestRunner
-defaultTestRunner desc tcase = if Testing.isDisabled tcase || Testing.isRequiresFlowDecoding tcase
+defaultTestRunner desc tcase = if Testing.isDisabled tcase
   then Nothing
   else Just $ case testCaseWithMetadataCase tcase of
     TestCaseAlphaConversion (AlphaConversionTestCase term oldVar newVar result) ->
@@ -68,8 +71,6 @@
     TestCaseInference (InferenceTestCase input output) -> expectInferenceResult desc input output
     TestCaseInferenceFailure (InferenceFailureTestCase input) ->
       H.it "inference failure" $ expectInferenceFailure desc input
-    TestCaseJsonCoder (JsonCoderTestCase typ term expectedJson) ->
-      H.it "JSON coder" $ checkJsonCoder typ term expectedJson
     TestCaseJsonParser (ParserTestCase input expectedResult) ->
       H.it "JSON parser" $ H.shouldBe
         (JsonParser.parseJson input)
@@ -90,7 +91,7 @@
       H.it "type checking failure" $ H.shouldBe True False  -- TODO: implement
     TestCaseTypeReduction (TypeReductionTestCase input output) ->
       H.it "type reduction" $ H.shouldBe
-        (fromFlow input (schemaContext testGraph) (betaReduceType input))
+        (either (const input) id $ betaReduceType (Context [] [] M.empty) testGraph input)
         output
     TestCaseTopologicalSort (TopologicalSortTestCase adjList expected) ->
       H.it "topological sort" $ H.shouldBe
@@ -154,7 +155,7 @@
         output
     TestCaseHoistCaseStatements (HoistCaseStatementsTestCase input output) ->
       H.it "hoist case statements" $ H.shouldBe
-        (Hoisting.hoistCaseStatements emptyTypeContext input)
+        (Hoisting.hoistCaseStatements emptyGraph input)
         output
     TestCaseHoistPolymorphicLetBindings (HoistPolymorphicLetBindingsTestCase input output) ->
       H.it "hoist polymorphic let bindings" $ H.shouldBe
@@ -180,8 +181,10 @@
       H.it "unshadow variables" $ H.shouldBe
         (ShowCore.term $ Rewriting.unshadowVariables input)
         (ShowCore.term output)
-  where
-    cx = fromFlow emptyInferenceContext () $ graphToInferenceContext testGraph
+    TestCaseValidateCoreTerm (ValidateCoreTermTestCase typed input output) ->
+      H.it "validate core term" $ H.shouldBe
+        (ValidateCore.term typed emptyGraph input)
+        output
 
 runTestCase :: String -> TestRunner -> TestCaseWithMetadata -> H.SpecWith ()
 runTestCase pdesc runner tcase@(TestCaseWithMetadata name _ mdesc _) =
@@ -232,11 +235,32 @@
       let elapsedMs = (realToFrac now - startTime) * 1000.0
       IORef.modifyIORef' timingsRef (M.insert hydraPath elapsedMs)
 
+-- | Test runner that uses eval-mode primitives.
+-- Only runs evaluation test cases; skips all other test types.
+evalTestRunner :: TestRunner
+evalTestRunner desc tcase = if Testing.isDisabled tcase
+  then Nothing
+  else case testCaseWithMetadataCase tcase of
+    TestCaseEvaluation (EvaluationTestCase _ input output) ->
+      Just $ H.it "eval-mode evaluation" $ shouldSucceedWith
+        (ShowCore.term <$> evalEval input)
+        (ShowCore.term output)
+    _ -> Nothing  -- Only test evaluation cases in eval mode
+
+-- | Filter a test group to only include lib primitive tests (hydra.lib.*)
+filterLibTests :: TestGroup -> TestGroup
+filterLibTests tg = tg {
+  testGroupSubgroups = filterLibTests <$> testGroupSubgroups tg,
+  testGroupCases = testGroupCases tg}
+
 spec :: H.Spec
 spec = do
   benchmarkOutput <- H.runIO $ Env.lookupEnv "HYDRA_BENCHMARK_OUTPUT"
   case benchmarkOutput of
-    Nothing -> runTestGroup "" defaultTestRunner allTests
+    Nothing -> do
+      runTestGroup "" defaultTestRunner allTests
+      H.describe "eval-mode primitives" $
+        runTestGroup "" evalTestRunner allTests
     Just outputPath -> do
       timingsRef <- H.runIO $ IORef.newIORef M.empty
       let rootPath = testGroupName allTests
@@ -245,61 +269,37 @@
         -- A dummy test to ensure afterAll_ fires
         H.it "benchmark finalize" $ True `H.shouldBe` True
 
--- | Check that the JSON coder correctly encodes a term to the expected JSON value
--- and that decoding and re-encoding produces the same term (round-trip)
-checkJsonCoder :: Type -> Term -> Json.Value -> H.Expectation
-checkJsonCoder typ term expectedJson = case mstep of
-    Nothing -> HL.assertFailure (traceSummary trace)
-    Just step -> do
-      shouldSucceedWith (coderEncode step term) expectedJson
-      shouldSucceedWith (coderEncode step term >>= coderDecode step) term
-  where
-    FlowState mstep _ trace = unFlow (JsonCoder.jsonCoder typ) testGraph emptyTrace
-
 -- | Check that JSON decoding produces the expected result (Either String Term)
 checkJsonDecode :: Type -> Json.Value -> Either String Term -> H.Expectation
-checkJsonDecode typ json expected = case mstep of
-    Nothing -> HL.assertFailure (traceSummary trace)
-    Just step -> case expected of
-      Left errMsg -> case runFlow (coderDecode step json) of
-        Nothing -> return ()  -- Expected failure, got failure
-        Just result -> HL.assertFailure $
-          "Expected decode failure with message containing '" ++ errMsg ++
-          "' but got success: " ++ show result
-      Right expectedTerm -> shouldSucceedWith (coderDecode step json) expectedTerm
-  where
-    FlowState mstep _ trace = unFlow (JsonCoder.jsonCoder typ) testGraph emptyTrace
-    runFlow flow = case unFlow flow testGraph emptyTrace of
-      FlowState result _ _ -> result
+checkJsonDecode typ json expected = case JsonDecode.fromJson M.empty (Name "test") typ json of
+    Left errMsg -> case expected of
+      Left _ -> return ()  -- Expected failure, got failure
+      Right _ -> HL.assertFailure ("JSON decode failed: " ++ errMsg)
+    Right result -> case expected of
+      Left errMsg -> HL.assertFailure $
+        "Expected decode failure with message containing '" ++ errMsg ++
+        "' but got success: " ++ show result
+      Right expectedTerm -> H.shouldBe result expectedTerm
 
 -- | Check that JSON encoding produces the expected result (Either String Value)
 checkJsonEncode :: Term -> Either String Json.Value -> H.Expectation
-checkJsonEncode term expected = case expected of
-    Left _ ->
-      -- For encode failures, we'd need a type to create a coder
-      -- Since the test case doesn't include a type, skip encoding-only failure tests for now
-      H.pendingWith "Encode failure tests require type information"
-    Right expectedJson ->
-      -- Without a type, we can't create a coder. This test case design may need revision.
-      H.pendingWith "Encode tests require type information to create coder"
+checkJsonEncode term expected = case JsonEncode.toJson term of
+    Left errMsg -> case expected of
+      Left _ -> return ()  -- Expected failure, got failure
+      Right _ -> HL.assertFailure ("JSON encode failed: " ++ errMsg)
+    Right result -> case expected of
+      Left errMsg -> HL.assertFailure $
+        "Expected encode failure with message containing '" ++ errMsg ++
+        "' but got success: " ++ show result
+      Right expectedJson -> H.shouldBe result expectedJson
 
 -- | Check that a term can be encoded to JSON and decoded back to the same term
 checkJsonRoundtrip :: Type -> Term -> H.Expectation
-checkJsonRoundtrip typ term = case mstep of
-    Nothing -> HL.assertFailure (traceSummary trace)
-    Just step -> do
-      -- Encode the term
-      case runFlow (coderEncode step term) of
-        Nothing -> HL.assertFailure "Failed to encode term to JSON"
-        Just json -> do
-          -- Decode it back
-          case runFlow (coderDecode step json) of
-            Nothing -> HL.assertFailure "Failed to decode JSON back to term"
-            Just decoded -> H.shouldBe decoded term
-  where
-    FlowState mstep _ trace = unFlow (JsonCoder.jsonCoder typ) testGraph emptyTrace
-    runFlow flow = case unFlow flow testGraph emptyTrace of
-      FlowState result _ _ -> result
+checkJsonRoundtrip typ term = case JsonEncode.toJson term of
+    Left errMsg -> HL.assertFailure ("Failed to encode term to JSON: " ++ errMsg)
+    Right json -> case JsonDecode.fromJson M.empty (Name "test") typ json of
+      Left errMsg -> HL.assertFailure ("Failed to decode JSON back to term: " ++ errMsg)
+      Right decoded -> H.shouldBe decoded term
 
 -- | Run a fold operation over a term
 runFoldOperation :: Coders.TraversalOrder -> FoldOperation -> Term -> Term
@@ -344,13 +344,13 @@
       _ -> recurse typ
 
 -- | Run hoistSubterms with the given predicate
--- The predicate receives (path, term) where path is the list of TermAccessors from root
+-- The predicate receives (path, term) where path is the list of SubtermSteps from root
 runHoistSubterms :: HoistPredicate -> Term -> Term
-runHoistSubterms pred term = Hoisting.hoistSubterms (predicateFn pred) emptyTypeContext term
+runHoistSubterms pred term = Hoisting.hoistSubterms (predicateFn pred) emptyGraph term
   where
     -- A predicate returns True if the term should be hoisted.
     -- The predicate receives (path, term) for path-aware hoisting decisions.
-    predicateFn :: HoistPredicate -> ([TermAccessor], Term) -> Bool
+    predicateFn :: HoistPredicate -> ([SubtermStep], Term) -> Bool
     predicateFn HoistPredicateNothing _ = False
     predicateFn HoistPredicateLists (_, t) = case t of
       TermList _ -> True
@@ -362,46 +362,39 @@
       TermFunction (FunctionElimination _) -> True  -- Case statements are eliminations
       _ -> False
 
-emptyTypeContext :: TypeContext
-emptyTypeContext = TypeContext M.empty M.empty S.empty S.empty S.empty emptyInferenceContext
-  where
-    emptyInferenceContext = InferenceContext M.empty M.empty M.empty M.empty False
-
 -- | Check unifyTypes result against expected
 -- schemaTypeNames is a list of names that should be treated as schema types (not bound during unification)
 checkUnifyTypes :: [Name] -> Type -> Type -> Either String TypeSubst -> H.Expectation
 checkUnifyTypes schemaTypeNames left right expected = case expected of
     Left errSubstring -> case unifyResult of
-      Nothing -> return ()  -- Expected failure, got failure
-      Just result -> HL.assertFailure $
+      Left _ -> return ()  -- Expected failure, got failure
+      Right result -> HL.assertFailure $
         "Expected unification failure but got success: " ++ show (unTypeSubst result)
     Right expectedSubst -> case unifyResult of
-      Nothing -> HL.assertFailure $
-        "Expected unification success but got failure (trace: " ++ traceSummary trace ++ ")"
-      Just actualSubst -> H.shouldBe actualSubst expectedSubst
+      Left err -> HL.assertFailure $
+        "Expected unification success but got failure: " ++ unificationErrorMessage (inContextObject err)
+      Right actualSubst -> H.shouldBe actualSubst expectedSubst
   where
     -- Build schema types map from the list of names
     -- Each schema name gets a trivial type scheme (no free variables)
     schemaTypes = M.fromList [(n, TypeScheme [] (TypeVariable n) Nothing) | n <- schemaTypeNames]
-    FlowState unifyResult _ trace = unFlow
-      (Unification.unifyTypes schemaTypes left right "test")
-      testGraph emptyTrace
+    emptyCtx = Context [] [] M.empty
+    unifyResult = Unification.unifyTypes emptyCtx schemaTypes left right "test"
 
 -- | Check joinTypes result against expected
 checkJoinTypes :: Type -> Type -> Either () [TypeConstraint] -> H.Expectation
 checkJoinTypes left right expected = case expected of
     Left () -> case joinResult of
-      Nothing -> return ()  -- Expected failure, got failure
-      Just result -> HL.assertFailure $
+      Left _ -> return ()  -- Expected failure, got failure
+      Right result -> HL.assertFailure $
         "Expected join failure but got success with constraints: " ++ show result
     Right expectedConstraints -> case joinResult of
-      Nothing -> HL.assertFailure $
-        "Expected join success but got failure (trace: " ++ traceSummary trace ++ ")"
-      Just actualConstraints -> H.shouldBe actualConstraints expectedConstraints
+      Left err -> HL.assertFailure $
+        "Expected join success but got failure: " ++ unificationErrorMessage (inContextObject err)
+      Right actualConstraints -> H.shouldBe actualConstraints expectedConstraints
   where
-    FlowState joinResult _ trace = unFlow
-      (Unification.joinTypes left right "test")
-      testGraph emptyTrace
+    emptyCtx = Context [] [] M.empty
+    joinResult = Unification.joinTypes emptyCtx left right "test"
 
 -- ---- Benchmark JSON output ----
 
@@ -477,7 +470,7 @@
 countTests group = (runnable + subRunnable, 0, skipped + subSkipped)
   where
     (runnable, skipped) = foldl (\(r, s) tc ->
-      if Testing.isDisabled tc || Testing.isRequiresFlowDecoding tc
+      if Testing.isDisabled tc
         then (r, s + 1)
         else (r + 1, s)) (0, 0) (testGroupCases group)
     (subRunnable, _, subSkipped) = foldl (\(r, f, s) sub ->
diff --git a/src/test/haskell/Hydra/TestUtils.hs b/src/test/haskell/Hydra/TestUtils.hs
--- a/src/test/haskell/Hydra/TestUtils.hs
+++ b/src/test/haskell/Hydra/TestUtils.hs
@@ -7,20 +7,20 @@
 ) where
 
 import Hydra.Kernel
-import Hydra.Adapt.Literals
-import Hydra.Adapt.Terms
-import Hydra.Adapt.Utils
+import Hydra.Generation (showError)
 import Hydra.ArbitraryCore()
 import Hydra.Dsl.Bootstrap
 import Hydra.Dsl.Terms
+import qualified Hydra.EvalPrimitives as EvalPrims
 import qualified Hydra.Sources.Kernel.Types.Coders as TypeCoders
-import qualified Hydra.Sources.Kernel.Types.Compute as TypeCompute
+import qualified Hydra.Sources.Kernel.Types.Context as TypeContext
 import qualified Hydra.Sources.Kernel.Types.Core as TypeCore
+import qualified Hydra.Sources.Kernel.Types.Errors as TypeError
+import qualified Hydra.Sources.Kernel.Types.Util as TypeUtil
 import qualified Hydra.Sources.Kernel.Terms.Annotations as TermAnnotations
 import qualified Hydra.Sources.Kernel.Terms.Constants as TermConstants
 import qualified Hydra.Sources.Kernel.Terms.Extract.Core as TermExtractCore
 import qualified Hydra.Sources.Kernel.Terms.Lexical as TermLexical
-import qualified Hydra.Sources.Kernel.Terms.Monads as TermMonads
 import qualified Hydra.Sources.Kernel.Terms.Rewriting as TermRewriting
 import qualified Hydra.Sources.Kernel.Terms.Show.Core as TermShowCore
 import qualified Hydra.Sources.Decode.Core as TermDecodeCore
@@ -39,20 +39,23 @@
 import qualified Test.HUnit.Lang as HL
 import qualified Data.List as L
 import qualified Data.Map as M
-import qualified Data.Set as S
 import qualified Data.Maybe as Y
 import qualified Data.ByteString.Lazy as BS
 
 
+decodeSchemaTypes :: Graph -> M.Map Name TypeScheme
+decodeSchemaTypes sg = case schemaGraphToTypingEnvironment (Context [] [] M.empty) sg of
+  Left _ -> M.empty
+  Right result -> result
+
 testGraph :: Graph
-testGraph = elementsToGraph hydraCoreGraph (Just testSchemaGraph) (kernelTermBindings ++ dataBindings)
+testGraph = elementsToGraph hydraCoreGraph (decodeSchemaTypes testSchemaGraph) (kernelTermBindings ++ dataBindings)
   where
     -- Include only essential kernel term definitions for interpreter tests.
-    -- The evaluator needs hydra.monads (and its dependencies) plus hydra.annotations (and its dependencies).
-    kernelTermBindings = L.concat $ fmap moduleElements
+    -- The evaluator needs hydra.annotations (and its dependencies).
+    kernelTermBindings = L.concat $ fmap moduleBindings
       [ TermConstants.module_
       , TermShowCore.module_
-      , TermMonads.module_
       , TermExtractCore.module_
       , TermLexical.module_
       , TermRewriting.module_
@@ -63,219 +66,154 @@
     dataBindings = (\(name, term) -> Binding name term Nothing) <$> M.toList testTerms
 
 testSchemaGraph :: Graph
-testSchemaGraph = elementsToGraph hydraCoreGraph (Just hydraCoreGraph)
+testSchemaGraph = elementsToGraph hydraCoreGraph (decodeSchemaTypes hydraCoreGraph)
     -- Only the kernel type modules that define types referenced by the test suite schema graph:
-    -- CoderDirection (hydra.coders), Coder (hydra.compute), and Type/Name/ForallType (hydra.core).
+    -- CoderDirection (hydra.coders), Coder (hydra.util), and Type/Name/ForallType (hydra.core).
     (kernelElements ++ testElements)
   where
-    kernelElements = L.concat $ fmap moduleElements
+    kernelElements = L.concat $ fmap moduleBindings
       [ TypeCoders.module_
-      , TypeCompute.module_
+      , TypeContext.module_
       , TypeCore.module_
+      , TypeError.module_
+      , TypeUtil.module_
       ]
     testElements = fmap
       (\(n, t) -> Binding n (EncodeCore.type_ t) $ Just $ Types.mono $ TypeVariable _Type) $ M.toList testTypes
 
-baseLanguage :: Language
-baseLanguage = hydraLanguage
-
-baseContext :: AdapterContext
-baseContext = AdapterContext testGraph baseLanguage M.empty
+testContext :: Context
+testContext = Context [] [] M.empty
 
 check :: String -> H.SpecWith a -> H.SpecWith a
 check desc = H.describe $ "Check type inference for " <> desc
 
-checkAdapter :: (Eq t, Eq v, Show t, Show v)
-  => (v -> v)
-  -> (t -> Flow AdapterContext (SymmetricAdapter AdapterContext t v))
-  -> ([r] -> AdapterContext)
-  -> [r] -> t -> t -> Bool -> v -> v -> H.Expectation
-checkAdapter normalize mkAdapter mkContext variants source target lossy vs vt = do
-    let cx0 = mkContext variants :: AdapterContext
-    let g = adapterContextGraph cx0
-    let FlowState adapter' cx trace = unFlow (mkAdapter source) cx0 emptyTrace
-    if Y.isNothing adapter' then HL.assertFailure (traceSummary trace) else pure ()
-    let adapter = Y.fromJust adapter'
-    let step = Coder encode decode
-          where
-            encode = withState cx . coderEncode (adapterCoder adapter)
-            decode = withState cx . coderDecode (adapterCoder adapter)
-    adapterSource adapter `H.shouldBe` source
-    adapterTarget adapter `H.shouldBe` target
-    adapterIsLossy adapter `H.shouldBe` lossy
-    fromFlow vt g (normalize <$> coderEncode step vs) `H.shouldBe` (normalize vt)
-    if lossy
-      then True `H.shouldBe` True
-      else fromFlow vs g (coderEncode step vs >>= coderDecode step) `H.shouldBe` vs
-
-checkLiteralAdapter :: [LiteralVariant] -> LiteralType -> LiteralType -> Bool -> Literal -> Literal -> H.Expectation
-checkLiteralAdapter = checkAdapter id literalAdapter context
-  where
-    context variants = withConstraints $ (languageConstraints baseLanguage) {
-        languageConstraintsLiteralVariants = variantSet,
-        languageConstraintsFloatTypes = floatVars,
-        languageConstraintsIntegerTypes = integerVars }
-      where
-        variantSet = S.fromList variants
-        floatVars = if (S.member LiteralVariantFloat variantSet)
-          then S.fromList [FloatTypeFloat32]
-          else S.empty
-        integerVars = if (S.member LiteralVariantInteger variantSet)
-          then S.fromList [IntegerTypeInt16, IntegerTypeInt32]
-          else S.empty
-
-checkFieldAdapter :: [TypeVariant] -> FieldType -> FieldType -> Bool -> Field -> Field -> H.Expectation
-checkFieldAdapter = checkAdapter id fieldAdapter termTestContext
-
-checkFloatAdapter :: [FloatType] -> FloatType -> FloatType -> Bool -> FloatValue -> FloatValue -> H.Expectation
-checkFloatAdapter = checkAdapter id floatAdapter context
-  where
-    context variants = withConstraints $ (languageConstraints baseLanguage) {
-      languageConstraintsFloatTypes = S.fromList variants }
-
-checkIntegerAdapter :: [IntegerType] -> IntegerType -> IntegerType -> Bool -> IntegerValue -> IntegerValue -> H.Expectation
-checkIntegerAdapter = checkAdapter id integerAdapter context
-  where
-    context variants = withConstraints $ (languageConstraints baseLanguage) {
-      languageConstraintsIntegerTypes = S.fromList variants }
-
-checkDataAdapter :: [TypeVariant] -> Type -> Type -> Bool -> Term -> Term -> H.Expectation
-checkDataAdapter = checkAdapter deannotateTerm termAdapter termTestContext
-
-checkSerdeRoundTrip :: (Type -> Flow Graph (Coder Graph Graph Term BS.ByteString))
+checkSerdeRoundTrip :: (Context -> Graph -> Type -> Either (InContext Error) (Coder Term BS.ByteString))
   -> TypeApplicationTerm -> H.Expectation
 checkSerdeRoundTrip mkSerde (TypeApplicationTerm term typ) = do
-    case mserde of
-      Nothing -> HL.assertFailure (traceSummary trace)
-      Just serde -> shouldSucceedWith
-        (deannotateTerm <$> (coderEncode serde term >>= coderDecode serde))
-        (deannotateTerm term)
-  where
-    FlowState mserde _ trace = unFlow (mkSerde typ) testGraph emptyTrace
+    case mkSerde testContext testGraph typ of
+      Left ic -> HL.assertFailure (showError (inContextObject ic))
+      Right serde -> do
+        case coderEncode serde testContext term >>= coderDecode serde testContext of
+          Left ic -> HL.assertFailure (showError (inContextObject ic))
+          Right roundTripped -> deannotateTerm roundTripped `H.shouldBe` deannotateTerm term
 
-checkSerialization :: (Type -> Flow Graph (Coder Graph Graph Term String))
+checkSerialization :: (Context -> Graph -> Type -> Either (InContext Error) (Coder Term String))
   -> TypeApplicationTerm -> String -> H.Expectation
 checkSerialization mkSerdeStr (TypeApplicationTerm term typ) expected = do
-    case mserde of
-      Nothing -> HL.assertFailure (traceSummary trace)
-      Just serde -> shouldSucceedWith
-        (normalize <$> coderEncode serde term)
+    case mkSerdeStr testContext testGraph typ of
+      Left ic -> HL.assertFailure (showError (inContextObject ic))
+      Right serde -> shouldSucceedWith
+        (mapInContextError $ fmap normalize $ coderEncode serde testContext term)
         (normalize expected)
   where
     normalize = unlines . L.filter (not . L.null) . lines
-    FlowState mserde _ trace = unFlow (mkSerdeStr typ) testGraph emptyTrace
 
-eval :: Term -> Flow Graph Term
-eval = reduceTerm True
+eval :: Term -> Either String Term
+eval term = case reduceTerm testContext testGraph True term of
+    Left ic -> Left (showError (inContextObject ic))
+    Right result -> Right result
 
+-- | A test graph where eval-mode primitives replace native ones where available.
+-- Eval primitives operate at the term level (building application terms) rather than
+-- using native Haskell implementations, testing that the eval approach is correct.
+evalTestGraph :: Graph
+evalTestGraph = elementsToGraph evalCoreGraph (decodeSchemaTypes testSchemaGraph) (kernelTermBindings ++ dataBindings)
+  where
+    kernelTermBindings = L.concat $ fmap moduleBindings
+      [ TermConstants.module_
+      , TermShowCore.module_
+      , TermExtractCore.module_
+      , TermLexical.module_
+      , TermRewriting.module_
+      , TermDecodeCore.module_
+      , TermEncodeCore.module_
+      , TermAnnotations.module_
+      ]
+    dataBindings = (\(name, term) -> Binding name term Nothing) <$> M.toList testTerms
+
+-- | A core graph with eval primitives merged over the standard ones.
+-- Standard primitives are kept for functions that don't have eval implementations.
+-- Eval primitives override the standard ones where they exist.
+evalCoreGraph :: Graph
+evalCoreGraph = hydraCoreGraph {
+  graphPrimitives = M.union evalPrimMap (graphPrimitives hydraCoreGraph)}
+  where
+    evalPrimMap = M.fromList $ fmap (\p -> (primitiveName p, p))
+      (L.concat (libraryPrimitives <$> EvalPrims.evalLibraries))
+
+evalEval :: Term -> Either String Term
+evalEval term = case reduceTerm testContext evalTestGraph True term of
+    Left ic -> Left (showError (inContextObject ic))
+    Right result -> Right result
+
 expectEtaExpansionResult :: String -> Term -> Term -> H.SpecWith ()
 expectEtaExpansionResult desc input output = H.it "eta expansion" $ do
-  tx <- fromTestFlow desc $ graphToTypeContext testGraph
-  -- Use the original etaExpandTypedTerm (monadic) instead of etaExpandTermNew (pure)
-  -- to test the production code path
-  result <- fromTestFlow desc $ etaExpandTypedTerm tx input
-  result `H.shouldBe` output
+  case etaExpandTypedTerm testContext testGraph input of
+    Left ic -> HL.assertFailure (showError (inContextObject ic))
+    Right result -> result `H.shouldBe` output
 
-expectFailure :: (a -> String) -> String -> Flow () a -> H.Expectation
-expectFailure print desc f = case my of
-    Nothing -> return ()
-    Just v -> HL.assertFailure $ "Failure case succeeded with " ++ print v ++ "\n" ++ traceSummary trace
-  where
-    FlowState my _ trace = unFlow f2 () emptyTrace
-    f2 = do
-      putAttr key_debugId $ Terms.string desc
-      f
+expectFailure :: (a -> String) -> String -> Either String a -> H.Expectation
+expectFailure print desc f = case f of
+    Left _ -> return ()
+    Right v -> HL.assertFailure $ "Failure case succeeded with " ++ print v
 
 expectInferenceFailure :: String -> Term -> H.Expectation
-expectInferenceFailure desc term = expectFailure (ShowCore.typeScheme . snd) desc $ do
-  cx <- graphToInferenceContext testGraph
-  inferTypeOf cx term
+expectInferenceFailure desc term = case inferTypeOf testContext testGraph term of
+    Left _ -> return ()
+    Right ((_, ts), _) -> HL.assertFailure $ "Expected inference failure but got: " ++ ShowCore.typeScheme ts
 
 expectInferenceResult :: String -> Term -> TypeScheme -> H.SpecWith ()
 expectInferenceResult desc term expected = do
-  (iterm, its) <- H.runIO $ fromTestFlow desc $ do
-    cx <- graphToInferenceContext testGraph
-    inferTypeOf cx term
-
-  H.it "inferred type" $
-    H.shouldBe (ShowCore.typeScheme its) (ShowCore.typeScheme expected)
-  H.it "inferred term" $
-    H.shouldBe (ShowCore.term $ removeTypesFromTerm iterm) (ShowCore.term $ removeTypesFromTerm term)
+  case inferTypeOf testContext testGraph term of
+    Left ic -> H.runIO (HL.assertFailure (showError (inContextObject ic))) >> return ()
+    Right ((iterm, its), _cx') -> do
+      H.it "inferred type" $
+        H.shouldBe (ShowCore.typeScheme its) (ShowCore.typeScheme expected)
+      H.it "inferred term" $
+        H.shouldBe (ShowCore.term $ removeTypesFromTerm iterm) (ShowCore.term $ removeTypesFromTerm term)
 
-expectSuccess :: (Eq a, Show a) => String -> Flow () a -> a -> H.Expectation
-expectSuccess desc flow x = case my of
-    Nothing -> HL.assertFailure $ traceSummary trace
-    Just y -> y `H.shouldBe` x
-  where
-    FlowState my _ trace = unFlow flow2 () emptyTrace
-    flow2 = do
-      putAttr key_debugId $ Terms.string desc
-      flow
+expectSuccess :: (Eq a, Show a) => String -> Either String a -> a -> H.Expectation
+expectSuccess desc result x = case result of
+    Left err -> HL.assertFailure err
+    Right y -> y `H.shouldBe` x
 
 expectTypeCheckingResult :: String -> Term -> Term -> Type -> H.SpecWith ()
 expectTypeCheckingResult desc input outputTerm outputType = do
-  (iterm, itype, rtype) <- H.runIO $ fromTestFlow desc $ do
-    cx <- graphToInferenceContext testGraph
-    let tx = TypeContext M.empty M.empty S.empty S.empty S.empty cx
-
-    -- typeOf is always called on System F terms
-    (iterm, ts) <- inferTypeOf cx input
-    let itype = typeSchemeToFType ts
-
-    rtype <- typeOf tx [] iterm
-    return (iterm, itype, rtype)
-
-  -- Three labeled assertions as per the type checking specification
-  H.it "inferred term" $
-    H.shouldBe (ShowCore.term iterm) (ShowCore.term outputTerm)
-  H.it "inferred type" $
-    H.shouldBe (ShowCore.type_ itype) (ShowCore.type_ outputType)
-  H.it "reconstructed type" $
-    H.shouldBe (ShowCore.type_ rtype) (ShowCore.type_ outputType)
-
-fromTestFlow :: String -> Flow () a -> IO a
-fromTestFlow desc flow = case my of
-    Nothing -> fail $ traceSummary trace
-    Just y -> return y
-  where
-    FlowState my _ trace = unFlow flow2 () emptyTrace
-    flow2 = do
-      putAttr key_debugId $ Terms.string desc
-      flow
+  case inferTypeOf testContext testGraph input of
+    Left ic -> H.runIO (HL.assertFailure (showError (inContextObject ic))) >> return ()
+    Right ((iterm, ts), cx1) -> do
+      let itype = typeSchemeToFType ts
+      case typeOf cx1 testGraph [] iterm of
+        Left ic2 -> H.runIO (HL.assertFailure (showError (inContextObject ic2))) >> return ()
+        Right (rtype, _cx2) -> do
+          H.it "inferred term" $
+            H.shouldBe (ShowCore.term iterm) (ShowCore.term outputTerm)
+          H.it "inferred type" $
+            H.shouldBe (ShowCore.type_ itype) (ShowCore.type_ outputType)
+          H.it "reconstructed type" $
+            H.shouldBe (ShowCore.type_ rtype) (ShowCore.type_ outputType)
 
 makeMap :: [(String, Int)] -> Term
 makeMap keyvals = Terms.map $ M.fromList $ ((\(k, v) -> (Terms.string k, Terms.int32 v)) <$> keyvals)
 
-shouldFail :: Flow Graph a -> H.Expectation
-shouldFail f = H.shouldBe True (Y.isNothing $ flowStateValue $ unFlow f testGraph emptyTrace)
+shouldFail :: Either String a -> H.Expectation
+shouldFail f = H.shouldBe True (either (const True) (const False) f)
 
-shouldSucceed :: Flow Graph a -> H.Expectation
-shouldSucceed f = case my of
-    Nothing -> HL.assertFailure (traceSummary trace)
-    Just y -> True `H.shouldBe` True
-  where
-    FlowState my _ trace = unFlow f testGraph emptyTrace
+shouldSucceed :: Either String a -> H.Expectation
+shouldSucceed f = case f of
+    Left err -> HL.assertFailure err
+    Right _ -> True `H.shouldBe` True
 
-shouldSucceedWith :: (Eq a, Show a) => Flow Graph a -> a -> H.Expectation
-shouldSucceedWith f x = case my of
-    Nothing -> HL.assertFailure (traceSummary trace)
-    Just y -> y `H.shouldBe` x
-  where
-    FlowState my _ trace = unFlow f testGraph emptyTrace
+shouldSucceedWith :: (Eq a, Show a) => Either String a -> a -> H.Expectation
+shouldSucceedWith f x = case f of
+    Left err -> HL.assertFailure err
+    Right y -> y `H.shouldBe` x
 
+-- | Map an InContext Error to a plain String error
+mapInContextError :: Either (InContext Error) a -> Either String a
+mapInContextError (Left ic) = Left (showError (inContextObject ic))
+mapInContextError (Right a) = Right a
+
 strip :: Term -> Term
 strip = deannotateTerm
 
-termTestContext :: [TypeVariant] -> AdapterContext
-termTestContext variants = withConstraints $ (languageConstraints baseLanguage) {
-    languageConstraintsTypeVariants = S.fromList variants,
-    languageConstraintsLiteralVariants = literalVars,
-    languageConstraintsFloatTypes = floatVars,
-    languageConstraintsIntegerTypes = integerVars }
-  where
-    literalVars = S.fromList [LiteralVariantFloat, LiteralVariantInteger, LiteralVariantString]
-    floatVars = S.fromList [FloatTypeFloat32]
-    integerVars = S.fromList [IntegerTypeInt16, IntegerTypeInt32, IntegerTypeBigint]
-
-withConstraints :: LanguageConstraints -> AdapterContext
-withConstraints c = baseContext { adapterContextLanguage = baseLanguage { languageConstraints = c }}
diff --git a/src/test/haskell/Hydra/UpdateGenerationTests.hs b/src/test/haskell/Hydra/UpdateGenerationTests.hs
--- a/src/test/haskell/Hydra/UpdateGenerationTests.hs
+++ b/src/test/haskell/Hydra/UpdateGenerationTests.hs
@@ -1,8 +1,8 @@
 module Hydra.UpdateGenerationTests where
 
 import Hydra.Kernel
-import Hydra.Staging.Testing.Generation.Generate
-import Hydra.Staging.Testing.Generation.HaskellCodec (haskellTestGenerator)
+import Hydra.Generation (createTestGroupLookup, generateGenerationTestSuite)
+import Hydra.Ext.Haskell.TestingIo (haskellTestGenerator)
 import qualified Hydra.Sources.Test.TestSuite as TestSuite
 import qualified Hydra.Test.TestSuite as GenTests
 import System.Exit (exitFailure)
